From gcc-prs-return-23786-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 08:46:07 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 28497 invoked by alias); 1 Nov 2002 08:46:06 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 28467 invoked by uid 71); 1 Nov 2002 08:46:05 -0000 Date: 1 Nov 2002 08:46:05 -0000 Message-ID: <20021101084605.28461.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: "Giovanni Bajo" Subject: Re: c++/8417: g++ 3.2 generating different (and incorrect?) code from g++ 2.95.4 Reply-To: "Giovanni Bajo" The following reply was made to PR c++/8417; it has been noted by GNATS. From: "Giovanni Bajo" To: , , , , Cc: Subject: Re: c++/8417: g++ 3.2 generating different (and incorrect?) code from g++ 2.95.4 Date: Fri, 1 Nov 2002 16:38:07 +0800 This is a multi-part message in MIME format. ------=_NextPart_000_1771_01C281C5.0E6A1990 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=3Dview%20audit-trail&database=3D= gcc&pr=3D8417 The value of this can be changed by the compiler at any time, there is = no guarantee (in the C++ standard) that it remains the same across the = derived class tree. For example, it is very usual that the value changes = when you are using multiple inheritance. This is not a bug in the = compiler. ------=_NextPart_000_1771_01C281C5.0E6A1990 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
 
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?c= md=3Dview%20audit-trail&database=3Dgcc&pr=3D8417
 
The value of this can be changed by the = compiler at=20 any time, there is no guarantee (in the C++ standard) that it remains = the same=20 across the derived class tree. For example, it is very usual that the = value=20 changes when you are using multiple inheritance. This is not a bug in = the=20 compiler.
------=_NextPart_000_1771_01C281C5.0E6A1990-- From gcc-prs-return-23787-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 10:10:33 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 1431 invoked by alias); 1 Nov 2002 10:10:30 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 1341 invoked by uid 61); 1 Nov 2002 10:10:28 -0000 Date: 1 Nov 2002 10:10:28 -0000 Message-ID: <20021101101028.1338.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, martin@loewis.home.cs.tu-berlin.de, nathan@gcc.gnu.org, nobody@gcc.gnu.org, wolf@gaia.iwr.uni-heidelberg.de From: nathan@gcc.gnu.org Reply-To: nathan@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, martin@loewis.home.cs.tu-berlin.de, nathan@gcc.gnu.org, nobody@gcc.gnu.org, wolf@gaia.iwr.uni-heidelberg.de, gcc-gnats@gcc.gnu.org Subject: Re: c++/38: matching of function signatures Synopsis: matching of function signatures Responsible-Changed-From-To: nathan->unassigned Responsible-Changed-By: nathan Responsible-Changed-When: Fri Nov 1 02:10:27 2002 Responsible-Changed-Why: I tried fixing it, but kept breaking other things. It is (sort of) related to parsing (being hidden inside grokdeclarator, IIRC) so maybe 'the new parser' will make things easier. (one may as well hope). http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=38 From gcc-prs-return-23788-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 10:16:06 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 17361 invoked by alias); 1 Nov 2002 10:16:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 17309 invoked by uid 71); 1 Nov 2002 10:16:02 -0000 Resent-Date: 1 Nov 2002 10:16:02 -0000 Resent-Message-ID: <20021101101602.17308.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, ehrhardt@mathematik.uni-ulm.de Received: (qmail 13598 invoked by uid 61); 1 Nov 2002 10:14:09 -0000 Message-Id: <20021101101409.13596.qmail@sources.redhat.com> Date: 1 Nov 2002 10:14:09 -0000 From: ehrhardt@mathematik.uni-ulm.de Reply-To: ehrhardt@mathematik.uni-ulm.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c/8420: volatile after the type specifier for an unnamed structure is rejected >Number: 8420 >Category: c >Synopsis: volatile after the type specifier for an unnamed structure is rejected >Confidential: no >Severity: non-critical >Priority: medium >Responsible: unassigned >State: open >Class: rejects-legal >Submitter-Id: net >Arrival-Date: Fri Nov 01 02:16:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Christian Ehrhardt >Release: gcc-3.2 >Organization: >Environment: theseus$ uname -a SunOS theseus 5.9 Generic_112233-02 sun4u sparc SUNW,Ultra-4 theseus$ gcc -v Reading specs from /usr/local/bin/../lib/gcc-lib/sparc-sun-solaris2.9/3.2/specs Configured with: /export/local/manager/playground/ULMgcc32/src/gcc-3.2/configure --with-ld=/usr/local/bin/ld --with-gnu-ld --with-as=/usr/local/bin/as --with-gnu-as --prefix=/usr/local/ Thread model: posix gcc version 3.2 >Description: This source file is rejected: struct a { struct { int x; } volatile a; }; /* OK */ struct b { volatile struct { int x; } ; }; /* OK */ struct c { struct { int x; } volatile; }; /* ERROR */ theseus$ gcc -Wall -c t.c t.c:10: unnamed fields of type other than struct or union are not allowed This code is made up to demonstrate a problem found while reading the source: grokfield is called for a field declaration without an identifier and tries to check that the field type is a structure or union. However, grokfield assumes that the type specifier is the first element in the list passed as declspecs which is not necessarily true. Given the other two examples (struct a and struct b) which are accepted this code should probably be legal. Even if it is illegal the error message is wrong. >How-To-Repeat: See description above. >Fix: A workaround is to move the volatile keyword before the struct. >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23789-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 10:23:33 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 10161 invoked by alias); 1 Nov 2002 10:23:30 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 10095 invoked by uid 61); 1 Nov 2002 10:23:28 -0000 Date: 1 Nov 2002 10:23:28 -0000 Message-ID: <20021101102328.10093.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, john.carter@tait.co.nz, nobody@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, john.carter@tait.co.nz, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7961: compare( char *) implemented incorrectly. Synopsis: compare( char *) implemented incorrectly. State-Changed-From-To: open->closed State-Changed-By: paolo State-Changed-When: Fri Nov 1 02:23:27 2002 State-Changed-Why: Not a bug. Indeed, no segfaults can be produced at run-time with code like the following // ------------ #include #include int main() { std::string lhs("abc"); lhs.append(1, '\0'); lhs += "def"; assert( lhs != "abc" ); } // ------------- and variants thereof. From the glibc2.3.1 documentation: - Function: int memcmp (const void *A1, const void *A2, size_t SIZE) The function `memcmp' compares the SIZE bytes of memory beginning at A1 against the SIZE bytes of memory beginning at A2. The value returned has the same sign as the difference between the first differing pair of bytes (interpreted as `unsigned char' objects, then promoted to `int'). If the contents of the two blocks are equal, `memcmp' returns `0'. that is, it seems to me that there is absolutely *nothing* wrong with a '\0' embedded in the string: its just a byte like any other. Thanks for your report, Paolo. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7961 From gcc-prs-return-23790-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 10:36:53 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 14650 invoked by alias); 1 Nov 2002 10:36:52 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14328 invoked by uid 61); 1 Nov 2002 10:36:45 -0000 Date: 1 Nov 2002 10:36:45 -0000 Message-ID: <20021101103645.14327.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, john.carter@tait.co.nz, nobody@gcc.gnu.org, paolo@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, john.carter@tait.co.nz, nobody@gcc.gnu.org, paolo@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7961: compare( char *) implemented incorrectly. Synopsis: compare( char *) implemented incorrectly. Responsible-Changed-From-To: unassigned->paolo Responsible-Changed-By: paolo Responsible-Changed-When: Fri Nov 1 02:36:42 2002 Responsible-Changed-Why: Analyzed. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7961 From gcc-prs-return-23791-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 10:55:32 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 32542 invoked by alias); 1 Nov 2002 10:55:30 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 32487 invoked by uid 61); 1 Nov 2002 10:55:29 -0000 Date: 1 Nov 2002 10:55:29 -0000 Message-ID: <20021101105529.32485.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, john.carter@tait.co.nz, paolo@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, john.carter@tait.co.nz, paolo@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7961: compare( char *) implemented incorrectly. Synopsis: compare( char *) implemented incorrectly. State-Changed-From-To: closed->analyzed State-Changed-By: paolo State-Changed-When: Fri Nov 1 02:55:28 2002 State-Changed-Why: Ok, sorry. Now I see your point: in the memcmp() we may end up reading past the end of __s2. However, it's difficult to construct an actual testcase... Paolo. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7961 From gcc-prs-return-23792-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 12:16:05 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 6663 invoked by alias); 1 Nov 2002 12:16:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 6597 invoked by uid 71); 1 Nov 2002 12:16:02 -0000 Resent-Date: 1 Nov 2002 12:16:02 -0000 Resent-Message-ID: <20021101121602.6595.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, Martin.Ward@durham.ac.uk Received: (qmail 29328 invoked by uid 61); 1 Nov 2002 12:12:43 -0000 Message-Id: <20021101121243.29327.qmail@sources.redhat.com> Date: 1 Nov 2002 12:12:43 -0000 From: Martin.Ward@durham.ac.uk Reply-To: Martin.Ward@durham.ac.uk To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c/8421: scm5d6 segfaults when eval.c is compiled with -O2 optimisation >Number: 8421 >Category: c >Synopsis: scm5d6 segfaults when eval.c is compiled with -O2 optimisation >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: wrong-code >Submitter-Id: net >Arrival-Date: Fri Nov 01 04:16:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Martin.Ward@durham.ac.uk >Release: gcc version 3.2 >Organization: >Environment: Sun Microsystems Inc. SunOS 5.8 Generic February 2000 SunOS charity 5.8 Generic_108528-16 sun4u sparc SUNW,Ultra-5_10 Configured with: ../gcc-3.2/configure --with-cpu=ultrasparc --disable-nls Thread model: posix >Description: The current release of SCM (scm5d6) segfaults when compiled with -O2 optimisation The crash is in ceval_1 in eval.c: (gdb) bt #0 0x0001b450 in ceval_1 (x=333424) at eval.c:2057 #1 0x0001afa8 in ceval (x=333192, static_env=17780, env=17780) at eval.c:1990 #2 0x00020168 in init_eval () at eval.c:3670 #3 0x00028b30 in init_scm (iverbose=2, buf0stdin=1, init_heap_size=0) at scm.c:457 #4 0x00028f1c in scm_init_from_argv (argc=1, argv=0xffbef5ac, script_arg=0x0, iverbose=2, buf0stdin=1) at scm.c:616 #5 0x000296e8 in main (argc=1, argv=0x1) at scmmain.c:131 Compiling eval.c with -g instead of -O2 gives a working executable. NOTE: with the files attached, the working executable will print the message: SCM version 5d6, Copyright (C) 1990-1999 Free Software Foundation. SCM comes with ABSOLUTELY NO WARRANTY; for details type `(terms)'. This is free software, and you are welcome to redistribute it under certain conditions; type `(terms)' for details. ERROR: No such file or directory ERROR: load: Could not open file "/home/mward/scm/scm/Init5d6.scm" ; in top level environment. > The error messages are expected and the ">" is scm's prompt. >How-To-Repeat: gcc -c -O2 -c *.c gcc -o scmlit.buggy *.o ./scmlit.buggy (prints a message and segfaults) SCM version 5d6, Copyright (C) 1990-1999 Free Software Foundation. SCM comes with ABSOLUTELY NO WARRANTY; for details type `(terms)'. This is free software, and you are welcome to redistribute it under certain conditions; type `(terms)' for details. Segmentation fault (core dumped) gcc -c -g eval.c gcc -o scmlit.working *.o ./scmlit.working (prints this message, ending in scm's prompt:) SCM version 5d6, Copyright (C) 1990-1999 Free Software Foundation. SCM comes with ABSOLUTELY NO WARRANTY; for details type `(terms)'. This is free software, and you are welcome to redistribute it under certain conditions; type `(terms)' for details. ERROR: No such file or directory ERROR: load: Could not open file "/home/mward/scm/scm/Init5d6.scm" ; in top level environment. > The "ERROR" messages above are expected. >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="bug.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bug.zip" 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 bLc3HDgHbEatFoL3QST6o5gvvGkx+8fpb/+84E00QZGlei8XirdblQyJ9MnaFuJL44VUW29lQkEc /ogEN8whYTFICvDqd7Y8XxxHf+NVuIKGu/aE/jB/a1ulI2TUahvV4eYfvSVSJOjgkI98hx8gnJbA ME6MDT96nbF9f6rR2APH6WeDx88B8mcQqbtn/DEeVukb9e3BOT/vwa22HD/gMiuXSwCojNTpXXmT wbf+sHOjlbbRhm4N8C3EW1i2WMQc3NLPbXp/YtWF11mA4CYR66y/luD9GX4lxSZE2vNTQXpt/73r IXqn6/64HRloteIe3F/slZThIv2X7s2/cAfxqV5QlCcoej2WxXkgksRPhUS/Q8/29WUKbjE/6jre 0L3ujtFDy7o1tfpCAO6WELzcYzKVHmv/0IPQaINHdpC7EGO1lBnmvwTUQLuF+2kVzGFp1rkejl3P 7veuBhoAwxf3uje48Tqb02ti1ZGlqOfd3nXHN47nberKu+18+XqjV3YaWNdn3dCt833o/MyJQDXD TP+qaCVb36pKHDNypshx7c5Nz+3eXpg+sd7WA3Bj11jEzFMEqtGW6T91OuPPxcG7d5p/2oiKsiUm mOZiItIHFa3X1gfRUa4ep7lY7+xIuCbgWmCXQ0cLDAypKmX+e7EJeodw/YSLDQtH60ROnK5nD5ye NxoP3aF7P+o6tZSOWjnaQq2z19db1naaD8ruWEGDi9kDOgUi1kuau14e/5sttBq4+Jmy0DIbNXc0 9x+Fl0mpvKAe1AtdGJ1iZNpjYFu3KWLQ1EKsr2cdfn9+Q60hH65SHS2L6UCP/PXeA9a9vbt6w1Py J05rG1iBZxupN/xo9qijNVRsn1sAxmyeaB6E0kNaIgNMjDqH+sXINDQ/wXqjSTnu946HoeJ7d+xs xgwjePAuiPyModVqcJXziTsTn3xsRYlSDLN8JWcWFipr05bKpsGN3LHXd0ua5ZX/gZxzmkgtJY+o eDnh+bi1jGIeNfG6ot+d+OVDjz08jvIczu/rK2vTgEuzYcvz3Mn427DjeRZ9/Ejva+tDdDlrXR1c FGdfv9SZrx1sPWOkRQWYhFqtZ8ui36l6WlmWtaNmmprPWmNlWc1ZRl9riGbjYn2cSWX+tG3z1nZu 6OR5Vvt5xV9cKOzux0rT+K1XV7XVP+d/2ZdrCleVQqm9atOz1ZDodyuT7+sKTaGrplB/LcSc+YFc 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 AACydAUAAAA= From gcc-prs-return-23793-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:08:30 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 15875 invoked by alias); 1 Nov 2002 14:08:29 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 15814 invoked by uid 61); 1 Nov 2002 14:08:28 -0000 Date: 1 Nov 2002 14:08:28 -0000 Message-ID: <20021101140828.15813.qmail@sources.redhat.com> To: bill@graysoft.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, lerdsuwa@gcc.gnu.org From: lerdsuwa@gcc.gnu.org Reply-To: lerdsuwa@gcc.gnu.org, bill@graysoft.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, lerdsuwa@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8273: g++ can not generate an instance of a template containg a template instance Synopsis: g++ can not generate an instance of a template containg a template instance State-Changed-From-To: analyzed->closed State-Changed-By: lerdsuwa State-Changed-When: Fri Nov 1 06:08:27 2002 State-Changed-Why: Fixed in the main trunk. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8273 From gcc-prs-return-23794-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:16:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 2526 invoked by alias); 1 Nov 2002 14:16:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 2464 invoked by uid 71); 1 Nov 2002 14:16:00 -0000 Resent-Date: 1 Nov 2002 14:16:00 -0000 Resent-Message-ID: <20021101141600.2463.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, niallm-wan@enigma.ie Received: (qmail 951 invoked by uid 61); 1 Nov 2002 14:15:19 -0000 Message-Id: <20021101141519.916.qmail@sources.redhat.com> Date: 1 Nov 2002 14:15:19 -0000 From: niallm-wan@enigma.ie Reply-To: niallm-wan@enigma.ie To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8422: g++ 3.2 fails with internal compiler error on suse 8.1 >Number: 8422 >Category: c++ >Synopsis: g++ 3.2 fails with internal compiler error on suse 8.1 >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Fri Nov 01 06:16:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: niallm-wan@enigma.ie >Release: gcc-3.2 >Organization: >Environment: SuSE 8.1, gcc 3.2 >Description: When compiling kismetwireless 2.6.2 (www.kismetwireless.net) on SuSE 8.1 with gcc 3.2, make prints the following sequence of errors: niallm@linux:/opt/src/kismet-2.6.2% make g++ -Ilibpcap-2002.07.02 -O2 -Wall -DVERSION_MAJOR=2 -DVERSION_MINOR=6 -DVERSION_TINY=2 -g -O2 -g -O2 -c speech.cc -o speech.o /usr/include/g++/bits/basic_string.h: In function `std::string ExpandSpeechString(std::basic_string, std::allocator >, const packet_info*, int)': /usr/include/g++/bits/basic_string.h:338: Internal compiler error in expand_call, at calls.c:3049 Please submit a full bug report, with preprocessed source if appropriate. See for instructions. make: *** [speech.o] Error 1 >How-To-Repeat: See description >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23795-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:28:40 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 16576 invoked by alias); 1 Nov 2002 14:28:39 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 16551 invoked by uid 61); 1 Nov 2002 14:28:38 -0000 Date: 1 Nov 2002 14:28:38 -0000 Message-ID: <20021101142838.16550.qmail@sources.redhat.com> To: dv@vollmann.ch, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, lerdsuwa@gcc.gnu.org, nobody@gcc.gnu.org From: lerdsuwa@gcc.gnu.org Reply-To: lerdsuwa@gcc.gnu.org, dv@vollmann.ch, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, lerdsuwa@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8389: [mainline regression] Access to members of base class & templates Synopsis: [mainline regression] Access to members of base class & templates Responsible-Changed-From-To: unassigned->lerdsuwa Responsible-Changed-By: lerdsuwa Responsible-Changed-When: Fri Nov 1 06:28:38 2002 Responsible-Changed-Why: Look like the bug is from my earlier typename access checking work. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8389 From gcc-prs-return-23796-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:36:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 9615 invoked by alias); 1 Nov 2002 14:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 9594 invoked by uid 71); 1 Nov 2002 14:36:01 -0000 Date: 1 Nov 2002 14:36:01 -0000 Message-ID: <20021101143601.9593.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Wolfgang Bangerth Subject: Re: c++/495: [parser] ICE in in lookup_template_class, at cp/pt.c:3961 Reply-To: Wolfgang Bangerth The following reply was made to PR c++/495; it has been noted by GNATS. From: Wolfgang Bangerth To: gcc-gnats@gcc.gnu.org Cc: Subject: Re: c++/495: [parser] ICE in in lookup_template_class, at cp/pt.c:3961 Date: Fri, 1 Nov 2002 08:32:00 -0600 (CST) For the record: this may be related to c++/2023, since it crashes at the same spot. Still present in CVS and 3.2.1. W. ------------------------------------------------------------------------- Wolfgang Bangerth email: bangerth@ticam.utexas.edu www: http://www.ticam.utexas.edu/~bangerth From gcc-prs-return-23797-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:36:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 9647 invoked by alias); 1 Nov 2002 14:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 9618 invoked by uid 71); 1 Nov 2002 14:36:01 -0000 Date: 1 Nov 2002 14:36:01 -0000 Message-ID: <20021101143601.9617.qmail@sources.redhat.com> To: nathan@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Wolfgang Bangerth Subject: Re: c++/2023: ICE in lookup_template_class, at cp/pt.c:3986 Reply-To: Wolfgang Bangerth The following reply was made to PR c++/2023; it has been noted by GNATS. From: Wolfgang Bangerth To: gcc-gnats@gcc.gnu.org Cc: Subject: Re: c++/2023: ICE in lookup_template_class, at cp/pt.c:3986 Date: Fri, 1 Nov 2002 08:33:00 -0600 (CST) For the record: this may be related to c++/495, since it crashes at the same spot. Still present in CVS and 3.2.1. W. ------------------------------------------------------------------------- Wolfgang Bangerth email: bangerth@ticam.utexas.edu www: http://www.ticam.utexas.edu/~bangerth From gcc-prs-return-23798-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:44:49 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 10492 invoked by alias); 1 Nov 2002 14:44:49 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 10473 invoked by uid 61); 1 Nov 2002 14:44:49 -0000 Date: 1 Nov 2002 14:44:49 -0000 Message-ID: <20021101144449.10472.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, stephen@bregmasoft.com From: lerdsuwa@gcc.gnu.org Reply-To: lerdsuwa@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, stephen@bregmasoft.com, gcc-gnats@gcc.gnu.org Subject: Re: c++/2402: Problem with compile-time sizeof evaluation and templates Synopsis: Problem with compile-time sizeof evaluation and templates State-Changed-From-To: analyzed->closed State-Changed-By: lerdsuwa State-Changed-When: Fri Nov 1 06:44:48 2002 State-Changed-Why: Fixed in the main trunk. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=2402 From gcc-prs-return-23799-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:45:15 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12328 invoked by alias); 1 Nov 2002 14:45:14 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12286 invoked by uid 61); 1 Nov 2002 14:45:14 -0000 Date: 1 Nov 2002 14:45:14 -0000 Message-ID: <20021101144514.12284.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, niallm-wan@enigma.ie, nobody@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, niallm-wan@enigma.ie, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8422: g++ 3.2 fails with internal compiler error on suse 8.1 Synopsis: g++ 3.2 fails with internal compiler error on suse 8.1 State-Changed-From-To: open->closed State-Changed-By: paolo State-Changed-When: Fri Nov 1 06:45:13 2002 State-Changed-Why: Exact duplicate of c++/8413: already fixed for 3.2.1 and 3.3. Thanks for your report, Paolo. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8422 From gcc-prs-return-23800-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:45:24 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12647 invoked by alias); 1 Nov 2002 14:45:24 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12614 invoked by uid 61); 1 Nov 2002 14:45:22 -0000 Date: 1 Nov 2002 14:45:22 -0000 Message-ID: <20021101144522.12613.qmail@sources.redhat.com> To: eleuteri@na.infn.it, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gdr@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, eleuteri@na.infn.it, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gdr@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/3169: GCC crashes when assigning a template function to a pointer to function variable Synopsis: GCC crashes when assigning a template function to a pointer to function variable State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 06:45:22 2002 State-Changed-Why: The code is illegal in many ways, the most obvious one being that you try to pass a pointer to member function as a template argument where a pointer to function is expected. I can reproduce the ICE with 3.2.1pre, which technically is even a regression over 2.95, which only said that it is bailing out due to confusion by previous errors, but I think nobody's going to care about such subtle reasoning. Anyway, with present CVS the ICE is gone and we get a proper list of errors, so I close this one. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=3169 From gcc-prs-return-23801-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:46:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 14665 invoked by alias); 1 Nov 2002 14:46:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14634 invoked by uid 71); 1 Nov 2002 14:46:01 -0000 Date: 1 Nov 2002 14:46:01 -0000 Message-ID: <20021101144601.14631.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: rearnsha@gcc.gnu.org Subject: target/7856 Reply-To: rearnsha@gcc.gnu.org The following reply was made to PR target/7856; it has been noted by GNATS. From: rearnsha@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: target/7856 Date: 1 Nov 2002 14:40:24 -0000 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_2-branch Changes by: rearnsha@gcc.gnu.org 2002-11-01 06:40:24 Modified files: gcc : ChangeLog gcc/config/arm : arm.c Log message: PR target/7856 * arm.c (use_return_insn): Don't use a return insn if there are saved integer regs, but LR is not one of them. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.13152.2.657.2.113&r2=1.13152.2.657.2.114 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/arm/arm.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.196.2.5&r2=1.196.2.5.2.1 From gcc-prs-return-23802-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:46:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 14717 invoked by alias); 1 Nov 2002 14:46:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14671 invoked by uid 71); 1 Nov 2002 14:46:03 -0000 Date: 1 Nov 2002 14:46:03 -0000 Message-ID: <20021101144603.14667.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: rearnsha@gcc.gnu.org Subject: target/7856 Reply-To: rearnsha@gcc.gnu.org The following reply was made to PR target/7856; it has been noted by GNATS. From: rearnsha@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: target/7856 Date: 1 Nov 2002 14:41:57 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: rearnsha@gcc.gnu.org 2002-11-01 06:41:57 Modified files: gcc : ChangeLog gcc/config/arm : arm.c Log message: PR target/7856 * arm.c (use_return_insn): Don't use a return insn if there are saved integer regs, but LR is not one of them. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=1.15834&r2=1.15835 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/arm/arm.c.diff?cvsroot=gcc&r1=1.239&r2=1.240 From gcc-prs-return-23803-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:48:22 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 23800 invoked by alias); 1 Nov 2002 14:48:21 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 23760 invoked by uid 61); 1 Nov 2002 14:48:21 -0000 Date: 1 Nov 2002 14:48:21 -0000 Message-ID: <20021101144821.23756.qmail@sources.redhat.com> To: bitti@cs.tut.fi, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, bitti@cs.tut.fi, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/4569: ICE in c_expand_expr, at c-common.c:3395 Synopsis: ICE in c_expand_expr, at c-common.c:3395 State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 06:48:20 2002 State-Changed-Why: According to Volker, this is a duplicate of 4249, so I close it. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4569 From gcc-prs-return-23804-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:54:37 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 20894 invoked by alias); 1 Nov 2002 14:54:36 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 20875 invoked by uid 61); 1 Nov 2002 14:54:36 -0000 Date: 1 Nov 2002 14:54:36 -0000 Message-ID: <20021101145436.20874.qmail@sources.redhat.com> To: acm@alumni.brown.edu, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: lerdsuwa@gcc.gnu.org Reply-To: lerdsuwa@gcc.gnu.org, acm@alumni.brown.edu, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/7745: gcc 3.2 rejects legal member template overload Synopsis: gcc 3.2 rejects legal member template overload State-Changed-From-To: analyzed->closed State-Changed-By: lerdsuwa State-Changed-When: Fri Nov 1 06:54:36 2002 State-Changed-Why: Fixed in GCC 3.2 branch and main trunk. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7745 From gcc-prs-return-23805-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:56:00 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 27367 invoked by alias); 1 Nov 2002 14:56:00 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 27340 invoked by uid 71); 1 Nov 2002 14:56:00 -0000 Resent-Date: 1 Nov 2002 14:56:00 -0000 Resent-Message-ID: <20021101145600.27338.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, arjanv@redhat.com Received: (qmail 13617 invoked by uid 61); 1 Nov 2002 14:53:41 -0000 Message-Id: <20021101145341.13616.qmail@sources.redhat.com> Date: 1 Nov 2002 14:53:41 -0000 From: arjanv@redhat.com Reply-To: arjanv@redhat.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: optimization/8423: CSE1 not propagating __builtin_constant_p enough >Number: 8423 >Category: optimization >Synopsis: CSE1 not propagating __builtin_constant_p enough >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Fri Nov 01 06:56:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: arjanv@redhat.com >Release: unknown-1.0 >Organization: >Environment: >Description: Older versions of gcc didn't propagate constant info enough in some cases (see attached testcase). This PR is filed to add the test as a regression test, not so much as to get it re-fixed >How-To-Repeat: compile with -O2; both printf's should claim builtin but soome older gcc's didn't >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="test.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test.c" I2RlZmluZSBidGVzdCh4KSBfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSA/ICJidWlsdGluLlxuIiA6 ICJub3JtYWwuXG4iCgppbnQgbWFpbih2b2lkKQp7CglpbnQgc2l6ZSA9IHNpemVvZihpbnQpOwoJ cHJpbnRmKGJ0ZXN0KHNpemUpKTsKCXByaW50ZihidGVzdChzaXplKSk7Cn0K From gcc-prs-return-23806-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 14:57:35 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 1650 invoked by alias); 1 Nov 2002 14:57:35 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 1630 invoked by uid 61); 1 Nov 2002 14:57:35 -0000 Date: 1 Nov 2002 14:57:35 -0000 Message-ID: <20021101145735.1629.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, martin@loewis.home.cs.tu-berlin.de, mguiod@nortelnetworks.com, nobody@gcc.gnu.org From: lerdsuwa@gcc.gnu.org Reply-To: lerdsuwa@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, martin@loewis.home.cs.tu-berlin.de, mguiod@nortelnetworks.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/253: `foo' is not a member of type `test'...but it is!! Synopsis: `foo' is not a member of type `test'...but it is!! State-Changed-From-To: analyzed->closed State-Changed-By: lerdsuwa State-Changed-When: Fri Nov 1 06:57:35 2002 State-Changed-Why: Fixed in the main trunk. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=253 From gcc-prs-return-23807-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 15:00:30 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12448 invoked by alias); 1 Nov 2002 15:00:29 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12410 invoked by uid 61); 1 Nov 2002 15:00:29 -0000 Date: 1 Nov 2002 15:00:28 -0000 Message-ID: <20021101150028.12409.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nickc@redhat.com, nobody@gcc.gnu.org, pb@nexus.co.uk, rearnsha@arm.com, rearnsha@gcc.gnu.org From: rearnsha@gcc.gnu.org Reply-To: rearnsha@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nickc@redhat.com, nobody@gcc.gnu.org, pb@nexus.co.uk, rearnsha@arm.com, rearnsha@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: target/7856: [arm] invalid offset in constant pool reference Synopsis: [arm] invalid offset in constant pool reference Responsible-Changed-From-To: unassigned->rearnsha Responsible-Changed-By: rearnsha Responsible-Changed-When: Fri Nov 1 07:00:28 2002 Responsible-Changed-Why: . State-Changed-From-To: analyzed->closed State-Changed-By: rearnsha State-Changed-When: Fri Nov 1 07:00:28 2002 State-Changed-Why: Fixed. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7856 From gcc-prs-return-23808-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 15:03:54 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24873 invoked by alias); 1 Nov 2002 15:03:52 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24851 invoked by uid 61); 1 Nov 2002 15:03:51 -0000 Date: 1 Nov 2002 15:03:51 -0000 Message-ID: <20021101150351.24850.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nkauer@ph.ed.ac.uk, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nkauer@ph.ed.ac.uk, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/4595: internal compiler error in c_expand_expr [c-common.c:4121] Synopsis: internal compiler error in c_expand_expr [c-common.c:4121] State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 07:03:50 2002 State-Changed-Why: According to Volker a duplicate of 4249, so closed. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4595 From gcc-prs-return-23810-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 15:26:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25515 invoked by alias); 1 Nov 2002 15:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 25499 invoked by uid 71); 1 Nov 2002 15:26:01 -0000 Date: 1 Nov 2002 15:26:01 -0000 Message-ID: <20021101152601.25498.qmail@sources.redhat.com> To: paolo@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: paolo@gcc.gnu.org Subject: libstdc++/7961 Reply-To: paolo@gcc.gnu.org The following reply was made to PR libstdc++/7961; it has been noted by GNATS. From: paolo@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: libstdc++/7961 Date: 1 Nov 2002 15:25:27 -0000 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_2-branch Changes by: paolo@gcc.gnu.org 2002-11-01 07:25:27 Modified files: libstdc++-v3 : ChangeLog libstdc++-v3/include/bits: basic_string.tcc Log message: 2002-11-01 John Carter PR libstdc++/7961 * include/bits/basic_string.tcc (compare(const _CharT* __s)): Don't access __s past its length. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.1057.2.159.2.41&r2=1.1057.2.159.2.42 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/basic_string.tcc.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.20.2.5.2.1&r2=1.20.2.5.2.2 From gcc-prs-return-23809-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 15:26:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25497 invoked by alias); 1 Nov 2002 15:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 25481 invoked by uid 71); 1 Nov 2002 15:26:00 -0000 Date: 1 Nov 2002 15:26:00 -0000 Message-ID: <20021101152600.25480.qmail@sources.redhat.com> To: paolo@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: paolo@gcc.gnu.org Subject: libstdc++/7961 Reply-To: paolo@gcc.gnu.org The following reply was made to PR libstdc++/7961; it has been noted by GNATS. From: paolo@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: libstdc++/7961 Date: 1 Nov 2002 15:21:17 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: paolo@gcc.gnu.org 2002-11-01 07:21:17 Modified files: libstdc++-v3 : ChangeLog libstdc++-v3/include/bits: basic_string.tcc Log message: 2002-11-01 John Carter PR libstdc++/7961 * include/bits/basic_string.tcc (compare(const _CharT* __s)): Don't access __s past its length. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/ChangeLog.diff?cvsroot=gcc&r1=1.1407&r2=1.1408 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/basic_string.tcc.diff?cvsroot=gcc&r1=1.26&r2=1.27 From gcc-prs-return-23811-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 15:27:37 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 32653 invoked by alias); 1 Nov 2002 15:27:36 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 32628 invoked by uid 61); 1 Nov 2002 15:27:36 -0000 Date: 1 Nov 2002 15:27:36 -0000 Message-ID: <20021101152736.32626.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, john.carter@tait.co.nz, paolo@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, john.carter@tait.co.nz, paolo@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7961: compare( char *) implemented incorrectly. Synopsis: compare( char *) implemented incorrectly. State-Changed-From-To: analyzed->closed State-Changed-By: paolo State-Changed-When: Fri Nov 1 07:27:36 2002 State-Changed-Why: Fixed for 3.2.1 and 3.3 with: http://gcc.gnu.org/ml/libstdc++/2002-11/msg00000.html http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7961 From gcc-prs-return-23812-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 15:36:00 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 2462 invoked by alias); 1 Nov 2002 15:36:00 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 2442 invoked by uid 71); 1 Nov 2002 15:36:00 -0000 Resent-Date: 1 Nov 2002 15:36:00 -0000 Resent-Message-ID: <20021101153600.2440.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, andyc@bluearc.com Received: (qmail 32473 invoked by uid 61); 1 Nov 2002 15:27:33 -0000 Message-Id: <20021101152733.32472.qmail@sources.redhat.com> Date: 1 Nov 2002 15:27:33 -0000 From: andyc@bluearc.com Reply-To: andyc@bluearc.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8424: initialising a pointer-to-member to an array element does not work >Number: 8424 >Category: c++ >Synopsis: initialising a pointer-to-member to an array element does not work >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Fri Nov 01 07:36:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: andyc@bluearc.com >Release: gcc version 3.2.1 20021020 (Debian prerelease) >Organization: >Environment: Debian Linux unstable release >Description: The attached program gives the following errors: # g++-3.2 -c -o membervar.o membervar.cpp membervar.cpp:6: member `B::b' is non-static but referenced as a static member membervar.cpp:15: at this point in file membervar.cpp:6: member `B::b' is non-static but referenced as a static member membervar.cpp:15: at this point in file >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: text/x-c++src; name="membervar.cpp" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="membervar.cpp" c3RydWN0IEEgewp9OwoKc3RydWN0IEIgewogICAgQSAgIGE7CiAgICBBICAgYlsyXTsKfTsKCnN0 cnVjdCBDIHsKICAgIEEgICAoQjo6KnYpOwp9OwoKQyBjW10gPSB7CiAgICAmQjo6YSwKICAgICZC OjpiWzBdICAgIC8vIGlzIHRoaXMgdmFsaWQ/IElmIG5vdCwgd2h5IG5vdD8KfTsK From gcc-prs-return-23813-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 16:34:19 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 8257 invoked by alias); 1 Nov 2002 16:34:19 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 8219 invoked by uid 61); 1 Nov 2002 16:34:18 -0000 Date: 1 Nov 2002 16:34:18 -0000 Message-ID: <20021101163418.8218.qmail@sources.redhat.com> To: adamwilkshire@hotmail.com, bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, adamwilkshire@hotmail.com, bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8348: fail() flag is set in istringstream when eof() flag is set ! Synopsis: fail() flag is set in istringstream when eof() flag is set ! Responsible-Changed-From-To: unassigned->bkoz Responsible-Changed-By: bkoz Responsible-Changed-When: Fri Nov 1 08:34:17 2002 Responsible-Changed-Why: Mine. State-Changed-From-To: analyzed->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 08:34:17 2002 State-Changed-Why: Fixed yesterday. In gcc/gcc-3_2-branches. -benjamin http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8348 From gcc-prs-return-23814-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 16:36:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 14369 invoked by alias); 1 Nov 2002 16:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14328 invoked by uid 71); 1 Nov 2002 16:36:01 -0000 Date: 1 Nov 2002 16:36:01 -0000 Message-ID: <20021101163601.14322.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: bkoz@gcc.gnu.org Subject: libstdc++/8348 Reply-To: bkoz@gcc.gnu.org The following reply was made to PR libstdc++/8348; it has been noted by GNATS. From: bkoz@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: libstdc++/8348 Date: 1 Nov 2002 16:27:30 -0000 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_2-branch Changes by: bkoz@gcc.gnu.org 2002-11-01 08:27:30 Modified files: libstdc++-v3 : ChangeLog libstdc++-v3/include/bits: istream.tcc libstdc++-v3/testsuite/27_io: istream_seeks.cc Log message: 2002-11-01 Benjamin Kosnik PR libstdc++/8348 * include/bits/istream.tcc (istream::tellg): Remove sentry bits. (istream::seekg): Same. * testsuite/27_io/istream_seeks.cc (test06): New. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.1057.2.159.2.42&r2=1.1057.2.159.2.43 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/istream.tcc.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.24.2.6.2.3&r2=1.24.2.6.2.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/testsuite/27_io/istream_seeks.cc.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.10.14.2&r2=1.10.14.2.2.1 From gcc-prs-return-23815-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 16:38:38 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 26042 invoked by alias); 1 Nov 2002 16:38:38 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 26016 invoked by uid 61); 1 Nov 2002 16:38:38 -0000 Date: 1 Nov 2002 16:38:38 -0000 Message-ID: <20021101163838.26015.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, setzersn@gmx.de From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, setzersn@gmx.de, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8319: warnings out of system headers Synopsis: warnings out of system headers State-Changed-From-To: open->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 08:38:37 2002 State-Changed-Why: You shouldn't need to set any of these environment variables. > But now I get warnings out of system-headers > (which I shouldn't, should I ?) Doing what? You'll need to give a testcase before anybody can really look at this. -benjamin http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8319 From gcc-prs-return-23816-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 16:39:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 27606 invoked by alias); 1 Nov 2002 16:39:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 27579 invoked by uid 61); 1 Nov 2002 16:39:01 -0000 Date: 1 Nov 2002 16:39:01 -0000 Message-ID: <20021101163901.27576.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, vwhite@entercept.com From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, vwhite@entercept.com, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8359: STL container can fault at runtime destroying contained objects with virtual destructors Synopsis: STL container can fault at runtime destroying contained objects with virtual destructors State-Changed-From-To: open->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 08:39:01 2002 State-Changed-Why: Awaiting a test case. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8359 From gcc-prs-return-23817-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 17:05:36 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 5582 invoked by alias); 1 Nov 2002 17:05:36 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 5561 invoked by uid 61); 1 Nov 2002 17:05:35 -0000 Date: 1 Nov 2002 17:05:35 -0000 Message-ID: <20021101170535.5560.qmail@sources.redhat.com> To: andyc@bluearc.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, andyc@bluearc.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8424: initialising a pointer-to-member to an array element does not work Synopsis: initialising a pointer-to-member to an array element does not work State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 09:05:35 2002 State-Changed-Why: This is not a bug. Your testcase boils down to --------------------------- struct A { int b[2]; }; int (A::*v) = &A::b[0]; // is this valid? If not, why not? ------------------------------- The point is that A::b is not a member variable of type "int (B::*)", and one of its elements is not a member variable, but -- an element of a member variable. This is not supposed to work. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8424 From gcc-prs-return-23818-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 17:17:40 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 15930 invoked by alias); 1 Nov 2002 17:17:39 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 15890 invoked by uid 61); 1 Nov 2002 17:17:38 -0000 Date: 1 Nov 2002 17:17:38 -0000 Message-ID: <20021101171738.15889.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, tudor_hulubei@yahoo.com From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, tudor_hulubei@yahoo.com, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8318: Not all wide character based prototypes are included within #ifdef _GLIBCPP_USE_WCHAR_T Synopsis: Not all wide character based prototypes are included within #ifdef _GLIBCPP_USE_WCHAR_T Responsible-Changed-From-To: unassigned->bkoz Responsible-Changed-By: bkoz Responsible-Changed-When: Fri Nov 1 09:17:38 2002 Responsible-Changed-Why: Mine. State-Changed-From-To: open->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 09:17:38 2002 State-Changed-Why: Fixed. 2002-11-01 Benjamin Kosnik PR libstdc++/8318 * include/std/std_iostream.h: Tweak. * include/std/std_iosfwd.h: Add _GLIBCPP_USE_WCHAR_T. * include/std/std_iomanip.h: Same. * include/bits/stringfwd.h: Same. * include/bits/basic_string.tcc: Same. * include/bits/sstream.tcc: Same. * include/bits/fstream.tcc: Same. * include/bits/basic_ios.tcc: Same. * include/bits/streambuf.tcc: Same. * include/bits/locale_facets.tcc: Same. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8318 From gcc-prs-return-23819-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 17:36:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 16798 invoked by alias); 1 Nov 2002 17:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 16759 invoked by uid 71); 1 Nov 2002 17:36:01 -0000 Date: 1 Nov 2002 17:36:01 -0000 Message-ID: <20021101173601.16754.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: bkoz@gcc.gnu.org Subject: libstdc++/8318 Reply-To: bkoz@gcc.gnu.org The following reply was made to PR libstdc++/8318; it has been noted by GNATS. From: bkoz@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: libstdc++/8318 Date: 1 Nov 2002 17:30:36 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: bkoz@gcc.gnu.org 2002-11-01 09:30:36 Modified files: libstdc++-v3 : ChangeLog libstdc++-v3/include/bits: basic_ios.tcc basic_string.tcc fstream.tcc locale_facets.tcc sstream.tcc streambuf.tcc stringfwd.h libstdc++-v3/include/std: std_iomanip.h std_iosfwd.h std_iostream.h Log message: 2002-11-01 Benjamin Kosnik PR libstdc++/8318 * include/std/std_iostream.h: Tweak. * include/std/std_iosfwd.h: Add _GLIBCPP_USE_WCHAR_T. * include/std/std_iomanip.h: Same. * include/bits/stringfwd.h: Same. * include/bits/basic_string.tcc: Same. * include/bits/sstream.tcc: Same. * include/bits/fstream.tcc: Same. * include/bits/basic_ios.tcc: Same. * include/bits/streambuf.tcc: Same. * include/bits/locale_facets.tcc: Same. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/ChangeLog.diff?cvsroot=gcc&r1=1.1408&r2=1.1409 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/basic_ios.tcc.diff?cvsroot=gcc&r1=1.16&r2=1.17 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/basic_string.tcc.diff?cvsroot=gcc&r1=1.27&r2=1.28 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/fstream.tcc.diff?cvsroot=gcc&r1=1.40&r2=1.41 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/locale_facets.tcc.diff?cvsroot=gcc&r1=1.81&r2=1.82 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/sstream.tcc.diff?cvsroot=gcc&r1=1.12&r2=1.13 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/streambuf.tcc.diff?cvsroot=gcc&r1=1.16&r2=1.17 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/bits/stringfwd.h.diff?cvsroot=gcc&r1=1.7&r2=1.8 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/std/std_iomanip.h.diff?cvsroot=gcc&r1=1.4&r2=1.5 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/std/std_iosfwd.h.diff?cvsroot=gcc&r1=1.3&r2=1.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/include/std/std_iostream.h.diff?cvsroot=gcc&r1=1.2&r2=1.3 From gcc-prs-return-23820-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 17:36:29 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 19041 invoked by alias); 1 Nov 2002 17:36:29 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 19016 invoked by uid 61); 1 Nov 2002 17:36:29 -0000 Date: 1 Nov 2002 17:36:29 -0000 Message-ID: <20021101173629.19014.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, llib@computer.org, nobody@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, llib@computer.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7942: ostream core dump with hex/internal/showbase formatted output Synopsis: ostream core dump with hex/internal/showbase formatted output State-Changed-From-To: open->feedback State-Changed-By: paolo State-Changed-When: Fri Nov 1 09:36:28 2002 State-Changed-Why: Cannot reproduce on i686-pc-linux-gnu with current 3.2.1 pre and 3.3 exp, seems target specific. In a few days gcc-3.2.1 will be out: could you possibly test again with that compiler and report? Thanks, Paolo. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7942 From gcc-prs-return-23821-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 17:39:52 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 402 invoked by alias); 1 Nov 2002 17:39:52 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 377 invoked by uid 61); 1 Nov 2002 17:39:52 -0000 Date: 1 Nov 2002 17:39:52 -0000 Message-ID: <20021101173952.376.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, masterxor@pop.rcn.com, nobody@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, masterxor@pop.rcn.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7813: Build fails Synopsis: Build fails State-Changed-From-To: open->closed State-Changed-By: paolo State-Changed-When: Fri Nov 1 09:39:51 2002 State-Changed-Why: Basing on Phil's comments I'm closing this. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7813 From gcc-prs-return-23822-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 17:44:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 17743 invoked by alias); 1 Nov 2002 17:44:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 17716 invoked by uid 61); 1 Nov 2002 17:44:03 -0000 Date: 1 Nov 2002 17:44:03 -0000 Message-ID: <20021101174403.17715.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org, ehrhardt@mathematik.uni-ulm.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, bkoz@gcc.gnu.org, ehrhardt@mathematik.uni-ulm.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8197: std::sin(float) causes undefined reference to sinf Synopsis: std::sin(float) causes undefined reference to sinf Responsible-Changed-From-To: unassigned->bkoz Responsible-Changed-By: bkoz Responsible-Changed-When: Fri Nov 1 09:44:03 2002 Responsible-Changed-Why: Mine. State-Changed-From-To: open->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 09:44:03 2002 State-Changed-Why: Applied (slightly modified) patch. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8197 From gcc-prs-return-23823-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 17:56:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 2339 invoked by alias); 1 Nov 2002 17:56:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 2300 invoked by uid 71); 1 Nov 2002 17:56:01 -0000 Date: 1 Nov 2002 17:56:01 -0000 Message-ID: <20021101175601.2298.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: bkoz@gcc.gnu.org Subject: libstdc++/8197 Reply-To: bkoz@gcc.gnu.org The following reply was made to PR libstdc++/8197; it has been noted by GNATS. From: bkoz@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: libstdc++/8197 Date: 1 Nov 2002 17:54:51 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: bkoz@gcc.gnu.org 2002-11-01 09:54:51 Modified files: libstdc++-v3 : ChangeLog libstdc++-v3/config: linker-map.gnu Log message: 2002-11-01 Christian Ehrhardt PR libstdc++/8197 * config/link-map.gnu: Export math stubbs. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/ChangeLog.diff?cvsroot=gcc&r1=1.1409&r2=1.1410 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/config/linker-map.gnu.diff?cvsroot=gcc&r1=1.20&r2=1.21 From gcc-prs-return-23824-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 18:26:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 5901 invoked by alias); 1 Nov 2002 18:26:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 5863 invoked by uid 71); 1 Nov 2002 18:26:01 -0000 Date: 1 Nov 2002 18:26:01 -0000 Message-ID: <20021101182601.5855.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: "Adam Wilkshire" Subject: Re: libstdc++/8348: fail() flag is set in istringstream when eof() flag is set ! Reply-To: "Adam Wilkshire" The following reply was made to PR libstdc++/8348; it has been noted by GNATS. From: "Adam Wilkshire" To: bkoz@gcc.gnu.org, adamwilkshire@hotmail.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Cc: Subject: Re: libstdc++/8348: fail() flag is set in istringstream when eof() flag is set ! Date: Fri, 01 Nov 2002 18:25:49 +0000

Great ! Thanks for the effort.

Ciao,

Adam.



Broadband? Dial-up? Get reliable MSN Internet Access. Click Here From gcc-prs-return-23825-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 20:06:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 29714 invoked by alias); 1 Nov 2002 20:06:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 29680 invoked by uid 71); 1 Nov 2002 20:06:02 -0000 Date: 1 Nov 2002 20:06:02 -0000 Message-ID: <20021101200602.29674.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Wolfgang Bangerth Subject: Re: c++/5750: g++ segfaults when using the gcc-extention of typeof() in a template class Reply-To: Wolfgang Bangerth The following reply was made to PR c++/5750; it has been noted by GNATS. From: Wolfgang Bangerth To: gcc-gnats@gcc.gnu.org, Cc: Subject: Re: c++/5750: g++ segfaults when using the gcc-extention of typeof() in a template class Date: Fri, 1 Nov 2002 14:01:33 -0600 (CST) Reduced testcase is ---------------------------------- template struct A { static const int n = T::n; }; template struct B { typedef A X; static const int m = X::n; }; ---------------------------------- May be related to c++/8007 and is probably a duplicate of 4526. W. ------------------------------------------------------------------------- Wolfgang Bangerth email: bangerth@ticam.utexas.edu www: http://www.ticam.utexas.edu/~bangerth From gcc-prs-return-23826-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 20:06:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 29794 invoked by alias); 1 Nov 2002 20:06:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 29724 invoked by uid 71); 1 Nov 2002 20:06:02 -0000 Date: 1 Nov 2002 20:06:02 -0000 Message-ID: <20021101200602.29722.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Wolfgang Bangerth Subject: Re: c++/8007: Internal compiler error in walk_tree Reply-To: Wolfgang Bangerth The following reply was made to PR c++/8007; it has been noted by GNATS. From: Wolfgang Bangerth To: gcc-gnats@gcc.gnu.org Cc: Subject: Re: c++/8007: Internal compiler error in walk_tree Date: Fri, 1 Nov 2002 14:02:21 -0600 (CST) Whoever looks at this should also look at PRs 5750 and 4526. W. ------------------------------------------------------------------------- Wolfgang Bangerth email: bangerth@ticam.utexas.edu www: http://www.ticam.utexas.edu/~bangerth From gcc-prs-return-23827-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 20:06:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 29820 invoked by alias); 1 Nov 2002 20:06:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 29769 invoked by uid 71); 1 Nov 2002 20:06:03 -0000 Date: 1 Nov 2002 20:06:03 -0000 Message-ID: <20021101200603.29765.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Wolfgang Bangerth Subject: Re: c++/4526: ICE in g++ 3.0.1 when using typeof() as template parameter Reply-To: Wolfgang Bangerth The following reply was made to PR c++/4526; it has been noted by GNATS. From: Wolfgang Bangerth To: gcc-gnats@gcc.gnu.org Cc: Subject: Re: c++/4526: ICE in g++ 3.0.1 when using typeof() as template parameter Date: Fri, 1 Nov 2002 14:03:42 -0600 (CST) Whoever looks at this should also look at PRs 5750 and 8007. W. ------------------------------------------------------------------------- Wolfgang Bangerth email: bangerth@ticam.utexas.edu www: http://www.ticam.utexas.edu/~bangerth From gcc-prs-return-23828-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 20:36:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 20481 invoked by alias); 1 Nov 2002 20:36:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 20443 invoked by uid 71); 1 Nov 2002 20:36:01 -0000 Date: 1 Nov 2002 20:36:01 -0000 Message-ID: <20021101203601.20440.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Wolfgang Bangerth Subject: Re: c++/4926: Segmentation Fault on Legal Code Reply-To: Wolfgang Bangerth The following reply was made to PR c++/4926; it has been noted by GNATS. From: Wolfgang Bangerth To: gcc-bugs@gcc.gnu.org, Cc: Subject: Re: c++/4926: Segmentation Fault on Legal Code Date: Fri, 1 Nov 2002 14:31:33 -0600 (CST) It's too bad that templates with typeof are still broken in some places, since the (standards conforming) workarounds are also not working always. Here's a redux of PR 4926: -------------------------------------- template struct X { typedef int Type; }; template struct Y { char array[1]; }; template Y P(T); // acts as "Y" struct F { int operator()() const; }; template typename X::Type foo(); int main() { foo(); }; -------------------------------------- By changing F::operator() into a "regular" member function, all sorts of other bugs can be triggered before the compiler finally crashed :-( Regards Wolfgang ------------------------------------------------------------------------- Wolfgang Bangerth email: bangerth@ticam.utexas.edu www: http://www.ticam.utexas.edu/~bangerth From gcc-prs-return-23829-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 20:46:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 19191 invoked by alias); 1 Nov 2002 20:46:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 19158 invoked by uid 71); 1 Nov 2002 20:46:01 -0000 Date: 1 Nov 2002 20:46:01 -0000 Message-ID: <20021101204601.19156.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Wolfgang Bangerth Subject: Re: c++/3869: Segmentation fault on specialized outer template with inner member template Reply-To: Wolfgang Bangerth The following reply was made to PR c++/3869; it has been noted by GNATS. From: Wolfgang Bangerth To: gcc-bugs@gcc.gnu.org, Cc: Subject: Re: c++/3869: Segmentation fault on specialized outer template with inner member template Date: Fri, 1 Nov 2002 14:41:49 -0600 (CST) This is a reduced testcase: --------------------------------------- template struct Outer { template struct Inner { typedef int Result; }; }; template<> struct Outer<0> { template struct Inner { typedef int Result; }; }; template struct Select { typedef typename Outer::Inner::Result Result; }; typedef Select<1>::Result Int; -------------------------------------- It fails with a segfault. W. ------------------------------------------------------------------------- Wolfgang Bangerth email: bangerth@ticam.utexas.edu www: http://www.ticam.utexas.edu/~bangerth From gcc-prs-return-23830-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 20:56:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 31582 invoked by alias); 1 Nov 2002 20:56:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 31555 invoked by uid 71); 1 Nov 2002 20:56:01 -0000 Date: 1 Nov 2002 20:56:01 -0000 Message-ID: <20021101205601.31553.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Tom Tromey Subject: Re: java/8415: reflection bug: exception info for Method Reply-To: Tom Tromey The following reply was made to PR java/8415; it has been noted by GNATS. From: Tom Tromey To: Anthony Green Cc: gcc-gnats@gcc.gnu.org Subject: Re: java/8415: reflection bug: exception info for Method Date: 01 Nov 2002 14:42:16 -0700 Anthony> I don't have a simple test case prepared. I wrote one. I'll check it in. Anthony> This work-around seems useful for now. Another fix would be Anthony> to change the format of the meta-data emitted by the Anthony> compiler. I prefer the latter. I have a patch that I'm testing. Tom From gcc-prs-return-23831-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 21:46:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 18952 invoked by alias); 1 Nov 2002 21:46:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 18920 invoked by uid 71); 1 Nov 2002 21:46:02 -0000 Date: 1 Nov 2002 21:46:02 -0000 Message-ID: <20021101214602.18918.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Kevin Ryde Subject: Re: optimization/6162: gcc 3.0.4: certain i386 asm reloader ice Reply-To: Kevin Ryde The following reply was made to PR optimization/6162; it has been noted by GNATS. From: Kevin Ryde To: Michael Matz Cc: Nathanael Nerode , , , , , =?iso-8859-1?q?Torbj=F6rn?= Granlund Subject: Re: optimization/6162: gcc 3.0.4: certain i386 asm reloader ice Date: Sat, 02 Nov 2002 07:40:40 +1000 Michael Matz writes: > > To fix this indeed would be quite involved, as we would need to handle > then all permutations of swappings (of which there are 4 with two pairs). As a suggestion in the interim, perhaps internally all but the last commutative could be quietly dropped. If only the last is acted on now anyway then it'd be no loss, and it'd let applications give full information, if that might be useful in the future. From gcc-prs-return-23832-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 22:46:06 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 16534 invoked by alias); 1 Nov 2002 22:46:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 16465 invoked by uid 71); 1 Nov 2002 22:46:02 -0000 Resent-Date: 1 Nov 2002 22:46:02 -0000 Resent-Message-ID: <20021101224602.16462.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, Linards Ticmanis Received: (qmail 26721 invoked from network); 1 Nov 2002 22:38:04 -0000 Received: from unknown (HELO d245.stw.stud.uni-saarland.de) (134.96.56.245) by sources.redhat.com with SMTP; 1 Nov 2002 22:38:04 -0000 Received: from d245.stw.stud.uni-saarland.de (localhost [127.0.0.1]) by d245.stw.stud.uni-saarland.de (8.12.6/8.12.6/SuSE Linux 0.6) with ESMTP id gA1MbuY3030068 for ; Fri, 1 Nov 2002 23:37:56 +0100 Received: (from linards@localhost) by d245.stw.stud.uni-saarland.de (8.12.6/8.12.6/Submit) id gA1MbtF2030067; Fri, 1 Nov 2002 23:37:55 +0100 Message-Id: <200211012237.gA1MbtF2030067@d245.stw.stud.uni-saarland.de> Date: Fri, 1 Nov 2002 23:37:55 +0100 From: Linards Ticmanis To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: 3.113 Subject: c/8426: GCC segfault >Number: 8426 >Category: c >Synopsis: GCC segfault >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Fri Nov 01 14:46:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Linards Ticmanis >Release: 3.2 >Organization: >Environment: System: Linux d245 2.4.19-4GB #1 Fri Sep 13 13:14:56 UTC 2002 i686 unknown Architecture: i686 host: i486-suse-linux-gnu build: i486-suse-linux-gnu target: i486-suse-linux-gnu configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --enable-languages=c,c++,f77,objc,java,ada --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit i486-suse-linux >Description: If Compiled with gcc -Wall -O4 -march=pentium3 -mcpu=pentium3 -mmmx -msse -mfpmath=sse -malign-double -m128bit-long-double -maccumulate-outgoing-args -pipe -ffast-math -fomit-frame-pointer -D_REENTRANT -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -g -DHAVE_AV_CONFIG_H -I.. -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE -c -o ratecontrol.o ratecontrol.c The given code produces the following error: ratecontrol.c: In function `ff_rate_control_init': ratecontrol.c:159: internal error: Segmentation fault The cause seems to be the "-m128bit-long-double" option >How-To-Repeat: # 1 "ratecontrol.c" # 1 "" # 1 "" # 1 "ratecontrol.c" # 20 "ratecontrol.c" # 1 "/usr/include/math.h" 1 3 # 27 "/usr/include/math.h" 3 # 1 "/usr/include/features.h" 1 3 # 283 "/usr/include/features.h" 3 # 1 "/usr/include/sys/cdefs.h" 1 3 # 284 "/usr/include/features.h" 2 3 # 312 "/usr/include/features.h" 3 # 1 "/usr/include/gnu/stubs.h" 1 3 # 313 "/usr/include/features.h" 2 3 # 28 "/usr/include/math.h" 2 3 # 1 "/usr/include/bits/huge_val.h" 1 3 # 34 "/usr/include/math.h" 2 3 # 1 "/usr/include/bits/nan.h" 1 3 # 38 "/usr/include/math.h" 2 3 # 1 "/usr/include/bits/mathdef.h" 1 3 # 29 "/usr/include/bits/mathdef.h" 3 typedef long double float_t; typedef long double double_t; # 41 "/usr/include/math.h" 2 3 # 63 "/usr/include/math.h" 3 # 1 "/usr/include/bits/mathcalls.h" 1 3 # 54 "/usr/include/bits/mathcalls.h" 3 extern double acos (double __x) ; extern double __acos (double __x) ; extern double asin (double __x) ; extern double __asin (double __x) ; extern double atan (double __x) ; extern double __atan (double __x) ; extern double atan2 (double __y, double __x) ; extern double __atan2 (double __y, double __x) ; extern double cos (double __x) ; extern double __cos (double __x) ; extern double sin (double __x) ; extern double __sin (double __x) ; extern double tan (double __x) ; extern double __tan (double __x) ; extern void sincos (double __x, double *__sinx, double *__cosx) ; extern void __sincos (double __x, double *__sinx, double *__cosx) ; extern double cosh (double __x) ; extern double __cosh (double __x) ; extern double sinh (double __x) ; extern double __sinh (double __x) ; extern double tanh (double __x) ; extern double __tanh (double __x) ; extern double acosh (double __x) ; extern double __acosh (double __x) ; extern double asinh (double __x) ; extern double __asinh (double __x) ; extern double atanh (double __x) ; extern double __atanh (double __x) ; extern double exp (double __x) ; extern double __exp (double __x) ; extern double exp10 (double __x) ; extern double __exp10 (double __x) ; extern double pow10 (double __x) ; extern double __pow10 (double __x) ; extern double frexp (double __x, int *__exponent) ; extern double __frexp (double __x, int *__exponent) ; extern double ldexp (double __x, int __exponent) ; extern double __ldexp (double __x, int __exponent) ; extern double log (double __x) ; extern double __log (double __x) ; extern double log10 (double __x) ; extern double __log10 (double __x) ; extern double modf (double __x, double *__iptr) ; extern double __modf (double __x, double *__iptr) ; extern double expm1 (double __x) ; extern double __expm1 (double __x) ; extern double log1p (double __x) ; extern double __log1p (double __x) ; extern double logb (double __x) ; extern double __logb (double __x) ; extern double exp2 (double __x) ; extern double __exp2 (double __x) ; extern double log2 (double __x) ; extern double __log2 (double __x) ; extern double pow (double __x, double __y) ; extern double __pow (double __x, double __y) ; extern double sqrt (double __x) ; extern double __sqrt (double __x) ; extern double hypot (double __x, double __y) ; extern double __hypot (double __x, double __y) ; extern double cbrt (double __x) ; extern double __cbrt (double __x) ; extern double ceil (double __x) ; extern double __ceil (double __x) ; extern double fabs (double __x) __attribute__ ((__const__)); extern double __fabs (double __x) __attribute__ ((__const__)); extern double floor (double __x) ; extern double __floor (double __x) ; extern double fmod (double __x, double __y) ; extern double __fmod (double __x, double __y) ; extern int __isinf (double __value) __attribute__ ((__const__)); extern int __finite (double __value) __attribute__ ((__const__)); extern int isinf (double __value) __attribute__ ((__const__)); extern int finite (double __value) __attribute__ ((__const__)); extern double drem (double __x, double __y) ; extern double __drem (double __x, double __y) ; extern double significand (double __x) ; extern double __significand (double __x) ; extern double copysign (double __x, double __y) __attribute__ ((__const__)); extern double __copysign (double __x, double __y) __attribute__ ((__const__)); extern double nan (__const char *__tagb) __attribute__ ((__const__)); extern double __nan (__const char *__tagb) __attribute__ ((__const__)); extern int __isnan (double __value) __attribute__ ((__const__)); extern int isnan (double __value) __attribute__ ((__const__)); extern double j0 (double) ; extern double __j0 (double) ; extern double j1 (double) ; extern double __j1 (double) ; extern double jn (int, double) ; extern double __jn (int, double) ; extern double y0 (double) ; extern double __y0 (double) ; extern double y1 (double) ; extern double __y1 (double) ; extern double yn (int, double) ; extern double __yn (int, double) ; extern double erf (double) ; extern double __erf (double) ; extern double erfc (double) ; extern double __erfc (double) ; extern double lgamma (double) ; extern double __lgamma (double) ; extern double tgamma (double) ; extern double __tgamma (double) ; extern double gamma (double) ; extern double __gamma (double) ; extern double lgamma_r (double, int *__signgamp) ; extern double __lgamma_r (double, int *__signgamp) ; extern double rint (double __x) ; extern double __rint (double __x) ; extern double nextafter (double __x, double __y) __attribute__ ((__const__)); extern double __nextafter (double __x, double __y) __attribute__ ((__const__)); extern double nexttoward (double __x, long double __y) __attribute__ ((__const__)); extern double __nexttoward (double __x, long double __y) __attribute__ ((__const__)); extern double remainder (double __x, double __y) ; extern double __remainder (double __x, double __y) ; extern double scalb (double __x, double __n) ; extern double __scalb (double __x, double __n) ; extern double scalbn (double __x, int __n) ; extern double __scalbn (double __x, int __n) ; extern int ilogb (double __x) ; extern int __ilogb (double __x) ; extern double scalbln (double __x, long int __n) ; extern double __scalbln (double __x, long int __n) ; extern double nearbyint (double __x) ; extern double __nearbyint (double __x) ; extern double round (double __x) ; extern double __round (double __x) ; extern double trunc (double __x) __attribute__ ((__const__)); extern double __trunc (double __x) __attribute__ ((__const__)); extern double remquo (double __x, double __y, int *__quo) ; extern double __remquo (double __x, double __y, int *__quo) ; extern long int lrint (double __x) ; extern long int __lrint (double __x) ; extern long long int llrint (double __x) ; extern long long int __llrint (double __x) ; extern long int lround (double __x) ; extern long int __lround (double __x) ; extern long long int llround (double __x) ; extern long long int __llround (double __x) ; extern double fdim (double __x, double __y) ; extern double __fdim (double __x, double __y) ; extern double fmax (double __x, double __y) ; extern double __fmax (double __x, double __y) ; extern double fmin (double __x, double __y) ; extern double __fmin (double __x, double __y) ; extern int __fpclassify (double __value) __attribute__ ((__const__)); extern int __signbit (double __value) __attribute__ ((__const__)); extern double fma (double __x, double __y, double __z) ; extern double __fma (double __x, double __y, double __z) ; # 64 "/usr/include/math.h" 2 3 # 82 "/usr/include/math.h" 3 # 1 "/usr/include/bits/mathcalls.h" 1 3 # 54 "/usr/include/bits/mathcalls.h" 3 extern float acosf (float __x) ; extern float __acosf (float __x) ; extern float asinf (float __x) ; extern float __asinf (float __x) ; extern float atanf (float __x) ; extern float __atanf (float __x) ; extern float atan2f (float __y, float __x) ; extern float __atan2f (float __y, float __x) ; extern float cosf (float __x) ; extern float __cosf (float __x) ; extern float sinf (float __x) ; extern float __sinf (float __x) ; extern float tanf (float __x) ; extern float __tanf (float __x) ; extern void sincosf (float __x, float *__sinx, float *__cosx) ; extern void __sincosf (float __x, float *__sinx, float *__cosx) ; extern float coshf (float __x) ; extern float __coshf (float __x) ; extern float sinhf (float __x) ; extern float __sinhf (float __x) ; extern float tanhf (float __x) ; extern float __tanhf (float __x) ; extern float acoshf (float __x) ; extern float __acoshf (float __x) ; extern float asinhf (float __x) ; extern float __asinhf (float __x) ; extern float atanhf (float __x) ; extern float __atanhf (float __x) ; extern float expf (float __x) ; extern float __expf (float __x) ; extern float exp10f (float __x) ; extern float __exp10f (float __x) ; extern float pow10f (float __x) ; extern float __pow10f (float __x) ; extern float frexpf (float __x, int *__exponent) ; extern float __frexpf (float __x, int *__exponent) ; extern float ldexpf (float __x, int __exponent) ; extern float __ldexpf (float __x, int __exponent) ; extern float logf (float __x) ; extern float __logf (float __x) ; extern float log10f (float __x) ; extern float __log10f (float __x) ; extern float modff (float __x, float *__iptr) ; extern float __modff (float __x, float *__iptr) ; extern float expm1f (float __x) ; extern float __expm1f (float __x) ; extern float log1pf (float __x) ; extern float __log1pf (float __x) ; extern float logbf (float __x) ; extern float __logbf (float __x) ; extern float exp2f (float __x) ; extern float __exp2f (float __x) ; extern float log2f (float __x) ; extern float __log2f (float __x) ; extern float powf (float __x, float __y) ; extern float __powf (float __x, float __y) ; extern float sqrtf (float __x) ; extern float __sqrtf (float __x) ; extern float hypotf (float __x, float __y) ; extern float __hypotf (float __x, float __y) ; extern float cbrtf (float __x) ; extern float __cbrtf (float __x) ; extern float ceilf (float __x) ; extern float __ceilf (float __x) ; extern float fabsf (float __x) __attribute__ ((__const__)); extern float __fabsf (float __x) __attribute__ ((__const__)); extern float floorf (float __x) ; extern float __floorf (float __x) ; extern float fmodf (float __x, float __y) ; extern float __fmodf (float __x, float __y) ; extern int __isinff (float __value) __attribute__ ((__const__)); extern int __finitef (float __value) __attribute__ ((__const__)); extern int isinff (float __value) __attribute__ ((__const__)); extern int finitef (float __value) __attribute__ ((__const__)); extern float dremf (float __x, float __y) ; extern float __dremf (float __x, float __y) ; extern float significandf (float __x) ; extern float __significandf (float __x) ; extern float copysignf (float __x, float __y) __attribute__ ((__const__)); extern float __copysignf (float __x, float __y) __attribute__ ((__const__)); extern float nanf (__const char *__tagb) __attribute__ ((__const__)); extern float __nanf (__const char *__tagb) __attribute__ ((__const__)); extern int __isnanf (float __value) __attribute__ ((__const__)); extern int isnanf (float __value) __attribute__ ((__const__)); extern float j0f (float) ; extern float __j0f (float) ; extern float j1f (float) ; extern float __j1f (float) ; extern float jnf (int, float) ; extern float __jnf (int, float) ; extern float y0f (float) ; extern float __y0f (float) ; extern float y1f (float) ; extern float __y1f (float) ; extern float ynf (int, float) ; extern float __ynf (int, float) ; extern float erff (float) ; extern float __erff (float) ; extern float erfcf (float) ; extern float __erfcf (float) ; extern float lgammaf (float) ; extern float __lgammaf (float) ; extern float tgammaf (float) ; extern float __tgammaf (float) ; extern float gammaf (float) ; extern float __gammaf (float) ; extern float lgammaf_r (float, int *__signgamp) ; extern float __lgammaf_r (float, int *__signgamp) ; extern float rintf (float __x) ; extern float __rintf (float __x) ; extern float nextafterf (float __x, float __y) __attribute__ ((__const__)); extern float __nextafterf (float __x, float __y) __attribute__ ((__const__)); extern float nexttowardf (float __x, long double __y) __attribute__ ((__const__)); extern float __nexttowardf (float __x, long double __y) __attribute__ ((__const__)); extern float remainderf (float __x, float __y) ; extern float __remainderf (float __x, float __y) ; extern float scalbf (float __x, float __n) ; extern float __scalbf (float __x, float __n) ; extern float scalbnf (float __x, int __n) ; extern float __scalbnf (float __x, int __n) ; extern int ilogbf (float __x) ; extern int __ilogbf (float __x) ; extern float scalblnf (float __x, long int __n) ; extern float __scalblnf (float __x, long int __n) ; extern float nearbyintf (float __x) ; extern float __nearbyintf (float __x) ; extern float roundf (float __x) ; extern float __roundf (float __x) ; extern float truncf (float __x) __attribute__ ((__const__)); extern float __truncf (float __x) __attribute__ ((__const__)); extern float remquof (float __x, float __y, int *__quo) ; extern float __remquof (float __x, float __y, int *__quo) ; extern long int lrintf (float __x) ; extern long int __lrintf (float __x) ; extern long long int llrintf (float __x) ; extern long long int __llrintf (float __x) ; extern long int lroundf (float __x) ; extern long int __lroundf (float __x) ; extern long long int llroundf (float __x) ; extern long long int __llroundf (float __x) ; extern float fdimf (float __x, float __y) ; extern float __fdimf (float __x, float __y) ; extern float fmaxf (float __x, float __y) ; extern float __fmaxf (float __x, float __y) ; extern float fminf (float __x, float __y) ; extern float __fminf (float __x, float __y) ; extern int __fpclassifyf (float __value) __attribute__ ((__const__)); extern int __signbitf (float __value) __attribute__ ((__const__)); extern float fmaf (float __x, float __y, float __z) ; extern float __fmaf (float __x, float __y, float __z) ; # 83 "/usr/include/math.h" 2 3 # 99 "/usr/include/math.h" 3 # 1 "/usr/include/bits/mathcalls.h" 1 3 # 54 "/usr/include/bits/mathcalls.h" 3 extern long double acosl (long double __x) ; extern long double __acosl (long double __x) ; extern long double asinl (long double __x) ; extern long double __asinl (long double __x) ; extern long double atanl (long double __x) ; extern long double __atanl (long double __x) ; extern long double atan2l (long double __y, long double __x) ; extern long double __atan2l (long double __y, long double __x) ; extern long double cosl (long double __x) ; extern long double __cosl (long double __x) ; extern long double sinl (long double __x) ; extern long double __sinl (long double __x) ; extern long double tanl (long double __x) ; extern long double __tanl (long double __x) ; extern void sincosl (long double __x, long double *__sinx, long double *__cosx) ; extern void __sincosl (long double __x, long double *__sinx, long double *__cosx) ; extern long double coshl (long double __x) ; extern long double __coshl (long double __x) ; extern long double sinhl (long double __x) ; extern long double __sinhl (long double __x) ; extern long double tanhl (long double __x) ; extern long double __tanhl (long double __x) ; extern long double acoshl (long double __x) ; extern long double __acoshl (long double __x) ; extern long double asinhl (long double __x) ; extern long double __asinhl (long double __x) ; extern long double atanhl (long double __x) ; extern long double __atanhl (long double __x) ; extern long double expl (long double __x) ; extern long double __expl (long double __x) ; extern long double exp10l (long double __x) ; extern long double __exp10l (long double __x) ; extern long double pow10l (long double __x) ; extern long double __pow10l (long double __x) ; extern long double frexpl (long double __x, int *__exponent) ; extern long double __frexpl (long double __x, int *__exponent) ; extern long double ldexpl (long double __x, int __exponent) ; extern long double __ldexpl (long double __x, int __exponent) ; extern long double logl (long double __x) ; extern long double __logl (long double __x) ; extern long double log10l (long double __x) ; extern long double __log10l (long double __x) ; extern long double modfl (long double __x, long double *__iptr) ; extern long double __modfl (long double __x, long double *__iptr) ; extern long double expm1l (long double __x) ; extern long double __expm1l (long double __x) ; extern long double log1pl (long double __x) ; extern long double __log1pl (long double __x) ; extern long double logbl (long double __x) ; extern long double __logbl (long double __x) ; extern long double exp2l (long double __x) ; extern long double __exp2l (long double __x) ; extern long double log2l (long double __x) ; extern long double __log2l (long double __x) ; extern long double powl (long double __x, long double __y) ; extern long double __powl (long double __x, long double __y) ; extern long double sqrtl (long double __x) ; extern long double __sqrtl (long double __x) ; extern long double hypotl (long double __x, long double __y) ; extern long double __hypotl (long double __x, long double __y) ; extern long double cbrtl (long double __x) ; extern long double __cbrtl (long double __x) ; extern long double ceill (long double __x) ; extern long double __ceill (long double __x) ; extern long double fabsl (long double __x) __attribute__ ((__const__)); extern long double __fabsl (long double __x) __attribute__ ((__const__)); extern long double floorl (long double __x) ; extern long double __floorl (long double __x) ; extern long double fmodl (long double __x, long double __y) ; extern long double __fmodl (long double __x, long double __y) ; extern int __isinfl (long double __value) __attribute__ ((__const__)); extern int __finitel (long double __value) __attribute__ ((__const__)); extern int isinfl (long double __value) __attribute__ ((__const__)); extern int finitel (long double __value) __attribute__ ((__const__)); extern long double dreml (long double __x, long double __y) ; extern long double __dreml (long double __x, long double __y) ; extern long double significandl (long double __x) ; extern long double __significandl (long double __x) ; extern long double copysignl (long double __x, long double __y) __attribute__ ((__const__)); extern long double __copysignl (long double __x, long double __y) __attribute__ ((__const__)); extern long double nanl (__const char *__tagb) __attribute__ ((__const__)); extern long double __nanl (__const char *__tagb) __attribute__ ((__const__)); extern int __isnanl (long double __value) __attribute__ ((__const__)); extern int isnanl (long double __value) __attribute__ ((__const__)); extern long double j0l (long double) ; extern long double __j0l (long double) ; extern long double j1l (long double) ; extern long double __j1l (long double) ; extern long double jnl (int, long double) ; extern long double __jnl (int, long double) ; extern long double y0l (long double) ; extern long double __y0l (long double) ; extern long double y1l (long double) ; extern long double __y1l (long double) ; extern long double ynl (int, long double) ; extern long double __ynl (int, long double) ; extern long double erfl (long double) ; extern long double __erfl (long double) ; extern long double erfcl (long double) ; extern long double __erfcl (long double) ; extern long double lgammal (long double) ; extern long double __lgammal (long double) ; extern long double tgammal (long double) ; extern long double __tgammal (long double) ; extern long double gammal (long double) ; extern long double __gammal (long double) ; extern long double lgammal_r (long double, int *__signgamp) ; extern long double __lgammal_r (long double, int *__signgamp) ; extern long double rintl (long double __x) ; extern long double __rintl (long double __x) ; extern long double nextafterl (long double __x, long double __y) __attribute__ ((__const__)); extern long double __nextafterl (long double __x, long double __y) __attribute__ ((__const__)); extern long double nexttowardl (long double __x, long double __y) __attribute__ ((__const__)); extern long double __nexttowardl (long double __x, long double __y) __attribute__ ((__const__)); extern long double remainderl (long double __x, long double __y) ; extern long double __remainderl (long double __x, long double __y) ; extern long double scalbl (long double __x, long double __n) ; extern long double __scalbl (long double __x, long double __n) ; extern long double scalbnl (long double __x, int __n) ; extern long double __scalbnl (long double __x, int __n) ; extern int ilogbl (long double __x) ; extern int __ilogbl (long double __x) ; extern long double scalblnl (long double __x, long int __n) ; extern long double __scalblnl (long double __x, long int __n) ; extern long double nearbyintl (long double __x) ; extern long double __nearbyintl (long double __x) ; extern long double roundl (long double __x) ; extern long double __roundl (long double __x) ; extern long double truncl (long double __x) __attribute__ ((__const__)); extern long double __truncl (long double __x) __attribute__ ((__const__)); extern long double remquol (long double __x, long double __y, int *__quo) ; extern long double __remquol (long double __x, long double __y, int *__quo) ; extern long int lrintl (long double __x) ; extern long int __lrintl (long double __x) ; extern long long int llrintl (long double __x) ; extern long long int __llrintl (long double __x) ; extern long int lroundl (long double __x) ; extern long int __lroundl (long double __x) ; extern long long int llroundl (long double __x) ; extern long long int __llroundl (long double __x) ; extern long double fdiml (long double __x, long double __y) ; extern long double __fdiml (long double __x, long double __y) ; extern long double fmaxl (long double __x, long double __y) ; extern long double __fmaxl (long double __x, long double __y) ; extern long double fminl (long double __x, long double __y) ; extern long double __fminl (long double __x, long double __y) ; extern int __fpclassifyl (long double __value) __attribute__ ((__const__)); extern int __signbitl (long double __value) __attribute__ ((__const__)); extern long double fmal (long double __x, long double __y, long double __z) ; extern long double __fmal (long double __x, long double __y, long double __z) ; # 100 "/usr/include/math.h" 2 3 # 113 "/usr/include/math.h" 3 extern int signgam; # 154 "/usr/include/math.h" 3 enum { FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL }; # 240 "/usr/include/math.h" 3 typedef enum { _IEEE_ = -1, _SVID_, _XOPEN_, _POSIX_, _ISOC_ } _LIB_VERSION_TYPE; extern _LIB_VERSION_TYPE _LIB_VERSION; # 265 "/usr/include/math.h" 3 struct exception { int type; char *name; double arg1; double arg2; double retval; }; extern int matherr (struct exception *__exc); # 350 "/usr/include/math.h" 3 # 1 "/usr/include/bits/mathinline.h" 1 3 # 127 "/usr/include/bits/mathinline.h" 3 extern __inline int __signbitf (float __x) { __extension__ union { float __f; int __i; } __u = { __f: __x }; return __u.__i < 0; } extern __inline int __signbit (double __x) { __extension__ union { double __d; int __i[2]; } __u = { __d: __x }; return __u.__i[1] < 0; } extern __inline int __signbitl (long double __x) { __extension__ union { long double __l; int __i[3]; } __u = { __l: __x }; return (__u.__i[2] & 0x8000) != 0; } # 291 "/usr/include/bits/mathinline.h" 3 extern __inline double __sgn (double) ; extern __inline double __sgn (double __x) { return __x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0); } extern __inline float __sgnf (float) ; extern __inline float __sgnf (float __x) { return __x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0); } extern __inline long double __sgnl (long double) ; extern __inline long double __sgnl (long double __x) { return __x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0); } extern __inline double __pow2 (double) ; extern __inline double __pow2 (double __x) { register long double __value; register long double __exponent; __extension__ long long int __p = (long long int) __x; if (__x == (long double) __p) { __asm __volatile__ ("fscale" : "=t" (__value) : "0" (1.0), "u" (__x)); return __value; } __asm __volatile__ ("fld %%st(0)\n\t" "frndint # int(x)\n\t" "fxch\n\t" "fsub %%st(1) # fract(x)\n\t" "f2xm1 # 2^(fract(x)) - 1\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __value += 1.0; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__value), "u" (__exponent)); return __value; } extern __inline float __pow2f (float) ; extern __inline float __pow2f (float __x) { register long double __value; register long double __exponent; __extension__ long long int __p = (long long int) __x; if (__x == (long double) __p) { __asm __volatile__ ("fscale" : "=t" (__value) : "0" (1.0), "u" (__x)); return __value; } __asm __volatile__ ("fld %%st(0)\n\t"! "frndint # int(x)\n\t" "fxch\n\t" "fsub %%st(1) # fract(x)\n\t" "f2xm1 # 2^(fract(x)) - 1\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __value += 1.0; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__value), "u" (__exponent)); return __value; } extern __inline long double __pow2l (long double) ; extern __inline long double __pow2l (long double __x) { register long double __value; register long double __exponent; __extension__ long long int __p = (long long int) __x; if (__x == (long double) __p) { __asm __volatile__ ("fscale" : "=t" (__value) : "0" (1.0), "u" (__x)); return __value; } __asm __volatile__ ("fld %%st(0)\n\t" "frndint # int(x)\n\t" "fxch\n\t" "fsub %%st(1) # fract(x)\n\t" "f2xm1 # 2^(fract(x)) - 1\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __value += 1.0; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__value), "u" (__exponent)); return __value; } # 343 "/usr/include/bits/mathinline.h" 3 extern __inline void __sincos (double __x, double *__sinx, double *__cosx) { register long double __cosr; register long double __sinr; __asm __volatile__ ("fsincos\n\t" "fnstsw %%ax\n\t" "testl $0x400, %%eax\n\t" "jz 1f\n\t" "fldpi\n\t" "fadd %%st(0)\n\t" "fxch %%st(1)\n\t" "2: fprem1\n\t" "fnstsw %%ax\n\t" "testl $0x400, %%eax\n\t" "jnz 2b\n\t" "fstp %%st(1)\n\t" "fsincos\n\t" "1:" : "=t" (__cosr), "=u" (__sinr) : "0" (__x)); *__sinx = __sinr; *__cosx = __cosr; } extern __inline void __sincosf (float __x, float *__sinx, float *__cosx) { register long double __cosr; register long double __sinr; __asm __volatile__ ("fsincos\n\t" "fnstsw %%ax\n\t" "testl $0x400, %%eax\n\t" "jz 1f\n\t" "fldpi\n\t" "fadd %%st(0)\n\t" "fxch %%st(1)\n\t" "2: fprem1\n\t" "fnstsw %%ax\n\t" "testl $0x400, %%eax\n\t" "jnz 2b\n\t" "fstp %%st(1)\n\t" "fsincos\n\t" "1:" : "=t" (__cosr), "=u" (__sinr) : "0" (__x)); *__sinx = __sinr; *__cosx = __cosr; } extern __inline void __sincosl (long double __x, long double *__sinx, long double *__cosx) { register long double __cosr; register long double __sinr; __asm __volatile__ ("fsincos\n\t" "fnstsw %%ax\n\t" "testl $0x400, %%eax\n\t" "jz 1f\n\t" "fldpi\n\t" "fadd %%st(0)\n\t" "fxch %%st(1)\n\t" "2: fprem1\n\t" "fnstsw %%ax\n\t" "testl $0x400, %%eax\n\t" "jnz 2b\n\t" "fstp %%st(1)\n\t" "fsincos\n\t" "1:" : "=t" (__cosr), "=u" (__sinr) : "0" (__x)); *__sinx = __sinr; *__cosx = __cosr; } # 385 "/usr/include/bits/mathinline.h" 3 extern __inline long double __expm1l (long double __x) { register long double __value; register long double __exponent; register long double __temp; __asm __volatile__ ("fldl2e # e^x - 1 = 2^(x * log2(e)) - 1\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" "frndint # int(x * log2(e))\n\t" "fxch\n\t" "fsub %%st(1) # fract(x * log2(e))\n\t" "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" "fscale # 2^(x * log2(e)) - 2^(int(x * log2(e)))\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __asm __volatile__ ("fscale # 2^int(x * log2(e))\n\t" : "=t" (__temp) : "0" (1.0), "u" (__exponent)); __temp -= 1.0; return __temp + __value ?: __x; } # 405 "/usr/include/bits/mathinline.h" 3 extern __inline double exp (double __x) { register long double __value; register long double __exponent; __asm __volatile__ ("fldl2e # e^x = 2^(x * log2(e))\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" "frndint # int(x * log2(e))\n\t" "fxch\n\t" "fsub %%st(1) # fract(x * log2(e))\n\t" "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __value += 1.0; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__value), "u" (__exponent)); return __value; } extern __inline float expf (float __x) { register long double __value; register long double __exponent; __asm __volatile__ ("fldl2e # e^x = 2^(x * log2(e))\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" "frndint # int(x * log2(e))\n\t" "fxch\n\t" "fsub %%st(1) # fract(x * log2(e))\n\t" "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __value += 1.0; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__value), "u"! (__exponent)); return __value; } extern __inline long double expl (long double __x) { register long double __value; register long double __exponent; __asm __volatile__ ("fldl2e # e^x = 2^(x * log2(e))\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" "frndint # int(x * log2(e))\n\t" "fxch\n\t" "fsub %%st(1) # fract(x * log2(e))\n\t" "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __value += 1.0; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__value), "u" (__exponent)); return __value; } extern __inline long double __expl (long double __x) { register long double __value; register long double __exponent; __asm __volatile__ ("fldl2e # e^x = 2^(x * log2(e))\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" "frndint # int(x * log2(e))\n\t" "fxch\n\t" "fsub %%st(1) # fract(x * log2(e))\n\t" "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __value += 1.0; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__value), "u" (__exponent)); return __value; } extern __inline double tan (double __x) { register long double __value; register long double __value2 __attribute__ ((__unused__)); __asm __volatile__ ("fptan" : "=t" (__value2), "=u" (__value) : "0" (__x)); return __value; } extern __inline float tanf (float __x) { register long double __value; register long double __value2 __attribute__ ((__unused__)); __asm __volatile__ ("fptan" : "=t" (__value2), "=u" (__value) : "0" (__x)); return __value; } extern __inline long double tanl (long double __x) { register long double __value; register long double __value2 __attribute__ ((__unused__)); __asm __volatile__ ("fptan" : "=t" (__value2), "=u" (__value) : "0" (__x)); return __value; } # 425 "/usr/include/bits/mathinline.h" 3 extern __inline double atan2 (double __y, double __x) { register long double __value; __asm __volatile__ ("fpatan" : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)"); return __value; } extern __inline float atan2f (float __y, float __x) { register long double __value; __asm __volatile__ ("fpatan" : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)"); return __value; } extern __inline long double atan2l (long double __y, long double __x) { register long double __value; __asm __volatile__ ("fpatan" : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)"); return __value; } extern __inline long double __atan2l (long double __y, long double __x) { register long double __value; __asm __volatile__ ("fpatan" : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)"); return __value; } extern __inline double fmod (double __x, double __y) { register long double __value; __asm __volatile__ ("1: fprem\n\t" "fnstsw %%ax\n\t" "sahf\n\t" "jp 1b" : "=t" (__value) : "0" (__x), "u" (__y) : "ax", "cc"); return __value; } extern __inline float fmodf (float __x, float __y) { register long double __value; __asm __volatile__ ("1: fprem\n\t" "fnstsw %%ax\n\t" "sahf\n\t" "jp 1b" : "=t" (__value) : "0" (__x), "u" (__y) : "ax", "cc"); return __value; } extern __inline long double fmodl (long double __x, long double __y) { register long double __value; __asm __volatile__ ("1: fprem\n\t" "fnstsw %%ax\n\t" "sahf\n\t" "jp 1b" : "=t" (__value) : "0" (__x), "u" (__y) : "ax", "cc"); return __value; } # 440 "/usr/include/bits/mathinline.h" 3 extern __inline double sqrt (double __x) { register double __result; __asm __volatile__ ("fsqrt" : "=t" (__result) : "0" (__x)); return __result; } extern __inline float sqrtf (float __x) { register float __result; __asm __volatile__ ("fsqrt" : "=t" (__result) : "0" (__x)); return __result; } extern __inline long double sqrtl (long double __x) { register long double __result; __asm __volatile__ ("fsqrt" : "=t" (__result) : "0" (__x)); return __result; } extern __inline long double __sqrtl (long double __x) { register long double __result; __asm __volatile__ ("fsqrt" : "=t" (__result) : "0" (__x)); return __result; } extern __inline double fabs (double __x) { return __builtin_fabs (__x); } extern __inline float fabsf (float __x) { return __builtin_fabsf (__x); } extern __inline long double fabsl (long double __x) { return __builtin_fabsl (__x); } extern __inline long double __fabsl (long double __x) { return __builtin_fabsl (__x); } extern __inline double sin (double __x) { register double __result; __asm __volatile__ ("fsin" : "=t" (__result) : "0" (__x)); return __result; } extern __inline float sinf (float __x) { register float __result; __asm __volatile__ ("fsin" : "=t" (__result) : "0" (__x)); return __result; } extern __inline long double sinl (long double __x) { register long double __result; __asm __volatile__ ("fsin" : "=t" (__result) : "0" (__x)); return __result; } extern __inline double cos (double __x) { register double __result; __asm __volatile__ ("fcos" : "=t" (__result) : "0" (__x)); return __result; } extern __inline float cosf (float __x) { register float __result; __asm __volatile__ ("fcos" : "=t" (__result) : "0" (__x)); return __result; } extern __inline long double cosl (long double __x) { register long double __result; __asm __volatile__ ("fcos" : "=t" (__result) : "0" (__x)); return __result; } extern __inline double log (double __x) { register double __result; __asm __volatile__ ("fldln2; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline float logf (float __x) { register float __result; __asm __volatile__ ("fldln2; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline long double logl (long double __x) { register long double __result; __asm __volatile__ ("fldln2; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline double log10 (double __x) { register double __result; __asm __volatile__ ("fldlg2; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline float log10f (float __x) { register float __result; __asm __volatile__ ("fldlg2; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline long double log10l (long double __x) { register long double __result; __asm __volatile__ ("fldlg2; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline double asin (double __x) { return __atan2l (__x, __sqrtl (1.0 - __x * __x)); } extern __inline float asinf (float __x) { return __atan2l (__x, __sqrtl (1.0 - __x * __x)); } extern __inline long double asinl (long double __x) { return __atan2l (__x, __sqrtl (1.0 - __x * __x)); } extern __inline double acos (double __x) { return __atan2l (__sqrtl (1.0 - __x * __x), __x); } extern __inline float acosf (float __x) { return __atan2l (__sqrtl (1.0 - __x * __x), __x); } extern __inline long double acosl (long double __x) { return __atan2l (__sqrtl (1.0 - __x * __x), __x); } extern __inline double atan (double __x) { register double __result; __asm __volatile__ ("fld1; fpatan" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline float atanf (float __x) { register float __result; __asm __volatile__ ("fld1; fpatan" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline long double atanl (long double __x) { register long double __result; __asm __volatile__ ("fld1; fpatan" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline long double __sgn1l (long double) ; extern __inline long double __sgn1l (long double __x) { __extension__ union { long double __xld; unsigned int __xi[3]; } __n = { __xld: __x }; __n.__xi[2] = (__n.__xi[2] & 0x8000) | 0x3fff; __n.__xi[1] = 0x80000000; __n.__xi[0] = 0; return __n.__xld; } # 479 "/usr/include/bits/mathinline.h" 3 extern __inline double sinh (double __x) { register long double __exm1 = __expm1l (__fabsl (__x)); return 0.5 * (__exm1 / (__exm1 + 1.0) + __exm1) * __sgn1l (__x); } extern __inline float sinhf (float __x) { register long double __exm1 = __expm1l (__fabsl (__x)); return 0.5 * (__exm1 / (__exm1 + 1.0) + __exm1) * __sgn1l (__x); } extern __inline long double sinhl (long double __x) { register long double __exm1 = __expm1l (__fabsl (__x)); return 0.5 * (__exm1 / (__exm1 + 1.0) + __exm1) * __sgn1l (__x); } extern __inline double cosh (double __x) { register long double __ex = __expl (__x); return 0.5 * (__ex + 1.0 / __ex); } extern __inline float coshf (float __x) { register long double __ex = __expl (__x); return 0.5 * (__ex + 1.0 / __ex); } extern __inline long double coshl (long double __x) { register long double __ex = __expl (__x); return 0.5 * (__ex + 1.0 / __ex); } extern __inline double tanh (double __x) { register long double __exm1 = __expm1l (-__fabsl (__x + __x)); return __exm1 / (__exm1 + 2.0) * __sgn1l (-__x); } extern __inline float tanhf (float __x) { register long double __exm1 = __expm1l (-__fabsl (__x + __x)); return __exm1 / (__exm1 + 2.0) * __sgn1l (-__x); } extern __inline long double tanhl (long double __x) { register long double __exm1 = __expm1l (-__fabsl (__x + __x)); return __exm1 / (__exm1 + 2.0) * __sgn1l (-__x); } extern __inline double floor (double __x) { register long double __value; __volatile unsigned short int __cw; __volatile unsigned short int __cwtmp; __asm __volatile ("fnstcw %0" : "=m" (__cw)); __cwtmp = (__cw & 0xf3ff) | 0x0400; __asm __volatile ("fldcw %0" : : "m" (__cwtmp)); __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); __asm __volatile ("fldcw %0" : : "m" (__cw)); return __value; } extern __inline float floorf (float __x) { register long double __value; __volatile unsigned short int __cw; __volatile unsigned short int __cwtmp; __asm __volatile ("fnstcw %0" : "=m" (__cw)); __cwtmp = (__cw & 0xf3ff) | 0x0400; __asm __volatile ("fldcw %0" : : "m" (__cwtmp)); __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); __asm __volatile ("fldcw %0" : : "m" (__cw)); return __value; } extern __inline long double floorl (long double __x) { register long double __value; __volatile unsigned short int __cw; __volatile unsigned short int __cwtmp; __asm __volatile ("fnstc! w %0" : "=m" (__cw)); __cwtmp = (__cw & 0xf3ff) | 0x0400; __asm __volatile ("fldcw %0" : : "m" (__cwtmp)); __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); __asm __volatile ("fldcw %0" : : "m" (__cw)); return __value; } # 503 "/usr/include/bits/mathinline.h" 3 extern __inline double ceil (double __x) { register long double __value; __volatile unsigned short int __cw; __volatile unsigned short int __cwtmp; __asm __volatile ("fnstcw %0" : "=m" (__cw)); __cwtmp = (__cw & 0xf3ff) | 0x0800; __asm __volatile ("fldcw %0" : : "m" (__cwtmp)); __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); __asm __volatile ("fldcw %0" : : "m" (__cw)); return __value; } extern __inline float ceilf (float __x) { register long double __value; __volatile unsigned short int __cw; __volatile unsigned short int __cwtmp; __asm __volatile ("fnstcw %0" : "=m" (__cw)); __cwtmp = (__cw & 0xf3ff) | 0x0800; __asm __volatile ("fldcw %0" : : "m" (__cwtmp)); __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); __asm __volatile ("fldcw %0" : : "m" (__cw)); return __value; } extern __inline long double ceill (long double __x) { register long double __value; __volatile unsigned short int __cw; __volatile unsigned short int __cwtmp; __asm __volatile ("fnstcw %! 0" : "=m" (__cw)); __cwtmp = (__cw & 0xf3ff) | 0x0800; __asm __volatile ("fldcw %0" : : "m" (__cwtmp)); __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); __asm __volatile ("fldcw %0" : : "m" (__cw)); return __value; } # 521 "/usr/include/bits/mathinline.h" 3 extern __inline double ldexp (double __x, int __y) { register long double __value; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__x), "u" ((long double) __y)); return __value; } extern __inline double expm1 (double __x) { register long double __value; register long double __exponent; register long double __temp; __asm __volatile__ ("fldl2e # e^x - 1 = 2^(x * log2(e)) - 1\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" "frndint # int(x * log2(e))\n\t" "fxch\n\t" "fsub %%st(1) # fract(x * log2(e))\n\t" "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" "fscale # 2^(x * log2(e)) - 2^(int(x * log2(e)))\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __asm __volatile__ ("fscale # 2^int(x * log2(e))\n\t" : "=t" (__temp) : "0" (1.0), "u" (__exponent)); __temp -= 1.0; return __temp + __value ?: __x; } extern __inline float expm1f (float __x) { register long double __value; register long double __exponent; register long double __temp; __asm __volatile__ ("fldl2e # e^x - 1 = 2^(x * log2(e)) - 1\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" "frndint # int(x * log2(e))\n\t" "fxch\n\t" "fsub %%st(1) # fract(x * log2(e))\n\t" "f2x! m1 # 2^(fract(x * log2(e))) - 1\n\t" "fscale # 2^(x * log2(e)) - 2^(int(x * log2(e)))\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __asm __volatile__ ("fscale # 2^int(x * log2(e))\n\t" : "=t" (__temp) : "0" (1.0), "u" (__exponent)); __temp -= 1.0; return __temp + __value ?: __x; } extern __inline long double expm1l (long double __x) { register long double __value; register long double __exponent; register long double __temp; __asm __volatile__ ("fldl2e # e^x - 1 = 2^(x * log2(e)) - 1\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" "frndint # int(x * log2(e))\n\t" "fxch\n\t" "fsub %%st(1) # fract(x * log2(e))\n\t" "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" "fscale # 2^(x * log2(e)) - 2^(int(x * log2(e)))\n\t" : "=t" (__value), "=u" (__exponent) : "0" (__x)); __asm __volatile__ ("fscale # 2^int(x * log2(e))\n\t" : "=t" (__temp) : "0" (1.0), "u" (__exponent)); __temp -= 1.0; return __temp + __value ?: __x; } extern __inline double log1p (double __x) { register long double __value; if (__fabsl (__x) >= 1.0 - 0.5 * 1.41421356237309504880L) __value = logl (1.0 + __x); else __asm __volatile__ ("fldln2\n\t" "fxch\n\t" "fyl2xp1" : "=t" (__value) : "0" (__x) : "st(1)"); return __value; } extern __inline float log1pf (float __x) { register long double __value; if (__fabsl (__x) >= 1.0 - 0.5 * 1.41421356237309504880L) __value = logl (1.0 + __x); else __asm __volatile__ ("fldln2\n\t" "fxch\n\t" "fyl2xp1" : "=t" (__value) : "0" (__x) : "st(1)"); return __value; } extern __inline long double log1pl (long double __x) { register long double __value; if (__fabsl (__x) >= 1.0 - 0.5 * 1.41421356237309504880L) __value = logl (1.0 + __x); else __asm __volatile__ ("fldln2\n\t" "fxch\n\t" "fyl2xp1" : "=t" (__value) : "0" (__x) : "st(1)"); return __value; } # 553 "/usr/include/bits/mathinline.h" 3 extern __inline double asinh (double __x) { register long double __y = __fabsl (__x); return (log1pl (__y * __y / (__sqrtl (__y * __y + 1.0) + 1.0) + __y) * __sgn1l (__x)); } extern __inline float asinhf (float __x) { register long double __y = __fabsl (__x); return (log1pl (__y * __y / (__sqrtl (__y * __y + 1.0) + 1.0) + __y) * __sgn1l (__x)); } extern __inline long double asinhl (long double __x) { register long double __y = __fabsl (__x); return (log1pl (__y * __y / (__sqrtl (__y * __y + 1.0) + 1.0) + __y) * __sgn1l (__x)); } extern __inline double acosh (double __x) { return logl (__x + __sqrtl (__x - 1.0) * __sqrtl (__x + 1.0)); } extern __inline float acoshf (float __x) { return logl (__x + __sqrtl (__x - 1.0) * __sqrtl (__x + 1.0)); } extern __inline long double acoshl (long double __x) { return logl (__x + __sqrtl (__x - 1.0) * __sqrtl (__x + 1.0)); } extern __inline double atanh (double __x) { register long double __y = __fabsl (__x); return -0.5 * log1pl (-(__y + __y) / (1.0 + __y)) * __sgn1l (__x); } extern __inline float atanhf (float __x) { register long double __y = __fabsl (__x); return -0.5 * log1pl (-(__y + __y) / (1.0 + __y)) * __sgn1l (__x); } extern __inline long double atanhl (long double __x) { register long double __y = __fabsl (__x); return -0.5 * log1pl (-(__y + __y) / (1.0 + __y)) * __sgn1l (__x); } extern __inline double hypot (double __x, double __y) { return __sqrtl (__x * __x + __y * __y); } extern __inline float hypotf (float __x, float __y) { return __sqrtl (__x * __x + __y * __y); } extern __inline long double hypotl (long double __x, long double __y) { return __sqrtl (__x * __x + __y * __y); } extern __inline double logb (double __x) { register long double __value; register long double __junk; __asm __volatile__ ("fxtract\n\t" : "=t" (__junk), "=u" (__value) : "0" (__x)); return __value; } extern __inline float logbf (float __x) { register long double __value; register long double __junk; __asm __volatile__ ("fxtract\n\t" : "=t" (__junk), "=u" (__value) : "0" (__x)); return __value; } extern __inline long double logbl (long double __x) { register long double __value; register long double __junk; __asm __volatile__ ("fxtract\n\t" : "=t" (__junk), "=u" (__value) : "0" (__x)); return __value; } # 580 "/usr/include/bits/mathinline.h" 3 extern __inline double log2 (double __x) { register double __result; __asm __volatile__ ("fld1; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline float log2f (float __x) { register float __result; __asm __volatile__ ("fld1; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline long double log2l (long double __x) { register long double __result; __asm __volatile__ ("fld1; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)"); return __result; } extern __inline float ldexpf (float __x, int __y) { register long double __value; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__x), "u" ((long double) __y)); return __value; } extern __inline long double ldexpl (long double __x, int __y) { register long double __value; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__x), "u" ((long double) __y)); return __value; } extern __inline double fma (double __x, double __y, double __z) { return (__x * __y) + __z; } extern __inline float fmaf (float __x, float __y, float __z) { return (__x * __y) + __z; } extern __inline long double fmal (long double __x, long double __y, long double __z) { return (__x * __y) + __z; } extern __inline double rint (double __x) { register double __result; __asm __volatile__ ("frndint" : "=t" (__result) : "0" (__x)); return __result; } extern __inline float rintf (float __x) { register float __result; __asm __volatile__ ("frndint" : "=t" (__result) : "0" (__x)); return __result; } extern __inline long double rintl (long double __x) { register long double __result; __asm __volatile__ ("frndint" : "=t" (__result) : "0" (__x)); return __result; } # 607 "/usr/include/bits/mathinline.h" 3 extern __inline long int lrintf (float __x) { long int __lrintres; __asm__ __volatile__ ("fistpl %0" : "=m" (__lrintres) : "t" (__x) : "st"); return __lrintres; } extern __inline long int lrint (double __x) { long int __lrintres; __asm__ __volatile__ ("fistpl %0" : "=m" (__lrintres) : "t" (__x) : "st"); return __lrintres; } extern __inline long int lrintl (long double __x) { long int __lrintres; __asm__ __volatile__ ("fistpl %0" : "=m" (__lrintres) : "t" (__x) : "st"); return __lrintres; } # 630 "/usr/include/bits/mathinline.h" 3 extern __inline long long int llrintf (float __x) { long long int __llrintres; __asm__ __volatile__ ("fistpll %0" : "=m" (__llrintres) : "t" (__x) : "st"); return __llrintres; } extern __inline long long int llrint (double __x) { long long int __llrintres; __asm__ __volatile__ ("fistpll %0" : "=m" (__llrintres) : "t" (__x) : "st"); return __llrintres; } extern __inline long long int llrintl (long double __x) { long long int __llrintres; __asm__ __volatile__ ("fistpll %0" : "=m" (__llrintres) : "t" (__x) : "st"); return __llrintres; } extern __inline double drem (double __x, double __y) { register double __value; register int __clobbered; __asm __volatile__ ("1: fprem1\n\t" "fstsw %%ax\n\t" "sahf\n\t" "jp 1b" : "=t" (__value), "=&a" (__clobbered) : "0" (__x), "u" (__y) : "cc"); return __value; } extern __inline float dremf (float __x, float __y) { register double __value; register int __clobbered; __asm __volatile__ ("1: fprem1\n\t" "fstsw %%ax\n\t" "sahf\n\t" "jp 1b" : "=t" (__value), "=&a" (__clobbered) : "0" (__x), "u" (__y) : "cc"); return __value; } extern __inline long double dreml (long double __x, long double __y) { register double __value; register int __clobbered; __asm __volatile__ ("1: fprem1\n\t" "fstsw %%ax\n\t" "sahf\n\t" "jp 1b" : "=t" (__value), "=&a" (__clobbered) : "0" (__x), "u" (__y) : "cc"); return __value; } # 665 "/usr/include/bits/mathinline.h" 3 extern __inline int __finite (double __x) { return (__extension__ (((((union { double __d; int __i[2]; }) {__d: __x}).__i[1] | 0x800fffffu) + 1) >> 31)); } extern __inline double __coshm1 (double) ; extern __inline double __coshm1 (double __x) { register long double __exm1 = __expm1l (__fabsl (__x)); return 0.5 * (__exm1 / (__exm1 + 1.0)) * __exm1; } extern __inline float __coshm1f (float) ; extern __inline float __coshm1f (float __x) { register long double __exm1 = __expm1l (__fabsl (__x)); return 0.5 * (__exm1 / (__exm1 + 1.0)) * __exm1; } extern __inline long double __coshm1l (long double) ; extern __inline long double __coshm1l (long double __x) { register long double __exm1 = __expm1l (__fabsl (__x)); return 0.5 * (__exm1 / (__exm1 + 1.0)) * __exm1; } extern __inline double __acosh1p (double) ; extern __inline double __acosh1p (double __x) { return log1pl (__x + __sqrtl (__x) * __sqrtl (__x + 2.0)); } extern __inline float __acosh1pf (float) ; extern __inline float __acosh1pf (float __x) { return log1pl (__x + __sqrtl (__x) * __sqrtl (__x + 2.0)); } extern __inline long double __acosh1pl (long double) ; extern __inline long double __acosh1pl (long double __x) { return log1pl (__x + __sqrtl (__x) * __sqrtl (__x + 2.0)); } # 351 "/usr/include/math.h" 2 3 # 411 "/usr/include/math.h" 3 # 21 "ratecontrol.c" 2 # 1 "common.h" 1 # 20 "common.h" # 1 "../config.h" 1 # 21 "common.h" 2 # 1 "/usr/include/stdlib.h" 1 3 # 33 "/usr/include/stdlib.h" 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 201 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 3 typedef unsigned int size_t; # 294 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 3 typedef long int wchar_t; # 34 "/usr/include/stdlib.h" 2 3 # 1 "/usr/include/bits/waitflags.h" 1 3 # 43 "/usr/include/stdlib.h" 2 3 # 1 "/usr/include/bits/waitstatus.h" 1 3 # 63 "/usr/include/bits/waitstatus.h" 3 # 1 "/usr/include/endian.h" 1 3 # 37 "/usr/include/endian.h" 3 # 1 "/usr/include/bits/endian.h" 1 3 # 38 "/usr/include/endian.h" 2 3 # 64 "/usr/include/bits/waitstatus.h" 2 3 union wait { int w_status; struct { unsigned int __w_termsig:7; unsigned int __w_coredump:1; unsigned int __w_retcode:8; unsigned int:16; } __wait_terminated; struct { unsigned int __w_stopval:8; unsigned int __w_stopsig:8; unsigned int:16; } __wait_stopped; }; # 44 "/usr/include/stdlib.h" 2 3 # 68 "/usr/include/stdlib.h" 3 typedef union { union wait *__uptr; int *__iptr; } __WAIT_STATUS __attribute__ ((__transparent_union__)); # 94 "/usr/include/stdlib.h" 3 typedef struct { int quot; int rem; } div_t; typedef struct { long int quot; long int rem; } ldiv_t; __extension__ typedef struct { long long int quot; long long int rem; } lldiv_t; # 133 "/usr/include/stdlib.h" 3 extern size_t __ctype_get_mb_cur_max (void) ; extern double atof (__const char *__nptr) __attribute__ ((__pure__)); extern int atoi (__const char *__nptr) __attribute__ ((__pure__)); extern long int atol (__const char *__nptr) __attribute__ ((__pure__)); __extension__ extern long long int atoll (__const char *__nptr) __attribute__ ((__pure__)); extern double strtod (__const char *__restrict __nptr, char **__restrict __endptr) ; extern float strtof (__const char *__restrict __nptr, char **__restrict __endptr) ; extern long double strtold (__const char *__restrict __nptr, char **__restrict __endptr) ; extern long int strtol (__const char *__restrict __nptr, char **__restrict __endptr, int __base) ; extern unsigned long int strtoul (__const char *__restrict __nptr, char **__restrict __endptr, int __base) ; __extension__ extern long long int strtoq (__const char *__restrict __nptr, char **__restrict __endptr, int __base) ; __extension__ extern unsigned long long int strtouq (__const char *__restrict __nptr, char **__restrict __endptr, int __base) ; __extension__ extern long long int strtoll (__const char *__restrict __nptr, char **__restrict __endptr, int __base) ; __extension__ extern unsigned long long int strtoull (__const char *__restrict __nptr, char **__restrict __endptr, int __base) ; # 211 "/usr/include/stdlib.h" 3 # 1 "/usr/include/xlocale.h" 1 3 # 28 "/usr/include/xlocale.h" 3 typedef struct __locale_struct { struct locale_data *__locales[13]; const unsigned short int *__ctype_b; const int *__ctype_tolower; const int *__ctype_toupper; } *__locale_t; # 212 "/usr/include/stdlib.h" 2 3 extern long int __strtol_l (__const char *__restrict __nptr, char **__restrict __endptr, int __base, __locale_t __loc) ; extern unsigned long int __strtoul_l (__const char *__restrict __nptr, char **__restrict __endptr, int __base, __locale_t __loc) ; __extension__ extern long long int __strtoll_l (__const char *__restrict __nptr, char **__restrict __endptr, int __base, __locale_t __loc) ; __extension__ extern unsigned long long int __strtoull_l (__const char *__restrict __nptr, char **__restrict __endptr, int __base, __locale_t __loc) ; extern double __strtod_l (__const char *__restrict __nptr, char **__restrict __endptr, __locale_t __loc) ; extern float __strtof_l (__const char *__restrict __nptr, char **__restrict __endptr, __locale_t __loc) ; extern long double __strtold_l (__const char *__restrict __nptr, char **__restrict __endptr, __locale_t __loc) ; extern double __strtod_internal (__const char *__restrict __nptr, char **__restrict __endptr, int __group) ; extern float __strtof_internal (__const char *__restrict __nptr, char **__restrict __endptr, int __group) ; extern long double __strtold_internal (__const char *__restrict __nptr, char **__restrict __endptr, int __group) ; extern long int __strtol_internal (__const char *__restrict __nptr, char **__restrict __endptr, int __base, int __group) ; extern unsigned long int __strtoul_internal (__const char *__restrict __nptr, char **__restrict __endptr, int __base, int __group) ; __extension__ extern long long int __strtoll_internal (__const char *__restrict __nptr, char **__restrict __endptr, int __base, int __group) ; __extension__ extern unsigned long long int __strtoull_internal (__const char * __restrict __nptr, char **__restrict __endptr, int __base, int __group) ; extern __inline double strtod (__const char *__restrict __nptr, char **__restrict __endptr) { return __strtod_internal (__nptr, __endptr, 0); } extern __inline long int strtol (__const char *__restrict __nptr, char **__restrict __endptr, int __base) { return __strtol_internal (__nptr, __endptr, __base, 0); } extern __inline unsigned long int strtoul (__const char *__restrict __nptr, char **__restrict __endptr, int __base) { return __strtoul_internal (__nptr, __endptr, __base, 0); } extern __inline float strtof (__const char *__restrict __nptr, char **__restrict __endptr) { return __strtof_internal (__nptr, __endptr, 0); } extern __inline long double strtold (__const char *__restrict __nptr, char **__restrict __endptr) { return __strtold_internal (__nptr, __endptr, 0); } __extension__ extern __inline long long int strtoq (__const char *__restrict __nptr, char **__restrict __endptr, int __base) { return __strtoll_internal (__nptr, __endptr, __base, 0); } __extension__ extern __inline unsigned long long int strtouq (__const char *__restrict __nptr, char **__restrict __endptr, int __base) { return __strtoull_internal (__nptr, __endptr, __base, 0); } __extension__ extern __inline long long int strtoll (__const char *__restrict __nptr, char **__restrict __endptr, int __base) { return __strtoll_internal (__nptr, __endptr, __base, 0); } __extension__ extern __inline unsigned long long int strtoull (__const char * __restrict __nptr, char **__restrict __endptr, int __base) { return __strtoull_internal (__nptr, __endptr, __base, 0); } extern __inline double atof (__const char *__nptr) { return strtod (__nptr, (char **) ((void *)0)); } extern __inline int atoi (__const char *__nptr) { return (int) strtol (__nptr, (char **) ((void *)0), 10); } extern __inline long int atol (__const char *__nptr) { return strtol (__nptr, (char **) ((void *)0), 10); } __extension__ extern __inline long long int atoll (__const char *__nptr) { return strtoll (__nptr, (char **) ((void *)0), 10); } # 384 "/usr/include/stdlib.h" 3 extern char *l64a (long int __n) ; extern long int a64l (__const char *__s) __attribute__ ((__pure__)); # 1 "/usr/include/sys/types.h" 1 3 # 28 "/usr/include/sys/types.h" 3 # 1 "/usr/include/bits/types.h" 1 3 # 29 "/usr/include/bits/types.h" 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 30 "/usr/include/bits/types.h" 2 3 typedef unsigned char __u_char; typedef unsigned short __u_short; typedef unsigned int __u_int; typedef unsigned long __u_long; __extension__ typedef unsigned long long int __u_quad_t; __extension__ typedef long long int __quad_t; # 49 "/usr/include/bits/types.h" 3 typedef signed char __int8_t; typedef unsigned char __uint8_t; typedef signed short int __int16_t; typedef unsigned short int __uint16_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; __extension__ typedef signed long long int __int64_t; __extension__ typedef unsigned long long int __uint64_t; typedef __quad_t *__qaddr_t; typedef __u_quad_t __dev_t; typedef __u_int __uid_t; typedef __u_int __gid_t; typedef __u_long __ino_t; typedef __u_int __mode_t; typedef __u_int __nlink_t; typedef long int __off_t; typedef __quad_t __loff_t; typedef int __pid_t; typedef int __ssize_t; typedef __u_long __rlim_t; typedef __u_quad_t __rlim64_t; typedef __u_int __id_t; typedef struct { int __val[2]; } __fsid_t; typedef int __daddr_t; typedef char *__caddr_t; typedef long int __time_t; typedef unsigned int __useconds_t; typedef long int __suseconds_t; typedef long int __swblk_t; typedef long int __clock_t; typedef int __clockid_t; typedef int __timer_t; typedef int __key_t; typedef unsigned short int __ipc_pid_t; typedef long int __blksize_t; typedef long int __blkcnt_t; typedef __quad_t __blkcnt64_t; typedef __u_long __fsblkcnt_t; typedef __u_quad_t __fsblkcnt64_t; typedef __u_long __fsfilcnt_t; typedef __u_quad_t __fsfilcnt64_t; typedef __u_quad_t __ino64_t; typedef __loff_t __off64_t; typedef long int __t_scalar_t; typedef unsigned long int __t_uscalar_t; typedef int __intptr_t; typedef unsigned int __socklen_t; # 1 "/usr/include/bits/pthreadtypes.h" 1 3 # 23 "/usr/include/bits/pthreadtypes.h" 3 # 1 "/usr/include/bits/sched.h" 1 3 # 68 "/usr/include/bits/sched.h" 3 struct __sched_param { int __sched_priority; }; # 24 "/usr/include/bits/pthreadtypes.h" 2 3 struct _pthread_fastlock { long int __status; int __spinlock; }; typedef struct _pthread_descr_struct *_pthread_descr; typedef struct __pthread_attr_s { int __detachstate; int __schedpolicy; struct __sched_param __schedparam; int __inheritsched; int __scope; size_t __guardsize; int __stackaddr_set; void *__stackaddr; size_t __stacksize; } pthread_attr_t; typedef struct { struct _pthread_fastlock __c_lock; _pthread_descr __c_waiting; } pthread_cond_t; typedef struct { int __dummy; } pthread_condattr_t; typedef unsigned int pthread_key_t; typedef struct { int __m_reserved; int __m_count; _pthread_descr __m_owner; int __m_kind; struct _pthread_fastlock __m_lock; } pthread_mutex_t; typedef struct { int __mutexkind; } pthread_mutexattr_t; typedef int pthread_once_t; typedef struct _pthread_rwlock_t { struct _pthread_fastlock __rw_lock; int __rw_readers; _pthread_descr __rw_writer; _pthread_descr __rw_read_waiting; _pthread_descr __rw_write_waiting; int __rw_kind; int __rw_pshared; } pthread_rwlock_t; typedef struct { int __lockkind; int __pshared; } pthread_rwlockattr_t; typedef volatile int pthread_spinlock_t; typedef struct { struct _pthread_fastlock __ba_lock; int __ba_required; int __ba_present; _pthread_descr __ba_waiting; } pthread_barrier_t; typedef struct { int __pshared; } pthread_barrierattr_t; typedef unsigned long int pthread_t; # 144 "/usr/include/bits/types.h" 2 3 # 31 "/usr/include/sys/types.h" 2 3 typedef __u_char u_char; typedef __u_short u_short; typedef __u_int u_int; typedef __u_long u_long; typedef __quad_t quad_t; typedef __u_quad_t u_quad_t; typedef __fsid_t fsid_t; typedef __loff_t loff_t; typedef __ino64_t ino_t; typedef __ino64_t ino64_t; typedef __dev_t dev_t; typedef __gid_t gid_t; typedef __mode_t mode_t; typedef __nlink_t nlink_t; typedef __uid_t uid_t; typedef __off64_t off_t; typedef __off64_t off64_t; typedef __pid_t pid_t; typedef __id_t id_t; typedef __ssize_t ssize_t; typedef __daddr_t daddr_t; typedef __caddr_t caddr_t; typedef __key_t key_t; # 132 "/usr/include/sys/types.h" 3 # 1 "/usr/include/time.h" 1 3 # 59 "/usr/include/time.h" 3 typedef __clock_t clock_t; # 70 "/usr/include/time.h" 3 typedef __time_t time_t; # 82 "/usr/include/time.h" 3 typedef __clockid_t clockid_t; # 94 "/usr/include/time.h" 3 typedef __timer_t timer_t; # 133 "/usr/include/sys/types.h" 2 3 typedef __useconds_t useconds_t; typedef __suseconds_t suseconds_t; # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 147 "/usr/include/sys/types.h" 2 3 typedef unsigned long int ulong; typedef unsigned short int ushort; typedef unsigned int uint; # 190 "/usr/include/sys/types.h" 3 typedef int int8_t __attribute__ ((__mode__ (__QI__))); typedef int int16_t __attribute__ ((__mode__ (__HI__))); typedef int int32_t __attribute__ ((__mode__ (__SI__))); typedef int int64_t __attribute__ ((__mode__ (__DI__))); typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__))); typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__))); typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__))); typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__))); typedef int register_t __attribute__ ((__mode__ (__word__))); # 215 "/usr/include/sys/types.h" 3 # 1 "/usr/include/sys/select.h" 1 3 # 31 "/usr/include/sys/select.h" 3 # 1 "/usr/include/bits/select.h" 1 3 # 32 "/usr/include/sys/select.h" 2 3 # 1 "/usr/include/bits/sigset.h" 1 3 # 23 "/usr/include/bits/sigset.h" 3 typedef int __sig_atomic_t; typedef struct { unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))]; } __sigset_t; # 35 "/usr/include/sys/select.h" 2 3 typedef __sigset_t sigset_t; # 1 "/usr/include/time.h" 1 3 # 106 "/usr/include/time.h" 3 struct timespec { __time_t tv_sec; long int tv_nsec; }; # 45 "/usr/include/sys/select.h" 2 3 # 1 "/usr/include/bits/time.h" 1 3 # 67 "/usr/include/bits/time.h" 3 struct timeval { __time_t tv_sec; __suseconds_t tv_usec; }; # 47 "/usr/include/sys/select.h" 2 3 # 55 "/usr/include/sys/select.h" 3 typedef long int __fd_mask; typedef struct { __fd_mask fds_bits[1024 / (8 * sizeof (__fd_mask))]; } fd_set; typedef __fd_mask fd_mask; # 95 "/usr/include/sys/select.h" 3 extern int select (int __nfds, fd_set *__restrict __readfds, fd_set *__restrict __writefds, fd_set *__restrict __exceptfds, struct timeval *__restrict __timeout) ; extern int pselect (int __nfds, fd_set *__restrict __readfds, fd_set *__restrict __writefds, fd_set *__restrict __exceptfds, const struct timespec *__restrict __timeout, const __sigset_t *__restrict __sigmask) ; # 216 "/usr/include/sys/types.h" 2 3 # 1 "/usr/include/sys/sysmacros.h" 1 3 # 219 "/usr/include/sys/types.h" 2 3 typedef __blksize_t blksize_t; # 243 "/usr/include/sys/types.h" 3 typedef __blkcnt64_t blkcnt_t; typedef __fsblkcnt64_t fsblkcnt_t; typedef __fsfilcnt64_t fsfilcnt_t; typedef __blkcnt64_t blkcnt64_t; typedef __fsblkcnt64_t fsblkcnt64_t; typedef __fsfilcnt64_t fsfilcnt64_t; # 391 "/usr/include/stdlib.h" 2 3 extern long int random (void) ; extern void srandom (unsigned int __seed) ; extern char *initstate (unsigned int __seed, char *__statebuf, size_t __statelen) ; extern char *setstate (char *__statebuf) ; struct random_data { int32_t *fptr; int32_t *rptr; int32_t *state; int rand_type; int rand_deg; int rand_sep; int32_t *end_ptr; }; extern int random_r (struct random_data *__restrict __buf, int32_t *__restrict __result) ; extern int srandom_r (unsigned int __seed, struct random_data *__buf) ; extern int initstate_r (unsigned int __seed, char *__restrict __statebuf, size_t __statelen, struct random_data *__restrict __buf) ; extern int setstate_r (char *__restrict __statebuf, struct random_data *__restrict __buf) ; extern int rand (void) ; extern void srand (unsigned int __seed) ; extern int rand_r (unsigned int *__seed) ; extern double drand48 (void) ; extern double erand48 (unsigned short int __xsubi[3]) ; extern long int lrand48 (void) ; extern long int nrand48 (unsigned short int __xsubi[3]) ; extern long int mrand48 (void) ; extern long int jrand48 (unsigned short int __xsubi[3]) ; extern void srand48 (long int __seedval) ; extern unsigned short int *seed48 (unsigned short int __seed16v[3]) ; extern void lcong48 (unsigned short int __param[7]) ; struct drand48_data { unsigned short int __x[3]; unsigned short int __old_x[3]; unsigned short int __c; unsigned short int __init; unsigned long long int __a; }; extern int drand48_r (struct drand48_data *__restrict __buffer, double *__restrict __result) ; extern int erand48_r (unsigned short int __xsubi[3], struct drand48_data *__restrict __buffer, double *__restrict __result) ; extern int lrand48_r (struct drand48_data *__restrict __buffer, long int *__restrict __result) ; extern int nrand48_r (unsigned short int __xsubi[3], struct drand48_data *__restrict __buffer, long int *__restrict __result) ; extern int mrand48_r (struct drand48_data *__restrict __buffer, long int *__restrict __result) ; extern int jrand48_r (unsigned short int __xsubi[3], struct drand48_data *__restrict __buffer, long int *__restrict __result) ; extern int srand48_r (long int __seedval, struct drand48_data *__buffer) ; extern int seed48_r (unsigned short int __seed16v[3], struct drand48_data *__buffer) ; extern int lcong48_r (unsigned short int __param[7], struct drand48_data *__buffer) ; # 527 "/usr/include/stdlib.h" 3 extern void *malloc (size_t __size) __attribute__ ((__malloc__)); extern void *calloc (size_t __nmemb, size_t __size) __attribute__ ((__malloc__)); extern void *realloc (void *__ptr, size_t __size) __attribute__ ((__malloc__)); extern void free (void *__ptr) ; extern void cfree (void *__ptr) ; # 1 "/usr/include/alloca.h" 1 3 # 25 "/usr/include/alloca.h" 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 26 "/usr/include/alloca.h" 2 3 extern void *alloca (size_t __size) ; # 547 "/usr/include/stdlib.h" 2 3 extern void *valloc (size_t __size) __attribute__ ((__malloc__)); extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size) __attribute__ ((__malloc__)); extern void abort (void) __attribute__ ((__noreturn__)); extern int atexit (void (*__func) (void)) ; extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg) ; extern void exit (int __status) __attribute__ ((__noreturn__)); extern void _Exit (int __status) __attribute__ ((__noreturn__)); extern char *getenv (__const char *__name) ; extern char *__secure_getenv (__const char *__name) ; extern int putenv (char *__string) ; extern int setenv (__const char *__name, __const char *__value, int __replace) ; extern int unsetenv (__const char *__name) ; extern int clearenv (void) ; # 623 "/usr/include/stdlib.h" 3 extern char *mktemp (char *__template) ; # 634 "/usr/include/stdlib.h" 3 extern int mkstemp (char *__template) __asm__ ("" "mkstemp64"); extern int mkstemp64 (char *__template) ; # 650 "/usr/include/stdlib.h" 3 extern char *mkdtemp (char *__template) ; extern int system (__const char *__command) ; extern char *canonicalize_file_name (__const char *__name) ; # 672 "/usr/include/stdlib.h" 3 extern char *realpath (__const char *__restrict __name, char *__restrict __resolved) ; typedef int (*__compar_fn_t) (__const void *, __const void *); typedef __compar_fn_t comparison_fn_t; extern void *bsearch (__const void *__key, __const void *__base, size_t __nmemb, size_t __size, __compar_fn_t __compar); extern void qsort (void *__base, size_t __nmemb, size_t __size, __compar_fn_t __compar); extern int abs (int __x) __attribute__ ((__const__)); extern long int labs (long int __x) __attribute__ ((__const__)); __extension__ extern long long int llabs (long long int __x) __attribute__ ((__const__)); extern div_t div (int __numer, int __denom) __attribute__ ((__const__)); extern ldiv_t ldiv (long int __numer, long int __denom) __attribute__ ((__const__)); __extension__ extern lldiv_t lldiv (long long int __numer, long long int __denom) __attribute__ ((__const__)); # 728 "/usr/include/stdlib.h" 3 extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign) ; extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign) ; extern char *gcvt (double __value, int __ndigit, char *__buf) ; extern char *qecvt (long double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign) ; extern char *qfcvt (long double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign) ; extern char *qgcvt (long double __value, int __ndigit, char *__buf) ; extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign, char *__restrict __buf, size_t __len) ; extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign, char *__restrict __buf, size_t __len) ; extern int qecvt_r (long double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign, char *__restrict __buf, size_t __len) ; extern int qfcvt_r (long double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign, char *__restrict __buf, size_t __len) ; extern int mblen (__const char *__s, size_t __n) ; extern int mbtowc (wchar_t *__restrict __pwc, __const char *__restrict __s, size_t __n) ; extern int wctomb (char *__s, wchar_t __wchar) ; extern size_t mbstowcs (wchar_t *__restrict __pwcs, __const char *__restrict __s, size_t __n) ; extern size_t wcstombs (char *__restrict __s, __const wchar_t *__restrict __pwcs, size_t __n) ; extern int rpmatch (__const char *__response) ; # 808 "/usr/include/stdlib.h" 3 extern int getsubopt (char **__restrict __optionp, char *__const *__restrict __tokens, char **__restrict __valuep) ; extern void setkey (__const char *__key) ; extern int posix_openpt (int __oflag) ; extern int grantpt (int __fd) ; extern int unlockpt (int __fd) ; extern char *ptsname (int __fd) ; extern int ptsname_r (int __fd, char *__buf, size_t __buflen) ; extern int getpt (void) ; extern int getloadavg (double __loadavg[], int __nelem) ; # 23 "common.h" 2 # 1 "/usr/include/stdio.h" 1 3 # 30 "/usr/include/stdio.h" 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 35 "/usr/include/stdio.h" 2 3 # 45 "/usr/include/stdio.h" 3 typedef struct _IO_FILE FILE; # 55 "/usr/include/stdio.h" 3 typedef struct _IO_FILE __FILE; # 65 "/usr/include/stdio.h" 3 # 1 "/usr/include/libio.h" 1 3 # 32 "/usr/include/libio.h" 3 # 1 "/usr/include/_G_config.h" 1 3 # 14 "/usr/include/_G_config.h" 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 321 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 3 typedef unsigned int wint_t; # 15 "/usr/include/_G_config.h" 2 3 # 24 "/usr/include/_G_config.h" 3 # 1 "/usr/include/wchar.h" 1 3 # 48 "/usr/include/wchar.h" 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 49 "/usr/include/wchar.h" 2 3 # 1 "/usr/include/bits/wchar.h" 1 3 # 51 "/usr/include/wchar.h" 2 3 # 67 "/usr/include/wchar.h" 3 typedef struct { int __count; union { wint_t __wch; char __wchb[4]; } __value; } __mbstate_t; # 25 "/usr/include/_G_config.h" 2 3 typedef struct { __off_t __pos; __mbstate_t __state; } _G_fpos_t; typedef struct { __off64_t __pos; __mbstate_t __state; } _G_fpos64_t; # 44 "/usr/include/_G_config.h" 3 # 1 "/usr/include/gconv.h" 1 3 # 28 "/usr/include/gconv.h" 3 # 1 "/usr/include/wchar.h" 1 3 # 48 "/usr/include/wchar.h" 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 49 "/usr/include/wchar.h" 2 3 # 29 "/usr/include/gconv.h" 2 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 32 "/usr/include/gconv.h" 2 3 enum { __GCONV_OK = 0, __GCONV_NOCONV, __GCONV_NODB, __GCONV_NOMEM, __GCONV_EMPTY_INPUT, __GCONV_FULL_OUTPUT, __GCONV_ILLEGAL_INPUT, __GCONV_INCOMPLETE_INPUT, __GCONV_ILLEGAL_DESCRIPTOR, __GCONV_INTERNAL_ERROR }; enum { __GCONV_IS_LAST = 0x0001, __GCONV_IGNORE_ERRORS = 0x0002 }; struct __gconv_step; struct __gconv_step_data; struct __gconv_loaded_object; struct __gconv_trans_data; typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *, int, int); typedef int (*__gconv_init_fct) (struct __gconv_step *); typedef void (*__gconv_end_fct) (struct __gconv_step *); typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); typedef int (*__gconv_trans_context_fct) (void *, __const unsigned char *, __const unsigned char *, unsigned char *, unsigned char *); typedef int (*__gconv_trans_query_fct) (__const char *, __const char ***, size_t *); typedef int (*__gconv_trans_init_fct) (void **, const char *); typedef void (*__gconv_trans_end_fct) (void *); struct __gconv_trans_data { __gconv_trans_fct __trans_fct; __gconv_trans_context_fct __trans_context_fct; __gconv_trans_end_fct __trans_end_fct; void *__data; struct __gconv_trans_data *__next; }; struct __gconv_step { struct __gconv_loaded_object *__shlib_handle; __const char *__modname; int __counter; char *__from_name; char *__to_name; __gconv_fct __fct; __gconv_init_fct __init_fct; __gconv_end_fct __end_fct; int __min_needed_from; int __max_needed_from; int __min_needed_to; int __max_needed_to; int __stateful; void *__data; }; struct __gconv_step_data { unsigned char *__outbuf; unsigned char *__outbufend; int __flags; int __invocation_counter; int __internal_use; __mbstate_t *__statep; __mbstate_t __state; struct __gconv_trans_data *__trans; }; typedef struct __gconv_info { size_t __nsteps; struct __gconv_step *__steps; __extension__ struct __gconv_step_data __data []; } *__gconv_t; # 45 "/usr/include/_G_config.h" 2 3 typedef union { struct __gconv_info __cd; struct { struct __gconv_info __cd; struct __gconv_step_data __data; } __combined; } _G_iconv_t; typedef int _G_int16_t __attribute__ ((__mode__ (__HI__))); typedef int _G_int32_t __attribute__ ((__mode__ (__SI__))); typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__))); typedef unsigned int _G_uint32_t __attribute__ ((__mode__ (__SI__))); # 33 "/usr/include/libio.h" 2 3 # 53 "/usr/include/libio.h" 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stdarg.h" 1 3 # 43 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stdarg.h" 3 typedef __builtin_va_list __gnuc_va_list; # 54 "/usr/include/libio.h" 2 3 # 160 "/usr/include/libio.h" 3 struct _IO_jump_t; struct _IO_FILE; # 170 "/usr/include/libio.h" 3 typedef void _IO_lock_t; struct _IO_marker { struct _IO_marker *_next; struct _IO_FILE *_sbuf; int _pos; # 193 "/usr/include/libio.h" 3 }; enum __codecvt_result { __codecvt_ok, __codecvt_partial, __codecvt_error, __codecvt_noconv }; # 261 "/usr/include/libio.h" 3 struct _IO_FILE { int _flags; char* _IO_read_ptr; char* _IO_read_end; char* _IO_read_base; char* _IO_write_base; char* _IO_write_ptr; char* _IO_write_end; char* _IO_buf_base; char* _IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _blksize; __off_t _old_offset; unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; _IO_lock_t *_lock; # 305 "/usr/include/libio.h" 3 __off64_t _offset; void *__pad1; void *__pad2; int _mode; char _unused2[15 * sizeof (int) - 2 * sizeof (void *)]; }; typedef struct _IO_FILE _IO_FILE; struct _IO_FILE_plus; extern struct _IO_FILE_plus _IO_2_1_stdin_; extern struct _IO_FILE_plus _IO_2_1_stdout_; extern struct _IO_FILE_plus _IO_2_1_stderr_; # 344 "/usr/include/libio.h" 3 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf, size_t __n); typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); typedef int __io_close_fn (void *__cookie); typedef __io_read_fn cookie_read_function_t; typedef __io_write_fn cookie_write_function_t; typedef __io_seek_fn cookie_seek_function_t; typedef __io_close_fn cookie_close_function_t; typedef struct { __io_read_fn *read; __io_write_fn *write; __io_seek_fn *seek; __io_close_fn *close; } _IO_cookie_io_functions_t; typedef _IO_cookie_io_functions_t cookie_io_functions_t; struct _IO_cookie_file; extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write, void *__cookie, _IO_cookie_io_functions_t __fns); extern int __underflow (_IO_FILE *) ; extern int __uflow (_IO_FILE *) ; extern int __overflow (_IO_FILE *, int) ; extern wint_t __wunderflow (_IO_FILE *) ; extern wint_t __wuflow (_IO_FILE *) ; extern wint_t __woverflow (_IO_FILE *, wint_t) ; # 426 "/usr/include/libio.h" 3 extern int _IO_getc (_IO_FILE *__fp) ; extern int _IO_putc (int __c, _IO_FILE *__fp) ; extern int _IO_feof (_IO_FILE *__fp) ; extern int _IO_ferror (_IO_FILE *__fp) ; extern int _IO_peekc_locked (_IO_FILE *__fp) ; extern void _IO_flockfile (_IO_FILE *) ; extern void _IO_funlockfile (_IO_FILE *) ; extern int _IO_ftrylockfile (_IO_FILE *) ; # 456 "/usr/include/libio.h" 3 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, __gnuc_va_list, int *__restrict) ; extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, __gnuc_va_list) ; extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t) ; extern size_t _IO_sgetn (_IO_FILE *, void *, size_t) ; extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int) ; extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int) ; extern void _IO_free_backup_area (_IO_FILE *) ; # 66 "/usr/include/stdio.h" 2 3 typedef __gnuc_va_list va_list; # 82 "/usr/include/stdio.h" 3 typedef _G_fpos64_t fpos_t; typedef _G_fpos64_t fpos64_t; # 129 "/usr/include/stdio.h" 3 # 1 "/usr/include/bits/stdio_lim.h" 1 3 # 130 "/usr/include/stdio.h" 2 3 extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; extern int remove (__const char *__filename) ; extern int rename (__const char *__old, __const char *__new) ; extern FILE *tmpfile (void) __asm__ ("" "tmpfile64"); extern FILE *tmpfile64 (void) ; extern char *tmpnam (char *__s) ; extern char *tmpnam_r (char *__s) ; # 178 "/usr/include/stdio.h" 3 extern char *tempnam (__const char *__dir, __const char *__pfx) __attribute__ ((__malloc__)); extern int fclose (FILE *__stream) ; extern int fflush (FILE *__stream) ; extern int fflush_unlocked (FILE *__stream) ; extern int fcloseall (void) ; # 209 "/usr/include/stdio.h" 3 extern FILE *fopen (__const char *__restrict __filename, __const char *__restrict __modes) __asm__ ("" "fopen64"); extern FILE *freopen (__const char *__restrict __filename, __const char *__restrict __modes, FILE *__restrict __stream) __asm__ ("" "freopen64"); # 222 "/usr/include/stdio.h" 3 extern FILE *fopen64 (__const char *__restrict __filename, __const char *__restrict __modes) ; extern FILE *freopen64 (__const char *__restrict __filename, __const char *__restrict __modes, FILE *__restrict __stream) ; extern FILE *fdopen (int __fd, __const char *__modes) ; extern FILE *fopencookie (void *__restrict __magic_cookie, __const char *__restrict __modes, _IO_cookie_io_functions_t __io_funcs) ; extern FILE *fmemopen (void *__s, size_t __len, __const char *__modes) ; extern FILE *open_memstream (char **__restrict __bufloc, size_t *__restrict __sizeloc) ; extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) ; extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n) ; extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, size_t __size) ; extern void setlinebuf (FILE *__stream) ; extern int fprintf (FILE *__restrict __stream, __const char *__restrict __format, ...) ; extern int printf (__const char *__restrict __format, ...) ; extern int sprintf (char *__restrict __s, __const char *__restrict __format, ...) ; extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format, __gnuc_va_list __arg) ; extern int vprintf (__const char *__restrict __format, __gnuc_va_list __arg) ; extern int vsprintf (char *__restrict __s, __const char *__restrict __format, __gnuc_va_list __arg) ; extern int snprintf (char *__restrict __s, size_t __maxlen, __const char *__restrict __format, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern int vsnprintf (char *__restrict __s, size_t __maxlen, __const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 3, 0))); extern int vasprintf (char **__restrict __ptr, __const char *__restrict __f, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 2, 0))); extern int __asprintf (char **__restrict __ptr, __const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int asprintf (char **__restrict __ptr, __const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int vdprintf (int __fd, __const char *__restrict __fmt, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 2, 0))); extern int dprintf (int __fd, __const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int fscanf (FILE *__restrict __stream, __const char *__restrict __format, ...) ; extern int scanf (__const char *__restrict __format, ...) ; extern int sscanf (__const char *__restrict __s, __const char *__restrict __format, ...) ; extern int vfscanf (FILE *__restrict __s, __const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 2, 0))); extern int vscanf (__const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 1, 0))); extern int vsscanf (__const char *__restrict __s, __const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 2, 0))); extern int fgetc (FILE *__stream) ; extern int getc (FILE *__stream) ; extern int getchar (void) ; extern int getc_unlocked (FILE *__stream) ; extern int getchar_unlocked (void) ; extern int fgetc_unlocked (FILE *__stream) ; extern int fputc (int __c, FILE *__stream) ; extern int putc (int __c, FILE *__stream) ; extern int putchar (int __c) ; extern int fputc_unlocked (int __c, FILE *__stream) ; extern int putc_unlocked (int __c, FILE *__stream) ; extern int putchar_unlocked (int __c) ; extern int getw (FILE *__stream) ; extern int putw (int __w, FILE *__stream) ; extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) ; extern char *fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream) ; extern char *gets (char *__s) ; # 426 "/usr/include/stdio.h" 3 extern __ssize_t __getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getline (char **__restrict __lineptr, size_t *__restrict __n, FILE *__restrict __stream) ; extern int fputs (__const char *__restrict __s, FILE *__restrict __stream) ; extern int fputs_unlocked (__const char *__restrict __s, FILE *__restrict __stream) ; extern int puts (__const char *__s) ; extern int ungetc (int __c, FILE *__stream) ; extern size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite (__const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s) ; extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite_unlocked (__const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern int fseek (FILE *__stream, long int __off, int __whence) ; extern long int ftell (FILE *__stream) ; extern void rewind (FILE *__stream) ; # 502 "/usr/include/stdio.h" 3 extern int fseeko (FILE *__stream, __off64_t __off, int __whence) __asm__ ("" "fseeko64"); extern __off64_t ftello (FILE *__stream) __asm__ ("" "ftello64"); extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos) __asm__ ("" "fgetpos64"); extern int fsetpos (FILE *__stream, __const fpos_t *__pos) __asm__ ("" "fsetpos64"); # 523 "/usr/include/stdio.h" 3 extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence) ; extern __off64_t ftello64 (FILE *__stream) ; extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos) ; extern int fsetpos64 (FILE *__stream, __const fpos64_t *__pos) ; extern void clearerr (FILE *__stream) ; extern int feof (FILE *__stream) ; extern int ferror (FILE *__stream) ; extern void clearerr_unlocked (FILE *__stream) ; extern int feof_unlocked (FILE *__stream) ; extern int ferror_unlocked (FILE *__stream) ; extern void perror (__const char *__s) ; # 1 "/usr/include/bits/sys_errlist.h" 1 3 # 27 "/usr/include/bits/sys_errlist.h" 3 extern int sys_nerr; extern __const char *__const sys_errlist[]; extern int _sys_nerr; extern __const char *__const _sys_errlist[]; # 553 "/usr/include/stdio.h" 2 3 extern int fileno (FILE *__stream) ; extern int fileno_unlocked (FILE *__stream) ; extern FILE *popen (__const char *__command, __const char *__modes) ; extern int pclose (FILE *__stream) ; extern char *ctermid (char *__s) ; extern char *cuserid (char *__s) ; struct obstack; extern int obstack_printf (struct obstack *__restrict __obstack, __const char *__restrict __format, ...) ; extern int obstack_vprintf (struct obstack *__restrict __obstack, __const char *__restrict __format, __gnuc_va_list __args) ; extern void flockfile (FILE *__stream) ; extern int ftrylockfile (FILE *__stream) ; extern void funlockfile (FILE *__stream) ; # 625 "/usr/include/stdio.h" 3 # 1 "/usr/include/bits/stdio.h" 1 3 # 33 "/usr/include/bits/stdio.h" 3 extern __inline int vprintf (__const char *__restrict __fmt, __gnuc_va_list __arg) { return vfprintf (stdout, __fmt, __arg); } extern __inline int getchar (void) { return _IO_getc (stdin); } extern __inline int getc_unlocked (FILE *__fp) { return ((__fp)->_IO_read_ptr >= (__fp)->_IO_read_end ? __uflow (__fp) : *(unsigned char *) (__fp)->_IO_read_ptr++); } extern __inline int getchar_unlocked (void) { return ((stdin)->_IO_read_ptr >= (stdin)->_IO_read_end ? __uflow (stdin) : *(unsigned char *) (stdin)->_IO_read_ptr++); } extern __inline int putchar (int __c) { return _IO_putc (__c, stdout); } extern __inline int fputc_unlocked (int __c, FILE *__stream) { return (((__stream)->_IO_write_ptr >= (__stream)->_IO_write_end) ? __overflow (__stream, (unsigned char) (__c)) : (unsigned char) (*(__stream)->_IO_write_ptr++ = (__c))); } extern __inline int putc_unlocked (int __c, FILE *__stream) { return (((__stream)->_IO_write_ptr >= (__stream)->_IO_write_end) ? __overflow (__stream, (unsigned char) (__c)) : (unsigned char) (*(__stream)->_IO_write_ptr++ = (__c))); } extern __inline int putchar_unlocked (int __c) { return (((stdout)->_IO_write_ptr >= (stdout)->_IO_write_end) ? __overflow (stdout, (unsigned char) (__c)) : (unsigned char) (*(stdout)->_IO_write_ptr++ = (__c))); } extern __inline __ssize_t getline (char **__lineptr, size_t *__n, FILE *__stream) { return __getdelim (__lineptr, __n, '\n', __stream); } extern __inline int feof_unlocked (FILE *__stream) { return (((__stream)->_flags & 0x10) != 0); } extern __inline int ferror_unlocked (FILE *__stream) { return (((__stream)->_flags & 0x20) != 0); } # 626 "/usr/include/stdio.h" 2 3 # 24 "common.h" 2 # 1 "/usr/include/string.h" 1 3 # 28 "/usr/include/string.h" 3 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 34 "/usr/include/string.h" 2 3 extern void *memcpy (void *__restrict __dest, __const void *__restrict __src, size_t __n) ; extern void *memmove (void *__dest, __const void *__src, size_t __n) ; extern void *memccpy (void *__restrict __dest, __const void *__restrict __src, int __c, size_t __n) ; extern void *memset (void *__s, int __c, size_t __n) ; extern int memcmp (__const void *__s1, __const void *__s2, size_t __n) __attribute__ ((__pure__)); extern void *memchr (__const void *__s, int __c, size_t __n) __attribute__ ((__pure__)); extern void *rawmemchr (__const void *__s, int __c) __attribute__ ((__pure__)); extern void *memrchr (__const void *__s, int __c, size_t __n) __attribute__ ((__pure__)); extern char *strcpy (char *__restrict __dest, __const char *__restrict __src) ; extern char *strncpy (char *__restrict __dest, __const char *__restrict __src, size_t __n) ; extern char *strcat (char *__restrict __dest, __const char *__restrict __src) ; extern char *strncat (char *__restrict __dest, __const char *__restrict __src, size_t __n) ; extern int strcmp (__const char *__s1, __const char *__s2) __attribute__ ((__pure__)); extern int strncmp (__const char *__s1, __const char *__s2, size_t __n) __attribute__ ((__pure__)); extern int strcoll (__const char *__s1, __const char *__s2) __attribute__ ((__pure__)); extern size_t strxfrm (char *__restrict __dest, __const char *__restrict __src, size_t __n) ; # 111 "/usr/include/string.h" 3 extern int __strcoll_l (__const char *__s1, __const char *__s2, __locale_t __l) __attribute__ ((__pure__)); extern size_t __strxfrm_l (char *__dest, __const char *__src, size_t __n, __locale_t __l) ; extern char *strdup (__const char *__s) __attribute__ ((__malloc__)); extern char *strndup (__const char *__string, size_t __n) __attribute__ ((__malloc__)); # 155 "/usr/include/string.h" 3 extern char *strchr (__const char *__s, int __c) __attribute__ ((__pure__)); extern char *strrchr (__const char *__s, int __c) __attribute__ ((__pure__)); extern char *strchrnul (__const char *__s, int __c) __attribute__ ((__pure__)); extern size_t strcspn (__const char *__s, __const char *__reject) __attribute__ ((__pure__)); extern size_t strspn (__const char *__s, __const char *__accept) __attribute__ ((__pure__)); extern char *strpbrk (__const char *__s, __const char *__accept) __attribute__ ((__pure__)); extern char *strstr (__const char *__haystack, __const char *__needle) __attribute__ ((__pure__)); extern char *strcasestr (__const char *__haystack, __const char *__needle) __attribute__ ((__pure__)); extern char *strtok (char *__restrict __s, __const char *__restrict __delim) ; extern char *__strtok_r (char *__restrict __s, __const char *__restrict __delim, char **__restrict __save_ptr) ; extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim, char **__restrict __save_ptr) ; extern void *memmem (__const void *__haystack, size_t __haystacklen, __const void *__needle, size_t __needlelen) __attribute__ ((__pure__)); extern void *__mempcpy (void *__restrict __dest, __const void *__restrict __src, size_t __n) ; extern void *mempcpy (void *__restrict __dest, __const void *__restrict __src, size_t __n) ; extern size_t strlen (__const char *__s) __attribute__ ((__pure__)); extern size_t strnlen (__const char *__string, size_t __maxlen) __attribute__ ((__pure__)); extern char *strerror (int __errnum) ; extern char *strerror_r (int __errnum, char *__buf, size_t __buflen) ; extern void __bzero (void *__s, size_t __n) ; extern void bcopy (__const void *__src, void *__dest, size_t __n) ; extern void bzero (void *__s, size_t __n) ; extern int bcmp (__const void *__s1, __const void *__s2, size_t __n) __attribute__ ((__pure__)); extern char *index (__const char *__s, int __c) __attribute__ ((__pure__)); extern char *rindex (__const char *__s, int __c) __attribute__ ((__pure__)); extern int ffs (int __i) __attribute__ ((__const__)); extern int ffsl (long int __l) __attribute__ ((__const__)); __extension__ extern int ffsll (long long int __ll) __attribute__ ((__const__)); extern int strcasecmp (__const char *__s1, __const char *__s2) __attribute__ ((__pure__)); extern int strncasecmp (__const char *__s1, __const char *__s2, size_t __n) __attribute__ ((__pure__)); extern int __strcasecmp_l (__const char *__s1, __const char *__s2, __locale_t __loc) __attribute__ ((__pure__)); extern int __strncasecmp_l (__const char *__s1, __const char *__s2, size_t __n, __locale_t __loc) __attribute__ ((__pure__)); extern char *strsep (char **__restrict __stringp, __const char *__restrict __delim) ; extern int strverscmp (__const char *__s1, __const char *__s2) __attribute__ ((__pure__)); extern char *strsignal (int __sig) ; extern char *__stpcpy (char *__restrict __dest, __const char *__restrict __src) ; extern char *stpcpy (char *__restrict __dest, __const char *__restrict __src) ; extern char *__stpncpy (char *__restrict __dest, __const char *__restrict __src, size_t __n) ; extern char *stpncpy (char *__restrict __dest, __const char *__restrict __src, size_t __n) ; extern char *strfry (char *__string) ; extern void *memfrob (void *__s, size_t __n) ; extern char *basename (__const char *__filename) ; # 357 "/usr/include/string.h" 3 # 1 "/usr/include/bits/string.h" 1 3 # 358 "/usr/include/string.h" 2 3 # 1 "/usr/include/bits/string2.h" 1 3 # 387 "/usr/include/bits/string2.h" 3 extern void *__rawmemchr (const void *__s, int __c); # 917 "/usr/include/bits/string2.h" 3 extern __inline size_t __strcspn_c1 (__const char *__s, int __reject); extern __inline size_t __strcspn_c1 (__const char *__s, int __reject) { register size_t __result = 0; while (__s[__result] != '\0' && __s[__result] != __reject) ++__result; return __result; } extern __inline size_t __strcspn_c2 (__const char *__s, int __reject1, int __reject2); extern __inline size_t __strcspn_c2 (__const char *__s, int __reject1, int __reject2) { register size_t __result = 0; while (__s[__result] != '\0' && __s[__result] != __reject1 && __s[__result] != __reject2) ++__result; return __result; } extern __inline size_t __strcspn_c3 (__const char *__s, int __reject1, int __reject2, int __reject3); extern __inline size_t __strcspn_c3 (__const char *__s, int __reject1, int __reject2, int __reject3) { register size_t __result = 0; while (__s[__result] != '\0' && __s[__result] != __reject1 && __s[__result] != __reject2 && __s[__result] != __reject3) ++__result; return __result; } # 974 "/usr/include/bits/string2.h" 3 extern __inline size_t __strspn_c1 (__const char *__s, int __accept); extern __inline size_t __strspn_c1 (__const char *__s, int __accept) { register size_t __result = 0; while (__s[__result] == __accept) ++__result; return __result; } extern __inline size_t __strspn_c2 (__const char *__s, int __accept1, int __accept2); extern __inline size_t __strspn_c2 (__const char *__s, int __accept1, int __accept2) { register size_t __result = 0; while (__s[__result] == __accept1 || __s[__result] == __accept2) ++__result; return __result; } extern __inline size_t __strspn_c3 (__const char *__s, int __accept1, int __accept2, int __accept3); extern __inline size_t __strspn_c3 (__const char *__s, int __accept1, int __accept2, int __accept3) { register size_t __result = 0; while (__s[__result] == __accept1 || __s[__result] == __accept2 || __s[__result] == __accept3) ++__result; return __result; } # 1031 "/usr/include/bits/string2.h" 3 extern __inline char *__strpbrk_c2 (__const char *__s, int __accept1, int __accept2); extern __inline char * __strpbrk_c2 (__const char *__s, int __accept1, int __accept2) { while (*__s != '\0' && *__s != __accept1 && *__s != __accept2) ++__s; return *__s == '\0' ? ((void *)0) : (char *) (size_t) __s; } extern __inline char *__strpbrk_c3 (__const char *__s, int __accept1, int __accept2, int __accept3); extern __inline char * __strpbrk_c3 (__const char *__s, int __accept1, int __accept2, int __accept3) { while (*__s != '\0' && *__s != __accept1 && *__s != __accept2 && *__s != __accept3) ++__s; return *__s == '\0' ? ((void *)0) : (char *) (size_t) __s; } # 1083 "/usr/include/bits/string2.h" 3 extern __inline char *__strtok_r_1c (char *__s, char __sep, char **__nextp); extern __inline char * __strtok_r_1c (char *__s, char __sep, char **__nextp) { char *__result; if (__s == ((void *)0)) __s = *__nextp; while (*__s == __sep) ++__s; __result = ((void *)0); if (*__s != '\0') { __result = __s++; while (*__s != '\0') if (*__s++ == __sep) { __s[-1] = '\0'; break; } *__nextp = __s; } return __result; } # 1115 "/usr/include/bits/string2.h" 3 extern char *__strsep_g (char **__stringp, __const char *__delim); # 1133 "/usr/include/bits/string2.h" 3 extern __inline char *__strsep_1c (char **__s, char __reject); extern __inline char * __strsep_1c (char **__s, char __reject) { register char *__retval = *__s; if (__retval != ((void *)0) && (*__s = (__extension__ (__builtin_constant_p (__reject) && (__reject) == '\0' ? (char *) __rawmemchr (__retval, __reject) : strchr (__retval, __reject)))) != ((void *)0)) *(*__s)++ = '\0'; return __retval; } extern __inline char *__strsep_2c (char **__s, char __reject1, char __reject2); extern __inline char * __strsep_2c (char **__s, char __reject1, char __reject2) { register char *__retval = *__s; if (__retval != ((void *)0)) { register char *__cp = __retval; while (1) { if (*__cp == '\0') { __cp = ((void *)0); break; } if (*__cp == __reject1 || *__cp == __reject2) { *__cp++ = '\0'; break; } ++__cp; } *__s = __cp; } return __retval; } extern __inline char *__strsep_3c (char **__s, char __reject1, char __reject2, char __reject3); extern __inline char * __strsep_3c (char **__s, char __reject1, char __reject2, char __reject3) { register char *__retval = *__s; if (__retval != ((void *)0)) { register char *__cp = __retval; while (1) { if (*__cp == '\0') { __cp = ((void *)0); break; } if (*__cp == __reject1 || *__cp == __reject2 || *__cp == __reject3) { *__cp++ = '\0'; break; } ++__cp; } *__s = __cp; } return __retval; } # 1214 "/usr/include/bits/string2.h" 3 extern char *__strdup (__const char *__string) __attribute__ ((__malloc__)); # 1233 "/usr/include/bits/string2.h" 3 extern char *__strndup (__const char *__string, size_t __n) __attribute__ ((__malloc__)); # 361 "/usr/include/string.h" 2 3 # 25 "common.h" 2 # 1 "/usr/include/errno.h" 1 3 # 32 "/usr/include/errno.h" 3 # 1 "/usr/include/bits/errno.h" 1 3 # 25 "/usr/include/bits/errno.h" 3 # 1 "/usr/include/linux/errno.h" 1 3 # 1 "/usr/include/asm/errno.h" 1 3 # 5 "/usr/include/linux/errno.h" 2 3 # 26 "/usr/include/bits/errno.h" 2 3 # 36 "/usr/include/bits/errno.h" 3 extern int errno; extern int *__errno_location (void) __attribute__ ((__const__)); # 37 "/usr/include/errno.h" 2 3 # 55 "/usr/include/errno.h" 3 extern char *program_invocation_name, *program_invocation_short_name; # 69 "/usr/include/errno.h" 3 typedef int error_t; # 27 "common.h" 2 # 95 "common.h" # 1 "/usr/include/inttypes.h" 1 3 # 28 "/usr/include/inttypes.h" 3 # 1 "/usr/include/stdint.h" 1 3 # 28 "/usr/include/stdint.h" 3 # 1 "/usr/include/bits/wordsize.h" 1 3 # 29 "/usr/include/stdint.h" 2 3 # 49 "/usr/include/stdint.h" 3 typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; __extension__ typedef unsigned long long int uint64_t; typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; __extension__ typedef long long int int_least64_t; typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; __extension__ typedef unsigned long long int uint_least64_t; typedef signed char int_fast8_t; typedef int int_fast16_t; typedef int int_fast32_t; __extension__ typedef long long int int_fast64_t; typedef unsigned char uint_fast8_t; typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t; __extension__ typedef unsigned long long int uint_fast64_t; # 126 "/usr/include/stdint.h" 3 typedef int intptr_t; typedef unsigned int uintptr_t; # 138 "/usr/include/stdint.h" 3 __extension__ typedef long long int intmax_t; __extension__ typedef unsigned long long int uintmax_t; # 29 "/usr/include/inttypes.h" 2 3 typedef long int __gwchar_t; # 274 "/usr/include/inttypes.h" 3 # 288 "/usr/include/inttypes.h" 3 typedef struct { long long int quot; long long int rem; } imaxdiv_t; extern intmax_t imaxabs (intmax_t __n) __attribute__ ((__const__)); extern imaxdiv_t imaxdiv (intmax_t __numer, intmax_t __denom) __attribute__ ((__const__)); extern intmax_t strtoimax (__const char *__restrict __nptr, char **__restrict __endptr, int __base) ; extern uintmax_t strtoumax (__const char *__restrict __nptr, char ** __restrict __endptr, int __base) ; extern intmax_t wcstoimax (__const __gwchar_t *__restrict __nptr, __gwchar_t **__restrict __endptr, int __base) ; extern uintmax_t wcstoumax (__const __gwchar_t *__restrict __nptr, __gwchar_t ** __restrict __endptr, int __base) ; # 396 "/usr/include/inttypes.h" 3 extern __inline intmax_t strtoimax (__const char *__restrict nptr, char **__restrict endptr, int base) { return __strtoll_internal (nptr, endptr, base, 0); } # 414 "/usr/include/inttypes.h" 3 extern __inline uintmax_t strtoumax (__const char *__restrict nptr, char **__restrict endptr, int base) { return __strtoull_internal (nptr, endptr, base, 0); } __extension__ extern long long int __wcstoll_internal (__const __gwchar_t * __restrict __nptr, __gwchar_t **__restrict __endptr, int __base, int __group) ; extern __inline intmax_t wcstoimax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr, int base) { return __wcstoll_internal (nptr, endptr, base, 0); } __extension__ extern unsigned long long int __wcstoull_internal (__const __gwchar_t * __restrict __nptr, __gwchar_t ** __restrict __endptr, int __base, int __group) ; extern __inline uintmax_t wcstoumax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr, int base) { return __wcstoull_internal (nptr, endptr, base, 0); } # 96 "common.h" 2 typedef unsigned short UINT16; typedef signed short INT16; typedef unsigned char UINT8; typedef unsigned int UINT32; typedef unsigned long long UINT64; typedef signed char INT8; typedef signed int INT32; typedef signed long long INT64; # 118 "common.h" # 1 "fastmemcpy.h" 1 # 1 "../libvo/fastmemcpy.h" 1 # 1 "../config.h" 1 # 5 "../libvo/fastmemcpy.h" 2 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3 # 147 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 3 typedef int ptrdiff_t; # 10 "../libvo/fastmemcpy.h" 2 extern void * fast_memcpy(void * to, const void * from, size_t len); extern void * mem2agpcpy(void * to, const void * from, size_t len); # 23 "../libvo/fastmemcpy.h" static inline void * mem2agpcpy_pic(void * dst, void * src, int bytesPerLine, int height, int dstStride, int srcStride) { int i; void *retval=dst; if(dstStride == srcStride) mem2agpcpy(dst, src, srcStride*height); else { for(i=0; i>32)))); return __x.__ll; } # 128 "common.h" 2 # 141 "common.h" # 1 "/usr/include/assert.h" 1 3 # 142 "common.h" 2 # 170 "common.h" static inline int32_t NEG_SSR32( int32_t a, int8_t s){ asm ("sarl %1, %0\n\t" : "+r" (a) : "ic" ((uint8_t)(-s)) ); return a; } static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ asm ("shrl %1, %0\n\t" : "+r" (a) : "ic" ((uint8_t)(-s)) ); return a; } struct PutBitContext; typedef void (*WriteDataFunc)(void *, UINT8 *, int); typedef struct PutBitContext { UINT32 bit_buf; int bit_left; UINT8 *buf, *buf_ptr, *buf_end; INT64 data_out_size; } PutBitContext; void init_put_bits(PutBitContext *s, UINT8 *buffer, int buffer_size, void *opaque, void (*write_data)(void *, UINT8 *, int)); INT64 get_bit_count(PutBitContext *s); void align_put_bits(PutBitContext *s); void flush_put_bits(PutBitContext *s); void put_string(PutBitContext * pbc, char *s); void jflush_put_bits(PutBitContext *s); typedef struct GetBitContext { UINT8 *buffer, *buffer_end; int index; # 236 "common.h" int size; } GetBitContext; static inline int get_bits_count(GetBitContext *s); typedef struct VLC { int bits; INT16 (*table)[2]; int table_size, table_allocated; } VLC; typedef struct RL_VLC_ELEM { int16_t level; int8_t len; uint8_t run; } RL_VLC_ELEM; # 279 "common.h" static inline void put_bits(PutBitContext *s, int n, unsigned int value) { unsigned int bit_buf; int bit_left; ((void) (0)); bit_buf = s->bit_buf; bit_left = s->bit_left; if (n < bit_left) { bit_buf = (bit_buf<> (n - bit_left); *(UINT32 *)s->buf_ptr = ByteSwap32(bit_buf); s->buf_ptr+=4; bit_left+=32 - n; bit_buf = value; } s->bit_buf = bit_buf; s->bit_left = bit_left; } # 382 "common.h" static inline void jput_bits(PutBitContext *s, int n, unsigned int value) { unsigned int bit_buf, b; int bit_left, i; ((void) (0)); bit_buf = s->bit_buf; bit_left = s->bit_left; if (n < bit_left) { bit_buf = (bit_buf<> (n - bit_left); for(i=0;i<4;i++) { b = (bit_buf >> 24); *(s->buf_ptr++) = b; if (b == 0xff) *(s->buf_ptr++) = 0; bit_buf <<= 8; } bit_left+= 32 - n; bit_buf = value; } s->bit_buf = bit_buf; s->bit_left = bit_left; } # 469 "common.h" static inline uint8_t* pbBufPtr(PutBitContext *s) { return s->buf_ptr; } # 561 "common.h" static inline int get_bits_count(GetBitContext *s){ return s->index; } # 681 "common.h" static inline unsigned int get_bits(GetBitContext *s, int n){ register int tmp; int re_index= (s)->index; int re_cache= 0; re_cache= ByteSwap32((*(UINT32*)(((uint8_t *)(s)->buffer)+(re_index>>3)))) << (re_index&0x07); tmp= NEG_USR32(re_cache, n); re_index += (n); (s)->index= re_index; return tmp; } static inline unsigned int show_bits(GetBitContext *s, int n){ register int tmp; int re_index= (s)->index; int re_cache= 0; re_cache= ByteSwap32((*(UINT32*)(((uint8_t *)(s)->buffer)+(re_index>>3)))) << (re_index&0x07); tmp= NEG_USR32(re_cache, n); return tmp; } static inline void skip_bits(GetBitContext *s, int n){ int re_index= (s)->index; int re_cache= 0; re_cache= ByteSwap32((*(UINT32*)(((uint8_t *)(s)->buffer)+(re_index>>3)))) << (re_index&0x07); re_index += (n); (s)->index= re_index; } static inline unsigned int get_bits1(GetBitContext *s){ int index= s->index; uint8_t result= s->buffer[ index>>3 ]; result<<= (index&0x07); result>>= 8 - 1; index++; s->index= index; return result; } static inline unsigned int show_bits1(GetBitContext *s){ return show_bits(s, 1); } static inline void skip_bits1(GetBitContext *s){ skip_bits(s, 1); } void init_get_bits(GetBitContext *s, UINT8 *buffer, int buffer_size); int check_marker(GetBitContext *s, char *msg); void align_get_bits(GetBitContext *s); int init_vlc(VLC *vlc, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size); void free_vlc(VLC *vlc); # 795 "common.h" static inline int get_vlc(GetBitContext *s, VLC *vlc) { int code; INT16 (*table)[2]= vlc->table; int re_index= (s)->index; int re_cache= 0; re_cache= ByteSwap32((*(UINT32*)(((uint8_t *)(s)->buffer)+(re_index>>3)))) << (re_index&0x07); { int n, index, nb_bits; index= NEG_USR32(re_cache, vlc->bits); code = table[index][0]; n = table[index][1]; if(3 > 1 && n < 0){ re_index += (vlc->bits); re_cache= ByteSwap32((*(UINT32*)(((uint8_t *)(s)->buffer)+(re_index>>3)))) << (re_index&0x07); nb_bits = -n; index= NEG_USR32(re_cache, nb_bits) + code; code = table[index][0]; n = table[index][1]; if(3 > 2 && n < 0){ re_index += (nb_bits); re_cache= ByteSwap32((*(UINT32*)(((uint8_t *)(s)->buffer)+(re_index>>3)))) << (re_index&0x07); nb_bits = -n; index= NEG_USR32(re_cache, nb_bits) + code; code = table[index][0]; n = table[index][1]; } } { re_cache <<= (n); re_index += (n); }} (s)->index= re_index; return code; } static __attribute__((always_inline)) inline int get_vlc2(GetBitContext *s, INT16 (*table)[2], int bits, int max_depth) { int code; int re_index= (s)->index; int re_cache= 0; re_cache= ByteSwap32((*(UINT32*)(((uint8_t *)(s)->buffer)+(re_index>>3)))) << (re_index&0x07); { int n, index, nb_bits; index= NEG_USR32(re_cache, bits); code = table[index][0]; n = table[index][1]; if(max_depth > 1 && n < 0){ re_index += (bits); re_cache= ByteSwap32((*(UINT32*)(((uint8_t *)(s)->buffer)+(re_index>>3)))) << (re_index&0x07); nb_bits = -n; index= NEG_USR32(re_cache, nb_bits) + code; code = table[index][0]; n = table[index][1]; if(max_depth > 2 && n < 0){ re_index += (nb_bits); re_cache= ByteSwap32((*(UINT32*)(((uint8_t *)(s)->buffer)+(re_index>>3)))) << (re_index&0x07); nb_bits = -n; index= NEG_USR32(re_cache, nb_bits) + code; code = table[index][0]; n = table[index][1]; } } { re_cache <<= (n); re_index += (n); }} (s)->index= re_index; return code; } # 850 "common.h" static inline int av_log2(unsigned int v) { int n; n = 0; if (v & 0xffff0000) { v >>= 16; n += 16; } if (v & 0xff00) { v >>= 8; n += 8; } if (v & 0xf0) { v >>= 4; n += 4; } if (v & 0xc) { v >>= 2; n += 2; } if (v & 0x2) { n++; } return n; } static inline int mid_pred(int a, int b, int c) { int vmin, vmax; vmax = vmin = a; if (b < vmin) vmin = b; else vmax = b; if (c < vmin) vmin = c; else if (c > vmax) vmax = c; return a + b + c - vmin - vmax; } static inline int clip(int a, int amin, int amax) { if (a < amin) return amin; else if (a > amax) return amax; else return a; } extern const UINT8 ff_sqrt_tab[128]; int ff_gcd(int a, int b); static inline int ff_sqrt(int a) { int ret=0; int s; int ret_sq=0; if(a<128) return ff_sqrt_tab[a]; for(s=15; s>=0; s--){ int b= ret_sq + (1<<(s*2)) + (ret<block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2; s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2; s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2; s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2; s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x; s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x; } static inline void ff_update_block_index(MpegEncContext *s){ s->block_index[0]+=2; s->block_index[1]+=2; s->block_index[2]+=2; s->block_index[3]+=2; s->block_index[4]++; s->block_index[5]++; } void ff_estimate_p_frame_motion(MpegEncContext * s, int mb_x, int mb_y); void ff_estimate_b_frame_motion(MpegEncContext * s, int mb_x, int mb_y); int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type); void ff_fix_long_p_mvs(MpegEncContext * s); void ff_fix_long_b_mvs(MpegEncContext * s, int16_t (*mv_table)[2], int f_code, int type); extern const INT16 ff_mpeg1_default_intra_matrix[64]; extern const INT16 ff_mpeg1_default_non_intra_matrix[64]; extern UINT8 ff_mpeg1_dc_scale_table[128]; void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number); void mpeg1_encode_mb(MpegEncContext *s, DCTELEM block[6][64], int motion_x, int motion_y); void ff_mpeg1_encode_init(MpegEncContext *s); typedef struct RLTable { int n; int last; const UINT16 (*table_vlc)[2]; const INT8 *table_run; const INT8 *table_level; UINT8 *index_run[2]; INT8 *max_level[2]; INT8 *max_run[2]; VLC vlc; RL_VLC_ELEM *rl_vlc[32]; } RLTable; void init_rl(RLTable *rl); void init_vlc_rl(RLTable *rl); static inline int get_rl_index(const RLTable *rl, int last, int run, int level) { int index; index = rl->index_run[last][run]; if (index >= rl->n) return rl->n; if (level > rl->max_level[last][run]) return rl->n; return index + level - 1; } extern UINT8 ff_mpeg4_y_dc_scale_table[32]; extern UINT8 ff_mpeg4_c_dc_scale_table[32]; extern const INT16 ff_mpeg4_default_intra_matrix[64]; extern const INT16 ff_mpeg4_default_non_intra_matrix[64]; void h263_encode_mb(MpegEncContext *s, DCTELEM block[6][64], int motion_x, int motion_y); void mpeg4_encode_mb(MpegEncContext *s, DCTELEM block[6][64], int motion_x, int motion_y); void h263_encode_picture_header(MpegEncContext *s, int picture_number); int h263_encode_gob_header(MpegEncContext * s, int mb_line); INT16 *h263_pred_motion(MpegEncContext * s, int block, int *px, int *py); void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n, int dir); void ff_set_mpeg4_time(MpegEncContext * s, int picture_number); void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number); void h263_encode_init(MpegEncContext *s); void h263_decode_init_vlc(MpegEncContext *s); int h263_decode_picture_header(MpegEncContext *s); int ff_h263_decode_gob_header(MpegEncContext *s); int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb); int intel_h263_decode_picture_header(MpegEncContext *s); int ff_h263_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); int h263_get_picture_format(int width, int height); void ff_mpeg4_encode_video_packet_header(MpegEncContext *s); void ff_mpeg4_clean_buffers(MpegEncContext *s); void ff_mpeg4_stuffing(PutBitContext * pbc); void ff_mpeg4_init_partitions(MpegEncContext *s); void ff_mpeg4_merge_partitions(MpegEncContext *s); void ff_clean_mpeg4_qscales(MpegEncContext *s); void ff_clean_h263_qscales(MpegEncContext *s); int ff_mpeg4_decode_partitions(MpegEncContext *s); int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s); int ff_h263_resync(MpegEncContext *s); int ff_h263_get_gob_height(MpegEncContext *s); void rv10_encode_picture_header(MpegEncContext *s, int picture_number); int rv_decode_dc(MpegEncContext *s, int n); void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number); void msmpeg4_encode_ext_header(MpegEncContext * s); void msmpeg4_encode_mb(MpegEncContext * s, DCTELEM block[6][64], int motion_x, int motion_y); int msmpeg4_decode_picture_header(MpegEncContext * s); int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size); int ff_msmpeg4_decode_init(MpegEncContext *s); void ff_msmpeg4_encode_init(MpegEncContext *s); int mjpeg_init(MpegEncContext *s); void mjpeg_close(MpegEncContext *s); void mjpeg_encode_mb(MpegEncContext *s, DCTELEM block[6][64]); void mjpeg_picture_header(MpegEncContext *s); void mjpeg_picture_trailer(MpegEncContext *s); int ff_rate_control_init(MpegEncContext *s); float ff_rate_estimate_qscale(MpegEncContext *s); void ff_write_pass1_stats(MpegEncContext *s); void ff_rate_control_uninit(MpegEncContext *s); double ff_eval(char *s, double *const_value, char **const_name, double (**func1)(void *, double), char **func1_name, double (**func2)(void *, double, double), char **func2_name, void *opaque); # 25 "ratecontrol.c" 2 # 1 "/usr/include/assert.h" 1 3 # 65 "/usr/include/assert.h" 3 extern void __assert_fail (__const char *__assertion, __const char *__file, unsigned int __line, __const char *__function) __attribute__ ((__noreturn__)); extern void __assert_perror_fail (int __errnum, __const char *__file, unsigned int __line, __const char *__function) __attribute__ ((__noreturn__)); extern void __assert (const char *__assertion, const char *__file, int __line) __attribute__ ((__noreturn__)); # 28 "ratecontrol.c" 2 # 37 "ratecontrol.c" static int init_pass2(MpegEncContext *s); static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num); void ff_write_pass1_stats(MpegEncContext *s){ sprintf(s->avctx->stats_out, "in:%d out:%d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n", s->picture_number, s->input_picture_number - s->max_b_frames, s->pict_type, s->frame_qscale, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, s->f_code, s->b_code, s->mc_mb_var_sum, s->mb_var_sum, s->i_count); } int ff_rate_control_init(MpegEncContext *s) { RateControlContext *rcc= &s->rc_context; int i; { if (mm_flags & 0x0001) emms();}; for(i=0; i<5; i++){ rcc->pred[i].coeff= 7.0; rcc->pred[i].count= 1.0; rcc->pred[i].decay= 0.4; rcc->i_cplx_sum [i]= rcc->p_cplx_sum [i]= rcc->mv_bits_sum[i]= rcc->qscale_sum [i]= rcc->frame_count[i]= 1; rcc->last_qscale_for[i]=5; } rcc->buffer_index= s->avctx->rc_buffer_size/2; if(s->flags&0x0400){ int i; char *p; p= s->avctx->stats_in; for(i=-1; p; i++){ p= (__extension__ (__builtin_constant_p (';') && (';') == '\0' ? (char *) __rawmemchr (p+1, ';') : strchr (p+1, ';'))); } i+= s->max_b_frames; rcc->entry = (RateControlEntry*)av_mallocz(i*sizeof(RateControlEntry)); rcc->num_entries= i; for(i=0; inum_entries; i++){ RateControlEntry *rce= &rcc->entry[i]; rce->pict_type= rce->new_pict_type=2; rce->qscale= rce->new_qscale=2; rce->misc_bits= s->mb_num + 10; rce->mb_var_sum= s->mb_num*100; } p= s->avctx->stats_in; for(i=0; inum_entries - s->max_b_frames; i++){ RateControlEntry *rce; int picture_number; int e; char *next; next= (__extension__ (__builtin_constant_p (';') && (';') == '\0' ? (char *) __rawmemchr (p, ';') : strchr (p, ';'))); if(next){ (*next)=0; next++; } e= sscanf(p, " in:%d ", &picture_number); ((void) ((picture_number >= 0) ? 0 : (__assert_fail ("picture_number >= 0", "ratecontrol.c", 104, __PRETTY_FUNCTION__), 0))); ((void) ((picture_number < rcc->num_entries) ? 0 : (__assert_fail ("picture_number < rcc->num_entries", "ratecontrol.c", 105, __PRETTY_FUNCTION__), 0))); rce= &rcc->entry[picture_number]; e+=sscanf(p, " in:%*d out:%*d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d", &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits, &rce->f_code, &rce->b_code, &rce->mc_mb_var_sum, &rce->mb_var_sum, &rce->i_count); if(e!=12){ fprintf(stderr, "statistics are damaged at line %d, parser out=%d\n", i, e); return -1; } p= next; } if(init_pass2(s) < 0) return -1; } if(!(s->flags&0x0400)){ rcc->short_term_qsum=0.001; rcc->short_term_qcount=0.001; rcc->pass1_rc_eq_output_sum= 0.001; rcc->pass1_wanted_bits=0.001; if(s->avctx->rc_initial_cplx){ for(i=0; i<60*30; i++){ double bits= s->avctx->rc_initial_cplx * (i/10000.0 + 1.0)*s->mb_num; RateControlEntry rce; double q; if (i%((s->gop_size+3)/4)==0) rce.pict_type= 1; else if(i%(s->max_b_frames+1)) rce.pict_type= 3; else rce.pict_type= 2; rce.new_pict_type= rce.pict_type; rce.mc_mb_var_sum= bits*s->mb_num/100000; rce.mb_var_sum = s->mb_num; rce.qscale = 2; rce.f_code = 2; rce.b_code = 1; rce.misc_bits= 1; if(s->pict_type== 1){ rce.i_count = s->mb_num; rce.i_tex_bits= bits; rce.p_tex_bits= 0; rce.mv_bits= 0; }else{ rce.i_count = 0; rce.i_tex_bits= 0; rce.p_tex_bits= bits*0.9; rce.mv_bits= bits*0.1; } rcc->i_cplx_sum [rce.pict_type] += rce.i_tex_bits*rce.qscale; rcc->p_cplx_sum [rce.pict_type] += rce.p_tex_bits*rce.qscale; rcc->mv_bits_sum[rce.pict_type] += rce.mv_bits; rcc->frame_count[rce.pict_type] ++; bits= rce.i_tex_bits + rce.p_tex_bits; q= get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum, i); rcc->pass1_wanted_bits+= s->bit_rate/(s->frame_rate / (double)10000); } } } return 0; } void ff_rate_control_uninit(MpegEncContext *s) { RateControlContext *rcc= &s->rc_context; { if (mm_flags & 0x0001) emms();}; __av_freep((void **)(&rcc->entry)); } static inline double qp2bits(RateControlEntry *rce, double qp){ if(qp<=0.0){ fprintf(stderr, "qp<=0.0\n"); } return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ qp; } static inline double bits2qp(RateControlEntry *rce, double bits){ if(bits<0.9){ fprintf(stderr, "bits<0.9\n"); } return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits; } static void update_rc_buffer(MpegEncContext *s, int frame_size){ RateControlContext *rcc= &s->rc_context; const double fps= (double)s->frame_rate / 10000; const double buffer_size= s->avctx->rc_buffer_size; const double min_rate= s->avctx->rc_min_rate/fps; const double max_rate= s->avctx->rc_max_rate/fps; if(buffer_size){ rcc->buffer_index-= frame_size; if(rcc->buffer_index < buffer_size/2 || min_rate==0){ rcc->buffer_index+= max_rate; if(rcc->buffer_index >= buffer_size) rcc->buffer_index= buffer_size-1; }else{ rcc->buffer_index+= min_rate; } if(rcc->buffer_index < 0) fprintf(stderr, "rc buffer underflow\n"); if(rcc->buffer_index >= s->avctx->rc_buffer_size) fprintf(stderr, "rc buffer overflow\n"); } } static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num){ RateControlContext *rcc= &s->rc_context; double q, bits; const int pict_type= rce->new_pict_type; const double mb_num= s->mb_num; int i; double const_values[]={ 3.14159265358979323846, 2.7182818284590452354, rce->i_tex_bits*rce->qscale, rce->p_tex_bits*rce->qscale, (rce->i_tex_bits + rce->p_tex_bits)*(double)rce->qscale, rce->mv_bits/mb_num, rce->pict_type == 3 ? (rce->f_code + rce->b_code)*0.5 : rce->f_code, rce->i_count/mb_num, rce->mc_mb_var_sum/mb_num, rce->mb_var_sum/mb_num, rce->pict_type == 1, rce->pict_type == 2, rce->pict_type == 3, rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type], s->qcompress, rcc->i_cplx_sum[1] / (double)rcc->frame_count[1], rcc->i_cplx_sum[2] / (double)rcc->frame_count[2], rcc->p_cplx_sum[2] / (double)rcc->frame_count[2], rcc->p_cplx_sum[3] / (double)rcc->frame_count[3], (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / (double)rcc->frame_count[pict_type], 0 }; char *const_names[]={ "PI", "E", "iTex", "pTex", "tex", "mv", "fCode", "iCount", "mcVar", "var", "isI", "isP", "isB", "avgQP", "qComp", "avgIITex", "avgPITex", "avgPPTex", "avgBPTex", "avgTex", ((void *)0) }; static double (*func1[])(void *, double)={ (void *)bits2qp, (void *)qp2bits, ((void *)0) }; char *func1_names[]={ "bits2qp", "qp2bits", ((void *)0) }; bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, ((void *)0), ((void *)0), rce); rcc->pass1_rc_eq_output_sum+= bits; bits*=rate_factor; if(bits<0.0) bits=0.0; bits+= 1.0; for(i=0; iavctx->rc_override_count; i++){ RcOverride *rco= s->avctx->rc_override; if(rco[i].start_frame > frame_num) continue; if(rco[i].end_frame < frame_num) continue; if(rco[i].qscale) bits= qp2bits(rce, rco[i].qscale); else bits*= rco[i].quality_factor; } q= bits2qp(rce, bits); if (pict_type==1 && s->avctx->i_quant_factor<0.0) q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset; else if(pict_type==3 && s->avctx->b_quant_factor<0.0) q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset; return q; } static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, double q){ RateControlContext *rcc= &s->rc_context; AVCodecContext *a= s->avctx; const int pict_type= rce->new_pict_type; const double last_p_q = rcc->last_qscale_for[2]; const double last_non_b_q= rcc->last_qscale_for[rcc->last_non_b_pict_type]; if (pict_type==1 && (a->i_quant_factor>0.0 || rcc->last_non_b_pict_type==2)) q= last_p_q *((a->i_quant_factor) >= 0 ? (a->i_quant_factor) : (-(a->i_quant_factor))) + a->i_quant_offset; else if(pict_type==3 && a->b_quant_factor>0.0) q= last_non_b_q* a->b_quant_factor + a->b_quant_offset; if(rcc->last_non_b_pict_type==pict_type || pict_type!=1){ double last_q= rcc->last_qscale_for[pict_type]; if (q > last_q + a->max_qdiff) q= last_q + a->max_qdiff; else if(q < last_q - a->max_qdiff) q= last_q - a->max_qdiff; } rcc->last_qscale_for[pict_type]= q; if(pict_type!=3) rcc->last_non_b_pict_type= pict_type; return q; } static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){ int qmin= s->qmin; int qmax= s->qmax; if(pict_type==3){ qmin= (int)(qmin*((s->avctx->b_quant_factor) >= 0 ? (s->avctx->b_quant_factor) : (-(s->avctx->b_quant_factor)))+s->avctx->b_quant_offset + 0.5); qmax= (int)(qmax*((s->avctx->b_quant_factor) >= 0 ? (s->avctx->b_quant_factor) : (-(s->avctx->b_quant_factor)))+s->avctx->b_quant_offset + 0.5); }else if(pict_type==1){ qmin= (int)(qmin*((s->avctx->i_quant_factor) >= 0 ? (s->avctx->i_quant_factor) : (-(s->avctx->i_quant_factor)))+s->avctx->i_quant_offset + 0.5); qmax= (int)(qmax*((s->avctx->i_quant_factor) >= 0 ? (s->avctx->i_quant_factor) : (-(s->avctx->i_quant_factor)))+s->avctx->i_quant_offset + 0.5); } if(qmin<1) qmin=1; if(qmin==1 && s->qmin>1) qmin=2; if(qmin<3 && s->max_qcoeff<=128 && pict_type==1) qmin=3; if(qmax>31) qmax=31; if(qmax<=qmin) qmax= qmin= (qmax+qmin+1)>>1; *qmin_ret= qmin; *qmax_ret= qmax; } static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num){ RateControlContext *rcc= &s->rc_context; int qmin, qmax; double bits; const int pict_type= rce->new_pict_type; const double buffer_size= s->avctx->rc_buffer_size; const double min_rate= s->avctx->rc_min_rate; const double max_rate= s->avctx->rc_max_rate; get_qminmax(&qmin, &qmax, s, pict_type); if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==2) q*= s->avctx->rc_qmod_amp; bits= qp2bits(rce, q); if(buffer_size){ double expected_size= rcc->buffer_index; if(min_rate){ double d= 2*(buffer_size - expected_size)/buffer_size; if(d>1.0) d=1.0; else if(d<0.0001) d=0.0001; q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); q= ((q) > (bits2qp(rce, (((min_rate - buffer_size + rcc->buffer_index)*2) > (1) ? ((min_rate - buffer_size + rcc->buffer_index)*2) : (1)))) ? (bits2qp(rce, (((min_rate - buffer_size + rcc->buffer_index)*2) > (1) ? ((min_rate - buffer_size + rcc->buffer_index)*2) : (1)))) : (q)); } if(max_rate){ double d= 2*expected_size/buffer_size; if(d>1.0) d=1.0; else if(d<0.0001) d=0.0001; q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); q= ((q) > (bits2qp(rce, ((rcc->buffer_index/2) > (1) ? (rcc->buffer_index/2) : (1)))) ? (q) : (bits2qp(rce, ((rcc->buffer_index/2) > (1) ? (rcc->buffer_index/2) : (1))))); } } if(s->avctx->rc_qsquish==0.0 || qmin==qmax){ if (qqmax) q=qmax; }else{ double min2= log(qmin); double max2= log(qmax); q= log(q); q= (q - min2)/(max2-min2) - 0.5; q*= -4.0; q= 1.0/(1.0 + exp(q)); q= q*(max2-min2) + min2; q= exp(q); } return q; } static double predict_size(Predictor *p, double q, double var) { return p->coeff*var / (q*p->count); } static double predict_qp(Predictor *p, double size, double var) { return p->coeff*var / (size*p->count); } static void update_predictor(Predictor *p, double q, double var, double size) { double new_coeff= size*q / (var + 1); if(var<10) return; p->count*= p->decay; p->coeff*= p->decay; p->count++; p->coeff+= new_coeff; } static void adaptive_quantization(MpegEncContext *s, double q){ int i; const float lumi_masking= s->avctx->lumi_masking / (128.0*128.0); const float dark_masking= s->avctx->dark_masking / (128.0*128.0); const float temp_cplx_masking= s->avctx->temporal_cplx_masking; const float spatial_cplx_masking = s->avctx->spatial_cplx_masking; const float p_masking = s->avctx->p_masking; float bits_sum= 0.0; float cplx_sum= 0.0; float cplx_tab[s->mb_num]; float bits_tab[s->mb_num]; const int qmin= 2; const int qmax= 31; for(i=0; imb_num; i++){ float temp_cplx= sqrt(s->mc_mb_var[i]); float spat_cplx= sqrt(s->mb_var[i]); const int lumi= s->mb_mean[i]; float bits, cplx, factor; if(spat_cplx < q/3) spat_cplx= q/3; if(temp_cplx < q/3) temp_cplx= q/3; if((s->mb_type[i]&0x01)){ cplx= spat_cplx; factor= 1.0 + p_masking; }else{ cplx= temp_cplx; factor= pow(temp_cplx, - temp_cplx_masking); } factor*=pow(spat_cplx, - spatial_cplx_masking); if(lumi>127) factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking); else factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking); if(factor<0.00001) factor= 0.00001; bits= cplx*factor; cplx_sum+= cplx; bits_sum+= bits; cplx_tab[i]= cplx; bits_tab[i]= bits; } if(s->flags&0x00020000){ for(i=0; imb_num; i++){ float newq= q*cplx_tab[i]/bits_tab[i]; newq*= bits_sum/cplx_sum; if (newq > qmax){ bits_sum -= bits_tab[i]; cplx_sum -= cplx_tab[i]*q/qmax; } else if(newq < qmin){ bits_sum -= bits_tab[i]; cplx_sum -= cplx_tab[i]*q/qmin; } } } for(i=0; imb_num; i++){ float newq= q*cplx_tab[i]/bits_tab[i]; int intq; if(s->flags&0x00020000){ newq*= bits_sum/cplx_sum; } if(i && ((s->qscale_table[i-1] - newq) >= 0 ? (s->qscale_table[i-1] - newq) : (-(s->qscale_table[i-1] - newq)))<0.75) intq= s->qscale_table[i-1]; else intq= (int)(newq + 0.5); if (intq > qmax) intq= qmax; else if(intq < qmin) intq= qmin; s->qscale_table[i]= intq; } } float ff_rate_estimate_qscale(MpegEncContext *s) { float q; int qmin, qmax; float br_compensation; double diff; double short_term_q; double fps; int picture_number= s->picture_number; int64_t wanted_bits; RateControlContext *rcc= &s->rc_context; RateControlEntry local_rce, *rce; double bits; double rate_factor; int var; const int pict_type= s->pict_type; { if (mm_flags & 0x0001) emms();}; get_qminmax(&qmin, &qmax, s, pict_type); fps= (double)s->frame_rate / 10000; if(picture_number>2){ const int last_var= s->last_pict_type == 1 ? rcc->last_mb_var_sum : rcc->last_mc_mb_var_sum; update_predictor(&rcc->pred[s->last_pict_type], rcc->last_qscale, sqrt(last_var), s->frame_bits); } if(s->flags&0x0400){ ((void) ((picture_number>=0) ? 0 : (__assert_fail ("picture_number>=0", "ratecontrol.c", 578, __PRETTY_FUNCTION__), 0))); ((void) ((picture_numbernum_entries) ? 0 : (__assert_fail ("picture_numbernum_entries", "ratecontrol.c", 579, __PRETTY_FUNCTION__), 0))); rce= &rcc->entry[picture_number]; wanted_bits= rce->expected_bits; }else{ rce= &local_rce; wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps); } diff= s->total_bits - wanted_bits; br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance; if(br_compensation<=0.0) br_compensation=0.001; var= pict_type == 1 ? s->mb_var_sum : s->mc_mb_var_sum; if(s->flags&0x0400){ if(pict_type!=1) ((void) ((pict_type == rce->new_pict_type) ? 0 : (__assert_fail ("pict_type == rce->new_pict_type", "ratecontrol.c", 595, __PRETTY_FUNCTION__), 0))); q= rce->new_qscale / br_compensation; }else{ rce->pict_type= rce->new_pict_type= pict_type; rce->mc_mb_var_sum= s->mc_mb_var_sum; rce->mb_var_sum = s-> mb_var_sum; rce->qscale = 2; rce->f_code = s->f_code; rce->b_code = s->b_code; rce->misc_bits= 1; if(picture_number>0) update_rc_buffer(s, s->frame_bits); bits= predict_size(&rcc->pred[pict_type], rce->qscale, sqrt(var)); if(pict_type== 1){ rce->i_count = s->mb_num; rce->i_tex_bits= bits; rce->p_tex_bits= 0; rce->mv_bits= 0; }else{ rce->i_count = 0; rce->i_tex_bits= 0; rce->p_tex_bits= bits*0.9; rce->mv_bits= bits*0.1; } rcc->i_cplx_sum [pict_type] += rce->i_tex_bits*rce->qscale; rcc->p_cplx_sum [pict_type] += rce->p_tex_bits*rce->qscale; rcc->mv_bits_sum[pict_type] += rce->mv_bits; rcc->frame_count[pict_type] ++; bits= rce->i_tex_bits + rce->p_tex_bits; rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation; q= get_qscale(s, rce, rate_factor, picture_number); ((void) ((q>0.0) ? 0 : (__assert_fail ("q>0.0", "ratecontrol.c", 635, __PRETTY_FUNCTION__), 0))); q= get_diff_limited_q(s, rce, q); ((void) ((q>0.0) ? 0 : (__assert_fail ("q>0.0", "ratecontrol.c", 639, __PRETTY_FUNCTION__), 0))); if(pict_type==2 || s->intra_only){ rcc->short_term_qsum*=s->qblur; rcc->short_term_qcount*=s->qblur; rcc->short_term_qsum+= q; rcc->short_term_qcount++; q= short_term_q= rcc->short_term_qsum/rcc->short_term_qcount; } ((void) ((q>0.0) ? 0 : (__assert_fail ("q>0.0", "ratecontrol.c", 651, __PRETTY_FUNCTION__), 0))); q= modify_qscale(s, rce, q, picture_number); rcc->pass1_wanted_bits+= s->bit_rate/fps; ((void) ((q>0.0) ? 0 : (__assert_fail ("q>0.0", "ratecontrol.c", 657, __PRETTY_FUNCTION__), 0))); } if (qqmax) q=qmax; # 673 "ratecontrol.c" if(s->adaptive_quant) adaptive_quantization(s, q); else q= (int)(q + 0.5); rcc->last_qscale= q; rcc->last_mc_mb_var_sum= s->mc_mb_var_sum; rcc->last_mb_var_sum= s->mb_var_sum; return q; } static int init_pass2(MpegEncContext *s) { RateControlContext *rcc= &s->rc_context; int i; double fps= (double)s->frame_rate / 10000; double complexity[5]={0,0,0,0,0}; double avg_quantizer[5]; uint64_t const_bits[5]={0,0,0,0,0}; uint64_t available_bits[5]; uint64_t all_const_bits; uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps); double rate_factor=0; double step; int last_i_frame=-10000000; const int filter_size= (int)(s->qblur*4) | 1; double expected_bits; double *qscale, *blured_qscale; for(i=0; inum_entries; i++){ RateControlEntry *rce= &rcc->entry[i]; if(s->b_frame_strategy==0 || s->max_b_frames==0){ rce->new_pict_type= rce->pict_type; }else{ int j; int next_non_b_type=2; switch(rce->pict_type){ case 1: if(i-last_i_frame>s->gop_size/2){ rce->new_pict_type= 1; last_i_frame= i; }else{ rce->new_pict_type= 2; } break; case 2: rce->new_pict_type= 2; break; case 3: for(j=i+1; jmax_b_frames+2 && jnum_entries; j++){ if(rcc->entry[j].pict_type != 3){ next_non_b_type= rcc->entry[j].pict_type; break; } } if(next_non_b_type==1) rce->new_pict_type= 2; else rce->new_pict_type= 3; break; } } rcc->i_cplx_sum [rce->pict_type] += rce->i_tex_bits*rce->qscale; rcc->p_cplx_sum [rce->pict_type] += rce->p_tex_bits*rce->qscale; rcc->mv_bits_sum[rce->pict_type] += rce->mv_bits; rcc->frame_count[rce->pict_type] ++; complexity[rce->new_pict_type]+= (rce->i_tex_bits+ rce->p_tex_bits)*(double)rce->qscale; const_bits[rce->new_pict_type]+= rce->mv_bits + rce->misc_bits; } all_const_bits= const_bits[1] + const_bits[2] + const_bits[3]; if(all_available_bits < all_const_bits){ fprintf(stderr, "requested bitrate is to low\n"); return -1; } avg_quantizer[2]=0; for(step=256*256; step>0.0000001; step*=0.5){ double expected_bits=0; avg_quantizer[2]+= step; avg_quantizer[1]= avg_quantizer[2]*((s->avctx->i_quant_factor) >= 0 ? (s->avctx->i_quant_factor) : (-(s->avctx->i_quant_factor))) + s->avctx->i_quant_offset; avg_quantizer[3]= avg_quantizer[2]*((s->avctx->b_quant_factor) >= 0 ? (s->avctx->b_quant_factor) : (-(s->avctx->b_quant_factor))) + s->avctx->b_quant_offset; expected_bits= + all_const_bits + complexity[1]/avg_quantizer[1] + complexity[2]/avg_quantizer[2] + complexity[3]/avg_quantizer[3]; if(expected_bits < all_available_bits) avg_quantizer[2]-= step; } for(i=0; i<5; i++){ available_bits[i]= const_bits[i] + complexity[i]/avg_quantizer[i]; } qscale= malloc(sizeof(double)*rcc->num_entries); blured_qscale= malloc(sizeof(double)*rcc->num_entries); for(step=256*256; step>0.0000001; step*=0.5){ expected_bits=0; rate_factor+= step; rcc->buffer_index= s->avctx->rc_buffer_size/2; for(i=0; inum_entries; i++){ qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i); } ((void) ((filter_size%2==1) ? 0 : (__assert_fail ("filter_size%2==1", "ratecontrol.c", 794, __PRETTY_FUNCTION__), 0))); for(i=rcc->num_entries-1; i>=0; i--){ RateControlEntry *rce= &rcc->entry[i]; qscale[i]= get_diff_limited_q(s, rce, qscale[i]); } for(i=0; inum_entries; i++){ RateControlEntry *rce= &rcc->entry[i]; const int pict_type= rce->new_pict_type; int j; double q=0.0, sum=0.0; for(j=0; jqblur==0 ? 1.0 : exp(-d*d/(s->qblur * s->qblur)); if(index < 0 || index >= rcc->num_entries) continue; if(pict_type != rcc->entry[index].new_pict_type) continue; q+= qscale[index] * coeff; sum+= coeff; } blured_qscale[i]= q/sum; } for(i=0; inum_entries; i++){ RateControlEntry *rce= &rcc->entry[i]; double bits; rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i); bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits; update_rc_buffer(s, bits); rce->expected_bits= expected_bits; expected_bits += bits; } if(expected_bits > all_available_bits) rate_factor-= step; } free(qscale); free(blured_qscale); if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){ fprintf(stderr, "Error: 2pass curve failed to converge\n"); return -1; } return 0; } >Fix: Omit "-m128bit-long-double" >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23833-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 22:46:07 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 16613 invoked by alias); 1 Nov 2002 22:46:06 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 16552 invoked by uid 71); 1 Nov 2002 22:46:04 -0000 Date: 1 Nov 2002 22:46:04 -0000 Message-ID: <20021101224604.16549.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Wolfgang Bangerth Subject: Re: c++/765: Friend function can not have same name of a memeber function Reply-To: Wolfgang Bangerth The following reply was made to PR c++/765; it has been noted by GNATS. From: Wolfgang Bangerth To: gcc-gnats@gcc.gnu.org Cc: Subject: Re: c++/765: Friend function can not have same name of a memeber function Date: Fri, 1 Nov 2002 16:46:29 -0600 (CST) Does not ICE any more, but rather silently accepts the code. W. ------------------------------------------------------------------------- Wolfgang Bangerth email: bangerth@ticam.utexas.edu www: http://www.ticam.utexas.edu/~bangerth From gcc-prs-return-23834-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 22:53:23 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 8484 invoked by alias); 1 Nov 2002 22:53:22 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 8451 invoked by uid 61); 1 Nov 2002 22:53:22 -0000 Date: 1 Nov 2002 22:53:22 -0000 Message-ID: <20021101225322.8449.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mayer@tux.org, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mayer@tux.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/3767: ICE in c_expand_expr, at c-common.c:3521 Synopsis: ICE in c_expand_expr, at c-common.c:3521 State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 14:53:21 2002 State-Changed-Why: Duplicate of 2650 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=3767 From gcc-prs-return-23835-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 22:54:57 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 17327 invoked by alias); 1 Nov 2002 22:54:57 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 17301 invoked by uid 61); 1 Nov 2002 22:54:57 -0000 Date: 1 Nov 2002 22:54:57 -0000 Message-ID: <20021101225457.17300.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, pauljlucas@mac.com From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, pauljlucas@mac.com, gcc-gnats@gcc.gnu.org Subject: Re: c++/3606: template causes compilation of illegal code to generate ICE Synopsis: template causes compilation of illegal code to generate ICE State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 14:54:56 2002 State-Changed-Why: Reportedly the same as 5402, where we find a small testcase. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=3606 From gcc-prs-return-23836-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 22:57:39 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 27767 invoked by alias); 1 Nov 2002 22:57:38 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 27741 invoked by uid 61); 1 Nov 2002 22:57:37 -0000 Date: 1 Nov 2002 22:57:37 -0000 Message-ID: <20021101225737.27740.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rd.mora@econz.co.nz From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rd.mora@econz.co.nz, gcc-gnats@gcc.gnu.org Subject: Re: c++/4043: g++ seg fault with user basic_ostream constructor Synopsis: g++ seg fault with user basic_ostream constructor State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 14:57:37 2002 State-Changed-Why: Seems fixed. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4043 From gcc-prs-return-23837-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 22:58:35 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 31893 invoked by alias); 1 Nov 2002 22:58:35 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 31870 invoked by uid 61); 1 Nov 2002 22:58:35 -0000 Date: 1 Nov 2002 22:58:35 -0000 Message-ID: <20021101225835.31869.qmail@sources.redhat.com> To: dave@schweisguth.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rodrigc@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, dave@schweisguth.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rodrigc@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/4044: vector causes internal compiler error Synopsis: vector causes internal compiler error State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 14:58:34 2002 State-Changed-Why: A proper bug is now reported. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4044 From gcc-prs-return-23838-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 23:08:51 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 9141 invoked by alias); 1 Nov 2002 23:08:50 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 9113 invoked by uid 61); 1 Nov 2002 23:08:49 -0000 Date: 1 Nov 2002 23:08:49 -0000 Message-ID: <20021101230849.9112.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, snyder@fnal.gov From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, snyder@fnal.gov, gcc-gnats@gcc.gnu.org Subject: Re: c++/5236: ICE in arg_assoc, at cp/decl2.c:4781 Synopsis: ICE in arg_assoc, at cp/decl2.c:4781 State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 15:08:49 2002 State-Changed-Why: Fixed in CVS http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=5236 From gcc-prs-return-23839-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 23:12:28 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25811 invoked by alias); 1 Nov 2002 23:12:27 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 25787 invoked by uid 61); 1 Nov 2002 23:12:27 -0000 Date: 1 Nov 2002 23:12:27 -0000 Message-ID: <20021101231227.25786.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, schmid@snake.iap.physik.tu-darmstadt.de From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, schmid@snake.iap.physik.tu-darmstadt.de, gcc-gnats@gcc.gnu.org Subject: Re: c++/5249: sorry, not implemented: `component_ref' Synopsis: sorry, not implemented: `component_ref' State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 15:12:27 2002 State-Changed-Why: This code is severely ill-formed, so I would guess that already the previous state of issuing an (admittedly misleading) error would have been ok, but present CVS gives a better message. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=5249 From gcc-prs-return-23840-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 23:14:45 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 1911 invoked by alias); 1 Nov 2002 23:14:44 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 1872 invoked by uid 61); 1 Nov 2002 23:14:43 -0000 Date: 1 Nov 2002 23:14:43 -0000 Message-ID: <20021101231443.1869.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, pcarlini@unitus.it From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, pcarlini@unitus.it, gcc-gnats@gcc.gnu.org Subject: Re: c++/5339: [parser] Internal error on illegal code (argument list for template missing) Synopsis: [parser] Internal error on illegal code (argument list for template missing) State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 15:14:43 2002 State-Changed-Why: Seems fixed both in 3.2.1 and 3.3 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=5339 From gcc-prs-return-23841-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 23:26:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 7313 invoked by alias); 1 Nov 2002 23:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 7282 invoked by uid 71); 1 Nov 2002 23:26:01 -0000 Resent-Date: 1 Nov 2002 23:26:01 -0000 Resent-Message-ID: <20021101232601.7280.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, rl@tempest-sw.com Received: (qmail 21147 invoked by uid 61); 1 Nov 2002 23:20:34 -0000 Message-Id: <20021101232034.21146.qmail@sources.redhat.com> Date: 1 Nov 2002 23:20:34 -0000 From: rl@tempest-sw.com Reply-To: rl@tempest-sw.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8427: internal error on ambiguous function template >Number: 8427 >Category: c++ >Synopsis: internal error on ambiguous function template >Confidential: no >Severity: serious >Priority: low >Responsible: unassigned >State: open >Class: ice-on-illegal-code >Submitter-Id: net >Arrival-Date: Fri Nov 01 15:26:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Ray Lischner >Release: 3.2 >Organization: >Environment: Linux, Suse 7.2, kernel 2.4.19, SMP, i686 >Description: g++ gcc01.cpp gcc01.cpp: In function `int main()': gcc01.cpp:8: internal error: Segmentation fault Please submit a full bug report, with preprocessed source if appropriate. See for instructions. >How-To-Repeat: g++ gcc01.cpp >Fix: Segfault only seems to happen with incorrect source code, so work around is to fix the source code. >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23842-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 23:33:57 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 3993 invoked by alias); 1 Nov 2002 23:33:57 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 3962 invoked by uid 61); 1 Nov 2002 23:33:56 -0000 Date: 1 Nov 2002 23:33:56 -0000 Message-ID: <20021101233356.3961.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gruesome@poczta.onet.pl, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gruesome@poczta.onet.pl, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/6570: gcc-3.1 crash with template and namespace Synopsis: gcc-3.1 crash with template and namespace State-Changed-From-To: analyzed->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 15:33:56 2002 State-Changed-Why: Seems fixed: tmp/g> /home/bangerth/bin/gcc-3.3-pre/bin/c++ -c x.cc x.cc:8: error: invalid use of template-name 'My::S' in a declarator x.cc:8: error: syntax error before `&' token tmp/g> /home/bangerth/bin/gcc-3.2.1-pre/bin/c++ -c x.cc x.cc:8: invalid use of template-name 'My::S' in a declarator x.cc:8: syntax error before `&' token http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6570 From gcc-prs-return-23843-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Fri Nov 01 23:35:34 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 9116 invoked by alias); 1 Nov 2002 23:35:33 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 9082 invoked by uid 61); 1 Nov 2002 23:35:32 -0000 Date: 1 Nov 2002 23:35:32 -0000 Message-ID: <20021101233532.9081.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rl@tempest-sw.com From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rl@tempest-sw.com, gcc-gnats@gcc.gnu.org Subject: Re: c++/8427: internal error on ambiguous function template Synopsis: internal error on ambiguous function template State-Changed-From-To: open->feedback State-Changed-By: bangerth State-Changed-When: Fri Nov 1 15:35:32 2002 State-Changed-Why: Please send us a testcase according to the Web page referenced in the compiler error http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8427 From gcc-prs-return-23844-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 00:26:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 29646 invoked by alias); 2 Nov 2002 00:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 29604 invoked by uid 71); 2 Nov 2002 00:26:01 -0000 Date: 2 Nov 2002 00:26:01 -0000 Message-ID: <20021102002601.29602.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: tromey@gcc.gnu.org Subject: java/8415 Reply-To: tromey@gcc.gnu.org The following reply was made to PR java/8415; it has been noted by GNATS. From: tromey@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: java/8415 Date: 2 Nov 2002 00:19:53 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: tromey@gcc.gnu.org 2002-11-01 16:19:53 Modified files: libjava/testsuite: ChangeLog Added files: libjava/testsuite/libjava.lang: pr8415.java pr8415.out Log message: For PR java/8415: * libjava.lang/pr8415.java: New file. * libjava.lang/pr8415.out: New file. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.224&r2=1.225 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.lang/pr8415.java.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.lang/pr8415.out.diff?cvsroot=gcc&r1=NONE&r2=1.1 From gcc-prs-return-23845-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:06:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12358 invoked by alias); 2 Nov 2002 01:06:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12331 invoked by uid 71); 2 Nov 2002 01:06:00 -0000 Date: 2 Nov 2002 01:06:00 -0000 Message-ID: <20021102010600.12324.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: mmitchel@gcc.gnu.org Subject: c++/8391 Reply-To: mmitchel@gcc.gnu.org The following reply was made to PR c++/8391; it has been noted by GNATS. From: mmitchel@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: c++/8391 Date: 2 Nov 2002 00:57:26 -0000 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_2-branch Changes by: mmitchel@gcc.gnu.org 2002-11-01 16:57:26 Modified files: gcc : ChangeLog toplev.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/opt: local1.C Log message: PR c++/8391 * toplev.c (rest_of_compilation): Do not refuse to output code for an inline function in a local class. PR c++/8391 * g++.dg/opt/local1.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.13152.2.657.2.116&r2=1.13152.2.657.2.117 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/toplev.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.574.2.16.2.2&r2=1.574.2.16.2.3 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.1672.2.166.2.44&r2=1.1672.2.166.2.45 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/opt/local1.C.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=NONE&r2=1.1.2.1 From gcc-prs-return-23846-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:06:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12398 invoked by alias); 2 Nov 2002 01:06:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12363 invoked by uid 71); 2 Nov 2002 01:06:01 -0000 Date: 2 Nov 2002 01:06:01 -0000 Message-ID: <20021102010601.12362.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: mmitchel@gcc.gnu.org Subject: c++/8391 Reply-To: mmitchel@gcc.gnu.org The following reply was made to PR c++/8391; it has been noted by GNATS. From: mmitchel@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: c++/8391 Date: 2 Nov 2002 00:57:26 -0000 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_2-branch Changes by: mmitchel@gcc.gnu.org 2002-11-01 16:57:26 Modified files: gcc : ChangeLog toplev.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/opt: local1.C Log message: PR c++/8391 * toplev.c (rest_of_compilation): Do not refuse to output code for an inline function in a local class. PR c++/8391 * g++.dg/opt/local1.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.13152.2.657.2.116&r2=1.13152.2.657.2.117 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/toplev.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.574.2.16.2.2&r2=1.574.2.16.2.3 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.1672.2.166.2.44&r2=1.1672.2.166.2.45 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/opt/local1.C.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=NONE&r2=1.1.2.1 From gcc-prs-return-23847-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:06:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12435 invoked by alias); 2 Nov 2002 01:06:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12379 invoked by uid 71); 2 Nov 2002 01:06:01 -0000 Date: 2 Nov 2002 01:06:01 -0000 Message-ID: <20021102010601.12378.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: mmitchel@gcc.gnu.org Subject: c++/8391 Reply-To: mmitchel@gcc.gnu.org The following reply was made to PR c++/8391; it has been noted by GNATS. From: mmitchel@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: c++/8391 Date: 2 Nov 2002 01:03:03 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: mmitchel@gcc.gnu.org 2002-11-01 17:03:03 Modified files: gcc : ChangeLog toplev.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/opt: local1.C Log message: PR c++/8391 * toplev.c (rest_of_compilation): Do not refuse to output code for an inline function in a local class. PR c++/8391 * g++.dg/opt/local1.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=1.15839&r2=1.15840 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/toplev.c.diff?cvsroot=gcc&r1=1.687&r2=1.688 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.2194&r2=1.2195 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/opt/local1.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 From gcc-prs-return-23848-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:06:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12514 invoked by alias); 2 Nov 2002 01:06:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12440 invoked by uid 71); 2 Nov 2002 01:06:02 -0000 Date: 2 Nov 2002 01:06:02 -0000 Message-ID: <20021102010602.12424.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: mmitchel@gcc.gnu.org Subject: c++/8391 Reply-To: mmitchel@gcc.gnu.org The following reply was made to PR c++/8391; it has been noted by GNATS. From: mmitchel@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: c++/8391 Date: 2 Nov 2002 01:03:03 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: mmitchel@gcc.gnu.org 2002-11-01 17:03:03 Modified files: gcc : ChangeLog toplev.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/opt: local1.C Log message: PR c++/8391 * toplev.c (rest_of_compilation): Do not refuse to output code for an inline function in a local class. PR c++/8391 * g++.dg/opt/local1.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=1.15839&r2=1.15840 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/toplev.c.diff?cvsroot=gcc&r1=1.687&r2=1.688 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.2194&r2=1.2195 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/opt/local1.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 From gcc-prs-return-23849-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:17:20 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 22199 invoked by alias); 2 Nov 2002 01:17:20 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 22165 invoked by uid 61); 2 Nov 2002 01:17:19 -0000 Date: 2 Nov 2002 01:17:19 -0000 Message-ID: <20021102011719.22164.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, spencer@infointeractive.com From: mmitchel@gcc.gnu.org Reply-To: mmitchel@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, spencer@infointeractive.com, gcc-gnats@gcc.gnu.org Subject: Re: c++/8391: [regression] infinite loop in cp/decl2.c(finish_file) Synopsis: [regression] infinite loop in cp/decl2.c(finish_file) State-Changed-From-To: analyzed->closed State-Changed-By: mmitchel State-Changed-When: Fri Nov 1 17:17:19 2002 State-Changed-Why: Fixed in GCC 3.2.1. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8391 From gcc-prs-return-23850-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:32:23 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21452 invoked by alias); 2 Nov 2002 01:32:22 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21425 invoked by uid 61); 2 Nov 2002 01:32:21 -0000 Date: 2 Nov 2002 01:32:21 -0000 Message-ID: <20021102013221.21424.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, tudor.hulubei@ecora.com From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, tudor.hulubei@ecora.com, gcc-gnats@gcc.gnu.org Subject: Re: c++/4659: Eroneous extra warning for -Woverloaded-virtual Synopsis: Eroneous extra warning for -Woverloaded-virtual State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 17:32:21 2002 State-Changed-Why: The warning is warranted, since one function is indeed hidden. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4659 From gcc-prs-return-23851-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:37:24 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 10071 invoked by alias); 2 Nov 2002 01:37:24 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 10049 invoked by uid 61); 2 Nov 2002 01:37:24 -0000 Date: 2 Nov 2002 01:37:24 -0000 Message-ID: <20021102013724.10048.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, hull@paracel.com, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, hull@paracel.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: bootstrap/6145: Error compiling jni.cc on i386-pc-solaris2.7 Synopsis: Error compiling jni.cc on i386-pc-solaris2.7 State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 17:37:23 2002 State-Changed-Why: I think you are reporting a bootstrap failure here, right? Since this report has not been touched since April I imagine the problem must have gone away or else other people would have noticed. Also, 3.0.4 is long superceded by other versions of gcc. If you are not happy with me closing this report, please contact me. Regards W. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6145 From gcc-prs-return-23852-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:38:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 13039 invoked by alias); 2 Nov 2002 01:38:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 13012 invoked by uid 61); 2 Nov 2002 01:38:03 -0000 Date: 2 Nov 2002 01:38:03 -0000 Message-ID: <20021102013803.13010.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, patrick@vrac.iastate.edu From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, patrick@vrac.iastate.edu, gcc-gnats@gcc.gnu.org Subject: Re: c++/6361: Internal compiler error in g++-v3/bits/locale_facets.tcc with GCC 3.0.4 on IRIX Synopsis: Internal compiler error in g++-v3/bits/locale_facets.tcc with GCC 3.0.4 on IRIX State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 17:38:02 2002 State-Changed-Why: I think you are reporting a bootstrap failure here, right? Since this report has not been touched since some time I imagine the problem must have gone away or else other people would have noticed. Also, 3.0.4 is long superceded by other versions of gcc. If you are not happy with me closing this report, please contact me. Regards W. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6361 From gcc-prs-return-23853-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:40:58 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24616 invoked by alias); 2 Nov 2002 01:40:58 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24585 invoked by uid 61); 2 Nov 2002 01:40:58 -0000 Date: 2 Nov 2002 01:40:58 -0000 Message-ID: <20021102014058.24583.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gisli@adams.com, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gisli@adams.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/2183: gcc-3_0-branch compiles 2x slower than 2.95 Synopsis: gcc-3_0-branch compiles 2x slower than 2.95 State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 17:40:57 2002 State-Changed-Why: I think a compile-time regression in this range must be expected due to the switch to libstdc++ v3 alone. Add some new optimizations, and you're there, so I think one should classify this as "more features make things slower". Needless to say that I do not find the general trend too good either... http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=2183 From gcc-prs-return-23854-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:45:56 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 9618 invoked by alias); 2 Nov 2002 01:45:54 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 9559 invoked by uid 61); 2 Nov 2002 01:45:54 -0000 Date: 2 Nov 2002 01:45:54 -0000 Message-ID: <20021102014554.9557.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mschill4@ix.urz.uni-heidelberg.de, nobody@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mschill4@ix.urz.uni-heidelberg.de, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7926: i486 instructions in header files make c++ programs crash on i386 Synopsis: i486 instructions in header files make c++ programs crash on i386 Responsible-Changed-From-To: unassigned->bkoz Responsible-Changed-By: bkoz Responsible-Changed-When: Fri Nov 1 17:45:53 2002 Responsible-Changed-Why: Mine. State-Changed-From-To: analyzed->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 17:45:53 2002 State-Changed-Why: This target, i386, should have been using the generic configuration, not the i486 files. I switched it. -benjamin http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7926 From gcc-prs-return-23855-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:46:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 10071 invoked by alias); 2 Nov 2002 01:46:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 10019 invoked by uid 71); 2 Nov 2002 01:46:02 -0000 Date: 2 Nov 2002 01:46:02 -0000 Message-ID: <20021102014602.10011.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: bkoz@gcc.gnu.org Subject: libstdc++/7926 Reply-To: bkoz@gcc.gnu.org The following reply was made to PR libstdc++/7926; it has been noted by GNATS. From: bkoz@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: libstdc++/7926 Date: 2 Nov 2002 01:42:23 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: bkoz@gcc.gnu.org 2002-11-01 17:42:22 Modified files: libstdc++-v3 : ChangeLog configure.target Removed files: libstdc++-v3/config/cpu/arm: atomicity.h libstdc++-v3/config/cpu/i386: atomicity.h libstdc++-v3/config/cpu/x86-64: atomicity.h Log message: 2002-11-01 Benjamin Kosnik PR libstdc++/7926 * configure.target: Simplify. * config/cpu/i386/atomicity.h: Remove. * config/cpu/i386: Remove. * config/cpu/arm/atomicity.h: Remove. * config/cpu/arm: Remove. * config/cpu/x86-64/atomicity.h: Remove. * config/cpu/x86-64: Remove. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/ChangeLog.diff?cvsroot=gcc&r1=1.1410&r2=1.1411 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/configure.target.diff?cvsroot=gcc&r1=1.53&r2=1.54 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/config/cpu/arm/atomicity.h.diff?cvsroot=gcc&r1=1.4&r2=NONE http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/config/cpu/i386/atomicity.h.diff?cvsroot=gcc&r1=1.3&r2=NONE http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/config/cpu/x86-64/atomicity.h.diff?cvsroot=gcc&r1=1.1&r2=NONE From gcc-prs-return-23856-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:49:41 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 23625 invoked by alias); 2 Nov 2002 01:49:40 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 23588 invoked by uid 61); 2 Nov 2002 01:49:40 -0000 Date: 2 Nov 2002 01:49:40 -0000 Message-ID: <20021102014940.23586.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, nwourms@netscape.net From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, nwourms@netscape.net, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7849: libstdc++.so: undefined reference to std::messages::do_get[...] causes failure during building of abi_check Synopsis: libstdc++.so: undefined reference to std::messages::do_get[...] causes failure during building of abi_check Responsible-Changed-From-To: unassigned->bkoz Responsible-Changed-By: bkoz Responsible-Changed-When: Fri Nov 1 17:49:39 2002 Responsible-Changed-Why: Mine. State-Changed-From-To: open->analyzed State-Changed-By: bkoz State-Changed-When: Fri Nov 1 17:49:39 2002 State-Changed-Why: Can you confirm that this is still an issue? I'm unable to reproduce this with today's gcc, and ld as of: %ld --version GNU ld version 2.13.90 20021027 -benjamin http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7849 From gcc-prs-return-23857-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:50:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25171 invoked by alias); 2 Nov 2002 01:50:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 25146 invoked by uid 61); 2 Nov 2002 01:50:02 -0000 Date: 2 Nov 2002 01:50:02 -0000 Message-ID: <20021102015002.25145.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, germain@cs.utah.edu, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, germain@cs.utah.edu, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8417: g++ 3.2 generating different (and incorrect?) code from g++ 2.95.4 Synopsis: g++ 3.2 generating different (and incorrect?) code from g++ 2.95.4 State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 17:50:01 2002 State-Changed-Why: What you try is calling for trouble: you should not assume anything about where member variables are located relative to "this". Also, "this" may change from sub- to superclass, depending on the layout of vtables, etc. You should only try to zero out data pointed to by "this" if you absolutely know what you do, and stick to the ABI that is relevant to your platform. This said, the ABI gcc uses on Linux has changed between 2.95 and 3.2, so the inconsistent behavior is not surprising. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8417 From gcc-prs-return-23858-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:50:46 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 28081 invoked by alias); 2 Nov 2002 01:50:46 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 28058 invoked by uid 61); 2 Nov 2002 01:50:46 -0000 Date: 2 Nov 2002 01:50:46 -0000 Message-ID: <20021102015046.28056.qmail@sources.redhat.com> To: 7zbuodeyr001@sneakemail.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, pme@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, 7zbuodeyr001@sneakemail.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, pme@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7691: --enable-cxx-flags configure option broken Synopsis: --enable-cxx-flags configure option broken State-Changed-From-To: analyzed->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 17:50:45 2002 State-Changed-Why: I think this has been fixed, correct? http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7691 From gcc-prs-return-23859-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:53:27 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 10891 invoked by alias); 2 Nov 2002 01:53:26 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 10863 invoked by uid 61); 2 Nov 2002 01:53:26 -0000 Date: 2 Nov 2002 01:53:26 -0000 Message-ID: <20021102015326.10862.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, p.van-hoof@qub.ac.uk From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, p.van-hoof@qub.ac.uk, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7444: Build of gcc 3.1.1 failed while configuring libstdc++ Synopsis: Build of gcc 3.1.1 failed while configuring libstdc++ State-Changed-From-To: open->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 17:53:25 2002 State-Changed-Why: 3.1.x sources are dead. Can you see if this is still an issue on gcc or gcc-3.2 sources? Isn't this a sun sh issue? -benjamin http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7444 From gcc-prs-return-23860-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:54:52 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24868 invoked by alias); 2 Nov 2002 01:54:52 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24832 invoked by uid 61); 2 Nov 2002 01:54:51 -0000 Date: 2 Nov 2002 01:54:51 -0000 Message-ID: <20021102015451.24831.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gunneyb@llnl.gov, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gunneyb@llnl.gov, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8172: undefined reference to operator+ for string Synopsis: undefined reference to operator+ for string State-Changed-From-To: open->analyzed State-Changed-By: bangerth State-Changed-When: Fri Nov 1 17:54:51 2002 State-Changed-Why: Confirmed http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8172 From gcc-prs-return-23861-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:55:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25783 invoked by alias); 2 Nov 2002 01:55:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 25746 invoked by uid 61); 2 Nov 2002 01:55:02 -0000 Date: 2 Nov 2002 01:55:02 -0000 Message-ID: <20021102015502.25744.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, richarda@vecien.com From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, richarda@vecien.com, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7669: [Solaris 2.7, gcc-3.1.1] libstdc++.so segfaults in _init() Synopsis: [Solaris 2.7, gcc-3.1.1] libstdc++.so segfaults in _init() State-Changed-From-To: open->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 17:55:02 2002 State-Changed-Why: Can you confirm that this is still at issue? There seem to be plenty of good solaris results posted on gcc-testresults. -benjamin http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7669 From gcc-prs-return-23862-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:56:51 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 654 invoked by alias); 2 Nov 2002 01:56:51 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 632 invoked by uid 61); 2 Nov 2002 01:56:51 -0000 Date: 2 Nov 2002 01:56:51 -0000 Message-ID: <20021102015651.631.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, tamas.hauer@cern.ch From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, tamas.hauer@cern.ch, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/6934: c++ increment operator, map bug ? Synopsis: c++ increment operator, map bug ? State-Changed-From-To: analyzed->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 17:56:50 2002 State-Changed-Why: Is this still an issue? http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6934 From gcc-prs-return-23863-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 01:58:18 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 4221 invoked by alias); 2 Nov 2002 01:58:18 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 4194 invoked by uid 61); 2 Nov 2002 01:58:18 -0000 Date: 2 Nov 2002 01:58:18 -0000 Message-ID: <20021102015818.4193.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, jddahl@micron.com, nobody@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, jddahl@micron.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/3750: stream input operator>> fails in g++ 3.0 on solaris 5.6 only Synopsis: stream input operator>> fails in g++ 3.0 on solaris 5.6 only State-Changed-From-To: analyzed->closed State-Changed-By: bkoz State-Changed-When: Fri Nov 1 17:58:17 2002 State-Changed-Why: Fixed with the solaris 2.6 ctype fix. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=3750 From gcc-prs-return-23864-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 02:01:10 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 10927 invoked by alias); 2 Nov 2002 02:01:08 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 10905 invoked by uid 61); 2 Nov 2002 02:01:07 -0000 Date: 2 Nov 2002 02:01:07 -0000 Message-ID: <20021102020107.10904.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, meeberdt@unity.ncsu.edu, nobody@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, meeberdt@unity.ncsu.edu, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/1823: program compiled with -ftrapv aborts in std::queue<>.size() Synopsis: program compiled with -ftrapv aborts in std::queue<>.size() State-Changed-From-To: analyzed->closed State-Changed-By: bkoz State-Changed-When: Fri Nov 1 18:01:06 2002 State-Changed-Why: Cannot duplicate on i686-pc-linux-gnu (Red Hat Linux 7) with 2002-11-01 sources. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=1823 From gcc-prs-return-23865-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 02:02:43 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 14722 invoked by alias); 2 Nov 2002 02:02:43 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14696 invoked by uid 61); 2 Nov 2002 02:02:42 -0000 Date: 2 Nov 2002 02:02:42 -0000 Message-ID: <20021102020242.14695.qmail@sources.redhat.com> To: bkoz@gnu.org, ftran@sophia.inria.fr, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, bkoz@gnu.org, ftran@sophia.inria.fr, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/4144: istream on solaris, ifstream vs. cin Synopsis: istream on solaris, ifstream vs. cin State-Changed-From-To: analyzed->closed State-Changed-By: bkoz State-Changed-When: Fri Nov 1 18:02:42 2002 State-Changed-Why: This is another of the solaris 2.6 ctype bugs. Fixed. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4144 From gcc-prs-return-23866-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 02:05:46 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 30616 invoked by alias); 2 Nov 2002 02:05:45 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 30558 invoked by uid 61); 2 Nov 2002 02:05:44 -0000 Date: 2 Nov 2002 02:05:44 -0000 Message-ID: <20021102020544.30554.qmail@sources.redhat.com> To: davem@gcc.gnu.org, eric.norum@usask.ca, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, davem@gcc.gnu.org, eric.norum@usask.ca, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/4367: Sparc atomicity.h routines can lock up on some OS. Synopsis: Sparc atomicity.h routines can lock up on some OS. Responsible-Changed-From-To: unassigned->davem Responsible-Changed-By: bkoz Responsible-Changed-When: Fri Nov 1 18:05:44 2002 Responsible-Changed-Why: Yours. I think you can close this. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4367 From gcc-prs-return-23867-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 02:19:58 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 30305 invoked by alias); 2 Nov 2002 02:19:57 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 30272 invoked by uid 61); 2 Nov 2002 02:19:56 -0000 Date: 2 Nov 2002 02:19:56 -0000 Message-ID: <20021102021956.30271.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gunneyb@llnl.gov, nobody@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gunneyb@llnl.gov, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8172: undefined reference to operator+ for string Synopsis: undefined reference to operator+ for string Responsible-Changed-From-To: unassigned->bkoz Responsible-Changed-By: bkoz Responsible-Changed-When: Fri Nov 1 18:19:56 2002 Responsible-Changed-Why: Mine. State-Changed-From-To: analyzed->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 18:19:56 2002 State-Changed-Why: Fixed by instantiating string+. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8172 From gcc-prs-return-23868-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 02:26:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24756 invoked by alias); 2 Nov 2002 02:26:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24593 invoked by uid 71); 2 Nov 2002 02:26:01 -0000 Date: 2 Nov 2002 02:26:01 -0000 Message-ID: <20021102022601.24589.qmail@sources.redhat.com> To: zack@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: zack@gcc.gnu.org Subject: c/7353 Reply-To: zack@gcc.gnu.org The following reply was made to PR c/7353; it has been noted by GNATS. From: zack@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: c/7353 Date: 2 Nov 2002 02:17:42 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: zack@gcc.gnu.org 2002-11-01 18:17:42 Modified files: gcc/cp : ChangeLog decl2.c gcc/testsuite : ChangeLog gcc/testsuite/g++.dg/ext: typedef-init.C gcc/testsuite/gcc.dg: typedef-init.c Log message: PR c/7353 redux cp: * decl2.c (grokfield): Reject TYPE_DECLs with initializers. testsuite: * g++.dg/ext/typedef-init.C, gcc.dg/typedef-init.C: Add some more cases. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.3035&r2=1.3036 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl2.c.diff?cvsroot=gcc&r1=1.569&r2=1.570 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.2195&r2=1.2196 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/ext/typedef-init.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/typedef-init.c.diff?cvsroot=gcc&r1=1.1&r2=1.2 From gcc-prs-return-23869-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 02:26:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25006 invoked by alias); 2 Nov 2002 02:26:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24674 invoked by uid 71); 2 Nov 2002 02:26:02 -0000 Date: 2 Nov 2002 02:26:02 -0000 Message-ID: <20021102022602.24669.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: bkoz@gcc.gnu.org Subject: libstdc++/8172 Reply-To: bkoz@gcc.gnu.org The following reply was made to PR libstdc++/8172; it has been noted by GNATS. From: bkoz@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: libstdc++/8172 Date: 2 Nov 2002 02:18:18 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: bkoz@gcc.gnu.org 2002-11-01 18:18:18 Modified files: libstdc++-v3 : ChangeLog libstdc++-v3/src: string-inst.cc Log message: 2002-11-01 Benjamin Kosnik PR libstdc++/8172 * src/string-inst.cc: Add instantiation. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/ChangeLog.diff?cvsroot=gcc&r1=1.1411&r2=1.1412 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libstdc++-v3/src/string-inst.cc.diff?cvsroot=gcc&r1=1.25&r2=1.26 From gcc-prs-return-23870-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 02:27:33 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 5262 invoked by alias); 2 Nov 2002 02:27:33 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 5234 invoked by uid 61); 2 Nov 2002 02:27:33 -0000 Date: 2 Nov 2002 02:27:33 -0000 Message-ID: <20021102022733.5233.qmail@sources.redhat.com> To: echristo@gcc.gnu.org, echristo@redhat.com, emaste@sandvine.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, echristo@gcc.gnu.org, echristo@redhat.com, emaste@sandvine.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/5625: exception unwinding creates invalid pointer on mips Synopsis: exception unwinding creates invalid pointer on mips State-Changed-From-To: analyzed->feedback State-Changed-By: bkoz State-Changed-When: Fri Nov 1 18:27:33 2002 State-Changed-Why: Ping... is this resolved? http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=5625 From gcc-prs-return-23871-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 02:46:21 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24318 invoked by alias); 2 Nov 2002 02:46:19 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24253 invoked by uid 61); 2 Nov 2002 02:46:19 -0000 Date: 2 Nov 2002 02:46:19 -0000 Message-ID: <20021102024619.24251.qmail@sources.redhat.com> To: adamwilkshire@hotmail.com, bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, adamwilkshire@hotmail.com, bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8348: fail() flag is set in istringstream when eof() flag is set ! Synopsis: fail() flag is set in istringstream when eof() flag is set ! State-Changed-From-To: feedback->closed State-Changed-By: bkoz State-Changed-When: Fri Nov 1 18:46:18 2002 State-Changed-Why: Fixed. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8348 From gcc-prs-return-23872-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 03:16:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 20317 invoked by alias); 2 Nov 2002 03:16:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 20294 invoked by uid 71); 2 Nov 2002 03:16:02 -0000 Date: 2 Nov 2002 03:16:02 -0000 Message-ID: <20021102031602.20291.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Peter van Hoof Subject: Re: libstdc++/7444: Build of gcc 3.1.1 failed while configuring libstdc++ Reply-To: Peter van Hoof The following reply was made to PR libstdc++/7444; it has been noted by GNATS. From: Peter van Hoof To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Cc: Subject: Re: libstdc++/7444: Build of gcc 3.1.1 failed while configuring libstdc++ Date: Sat, 02 Nov 2002 03:12:01 +0000 > 3.1.x sources are dead. Can you see if this is still an issue on gcc or gcc-3.2 > sources? Yes, I had the exact same problem when trying to install gcc 3.2. > Isn't this a sun sh issue? Maybe, but if there is a simple way of avoiding the problem, why not use it... From gcc-prs-return-23873-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 09:38:13 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 2809 invoked by alias); 2 Nov 2002 09:38:10 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 2734 invoked by uid 61); 2 Nov 2002 09:38:09 -0000 Date: 2 Nov 2002 09:38:09 -0000 Message-ID: <20021102093809.2731.qmail@sources.redhat.com> To: davem@gcc.gnu.org, eric.norum@usask.ca, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org From: davem@gcc.gnu.org Reply-To: davem@gcc.gnu.org, davem@gcc.gnu.org, eric.norum@usask.ca, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/4367: Sparc atomicity.h routines can lock up on some OS. Synopsis: Sparc atomicity.h routines can lock up on some OS. State-Changed-From-To: feedback->closed State-Changed-By: davem State-Changed-When: Sat Nov 2 01:38:08 2002 State-Changed-Why: Indeed, no constructive responses to my queries, this bug is dead. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4367 From gcc-prs-return-23874-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 10:36:08 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 32423 invoked by alias); 2 Nov 2002 10:36:05 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 32364 invoked by uid 71); 2 Nov 2002 10:36:05 -0000 Date: 2 Nov 2002 10:36:04 -0000 Message-ID: <20021102103604.32341.qmail@sources.redhat.com> To: zack@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: zack@gcc.gnu.org Subject: c/7353 Reply-To: zack@gcc.gnu.org The following reply was made to PR c/7353; it has been noted by GNATS. From: zack@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: c/7353 Date: 2 Nov 2002 10:28:51 -0000 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_2-branch Changes by: zack@gcc.gnu.org 2002-11-02 02:28:50 Modified files: gcc/cp : ChangeLog decl2.c gcc/testsuite : ChangeLog gcc/testsuite/g++.dg/ext: typedef-init.C gcc/testsuite/gcc.dg: typedef-init.c Log message: PR c/7353 redux cp: * decl2.c (grokfield): Reject TYPE_DECLs with initializers. testsuite: * g++.dg/ext/typedef-init.C, gcc.dg/typedef-init.C: Add some more cases. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.2685.2.114.2.39&r2=1.2685.2.114.2.40 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl2.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.520.2.7.2.7&r2=1.520.2.7.2.8 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.1672.2.166.2.45&r2=1.1672.2.166.2.46 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/ext/typedef-init.C.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.1.2.1&r2=1.1.2.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/typedef-init.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.1.2.1&r2=1.1.2.2 From gcc-prs-return-23875-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 11:15:47 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 7881 invoked by alias); 2 Nov 2002 11:15:43 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 7825 invoked by uid 61); 2 Nov 2002 11:15:41 -0000 Date: 2 Nov 2002 11:15:41 -0000 Message-ID: <20021102111541.7823.qmail@sources.redhat.com> To: donald.a.pellegrino@usa.dupont.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, toon@gcc.gnu.org From: toon@gcc.gnu.org Reply-To: toon@gcc.gnu.org, donald.a.pellegrino@usa.dupont.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, toon@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: fortran/6742: Generation of C++ Prototype for FORTRAN and extern "C" Synopsis: Generation of C++ Prototype for FORTRAN and extern "C" Responsible-Changed-From-To: unassigned->toon Responsible-Changed-By: toon Responsible-Changed-When: Sat Nov 2 03:15:41 2002 Responsible-Changed-Why: Fortran Maintainer. State-Changed-From-To: open->closed State-Changed-By: toon State-Changed-When: Sat Nov 2 03:15:41 2002 State-Changed-Why: This is a documentation error of g77, which will be fixed in 3.3. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6742 From gcc-prs-return-23876-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 11:46:09 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 5369 invoked by alias); 2 Nov 2002 11:46:05 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 5275 invoked by uid 71); 2 Nov 2002 11:46:03 -0000 Resent-Date: 2 Nov 2002 11:46:03 -0000 Resent-Message-ID: <20021102114603.5274.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, marioluca@inwind.it Received: (qmail 27830 invoked by uid 61); 2 Nov 2002 11:43:15 -0000 Message-Id: <20021102114314.27828.qmail@sources.redhat.com> Date: 2 Nov 2002 11:43:14 -0000 From: marioluca@inwind.it Reply-To: marioluca@inwind.it To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8428: Segmentation fault while building a c++ file >Number: 8428 >Category: c++ >Synopsis: Segmentation fault while building a c++ file >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sat Nov 02 03:46:02 PST 2002 >Closed-Date: >Last-Modified: >Originator: marioluca@inwind.it >Release: gcc 3.2 tree-ssa branch >Organization: >Environment: >Description: When i try to compile the libsupc++ , cc1plus give a segfault error on the compilation of del_op.cc file. This makes impossible to bootstrap the compiler with -fdump-translation-unit turned on. I've reported here the output of the 2 compilation i made: ( see how to repeat for command line ) -------------------------------------------------------------------------------------------------- Build that fails with a segmentation fault (*tree-ssa branch*) -------------------------------------------------------------------------------------------------- GNU C++ version 3.4-tree-ssa 20021021 (experimental) (i686-pc-linux-gnu) compiled by GNU C version 3.2. options passed: -fpreprocessed -auxbase-strip -g -g -O2 -Wall -Wno-format -W -Wwrite-strings -Winline -fno-implicit-templates -fdiagnostics-show-location=once -ffunction-sections -fdata-sections -fdump-translation-unit options enabled: -fdefer-pop -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves -fpcc-struct-return -fgcse -fgcse-lm -fgcse-sm -floop-optimize -fcrossjumping -fif-conversion -fif-conversion2 -frerun-cse-after-loop -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg -fexceptions -freorder-blocks -freorder-functions -fcprop-registers -fcommon -ffunction-sections -fdata-sections -fgnu-linker -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing -fmerge-constants -fzero-initialized-in-bss -fident -fpeephole2 -fguess-branch-probability -fmath-errno -ftrapping-math -m80387 -mhard-float -mno-soft-float -mieee-fp -mfp-ret-in-387 -maccumulate-outgoing-args -mcpu=pentiumpro -march=i386 std::exception::exception() std::exception::exception() std::exception::exception() std::bad_exception::bad_exception() std::bad_exception::bad_exception() std::bad_exception::bad_exception() std::bad_alloc::bad_alloc() std::bad_alloc::bad_alloc() std::bad_alloc::bad_alloc() void* operator new(unsigned int, void*) void* operator new [](unsigned int, void*) void operator delete(void*, void*) void operator delete [](void*, void*) void operator delete(void*) void operator delete(void*) del_op.cc: At global scope: del_op.cc:40: internal compiler error: Segmentation fault Please submit a full bug report, with preprocessed source if appropriate. See for instructions. ------------------------------------------------------------------------------------------ Build that work fine ( *ast-optimizer branch* ) ------------------------------------------------------------------------------------------ GNU C++ version 3.2 (ast-optimizer-branch) (i686-pc-linux-gnu) compiled by GNU C version 3.2. options passed: -fpreprocessed -g -g -O2 -Wall -Wno-format -W -Wwrite-strings -Winline -fno-implicit-templates -fdiagnostics-show-location=once -ffunction-sections -fdata-sections -fdump-translation-unit options enabled: -fdefer-pop -fomit-frame-pointer -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves -fpcc-struct-return -fgcse -fgcse-lm -fgcse-sm -floop-optimize -fcrossjumping -fif-conversion -fif-conversion2 -frerun-cse-after-loop -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg -fexceptions -freorder-blocks -freorder-functions -fcprop-registers -fcommon -ffunction-sections -fdata-sections -fgnu-linker -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing -fmerge-constants -fzero-initialized-in-bss -fident -fpeephole2 -fguess-branch-probability -fmath-errno -ftrapping-math -ftree-ssa -m80387 -mhard-float -mno-soft-float -mieee-fp -mfp-ret-in-387 -momit-leaf-frame-pointer -mcpu=pentiumpro -march=i386 std::exception::exception() std::exception::exception() std::exception::exception() std::bad_exception::bad_exception() std::bad_exception::bad_exception() std::bad_exception::bad_exception() std::bad_alloc::bad_alloc() std::bad_alloc::bad_alloc() std::bad_alloc::bad_alloc() void* operator new(unsigned int, void*) void* operator new [](unsigned int, void*) void operator delete(void*, void*) void operator delete [](void*, void*) void operator delete(void*) void operator delete(void*) Execution times (seconds) cfg cleanup : 0.01 ( 1%) usr 0.00 ( 0%) sys 0.00 ( 0%) wall life analysis : 0.01 ( 1%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall preprocessing : 0.00 ( 0%) usr 0.02 (10%) sys 0.00 ( 0%) wall lexical analysis : 0.02 ( 2%) usr 0.01 ( 5%) sys 0.00 ( 0%) wall parser : 0.18 (14%) usr 0.01 ( 5%) sys 0.27 (14%) wall expand : 0.01 ( 1%) usr 0.01 ( 5%) sys 0.01 ( 0%) wall varconst : 0.61 (46%) usr 0.08 (38%) sys 1.05 (55%) wall integration : 0.04 ( 3%) usr 0.01 ( 5%) sys 0.05 ( 3%) wall CSE : 0.01 ( 1%) usr 0.01 ( 5%) sys 0.02 ( 1%) wall branch prediction : 0.01 ( 1%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall combiner : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall mode switching : 0.00 ( 0%) usr 0.01 ( 5%) sys 0.00 ( 0%) wall local alloc : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall global alloc : 0.01 ( 1%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall flow 2 : 0.01 ( 1%) usr 0.00 ( 0%) sys 0.00 ( 0%) wall rename registers: 0.01 ( 1%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall scheduling 2 : 0.01 ( 1%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall final : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall symout : 0.03 ( 2%) usr 0.01 ( 5%) sys 0.04 ( 2%) wall rest of compilation:0.02 ( 2%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall TOTAL : 1.32 0.21 1.92 >How-To-Repeat: Build the tree-ssa branch from cvs. Then try the following compilation (adjust the path to just built cc1plus ) from the ./i686-pc-linux-gnu/libstdc++-v3/libsupc++ directory : /CurrentWorks/cvs/gcc/tree-ssa-branch/gcc/gcc/cc1plus -fpreprocessed del_op.ii -quiet -dumpbase del_op.cc -auxbase-strip del_op.o -g -O2 -Wall -Wno-format -W -Wwrite-strings -Winline -version -fno-implicit-templates -fdiagnostics-show-location=once -ffunction-sections -fdata-sections -fdump-translation-unit -o del_op.s The same compilation with a cc1plus compiled from the ast-optimizer branch will go fine. I've attached the del_op.ii file for preprocessing. >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="del_op.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="del_op.ii" IyAxICJkZWxfb3AuY2MiCiMgMSAiPGJ1aWx0LWluPiIKIyAxICI8Y29tbWFuZCBsaW5lPiIKIyAx ICJkZWxfb3AuY2MiCiMgMzEgImRlbF9vcC5jYyIKIyAxICJuZXciIDEKIyA0MSAibmV3IgojIDEg Ii9jeWdkcml2ZS9jL2RldmVsb3BtZW50L3Rlc3RpbmcvZ2NjL2djYy9pNjg2LXBjLWN5Z3dpbi9s aWJzdGRjKystdjMvaW5jbHVkZS9jc3RkZGVmIiAxCiMgNDcgIi9jeWdkcml2ZS9jL2RldmVsb3Bt ZW50L3Rlc3RpbmcvZ2NjL2djYy9pNjg2LXBjLWN5Z3dpbi9saWJzdGRjKystdjMvaW5jbHVkZS9j c3RkZGVmIiAzCgojIDEgIi9jeWdkcml2ZS9jL2RldmVsb3BtZW50L3Rlc3RpbmcvZ2NjL2djYy9n Y2MvaW5jbHVkZS9zdGRkZWYuaCIgMSAzIDQKIyAxNTEgIi9jeWdkcml2ZS9jL2RldmVsb3BtZW50 L3Rlc3RpbmcvZ2NjL2djYy9nY2MvaW5jbHVkZS9zdGRkZWYuaCIgMyA0CnR5cGVkZWYgaW50IHB0 cmRpZmZfdDsKIyAyMTMgIi9jeWdkcml2ZS9jL2RldmVsb3BtZW50L3Rlc3RpbmcvZ2NjL2djYy9n Y2MvaW5jbHVkZS9zdGRkZWYuaCIgMyA0CnR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKIyA0 OSAiL2N5Z2RyaXZlL2MvZGV2ZWxvcG1lbnQvdGVzdGluZy9nY2MvZ2NjL2k2ODYtcGMtY3lnd2lu L2xpYnN0ZGMrKy12My9pbmNsdWRlL2NzdGRkZWYiIDIgMwoKbmFtZXNwYWNlIHN0ZAp7CiAgdXNp bmcgOjpwdHJkaWZmX3Q7CiAgdXNpbmcgOjpzaXplX3Q7Cn0KIyA0MiAibmV3IiAyCiMgMSAiLi4v bGlic3VwYysrL2V4Y2VwdGlvbiIgMQojIDQwICIuLi9saWJzdXBjKysvZXhjZXB0aW9uIgpleHRl cm4gIkMrKyIgewoKbmFtZXNwYWNlIHN0ZAp7CiMgNTIgIi4uL2xpYnN1cGMrKy9leGNlcHRpb24i CiAgY2xhc3MgZXhjZXB0aW9uCiAgewogIHB1YmxpYzoKICAgIGV4Y2VwdGlvbigpIHRocm93KCkg eyB9CiAgICB2aXJ0dWFsIH5leGNlcHRpb24oKSB0aHJvdygpOwoKCiAgICB2aXJ0dWFsIGNvbnN0 IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpOwogIH07CgoKCiAgY2xhc3MgYmFkX2V4Y2VwdGlv biA6IHB1YmxpYyBleGNlcHRpb24KICB7CiAgcHVibGljOgogICAgYmFkX2V4Y2VwdGlvbigpIHRo cm93KCkgeyB9CgoKICAgIHZpcnR1YWwgfmJhZF9leGNlcHRpb24oKSB0aHJvdygpOwogIH07CgoK ICB0eXBlZGVmIHZvaWQgKCp0ZXJtaW5hdGVfaGFuZGxlcikgKCk7CgogIHR5cGVkZWYgdm9pZCAo KnVuZXhwZWN0ZWRfaGFuZGxlcikgKCk7CgoKICB0ZXJtaW5hdGVfaGFuZGxlciBzZXRfdGVybWlu YXRlKHRlcm1pbmF0ZV9oYW5kbGVyKSB0aHJvdygpOwoKCiAgdm9pZCB0ZXJtaW5hdGUoKSBfX2F0 dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CgoKICB1bmV4cGVjdGVkX2hhbmRsZXIgc2V0X3Vu ZXhwZWN0ZWQodW5leHBlY3RlZF9oYW5kbGVyKSB0aHJvdygpOwoKCiAgdm9pZCB1bmV4cGVjdGVk KCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwojIDEwMCAiLi4vbGlic3VwYysrL2V4 Y2VwdGlvbiIKICBib29sIHVuY2F1Z2h0X2V4Y2VwdGlvbigpIHRocm93KCk7Cn0KCm5hbWVzcGFj ZSBfX2dudV9jeHgKewojIDExMyAiLi4vbGlic3VwYysrL2V4Y2VwdGlvbiIKICB2b2lkIF9fdmVy Ym9zZV90ZXJtaW5hdGVfaGFuZGxlciAoKTsKfQoKfQojIDQzICJuZXciIDIKCmV4dGVybiAiQysr IiB7CgpuYW1lc3BhY2Ugc3RkCnsKCgoKCgogIGNsYXNzIGJhZF9hbGxvYyA6IHB1YmxpYyBleGNl cHRpb24KICB7CiAgcHVibGljOgogICAgYmFkX2FsbG9jKCkgdGhyb3coKSB7IH0KCgogICAgdmly dHVhbCB+YmFkX2FsbG9jKCkgdGhyb3coKTsKICB9OwoKICBzdHJ1Y3Qgbm90aHJvd190IHsgfTsK ICBleHRlcm4gY29uc3Qgbm90aHJvd190IG5vdGhyb3c7CgoKICB0eXBlZGVmIHZvaWQgKCpuZXdf aGFuZGxlcikoKTsKCiAgbmV3X2hhbmRsZXIgc2V0X25ld19oYW5kbGVyKG5ld19oYW5kbGVyKSB0 aHJvdygpOwp9CiMgODIgIm5ldyIKdm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90KSB0aHJv dyAoc3RkOjpiYWRfYWxsb2MpOwp2b2lkKiBvcGVyYXRvciBuZXdbXShzdGQ6OnNpemVfdCkgdGhy b3cgKHN0ZDo6YmFkX2FsbG9jKTsKdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopIHRocm93KCk7 CnZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCopIHRocm93KCk7CnZvaWQqIG9wZXJhdG9yIG5l dyhzdGQ6OnNpemVfdCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpOwp2b2lkKiBvcGVy YXRvciBuZXdbXShzdGQ6OnNpemVfdCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpOwp2 b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygp Owp2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRo cm93KCk7CgoKaW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCwgdm9pZCogX19w KSB0aHJvdygpIHsgcmV0dXJuIF9fcDsgfQppbmxpbmUgdm9pZCogb3BlcmF0b3IgbmV3W10oc3Rk OjpzaXplX3QsIHZvaWQqIF9fcCkgdGhyb3coKSB7IHJldHVybiBfX3A7IH0KCgppbmxpbmUgdm9p ZCBvcGVyYXRvciBkZWxldGUgKHZvaWQqLCB2b2lkKikgdGhyb3coKSB7IH07CmlubGluZSB2b2lk IG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCB2b2lkKikgdGhyb3coKSB7IH07Cgp9CiMgMzIgImRl bF9vcC5jYyIgMgoKZXh0ZXJuICJDIiB2b2lkIGZyZWUgKHZvaWQgKik7Cgp2b2lkCm9wZXJhdG9y IGRlbGV0ZSAodm9pZCAqcHRyKSB0aHJvdyAoKQp7CiAgaWYgKHB0cikKICAgIGZyZWUgKHB0cik7 Cn0K From gcc-prs-return-23877-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 13:16:07 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 30045 invoked by alias); 2 Nov 2002 13:16:05 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 30002 invoked by uid 71); 2 Nov 2002 13:16:04 -0000 Date: 2 Nov 2002 13:16:04 -0000 Message-ID: <20021102131604.29995.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Nicholas Wourms Subject: Re: libstdc++/7849: libstdc++.so: undefined reference to std::messages::do_get[...] causes failure during building of abi_check Reply-To: Nicholas Wourms The following reply was made to PR libstdc++/7849; it has been noted by GNATS. From: Nicholas Wourms To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-gnats@gcc.gnu.org Cc: Subject: Re: libstdc++/7849: libstdc++.so: undefined reference to std::messages::do_get[...] causes failure during building of abi_check Date: Sat, 02 Nov 2002 08:05:39 -0500 bkoz@gcc.gnu.org wrote: > Synopsis: libstdc++.so: undefined reference to std::messages::do_get[...] causes failure during building of abi_check > > Responsible-Changed-From-To: unassigned->bkoz > Responsible-Changed-By: bkoz > Responsible-Changed-When: Fri Nov 1 17:49:39 2002 > Responsible-Changed-Why: > Mine. > State-Changed-From-To: open->analyzed > State-Changed-By: bkoz > State-Changed-When: Fri Nov 1 17:49:39 2002 > State-Changed-Why: > Can you confirm that this is still an issue? > > I'm unable to reproduce this with today's gcc, and ld as of: > > %ld --version > GNU ld version 2.13.90 20021027 > > -benjamin Sorry, yes this was fixed awile ago (probably before anyone even got to this report). Sorry for not closing it out. Cheers, Nicholas From gcc-prs-return-23878-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 15:02:20 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12236 invoked by alias); 2 Nov 2002 15:02:18 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12177 invoked by uid 61); 2 Nov 2002 15:02:18 -0000 Date: 2 Nov 2002 15:02:18 -0000 Message-ID: <20021102150218.12176.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nwourms@netscape.net From: bkoz@gcc.gnu.org Reply-To: bkoz@gcc.gnu.org, bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nwourms@netscape.net, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/7849: libstdc++.so: undefined reference to std::messages::do_get[...] causes failure during building of abi_check Synopsis: libstdc++.so: undefined reference to std::messages::do_get[...] causes failure during building of abi_check State-Changed-From-To: analyzed->closed State-Changed-By: bkoz State-Changed-When: Sat Nov 2 07:02:18 2002 State-Changed-Why: By request. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7849 From gcc-prs-return-23879-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 15:22:23 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 1342 invoked by alias); 2 Nov 2002 15:22:22 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 1311 invoked by uid 61); 2 Nov 2002 15:22:22 -0000 Date: 2 Nov 2002 15:22:22 -0000 Message-ID: <20021102152222.1309.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mdupont777@yahoo.com, nobody@gcc.gnu.org From: lerdsuwa@gcc.gnu.org Reply-To: lerdsuwa@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mdupont777@yahoo.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: pending/8425: [ssa branch]Fwd: [Introspector-developers] Build instructions for the cywin ssa branch Synopsis: [ssa branch]Fwd: [Introspector-developers] Build instructions for the cywin ssa branch State-Changed-From-To: open->closed State-Changed-By: lerdsuwa State-Changed-When: Sat Nov 2 07:22:21 2002 State-Changed-Why: A formal bug report of this issue is filed as PR8428. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8425 From gcc-prs-return-23880-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 15:46:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21402 invoked by alias); 2 Nov 2002 15:46:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21377 invoked by uid 71); 2 Nov 2002 15:46:01 -0000 Date: 2 Nov 2002 15:46:01 -0000 Message-ID: <20021102154601.21370.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Ray Lischner Subject: Re: c++/8427: internal error on ambiguous function template Reply-To: Ray Lischner The following reply was made to PR c++/8427; it has been noted by GNATS. From: Ray Lischner To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Cc: Subject: Re: c++/8427: internal error on ambiguous function template Date: Sat, 2 Nov 2002 07:43:57 -0800 --------------Boundary-00=_91HYFASQ54ZWRRDTY1SH Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit On Friday 01 November 2002 03:35 pm, you wrote: > Synopsis: internal error on ambiguous function template > > State-Changed-From-To: open->feedback > State-Changed-By: bangerth > State-Changed-When: Fri Nov 1 15:35:32 2002 > State-Changed-Why: > Please send us a testcase according to the Web page > referenced in the compiler error > > http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&databas >e=gcc&pr=8427 Your file attachment feature seems not to be working. Here is the file again. -- Ray Lischner, author of C++ in a Nutshell (forthcoming) (http://www.tempest-sw.com/cpp/) --------------Boundary-00=_91HYFASQ54ZWRRDTY1SH Content-Type: text/x-c++src; charset="iso-8859-1"; name="gcc01.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="gcc01.cpp" template struct g {}; template void f(g) { } template void f(g) { } int main() { f<4,2>(g<4/2>()); } --------------Boundary-00=_91HYFASQ54ZWRRDTY1SH-- From gcc-prs-return-23881-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 15:46:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21449 invoked by alias); 2 Nov 2002 15:46:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21408 invoked by uid 71); 2 Nov 2002 15:46:02 -0000 Date: 2 Nov 2002 15:46:02 -0000 Message-ID: <20021102154602.21406.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Marco Bernardo Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Reply-To: Marco Bernardo The following reply was made to PR c/8395; it has been noted by GNATS. From: Marco Bernardo To: Bruce Allen Cc: Bruce Allen , , , , Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Date: Sat, 2 Nov 2002 16:42:46 +0100 (CET) On Thu, 31 Oct 2002, Bruce Allen wrote: >It's not an argument, it's simply the facts. Please read the materials >that I refered you to. Ok, let us suppose that for the following program prova.c #include int main(void) { double x, y, z, y_times_z; x = -6.0; y = -1.2; z = 5; y_times_z = y * z; printf("%g %g %g %g %g %g\n", x, y, z, x - y * z, y_times_z, x - y_times_z); return(0); } compiled with gcc -ansi -Wall prova.c -o prova on an intel machine, the following output -6 -1.2 5 -2.22045e-16 -6 0 ^^^^^^^^^^^^ is not a bug, but simply a consequence of the adoption of the IEEE 754 standard for floating point numbers. Now, I see two problems: 1. Some colleagues of mine tried to compile and run the same program on other platforms, in particular on a sparc machine, and the output turned out to be -6 -1.2 5 0 -6 0 Why is that? Isn't the IEEE 754 standard adopted on sparc machines? 2. I hope we all agree on the fact that the output produced by a (sequential) C program is the same for a given input, regardless of the compilation options that are used. (If not, the compiler would not be compliant with the semantics). Now, try to compile the program above with gcc -ansi -Wall -O prova.c -o prova on an intel machine, i.e. try to set the code optimization option. In such a case the output turns out to be -6 -1.2 5 0 -6 0 i.e. the right value 0 is obtained instead of the wrong -2.22045e-16. This is a clear evidence that gcc contains a serious bug that should be fixed asap (in the right way, i.e. according to the output obtained by setting option -O). Let me conclude by saying that my intention is not to be polemic. My point of view is that of a university professor who wants to teach to his students that there is a great alternative to Microsoft, which is Linux and the free software world. You would then understand that it is very difficult for me to support gcc and to teach my students how to use gcc in the presence of such a strange behavior, which is not justifiable at all on a scientific basis. Best regards, Marco @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Prof. Marco Bernardo Universita` di Urbino Centro per l'Applicazione delle Scienze e Tecnologie dell'Informazione Piazza della Repubblica 13, 61029 Urbino, Italy Phone: +39-0722-4475 - E-mail: bernardo@sti.uniurb.it Fax: +39-0722-4475 - WWW: http://www.sti.uniurb.it/bernardo/ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ From gcc-prs-return-23882-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 15:56:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 28385 invoked by alias); 2 Nov 2002 15:56:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 28369 invoked by uid 71); 2 Nov 2002 15:56:01 -0000 Date: 2 Nov 2002 15:56:01 -0000 Message-ID: <20021102155601.28368.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Toon Moene Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Reply-To: Toon Moene The following reply was made to PR c/8395; it has been noted by GNATS. From: Toon Moene To: Marco Bernardo Cc: Bruce Allen , Bruce Allen , gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Date: Sat, 02 Nov 2002 16:56:04 +0100 Marco Bernardo wrote: > 1. Some colleagues of mine tried to compile and run the same program > on other platforms, in particular on a sparc machine, and the output > turned out to be > -6 -1.2 5 0 -6 0 > Why is that? Isn't the IEEE 754 standard adopted on sparc machines? Yes. For further explanations, see the "Further Readings" item on our home page: http://gcc.gnu.org -> "Further Readings" (left column) -> Differences among IEEE 754 implementations (by Doug Priest) -- Toon Moene - mailto:toon@moene.indiv.nluug.nl - phoneto: +31 346 214290 Saturnushof 14, 3738 XG Maartensdijk, The Netherlands Maintainer, GNU Fortran 77: http://gcc.gnu.org/onlinedocs/g77_news.html Join GNU Fortran 95: http://g95.sourceforge.net/ (under construction) From gcc-prs-return-23883-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 16:26:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21319 invoked by alias); 2 Nov 2002 16:26:00 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21292 invoked by uid 71); 2 Nov 2002 16:26:00 -0000 Date: 2 Nov 2002 16:26:00 -0000 Message-ID: <20021102162600.21287.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Tim Prince Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Reply-To: Tim Prince The following reply was made to PR c/8395; it has been noted by GNATS. From: Tim Prince To: Marco Bernardo , Bruce Allen Cc: Bruce Allen , , , , Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Date: Sat, 2 Nov 2002 08:15:47 -0800 On Saturday 02 November 2002 07:42, Marco Bernardo wrote: > Let me conclude by saying that my intention is not to be polemic. > My point of view is that of a university professor who wants to teach > to his students that there is a great alternative to Microsoft, > which is Linux and the free software world. > You would then understand that it is very difficult for me to support gcc > and to teach my students how to use gcc in the presence of such a strange > behavior, which is not justifiable at all on a scientific basis. > > From a professorial point of view, you should be encouraging your students to consult expert references on floating point numerics, even if you don't care to do so yourself. Before you start arguing about IEEE standards and scientific bases, you should be reading up on them, and the technical reasons for including the extended precision option. If you are teaching at this level of detail, you could show your students how to set 53-bit rounding mode in order to duplicate the fpu settings of Microsoft compilers, how to use fpu mode settings to test code reliability, and how to break the Microsoft compiler by putting the fpu in standard default mode. As standard C does not define a function for this purpose, the C committee must not have considered it to be as large an issue as you. -- Tim Prince From gcc-prs-return-23884-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 16:26:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21393 invoked by alias); 2 Nov 2002 16:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21343 invoked by uid 71); 2 Nov 2002 16:26:01 -0000 Date: 2 Nov 2002 16:26:01 -0000 Message-ID: <20021102162601.21340.qmail@sources.redhat.com> To: bkoz@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: "Christian Ehrhardt" Subject: Re: libstdc++/8197: std::sin(float) causes undefined reference to sinf Reply-To: "Christian Ehrhardt" The following reply was made to PR libstdc++/8197; it has been noted by GNATS. From: "Christian Ehrhardt" To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Cc: Subject: Re: libstdc++/8197: std::sin(float) causes undefined reference to sinf Date: Sat, 2 Nov 2002 17:23:31 +0100 On Fri, Nov 01, 2002 at 05:44:03PM -0000, bkoz@gcc.gnu.org wrote: > Synopsis: std::sin(float) causes undefined reference to sinf > > Responsible-Changed-From-To: unassigned->bkoz > Responsible-Changed-By: bkoz > Responsible-Changed-When: Fri Nov 1 09:44:03 2002 > Responsible-Changed-Why: > Mine. > State-Changed-From-To: open->feedback > State-Changed-By: bkoz > State-Changed-When: Fri Nov 1 09:44:03 2002 > State-Changed-Why: > Applied (slightly modified) patch. > > http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8197 Thanks. I checked out latest CVS last night and this problem is fixed in gcc version 3.3 20021101 (experimental). Technically this is a regression from 2.95.3. __builtin_sinf didn't work there, either but the cmath header didn't use __builtin_sinf. regards Christian -- THAT'S ALL FOLKS! From gcc-prs-return-23885-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 16:36:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24798 invoked by alias); 2 Nov 2002 16:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24762 invoked by uid 71); 2 Nov 2002 16:36:01 -0000 Resent-Date: 2 Nov 2002 16:36:01 -0000 Resent-Message-ID: <20021102163601.24760.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, sefer@hotmail.com Received: (qmail 792 invoked by uid 61); 2 Nov 2002 16:28:57 -0000 Message-Id: <20021102162857.790.qmail@sources.redhat.com> Date: 2 Nov 2002 16:28:57 -0000 From: sefer@hotmail.com Reply-To: sefer@hotmail.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: libstdc++/8429: Found a memory leak in libstdc++-v3 >Number: 8429 >Category: libstdc++ >Synopsis: Found a memory leak in libstdc++-v3 >Confidential: no >Severity: non-critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sat Nov 02 08:36:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: sefer@hotmail.com >Release: libstdc++-v3 (with gcc-3.2) >Organization: >Environment: Linux Mandrake 9.0 on x86 >Description: Apparently I have uncovered a memory leak in the recent libstc++. Here's a very small test program that was compiled using g++ 3.2 on a x86 Linux machine. #include #include using namespace std; int main() { string aaa("a"); return 0; } Running this program under valgrind (both 1.0.4 and 1.1.0) revealed the following report: > g++ -g2 test.cc > valgrind --leak-check=yes --show-reachable=yes ./a.out ==15525== Memcheck, a.k.a. Valgrind, a memory error detector for x86-linux. ==15525== Copyright (C) 2000-2002, and GNU GPL'd, by Julian Seward. ==15525== Using valgrind-1.1.0, a program instrumentation system for x86-linux. ==15525== Copyright (C) 2000-2002, and GNU GPL'd, by Julian Seward. ==15525== Estimated CPU clock rate is 1999 MHz ==15525== For more details, rerun with: -v ==15525== ==15525== ==15525== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) ==15525== malloc/free: in use at exit: 640 bytes in 1 blocks. ==15525== malloc/free: 1 allocs, 0 frees, 640 bytes allocated. ==15525== For counts of detected errors, rerun with: -v ==15525== searching for pointers to 1 not-freed blocks. ==15525== checked 4438348 bytes. ==15525== ==15525== definitely lost: 0 bytes in 0 blocks. ==15525== possibly lost: 0 bytes in 0 blocks. ==15525== still reachable: 640 bytes in 1 blocks. ==15525== ==15525== 640 bytes in 1 blocks are still reachable in loss record 1 of 1 ==15525== at 0x40159F4B: __builtin_new (in /opt/valgrind/lib/valgrind/valgrind.so) ==15525== by 0x40159F87: operator new(unsigned) (vg_clientfuncs.c:140) ==15525== by 0x4029FBEE: std::__new_alloc::allocate(unsigned) (in /usr/lib/libstdc++.so.5.0.0) ==15525== by 0x4029F7F3: ??? (/home/zvi/t/gcc-3.2/libstdc++-v3/include/bits/stl_alloc.h:481) ==15525== ==15525== LEAK SUMMARY: ==15525== definitely lost: 0 bytes in 0 blocks. ==15525== possibly lost: 0 bytes in 0 blocks. ==15525== still reachable: 640 bytes in 1 blocks. ==15525== Sjowing, that some memory was allocated but was never freed (even when the program had completed its running). It is possible that the allocator allocates and releases memory during a program's lifetime (maintaining a memory "cache"). However, the proper behaviour for it would be to release all allocated memory at program exit. This is the stack trace to the allocation call that had never released its memory: __libc_start_main main basic_string _S_construct _S_construct_aux char* std::string::_S_construct(char const*, char const*, std::allocator const&, std::forward.......) std::string::_Rep::_S_create(unsigned, std::allocator const&) std::allocator::allocate(unsigned, void const *) std::__default_alloc_template::allocate(unsigned) std::__default_alloc_template::_S_refill(unsigned) std::__default_alloc_template::_S_chunk_alloc(unsigned, int &) Now since the memory allocation is global resource, one could possibly create a global object that during its destruction (when the program ends) would clean up all the existing "chunks" of memory, so that the program exits cleanly. I'd care to hear if anyone had noticed this problem, or have devised some solutions (otherwise, good memory leak detectors would always report leaks on programs using STL). Thanks, Sefer. >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23886-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 17:06:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24259 invoked by alias); 2 Nov 2002 17:06:00 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24207 invoked by uid 71); 2 Nov 2002 17:06:00 -0000 Resent-Date: 2 Nov 2002 17:06:00 -0000 Resent-Message-ID: <20021102170600.24205.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, bkoz@redhat.com, nathan@codesourcery.com Resent-Reply-To: gcc-gnats@gcc.gnu.org, sefer@hotmail.com Received: (qmail 2620 invoked by uid 61); 2 Nov 2002 17:01:06 -0000 Message-Id: <20021102170106.2619.qmail@sources.redhat.com> Date: 2 Nov 2002 17:01:06 -0000 From: sefer@hotmail.com Reply-To: sefer@hotmail.com To: gcc-gnats@gcc.gnu.org Cc: bkoz@redhat.com, nathan@codesourcery.com X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) X-GNATS-Notify: bkoz@redhat.com nathan@codesourcery.com Subject: libstdc++/8430: Found a memory leak in libstdc++-v3 >Number: 8430 >Category: libstdc++ >Synopsis: Found a memory leak in libstdc++-v3 >Confidential: no >Severity: non-critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sat Nov 02 09:06:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: sefer@hotmail.com >Release: libstdc++-v3 (with gcc-3.2) >Organization: >Environment: Linux Mandrake 9.0 on x86 >Description: Apparently I have uncovered a memory leak in the recent libstc++. Here's a very small test program that was compiled using g++ 3.2 on a x86 Linux machine. #include #include using namespace std; int main() { string aaa("a"); return 0; } Running this program under valgrind (both 1.0.4 and 1.1.0) revealed the following report: > g++ -g2 test.cc > valgrind --leak-check=yes --show-reachable=yes ./a.out ==15525== Memcheck, a.k.a. Valgrind, a memory error detector for x86-linux. ==15525== Copyright (C) 2000-2002, and GNU GPL'd, by Julian Seward. ==15525== Using valgrind-1.1.0, a program instrumentation system for x86-linux. ==15525== Copyright (C) 2000-2002, and GNU GPL'd, by Julian Seward. ==15525== Estimated CPU clock rate is 1999 MHz ==15525== For more details, rerun with: -v ==15525== ==15525== ==15525== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) ==15525== malloc/free: in use at exit: 640 bytes in 1 blocks. ==15525== malloc/free: 1 allocs, 0 frees, 640 bytes allocated. ==15525== For counts of detected errors, rerun with: -v ==15525== searching for pointers to 1 not-freed blocks. ==15525== checked 4438348 bytes. ==15525== ==15525== definitely lost: 0 bytes in 0 blocks. ==15525== possibly lost: 0 bytes in 0 blocks. ==15525== still reachable: 640 bytes in 1 blocks. ==15525== ==15525== 640 bytes in 1 blocks are still reachable in loss record 1 of 1 ==15525== at 0x40159F4B: __builtin_new (in /opt/valgrind/lib/valgrind/valgrind.so) ==15525== by 0x40159F87: operator new(unsigned) (vg_clientfuncs.c:140) ==15525== by 0x4029FBEE: std::__new_alloc::allocate(unsigned) (in /usr/lib/libstdc++.so.5.0.0) ==15525== by 0x4029F7F3: ??? (/home/zvi/t/gcc-3.2/libstdc++-v3/include/bits/stl_alloc.h:481) ==15525== ==15525== LEAK SUMMARY: ==15525== definitely lost: 0 bytes in 0 blocks. ==15525== possibly lost: 0 bytes in 0 blocks. ==15525== still reachable: 640 bytes in 1 blocks. ==15525== Sjowing, that some memory was allocated but was never freed (even when the program had completed its running). It is possible that the allocator allocates and releases memory during a program's lifetime (maintaining a memory "cache"). However, the proper behaviour for it would be to release all allocated memory at program exit. This is the stack trace to the allocation call that had never released its memory: __libc_start_main main basic_string _S_construct _S_construct_aux char* std::string::_S_construct(char const*, char const*, std::allocator const&, std::forward.......) std::string::_Rep::_S_create(unsigned, std::allocator const&) std::allocator::allocate(unsigned, void const *) std::__default_alloc_template::allocate(unsigned) std::__default_alloc_template::_S_refill(unsigned) std::__default_alloc_template::_S_chunk_alloc(unsigned, int &) Now since the memory allocation is global resource, one could possibly create a global object that during its destruction (when the program ends) would clean up all the existing "chunks" of memory, so that the program exits cleanly. I'd care to hear if anyone had noticed this problem, or have devised some solutions (otherwise, good memory leak detectors would always report leaks on programs using STL). Thanks, Sefer. >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23887-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 18:06:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 13057 invoked by alias); 2 Nov 2002 18:06:00 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 13029 invoked by uid 71); 2 Nov 2002 18:06:00 -0000 Date: 2 Nov 2002 18:06:00 -0000 Message-ID: <20021102180600.13022.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: "B. Kosnik" Subject: Re: libstdc++/8430: Found a memory leak in libstdc++-v3 Reply-To: "B. Kosnik" The following reply was made to PR libstdc++/8430; it has been noted by GNATS. From: "B. Kosnik" To: sefer@hotmail.com Cc: gcc-gnats@gcc.gnu.org, bkoz@redhat.com, nathan@codesourcery.com Subject: Re: libstdc++/8430: Found a memory leak in libstdc++-v3 Date: Sat, 2 Nov 2002 12:00:30 -0600 Don't use the default allocators. GLIBCPP_FORCE_NEW http://gcc.gnu.org/onlinedocs/libstdc++/ext/howto.html#6 From gcc-prs-return-23888-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 18:08:06 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21478 invoked by alias); 2 Nov 2002 18:08:05 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21449 invoked by uid 61); 2 Nov 2002 18:08:05 -0000 Date: 2 Nov 2002 18:08:05 -0000 Message-ID: <20021102180805.21447.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, sefer@hotmail.com From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, sefer@hotmail.com, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8429: Found a memory leak in libstdc++-v3 Synopsis: Found a memory leak in libstdc++-v3 State-Changed-From-To: open->closed State-Changed-By: paolo State-Changed-When: Sat Nov 2 10:08:05 2002 State-Changed-Why: Exact duplicate of libstdc++/8430. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8429 From gcc-prs-return-23889-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 20:48:39 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 3570 invoked by alias); 2 Nov 2002 20:48:38 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 3551 invoked by uid 61); 2 Nov 2002 20:48:38 -0000 Date: 2 Nov 2002 20:48:38 -0000 Message-ID: <20021102204838.3550.qmail@sources.redhat.com> To: brister@pobox.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, brister@pobox.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8231: iostream header position causes bad code generation Synopsis: iostream header position causes bad code generation State-Changed-From-To: open->feedback State-Changed-By: paolo State-Changed-When: Sat Nov 2 12:48:37 2002 State-Changed-Why: I can reproduce the problem on i686-pc-linux-gnu from your preprocessed file. However, could you possibly provide also the plain source and describe the problem referring to specific line numbers of it? This would speed-up the processing of the PR. Thanks, Paolo. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8231 From gcc-prs-return-23890-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 21:16:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 30444 invoked by alias); 2 Nov 2002 21:16:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 30414 invoked by uid 71); 2 Nov 2002 21:16:01 -0000 Date: 2 Nov 2002 21:16:00 -0000 Message-ID: <20021102211600.30407.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: brister@nominum.com Subject: Re: libstdc++/8231: iostream header position causes bad code generation Reply-To: brister@nominum.com The following reply was made to PR libstdc++/8231; it has been noted by GNATS. From: brister@nominum.com To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Cc: Subject: Re: libstdc++/8231: iostream header position causes bad code generation Date: Sat, 2 Nov 2002 22:06:20 +0100 I'm sorry, but I don't have the original any more. It was under rapid change so I merged the files together and made it as simple as possible to show the bug. > Synopsis: iostream header position causes bad code generation > State-Changed-From-To: open->feedback > State-Changed-By: paolo > State-Changed-When: Sat Nov 2 12:48:37 2002 > State-Changed-Why: > I can reproduce the problem on i686-pc-linux-gnu from > your preprocessed file. > However, could you possibly provide also the plain source > and describe the problem referring to specific line > numbers of it? This would speed-up the processing of the PR. > Thanks, Paolo. > http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8231 -- James Brister brister@nominum.com Nominum Inc. From gcc-prs-return-23891-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 21:34:30 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 14943 invoked by alias); 2 Nov 2002 21:34:28 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14858 invoked by uid 61); 2 Nov 2002 21:34:27 -0000 Date: 2 Nov 2002 21:34:27 -0000 Message-ID: <20021102213427.14856.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, green@build.tokyo.redhat.com, java-prs@gcc.gnu.org, nobody@gcc.gnu.org, tromey@gcc.gnu.org From: tromey@gcc.gnu.org Reply-To: tromey@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, green@build.tokyo.redhat.com, java-prs@gcc.gnu.org, nobody@gcc.gnu.org, tromey@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: java/8415: reflection bug: exception info for Method Synopsis: reflection bug: exception info for Method Responsible-Changed-From-To: unassigned->tromey Responsible-Changed-By: tromey Responsible-Changed-When: Sat Nov 2 13:34:27 2002 Responsible-Changed-Why: I'm handling this State-Changed-From-To: open->closed State-Changed-By: tromey State-Changed-When: Sat Nov 2 13:34:27 2002 State-Changed-Why: I've checked in the fix http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8415 From gcc-prs-return-23892-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 21:36:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21298 invoked by alias); 2 Nov 2002 21:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21278 invoked by uid 71); 2 Nov 2002 21:36:00 -0000 Date: 2 Nov 2002 21:36:00 -0000 Message-ID: <20021102213600.21272.qmail@sources.redhat.com> To: tromey@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: tromey@gcc.gnu.org Subject: java/6388 Reply-To: tromey@gcc.gnu.org The following reply was made to PR java/6388; it has been noted by GNATS. From: tromey@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: java/6388 Date: 2 Nov 2002 21:26:28 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: tromey@gcc.gnu.org 2002-11-02 13:26:28 Modified files: gcc/java : ChangeLog decl.c java-tree.h lex.c lex.h Log message: Fix for PR java/6388. * lex.h (JAVA_INTEGRAL_RANGE_ERROR): Wrap in do...while. * java-tree.h (enum java_tree_index): New values JTI_DECIMAL_INT_MAX_NODE, JTI_DECIMAL_LONG_MAX_NODE. (decimal_int_max, decimal_long_max): New defines. * lex.c (yylex): Rewrote range checking. Sign extend literals. (error_if_numeric_overflow): Rewrote range checking. * decl.c (java_init_decl_processing): Initialize decimal_int_max, decimal_long_max. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/ChangeLog.diff?cvsroot=gcc&r1=1.1077&r2=1.1078 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/decl.c.diff?cvsroot=gcc&r1=1.132&r2=1.133 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/java-tree.h.diff?cvsroot=gcc&r1=1.158&r2=1.159 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/lex.c.diff?cvsroot=gcc&r1=1.92&r2=1.93 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/lex.h.diff?cvsroot=gcc&r1=1.26&r2=1.27 From gcc-prs-return-23893-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 21:36:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21374 invoked by alias); 2 Nov 2002 21:36:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21305 invoked by uid 71); 2 Nov 2002 21:36:01 -0000 Date: 2 Nov 2002 21:36:01 -0000 Message-ID: <20021102213601.21303.qmail@sources.redhat.com> To: tromey@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: tromey@gcc.gnu.org Subject: java/8415 Reply-To: tromey@gcc.gnu.org The following reply was made to PR java/8415; it has been noted by GNATS. From: tromey@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: java/8415 Date: 2 Nov 2002 21:33:30 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: tromey@gcc.gnu.org 2002-11-02 13:33:30 Modified files: libjava : ChangeLog prims.cc libjava/java/lang/reflect: natMethod.cc Log message: For PR java/8415: * java/lang/reflect/natMethod.cc (getType): Use _Jv_FindClass. * prims.cc (_Jv_FindClassFromSignature): Indentation fix. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/ChangeLog.diff?cvsroot=gcc&r1=1.1500&r2=1.1501 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/prims.cc.diff?cvsroot=gcc&r1=1.73&r2=1.74 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/lang/reflect/natMethod.cc.diff?cvsroot=gcc&r1=1.29&r2=1.30 From gcc-prs-return-23894-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 21:36:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21392 invoked by alias); 2 Nov 2002 21:36:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21350 invoked by uid 71); 2 Nov 2002 21:36:01 -0000 Date: 2 Nov 2002 21:36:01 -0000 Message-ID: <20021102213601.21349.qmail@sources.redhat.com> To: tromey@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: tromey@gcc.gnu.org Subject: java/8415 Reply-To: tromey@gcc.gnu.org The following reply was made to PR java/8415; it has been noted by GNATS. From: tromey@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: java/8415 Date: 2 Nov 2002 21:33:54 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: tromey@gcc.gnu.org 2002-11-02 13:33:54 Modified files: gcc/java : ChangeLog class.c Log message: * class.c (make_method_value): Put class name, not signature, into `throws' field. For PR java/8415. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/ChangeLog.diff?cvsroot=gcc&r1=1.1079&r2=1.1080 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/class.c.diff?cvsroot=gcc&r1=1.136&r2=1.137 From gcc-prs-return-23895-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 21:43:31 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 17597 invoked by alias); 2 Nov 2002 21:43:30 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 17573 invoked by uid 61); 2 Nov 2002 21:43:30 -0000 Date: 2 Nov 2002 21:43:30 -0000 Message-ID: <20021102214330.17572.qmail@sources.redhat.com> To: brister@pobox.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, ljrittle@gcc.gnu.org, nobody@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, brister@pobox.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, ljrittle@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8231: iostream header position causes bad code generation Synopsis: iostream header position causes bad code generation Responsible-Changed-From-To: unassigned->ljrittle Responsible-Changed-By: paolo Responsible-Changed-When: Sat Nov 2 13:43:29 2002 Responsible-Changed-Why: Loren, could you please have a look at this PR, which, if still an issue with current mainline and 3_2, seems definitely target specific? Thanks, Paolo. State-Changed-From-To: feedback->analyzed State-Changed-By: paolo State-Changed-When: Sat Nov 2 13:43:29 2002 State-Changed-Why: Of course my first tests on i686-pc-linux-gnu from freebsd4.6 preprocessed source are completely meaningless :-( Sorry. Anyway, this is the source I have: // ---------------------------------- //#include // *1* class A { public: A(const char *addr); std::ostream &print(std::ostream &ostr) const; private: long address; }; //#include // *2* std::ostream &operator<<(std::ostream &ostr, const A &addr) { return addr.print(ostr); } //#include // *3* std::ostream &A::print(std::ostream &ostr) const { return ostr << "OK"; } //#include // *4* A::A(const char *) { address = 0xa000001; } //#include // *5* int main(int argc, char **argv) { A a1("x"); std::cout << "result: " << a1 << std::endl; } // ------------------------------------- With current mainline and 3_2-branch on i686-pc-linux-gnu only including in // *1* leads to a succesfull compilation. In that case the run-time behaviour is Ok. paolo:~/Gcc/PRs/v3/Analyzed> a.out result: OK http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8231 From gcc-prs-return-23896-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 23:06:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 18369 invoked by alias); 2 Nov 2002 23:06:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 18319 invoked by uid 71); 2 Nov 2002 23:06:00 -0000 Date: 2 Nov 2002 23:06:00 -0000 Message-ID: <20021102230600.18317.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: dnovillo@gcc.gnu.org Subject: optimization/8423 Reply-To: dnovillo@gcc.gnu.org The following reply was made to PR optimization/8423; it has been noted by GNATS. From: dnovillo@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: optimization/8423 Date: 2 Nov 2002 22:58:54 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: dnovillo@gcc.gnu.org 2002-11-02 14:58:54 Modified files: gcc/testsuite : ChangeLog Added files: gcc/testsuite/gcc.c-torture/execute: builtin-constant.c Log message: PR optimization/8423 * gcc.c-torture/execute/builtin-constant.c: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.2196&r2=1.2197 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/builtin-constant.c.diff?cvsroot=gcc&r1=NONE&r2=1.1 From gcc-prs-return-23897-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 23:06:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 18458 invoked by alias); 2 Nov 2002 23:06:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 18402 invoked by uid 71); 2 Nov 2002 23:06:01 -0000 Date: 2 Nov 2002 23:06:01 -0000 Message-ID: <20021102230601.18399.qmail@sources.redhat.com> To: pme@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Phil Edwards Subject: Re: libstdc++/7691: --enable-cxx-flags configure option broken Reply-To: Phil Edwards The following reply was made to PR libstdc++/7691; it has been noted by GNATS. From: Phil Edwards To: bkoz@gcc.gnu.org, 7zbuodeyr001@sneakemail.com, gcc-bugs@gcc.gnu.org, pme@gcc.gnu.org, gcc-gnats@gcc.gnu.org Cc: Subject: Re: libstdc++/7691: --enable-cxx-flags configure option broken Date: Sat, 2 Nov 2002 18:01:11 -0500 On Sat, Nov 02, 2002 at 01:50:46AM -0000, bkoz@gcc.gnu.org wrote: > Synopsis: --enable-cxx-flags configure option broken > > State-Changed-From-To: analyzed->feedback > State-Changed-By: bkoz > State-Changed-When: Fri Nov 1 17:50:45 2002 > State-Changed-Why: > I think this has been fixed, correct? None of the proposed patches have been applied to the top-level configury. The continued cleanups may have fixed it as an accidental side-effect, but I haven't tested it. I made a ping or two and nobody ever answered. -- I would therefore like to posit that computing's central challenge, viz. "How not to make a mess of it," has /not/ been met. - Edsger Dijkstra, 1930-2002 From gcc-prs-return-23898-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 23:35:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 15365 invoked by alias); 2 Nov 2002 23:35:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 15317 invoked by uid 61); 2 Nov 2002 23:35:01 -0000 Date: 2 Nov 2002 23:35:01 -0000 Message-ID: <20021102233501.15315.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, java-prs@gcc.gnu.org, nobody@gcc.gnu.org, tromey@gcc.gnu.org, uweigand@de.ibm.com From: tromey@gcc.gnu.org Reply-To: tromey@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, java-prs@gcc.gnu.org, nobody@gcc.gnu.org, tromey@gcc.gnu.org, uweigand@de.ibm.com, gcc-gnats@gcc.gnu.org Subject: Re: libgcj/8142: '$' in class names vs. dlopen 'dynamic string tokens' Synopsis: '$' in class names vs. dlopen 'dynamic string tokens' Responsible-Changed-From-To: unassigned->tromey Responsible-Changed-By: tromey Responsible-Changed-When: Sat Nov 2 15:35:01 2002 Responsible-Changed-Why: I'm handling the administrivia State-Changed-From-To: open->closed State-Changed-By: tromey State-Changed-When: Sat Nov 2 15:35:01 2002 State-Changed-Why: A patch to fix this was checked in http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8142 From gcc-prs-return-23899-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sat Nov 02 23:36:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 20036 invoked by alias); 2 Nov 2002 23:36:00 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 20006 invoked by uid 71); 2 Nov 2002 23:36:00 -0000 Resent-Date: 2 Nov 2002 23:36:00 -0000 Resent-Message-ID: <20021102233600.20005.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, wje@acm.org Received: (qmail 8718 invoked by uid 61); 2 Nov 2002 23:33:08 -0000 Message-Id: <20021102233308.8716.qmail@sources.redhat.com> Date: 2 Nov 2002 23:33:08 -0000 From: wje@acm.org Reply-To: wje@acm.org To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8431: compile short program to get internal compilation error >Number: 8431 >Category: c++ >Synopsis: compile short program to get internal compilation error >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Sat Nov 02 15:36:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: William J. Evans (949)754-8650 (714)447-4191 >Release: gcc version 2.95.3 20010315 (release) >Organization: >Environment: Nothing compiler-related. Stripped-down PATH. >Description: Compile the tiny, self-contained program to get an internal compilation error. >How-To-Repeat: Just compile it. (Hey, I'm using lynx, and I hope that just typing those file names will ship you the files. >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23900-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 01:23:40 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 14242 invoked by alias); 3 Nov 2002 01:23:39 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14211 invoked by uid 61); 3 Nov 2002 01:23:38 -0000 Date: 3 Nov 2002 01:23:38 -0000 Message-ID: <20021103012338.14209.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, wje@acm.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, wje@acm.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8431: compile short program to get internal compilation error Synopsis: compile short program to get internal compilation error State-Changed-From-To: open->feedback State-Changed-By: paolo State-Changed-When: Sat Nov 2 17:23:38 2002 State-Changed-Why: Unfortunately the files didn't reach us. Could you possibly send them again? Thanks, Paolo. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8431 From gcc-prs-return-23901-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 01:36:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 4858 invoked by alias); 3 Nov 2002 01:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 4811 invoked by uid 71); 3 Nov 2002 01:36:00 -0000 Resent-Date: 3 Nov 2002 01:36:00 -0000 Resent-Message-ID: <20021103013600.4809.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, java-prs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, jmr@ugcs.caltech.edu Received: (qmail 1485 invoked by uid 61); 3 Nov 2002 01:35:19 -0000 Message-Id: <20021103013519.1484.qmail@sources.redhat.com> Date: 3 Nov 2002 01:35:19 -0000 From: jmr@ugcs.caltech.edu Reply-To: jmr@ugcs.caltech.edu To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: java/8432: Misleading error message for undeclared variable in inner class >Number: 8432 >Category: java >Synopsis: Misleading error message for undeclared variable in inner class >Confidential: no >Severity: non-critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sat Nov 02 17:36:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: Jesse Rosenstock >Release: 3.3 20021101 (experimental) >Organization: >Environment: System: Linux churchill 2.4.3-12 #1 Fri Jun 8 15:05:56 EDT 2001 i686 unknown Architecture: i686 host: i686-pc-linux-gnu build: i686-pc-linux-gnu target: i686-pc-linux-gnu configured with: ../gcc/configure --prefix=/home/user/jmr/app/gcc --enable-languages=c++,java --enable-threads=posix --enable-shared --with-as=/home/user/jmr/app/binutils/bin/as --with-ld=/home/user/jmr/app/binutils/bin/ld : (reconfigured) : (reconfigured) : (reconfigured) : (reconfigured) : (reconfigured) : (reconfigured) : (reconfigured) >Description: If a variable isn't declared in an inner class, an error message is issued saying that the local variable must be declared final. It would be better to say that the variable is undeclared. >How-To-Repeat: ; cat InnerStaticFinal.java public class InnerStaticFinal { private static final class Inner extends Base { private Inner () { super (foo); } } } ; cat Base.java public class Base { public Base (Object o) { } } ; gcj Base.java InnerStaticFinal.java InnerStaticFinal.java: In class `InnerStaticFinal$Inner': InnerStaticFinal.java: In constructor `()': InnerStaticFinal.java:4: error: Local variable `foo' can't be accessed from within the inner class `InnerStaticFinal$Inner' unless it is declared final. super (foo); ^ 1 error ; javac Base.java InnerStaticFinal.java InnerStaticFinal.java:4: cannot resolve symbol symbol : variable foo location: class InnerStaticFinal.Inner super (foo); ^ 1 error >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="InnerStaticFinal.java" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="InnerStaticFinal.java" cHVibGljIGNsYXNzIElubmVyU3RhdGljRmluYWwgewogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwg Y2xhc3MgSW5uZXIgZXh0ZW5kcyBCYXNlIHsKICAgICAgICBwcml2YXRlIElubmVyICgpIHsKICAg ICAgICAgICAgc3VwZXIgKGZvbyk7CiAgICAgICAgfQogICAgfQp9Cg== From gcc-prs-return-23902-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 01:46:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 13707 invoked by alias); 3 Nov 2002 01:46:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 13623 invoked by uid 71); 3 Nov 2002 01:46:01 -0000 Resent-Date: 3 Nov 2002 01:46:01 -0000 Resent-Message-ID: <20021103014601.13622.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, java-prs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, ebb9@email.byu.edu Received: (qmail 13301 invoked by uid 61); 3 Nov 2002 01:45:55 -0000 Message-Id: <20021103014555.13300.qmail@sources.redhat.com> Date: 3 Nov 2002 01:45:55 -0000 From: ebb9@email.byu.edu Reply-To: ebb9@email.byu.edu To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: java/8433: Static initializers must be able to complete normally >Number: 8433 >Category: java >Synopsis: Static initializers must be able to complete normally >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: accepts-illegal >Submitter-Id: net >Arrival-Date: Sat Nov 02 17:46:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: ebb9@email.byu.edu >Release: gcj (GCC) 3.2 20020818 (prerelease) >Organization: >Environment: Configured with: /netrel/src/gcc-3.2-1/configure --enable-languages=c,c++,f77,ja va --enable-libgcj --enable-threads=posix --with-system-zlib --enable-nls --with out-included-gettext --enable-interpreter --disable-sjlj-exceptions --disable-ve rsion-specific-runtime-libs --enable-shared --build=i686-pc-linux --host=i686-pc -cygwin --target=i686-pc-cygwin --enable-haifa --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --includedir=/nonexistent/include --libexecd ir=/usr/sbin Thread model: posix gcc version 3.2 20020818 (prerelease) >Description: Java forbids static initializers from not being able to complete normally. These two classes should both cause a compile-time error, but gcj accepts them: class Foo { static { throw new NullPointerException("nope"); } } class Other { static { while (true); } } >How-To-Repeat: Compile the two example classes. It should give two compile errors. >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23903-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 01:58:22 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 7015 invoked by alias); 3 Nov 2002 01:58:20 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 6963 invoked by uid 61); 3 Nov 2002 01:58:19 -0000 Date: 3 Nov 2002 01:58:19 -0000 Message-ID: <20021103015819.6962.qmail@sources.redhat.com> To: ebb9@email.byu.edu, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, java-prs@gcc.gnu.org, nobody@gcc.gnu.org, tromey@gcc.gnu.org From: tromey@gcc.gnu.org Reply-To: tromey@gcc.gnu.org, ebb9@email.byu.edu, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, java-prs@gcc.gnu.org, nobody@gcc.gnu.org, tromey@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: java/8051: Infinite loop after error reporting on extending final Synopsis: Infinite loop after error reporting on extending final Responsible-Changed-From-To: unassigned->tromey Responsible-Changed-By: tromey Responsible-Changed-When: Sat Nov 2 17:58:19 2002 Responsible-Changed-Why: I'm handling this State-Changed-From-To: open->feedback State-Changed-By: tromey State-Changed-When: Sat Nov 2 17:58:19 2002 State-Changed-Why: I tried this with the current trunk. For me it reports the message and exits with status 1 Can you try the trunk? http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8051 From gcc-prs-return-23904-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 04:56:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 4150 invoked by alias); 3 Nov 2002 04:56:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 4105 invoked by uid 71); 3 Nov 2002 04:56:01 -0000 Resent-Date: 3 Nov 2002 04:56:01 -0000 Resent-Message-ID: <20021103045601.4104.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, mjmaterna60193@yahoo.com Received: (qmail 5870 invoked by uid 61); 3 Nov 2002 04:50:01 -0000 Message-Id: <20021103045001.5868.qmail@sources.redhat.com> Date: 3 Nov 2002 04:50:01 -0000 From: mjmaterna60193@yahoo.com Reply-To: mjmaterna60193@yahoo.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8434: Template Inclusion - keyword 'export' not implemented >Number: 8434 >Category: c++ >Synopsis: Template Inclusion - keyword 'export' not implemented >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sat Nov 02 20:56:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: Mark J. Materna >Release: 2.95.3-216 >Organization: >Environment: Linux >Description: Because the keyword export is not yet implemented it seems that I can not have separatley complied template definitions. Without the key word "export" when a templated class is declared in a .h and defined in a .cpp, when linking the templated class does not seem to be accessable to other translation units. This is expected according to Stroustrup. Is there another way around this? (Putting the definition in the include is really not ideal because the templated class will be widely used.) I do require this functionality. See attached file for an example. The complie command is: g++ main.cpp matrix.cpp -o matrix >How-To-Repeat: g++ main.cpp matrix.cpp -o matrix >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23905-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 04:56:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 4184 invoked by alias); 3 Nov 2002 04:56:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 4126 invoked by uid 71); 3 Nov 2002 04:56:01 -0000 Resent-Date: 3 Nov 2002 04:56:01 -0000 Resent-Message-ID: <20021103045601.4125.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, mjmaterna60193@yahoo.com Received: (qmail 7006 invoked by uid 61); 3 Nov 2002 04:50:15 -0000 Message-Id: <20021103045015.7005.qmail@sources.redhat.com> Date: 3 Nov 2002 04:50:15 -0000 From: mjmaterna60193@yahoo.com Reply-To: mjmaterna60193@yahoo.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8435: Template Inclusion - keyword 'export' not implemented >Number: 8435 >Category: c++ >Synopsis: Template Inclusion - keyword 'export' not implemented >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sat Nov 02 20:56:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Mark J. Materna >Release: 2.95.3-216 >Organization: >Environment: Linux >Description: Because the keyword export is not yet implemented it seems that I can not have separatley complied template definitions. Without the key word "export" when a templated class is declared in a .h and defined in a .cpp, when linking the templated class does not seem to be accessable to other translation units. This is expected according to Stroustrup. Is there another way around this? (Putting the definition in the include is really not ideal because the templated class will be widely used.) I do require this functionality. See attached file for an example. The complie command is: g++ main.cpp matrix.cpp -o matrix >How-To-Repeat: g++ main.cpp matrix.cpp -o matrix >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/x-tar; name="matrix.tar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="matrix.tar" bWFpbi5jcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2 NAAwMDAwMTQ0ADAwMDAwMDAzNTMwADA3NTYxMTA3MzMxADAxMjQxNAAgMAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG1qbWF0ZXJuYQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAdXNlcnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbi5jcHAgIC0g IGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0t LS0tLQogICAgYmVnaW4gICAgICAgICAgICAgICAgOiBNb24gU2VwIDIgMjAwMgogICAgY29weXJp Z2h0ICAgICAgICAgICAgOiAoQykgMjAwMiBieSBNYXJrIEouIE1hdGVybmEKICAgIGVtYWlsICAg ICAgICAgICAgICAgIDogbWptYXRlcm5hQHN5c21hdHJpeC5uZXQKICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgIFRoaXMgcHJv Z3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5ICAqCiAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgogKiAgIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNs dWRlICJtYXRyaXguaCIKCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKXsKICAgCiAg IGludCBpLCBqOwogICBtYXRyaXg8ZmxvYXQ+IGEoMi4wLDMuMCksIGIoMy4wLDUuMCksIGM7Cgog ICBmb3IoaSA9IDA7IGkgPCAyOyBpKyspCiAgICBmb3IoaiA9IDA7IGogPCAzOyBqKyspCiAgICAg IGEoaSxqKSA9IGkgKyBqICsgMC41OwoKICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQogICAgZm9y KGogPSAwOyBqIDwgNTsgaisrKQogICAgICBiKGksaikgPSAoMSArIGkpICogKDEgKyBqKSArIDAu NTsKCiAgIGMgPSBhICogYjsKICAgY291dCA8PCAiYToiIDw8IGVuZGwgPDwgZW5kbDsKICAgYS5w cmludCgpOwogICBjb3V0IDw8ICJiOiIgPDwgZW5kbCA8PCBlbmRsOwogICBiLnByaW50KCk7CiAg IGNvdXQgPDwgImEgKiBiOiIgPDwgZW5kbCA8PCBlbmRsOwogICBjLnByaW50KCk7CgoKCiAgIG1h dHJpeDxsb25nPiBkKDIsMyksIGUoMyw1KSwgZjsKCiAgIGZvcihpID0gMDsgaSA8IDI7IGkrKykK ICAgIGZvcihqID0gMDsgaiA8IDM7IGorKykKICAgICAgZChpLGopID0gKGkgKyBqKSAqIDEwMDsK CiAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykKICAgIGZvcihqID0gMDsgaiA8IDU7IGorKykKICAg ICAgZShpLGopID0gKDEgKyBpKSAqICgxICsgaik7CgogICBmID0gZCAqIGU7CiAgIGNvdXQgPDwg ImQ6IiA8PCBlbmRsIDw8IGVuZGw7CiAgIGQucHJpbnQoKTsKICAgY291dCA8PCAiZToiIDw8IGVu ZGwgPDwgZW5kbDsKICAgZS5wcmludCgpOwogICBjb3V0IDw8ICJkICogZToiIDw8IGVuZGwgPDwg ZW5kbDsKICAgZi5wcmludCgpOwoKCiAgIHJldHVybiBFWElUX1NVQ0NFU1M7CiB9CiAKIAogCgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1hdHJp eC5jcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDA3NjQAMDAw MDE0NAAwMDAwMDAwNTI0NwAwNzU2MTEyMDIxMwAwMTI3NzUAIDAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABtam1hdGVybmEAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAHVzZXJzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC5jcHAgIC0gIGRl c2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0t LQogICAgYmVnaW4gICAgICAgICAgICAgICAgOiBNb24gU2VwIDIgMjAwMgogICAgY29weXJpZ2h0 ICAgICAgICAgICAgOiAoQykgMjAwMiBieSBNYXJrIEouIE1hdGVybmEKICAgIGVtYWlsICAgICAg ICAgICAgICAgIDogbWptYXRlcm5hQHN5c21hdHJpeC5uZXQKICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8K Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 ICAqCiAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u OyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgogKiAgIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRl ICJtYXRyaXguaCIKCgpleHBvcnQgdGVtcGxhdGU8Y2xhc3MgVHlwPgpUeXAmIG1hdHJpeDxUeXA+ OjpvcGVyYXRvcigpIChpbnQgaSwgaW50IGopewogIGlmKGkgPj0gMCAgJiYgaSA8IG5yKQogICAg aWYoaiA+PSAwICYmIGogPCBuYykKICAgICAgcmV0dXJuKGRhdGFbaSAqIG5jICsgal0pOwogICAg ZWxzZQogICAgICBjb3V0IDw8ICJDb2x1bW4gc3Vic2NyaXB0IG91dCBvZiByYW5nZTogIiA8PCBq IDw8IGVuZGw7CgogIGVsc2UKICAgIGNvdXQgPDwgIlJvdyBzdWJzY3JpcHQgb3V0IG9mIHJhbmdl OiAiIDw8IGkgPDwgZW5kbDsKCiAgcmV0dXJuKGRhdGFbMF0pOwogIH0KCmV4cG9ydCB0ZW1wbGF0 ZTwgY2xhc3MgVHlwID4KbWF0cml4PFR5cD4gOjogbWF0cml4KCl7CiAgIG5yID0gMTsKICAgbmMg PSAxOwogICBkYXRhID0gbmV3IFR5cFsxXTsKICB9CgpleHBvcnQgdGVtcGxhdGU8IGNsYXNzIFR5 cCA+Cm1hdHJpeDxUeXA+IDo6IG1hdHJpeChpbnQgciwgaW50IGMpewogICBuciA9IHI7CiAgIG5j ID0gYzsKICAgZGF0YSA9IG5ldyBUeXBbbnIqbmNdOwogIH0KCmV4cG9ydCB0ZW1wbGF0ZTxjbGFz cyBUeXA+Cm1hdHJpeDxUeXA+IDo6IH5tYXRyaXgoKXsKICBkZWxldGVbXSBkYXRhOwogIH0KCmV4 cG9ydCB0ZW1wbGF0ZTxjbGFzcyBUeXA+CnZvaWQgbWF0cml4PFR5cD46OnByaW50KCl7CiAgZm9y KGludCBpID0gMDsgaSA8ICBucjsgaSsrKXsKICAgIGZvcihpbnQgaiA9IDA7IGogPCAgbmM7IGor KykKICAgICAgY291dCA8PCBzZXR3KDYpIDw8IG9wZXJhdG9yKCkoaSxqKTsKCiAgICBjb3V0IDw8 IHNldHcoMCkgPDwgZW5kbDsKICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKICB9CgpleHBvcnQgdGVt cGxhdGU8Y2xhc3MgVHlwPgptYXRyaXg8VHlwPjo6bWF0cml4KG1hdHJpeDxUeXA+JiBtKXsKICAg bnIgPSBtLm5yOwogICBuYyA9IG0ubmM7CiAgIGRhdGEgPSBuZXcgVHlwW25yICogbmNdOwoKICBm b3IoaW50IGkgPSAwOyBpIDwgbS5ucjsgaSsrKQogICAgZm9yKGludCBqID0gMDsgaiA8IG0ubmM7 IGorKykKICAgICAgb3BlcmF0b3IoKSAoaSxqKSA9IG0oaSxqKTsKCiAgfQoKCmV4cG9ydCB0ZW1w bGF0ZTxjbGFzcyBUeXA+Cm1hdHJpeDxUeXA+IG1hdHJpeDxUeXA+OjpvcGVyYXRvciogKG1hdHJp eDxUeXA+IG0pewogIFR5cCBzdW07CgogIGlmKG0ubnIgIT0gbmMpCiAgICByZXR1cm4obSk7Cgog IG1hdHJpeDxUeXA+IHByb2QobnIsIG0ubmMpOwoKICBmb3IoaW50IGkgPSAwOyBpIDwgbnI7IGkr Kyl7CiAgICBmb3IoaW50IGogPSAwOyBqIDwgbS5uYzsgaisrKXsKICAgICAgc3VtID0gMDsKICAg ICAgZm9yKGludCBrID0gMDsgayA8IG5jOyBrKyspCiAgICAgICAgc3VtID0gc3VtICsgb3BlcmF0 b3IoKSAoaSxrKSAqIG0oayxqKTsKCiAgICAgIHByb2QoaSxqKSA9IHN1bTsKICAgICAgfQogICAg fQoKICByZXR1cm4ocHJvZCk7Cgp9CgpleHBvcnQgdGVtcGxhdGU8Y2xhc3MgVHlwPgp2b2lkIG1h dHJpeDxUeXA+OjpvcGVyYXRvcj0gKG1hdHJpeDxUeXA+IG0pewogIG5yID0gbS5ucjsKICBuYyA9 IG0ubmM7CgogIGRlbGV0ZVtdIGRhdGE7CiAgZGF0YSA9IG5ldyBUeXBbbnIgKiBuY107CgogIGZv cihpbnQgaSA9IDA7IGkgPCBtLm5yOyBpKyspCiAgICBmb3IoaW50IGogPSAwOyBqIDwgbS5uYzsg aisrKQogICAgICBvcGVyYXRvcigpKGksaikgPSBtKGksaik7CgogIH0KAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWF0cml4LmgAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2NAAwMDAwMTQ0ADAw MDAwMDAzMDIwADA3NTYxMTEyNzcwADAxMjQzNgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG1qbWF0ZXJuYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA dXNlcnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LmggIC0gIGRlc2NyaXB0aW9u CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgYmVn aW4gICAgICAgICAgICAgICAgOiBNb24gU2VwIDIgMjAwMgogICAgY29weXJpZ2h0ICAgICAgICAg ICAgOiAoQykgMjAwMiBieSBNYXJrIEouIE1hdGVybmEKICAgIGVtYWlsICAgICAgICAgICAgICAg IDogbWptYXRlcm5hQHN5c21hdHJpeC5uZXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCiAqICAg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBw dWJsaXNoZWQgYnkgICoKICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgogKiAgIChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlPGlvc3RyZWFt PgojaW5jbHVkZTxpb21hbmlwPgojaW5jbHVkZTxzdGRsaWIuaD4KCnRlbXBsYXRlPGNsYXNzIFR5 cD4KY2xhc3MgbWF0cml4IHsKICBUeXAgKmRhdGE7CiAgaW50IG5yLCBuYzsgLy8gbnVtYmVyIHJv d3MsIG51bWJlciBjb2xzCgpwdWJsaWM6CiAgbWF0cml4KCk7CiAgbWF0cml4IChpbnQsIGludCk7 CiAgfm1hdHJpeCgpOwogIHZvaWQgcHJpbnQoKTsKICBpbnQgbnVtUm93cygpIHsgcmV0dXJuIG5y OyB9CiAgaW50IG51bUNvbHMoKSB7IHJldHVybiBuYzsgfQogIG1hdHJpeCAobWF0cml4JiBtKTsg ICAgICAgICAgICAgICAgICAgLy8gQ29weSBDb25zdHJ1Y3RvcgoKICBtYXRyaXggb3BlcmF0b3Iq IChtYXRyaXggbSk7ICAgICAgLy8gbWF0cml4IE11bHRpcGxpY2F0aW9uCgogIHZvaWQgb3BlcmF0 b3I9IChtYXRyaXg8VHlwPiBtKTsgICAgICAgICAvLyBtYXRyaXggQXNzaWdubWVudAogIFR5cCYg b3BlcmF0b3IoKSAoaW50IGksIGludCBqKTsgICAgICAgIC8vIG1hdHJpeCBJbmRleGluZwp9OwoK AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== From gcc-prs-return-23906-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 05:08:08 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 22428 invoked by alias); 3 Nov 2002 05:08:08 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 22397 invoked by uid 61); 3 Nov 2002 05:08:07 -0000 Date: 3 Nov 2002 05:08:07 -0000 Message-ID: <20021103050807.22394.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mjmaterna60193@yahoo.com, nobody@gcc.gnu.org From: zack@gcc.gnu.org Reply-To: zack@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mjmaterna60193@yahoo.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8434: Template Inclusion - keyword 'export' not implemented Synopsis: Template Inclusion - keyword 'export' not implemented State-Changed-From-To: open->closed State-Changed-By: zack State-Changed-When: Sat Nov 2 21:08:07 2002 State-Changed-Why: Duplicate of 8435, which has more information. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8434 From gcc-prs-return-23907-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 05:09:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25757 invoked by alias); 3 Nov 2002 05:09:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 25731 invoked by uid 61); 3 Nov 2002 05:09:02 -0000 Date: 3 Nov 2002 05:09:02 -0000 Message-ID: <20021103050902.25730.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mjmaterna60193@yahoo.com, nobody@gcc.gnu.org From: zack@gcc.gnu.org Reply-To: zack@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, mjmaterna60193@yahoo.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8435: Template Inclusion - keyword 'export' not implemented Synopsis: Template Inclusion - keyword 'export' not implemented State-Changed-From-To: open->closed State-Changed-By: zack State-Changed-When: Sat Nov 2 21:09:02 2002 State-Changed-Why: Duplicate of PR 2839. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8435 From gcc-prs-return-23908-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 06:26:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 2684 invoked by alias); 3 Nov 2002 06:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 2636 invoked by uid 71); 3 Nov 2002 06:26:01 -0000 Date: 3 Nov 2002 06:26:01 -0000 Message-ID: <20021103062601.2628.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Bruce Allen Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Reply-To: Bruce Allen The following reply was made to PR c/8395; it has been noted by GNATS. From: Bruce Allen To: Marco Bernardo Cc: Toon Moene , Bruce Allen , gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Date: Sun, 3 Nov 2002 00:18:59 -0600 (CST) Marco, Toon is completely correct. If you read the materials that we keep asking you to study, you will learn that there is a discrete set of "IEEE754 floating point numbers". Somewhat less than 2^32 of them for single precision, somewhat less than 2^64 of them for double precision. As a consequence, since this is a finite set, and the real numbers are not even a countable set, most real numbers are not IEEE754 floats. Only a finite subset are. Examples: Pi ==> not an IEEE754 float 1.2 ==> not an IEEE754 float 6 ==> IS an IEEE754 float 1.25 ==> IS an IEEE754 float 1+2^-20 ==> IS an IEEE754 float Also, a mathematical operation between two IEEE754 floats may or may not yield another IEEE754 float. For example 1.25*1.25 does yield another IEEE754 float, but (1+2^-20)*(1+2^-20) does yield an IEEE754 float if working in double precision, but not in single precision. When the result of a mathematical operation (say, assigning 1.2 to an IEEE754 variable) does not yield an IEEE754 float, the standard specifies a couple of different possible user-selectable ways to round the number (assign it an IEEE754 value). There is round-to-nearest (pick closest IEEE754 float) and round-to-zero. Also, languages like C do not specify an order for operations to take place in expressions. So two identical lines of C might yield different results with different compilers. Like you, I am a University Professor (Physics). I teach IEEE754 in my course on mathematical methods where we spend a few weeks on numerical methods. Here are a few exercises for you to do: -- what is the largest integer that is an IEEE754 single float? double float? Write this as a sum of powers of 2. -- what is the largest integer N such that both N and N+1 are IEEE754 single floats? -- what is the smallest positive number that is still a normalized IEEE754 single float. smallest positive number that is an IEEE754 single float but is not normalized? Please read some of the literature (it is not a complicated subject) and do the exercises. Bruce Allen On Sat, 2 Nov 2002, Toon Moene wrote: > Marco Bernardo wrote: > > > 1. Some colleagues of mine tried to compile and run the same program > > on other platforms, in particular on a sparc machine, and the output > > turned out to be > > -6 -1.2 5 0 -6 0 > > Why is that? Isn't the IEEE 754 standard adopted on sparc machines? > > Yes. For further explanations, see the "Further Readings" item on our > home page: > > http://gcc.gnu.org -> "Further Readings" (left column) -> > > Differences among IEEE 754 implementations (by Doug Priest) > > -- > Toon Moene - mailto:toon@moene.indiv.nluug.nl - phoneto: +31 346 214290 > Saturnushof 14, 3738 XG Maartensdijk, The Netherlands > Maintainer, GNU Fortran 77: http://gcc.gnu.org/onlinedocs/g77_news.html > Join GNU Fortran 95: http://g95.sourceforge.net/ (under construction) > > From gcc-prs-return-23909-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 06:26:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 2762 invoked by alias); 3 Nov 2002 06:26:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 2691 invoked by uid 71); 3 Nov 2002 06:26:02 -0000 Date: 3 Nov 2002 06:26:01 -0000 Message-ID: <20021103062601.2690.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Bruce Allen Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Reply-To: Bruce Allen The following reply was made to PR c/8395; it has been noted by GNATS. From: Bruce Allen To: Marco Bernardo Cc: Tim Prince , Bruce Allen , gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Date: Sun, 3 Nov 2002 00:19:45 -0600 (CST) Marco, Tim is also completely correct. Bruce On Sat, 2 Nov 2002, Tim Prince wrote: > On Saturday 02 November 2002 07:42, Marco Bernardo wrote: > > > Let me conclude by saying that my intention is not to be polemic. > > My point of view is that of a university professor who wants to teach > > to his students that there is a great alternative to Microsoft, > > which is Linux and the free software world. > > You would then understand that it is very difficult for me to support gcc > > and to teach my students how to use gcc in the presence of such a strange > > behavior, which is not justifiable at all on a scientific basis. > > > > > From a professorial point of view, you should be encouraging your students to > consult expert references on floating point numerics, even if you don't care > to do so yourself. Before you start arguing about IEEE standards and > scientific bases, you should be reading up on them, and the technical reasons > for including the extended precision option. > If you are teaching at this level of detail, you could show your students how > to set 53-bit rounding mode in order to duplicate the fpu settings of > Microsoft compilers, how to use fpu mode settings to test code reliability, > and how to break the Microsoft compiler by putting the fpu in standard > default mode. As standard C does not define a function for this purpose, the > C committee must not have considered it to be as large an issue as you. > -- > Tim Prince > From gcc-prs-return-23910-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 13:16:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24764 invoked by alias); 3 Nov 2002 13:16:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24723 invoked by uid 71); 3 Nov 2002 13:16:01 -0000 Resent-Date: 3 Nov 2002 13:16:01 -0000 Resent-Message-ID: <20021103131601.24721.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, bkausbk@web.de Received: (qmail 28137 invoked by uid 61); 3 Nov 2002 13:09:24 -0000 Message-Id: <20021103130924.28136.qmail@sources.redhat.com> Date: 3 Nov 2002 13:09:24 -0000 From: bkausbk@web.de Reply-To: bkausbk@web.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c/8436: Internal GCC 3.2 compiler error caused by Asm-Statement >Number: 8436 >Category: c >Synopsis: Internal GCC 3.2 compiler error caused by Asm-Statement >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Sun Nov 03 05:16:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: Benjamin Kalytta >Release: GCC 3.2 >Organization: >Environment: cygwin (v. 1.1.8) x86-Windows 2000 Prof. >Description: asm-statement (see attachement test.i) caused an internal compiler error, only if optimization level is 0 (default) test.c: In function `KmAtomicCompareExchange': test.c:10: Internal compiler error in instantiate_virtual_regs_1, at function.c: 3972 >How-To-Repeat: Execute "gcc -c test.c" >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23911-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 13:36:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 14900 invoked by alias); 3 Nov 2002 13:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14870 invoked by uid 71); 3 Nov 2002 13:36:01 -0000 Resent-Date: 3 Nov 2002 13:36:01 -0000 Resent-Message-ID: <20021103133601.14866.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, bkausbk@web.de Received: (qmail 4943 invoked by uid 61); 3 Nov 2002 13:26:01 -0000 Message-Id: <20021103132601.4942.qmail@sources.redhat.com> Date: 3 Nov 2002 13:26:01 -0000 From: bkausbk@web.de Reply-To: bkausbk@web.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: other/8437: GCC 3.2 don't produces builtin code for __builtin_alloca >Number: 8437 >Category: other >Synopsis: GCC 3.2 don't produces builtin code for __builtin_alloca >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: pessimizes-code >Submitter-Id: net >Arrival-Date: Sun Nov 03 05:36:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Benjamin Kalytta >Release: GCC 3.2 >Organization: >Environment: cygwin (v. 1.1.8) x86/AMD Athlon XP2200+ - Windows 2000 Prof. >Description: GCC don't create builtin function __builtin_alloca as builtin, but instead it creates an external definition in objectfile to __alloca (usually a libgcc libary function). How to repeat: #define alloca(n) __builtin_alloca((n)) int main() { char *p=alloca(10); return (int)p; } >How-To-Repeat: Any of this: gcc -c test.c gcc -fbuiltin -fhosted -c test.c gcc -fhosted -c test.c gcc -fno-builtin -c test.c >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="test.o" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test.o" TAEDAAAAAADQAAAADAAAAAAABAAudGV4dAAAAAAAAAAAAAAAMAAAAIwAAAC8AAAAAAAAAAIAAAAg AABgLmRhdGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAwC5ic3MAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAMBVieWD7AiD5PC4AAAAAIlF+ItF+OgAAAAA6AAAAACD 7BCJ4IlF/ItF/MnDkJCQkJAVAAAACwAAABQAGgAAAAkAAAAUAC5maWxlAAAAAAAAAP7/AABnAXRl c3QuYwAAAAAAAAAAAAAAAF9tYWluAAAAAAAAAAEAIAACAC50ZXh0AAAAAAAAAAEAAAADASsAAAAC AAAAAAAAAAAAAAAAAC5kYXRhAAAAAAAAAAIAAAADAQAAAAAAAAAAAAAAAAAAAAAAAC5ic3MAAAAA AAAAAAMAAAADAQAAAAAAAAAAAAAAAAAAAAAAAF9fX21haW4AAAAAAAAAIAACAQAAAAAAAAAAAAAA AAAAAAAAAF9fYWxsb2NhAAAAAAAAAAACAAQAAAA= From gcc-prs-return-23912-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 14:16:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 27128 invoked by alias); 3 Nov 2002 14:16:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 27106 invoked by uid 71); 3 Nov 2002 14:16:00 -0000 Date: 3 Nov 2002 14:16:00 -0000 Message-ID: <20021103141600.27104.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Gabriel Dos Reis Subject: Re: c++/8434: Template Inclusion - keyword 'export' not implemented Reply-To: Gabriel Dos Reis The following reply was made to PR c++/8434; it has been noted by GNATS. From: Gabriel Dos Reis To: mjmaterna60193@yahoo.com Cc: gcc-gnats@gcc.gnu.org Subject: Re: c++/8434: Template Inclusion - keyword 'export' not implemented Date: 03 Nov 2002 15:13:48 +0100 mjmaterna60193@yahoo.com writes: | >Synopsis: Template Inclusion - keyword 'export' not implemented [...] | >Class: sw-bug This is not a bug in the compiler. It is known that GCC has (not yet) no plan to implement "export", and a diagnostic is emitted when an attempt is made to use that keyword. [...] | Is there another way around this? Make your template definitions available to the compiler when instantiating -- the easiest way is to put the template code in a header file. | (Putting the definition in the include is really not ideal because | the templated class will be widely used.) It is however a *practical* solution. | I do require this functionality. Well, GCC is a volunteer project; you cannot *require*. -- Gaby From gcc-prs-return-23913-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 15:56:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 31670 invoked by alias); 3 Nov 2002 15:56:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 31641 invoked by uid 71); 3 Nov 2002 15:56:01 -0000 Date: 3 Nov 2002 15:56:01 -0000 Message-ID: <20021103155601.31633.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: wje@panix.com (William J. Evans) Subject: Re: c++/8431: compile short program to get internal compilation error Reply-To: wje@panix.com (William J. Evans) The following reply was made to PR c++/8431; it has been noted by GNATS. From: wje@panix.com (William J. Evans) To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, wje@acm.org, gcc-gnats@gcc.gnu.org Cc: Subject: Re: c++/8431: compile short program to get internal compilation error Date: Sun, 3 Nov 2002 10:52:34 -0500 (EST) You wrote: :Synopsis: compile short program to get internal compilation error : :State-Changed-From-To: open->feedback :State-Changed-By: paolo :State-Changed-When: Sat Nov 2 17:23:38 2002 :State-Changed-Why: : Unfortunately the files didn't reach us. Could you possibly : send them again? : Thanks, Paolo. : :http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8431 I'm not sure your mechanism is lynx-friendly, so I'll include them here as plain text. Sorry for the inconvenience. I get an internal compilation error when using gcc version 2.95.3 20010315 (release) to compile this code, whether or not I use -Wall or -save-temps. I use no other switches, no includes, just a straight compile. === code begins immediately after this line #define X(a) if(a); int main(void) { long long little_doggie; /* * It makes no difference whether the offending expressions are surrounded by * () or (()). I used (()) because of your suggestion to check the * compilation against -Wall. */ X((little_doggie=0x01030507090B0D0FLL)) /* internal error */ /* X((little_doggie=0x01030507090B0D0FL)) internal error */ /* X((little_doggie=0x01030507090B0D0F)) internal error */ /* X((little_doggie=0x0103050709)) internal error */ /* X((little_doggie=0x01030507)) compiles ok */ return 0; } === code ends immediately before this line The output I get is this: /tmp/e1.cxx: In function `int main()': /tmp/e1.cxx:11: Internal compiler error in `do_jump', at expr.c:10976 Please submit a full bug report. See for instructions. The output from the -v switch is this: Reading specs from /usr/lib/gcc-lib/i386-slackware-linux/2.95.3/specs gcc version 2.95.3 20010315 (release) /usr/lib/gcc-lib/i386-slackware-linux/2.95.3/specs contains this: ===content begins immediately after this line *asm: %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} *asm_final: %| *cpp: %(cpp_cpu) %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} *cc1: %(cc1_cpu) %{profile:-p} *cc1plus: *endfile: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s *link: -m elf_i386 %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} %{static:-static}}} *lib: %{shared: -lc} %{!shared: %{mieee-fp:-lieee} %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} *libgcc: -lgcc *startfile: %{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} *switches_need_spaces: *signed_char: %{funsigned-char:-D__CHAR_UNSIGNED__} *predefines: -D__ELF__ -Dunix -D__i386__ -Dlinux -Asystem(posix) *cross_compile: 0 *version: 2.95.3 *multilib: . ; *multilib_defaults: *multilib_extra: *multilib_matches: *linker: collect2 *cpp_486: %{!ansi:-Di486} -D__i486 -D__i486__ *cpp_586: %{!ansi:-Di586 -Dpentium} -D__i586 -D__i586__ -D__pentium -D__pentium__ *cpp_k6: %{!ansi:-Di586 -Dk6} -D__i586 -D__i586__ -D__k6 -D__k6__ *cpp_686: %{!ansi:-Di686 -Dpentiumpro} -D__i686 -D__i686__ -D__pentiumpro -D__pentiumpro__ *cpp_cpu_default: *cpp_cpu: -Acpu(i386) -Amachine(i386) %{!ansi:-Di386} -D__i386 -D__i386__ %{mcpu=i486:%(cpp_486)} %{m486:%(cpp_486)} %{mpentium:%(cpp_586)} %{mcpu=pentium:%(cpp_586)} %{mpentiumpro:%(cpp_686)} %{mcpu=pentiumpro:%(cpp_686)} %{mcpu=k6:%(cpp_k6)} %{!mcpu*:%{!m486:%{!mpentium*:%(cpp_cpu_default)}}} *cc1_cpu: %{!mcpu*: %{m386:-mcpu=i386 -march=i386} %{m486:-mcpu=i486 -march=i486} %{mpentium:-mcpu=pentium} %{mpentiumpro:-mcpu=pentiumpro}} *link_command: %{!fsyntax-only: %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %D %o %{!nostdlib:%{!nodefaultlibs:%G %L %G}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} ===content ends immediately before this line Hope this helps! From gcc-prs-return-23914-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 17:26:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 3336 invoked by alias); 3 Nov 2002 17:26:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 3308 invoked by uid 71); 3 Nov 2002 17:26:01 -0000 Resent-Date: 3 Nov 2002 17:26:01 -0000 Resent-Message-ID: <20021103172601.3305.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, bennyb@ntplx.net Received: (qmail 2428 invoked by uid 61); 3 Nov 2002 17:18:40 -0000 Message-Id: <20021103171840.2427.qmail@sources.redhat.com> Date: 3 Nov 2002 17:18:40 -0000 From: bennyb@ntplx.net Reply-To: bennyb@ntplx.net To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8438: Internal compiler error building Trolltech Qt library >Number: 8438 >Category: c++ >Synopsis: Internal compiler error building Trolltech Qt library >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: rejects-legal >Submitter-Id: net >Arrival-Date: Sun Nov 03 09:26:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Ben Bridgwater >Release: gcc version 2.95.3 19991030 (prerelease) >Organization: >Environment: Linux Mandrake 7.1 gcc 2.95.3 as came with Mandrake 7.1 >Description: Compiling latest Trolltech Qt library 3.0.6, get internal compiler error: /usr/local/qt/include/qvaluevector.h: In method `QValueVectorPrivate::QValueVectorPrivate(const QValueVectorPrivate &)': /usr/local/qt/include/qvaluevector.h:476: instantiated from `QValueVector::detachInternal()' /usr/local/qt/include/qvaluevector.h:459: instantiated from here /usr/local/qt/include/qvaluevector.h:125: Internal compiler error. /usr/local/qt/include/qvaluevector.h:125: Please submit a full bug report. /usr/local/qt/include/qvaluevector.h:125: See for instructions. >How-To-Repeat: Using attached chartform_files.ii file generated usign -save-temps : g++ -c -pipe -Wall -W -O2 -D_REENTRANT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -o .obj/release-shared-mt/chartform_files.o chartform_files.ii >Fix: Use earlier 3.0.4 (vs 3.0.6) version of Qt library, which compiles cleanly with this version of compiler. >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="chartform_files.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="chartform_files.ii" IyAxICJjaGFydGZvcm1fZmlsZXMuY3BwIgojIDEgImNhbnZhc3ZpZXcuaCIgMQoKCgojIDEgImVs ZW1lbnQuaCIgMQoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xY29sb3IuaCIgMQogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQv aW5jbHVkZS9xd2luZG93ZGVmcy5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xb2JqZWN0ZGVmcy5oIiAxCiAK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3FnbG9iYWwuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgogCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDExOCAi L3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FnbG9iYWwuaCIKCgojIDE2MyAiL3Vzci9sb2NhbC9xdC9p bmNsdWRlL3FnbG9iYWwuaCIKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIAojIDI2MCAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FnbG9iYWwuaCIKCgoKCgoKCgoKCiAK CgoKCgoKCgoKCgoKCgoKCgoKCiMgNDI2ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdsb2JhbC5o IgoKCgoKCgoKIAoKCgoKCgoKCgoKCiMgNDYyICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdsb2Jh bC5oIgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCiAKIAogCgoKCgoKCgoKCgp0eXBl ZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2hhcjsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdXNob3J0 Owp0eXBlZGVmIHVuc2lnbmVkCXVpbnQ7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVsb25nOwp0 eXBlZGVmIGNoYXIJCSAgICpwY2hhcjsKdHlwZWRlZiB1Y2hhcgkJICAgKnB1Y2hhcjsKdHlwZWRl ZiBjb25zdCBjaGFyICAgICAqcGNjaGFyOwoKCiAKIAogCgoKY29uc3QgYm9vbCBGQUxTRSA9IDA7 CmNvbnN0IGJvb2wgVFJVRSA9ICEwOwoKCgoKCgoKCiAKIAogCgoKCgoKCgoKCgogCiAKIAoKCgoK CmlubGluZSBpbnQgcVJvdW5kKCBkb3VibGUgZCApCnsKICAgIHJldHVybiBpbnQoIGQgPj0gMC4w ID8gZCArIDAuNSA6IGQgLSAwLjUgKTsKfQoKCiAKIAogCgoKIAp0eXBlZGVmIHNpZ25lZCBjaGFy CSAgICBJTlQ4OwkJICAKdHlwZWRlZiB1bnNpZ25lZCBjaGFyCSAgIFVJTlQ4OwkJIAp0eXBlZGVm IHNob3J0CQkgICAgSU5UMTY7CSAgCnR5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgVUlOVDE2Owkg CnR5cGVkZWYgaW50CQlJTlQzMjsJICAgCnR5cGVkZWYgdW5zaWduZWQgaW50CSAgIFVJTlQzMjsJ IAoKCnR5cGVkZWYgc2lnbmVkIGNoYXIJICAgIFFfSU5UODsJICAKdHlwZWRlZiB1bnNpZ25lZCBj aGFyCSAgIFFfVUlOVDg7CSAKdHlwZWRlZiBzaG9ydAkJICAgIFFfSU5UMTY7CSAgCnR5cGVkZWYg dW5zaWduZWQgc2hvcnQJICAgUV9VSU5UMTY7CSAKdHlwZWRlZiBpbnQJCVFfSU5UMzI7CSAgIAp0 eXBlZGVmIHVuc2lnbmVkIGludAkgICBRX1VJTlQzMjsJIAoKCgoKCiAKdHlwZWRlZiBsb25nCQkg ICAgUV9MT05HOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcJICAgUV9VTE9ORzsKCgoKIAoKCgoKCiAK IAogCgpjbGFzcyBRRGF0YVN0cmVhbTsKCgogCiAKIAoKCgoKCiAKIAogCiAKIAogCiAKIAoKIyA2 MjggIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZ2xvYmFsLmgiCgojIDEgIi91c3IvbG9jYWwvcXQv aW5jbHVkZS9xY29uZmlnLmgiIDEKIAoKIAoKCgoKIyA2MjkgIi91c3IvbG9jYWwvcXQvaW5jbHVk ZS9xZ2xvYmFsLmgiIDIKCgoKCgoKCgoKIAojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbW9k dWxlcy5oIiAxCiAKCgoKCgoKCgoKCgoKCgogCiMgNjM5ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUv cWdsb2JhbC5oIiAyCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyA2NzcgIi91c3IvbG9jYWwv cXQvaW5jbHVkZS9xZ2xvYmFsLmgiCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1 ZGUvcWZlYXR1cmVzLmgiIDEKIAogCiAKIAogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgog CiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAog CgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoK IAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAK IAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiMgNjg4ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdsb2JhbC5oIiAyCgoKCgogCiAK IAoKIyA3MjAgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZ2xvYmFsLmgiCgoKCgoKCgoKCgogCiAK IAoKICBjb25zdCBjaGFyICpxVmVyc2lvbigpOwogIGJvb2wgcVN5c0luZm8oIGludCAqd29yZFNp emUsIGJvb2wgKmJpZ0VuZGlhbiApOwoKCgoKCiAKIAogCiAKIAoKCgoKCiMgNzcyICIvdXNyL2xv Y2FsL3F0L2luY2x1ZGUvcWdsb2JhbC5oIgoKCgoKCgoKCgoKCgogCiAKIAoKCgogCiAKIAoKCgoK CgoKCiMgODExICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdsb2JhbC5oIgoKCgogIHZvaWQgcURl YnVnKCBjb25zdCBjaGFyICosIC4uLiApICAgIAoKICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQg KHByaW50ZiwgMSwgMikpKQoKOwoKICB2b2lkIHFXYXJuaW5nKCBjb25zdCBjaGFyICosIC4uLiAp ICAKCiAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkKCjsKCiAgdm9p ZCBxRmF0YWwoIGNvbnN0IGNoYXIgKiwgLi4uICkgICAgCgogICAgX19hdHRyaWJ1dGVfXyAoKGZv cm1hdCAocHJpbnRmLCAxLCAyKSkpCgo7CgogIHZvaWQgcVN5c3RlbVdhcm5pbmcoIGNvbnN0IGNo YXIgKiwgaW50IGNvZGUgPSAtMSApOwoKCiAKCiAgdm9pZCBkZWJ1ZyggY29uc3QgY2hhciAqLCAu Li4gKSAgICAgCgogICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpCgo7 CgogIHZvaWQgd2FybmluZyggY29uc3QgY2hhciAqLCAuLi4gKSAgIAoKICAgIF9fYXR0cmlidXRl X18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKQoKOwoKICB2b2lkIGZhdGFsKCBjb25zdCBjaGFy ICosIC4uLiApICAgICAKCiAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIp KSkKCjsKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKICBib29sIHF0X2NoZWNrX3BvaW50ZXIo IGJvb2wgYywgY29uc3QgY2hhciAqLCBpbnQgKTsKCgoKCgoKCgogCgoKCgoKCmVudW0gUXRNc2dU eXBlIHsgUXREZWJ1Z01zZywgUXRXYXJuaW5nTXNnLCBRdEZhdGFsTXNnIH07Cgp0eXBlZGVmIHZv aWQgKCpRdE1zZ0hhbmRsZXIpKFF0TXNnVHlwZSwgY29uc3QgY2hhciAqKTsKICBRdE1zZ0hhbmRs ZXIgcUluc3RhbGxNc2dIYW5kbGVyKCBRdE1zZ0hhbmRsZXIgKTsKCgogCnR5cGVkZWYgUXRNc2dI YW5kbGVyIG1zZ19oYW5kbGVyOwoKCiAgdm9pZCBxU3VwcHJlc3NPYnNvbGV0ZVdhcm5pbmdzKCBi b29sID0gVFJVRSApOwoKICB2b2lkIHFPYnNvbGV0ZSggY29uc3QgY2hhciAqb2JqLCBjb25zdCBj aGFyICpvbGRmdW5jLAoJCSAgIGNvbnN0IGNoYXIgKm5ld2Z1bmMgKTsKICB2b2lkIHFPYnNvbGV0 ZSggY29uc3QgY2hhciAqb2JqLCBjb25zdCBjaGFyICpvbGRmdW5jICk7CiAgdm9pZCBxT2Jzb2xl dGUoIGNvbnN0IGNoYXIgKm1lc3NhZ2UgKTsKCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVk ZS9xb2JqZWN0ZGVmcy5oIiAyCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgogCiAKc3RydWN0 IFFVT2JqZWN0OwoKIyA4NiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FvYmplY3RkZWZzLmgiCgoK CgoKCgoKCgoKCiAKCiMgMTE0ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW9iamVjdGRlZnMuaCIK CiAKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgUU9iamVjdDsKY2xh c3MgUU1ldGFPYmplY3Q7CmNsYXNzIFFTaWduYWw7CmNsYXNzIFFDb25uZWN0aW9uOwpjbGFzcyBR RXZlbnQ7CnN0cnVjdCBRTWV0YURhdGE7CmNsYXNzIFFDb25uZWN0aW9uTGlzdDsKY2xhc3MgUUNv bm5lY3Rpb25MaXN0SXQ7CmNsYXNzIFFTaWduYWxWZWM7CmNsYXNzIFFPYmplY3RMaXN0OwpjbGFz cyBRT2JqZWN0TGlzdEl0OwpjbGFzcyBRTWVtYmVyRGljdDsKCgoKIyA0MyAiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3F3aW5kb3dkZWZzLmgiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fz dHJpbmcuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAx ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWNzdHJpbmcuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW1lbWFy cmF5LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdhcnJheS5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzaGFyZWQuaCIg MQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKc3RydWN0ICAg UVNoYXJlZAp7CiAgICBRU2hhcmVkKCkJCXsgY291bnQgPSAxOyB9CiAgICB2b2lkIHJlZigpCQl7 IGNvdW50Kys7IH0KICAgIGJvb2wgZGVyZWYoKQl7IHJldHVybiAhLS1jb3VudDsgfQogICAgdWlu dCBjb3VudDsKfTsKCgoKIyA0MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FnYXJyYXkuaCIgMgoK CgoKY2xhc3MgICBRR0FycmF5CQkJCQkgCnsKZnJpZW5kIGNsYXNzIFFCdWZmZXI7CnB1YmxpYzoK ICAgICAKICAgIHN0cnVjdCBhcnJheV9kYXRhIDogcHVibGljIFFTaGFyZWQgewkgCglhcnJheV9k YXRhKCkJeyBkYXRhPTA7IGxlbj0wOyB9CgljaGFyICpkYXRhOwkJCQkgCgl1aW50ICBsZW47CiAg ICB9OwogICAgUUdBcnJheSgpOwpwcm90ZWN0ZWQ6CiAgICBRR0FycmF5KCBpbnQsIGludCApOwkJ CSAKICAgIFFHQXJyYXkoIGludCBzaXplICk7CQkJIAogICAgUUdBcnJheSggY29uc3QgUUdBcnJh eSAmYSApOwkJIAogICAgdmlydHVhbCB+UUdBcnJheSgpOwoKICAgIFFHQXJyYXkgICAgJm9wZXJh dG9yPSggY29uc3QgUUdBcnJheSAmYSApIHsgcmV0dXJuIGFzc2lnbiggYSApOyB9CgogICAgdmly dHVhbCB2b2lkIGRldGFjaCgpCXsgZHVwbGljYXRlKCp0aGlzKTsgfQoKICAgIGNoYXIgICAgICAg KmRhdGEoKQkgY29uc3QJeyByZXR1cm4gc2hkLT5kYXRhOyB9CiAgICB1aW50CW5yZWZzKCkJIGNv bnN0CXsgcmV0dXJuIHNoZC0+Y291bnQ7IH0KICAgIHVpbnQJc2l6ZSgpCSBjb25zdAl7IHJldHVy biBzaGQtPmxlbjsgfQogICAgYm9vbAlpc0VxdWFsKCBjb25zdCBRR0FycmF5ICZhICkgY29uc3Q7 CgogICAgYm9vbAlyZXNpemUoIHVpbnQgbmV3c2l6ZSApOwoKICAgIGJvb2wJZmlsbCggY29uc3Qg Y2hhciAqZCwgaW50IGxlbiwgdWludCBzeiApOwoKICAgIFFHQXJyYXkgICAgJmFzc2lnbiggY29u c3QgUUdBcnJheSAmYSApOwogICAgUUdBcnJheSAgICAmYXNzaWduKCBjb25zdCBjaGFyICpkLCB1 aW50IGxlbiApOwogICAgUUdBcnJheSAgICAmZHVwbGljYXRlKCBjb25zdCBRR0FycmF5ICZhICk7 CiAgICBRR0FycmF5ICAgICZkdXBsaWNhdGUoIGNvbnN0IGNoYXIgKmQsIHVpbnQgbGVuICk7CiAg ICB2b2lkCXN0b3JlKCBjb25zdCBjaGFyICpkLCB1aW50IGxlbiApOwoKICAgIGFycmF5X2RhdGEg KnNoYXJlZEJsb2NrKCkJY29uc3QJCXsgcmV0dXJuIHNoZDsgfQogICAgdm9pZAlzZXRTaGFyZWRC bG9jayggYXJyYXlfZGF0YSAqcCApIHsgc2hkPShhcnJheV9kYXRhKilwOyB9CgogICAgUUdBcnJh eSAgICAmc2V0UmF3RGF0YSggY29uc3QgY2hhciAqZCwgdWludCBsZW4gKTsKICAgIHZvaWQJcmVz ZXRSYXdEYXRhKCBjb25zdCBjaGFyICpkLCB1aW50IGxlbiApOwoKICAgIGludAkJZmluZCggY29u c3QgY2hhciAqZCwgdWludCBpbmRleCwgdWludCBzeiApIGNvbnN0OwogICAgaW50CQljb250YWlu cyggY29uc3QgY2hhciAqZCwgdWludCBzeiApIGNvbnN0OwogICAgCiAgICB2b2lkCXNvcnQoIHVp bnQgc3ogKTsKICAgIGludAkJYnNlYXJjaCggY29uc3QgY2hhciAqZCwgdWludCBzeiApIGNvbnN0 OwoKICAgIGNoYXIgICAgICAgKmF0KCB1aW50IGluZGV4ICkgY29uc3Q7CgogICAgYm9vbAlzZXRF eHBhbmQoIHVpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmQsIHVpbnQgc3ogKTsKCnByb3RlY3RlZDoK ICAgIHZpcnR1YWwgYXJyYXlfZGF0YSAqbmV3RGF0YSgpOwogICAgdmlydHVhbCB2b2lkIGRlbGV0 ZURhdGEoIGFycmF5X2RhdGEgKnAgKTsKCnByaXZhdGU6CiAgICBzdGF0aWMgdm9pZCBtc2dfaW5k ZXgoIHVpbnQgKTsKICAgIGFycmF5X2RhdGEgKnNoZDsKfTsKCgppbmxpbmUgY2hhciAqUUdBcnJh eTo6YXQoIHVpbnQgaW5kZXggKSBjb25zdAp7CgogICAgaWYgKCBpbmRleCA+PSBzaXplKCkgKSB7 Cgltc2dfaW5kZXgoIGluZGV4ICk7CglpbmRleCA9IDA7CiAgICB9CgogICAgcmV0dXJuICZzaGQt PmRhdGFbaW5kZXhdOwp9CgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbWVtYXJyYXku aCIgMgoKCgoKdGVtcGxhdGU8Y2xhc3MgdHlwZT4gCmNsYXNzIFFNZW1BcnJheSAKOiBwdWJsaWMg UUdBcnJheQp7CnB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZSogSXRlcmF0b3I7CiAgICB0eXBlZGVm IGNvbnN0IHR5cGUqIENvbnN0SXRlcmF0b3I7CiAgICB0eXBlZGVmIHR5cGUgVmFsdWVUeXBlOwoK cHJvdGVjdGVkOgogICAgUU1lbUFycmF5KCBpbnQsIGludCApIDogUUdBcnJheSggMCwgMCApIHt9 CgpwdWJsaWM6CiAgICBRTWVtQXJyYXkoKSB7fQogICAgUU1lbUFycmF5KCBpbnQgc2l6ZSApIDog UUdBcnJheShzaXplKnNpemVvZih0eXBlKSkge30KICAgIFFNZW1BcnJheSggY29uc3QgUU1lbUFy cmF5PHR5cGU+ICZhICkgOiBRR0FycmF5KGEpIHt9CiAgIH5RTWVtQXJyYXkoKSB7fQogICAgUU1l bUFycmF5PHR5cGU+ICZvcGVyYXRvcj0oY29uc3QgUU1lbUFycmF5PHR5cGU+ICZhKQoJCQkJeyBy ZXR1cm4gKFFNZW1BcnJheTx0eXBlPiYpUUdBcnJheTo6YXNzaWduKGEpOyB9CiAgICB0eXBlICpk YXRhKCkgICAgY29uc3QJeyByZXR1cm4gKHR5cGUgKilRR0FycmF5OjpkYXRhKCk7IH0KICAgIHVp bnQgIG5yZWZzKCkgICBjb25zdAl7IHJldHVybiBRR0FycmF5OjpucmVmcygpOyB9CiAgICB1aW50 ICBzaXplKCkgICAgY29uc3QJeyByZXR1cm4gUUdBcnJheTo6c2l6ZSgpL3NpemVvZih0eXBlKTsg fQogICAgdWludCAgY291bnQoKSAgIGNvbnN0CXsgcmV0dXJuIHNpemUoKTsgfQogICAgYm9vbCAg aXNFbXB0eSgpIGNvbnN0CXsgcmV0dXJuIFFHQXJyYXk6OnNpemUoKSA9PSAwOyB9CiAgICBib29s ICBpc051bGwoKSAgY29uc3QJeyByZXR1cm4gUUdBcnJheTo6ZGF0YSgpID09IDA7IH0KICAgIGJv b2wgIHJlc2l6ZSggdWludCBzaXplICkJeyByZXR1cm4gUUdBcnJheTo6cmVzaXplKHNpemUqc2l6 ZW9mKHR5cGUpKTsgfQogICAgYm9vbCAgdHJ1bmNhdGUoIHVpbnQgcG9zICkJeyByZXR1cm4gUUdB cnJheTo6cmVzaXplKHBvcypzaXplb2YodHlwZSkpOyB9CiAgICBib29sICBmaWxsKCBjb25zdCB0 eXBlICZkLCBpbnQgc2l6ZSA9IC0xICkKCXsgcmV0dXJuIFFHQXJyYXk6OmZpbGwoKGNoYXIqKSZk LHNpemUsc2l6ZW9mKHR5cGUpICk7IH0KICAgIHZvaWQgIGRldGFjaCgpCQl7IFFHQXJyYXk6OmRl dGFjaCgpOyB9CiAgICBRTWVtQXJyYXk8dHlwZT4gICBjb3B5KCkgY29uc3QKCXsgUU1lbUFycmF5 PHR5cGU+IHRtcDsgcmV0dXJuIHRtcC5kdXBsaWNhdGUoKnRoaXMpOyB9CiAgICBRTWVtQXJyYXk8 dHlwZT4mIGFzc2lnbiggY29uc3QgUU1lbUFycmF5PHR5cGU+JiBhICkKCXsgcmV0dXJuIChRTWVt QXJyYXk8dHlwZT4mKVFHQXJyYXk6OmFzc2lnbihhKTsgfQogICAgUU1lbUFycmF5PHR5cGU+JiBh c3NpZ24oIGNvbnN0IHR5cGUgKmEsIHVpbnQgbiApCgl7IHJldHVybiAoUU1lbUFycmF5PHR5cGU+ JilRR0FycmF5Ojphc3NpZ24oKGNoYXIqKWEsbipzaXplb2YodHlwZSkpOyB9CiAgICBRTWVtQXJy YXk8dHlwZT4mIGR1cGxpY2F0ZSggY29uc3QgUU1lbUFycmF5PHR5cGU+JiBhICkKCXsgcmV0dXJu IChRTWVtQXJyYXk8dHlwZT4mKVFHQXJyYXk6OmR1cGxpY2F0ZShhKTsgfQogICAgUU1lbUFycmF5 PHR5cGU+JiBkdXBsaWNhdGUoIGNvbnN0IHR5cGUgKmEsIHVpbnQgbiApCgl7IHJldHVybiAoUU1l bUFycmF5PHR5cGU+JilRR0FycmF5OjpkdXBsaWNhdGUoKGNoYXIqKWEsbipzaXplb2YodHlwZSkp OyB9CiAgICBRTWVtQXJyYXk8dHlwZT4mIHNldFJhd0RhdGEoIGNvbnN0IHR5cGUgKmEsIHVpbnQg biApCgl7IHJldHVybiAoUU1lbUFycmF5PHR5cGU+JilRR0FycmF5OjpzZXRSYXdEYXRhKChjaGFy KilhLAoJCQkJCQkgICAgIG4qc2l6ZW9mKHR5cGUpKTsgfQogICAgdm9pZCByZXNldFJhd0RhdGEo IGNvbnN0IHR5cGUgKmEsIHVpbnQgbiApCgl7IFFHQXJyYXk6OnJlc2V0UmF3RGF0YSgoY2hhciop YSxuKnNpemVvZih0eXBlKSk7IH0KICAgIGludAkgZmluZCggY29uc3QgdHlwZSAmZCwgdWludCBp PTAgKSBjb25zdAoJeyByZXR1cm4gUUdBcnJheTo6ZmluZCgoY2hhciopJmQsaSxzaXplb2YodHlw ZSkpOyB9CiAgICBpbnQJIGNvbnRhaW5zKCBjb25zdCB0eXBlICZkICkgY29uc3QKCXsgcmV0dXJu IFFHQXJyYXk6OmNvbnRhaW5zKChjaGFyKikmZCxzaXplb2YodHlwZSkpOyB9CiAgICB2b2lkIHNv cnQoKSB7IFFHQXJyYXk6OnNvcnQoc2l6ZW9mKHR5cGUpKTsgfQogICAgaW50ICBic2VhcmNoKCBj b25zdCB0eXBlICZkICkgY29uc3QKCXsgcmV0dXJuIFFHQXJyYXk6OmJzZWFyY2goKGNvbnN0IGNo YXIqKSZkLHNpemVvZih0eXBlKSk7IH0KICAgIHR5cGUmIG9wZXJhdG9yW10oIGludCBpICkgY29u c3QKCXsgcmV0dXJuICh0eXBlICYpKCoodHlwZSAqKVFHQXJyYXk6OmF0KGkqc2l6ZW9mKHR5cGUp KSk7IH0KICAgIHR5cGUmIGF0KCB1aW50IGkgKSBjb25zdAoJeyByZXR1cm4gKHR5cGUgJikoKih0 eXBlICopUUdBcnJheTo6YXQoaSpzaXplb2YodHlwZSkpKTsgfQoJIG9wZXJhdG9yIGNvbnN0IHR5 cGUqKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IHR5cGUgKilRR0FycmF5OjpkYXRhKCk7IH0KICAg IGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUU1lbUFycmF5PHR5cGU+ICZhICkgY29uc3QgeyByZXR1 cm4gaXNFcXVhbChhKTsgfQogICAgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRTWVtQXJyYXk8dHlw ZT4gJmEgKSBjb25zdCB7IHJldHVybiAhaXNFcXVhbChhKTsgfQogICAgSXRlcmF0b3IgYmVnaW4o KSB7IHJldHVybiBkYXRhKCk7IH0KICAgIEl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGRhdGEoKSAr IHNpemUoKTsgfQogICAgQ29uc3RJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGRhdGEo KTsgfQogICAgQ29uc3RJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBkYXRhKCkgKyBzaXpl KCk7IH0KfTsKCgoKCgoKCgoKCgoKCiMgNDMgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xY3N0cmlu Zy5oIiAyCgoKCiMgMSAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoK CgoKCiAKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCgoKIAoKCgoKCgoK IAojIDEzOCAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDMKCgogCgoKCgoKCgoKCiAKCgoKCgog CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMTk2ICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMu aCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgogCgoKCgoKCgoKIAoK CgoKIAoKIyAxICIvdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoK CgoKCgoKIAoKCgoKIAoKCgoKCiAKCgoKCgoKCgogCgoKCgojIDcxICIvdXNyL2luY2x1ZGUvc3lz L2NkZWZzLmgiIDMKCgogCgoKCgoKCgogCgoKCiMgMTAzICIvdXNyL2luY2x1ZGUvc3lzL2NkZWZz LmgiIDMKCgoKIAoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCiAKCgoKCgoKCgog CgoKCgoKCgoKCiAKCgoKCgoKCiMgMjUwICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMiAzCgoK IAoKCgoKCgoKCiAKCgoKCgogCgogCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvZ251L3N0dWJz LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAyNzggIi91 c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAyIDMKCgoKCiMgMjYgIi91c3IvaW5jbHVkZS9zdHJpbmcu aCIgMiAzCgoKZXh0ZXJuICJDIiB7IAoKIAoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKIyAxMzEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5k cmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCiAKCiMgMjcxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgojIDI4MyAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK IAoKIAoKIyAzMTcgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMv aW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDMzICIvdXNy L2luY2x1ZGUvc3RyaW5nLmgiIDIgMwoKCgogCmV4dGVybiB2b2lkICogIG1lbWNweSAgKHZvaWQg KiAgX19yZXN0cmljdCBfX2Rlc3QsCgkJCSAgICBfX2NvbnN0IHZvaWQgKiAgX19yZXN0cmljdCBf X3NyYywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CiAKCmV4dGVybiB2b2lkICogIG1lbW1vdmUg ICh2b2lkICogIF9fZGVzdCwgX19jb25zdCB2b2lkICogIF9fc3JjLAoJCQkgICAgIHNpemVfdCBf X24pICB0aHJvdyAoKSAgOwoKIAoKCgpleHRlcm4gdm9pZCAqICBtZW1jY3B5ICAodm9pZCAqICBf X2Rlc3QsIF9fY29uc3Qgdm9pZCAqICBfX3NyYywKCQkJICAgICBpbnQgX19jLCBzaXplX3QgX19u KSAgdGhyb3cgKCkgIDsKCgoKIApleHRlcm4gdm9pZCAqICBtZW1zZXQgICh2b2lkICogIF9fcywg aW50IF9fYywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgbWVtY21wICAo X19jb25zdCB2b2lkICogIF9fczEsIF9fY29uc3Qgdm9pZCAqICBfX3MyLAoJCQlzaXplX3QgX19u KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgKiAgbWVtY2hyICAoX19jb25zdCB2b2lkICog IF9fcywgaW50IF9fYywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgoKCgoKCgoKIApleHRlcm4g Y2hhciAqc3RyY3B5ICAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsCgkJCSAgX19jb25zdCBjaGFy ICpfX3Jlc3RyaWN0IF9fc3JjKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gY2hhciAqc3RybmNweSAg KGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LAoJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3Qg X19zcmMsIHNpemVfdCBfX24pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gY2hhciAqc3RyY2F0ICAo Y2hhciAqX19yZXN0cmljdCBfX2Rlc3QsCgkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9f c3JjKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gY2hhciAqc3RybmNhdCAgKGNoYXIgKl9fcmVzdHJp Y3QgX19kZXN0LAoJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBf X24pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHN0cmNtcCAgKF9fY29uc3QgY2hhciAqX19z MSwgX19jb25zdCBjaGFyICpfX3MyKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gaW50IHN0cm5jbXAg IChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgc2l6ZV90IF9fbikgIHRo cm93ICgpICA7CgogCmV4dGVybiBpbnQgc3RyY29sbCAgKF9fY29uc3QgY2hhciAqX19zMSwgX19j b25zdCBjaGFyICpfX3MyKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gc2l6ZV90IHN0cnhmcm0gIChj aGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwKCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X3NyYywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgojIDEwNyAiL3Vzci9pbmNsdWRlL3N0cmlu Zy5oIiAzCgoKCiAKZXh0ZXJuIGNoYXIgKl9fc3RyZHVwICAoX19jb25zdCBjaGFyICpfX3MpICB0 aHJvdyAoKSAgOwpleHRlcm4gY2hhciAqc3RyZHVwICAoX19jb25zdCBjaGFyICpfX3MpICB0aHJv dyAoKSAgOwoKCiAKCgoKCgoKIyAxNDMgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwoKCiAKZXh0 ZXJuIGNoYXIgKnN0cmNociAgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSAgdGhyb3cgKCkg IDsKIApleHRlcm4gY2hhciAqc3RycmNociAgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSAg dGhyb3cgKCkgIDsKCgoKCgoKCiAKCmV4dGVybiBzaXplX3Qgc3RyY3NwbiAgKF9fY29uc3QgY2hh ciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVqZWN0KSAgdGhyb3cgKCkgIDsKIAoKZXh0ZXJuIHNp emVfdCBzdHJzcG4gIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkg IHRocm93ICgpICA7CiAKZXh0ZXJuIGNoYXIgKnN0cnBicmsgIChfX2NvbnN0IGNoYXIgKl9fcywg X19jb25zdCBjaGFyICpfX2FjY2VwdCkgIHRocm93ICgpICA7CiAKZXh0ZXJuIGNoYXIgKnN0cnN0 ciAgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkgIHRo cm93ICgpICA7CgoKCgoKCgoKCiAKZXh0ZXJuIGNoYXIgKnN0cnRvayAgKGNoYXIgKl9fcmVzdHJp Y3QgX19zLAoJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKSAgdGhyb3cgKCkg IDsKCiAKCmV4dGVybiBjaGFyICpfX3N0cnRva19yICAoY2hhciAqX19yZXN0cmljdCBfX3MsCgkJ CSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltLAoJCQkgICAgICBjaGFyICoq X19yZXN0cmljdCBfX3NhdmVfcHRyKSAgdGhyb3cgKCkgIDsKCmV4dGVybiBjaGFyICpzdHJ0b2tf ciAgKGNoYXIgKl9fcmVzdHJpY3QgX19zLAoJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0 IF9fZGVsaW0sCgkJCSAgICBjaGFyICoqX19yZXN0cmljdCBfX3NhdmVfcHRyKSAgdGhyb3cgKCkg IDsKCgojIDIwMyAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAzCgoKCiAKZXh0ZXJuIHNpemVfdCBz dHJsZW4gIChfX2NvbnN0IGNoYXIgKl9fcykgIHRocm93ICgpICA7CgoKCgoKCgoKIApleHRlcm4g Y2hhciAqc3RyZXJyb3IgIChpbnQgX19lcnJudW0pICB0aHJvdyAoKSAgOwoKIAoKZXh0ZXJuIGNo YXIgKl9fc3RyZXJyb3JfciAgKGludCBfX2Vycm51bSwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1 ZmxlbikgIHRocm93ICgpICA7CmV4dGVybiBjaGFyICpzdHJlcnJvcl9yICAoaW50IF9fZXJybnVt LCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4g dm9pZCBfX2J6ZXJvICAodm9pZCAqICBfX3MsIHNpemVfdCBfX24pICB0aHJvdyAoKSAgOwoKCiAK ZXh0ZXJuIHZvaWQgYmNvcHkgIChfX2NvbnN0IHZvaWQgKiAgX19zcmMsIHZvaWQgKiAgX19kZXN0 LCBzaXplX3QgX19uKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgYnplcm8gICh2b2lkICog IF9fcywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgYmNtcCAgKF9fY29u c3Qgdm9pZCAqICBfX3MxLCBfX2NvbnN0IHZvaWQgKiAgX19zMiwgc2l6ZV90IF9fbikgIHRocm93 ICgpICA7CgogCmV4dGVybiBjaGFyICppbmRleCAgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19j KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGNoYXIgKnJpbmRleCAgKF9fY29uc3QgY2hhciAqX19z LCBpbnQgX19jKSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBpbnQgX19mZnMgIChpbnQgX19pKSAg dGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKTsKZXh0ZXJuIGludCBmZnMgIChpbnQg X19pKSAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKTsKCiAKCgoKCgoKCgoKIApl eHRlcm4gaW50IF9fc3RyY2FzZWNtcCAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFy ICpfX3MyKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBzdHJjYXNlY21wICAoX19jb25zdCBjaGFy ICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHN0 cm5jYXNlY21wICAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsCgkJCSAg ICAgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgoKIyAyNzcgIi91c3IvaW5jbHVkZS9zdHJpbmcu aCIgMwoKCgogCgpleHRlcm4gY2hhciAqc3Ryc2VwICAoY2hhciAqKl9fcmVzdHJpY3QgX19zdHJp bmdwLAoJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKSAgdGhyb3cgKCkgIDsK CgojIDMxOSAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAzCgoKCgojIDM0NyAiL3Vzci9pbmNsdWRl L3N0cmluZy5oIiAzCgoKCn0gCgoKIyA0NiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fjc3RyaW5n LmgiIDIKCgoKIAoKCgogIHZvaWQgKnFtZW1tb3ZlKCB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNy YywgdWludCBsZW4gKTsKCiAgY2hhciAqcXN0cmR1cCggY29uc3QgY2hhciAqICk7CgogIGlubGlu ZSB1aW50IHFzdHJsZW4oIGNvbnN0IGNoYXIgKnN0ciApCnsgcmV0dXJuIHN0ciA/ICh1aW50KXN0 cmxlbihzdHIpIDogMDsgfQoKICBpbmxpbmUgY2hhciAqcXN0cmNweSggY2hhciAqZHN0LCBjb25z dCBjaGFyICpzcmMgKQp7IHJldHVybiBzcmMgPyBzdHJjcHkoZHN0LCBzcmMpIDogMDsgfQoKICBj aGFyICpxc3RybmNweSggY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHVpbnQgbGVuICk7Cgog IGlubGluZSBpbnQgcXN0cmNtcCggY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiAp CnsKICAgIHJldHVybiAoIHN0cjEgJiYgc3RyMiApID8gc3RyY21wKCBzdHIxLCBzdHIyICkKCQkJ ICAgIDogKCBzdHIxID8gMSA6ICggc3RyMiA/IC0xIDogMCApICk7Cn0KCiAgaW5saW5lIGludCBx c3RybmNtcCggY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiwgdWludCBsZW4gKQp7 CiAgICByZXR1cm4gKCBzdHIxICYmIHN0cjIgKSA/IHN0cm5jbXAoIHN0cjEsIHN0cjIsIGxlbiAp CgkJCSAgICA6ICggc3RyMSA/IDEgOiAoIHN0cjIgPyAtMSA6IDAgKSApOwp9CgogIGludCBxc3Ry aWNtcCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogKTsKCiAgaW50IHFzdHJuaWNtcCggY29u c3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVpbnQgbGVuICk7CgoKICBpbmxpbmUgdWludCBjc3Ry bGVuKCBjb25zdCBjaGFyICpzdHIgKQp7IHJldHVybiAodWludClzdHJsZW4oc3RyKTsgfQoKICBp bmxpbmUgY2hhciAqY3N0cmNweSggY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMgKQp7IHJldHVy biBzdHJjcHkoZHN0LHNyYyk7IH0KCiAgaW5saW5lIGludCBjc3RyY21wKCBjb25zdCBjaGFyICpz dHIxLCBjb25zdCBjaGFyICpzdHIyICkKeyByZXR1cm4gc3RyY21wKHN0cjEsc3RyMik7IH0KCiAg aW5saW5lIGludCBjc3RybmNtcCggY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiwg dWludCBsZW4gKQp7IHJldHVybiBzdHJuY21wKHN0cjEsc3RyMixsZW4pOyB9CgoKCiAKCiAgUV9V SU5UMTYgcUNoZWNrc3VtKCBjb25zdCBjaGFyICpzLCB1aW50IGxlbiApOwoKIAoKCgoKCgoKIyAx MTkgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xY3N0cmluZy5oIgoKdHlwZWRlZiBRTWVtQXJyYXk8 Y2hhcj4gUUJ5dGVBcnJheTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRh U3RyZWFtICYsIGNvbnN0IFFCeXRlQXJyYXkgJiApOwogIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBRRGF0YVN0cmVhbSAmLCBRQnl0ZUFycmF5ICYgKTsKCgoKCiAKCgoKY2xhc3MgUVJlZ0V4cDsK CmNsYXNzICAgUUNTdHJpbmcgOiBwdWJsaWMgUUJ5dGVBcnJheQkgCnsKcHVibGljOgogICAgUUNT dHJpbmcoKSB7fQkJCQkgCiAgICBRQ1N0cmluZyggaW50IHNpemUgKTsJCQkgCiAgICBRQ1N0cmlu ZyggY29uc3QgUUNTdHJpbmcgJnMgKSA6IFFCeXRlQXJyYXkoIHMgKSB7fQogICAgUUNTdHJpbmco IGNvbnN0IGNoYXIgKnN0ciApOwkJIAogICAgUUNTdHJpbmcoIGNvbnN0IGNoYXIgKnN0ciwgdWlu dCBtYXhsZW4gKTsJIAogICAgflFDU3RyaW5nKCk7CgogICAgUUNTdHJpbmcgICAgJm9wZXJhdG9y PSggY29uc3QgUUNTdHJpbmcgJnMgKTsgCiAgICBRQ1N0cmluZyAgICAmb3BlcmF0b3I9KCBjb25z dCBjaGFyICpzdHIgKTsJIAoKICAgIGJvb2wJaXNOdWxsKCkJY29uc3Q7CiAgICBib29sCWlzRW1w dHkoKQljb25zdDsKICAgIHVpbnQJbGVuZ3RoKCkJY29uc3Q7CiAgICBib29sCXJlc2l6ZSggdWlu dCBuZXdsZW4gKTsKICAgIGJvb2wJdHJ1bmNhdGUoIHVpbnQgcG9zICk7CiAgICBib29sCWZpbGwo IGNoYXIgYywgaW50IGxlbiA9IC0xICk7CgogICAgUUNTdHJpbmcJY29weSgpCWNvbnN0OwoKICAg IFFDU3RyaW5nICAgICZzcHJpbnRmKCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLiApOwoKICAgIGlu dAkJZmluZCggY2hhciBjLCBpbnQgaW5kZXg9MCwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAgICBp bnQJCWZpbmQoIGNvbnN0IGNoYXIgKnN0ciwgaW50IGluZGV4PTAsIGJvb2wgY3M9VFJVRSApIGNv bnN0OwoKICAgIGludAkJZmluZCggY29uc3QgUVJlZ0V4cCAmLCBpbnQgaW5kZXg9MCApIGNvbnN0 OwoKICAgIGludAkJZmluZFJldiggY2hhciBjLCBpbnQgaW5kZXg9LTEsIGJvb2wgY3M9VFJVRSkg Y29uc3Q7CiAgICBpbnQJCWZpbmRSZXYoIGNvbnN0IGNoYXIgKnN0ciwgaW50IGluZGV4PS0xLCBi b29sIGNzPVRSVUUpIGNvbnN0OwoKICAgIGludAkJZmluZFJldiggY29uc3QgUVJlZ0V4cCAmLCBp bnQgaW5kZXg9LTEgKSBjb25zdDsKCiAgICBpbnQJCWNvbnRhaW5zKCBjaGFyIGMsIGJvb2wgY3M9 VFJVRSApIGNvbnN0OwogICAgaW50CQljb250YWlucyggY29uc3QgY2hhciAqc3RyLCBib29sIGNz PVRSVUUgKSBjb25zdDsKCiAgICBpbnQJCWNvbnRhaW5zKCBjb25zdCBRUmVnRXhwICYgKSBjb25z dDsKCiAgICBRQ1N0cmluZwlsZWZ0KCB1aW50IGxlbiApICBjb25zdDsKICAgIFFDU3RyaW5nCXJp Z2h0KCB1aW50IGxlbiApIGNvbnN0OwogICAgUUNTdHJpbmcJbWlkKCB1aW50IGluZGV4LCB1aW50 IGxlbj0weGZmZmZmZmZmKSBjb25zdDsKCiAgICBRQ1N0cmluZwlsZWZ0SnVzdGlmeSggdWludCB3 aWR0aCwgY2hhciBmaWxsPScgJywgYm9vbCB0cnVuYz1GQUxTRSljb25zdDsKICAgIFFDU3RyaW5n CXJpZ2h0SnVzdGlmeSggdWludCB3aWR0aCwgY2hhciBmaWxsPScgJyxib29sIHRydW5jPUZBTFNF KWNvbnN0OwoKICAgIFFDU3RyaW5nCWxvd2VyKCkgY29uc3Q7CiAgICBRQ1N0cmluZwl1cHBlcigp IGNvbnN0OwoKICAgIFFDU3RyaW5nCXN0cmlwV2hpdGVTcGFjZSgpCWNvbnN0OwogICAgUUNTdHJp bmcJc2ltcGxpZnlXaGl0ZVNwYWNlKCkJY29uc3Q7CgogICAgUUNTdHJpbmcgICAgJmluc2VydCgg dWludCBpbmRleCwgY29uc3QgY2hhciAqICk7CiAgICBRQ1N0cmluZyAgICAmaW5zZXJ0KCB1aW50 IGluZGV4LCBjaGFyICk7CiAgICBRQ1N0cmluZyAgICAmYXBwZW5kKCBjb25zdCBjaGFyICogKTsK ICAgIFFDU3RyaW5nICAgICZwcmVwZW5kKCBjb25zdCBjaGFyICogKTsKICAgIFFDU3RyaW5nICAg ICZyZW1vdmUoIHVpbnQgaW5kZXgsIHVpbnQgbGVuICk7CiAgICBRQ1N0cmluZyAgICAmcmVwbGFj ZSggdWludCBpbmRleCwgdWludCBsZW4sIGNvbnN0IGNoYXIgKiApOwoKICAgIFFDU3RyaW5nICAg ICZyZXBsYWNlKCBjb25zdCBRUmVnRXhwICYsIGNvbnN0IGNoYXIgKiApOwoKICAgIHNob3J0CXRv U2hvcnQoIGJvb2wgKm9rPTAgKQljb25zdDsKICAgIHVzaG9ydAl0b1VTaG9ydCggYm9vbCAqb2s9 MCApCWNvbnN0OwogICAgaW50CQl0b0ludCggYm9vbCAqb2s9MCApCWNvbnN0OwogICAgdWludAl0 b1VJbnQoIGJvb2wgKm9rPTAgKQljb25zdDsKICAgIGxvbmcJdG9Mb25nKCBib29sICpvaz0wICkJ Y29uc3Q7CiAgICB1bG9uZwl0b1VMb25nKCBib29sICpvaz0wICkJY29uc3Q7CiAgICBmbG9hdAl0 b0Zsb2F0KCBib29sICpvaz0wICkJY29uc3Q7CiAgICBkb3VibGUJdG9Eb3VibGUoIGJvb2wgKm9r PTAgKQljb25zdDsKCiAgICBRQ1N0cmluZyAgICAmc2V0U3RyKCBjb25zdCBjaGFyICpzICk7CiAg ICBRQ1N0cmluZyAgICAmc2V0TnVtKCBzaG9ydCApOwogICAgUUNTdHJpbmcgICAgJnNldE51bSgg dXNob3J0ICk7CiAgICBRQ1N0cmluZyAgICAmc2V0TnVtKCBpbnQgKTsKICAgIFFDU3RyaW5nICAg ICZzZXROdW0oIHVpbnQgKTsKICAgIFFDU3RyaW5nICAgICZzZXROdW0oIGxvbmcgKTsKICAgIFFD U3RyaW5nICAgICZzZXROdW0oIHVsb25nICk7CiAgICBRQ1N0cmluZyAgICAmc2V0TnVtKCBmbG9h dCwgY2hhciBmPSdnJywgaW50IHByZWM9NiApOwogICAgUUNTdHJpbmcgICAgJnNldE51bSggZG91 YmxlLCBjaGFyIGY9J2cnLCBpbnQgcHJlYz02ICk7CgogICAgYm9vbAlzZXRFeHBhbmQoIHVpbnQg aW5kZXgsIGNoYXIgYyApOwoKCQlvcGVyYXRvciBjb25zdCBjaGFyICooKSBjb25zdDsKICAgIFFD U3RyaW5nICAgICZvcGVyYXRvcis9KCBjb25zdCBjaGFyICpzdHIgKTsKICAgIFFDU3RyaW5nICAg ICZvcGVyYXRvcis9KCBjaGFyIGMgKTsKfTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9y PDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFDU3RyaW5nICYgKTsKICBRRGF0YVN0cmVhbSAmb3Bl cmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUUNTdHJpbmcgJiApOwoKCiAKCgoKaW5saW5lIFFDU3Ry aW5nICZRQ1N0cmluZzo6b3BlcmF0b3I9KCBjb25zdCBRQ1N0cmluZyAmcyApCnsgcmV0dXJuIChR Q1N0cmluZyYpYXNzaWduKCBzICk7IH0KCmlubGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6Om9wZXJh dG9yPSggY29uc3QgY2hhciAqc3RyICkKeyByZXR1cm4gKFFDU3RyaW5nJilkdXBsaWNhdGUoIHN0 ciwgcXN0cmxlbihzdHIpKzEgKTsgfQoKaW5saW5lIGJvb2wgUUNTdHJpbmc6OmlzTnVsbCgpIGNv bnN0CnsgcmV0dXJuIGRhdGEoKSA9PSAwOyB9CgppbmxpbmUgYm9vbCBRQ1N0cmluZzo6aXNFbXB0 eSgpIGNvbnN0CnsgcmV0dXJuIGRhdGEoKSA9PSAwIHx8ICpkYXRhKCkgPT0gJ1wwJzsgfQoKaW5s aW5lIHVpbnQgUUNTdHJpbmc6Omxlbmd0aCgpIGNvbnN0CnsgcmV0dXJuIHFzdHJsZW4oIGRhdGEo KSApOyB9CgppbmxpbmUgYm9vbCBRQ1N0cmluZzo6dHJ1bmNhdGUoIHVpbnQgcG9zICkKeyByZXR1 cm4gcmVzaXplKHBvcysxKTsgfQoKaW5saW5lIFFDU3RyaW5nIFFDU3RyaW5nOjpjb3B5KCkgY29u c3QKeyByZXR1cm4gUUNTdHJpbmcoIGRhdGEoKSApOyB9CgppbmxpbmUgUUNTdHJpbmcgJlFDU3Ry aW5nOjpwcmVwZW5kKCBjb25zdCBjaGFyICpzICkKeyByZXR1cm4gaW5zZXJ0KDAscyk7IH0KCmlu bGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6OmFwcGVuZCggY29uc3QgY2hhciAqcyApCnsgcmV0dXJu IG9wZXJhdG9yKz0ocyk7IH0KCmlubGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6OnNldE51bSggc2hv cnQgbiApCnsgcmV0dXJuIHNldE51bSgobG9uZyluKTsgfQoKaW5saW5lIFFDU3RyaW5nICZRQ1N0 cmluZzo6c2V0TnVtKCB1c2hvcnQgbiApCnsgcmV0dXJuIHNldE51bSgodWxvbmcpbik7IH0KCmlu bGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6OnNldE51bSggaW50IG4gKQp7IHJldHVybiBzZXROdW0o KGxvbmcpbik7IH0KCmlubGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6OnNldE51bSggdWludCBuICkK eyByZXR1cm4gc2V0TnVtKCh1bG9uZyluKTsgfQoKaW5saW5lIFFDU3RyaW5nICZRQ1N0cmluZzo6 c2V0TnVtKCBmbG9hdCBuLCBjaGFyIGYsIGludCBwcmVjICkKeyByZXR1cm4gc2V0TnVtKChkb3Vi bGUpbixmLHByZWMpOyB9CgppbmxpbmUgUUNTdHJpbmc6Om9wZXJhdG9yIGNvbnN0IGNoYXIgKigp IGNvbnN0CnsgcmV0dXJuIChjb25zdCBjaGFyICopZGF0YSgpOyB9CgoKIAoKCgogIGlubGluZSBi b29sIG9wZXJhdG9yPT0oIGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkK eyByZXR1cm4gcXN0cmNtcChzMS5kYXRhKCksczIuZGF0YSgpKSA9PSAwOyB9CgogIGlubGluZSBi b29sIG9wZXJhdG9yPT0oIGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKQp7IHJl dHVybiBxc3RyY21wKHMxLmRhdGEoKSxzMikgPT0gMDsgfQoKICBpbmxpbmUgYm9vbCBvcGVyYXRv cj09KCBjb25zdCBjaGFyICpzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNt cChzMSxzMi5kYXRhKCkpID09IDA7IH0KCiAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPSggY29uc3Qg UUNTdHJpbmcgJnMxLCBjb25zdCBRQ1N0cmluZyAmczIgKQp7IHJldHVybiBxc3RyY21wKHMxLmRh dGEoKSxzMi5kYXRhKCkpICE9IDA7IH0KCiAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPSggY29uc3Qg UUNTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEuZGF0YSgp LHMyKSAhPSAwOyB9CgogIGlubGluZSBib29sIG9wZXJhdG9yIT0oIGNvbnN0IGNoYXIgKnMxLCBj b25zdCBRQ1N0cmluZyAmczIgKQp7IHJldHVybiBxc3RyY21wKHMxLHMyLmRhdGEoKSkgIT0gMDsg fQoKICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoIGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgUUNT dHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNtcChzMS5kYXRhKCksczIuZGF0YSgpKSA8IDA7IH0K CiAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KCBjb25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IGNoYXIg KnMyICkKeyByZXR1cm4gcXN0cmNtcChzMS5kYXRhKCksczIpIDwgMDsgfQoKICBpbmxpbmUgYm9v bCBvcGVyYXRvcjwoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBRQ1N0cmluZyAmczIgKQp7IHJldHVy biBxc3RyY21wKHMxLHMyLmRhdGEoKSkgPCAwOyB9CgogIGlubGluZSBib29sIG9wZXJhdG9yPD0o IGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNt cChzMS5kYXRhKCksczIuZGF0YSgpKSA8PSAwOyB9CgogIGlubGluZSBib29sIG9wZXJhdG9yPD0o IGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKQp7IHJldHVybiBxc3RyY21wKHMx LmRhdGEoKSxzMikgPD0gMDsgfQoKICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KCBjb25zdCBjaGFy ICpzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNtcChzMSxzMi5kYXRhKCkp IDw9IDA7IH0KCiAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KCBjb25zdCBRQ1N0cmluZyAmczEsIGNv bnN0IFFDU3RyaW5nICZzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEuZGF0YSgpLHMyLmRhdGEoKSkg PiAwOyB9CgogIGlubGluZSBib29sIG9wZXJhdG9yPiggY29uc3QgUUNTdHJpbmcgJnMxLCBjb25z dCBjaGFyICpzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEuZGF0YSgpLHMyKSA+IDA7IH0KCiAgaW5s aW5lIGJvb2wgb3BlcmF0b3I+KCBjb25zdCBjaGFyICpzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkK eyByZXR1cm4gcXN0cmNtcChzMSxzMi5kYXRhKCkpID4gMDsgfQoKICBpbmxpbmUgYm9vbCBvcGVy YXRvcj49KCBjb25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IFFDU3RyaW5nICZzMiApCnsgcmV0dXJu IHFzdHJjbXAoczEuZGF0YSgpLHMyLmRhdGEoKSkgPj0gMDsgfQoKICBpbmxpbmUgYm9vbCBvcGVy YXRvcj49KCBjb25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICkKeyByZXR1cm4gcXN0 cmNtcChzMS5kYXRhKCksczIpID49IDA7IH0KCiAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PSggY29u c3QgY2hhciAqczEsIGNvbnN0IFFDU3RyaW5nICZzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEsczIu ZGF0YSgpKSA+PSAwOyB9CgogIGlubGluZSBjb25zdCBRQ1N0cmluZyBvcGVyYXRvcisoIGNvbnN0 IFFDU3RyaW5nICZzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKewogICAgUUNTdHJpbmcgdG1wKCBz MS5kYXRhKCkgKTsKICAgIHRtcCArPSBzMjsKICAgIHJldHVybiB0bXA7Cn0KCiAgaW5saW5lIGNv bnN0IFFDU3RyaW5nIG9wZXJhdG9yKyggY29uc3QgUUNTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpz MiApCnsKICAgIFFDU3RyaW5nIHRtcCggczEuZGF0YSgpICk7CiAgICB0bXAgKz0gczI7CiAgICBy ZXR1cm4gdG1wOwp9CgogIGlubGluZSBjb25zdCBRQ1N0cmluZyBvcGVyYXRvcisoIGNvbnN0IGNo YXIgKnMxLCBjb25zdCBRQ1N0cmluZyAmczIgKQp7CiAgICBRQ1N0cmluZyB0bXAoIHMxICk7CiAg ICB0bXAgKz0gczI7CiAgICByZXR1cm4gdG1wOwp9CgogIGlubGluZSBjb25zdCBRQ1N0cmluZyBv cGVyYXRvcisoIGNvbnN0IFFDU3RyaW5nICZzMSwgY2hhciBjMiApCnsKICAgIFFDU3RyaW5nIHRt cCggczEuZGF0YSgpICk7CiAgICB0bXAgKz0gYzI7CiAgICByZXR1cm4gdG1wOwp9CgogIGlubGlu ZSBjb25zdCBRQ1N0cmluZyBvcGVyYXRvcisoIGNoYXIgYzEsIGNvbnN0IFFDU3RyaW5nICZzMiAp CnsKICAgIFFDU3RyaW5nIHRtcDsKICAgIHRtcCArPSBjMTsKICAgIHRtcCArPSBzMjsKICAgIHJl dHVybiB0bXA7Cn0KCgojIDQzICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXN0cmluZy5oIiAyCgoK CgogCgoKCmNsYXNzIFFSZWdFeHA7CmNsYXNzIFFTdHJpbmc7CmNsYXNzIFFDaGFyUmVmOwoKY2xh c3MgICBRQ2hhciB7CnB1YmxpYzoKICAgIFFDaGFyKCk7CiAgICBRQ2hhciggY2hhciBjICk7CiAg ICBRQ2hhciggdWNoYXIgYyApOwogICAgUUNoYXIoIHVjaGFyIGMsIHVjaGFyIHIgKTsKICAgIFFD aGFyKCBjb25zdCBRQ2hhciYgYyApOwogICAgUUNoYXIoIHVzaG9ydCByYyApOwogICAgUUNoYXIo IHNob3J0IHJjICk7CiAgICBRQ2hhciggdWludCByYyApOwogICAgUUNoYXIoIGludCByYyApOwoK ICAgIHN0YXRpYyBjb25zdCAgUUNoYXIgbnVsbDsgICAgICAgICAgICAgCiAgICBzdGF0aWMgY29u c3QgIFFDaGFyIHJlcGxhY2VtZW50OyAgICAgIAogICAgc3RhdGljIGNvbnN0ICBRQ2hhciBieXRl T3JkZXJNYXJrOyAgICAgIAogICAgc3RhdGljIGNvbnN0ICBRQ2hhciBieXRlT3JkZXJTd2FwcGVk OyAgICAgIAogICAgc3RhdGljIGNvbnN0ICBRQ2hhciBuYnNwOyAgICAgICAgICAgICAKCiAgICAg CgogICAgZW51bSBDYXRlZ29yeQogICAgewogICAgICAgIE5vQ2F0ZWdvcnksCgogICAgICAgIE1h cmtfTm9uU3BhY2luZywgICAgICAgICAgIAogICAgICAgIE1hcmtfU3BhY2luZ0NvbWJpbmluZywg ICAgIAogICAgICAgIE1hcmtfRW5jbG9zaW5nLCAgICAgICAgICAgIAoKICAgICAgICBOdW1iZXJf RGVjaW1hbERpZ2l0LCAgICAgICAKICAgICAgICBOdW1iZXJfTGV0dGVyLCAgICAgICAgICAgICAK ICAgICAgICBOdW1iZXJfT3RoZXIsICAgICAgICAgICAgICAKCiAgICAgICAgU2VwYXJhdG9yX1Nw YWNlLCAgICAgICAgICAgCiAgICAgICAgU2VwYXJhdG9yX0xpbmUsICAgICAgICAgICAgCiAgICAg ICAgU2VwYXJhdG9yX1BhcmFncmFwaCwgICAgICAgCgogICAgICAgIE90aGVyX0NvbnRyb2wsICAg ICAgICAgICAgIAogICAgICAgIE90aGVyX0Zvcm1hdCwgICAgICAgICAgICAgIAogICAgICAgIE90 aGVyX1N1cnJvZ2F0ZSwgICAgICAgICAgIAogICAgICAgIE90aGVyX1ByaXZhdGVVc2UsICAgICAg ICAgIAogICAgICAgIE90aGVyX05vdEFzc2lnbmVkLCAgICAgICAgIAoKICAgICAgICBMZXR0ZXJf VXBwZXJjYXNlLCAgICAgICAgICAKICAgICAgICBMZXR0ZXJfTG93ZXJjYXNlLCAgICAgICAgICAK ICAgICAgICBMZXR0ZXJfVGl0bGVjYXNlLCAgICAgICAgICAKICAgICAgICBMZXR0ZXJfTW9kaWZp ZXIsICAgICAgICAgICAKICAgICAgICBMZXR0ZXJfT3RoZXIsICAgICAgICAgICAgICAKCiAgICAg ICAgUHVuY3R1YXRpb25fQ29ubmVjdG9yLCAgICAgCiAgICAgICAgUHVuY3R1YXRpb25fRGFzaCwg ICAgICAgICAgCiAgICAgICAgUHVuY3R1YXRpb25fRGFzayA9IFB1bmN0dWF0aW9uX0Rhc2gsICAK ICAgICAgICBQdW5jdHVhdGlvbl9PcGVuLCAgICAgICAgICAKICAgICAgICBQdW5jdHVhdGlvbl9D bG9zZSwgICAgICAgICAKICAgICAgICBQdW5jdHVhdGlvbl9Jbml0aWFsUXVvdGUsICAKICAgICAg ICBQdW5jdHVhdGlvbl9GaW5hbFF1b3RlLCAgICAKICAgICAgICBQdW5jdHVhdGlvbl9PdGhlciwg ICAgICAgICAKCiAgICAgICAgU3ltYm9sX01hdGgsICAgICAgICAgICAgICAgCiAgICAgICAgU3lt Ym9sX0N1cnJlbmN5LCAgICAgICAgICAgCiAgICAgICAgU3ltYm9sX01vZGlmaWVyLCAgICAgICAg ICAgCiAgICAgICAgU3ltYm9sX090aGVyICAgICAgICAgICAgICAgCiAgICB9OwoKICAgIGVudW0g RGlyZWN0aW9uCiAgICB7CiAgICAgICAgRGlyTCwgRGlyUiwgRGlyRU4sIERpckVTLCBEaXJFVCwg RGlyQU4sIERpckNTLCBEaXJCLCBEaXJTLCBEaXJXUywgRGlyT04sCiAgICAgICAgRGlyTFJFLCBE aXJMUk8sIERpckFMLCBEaXJSTEUsIERpclJMTywgRGlyUERGLCBEaXJOU00sIERpckJOCiAgICB9 OwoKICAgIGVudW0gRGVjb21wb3NpdGlvbgogICAgewogICAgICAgIFNpbmdsZSwgQ2Fub25pY2Fs LCBGb250LCBOb0JyZWFrLCBJbml0aWFsLCBNZWRpYWwsCiAgICAgICAgRmluYWwsIElzb2xhdGVk LCBDaXJjbGUsIFN1cGVyLCBTdWIsIFZlcnRpY2FsLAogICAgICAgIFdpZGUsIE5hcnJvdywgU21h bGwsIFNxdWFyZSwgQ29tcGF0LCBGcmFjdGlvbgogICAgfTsKCiAgICBlbnVtIEpvaW5pbmcKICAg IHsKICAgICAgICBPdGhlckpvaW5pbmcsIER1YWwsIFJpZ2h0LCBDZW50ZXIKICAgIH07CgogICAg ZW51bSBDb21iaW5pbmdDbGFzcwogICAgewogICAgICAgIENvbWJpbmluZ19CZWxvd0xlZnRBdHRh Y2hlZCAgICAgICA9IDIwMCwKICAgICAgICBDb21iaW5pbmdfQmVsb3dBdHRhY2hlZCAgICAgICAg ICAgPSAyMDIsCiAgICAgICAgQ29tYmluaW5nX0JlbG93UmlnaHRBdHRhY2hlZCAgICAgID0gMjA0 LAogICAgICAgIENvbWJpbmluZ19MZWZ0QXR0YWNoZWQgICAgICAgICAgICA9IDIwOCwKICAgICAg ICBDb21iaW5pbmdfUmlnaHRBdHRhY2hlZCAgICAgICAgICAgPSAyMTAsCiAgICAgICAgQ29tYmlu aW5nX0Fib3ZlTGVmdEF0dGFjaGVkICAgICAgID0gMjEyLAogICAgICAgIENvbWJpbmluZ19BYm92 ZUF0dGFjaGVkICAgICAgICAgICA9IDIxNCwKICAgICAgICBDb21iaW5pbmdfQWJvdmVSaWdodEF0 dGFjaGVkICAgICAgPSAyMTYsCgogICAgICAgIENvbWJpbmluZ19CZWxvd0xlZnQgICAgICAgICAg ICAgICA9IDIxOCwKICAgICAgICBDb21iaW5pbmdfQmVsb3cgICAgICAgICAgICAgICAgICAgPSAy MjAsCiAgICAgICAgQ29tYmluaW5nX0JlbG93UmlnaHQgICAgICAgICAgICAgID0gMjIyLAogICAg ICAgIENvbWJpbmluZ19MZWZ0ICAgICAgICAgICAgICAgICAgICA9IDIyNCwKICAgICAgICBDb21i aW5pbmdfUmlnaHQgICAgICAgICAgICAgICAgICAgPSAyMjYsCiAgICAgICAgQ29tYmluaW5nX0Fi b3ZlTGVmdCAgICAgICAgICAgICAgID0gMjI4LAogICAgICAgIENvbWJpbmluZ19BYm92ZSAgICAg ICAgICAgICAgICAgICA9IDIzMCwKICAgICAgICBDb21iaW5pbmdfQWJvdmVSaWdodCAgICAgICAg ICAgICAgPSAyMzIsCgogICAgICAgIENvbWJpbmluZ19Eb3VibGVCZWxvdyAgICAgICAgICAgICA9 IDIzMywKICAgICAgICBDb21iaW5pbmdfRG91YmxlQWJvdmUgICAgICAgICAgICAgPSAyMzQsCiAg ICAgICAgQ29tYmluaW5nX0lvdGFTdWJzY3JpcHQgICAgICAgICAgID0gMjQwCiAgICB9OwoKICAg ICAKCiAgICBpbnQgZGlnaXRWYWx1ZSgpIGNvbnN0OwogICAgUUNoYXIgbG93ZXIoKSBjb25zdDsK ICAgIFFDaGFyIHVwcGVyKCkgY29uc3Q7CgogICAgQ2F0ZWdvcnkgY2F0ZWdvcnkoKSBjb25zdDsK ICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBjb25zdDsKICAgIEpvaW5pbmcgam9pbmluZygpIGNv bnN0OwogICAgYm9vbCBtaXJyb3JlZCgpIGNvbnN0OwogICAgUUNoYXIgbWlycm9yZWRDaGFyKCkg Y29uc3Q7CiAgICBjb25zdCBRU3RyaW5nICZkZWNvbXBvc2l0aW9uKCkgY29uc3Q7CiAgICBEZWNv bXBvc2l0aW9uIGRlY29tcG9zaXRpb25UYWcoKSBjb25zdDsKICAgIHVuc2lnbmVkIGNoYXIgY29t YmluaW5nQ2xhc3MoKSBjb25zdDsKCiAgICBjaGFyIGxhdGluMSgpIGNvbnN0IHsgcmV0dXJuIHVj cyA+IDB4ZmYgPyAwIDogKGNoYXIpIHVjczsgfQogICAgdXNob3J0IHVuaWNvZGUoKSBjb25zdCB7 IHJldHVybiB1Y3M7IH0KICAgIHVzaG9ydCAmdW5pY29kZSgpIHsgcmV0dXJuIHVjczsgfQoKICAg ICAKICAgIG9wZXJhdG9yIGNoYXIoKSBjb25zdCB7IHJldHVybiBsYXRpbjEoKTsgfQoKCiAgICBi b29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIHVuaWNvZGUoKT09MDsgfQogICAgYm9vbCBpc1By aW50KCkgY29uc3Q7CiAgICBib29sIGlzUHVuY3QoKSBjb25zdDsKICAgIGJvb2wgaXNTcGFjZSgp IGNvbnN0OwogICAgYm9vbCBpc01hcmsoKSBjb25zdDsKICAgIGJvb2wgaXNMZXR0ZXIoKSBjb25z dDsKICAgIGJvb2wgaXNOdW1iZXIoKSBjb25zdDsKICAgIGJvb2wgaXNMZXR0ZXJPck51bWJlcigp IGNvbnN0OwogICAgYm9vbCBpc0RpZ2l0KCkgY29uc3Q7CiAgICBib29sIGlzU3ltYm9sKCkgY29u c3Q7CgogICAgdWNoYXIgY2VsbCgpIGNvbnN0IHsgcmV0dXJuICgodWNoYXIpIHVjcyAmIDB4ZmYp OyB9CiAgICB1Y2hhciByb3coKSBjb25zdCB7IHJldHVybiAoKHVjaGFyKSAodWNzPj44KSYweGZm KTsgfQogICAgdm9pZCBzZXRDZWxsKCB1Y2hhciBjZWxsICkgeyB1Y3MgPSAodWNzICYgMHhmZjAw KSArIGNlbGw7IH0KICAgIHZvaWQgc2V0Um93KCB1Y2hhciByb3cgKSB7IHVjcyA9ICgoKHVzaG9y dCkgcm93KTw8OCkgKyAodWNzJjB4ZmYpOyB9CgogICAgc3RhdGljIGJvb2wgbmV0d29ya09yZGVy ZWQoKSB7CglpbnQgd29yZFNpemU7Cglib29sIGJpZ0VuZGlhbiA9IEZBTFNFOwoJcVN5c0luZm8o ICZ3b3JkU2l6ZSwgJmJpZ0VuZGlhbiApOwoJcmV0dXJuIGJpZ0VuZGlhbjsKICAgIH0KCiAgICBm cmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3I9PSggY2hhciBjaCwgUUNoYXIgYyApOwogICAgZnJp ZW5kIGlubGluZSBib29sIG9wZXJhdG9yPT0oIFFDaGFyIGMsIGNoYXIgY2ggKTsKICAgIGZyaWVu ZCBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KCBRQ2hhciBjMSwgUUNoYXIgYzIgKTsKICAgIGZyaWVu ZCBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KCBRQ2hhciBjMSwgUUNoYXIgYzIgKTsKICAgIGZyaWVu ZCBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KCBjaGFyIGNoLCBRQ2hhciBjICk7CiAgICBmcmllbmQg aW5saW5lIGJvb2wgb3BlcmF0b3IhPSggUUNoYXIgYywgY2hhciBjaCApOwogICAgZnJpZW5kIGlu bGluZSBib29sIG9wZXJhdG9yPD0oIFFDaGFyIGMsIGNoYXIgY2ggKTsKICAgIGZyaWVuZCBpbmxp bmUgYm9vbCBvcGVyYXRvcjw9KCBjaGFyIGNoLCBRQ2hhciBjICk7CiAgICBmcmllbmQgaW5saW5l IGJvb2wgb3BlcmF0b3I8PSggUUNoYXIgYzEsIFFDaGFyIGMyICk7Cgpwcml2YXRlOgogICAgdXNo b3J0IHVjczsKCgoKfSAgOwoKaW5saW5lIFFDaGFyOjpRQ2hhcigpCnsKICAgIHVjcyA9IDA7CgoK Cn0KaW5saW5lIFFDaGFyOjpRQ2hhciggY2hhciBjICkKewogICAgdWNzID0gKHVjaGFyKWM7CgoK Cn0KaW5saW5lIFFDaGFyOjpRQ2hhciggdWNoYXIgYyApCnsKICAgIHVjcyA9IGM7CgoKCn0KaW5s aW5lIFFDaGFyOjpRQ2hhciggdWNoYXIgYywgdWNoYXIgciApCnsKICAgIHVjcyA9IChyIDw8IDgp IHwgYzsKCgoKfQppbmxpbmUgUUNoYXI6OlFDaGFyKCBjb25zdCBRQ2hhciYgYyApCnsKICAgIHVj cyA9IGMudWNzOwoKCgp9CgppbmxpbmUgUUNoYXI6OlFDaGFyKCB1c2hvcnQgcmMgKQp7CiAgICB1 Y3MgPSByYzsKCgoKfQppbmxpbmUgUUNoYXI6OlFDaGFyKCBzaG9ydCByYyApCnsKICAgIHVjcyA9 ICh1c2hvcnQpIHJjOwoKCgp9CmlubGluZSBRQ2hhcjo6UUNoYXIoIHVpbnQgcmMgKQp7CiAgICB1 Y3MgPSAodXNob3J0ICkgKHJjICYgMHhmZmZmKTsKCgoKfQppbmxpbmUgUUNoYXI6OlFDaGFyKCBp bnQgcmMgKQp7CiAgICB1Y3MgPSAodXNob3J0KSAocmMgJiAweGZmZmYpOwoKCgp9CgoKaW5saW5l IGJvb2wgb3BlcmF0b3I9PSggY2hhciBjaCwgUUNoYXIgYyApCnsKICAgIHJldHVybiAoKHVjaGFy KSBjaCkgPT0gYy51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yPT0oIFFDaGFyIGMsIGNoYXIg Y2ggKQp7CiAgICByZXR1cm4gKCh1Y2hhcikgY2gpID09IGMudWNzOwp9CgppbmxpbmUgYm9vbCBv cGVyYXRvcj09KCBRQ2hhciBjMSwgUUNoYXIgYzIgKQp7CiAgICByZXR1cm4gYzEudWNzID09IGMy LnVjczsKfQoKaW5saW5lIGJvb2wgb3BlcmF0b3IhPSggUUNoYXIgYzEsIFFDaGFyIGMyICkKewog ICAgcmV0dXJuIGMxLnVjcyAhPSBjMi51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yIT0oIGNo YXIgY2gsIFFDaGFyIGMgKQp7CiAgICByZXR1cm4gKCh1Y2hhciljaCkgIT0gYy51Y3M7Cn0KCmlu bGluZSBib29sIG9wZXJhdG9yIT0oIFFDaGFyIGMsIGNoYXIgY2ggKQp7CiAgICByZXR1cm4gKCh1 Y2hhcikgY2gpICE9IGMudWNzOwp9CgppbmxpbmUgYm9vbCBvcGVyYXRvcjw9KCBRQ2hhciBjLCBj aGFyIGNoICkKewogICAgcmV0dXJuIGMudWNzIDw9ICgodWNoYXIpIGNoKTsKfQoKaW5saW5lIGJv b2wgb3BlcmF0b3I8PSggY2hhciBjaCwgUUNoYXIgYyApCnsKICAgIHJldHVybiAoKHVjaGFyKSBj aCkgPD0gYy51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yPD0oIFFDaGFyIGMxLCBRQ2hhciBj MiApCnsKICAgIHJldHVybiBjMS51Y3MgPD0gYzIudWNzOwp9CgppbmxpbmUgYm9vbCBvcGVyYXRv cj49KCBRQ2hhciBjLCBjaGFyIGNoICkgeyByZXR1cm4gY2ggPD0gYzsgfQppbmxpbmUgYm9vbCBv cGVyYXRvcj49KCBjaGFyIGNoLCBRQ2hhciBjICkgeyByZXR1cm4gYyA8PSBjaDsgfQppbmxpbmUg Ym9vbCBvcGVyYXRvcj49KCBRQ2hhciBjMSwgUUNoYXIgYzIgKSB7IHJldHVybiBjMiA8PSBjMTsg fQppbmxpbmUgYm9vbCBvcGVyYXRvcjwoIFFDaGFyIGMsIGNoYXIgY2ggKSB7IHJldHVybiAhKGNo PD1jKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcjwoIGNoYXIgY2gsIFFDaGFyIGMgKSB7IHJldHVy biAhKGM8PWNoKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcjwoIFFDaGFyIGMxLCBRQ2hhciBjMiAp IHsgcmV0dXJuICEoYzI8PWMxKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj4oIFFDaGFyIGMsIGNo YXIgY2ggKSB7IHJldHVybiAhKGNoPj1jKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj4oIGNoYXIg Y2gsIFFDaGFyIGMgKSB7IHJldHVybiAhKGM+PWNoKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj4o IFFDaGFyIGMxLCBRQ2hhciBjMiApIHsgcmV0dXJuICEoYzI+PWMxKTsgfQoKIApzdHJ1Y3QgICBR U3RyaW5nRGF0YSA6IHB1YmxpYyBRU2hhcmVkIHsKICAgIFFTdHJpbmdEYXRhKCkgOgogICAgICAg IHVuaWNvZGUoMCksIGFzY2lpKDApLCBsZW4oMCksIHNpbXBsZXRleHQoMSksIG1heGwoMCksIGRp cnR5KDApIHsgcmVmKCk7IH0KICAgIFFTdHJpbmdEYXRhKFFDaGFyICp1LCB1aW50IGwsIHVpbnQg bSkgOgogICAgICAgIHVuaWNvZGUodSksIGFzY2lpKDApLCBsZW4obCksIHNpbXBsZXRleHQoMSks IG1heGwobSksIGRpcnR5KDEpIHsgfQoKICAgIH5RU3RyaW5nRGF0YSgpIHsgaWYgKCB1bmljb2Rl ICkgZGVsZXRlW10gKChjaGFyKil1bmljb2RlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBh c2NpaSApIGRlbGV0ZVtdIGFzY2lpOyB9CgogICAgdm9pZCBkZWxldGVTZWxmKCk7CiAgICBRQ2hh ciAqdW5pY29kZTsKICAgIGNoYXIgKmFzY2lpOwogICAgdm9pZCBzZXREaXJ0eSgpIHsKCWlmICgg YXNjaWkgKSB7CgkgICAgZGVsZXRlIFtdIGFzY2lpOwoJICAgIGFzY2lpID0gMDsKCX0KCWRpcnR5 ID0gMTsKICAgIH0KCgoKICAgIHVpbnQgbGVuIDogMzA7CgogICAgdWludCBzaW1wbGV0ZXh0IDog MTsKCgoKICAgIHVpbnQgbWF4bCA6IDMwOwoKICAgIHVpbnQgZGlydHkgOiAxOwp9OwoKCmNsYXNz ICAgUVN0cmluZwp7CnB1YmxpYzoKICAgIFFTdHJpbmcoKTsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgUVN0cmluZyggUUNoYXIgKTsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCiAgICBRU3RyaW5nKCBjb25zdCBRU3RyaW5nICYgKTsgICAgICAgICAgICAgICAgICAK ICAgIFFTdHJpbmcoIGNvbnN0IFFCeXRlQXJyYXkmICk7ICAgICAgICAgICAgICAgIAogICAgUVN0 cmluZyggY29uc3QgUUNoYXIqIHVuaWNvZGUsIHVpbnQgbGVuZ3RoICk7ICAKCiAgICBRU3RyaW5n KCBjb25zdCBjaGFyICpzdHIgKTsgICAgICAgICAgICAgICAgICAKCiAgICB+UVN0cmluZygpOwoK ICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yPSggY29uc3QgUVN0cmluZyAmICk7ICAgIAoKICAgIFFT dHJpbmcgICAgJm9wZXJhdG9yPSggY29uc3QgY2hhciAqICk7ICAgICAgIAoKICAgIFFTdHJpbmcg ICAgJm9wZXJhdG9yPSggY29uc3QgUUNTdHJpbmcmICk7ICAgIAogICAgUVN0cmluZyAgICAmb3Bl cmF0b3I9KCBRQ2hhciBjICk7CiAgICBRU3RyaW5nICAgICZvcGVyYXRvcj0oIGNoYXIgYyApOwoK ICAgIHN0YXRpYyBjb25zdCAgUVN0cmluZyBudWxsOwoKICAgIGJvb2wgICAgICAgIGlzTnVsbCgp ICAgICAgICBjb25zdDsKICAgIGJvb2wgICAgICAgIGlzRW1wdHkoKSAgICAgICBjb25zdDsKICAg IHVpbnQgICAgICAgIGxlbmd0aCgpICAgICAgICBjb25zdDsKICAgIHZvaWQgICAgICAgIHRydW5j YXRlKCB1aW50IHBvcyApOwoKICAgIFFTdHJpbmcgJiAgIGZpbGwoIFFDaGFyIGMsIGludCBsZW4g PSAtMSApOwoKICAgIFFTdHJpbmcgICAgIGNvcHkoKSAgY29uc3Q7CgogICAgUVN0cmluZyBhcmco IGxvbmcgYSwgaW50IGZpZWxkd2lkdGg9MCwgaW50IGJhc2U9MTAgKSBjb25zdDsKICAgIFFTdHJp bmcgYXJnKCB1bG9uZyBhLCBpbnQgZmllbGR3aWR0aD0wLCBpbnQgYmFzZT0xMCApIGNvbnN0Owog ICAgUVN0cmluZyBhcmcoIGludCBhLCBpbnQgZmllbGR3aWR0aD0wLCBpbnQgYmFzZT0xMCApIGNv bnN0OwogICAgUVN0cmluZyBhcmcoIHVpbnQgYSwgaW50IGZpZWxkd2lkdGg9MCwgaW50IGJhc2U9 MTAgKSBjb25zdDsKICAgIFFTdHJpbmcgYXJnKCBzaG9ydCBhLCBpbnQgZmllbGR3aWR0aD0wLCBp bnQgYmFzZT0xMCApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoIHVzaG9ydCBhLCBpbnQgZmllbGR3 aWR0aD0wLCBpbnQgYmFzZT0xMCApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoIGNoYXIgYSwgaW50 IGZpZWxkd2lkdGg9MCApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoIFFDaGFyIGEsIGludCBmaWVs ZHdpZHRoPTAgKSBjb25zdDsKICAgIFFTdHJpbmcgYXJnKCBjb25zdCBRU3RyaW5nJiBhLCBpbnQg ZmllbGR3aWR0aD0wICkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyggZG91YmxlIGEsIGludCBmaWVs ZHdpZHRoPTAsIGNoYXIgZm10PSdnJywgaW50IHByZWM9LTEgKSBjb25zdDsKCgogICAgUVN0cmlu ZyAgICAmc3ByaW50ZiggY29uc3QgY2hhciogZm9ybWF0LCAuLi4gKQoKICAgICAgICBfX2F0dHJp YnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKCiAgICAgICAgOwoKCiAgICBpbnQgICAg ICAgICBmaW5kKCBRQ2hhciBjLCBpbnQgaW5kZXg9MCwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAg ICBpbnQgICAgICAgICBmaW5kKCBjaGFyIGMsIGludCBpbmRleD0wLCBib29sIGNzPVRSVUUgKSBj b25zdDsKICAgIGludCAgICAgICAgIGZpbmQoIGNvbnN0IFFTdHJpbmcgJnN0ciwgaW50IGluZGV4 PTAsIGJvb2wgY3M9VFJVRSApIGNvbnN0OwoKICAgIGludCAgICAgICAgIGZpbmQoIGNvbnN0IFFS ZWdFeHAgJiwgaW50IGluZGV4PTAgKSBjb25zdDsKCgogICAgaW50ICAgICAgICAgZmluZCggY29u c3QgY2hhciogc3RyLCBpbnQgaW5kZXg9MCApIGNvbnN0OwoKICAgIGludCAgICAgICAgIGZpbmRS ZXYoIFFDaGFyIGMsIGludCBpbmRleD0tMSwgYm9vbCBjcz1UUlVFKSBjb25zdDsKICAgIGludCAg ICAgICAgIGZpbmRSZXYoIGNoYXIgYywgaW50IGluZGV4PS0xLCBib29sIGNzPVRSVUUpIGNvbnN0 OwogICAgaW50ICAgICAgICAgZmluZFJldiggY29uc3QgUVN0cmluZyAmc3RyLCBpbnQgaW5kZXg9 LTEsIGJvb2wgY3M9VFJVRSkgY29uc3Q7CgogICAgaW50ICAgICAgICAgZmluZFJldiggY29uc3Qg UVJlZ0V4cCAmLCBpbnQgaW5kZXg9LTEgKSBjb25zdDsKCgogICAgaW50ICAgICAgICAgZmluZFJl diggY29uc3QgY2hhciogc3RyLCBpbnQgaW5kZXg9LTEgKSBjb25zdDsKCiAgICBpbnQgICAgICAg ICBjb250YWlucyggUUNoYXIgYywgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAgICBpbnQgICAgICAg ICBjb250YWlucyggY2hhciBjLCBib29sIGNzPVRSVUUgKSBjb25zdAogICAgICAgICAgICAgICAg ICAgIHsgcmV0dXJuIGNvbnRhaW5zKFFDaGFyKGMpLCBjcyk7IH0KCiAgICBpbnQgICAgICAgICBj b250YWlucyggY29uc3QgY2hhciogc3RyLCBib29sIGNzPVRSVUUgKSBjb25zdDsKCiAgICBpbnQg ICAgICAgICBjb250YWlucyggY29uc3QgUVN0cmluZyAmc3RyLCBib29sIGNzPVRSVUUgKSBjb25z dDsKCiAgICBpbnQgICAgICAgICBjb250YWlucyggY29uc3QgUVJlZ0V4cCAmICkgY29uc3Q7CgoK ICAgIGVudW0gU2VjdGlvbkZsYWdzIHsKCVNlY3Rpb25EZWZhdWx0ICAgICAgICAgICAgID0gMHgw MCwKCVNlY3Rpb25Ta2lwRW1wdHkgICAgICAgICAgID0gMHgwMSwKCVNlY3Rpb25JbmNsdWRlTGVh ZGluZ1NlcCAgID0gMHgwMiwKCVNlY3Rpb25JbmNsdWRlVHJhaWxpbmdTZXAgID0gMHgwNCwKCVNl Y3Rpb25DYXNlSW5zZW5zaXRpdmVTZXBzID0gMHgwOAogICAgfTsKICAgIFFTdHJpbmcgICAgIHNl Y3Rpb24oIFFDaGFyIHNlcCwgaW50IHN0YXJ0LCBpbnQgZW5kID0gMHhmZmZmZmZmZiwgaW50IGZs YWdzID0gU2VjdGlvbkRlZmF1bHQgKSBjb25zdDsKICAgIFFTdHJpbmcgICAgIHNlY3Rpb24oIGNo YXIgc2VwLCBpbnQgc3RhcnQsIGludCBlbmQgPSAweGZmZmZmZmZmLCBpbnQgZmxhZ3MgPSBTZWN0 aW9uRGVmYXVsdCApIGNvbnN0OwoKICAgIFFTdHJpbmcgICAgICBzZWN0aW9uKCBjb25zdCBjaGFy ICppbl9zZXAsIGludCBzdGFydCwgaW50IGVuZCA9IDB4ZmZmZmZmZmYsIGludCBmbGFncyA9IFNl Y3Rpb25EZWZhdWx0ICkgY29uc3Q7CgogICAgUVN0cmluZyAgICAgc2VjdGlvbiggY29uc3QgUVN0 cmluZyAmaW5fc2VwLCBpbnQgc3RhcnQsIGludCBlbmQgPSAweGZmZmZmZmZmLCBpbnQgZmxhZ3Mg PSBTZWN0aW9uRGVmYXVsdCApIGNvbnN0OwoKICAgIFFTdHJpbmcgICAgIHNlY3Rpb24oIGNvbnN0 IFFSZWdFeHAgJnJlZywgaW50IHN0YXJ0LCBpbnQgZW5kID0gMHhmZmZmZmZmZiwgaW50IGZsYWdz ID0gU2VjdGlvbkRlZmF1bHQgKSBjb25zdDsKCgogICAgUVN0cmluZyAgICAgbGVmdCggdWludCBs ZW4gKSAgY29uc3Q7CiAgICBRU3RyaW5nICAgICByaWdodCggdWludCBsZW4gKSBjb25zdDsKICAg IFFTdHJpbmcgICAgIG1pZCggdWludCBpbmRleCwgdWludCBsZW49MHhmZmZmZmZmZikgY29uc3Q7 CgogICAgUVN0cmluZyAgICAgbGVmdEp1c3RpZnkoIHVpbnQgd2lkdGgsIFFDaGFyIGZpbGw9JyAn LCBib29sIHRydW5jPUZBTFNFKWNvbnN0OwogICAgUVN0cmluZyAgICAgcmlnaHRKdXN0aWZ5KCB1 aW50IHdpZHRoLCBRQ2hhciBmaWxsPScgJyxib29sIHRydW5jPUZBTFNFKWNvbnN0OwoKICAgIFFT dHJpbmcgICAgIGxvd2VyKCkgY29uc3Q7CiAgICBRU3RyaW5nICAgICB1cHBlcigpIGNvbnN0OwoK ICAgIFFTdHJpbmcgICAgIHN0cmlwV2hpdGVTcGFjZSgpICAgICAgIGNvbnN0OwogICAgUVN0cmlu ZyAgICAgc2ltcGxpZnlXaGl0ZVNwYWNlKCkgICAgY29uc3Q7CgogICAgUVN0cmluZyAgICAmaW5z ZXJ0KCB1aW50IGluZGV4LCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgICAgJmluc2Vy dCggdWludCBpbmRleCwgY29uc3QgUUNoYXIqLCB1aW50IGxlbiApOwogICAgUVN0cmluZyAgICAm aW5zZXJ0KCB1aW50IGluZGV4LCBRQ2hhciApOwogICAgUVN0cmluZyAgICAmaW5zZXJ0KCB1aW50 IGluZGV4LCBjaGFyIGMgKSB7IHJldHVybiBpbnNlcnQoaW5kZXgsUUNoYXIoYykpOyB9CiAgICBR U3RyaW5nICAgICZhcHBlbmQoIGNoYXIgKTsKICAgIFFTdHJpbmcgICAgJmFwcGVuZCggUUNoYXIg KTsKICAgIFFTdHJpbmcgICAgJmFwcGVuZCggY29uc3QgUVN0cmluZyAmICk7CiAgICBRU3RyaW5n ICAgICZwcmVwZW5kKCBjaGFyICk7CiAgICBRU3RyaW5nICAgICZwcmVwZW5kKCBRQ2hhciApOwog ICAgUVN0cmluZyAgICAmcHJlcGVuZCggY29uc3QgUVN0cmluZyAmICk7CiAgICBRU3RyaW5nICAg ICZyZW1vdmUoIHVpbnQgaW5kZXgsIHVpbnQgbGVuICk7CiAgICBRU3RyaW5nICAgICZyZXBsYWNl KCB1aW50IGluZGV4LCB1aW50IGxlbiwgY29uc3QgUVN0cmluZyAmICk7CiAgICBRU3RyaW5nICAg ICZyZXBsYWNlKCB1aW50IGluZGV4LCB1aW50IGxlbiwgY29uc3QgUUNoYXIqLCB1aW50IGNsZW4g KTsKCiAgICBRU3RyaW5nICAgICZyZXBsYWNlKCBjb25zdCBRUmVnRXhwICYsIGNvbnN0IFFTdHJp bmcgJiApOwoKICAgIHNob3J0ICAgICAgIHRvU2hvcnQoIGJvb2wgKm9rPTAsIGludCBiYXNlPTEw ICkgICAgICBjb25zdDsKICAgIHVzaG9ydCAgICAgIHRvVVNob3J0KCBib29sICpvaz0wLCBpbnQg YmFzZT0xMCApICAgICBjb25zdDsKICAgIGludCAgICAgICAgIHRvSW50KCBib29sICpvaz0wLCBp bnQgYmFzZT0xMCApICAgICAgICBjb25zdDsKICAgIHVpbnQgICAgICAgIHRvVUludCggYm9vbCAq b2s9MCwgaW50IGJhc2U9MTAgKSAgICAgICBjb25zdDsKICAgIGxvbmcgICAgICAgIHRvTG9uZygg Ym9vbCAqb2s9MCwgaW50IGJhc2U9MTAgKSAgICAgICBjb25zdDsKICAgIHVsb25nICAgICAgIHRv VUxvbmcoIGJvb2wgKm9rPTAsIGludCBiYXNlPTEwICkgICAgICBjb25zdDsKICAgIGZsb2F0ICAg ICAgIHRvRmxvYXQoIGJvb2wgKm9rPTAgKSAgIGNvbnN0OwogICAgZG91YmxlICAgICAgdG9Eb3Vi bGUoIGJvb2wgKm9rPTAgKSAgY29uc3Q7CgogICAgUVN0cmluZyAgICAmc2V0TnVtKCBzaG9ydCwg aW50IGJhc2U9MTAgKTsKICAgIFFTdHJpbmcgICAgJnNldE51bSggdXNob3J0LCBpbnQgYmFzZT0x MCApOwogICAgUVN0cmluZyAgICAmc2V0TnVtKCBpbnQsIGludCBiYXNlPTEwICk7CiAgICBRU3Ry aW5nICAgICZzZXROdW0oIHVpbnQsIGludCBiYXNlPTEwICk7CiAgICBRU3RyaW5nICAgICZzZXRO dW0oIGxvbmcsIGludCBiYXNlPTEwICk7CiAgICBRU3RyaW5nICAgICZzZXROdW0oIHVsb25nLCBp bnQgYmFzZT0xMCApOwogICAgUVN0cmluZyAgICAmc2V0TnVtKCBmbG9hdCwgY2hhciBmPSdnJywg aW50IHByZWM9NiApOwogICAgUVN0cmluZyAgICAmc2V0TnVtKCBkb3VibGUsIGNoYXIgZj0nZycs IGludCBwcmVjPTYgKTsKCiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIGxvbmcsIGludCBiYXNl PTEwICk7CiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIHVsb25nLCBpbnQgYmFzZT0xMCk7CiAg ICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIGludCwgaW50IGJhc2U9MTAgKTsKICAgIHN0YXRpYyBR U3RyaW5nIG51bWJlciggdWludCwgaW50IGJhc2U9MTApOwogICAgc3RhdGljIFFTdHJpbmcgbnVt YmVyKCBkb3VibGUsIGNoYXIgZj0nZycsIGludCBwcmVjPTYgKTsKCiAgICB2b2lkICAgICAgICBz ZXRFeHBhbmQoIHVpbnQgaW5kZXgsIFFDaGFyIGMgKTsKCiAgICBRU3RyaW5nICAgICZvcGVyYXRv cis9KCBjb25zdCBRU3RyaW5nICZzdHIgKTsKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yKz0oIFFD aGFyIGMgKTsKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yKz0oIGNoYXIgYyApOwoKICAgIFFDaGFy IGF0KCB1aW50IGkgKSBjb25zdAogICAgICAgIHsgcmV0dXJuIGkgPCBkLT5sZW4gPyBkLT51bmlj b2RlW2ldIDogUUNoYXI6Om51bGw7IH0KICAgIFFDaGFyIG9wZXJhdG9yW10oIGludCBpICkgY29u c3QgeyByZXR1cm4gYXQoKHVpbnQpaSk7IH0KICAgIFFDaGFyUmVmIGF0KCB1aW50IGkgKTsKICAg IFFDaGFyUmVmIG9wZXJhdG9yW10oIGludCBpICk7CgogICAgUUNoYXIgY29uc3RyZWYodWludCBp KSBjb25zdAogICAgICAgIHsgcmV0dXJuIGF0KGkpOyB9CiAgICBRQ2hhciYgcmVmKHVpbnQgaSkK ICAgICAgICB7ICAKICAgICAgICAgICAgaWYgKCBkLT5jb3VudCAhPSAxIHx8IGkgPj0gZC0+bGVu ICkKICAgICAgICAgICAgICAgIHN1YmF0KCBpICk7CiAgICAgICAgICAgIGQtPnNldERpcnR5KCk7 CiAgICAgICAgICAgIHJldHVybiBkLT51bmljb2RlW2ldOwogICAgICAgIH0KCiAgICBjb25zdCBR Q2hhciogdW5pY29kZSgpIGNvbnN0IHsgcmV0dXJuIGQtPnVuaWNvZGU7IH0KICAgIGNvbnN0IGNo YXIqIGFzY2lpKCkgY29uc3QgeyByZXR1cm4gbGF0aW4xKCk7IH0KICAgIGNvbnN0IGNoYXIqIGxh dGluMSgpIGNvbnN0OwogICAgc3RhdGljIFFTdHJpbmcgZnJvbUxhdGluMShjb25zdCBjaGFyKiwg aW50IGxlbj0tMSk7CgogICAgUUNTdHJpbmcgdXRmOCgpIGNvbnN0OwogICAgc3RhdGljIFFTdHJp bmcgZnJvbVV0ZjgoY29uc3QgY2hhciosIGludCBsZW49LTEpOwoKICAgIFFDU3RyaW5nIGxvY2Fs OEJpdCgpIGNvbnN0OwogICAgc3RhdGljIFFTdHJpbmcgZnJvbUxvY2FsOEJpdChjb25zdCBjaGFy KiwgaW50IGxlbj0tMSk7CiAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0OwoKICAgIG9wZXJhdG9y IGNvbnN0IGNoYXIgKigpIGNvbnN0IHsgcmV0dXJuIGxhdGluMSgpOyB9CgoKICAgIFFTdHJpbmcg JnNldFVuaWNvZGUoIGNvbnN0IFFDaGFyKiB1bmljb2RlLCB1aW50IGxlbiApOwogICAgUVN0cmlu ZyAmc2V0VW5pY29kZUNvZGVzKCBjb25zdCB1c2hvcnQqIHVuaWNvZGVfYXNfdXNob3J0cywgdWlu dCBsZW4gKTsKICAgIFFTdHJpbmcgJnNldExhdGluMSggY29uc3QgY2hhciosIGludCBsZW49LTEg KTsKCiAgICBpbnQgY29tcGFyZSggY29uc3QgUVN0cmluZyYgcyApIGNvbnN0OwogICAgc3RhdGlj IGludCBjb21wYXJlKCBjb25zdCBRU3RyaW5nJiBzMSwgY29uc3QgUVN0cmluZyYgczIgKQogICAg eyByZXR1cm4gczEuY29tcGFyZSggczIgKTsgfQoKICAgIGludCBsb2NhbGVBd2FyZUNvbXBhcmUo IGNvbnN0IFFTdHJpbmcmIHMgKSBjb25zdDsKICAgIHN0YXRpYyBpbnQgbG9jYWxlQXdhcmVDb21w YXJlKCBjb25zdCBRU3RyaW5nJiBzMSwgY29uc3QgUVN0cmluZyYgczIgKQogICAgeyByZXR1cm4g czEubG9jYWxlQXdhcmVDb21wYXJlKCBzMiApOyB9CgoKICAgIGZyaWVuZCAgIFFEYXRhU3RyZWFt ICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRU3RyaW5nICYgKTsKCgogICAgdm9pZCBjb21w b3NlKCk7CgoKICAgIGNvbnN0IGNoYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBsYXRpbjEoKTsg fQoKCiAgICBib29sIHN0YXJ0c1dpdGgoIGNvbnN0IFFTdHJpbmcmICkgY29uc3Q7CiAgICBib29s IGVuZHNXaXRoKCBjb25zdCBRU3RyaW5nJiApIGNvbnN0OwoKICAgIHZvaWQgc2V0TGVuZ3RoKCB1 aW50IG5ld0xlbmd0aCApOwoKICAgIGJvb2wgc2ltcGxlVGV4dCgpIGNvbnN0IHsgaWYgKCBkLT5k aXJ0eSApIGNoZWNrU2ltcGxlVGV4dCgpOyByZXR1cm4gKGJvb2wpZC0+c2ltcGxldGV4dDsgfQog ICAgYm9vbCBpc1JpZ2h0VG9MZWZ0KCkgY29uc3Q7Cgpwcml2YXRlOgogICAgIAoKCgoKCgoKCiAg ICBRU3RyaW5nJiByZXBsYWNlKCBjb25zdCBRU3RyaW5nICYsIGNvbnN0IFFTdHJpbmcgJiApIHsg cmV0dXJuICp0aGlzOyB9CgogICAgUVN0cmluZyggaW50IHNpemUsIGJvb2wgICApOwkgCgogICAg dm9pZCBkZXJlZigpOwogICAgdm9pZCByZWFsX2RldGFjaCgpOwogICAgdm9pZCBzdWJhdCggdWlu dCApOwogICAgYm9vbCBmaW5kQXJnKGludCYgcG9zLCBpbnQmIGxlbikgY29uc3Q7CgogICAgdm9p ZCBjaGVja1NpbXBsZVRleHQoKSBjb25zdDsKCiAgICBzdGF0aWMgUUNoYXIqIGFzY2lpVG9Vbmlj b2RlKCBjb25zdCBjaGFyKiwgdWludCAqIGxlbiwgdWludCBtYXhsZW49KHVpbnQpLTEgKTsKICAg IHN0YXRpYyBRQ2hhciogYXNjaWlUb1VuaWNvZGUoIGNvbnN0IFFCeXRlQXJyYXkmLCB1aW50ICog bGVuICk7CiAgICBzdGF0aWMgY2hhciogdW5pY29kZVRvQXNjaWkoIGNvbnN0IFFDaGFyKiwgdWlu dCBsZW4gKTsKCiAgICBRU3RyaW5nRGF0YSAqZDsKICAgIHN0YXRpYyBRU3RyaW5nRGF0YSogc2hh cmVkX251bGw7CiAgICBzdGF0aWMgUVN0cmluZ0RhdGEqIG1ha2VTaGFyZWROdWxsKCk7CgogICAg ZnJpZW5kIGNsYXNzIFFDb25zdFN0cmluZzsKICAgIGZyaWVuZCBjbGFzcyBRVGV4dFN0cmVhbTsK ICAgIFFTdHJpbmcoIFFTdHJpbmdEYXRhKiBkZCwgYm9vbCAgICkgOiBkKGRkKSB7IH0KfTsKCmNs YXNzICAgUUNoYXJSZWYgewogICAgZnJpZW5kIGNsYXNzIFFTdHJpbmc7CiAgICBRU3RyaW5nJiBz OwogICAgdWludCBwOwogICAgUUNoYXJSZWYoUVN0cmluZyogc3RyLCB1aW50IHBvcykgOiBzKCpz dHIpLCBwKHBvcykgeyB9CgpwdWJsaWM6CiAgICAgCgogICAgIAoKICAgIHVzaG9ydCB1bmljb2Rl KCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS51bmljb2RlKCk7IH0KICAgIGNoYXIgbGF0 aW4xKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5sYXRpbjEoKTsgfQoKICAgICAKICAg IFFDaGFyUmVmIG9wZXJhdG9yPShjaGFyIGMgKSB7IHMucmVmKHApPWM7IHJldHVybiAqdGhpczsg fQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KHVjaGFyIGMgKSB7IHMucmVmKHApPWM7IHJldHVybiAq dGhpczsgfQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KFFDaGFyIGMgKSB7IHMucmVmKHApPWM7IHJl dHVybiAqdGhpczsgfQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KGNvbnN0IFFDaGFyUmVmJiBjICkg eyBzLnJlZihwKT1jLnVuaWNvZGUoKTsgcmV0dXJuICp0aGlzOyB9CiAgICBRQ2hhclJlZiBvcGVy YXRvcj0odXNob3J0IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0dXJuICp0aGlzOyB9CiAgICBRQ2hh clJlZiBvcGVyYXRvcj0oc2hvcnQgcmMgKSB7IHMucmVmKHApPXJjOyByZXR1cm4gKnRoaXM7IH0K ICAgIFFDaGFyUmVmIG9wZXJhdG9yPSh1aW50IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0dXJuICp0 aGlzOyB9CiAgICBRQ2hhclJlZiBvcGVyYXRvcj0oaW50IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0 dXJuICp0aGlzOyB9CgogICAgb3BlcmF0b3IgUUNoYXIgKCkgY29uc3QgeyByZXR1cm4gcy5jb25z dHJlZihwKTsgfQoKICAgICAKICAgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gdW5pY29k ZSgpPT0wOyB9CiAgICBib29sIGlzUHJpbnQoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHAp LmlzUHJpbnQoKTsgfQogICAgYm9vbCBpc1B1bmN0KCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJl ZihwKS5pc1B1bmN0KCk7IH0KICAgIGJvb2wgaXNTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIHMuY29u c3RyZWYocCkuaXNTcGFjZSgpOyB9CiAgICBib29sIGlzTWFyaygpIGNvbnN0IHsgcmV0dXJuIHMu Y29uc3RyZWYocCkuaXNNYXJrKCk7IH0KICAgIGJvb2wgaXNMZXR0ZXIoKSBjb25zdCB7IHJldHVy biBzLmNvbnN0cmVmKHApLmlzTGV0dGVyKCk7IH0KICAgIGJvb2wgaXNOdW1iZXIoKSBjb25zdCB7 IHJldHVybiBzLmNvbnN0cmVmKHApLmlzTnVtYmVyKCk7IH0KICAgIGJvb2wgaXNMZXR0ZXJPck51 bWJlcigpIHsgcmV0dXJuIHMuY29uc3RyZWYocCkuaXNMZXR0ZXJPck51bWJlcigpOyB9CiAgICBi b29sIGlzRGlnaXQoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmlzRGlnaXQoKTsgfQoK ICAgIGludCBkaWdpdFZhbHVlKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5kaWdpdFZh bHVlKCk7IH0KICAgIFFDaGFyIGxvd2VyKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5s b3dlcigpOyB9CiAgICBRQ2hhciB1cHBlcigpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCku dXBwZXIoKTsgfQoKICAgIFFDaGFyOjpDYXRlZ29yeSBjYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJu IHMuY29uc3RyZWYocCkuY2F0ZWdvcnkoKTsgfQogICAgUUNoYXI6OkRpcmVjdGlvbiBkaXJlY3Rp b24oKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmRpcmVjdGlvbigpOyB9CiAgICBRQ2hh cjo6Sm9pbmluZyBqb2luaW5nKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5qb2luaW5n KCk7IH0KICAgIGJvb2wgbWlycm9yZWQoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLm1p cnJvcmVkKCk7IH0KICAgIFFDaGFyIG1pcnJvcmVkQ2hhcigpIGNvbnN0IHsgcmV0dXJuIHMuY29u c3RyZWYocCkubWlycm9yZWRDaGFyKCk7IH0KICAgIGNvbnN0IFFTdHJpbmcgJmRlY29tcG9zaXRp b24oKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmRlY29tcG9zaXRpb24oKTsgfQogICAg UUNoYXI6OkRlY29tcG9zaXRpb24gZGVjb21wb3NpdGlvblRhZygpIGNvbnN0IHsgcmV0dXJuIHMu Y29uc3RyZWYocCkuZGVjb21wb3NpdGlvblRhZygpOyB9CiAgICB1bnNpZ25lZCBjaGFyIGNvbWJp bmluZ0NsYXNzKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5jb21iaW5pbmdDbGFzcygp OyB9CgogICAgIAogICAgdWNoYXIgY2VsbCgpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCku Y2VsbCgpOyB9CiAgICB1Y2hhciByb3coKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLnJv dygpOyB9Cgp9OwoKaW5saW5lIFFDaGFyUmVmIFFTdHJpbmc6OmF0KCB1aW50IGkgKSB7IHJldHVy biBRQ2hhclJlZih0aGlzLGkpOyB9CmlubGluZSBRQ2hhclJlZiBRU3RyaW5nOjpvcGVyYXRvcltd KCBpbnQgaSApIHsgcmV0dXJuIGF0KCh1aW50KWkpOyB9CgoKY2xhc3MgICBRQ29uc3RTdHJpbmcg OiBwcml2YXRlIFFTdHJpbmcgewpwdWJsaWM6CiAgICBRQ29uc3RTdHJpbmcoIGNvbnN0IFFDaGFy KiB1bmljb2RlLCB1aW50IGxlbmd0aCApOwogICAgflFDb25zdFN0cmluZygpOwogICAgY29uc3Qg UVN0cmluZyYgc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KfTsKCgogCgoKCiAgUURh dGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFTdHJpbmcgJiApOwog IFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRU3RyaW5nICYgKTsKCgog CgoKCiAKIAogCiAKIAppbmxpbmUgUVN0cmluZzo6UVN0cmluZygpIDoKICAgIGQoc2hhcmVkX251 bGwgPyBzaGFyZWRfbnVsbCA6IG1ha2VTaGFyZWROdWxsKCkpCnsKICAgIGQtPnJlZigpOwp9CiAK aW5saW5lIFFTdHJpbmc6On5RU3RyaW5nKCkKewogICAgaWYgKCBkLT5kZXJlZigpICkgewogICAg ICAgIGlmICggZCA9PSBzaGFyZWRfbnVsbCApCiAgICAgICAgICAgIHNoYXJlZF9udWxsID0gMDsK ICAgICAgICBkLT5kZWxldGVTZWxmKCk7CiAgICB9Cn0KCmlubGluZSBRU3RyaW5nIFFTdHJpbmc6 OnNlY3Rpb24oIFFDaGFyIHNlcCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgZmxhZ3MgKSBjb25z dAp7IHJldHVybiBzZWN0aW9uKFFTdHJpbmcoc2VwKSwgc3RhcnQsIGVuZCwgZmxhZ3MpOyB9Cgpp bmxpbmUgUVN0cmluZyBRU3RyaW5nOjpzZWN0aW9uKCBjaGFyIHNlcCwgaW50IHN0YXJ0LCBpbnQg ZW5kLCBpbnQgZmxhZ3MgKSBjb25zdAp7IHJldHVybiBzZWN0aW9uKFFDaGFyKHNlcCksIHN0YXJ0 LCBlbmQsIGZsYWdzKTsgfQoKCmlubGluZSBRU3RyaW5nIFFTdHJpbmc6OnNlY3Rpb24oIGNvbnN0 IGNoYXIgKmluX3NlcCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgZmxhZ3MgKSBjb25zdAp7IHJl dHVybiBzZWN0aW9uKFFTdHJpbmcoaW5fc2VwKSwgc3RhcnQsIGVuZCwgZmxhZ3MpOyB9CgoKaW5s aW5lIFFTdHJpbmcgJlFTdHJpbmc6Om9wZXJhdG9yPSggUUNoYXIgYyApCnsgcmV0dXJuICp0aGlz ID0gUVN0cmluZyhjKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6Om9wZXJhdG9yPSggY2hh ciBjICkKeyByZXR1cm4gKnRoaXMgPSBRU3RyaW5nKFFDaGFyKGMpKTsgfQoKaW5saW5lIGJvb2wg UVN0cmluZzo6aXNOdWxsKCkgY29uc3QKeyByZXR1cm4gdW5pY29kZSgpID09IDA7IH0KCmlubGlu ZSBib29sIFFTdHJpbmc6Om9wZXJhdG9yISgpIGNvbnN0CnsgcmV0dXJuIGlzTnVsbCgpOyB9Cgpp bmxpbmUgdWludCBRU3RyaW5nOjpsZW5ndGgoKSBjb25zdAp7IHJldHVybiBkLT5sZW47IH0KCmlu bGluZSBib29sIFFTdHJpbmc6OmlzRW1wdHkoKSBjb25zdAp7IHJldHVybiBsZW5ndGgoKSA9PSAw OyB9CgppbmxpbmUgUVN0cmluZyBRU3RyaW5nOjpjb3B5KCkgY29uc3QKeyByZXR1cm4gUVN0cmlu ZyggKnRoaXMgKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OnByZXBlbmQoIGNvbnN0IFFT dHJpbmcgJiBzICkKeyByZXR1cm4gaW5zZXJ0KDAscyk7IH0KCmlubGluZSBRU3RyaW5nICZRU3Ry aW5nOjpwcmVwZW5kKCBRQ2hhciBjICkKeyByZXR1cm4gaW5zZXJ0KDAsYyk7IH0KCmlubGluZSBR U3RyaW5nICZRU3RyaW5nOjpwcmVwZW5kKCBjaGFyIGMgKQp7IHJldHVybiBpbnNlcnQoMCxjKTsg fQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OmFwcGVuZCggY29uc3QgUVN0cmluZyAmIHMgKQp7 IHJldHVybiBvcGVyYXRvcis9KHMpOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6YXBwZW5k KCBRQ2hhciBjICkKeyByZXR1cm4gb3BlcmF0b3IrPShjKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFT dHJpbmc6OmFwcGVuZCggY2hhciBjICkKeyByZXR1cm4gb3BlcmF0b3IrPShjKTsgfQoKaW5saW5l IFFTdHJpbmcgJlFTdHJpbmc6OnNldE51bSggc2hvcnQgbiwgaW50IGJhc2UgKQp7IHJldHVybiBz ZXROdW0oKGxvbmcpbiwgYmFzZSk7IH0KCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpzZXROdW0o IHVzaG9ydCBuLCBpbnQgYmFzZSApCnsgcmV0dXJuIHNldE51bSgodWxvbmcpbiwgYmFzZSk7IH0K CmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpzZXROdW0oIGludCBuLCBpbnQgYmFzZSApCnsgcmV0 dXJuIHNldE51bSgobG9uZyluLCBiYXNlKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OnNl dE51bSggdWludCBuLCBpbnQgYmFzZSApCnsgcmV0dXJuIHNldE51bSgodWxvbmcpbiwgYmFzZSk7 IH0KCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpzZXROdW0oIGZsb2F0IG4sIGNoYXIgZiwgaW50 IHByZWMgKQp7IHJldHVybiBzZXROdW0oKGRvdWJsZSluLGYscHJlYyk7IH0KCmlubGluZSBRU3Ry aW5nIFFTdHJpbmc6OmFyZyhpbnQgYSwgaW50IGZpZWxkd2lkdGgsIGludCBiYXNlKSBjb25zdAp7 IHJldHVybiBhcmcoKGxvbmcpYSwgZmllbGR3aWR0aCwgYmFzZSk7IH0KCmlubGluZSBRU3RyaW5n IFFTdHJpbmc6OmFyZyh1aW50IGEsIGludCBmaWVsZHdpZHRoLCBpbnQgYmFzZSkgY29uc3QKeyBy ZXR1cm4gYXJnKCh1bG9uZylhLCBmaWVsZHdpZHRoLCBiYXNlKTsgfQoKaW5saW5lIFFTdHJpbmcg UVN0cmluZzo6YXJnKHNob3J0IGEsIGludCBmaWVsZHdpZHRoLCBpbnQgYmFzZSkgY29uc3QKeyBy ZXR1cm4gYXJnKChsb25nKWEsIGZpZWxkd2lkdGgsIGJhc2UpOyB9CgppbmxpbmUgUVN0cmluZyBR U3RyaW5nOjphcmcodXNob3J0IGEsIGludCBmaWVsZHdpZHRoLCBpbnQgYmFzZSkgY29uc3QKeyBy ZXR1cm4gYXJnKCh1bG9uZylhLCBmaWVsZHdpZHRoLCBiYXNlKTsgfQoKaW5saW5lIGludCBRU3Ry aW5nOjpmaW5kKCBjaGFyIGMsIGludCBpbmRleCwgYm9vbCBjcyApIGNvbnN0CnsgcmV0dXJuIGZp bmQoUUNoYXIoYyksIGluZGV4LCBjcyk7IH0KCmlubGluZSBpbnQgUVN0cmluZzo6ZmluZFJldigg Y2hhciBjLCBpbnQgaW5kZXgsIGJvb2wgY3MpIGNvbnN0CnsgcmV0dXJuIGZpbmRSZXYoIFFDaGFy KGMpLCBpbmRleCwgY3MgKTsgfQoKCgppbmxpbmUgaW50IFFTdHJpbmc6OmZpbmQoIGNvbnN0IGNo YXIqIHN0ciwgaW50IGluZGV4ICkgY29uc3QKeyByZXR1cm4gZmluZChRU3RyaW5nOjpmcm9tTGF0 aW4xKHN0ciksIGluZGV4KTsgfQoKaW5saW5lIGludCBRU3RyaW5nOjpmaW5kUmV2KCBjb25zdCBj aGFyKiBzdHIsIGludCBpbmRleCApIGNvbnN0CnsgcmV0dXJuIGZpbmRSZXYoUVN0cmluZzo6ZnJv bUxhdGluMShzdHIpLCBpbmRleCk7IH0KCgoKIAoKCgogIGJvb2wgb3BlcmF0b3IhPSggY29uc3Qg UVN0cmluZyAmczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcjwoIGNvbnN0 IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwogIGJvb2wgb3BlcmF0b3I8PSggY29u c3QgUVN0cmluZyAmczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcj09KCBj b25zdCBRU3RyaW5nICZzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKICBib29sIG9wZXJhdG9yPigg Y29uc3QgUVN0cmluZyAmczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcj49 KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKCiAgYm9vbCBvcGVyYXRv ciE9KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKTsKICBib29sIG9wZXJhdG9y PCggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICk7CiAgYm9vbCBvcGVyYXRvcjw9 KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKTsKICBib29sIG9wZXJhdG9yPT0o IGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApOwogIGJvb2wgb3BlcmF0b3I+KCBj b25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKTsKICBib29sIG9wZXJhdG9yPj0oIGNv bnN0IFFTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApOwogIGJvb2wgb3BlcmF0b3IhPSggY29u c3QgY2hhciAqczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcjwoIGNvbnN0 IGNoYXIgKnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwogIGJvb2wgb3BlcmF0b3I8PSggY29uc3Qg Y2hhciAqczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBj aGFyICpzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKIAogIGJvb2wgb3BlcmF0b3I+PSggY29uc3Qg Y2hhciAqczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CgoKICBpbmxpbmUgY29uc3QgUVN0cmluZyBv cGVyYXRvcisoIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApCnsKICAgIFFT dHJpbmcgdG1wKCBzMSApOwogICAgdG1wICs9IHMyOwogICAgcmV0dXJuIHRtcDsKfQoKCiAgaW5s aW5lIGNvbnN0IFFTdHJpbmcgb3BlcmF0b3IrKCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hh ciAqczIgKQp7CiAgICBRU3RyaW5nIHRtcCggczEgKTsKICAgIHRtcCArPSBRU3RyaW5nOjpmcm9t TGF0aW4xKHMyKTsKICAgIHJldHVybiB0bXA7Cn0KCiAgaW5saW5lIGNvbnN0IFFTdHJpbmcgb3Bl cmF0b3IrKCBjb25zdCBjaGFyICpzMSwgY29uc3QgUVN0cmluZyAmczIgKQp7CiAgICBRU3RyaW5n IHRtcCA9IFFTdHJpbmc6OmZyb21MYXRpbjEoIHMxICk7CiAgICB0bXAgKz0gczI7CiAgICByZXR1 cm4gdG1wOwp9CgoKICBpbmxpbmUgY29uc3QgUVN0cmluZyBvcGVyYXRvcisoIGNvbnN0IFFTdHJp bmcgJnMxLCBRQ2hhciBjMiApCnsKICAgIFFTdHJpbmcgdG1wKCBzMSApOwogICAgdG1wICs9IGMy OwogICAgcmV0dXJuIHRtcDsKfQoKICBpbmxpbmUgY29uc3QgUVN0cmluZyBvcGVyYXRvcisoIGNv bnN0IFFTdHJpbmcgJnMxLCBjaGFyIGMyICkKewogICAgUVN0cmluZyB0bXAoIHMxICk7CiAgICB0 bXAgKz0gYzI7CiAgICByZXR1cm4gdG1wOwp9CgogIGlubGluZSBjb25zdCBRU3RyaW5nIG9wZXJh dG9yKyggUUNoYXIgYzEsIGNvbnN0IFFTdHJpbmcgJnMyICkKewogICAgUVN0cmluZyB0bXA7CiAg ICB0bXAgKz0gYzE7CiAgICB0bXAgKz0gczI7CiAgICByZXR1cm4gdG1wOwp9CgogIGlubGluZSBj b25zdCBRU3RyaW5nIG9wZXJhdG9yKyggY2hhciBjMSwgY29uc3QgUVN0cmluZyAmczIgKQp7CiAg ICBRU3RyaW5nIHRtcDsKICAgIHRtcCArPSBjMTsKICAgIHRtcCArPSBzMjsKICAgIHJldHVybiB0 bXA7Cn0KCgoKCgoKCgoKCiMgNDQgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2luZG93ZGVmcy5o IiAyCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbmFtZXNwYWNlLmgiIDEKIAoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFDb2xvcjsKY2xhc3Mg UUN1cnNvcjsKCgpjbGFzcyAgIFF0IHsKcHVibGljOgogICAgc3RhdGljIGNvbnN0ICBRQ29sb3Ig JiBjb2xvcjA7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGNvbG9yMTsKICAgIHN0YXRpYyBj b25zdCAgUUNvbG9yICYgYmxhY2s7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIHdoaXRlOwog ICAgc3RhdGljIGNvbnN0ICBRQ29sb3IgJiBkYXJrR3JheTsKICAgIHN0YXRpYyBjb25zdCAgUUNv bG9yICYgZ3JheTsKICAgIHN0YXRpYyBjb25zdCAgUUNvbG9yICYgbGlnaHRHcmF5OwogICAgc3Rh dGljIGNvbnN0ICBRQ29sb3IgJiByZWQ7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGdyZWVu OwogICAgc3RhdGljIGNvbnN0ICBRQ29sb3IgJiBibHVlOwogICAgc3RhdGljIGNvbnN0ICBRQ29s b3IgJiBjeWFuOwogICAgc3RhdGljIGNvbnN0ICBRQ29sb3IgJiBtYWdlbnRhOwogICAgc3RhdGlj IGNvbnN0ICBRQ29sb3IgJiB5ZWxsb3c7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGRhcmtS ZWQ7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGRhcmtHcmVlbjsKICAgIHN0YXRpYyBjb25z dCAgUUNvbG9yICYgZGFya0JsdWU7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGRhcmtDeWFu OwogICAgc3RhdGljIGNvbnN0ICBRQ29sb3IgJiBkYXJrTWFnZW50YTsKICAgIHN0YXRpYyBjb25z dCAgUUNvbG9yICYgZGFya1llbGxvdzsKCiAgICAgCiAgICBlbnVtIEJ1dHRvblN0YXRlIHsJCQkJ IAoJTm9CdXR0b24JPSAweDAwMDAsCglMZWZ0QnV0dG9uCT0gMHgwMDAxLAoJUmlnaHRCdXR0b24J PSAweDAwMDIsCglNaWRCdXR0b24JPSAweDAwMDQsCglNb3VzZUJ1dHRvbk1hc2sgPSAweDAwMDcs CglTaGlmdEJ1dHRvbgk9IDB4MDEwMCwKCUNvbnRyb2xCdXR0b24gICA9IDB4MDIwMCwKCUFsdEJ1 dHRvbgk9IDB4MDQwMCwKCU1ldGFCdXR0b24JPSAweDA4MDAsCglLZXlCdXR0b25NYXNrCT0gMHgw ZjAwLAoJS2V5cGFkCQk9IDB4NDAwMAogICAgfTsKCiAgICAgCiAgICAgCiAgICBlbnVtIE9yaWVu dGF0aW9uIHsKICAgICAgICBIb3Jpem9udGFsID0gMCwKCVZlcnRpY2FsCiAgICB9OwoKICAgICAK ICAgICAKICAgICAKCiAgICAgCiAgICBlbnVtIEFsaWdubWVudEZsYWdzIHsKCUFsaWduQXV0bwkJ PSAweDAwMDAsIAkgCglBbGlnbkxlZnQJCT0gMHgwMDAxLAoJQWxpZ25SaWdodAkJPSAweDAwMDIs CglBbGlnbkhDZW50ZXIJCT0gMHgwMDA0LAoJQWxpZ25KdXN0aWZ5CQk9IDB4MDAwOCwKCUFsaWdu SG9yaXpvbnRhbF9NYXNrCT0gQWxpZ25MZWZ0IHwgQWxpZ25SaWdodCB8IEFsaWduSENlbnRlciB8 IEFsaWduSnVzdGlmeSwKCUFsaWduVG9wCQk9IDB4MDAxMCwKCUFsaWduQm90dG9tCQk9IDB4MDAy MCwKCUFsaWduVkNlbnRlcgkJPSAweDAwNDAsCglBbGlnblZlcnRpY2FsX01hc2sgCT0gQWxpZ25U b3AgfCBBbGlnbkJvdHRvbSB8IEFsaWduVkNlbnRlciwKCUFsaWduQ2VudGVyCQk9IEFsaWduVkNl bnRlciB8IEFsaWduSENlbnRlcgogICAgfTsKCiAgICAgCiAgICBlbnVtIFRleHRGbGFncyB7CglT aW5nbGVMaW5lCT0gMHgwMDgwLAkJIAoJRG9udENsaXAJPSAweDAxMDAsCglFeHBhbmRUYWJzCT0g MHgwMjAwLAoJU2hvd1ByZWZpeAk9IDB4MDQwMCwKCVdvcmRCcmVhawk9IDB4MDgwMCwKCUJyZWFr QW55d2hlcmUgPSAweDEwMDAsCglEb250UHJpbnQJPSAweDIwMDAsCQkgCglOb0FjY2VsID0gMHg0 MDAwCiAgICB9OwoKICAgICAKICAgIHR5cGVkZWYgdWludCBXU3RhdGU7CgogICAgIAogICAgZW51 bSBXaWRnZXRTdGF0ZSB7CglXU3RhdGVfQ3JlYXRlZAkJPSAweDAwMDAwMDAxLAoJV1N0YXRlX0Rp c2FibGVkCQk9IDB4MDAwMDAwMDIsCglXU3RhdGVfVmlzaWJsZQkJPSAweDAwMDAwMDA0LAoJV1N0 YXRlX0ZvcmNlSGlkZQk9IDB4MDAwMDAwMDgsCglXU3RhdGVfT3duQ3Vyc29yCT0gMHgwMDAwMDAx MCwKCVdTdGF0ZV9Nb3VzZVRyYWNraW5nCT0gMHgwMDAwMDAyMCwKCVdTdGF0ZV9Db21wcmVzc0tl eXMJPSAweDAwMDAwMDQwLAoJV1N0YXRlX0Jsb2NrVXBkYXRlcwk9IDB4MDAwMDAwODAsCglXU3Rh dGVfSW5QYWludEV2ZW50CT0gMHgwMDAwMDEwMCwKCVdTdGF0ZV9SZXBhcmVudGVkCT0gMHgwMDAw MDIwMCwKCVdTdGF0ZV9Db25maWdQZW5kaW5nCT0gMHgwMDAwMDQwMCwKCVdTdGF0ZV9SZXNpemVk CQk9IDB4MDAwMDA4MDAsCglXU3RhdGVfQXV0b01hc2sJCT0gMHgwMDAwMTAwMCwKCVdTdGF0ZV9Q b2xpc2hlZAkJPSAweDAwMDAyMDAwLAoJV1N0YXRlX0RORAkJPSAweDAwMDA0MDAwLAoJV1N0YXRl X1Jlc2VydmVkMAk9IDB4MDAwMDgwMDAsCglXU3RhdGVfUmVzZXJ2ZWQxCT0gMHgwMDAxMDAwMCwK CVdTdGF0ZV9SZXNlcnZlZDIJPSAweDAwMDIwMDAwLAoJV1N0YXRlX1Jlc2VydmVkMwk9IDB4MDAw NDAwMDAsCglXU3RhdGVfTWF4aW1pemVkCT0gMHgwMDA4MDAwMCwKCVdTdGF0ZV9NaW5pbWl6ZWQJ PSAweDAwMTAwMDAwLAoJV1N0YXRlX0ZvcmNlRGlzYWJsZWQJPSAweDAwMjAwMDAwLAoJV1N0YXRl X0V4cG9zZWQJCT0gMHgwMDQwMDAwMCwKCVdTdGF0ZV9IYXNNb3VzZQkJPSAweDAwODAwMDAwCiAg ICB9OwoKICAgICAKICAgIHR5cGVkZWYgdWludCBXRmxhZ3M7CgogICAgIAogICAgZW51bSBXaWRn ZXRGbGFncyB7CglXVHlwZV9Ub3BMZXZlbAkJPSAweDAwMDAwMDAxLAkgCglXVHlwZV9EaWFsb2cJ CT0gMHgwMDAwMDAwMiwKCVdUeXBlX1BvcHVwCQk9IDB4MDAwMDAwMDQsCglXVHlwZV9EZXNrdG9w CQk9IDB4MDAwMDAwMDgsCglXVHlwZV9NYXNrCQk9IDB4MDAwMDAwMGYsCgoJV1N0eWxlX0N1c3Rv bWl6ZQk9IDB4MDAwMDAwMTAsCSAKCVdTdHlsZV9Ob3JtYWxCb3JkZXIJPSAweDAwMDAwMDIwLAoJ V1N0eWxlX0RpYWxvZ0JvcmRlcgk9IDB4MDAwMDAwNDAsICAKCVdTdHlsZV9Ob0JvcmRlcgkJPSAw eDAwMDAyMDAwLAoJV1N0eWxlX1RpdGxlCQk9IDB4MDAwMDAwODAsCglXU3R5bGVfU3lzTWVudQkJ PSAweDAwMDAwMTAwLAoJV1N0eWxlX01pbmltaXplCQk9IDB4MDAwMDAyMDAsCglXU3R5bGVfTWF4 aW1pemUJCT0gMHgwMDAwMDQwMCwKCVdTdHlsZV9NaW5NYXgJCT0gV1N0eWxlX01pbmltaXplIHwg V1N0eWxlX01heGltaXplLAoJV1N0eWxlX1Rvb2wJCT0gMHgwMDAwMDgwMCwKCVdTdHlsZV9TdGF5 c09uVG9wCT0gMHgwMDAwMTAwMCwKCVdTdHlsZV9Db250ZXh0SGVscAk9IDB4MDAwMDQwMDAsCglX U3R5bGVfUmVzZXJ2ZWQJCT0gMHgwMDAwODAwMCwKCVdTdHlsZV9NYXNrCQk9IDB4MDAwMGZmZjAs CgoJV0Rlc3RydWN0aXZlQ2xvc2UJPSAweDAwMDEwMDAwLAkgCglXUGFpbnREZXNrdG9wCQk9IDB4 MDAwMjAwMDAsCglXUGFpbnRVbmNsaXBwZWQJCT0gMHgwMDA0MDAwMCwKCVdQYWludENsZXZlcgkJ PSAweDAwMDgwMDAwLAoJV1Jlc2l6ZU5vRXJhc2UJCT0gMHgwMDEwMDAwMCwKCVdNb3VzZU5vTWFz awkJPSAweDAwMjAwMDAwLAoJV1N0YXRpY0NvbnRlbnRzCQk9IDB4MDA0MDAwMDAsCglXUmVwYWlu dE5vRXJhc2UJCT0gMHgwMDgwMDAwMCwKCglXWDExQnlwYXNzV00JCT0gMHgwMTAwMDAwMCwKCVdX aW5Pd25EQwkJPSAweDAwMDAwMDAwLAoKCgoKCVdHcm91cExlYWRlciAJCT0gMHgwMjAwMDAwMCwK CVdTaG93TW9kYWwgCSAgICAgICAJPSAweDA0MDAwMDAwLAoJV05vTW91c2VQcm9wYWdhdGlvbgk9 IDB4MDgwMDAwMDAsCglXU3ViV2luZG93ICAgICAgICAgICAgICA9IDB4MTAwMDAwMDAKCgksCglX Tm9ydGhXZXN0R3Jhdml0eQk9IFdTdGF0aWNDb250ZW50cywKCVdUeXBlX01vZGFsCQk9IFdUeXBl X0RpYWxvZyB8IFdTaG93TW9kYWwsCglXU3R5bGVfRGlhbG9nIAkJPSBXVHlwZV9EaWFsb2csCglX U3R5bGVfTm9Cb3JkZXJFeAk9IFdTdHlsZV9Ob0JvcmRlcgoKICAgIH07CgogICAgIAogICAgIAog ICAgIAoKICAgIGVudW0gSW1hZ2VDb252ZXJzaW9uRmxhZ3MgewoJQ29sb3JNb2RlX01hc2sJCT0g MHgwMDAwMDAwMywKCUF1dG9Db2xvcgkJPSAweDAwMDAwMDAwLAoJQ29sb3JPbmx5CQk9IDB4MDAw MDAwMDMsCglNb25vT25seQkJPSAweDAwMDAwMDAyLAoJIAoKCUFscGhhRGl0aGVyX01hc2sJPSAw eDAwMDAwMDBjLAoJVGhyZXNob2xkQWxwaGFEaXRoZXIJPSAweDAwMDAwMDAwLAoJT3JkZXJlZEFs cGhhRGl0aGVyCT0gMHgwMDAwMDAwNCwKCURpZmZ1c2VBbHBoYURpdGhlcgk9IDB4MDAwMDAwMDgs CglOb0FscGhhCQkJPSAweDAwMDAwMDBjLCAgCgoJRGl0aGVyX01hc2sJCT0gMHgwMDAwMDAzMCwK CURpZmZ1c2VEaXRoZXIJCT0gMHgwMDAwMDAwMCwKCU9yZGVyZWREaXRoZXIJCT0gMHgwMDAwMDAx MCwKCVRocmVzaG9sZERpdGhlcgkJPSAweDAwMDAwMDIwLAoJIAoKCURpdGhlck1vZGVfTWFzawkJ PSAweDAwMDAwMGMwLAoJQXV0b0RpdGhlcgkJPSAweDAwMDAwMDAwLAoJUHJlZmVyRGl0aGVyCQk9 IDB4MDAwMDAwNDAsCglBdm9pZERpdGhlcgkJPSAweDAwMDAwMDgwCiAgICB9OwoKICAgICAKICAg IGVudW0gQkdNb2RlCXsJCQkJIAoJVHJhbnNwYXJlbnRNb2RlLAoJT3BhcXVlTW9kZQogICAgfTsK CgogICAgIAogICAgZW51bSBQYWludFVuaXQgewkJCQkgCglQaXhlbFVuaXQsCglMb01ldHJpY1Vu aXQsICAKCUhpTWV0cmljVW5pdCwgIAoJTG9FbmdsaXNoVW5pdCwgIAoJSGlFbmdsaXNoVW5pdCwg IAoJVHdpcHNVbml0ICAKICAgIH07CgoKICAgICAKCgoKCgoKICAgIGVudW0gR1VJU3R5bGUgewoJ TWFjU3R5bGUsICAKCVdpbmRvd3NTdHlsZSwKCVdpbjNTdHlsZSwgIAoJUE1TdHlsZSwgIAoJTW90 aWZTdHlsZQogICAgfTsKCgogICAgIAogICAgZW51bSBNb2RpZmllciB7CQkgCglTSElGVCAgICAg ICAgID0gMHgwMDIwMDAwMCwKCUNUUkwgICAgICAgICAgPSAweDAwNDAwMDAwLAoJQUxUICAgICAg ICAgICA9IDB4MDA4MDAwMDAsCglNT0RJRklFUl9NQVNLID0gMHgwMGUwMDAwMCwKCVVOSUNPREVf QUNDRUwgPSAweDEwMDAwMDAwLAoKCUFTQ0lJX0FDQ0VMID0gVU5JQ09ERV9BQ0NFTCAgCiAgICB9 OwoKICAgICAKICAgIGVudW0gS2V5IHsKCUtleV9Fc2NhcGUgPSAweDEwMDAsCQkgCglLZXlfVGFi ID0gMHgxMDAxLAoJS2V5X0JhY2t0YWIgPSAweDEwMDIsIEtleV9CYWNrVGFiID0gS2V5X0JhY2t0 YWIsCglLZXlfQmFja3NwYWNlID0gMHgxMDAzLCBLZXlfQmFja1NwYWNlID0gS2V5X0JhY2tzcGFj ZSwKCUtleV9SZXR1cm4gPSAweDEwMDQsCglLZXlfRW50ZXIgPSAweDEwMDUsCglLZXlfSW5zZXJ0 ID0gMHgxMDA2LAoJS2V5X0RlbGV0ZSA9IDB4MTAwNywKCUtleV9QYXVzZSA9IDB4MTAwOCwKCUtl eV9QcmludCA9IDB4MTAwOSwKCUtleV9TeXNSZXEgPSAweDEwMGEsCglLZXlfSG9tZSA9IDB4MTAx MCwJCSAKCUtleV9FbmQgPSAweDEwMTEsCglLZXlfTGVmdCA9IDB4MTAxMiwKCUtleV9VcCA9IDB4 MTAxMywKCUtleV9SaWdodCA9IDB4MTAxNCwKCUtleV9Eb3duID0gMHgxMDE1LAoJS2V5X1ByaW9y ID0gMHgxMDE2LCBLZXlfUGFnZVVwID0gS2V5X1ByaW9yLAoJS2V5X05leHQgPSAweDEwMTcsIEtl eV9QYWdlRG93biA9IEtleV9OZXh0LAoJS2V5X1NoaWZ0ID0gMHgxMDIwLAkJIAoJS2V5X0NvbnRy b2wgPSAweDEwMjEsCglLZXlfTWV0YSA9IDB4MTAyMiwKCUtleV9BbHQgPSAweDEwMjMsCglLZXlf Q2Fwc0xvY2sgPSAweDEwMjQsCglLZXlfTnVtTG9jayA9IDB4MTAyNSwKCUtleV9TY3JvbGxMb2Nr ID0gMHgxMDI2LAoJS2V5X0YxID0gMHgxMDMwLAkJIAoJS2V5X0YyID0gMHgxMDMxLAoJS2V5X0Yz ID0gMHgxMDMyLAoJS2V5X0Y0ID0gMHgxMDMzLAoJS2V5X0Y1ID0gMHgxMDM0LAoJS2V5X0Y2ID0g MHgxMDM1LAoJS2V5X0Y3ID0gMHgxMDM2LAoJS2V5X0Y4ID0gMHgxMDM3LAoJS2V5X0Y5ID0gMHgx MDM4LAoJS2V5X0YxMCA9IDB4MTAzOSwKCUtleV9GMTEgPSAweDEwM2EsCglLZXlfRjEyID0gMHgx MDNiLAoJS2V5X0YxMyA9IDB4MTAzYywKCUtleV9GMTQgPSAweDEwM2QsCglLZXlfRjE1ID0gMHgx MDNlLAoJS2V5X0YxNiA9IDB4MTAzZiwKCUtleV9GMTcgPSAweDEwNDAsCglLZXlfRjE4ID0gMHgx MDQxLAoJS2V5X0YxOSA9IDB4MTA0MiwKCUtleV9GMjAgPSAweDEwNDMsCglLZXlfRjIxID0gMHgx MDQ0LAoJS2V5X0YyMiA9IDB4MTA0NSwKCUtleV9GMjMgPSAweDEwNDYsCglLZXlfRjI0ID0gMHgx MDQ3LAoJS2V5X0YyNSA9IDB4MTA0OCwJCSAKCUtleV9GMjYgPSAweDEwNDksCglLZXlfRjI3ID0g MHgxMDRhLAoJS2V5X0YyOCA9IDB4MTA0YiwKCUtleV9GMjkgPSAweDEwNGMsCglLZXlfRjMwID0g MHgxMDRkLAoJS2V5X0YzMSA9IDB4MTA0ZSwKCUtleV9GMzIgPSAweDEwNGYsCglLZXlfRjMzID0g MHgxMDUwLAoJS2V5X0YzNCA9IDB4MTA1MSwKCUtleV9GMzUgPSAweDEwNTIsCglLZXlfU3VwZXJf TCA9IDB4MTA1MywgCQkgCglLZXlfU3VwZXJfUiA9IDB4MTA1NCwKCUtleV9NZW51ID0gMHgxMDU1 LAoJS2V5X0h5cGVyX0wgPSAweDEwNTYsCglLZXlfSHlwZXJfUiA9IDB4MTA1NywKCUtleV9IZWxw ID0gMHgxMDU4LAoJS2V5X0RpcmVjdGlvbl9MID0gMHgxMDU5LAoJS2V5X0RpcmVjdGlvbl9SID0g MHgxMDYwLAoJS2V5X1NwYWNlID0gMHgyMCwJCSAKCUtleV9BbnkgPSBLZXlfU3BhY2UsCglLZXlf RXhjbGFtID0gMHgyMSwKCUtleV9RdW90ZURibCA9IDB4MjIsCglLZXlfTnVtYmVyU2lnbiA9IDB4 MjMsCglLZXlfRG9sbGFyID0gMHgyNCwKCUtleV9QZXJjZW50ID0gMHgyNSwKCUtleV9BbXBlcnNh bmQgPSAweDI2LAoJS2V5X0Fwb3N0cm9waGUgPSAweDI3LAoJS2V5X1BhcmVuTGVmdCA9IDB4Mjgs CglLZXlfUGFyZW5SaWdodCA9IDB4MjksCglLZXlfQXN0ZXJpc2sgPSAweDJhLAoJS2V5X1BsdXMg PSAweDJiLAoJS2V5X0NvbW1hID0gMHgyYywKCUtleV9NaW51cyA9IDB4MmQsCglLZXlfUGVyaW9k ID0gMHgyZSwKCUtleV9TbGFzaCA9IDB4MmYsCglLZXlfMCA9IDB4MzAsCglLZXlfMSA9IDB4MzEs CglLZXlfMiA9IDB4MzIsCglLZXlfMyA9IDB4MzMsCglLZXlfNCA9IDB4MzQsCglLZXlfNSA9IDB4 MzUsCglLZXlfNiA9IDB4MzYsCglLZXlfNyA9IDB4MzcsCglLZXlfOCA9IDB4MzgsCglLZXlfOSA9 IDB4MzksCglLZXlfQ29sb24gPSAweDNhLAoJS2V5X1NlbWljb2xvbiA9IDB4M2IsCglLZXlfTGVz cyA9IDB4M2MsCglLZXlfRXF1YWwgPSAweDNkLAoJS2V5X0dyZWF0ZXIgPSAweDNlLAoJS2V5X1F1 ZXN0aW9uID0gMHgzZiwKCUtleV9BdCA9IDB4NDAsCglLZXlfQSA9IDB4NDEsCglLZXlfQiA9IDB4 NDIsCglLZXlfQyA9IDB4NDMsCglLZXlfRCA9IDB4NDQsCglLZXlfRSA9IDB4NDUsCglLZXlfRiA9 IDB4NDYsCglLZXlfRyA9IDB4NDcsCglLZXlfSCA9IDB4NDgsCglLZXlfSSA9IDB4NDksCglLZXlf SiA9IDB4NGEsCglLZXlfSyA9IDB4NGIsCglLZXlfTCA9IDB4NGMsCglLZXlfTSA9IDB4NGQsCglL ZXlfTiA9IDB4NGUsCglLZXlfTyA9IDB4NGYsCglLZXlfUCA9IDB4NTAsCglLZXlfUSA9IDB4NTEs CglLZXlfUiA9IDB4NTIsCglLZXlfUyA9IDB4NTMsCglLZXlfVCA9IDB4NTQsCglLZXlfVSA9IDB4 NTUsCglLZXlfViA9IDB4NTYsCglLZXlfVyA9IDB4NTcsCglLZXlfWCA9IDB4NTgsCglLZXlfWSA9 IDB4NTksCglLZXlfWiA9IDB4NWEsCglLZXlfQnJhY2tldExlZnQgPSAweDViLAoJS2V5X0JhY2tz bGFzaCA9IDB4NWMsCglLZXlfQnJhY2tldFJpZ2h0ID0gMHg1ZCwKCUtleV9Bc2NpaUNpcmN1bSA9 IDB4NWUsCglLZXlfVW5kZXJzY29yZSA9IDB4NWYsCglLZXlfUXVvdGVMZWZ0ID0gMHg2MCwKCUtl eV9CcmFjZUxlZnQgPSAweDdiLAoJS2V5X0JhciA9IDB4N2MsCglLZXlfQnJhY2VSaWdodCA9IDB4 N2QsCglLZXlfQXNjaWlUaWxkZSA9IDB4N2UsCgoJIAoKCUtleV9ub2JyZWFrc3BhY2UgPSAweDBh MCwKCUtleV9leGNsYW1kb3duID0gMHgwYTEsCglLZXlfY2VudCA9IDB4MGEyLAoJS2V5X3N0ZXJs aW5nID0gMHgwYTMsCglLZXlfY3VycmVuY3kgPSAweDBhNCwKCUtleV95ZW4gPSAweDBhNSwKCUtl eV9icm9rZW5iYXIgPSAweDBhNiwKCUtleV9zZWN0aW9uID0gMHgwYTcsCglLZXlfZGlhZXJlc2lz ID0gMHgwYTgsCglLZXlfY29weXJpZ2h0ID0gMHgwYTksCglLZXlfb3JkZmVtaW5pbmUgPSAweDBh YSwKCUtleV9ndWlsbGVtb3RsZWZ0ID0gMHgwYWIsCSAKCUtleV9ub3RzaWduID0gMHgwYWMsCglL ZXlfaHlwaGVuID0gMHgwYWQsCglLZXlfcmVnaXN0ZXJlZCA9IDB4MGFlLAoJS2V5X21hY3JvbiA9 IDB4MGFmLAoJS2V5X2RlZ3JlZSA9IDB4MGIwLAoJS2V5X3BsdXNtaW51cyA9IDB4MGIxLAoJS2V5 X3R3b3N1cGVyaW9yID0gMHgwYjIsCglLZXlfdGhyZWVzdXBlcmlvciA9IDB4MGIzLAoJS2V5X2Fj dXRlID0gMHgwYjQsCglLZXlfbXUgPSAweDBiNSwKCUtleV9wYXJhZ3JhcGggPSAweDBiNiwKCUtl eV9wZXJpb2RjZW50ZXJlZCA9IDB4MGI3LAoJS2V5X2NlZGlsbGEgPSAweDBiOCwKCUtleV9vbmVz dXBlcmlvciA9IDB4MGI5LAoJS2V5X21hc2N1bGluZSA9IDB4MGJhLAoJS2V5X2d1aWxsZW1vdHJp Z2h0ID0gMHgwYmIsCSAKCUtleV9vbmVxdWFydGVyID0gMHgwYmMsCglLZXlfb25laGFsZiA9IDB4 MGJkLAoJS2V5X3RocmVlcXVhcnRlcnMgPSAweDBiZSwKCUtleV9xdWVzdGlvbmRvd24gPSAweDBi ZiwKCUtleV9BZ3JhdmUgPSAweDBjMCwKCUtleV9BYWN1dGUgPSAweDBjMSwKCUtleV9BY2lyY3Vt ZmxleCA9IDB4MGMyLAoJS2V5X0F0aWxkZSA9IDB4MGMzLAoJS2V5X0FkaWFlcmVzaXMgPSAweDBj NCwKCUtleV9BcmluZyA9IDB4MGM1LAoJS2V5X0FFID0gMHgwYzYsCglLZXlfQ2NlZGlsbGEgPSAw eDBjNywKCUtleV9FZ3JhdmUgPSAweDBjOCwKCUtleV9FYWN1dGUgPSAweDBjOSwKCUtleV9FY2ly Y3VtZmxleCA9IDB4MGNhLAoJS2V5X0VkaWFlcmVzaXMgPSAweDBjYiwKCUtleV9JZ3JhdmUgPSAw eDBjYywKCUtleV9JYWN1dGUgPSAweDBjZCwKCUtleV9JY2lyY3VtZmxleCA9IDB4MGNlLAoJS2V5 X0lkaWFlcmVzaXMgPSAweDBjZiwKCUtleV9FVEggPSAweDBkMCwKCUtleV9OdGlsZGUgPSAweDBk MSwKCUtleV9PZ3JhdmUgPSAweDBkMiwKCUtleV9PYWN1dGUgPSAweDBkMywKCUtleV9PY2lyY3Vt ZmxleCA9IDB4MGQ0LAoJS2V5X090aWxkZSA9IDB4MGQ1LAoJS2V5X09kaWFlcmVzaXMgPSAweDBk NiwKCUtleV9tdWx0aXBseSA9IDB4MGQ3LAoJS2V5X09vYmxpcXVlID0gMHgwZDgsCglLZXlfVWdy YXZlID0gMHgwZDksCglLZXlfVWFjdXRlID0gMHgwZGEsCglLZXlfVWNpcmN1bWZsZXggPSAweDBk YiwKCUtleV9VZGlhZXJlc2lzID0gMHgwZGMsCglLZXlfWWFjdXRlID0gMHgwZGQsCglLZXlfVEhP Uk4gPSAweDBkZSwKCUtleV9zc2hhcnAgPSAweDBkZiwKCUtleV9hZ3JhdmUgPSAweDBlMCwKCUtl eV9hYWN1dGUgPSAweDBlMSwKCUtleV9hY2lyY3VtZmxleCA9IDB4MGUyLAoJS2V5X2F0aWxkZSA9 IDB4MGUzLAoJS2V5X2FkaWFlcmVzaXMgPSAweDBlNCwKCUtleV9hcmluZyA9IDB4MGU1LAoJS2V5 X2FlID0gMHgwZTYsCglLZXlfY2NlZGlsbGEgPSAweDBlNywKCUtleV9lZ3JhdmUgPSAweDBlOCwK CUtleV9lYWN1dGUgPSAweDBlOSwKCUtleV9lY2lyY3VtZmxleCA9IDB4MGVhLAoJS2V5X2VkaWFl cmVzaXMgPSAweDBlYiwKCUtleV9pZ3JhdmUgPSAweDBlYywKCUtleV9pYWN1dGUgPSAweDBlZCwK CUtleV9pY2lyY3VtZmxleCA9IDB4MGVlLAoJS2V5X2lkaWFlcmVzaXMgPSAweDBlZiwKCUtleV9l dGggPSAweDBmMCwKCUtleV9udGlsZGUgPSAweDBmMSwKCUtleV9vZ3JhdmUgPSAweDBmMiwKCUtl eV9vYWN1dGUgPSAweDBmMywKCUtleV9vY2lyY3VtZmxleCA9IDB4MGY0LAoJS2V5X290aWxkZSA9 IDB4MGY1LAoJS2V5X29kaWFlcmVzaXMgPSAweDBmNiwKCUtleV9kaXZpc2lvbiA9IDB4MGY3LAoJ S2V5X29zbGFzaCA9IDB4MGY4LAoJS2V5X3VncmF2ZSA9IDB4MGY5LAoJS2V5X3VhY3V0ZSA9IDB4 MGZhLAoJS2V5X3VjaXJjdW1mbGV4ID0gMHgwZmIsCglLZXlfdWRpYWVyZXNpcyA9IDB4MGZjLAoJ S2V5X3lhY3V0ZSA9IDB4MGZkLAoJS2V5X3Rob3JuID0gMHgwZmUsCglLZXlfeWRpYWVyZXNpcyA9 IDB4MGZmLAoKCUtleV91bmtub3duID0gMHhmZmZmCiAgICB9OwoKICAgICAKICAgIGVudW0gQXJy b3dUeXBlIHsKCVVwQXJyb3csCglEb3duQXJyb3csCglMZWZ0QXJyb3csCglSaWdodEFycm93CiAg ICB9OwoKICAgICAKICAgIGVudW0gUmFzdGVyT3AgeyAgCglDb3B5Uk9QLAoJT3JST1AsCglYb3JS T1AsCglOb3RBbmRST1AsIEVyYXNlUk9QPU5vdEFuZFJPUCwKCU5vdENvcHlST1AsCglOb3RPclJP UCwKCU5vdFhvclJPUCwKCUFuZFJPUCwJTm90RXJhc2VST1A9QW5kUk9QLAoJTm90Uk9QLAoJQ2xl YXJST1AsCglTZXRST1AsCglOb3BST1AsCglBbmROb3RST1AsCglPck5vdFJPUCwKCU5hbmRST1As CglOb3JST1AsCUxhc3RST1A9Tm9yUk9QCiAgICB9OwoKICAgICAKICAgIGVudW0gUGVuU3R5bGUg eyAgCglOb1BlbiwKCVNvbGlkTGluZSwKCURhc2hMaW5lLAoJRG90TGluZSwKCURhc2hEb3RMaW5l LAoJRGFzaERvdERvdExpbmUsCglNUGVuU3R5bGUgPSAweDBmCiAgICB9OwoKICAgICAKICAgIGVu dW0gUGVuQ2FwU3R5bGUgeyAgCglGbGF0Q2FwID0gMHgwMCwKCVNxdWFyZUNhcCA9IDB4MTAsCglS b3VuZENhcCA9IDB4MjAsCglNUGVuQ2FwU3R5bGUgPSAweDMwCiAgICB9OwoKICAgICAKICAgIGVu dW0gUGVuSm9pblN0eWxlIHsgIAoJTWl0ZXJKb2luID0gMHgwMCwKCUJldmVsSm9pbiA9IDB4NDAs CglSb3VuZEpvaW4gPSAweDgwLAoJTVBlbkpvaW5TdHlsZSA9IDB4YzAKICAgIH07CgogICAgIAog ICAgZW51bSBCcnVzaFN0eWxlIHsgIAoJTm9CcnVzaCwKCVNvbGlkUGF0dGVybiwKCURlbnNlMVBh dHRlcm4sCglEZW5zZTJQYXR0ZXJuLAoJRGVuc2UzUGF0dGVybiwKCURlbnNlNFBhdHRlcm4sCglE ZW5zZTVQYXR0ZXJuLAoJRGVuc2U2UGF0dGVybiwKCURlbnNlN1BhdHRlcm4sCglIb3JQYXR0ZXJu LAoJVmVyUGF0dGVybiwKCUNyb3NzUGF0dGVybiwKCUJEaWFnUGF0dGVybiwKCUZEaWFnUGF0dGVy biwKCURpYWdDcm9zc1BhdHRlcm4sCglDdXN0b21QYXR0ZXJuPTI0CiAgICB9OwoKICAgICAKICAg IGVudW0gV2luZG93c1ZlcnNpb24gewoJV1ZfMzJzIAkJPSAweDAwMDEsCglXVl85NSAJCT0gMHgw MDAyLAoJV1ZfOTgJCT0gMHgwMDAzLAoJV1ZfTWUJCT0gMHgwMDA0LAoJV1ZfRE9TX2Jhc2VkCT0g MHgwMDBmLAoKCVdWX05UIAkJPSAweDAwMTAsCglXVl8yMDAwIAk9IDB4MDAyMCwKCVdWX1hQCQk9 IDB4MDAzMCwKCVdWX05UX2Jhc2VkCT0gMHgwMGYwCiAgICB9OwoKICAgICAKICAgIGVudW0gVUlF ZmZlY3QgewoJVUlfR2VuZXJhbCwKCVVJX0FuaW1hdGVNZW51LAoJVUlfRmFkZU1lbnUsCglVSV9B bmltYXRlQ29tYm8sCglVSV9BbmltYXRlVG9vbHRpcCwKCVVJX0ZhZGVUb29sdGlwCiAgICB9OwoK ICAgICAKICAgIGVudW0gQ3Vyc29yU2hhcGUgewoJQXJyb3dDdXJzb3IsCglVcEFycm93Q3Vyc29y LAoJQ3Jvc3NDdXJzb3IsCglXYWl0Q3Vyc29yLAoJSWJlYW1DdXJzb3IsCglTaXplVmVyQ3Vyc29y LAoJU2l6ZUhvckN1cnNvciwKCVNpemVCRGlhZ0N1cnNvciwKCVNpemVGRGlhZ0N1cnNvciwKCVNp emVBbGxDdXJzb3IsCglCbGFua0N1cnNvciwKCVNwbGl0VkN1cnNvciwKCVNwbGl0SEN1cnNvciwK CVBvaW50aW5nSGFuZEN1cnNvciwKCUZvcmJpZGRlbkN1cnNvciwKCVdoYXRzVGhpc0N1cnNvciwK CUxhc3RDdXJzb3IJPSBXaGF0c1RoaXNDdXJzb3IsCglCaXRtYXBDdXJzb3IJPSAyNAogICAgfTsK CiAgICAgCgogICAgc3RhdGljIGNvbnN0ICBRQ3Vyc29yICYgYXJyb3dDdXJzb3I7CSAKICAgIHN0 YXRpYyBjb25zdCAgUUN1cnNvciAmIHVwQXJyb3dDdXJzb3I7CSAKICAgIHN0YXRpYyBjb25zdCAg UUN1cnNvciAmIGNyb3NzQ3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3QgIFFDdXJzb3IgJiB3YWl0 Q3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3QgIFFDdXJzb3IgJiBpYmVhbUN1cnNvcjsJIAogICAg c3RhdGljIGNvbnN0ICBRQ3Vyc29yICYgc2l6ZVZlckN1cnNvcjsJIAogICAgc3RhdGljIGNvbnN0 ICBRQ3Vyc29yICYgc2l6ZUhvckN1cnNvcjsJIAogICAgc3RhdGljIGNvbnN0ICBRQ3Vyc29yICYg c2l6ZUJEaWFnQ3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3QgIFFDdXJzb3IgJiBzaXplRkRpYWdD dXJzb3I7CSAKICAgIHN0YXRpYyBjb25zdCAgUUN1cnNvciAmIHNpemVBbGxDdXJzb3I7CSAKICAg IHN0YXRpYyBjb25zdCAgUUN1cnNvciAmIGJsYW5rQ3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3Qg IFFDdXJzb3IgJiBzcGxpdFZDdXJzb3I7CSAKCQkJCQkJIAogICAgc3RhdGljIGNvbnN0ICBRQ3Vy c29yICYgc3BsaXRIQ3Vyc29yOwkgCgkJCQkJCSAKICAgIHN0YXRpYyBjb25zdCAgUUN1cnNvciAm IHBvaW50aW5nSGFuZEN1cnNvcjsJIAogICAgc3RhdGljIGNvbnN0ICBRQ3Vyc29yICYgZm9yYmlk ZGVuQ3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3QgIFFDdXJzb3IgJiB3aGF0c1RoaXNDdXJzb3I7 ICAgCgoKICAgIGVudW0gVGV4dEZvcm1hdCB7CglQbGFpblRleHQsCglSaWNoVGV4dCwKCUF1dG9U ZXh0CiAgICB9OwoKICAgICAKICAgIGVudW0gRG9jayB7CglEb2NrVW5tYW5hZ2VkLAoJRG9ja1Rv cm5PZmYsCglEb2NrVG9wLAoJRG9ja0JvdHRvbSwKCURvY2tSaWdodCwKCURvY2tMZWZ0LAoJRG9j a01pbmltaXplZAoKICAgICAgICAsCglVbm1hbmFnZWQgPSBEb2NrVW5tYW5hZ2VkLAoJVG9ybk9m ZiA9IERvY2tUb3JuT2ZmLAoJVG9wID0gRG9ja1RvcCwKCUJvdHRvbSA9IERvY2tCb3R0b20sCglS aWdodCA9IERvY2tSaWdodCwKCUxlZnQgPSBEb2NrTGVmdCwKCU1pbmltaXplZCA9IERvY2tNaW5p bWl6ZWQKCiAgICB9OwogICAgIAogICAgdHlwZWRlZiBEb2NrIFRvb2xCYXJEb2NrOwoKICAgICAK ICAgIGVudW0gRGF0ZUZvcm1hdCB7CglUZXh0RGF0ZSwgICAgICAgCglJU09EYXRlLCAgICAgICAg CglMb2NhbERhdGUgICAgICAgCiAgICB9OwoKICAgICAKICAgIGVudW0gQmFja2dyb3VuZE1vZGUg ewoJRml4ZWRDb2xvciwKCUZpeGVkUGl4bWFwLAoJTm9CYWNrZ3JvdW5kLAoJUGFsZXR0ZUZvcmVn cm91bmQsCglQYWxldHRlQnV0dG9uLAoJUGFsZXR0ZUxpZ2h0LAoJUGFsZXR0ZU1pZGxpZ2h0LAoJ UGFsZXR0ZURhcmssCglQYWxldHRlTWlkLAoJUGFsZXR0ZVRleHQsCglQYWxldHRlQnJpZ2h0VGV4 dCwKCVBhbGV0dGVCYXNlLAoJUGFsZXR0ZUJhY2tncm91bmQsCglQYWxldHRlU2hhZG93LAoJUGFs ZXR0ZUhpZ2hsaWdodCwKCVBhbGV0dGVIaWdobGlnaHRlZFRleHQsCglQYWxldHRlQnV0dG9uVGV4 dCwKCVBhbGV0dGVMaW5rLAoJUGFsZXR0ZUxpbmtWaXNpdGVkLAoJWDExUGFyZW50UmVsYXRpdmUK ICAgIH07CgogICAgdHlwZWRlZiB1aW50IENvbXBhcmlzb25GbGFnczsKCiAgICAgCiAgICBlbnVt IFN0cmluZ0NvbXBhcmlzb25Nb2RlIHsKICAgICAgICBDYXNlU2Vuc2l0aXZlICAgPSAweDAwMDAx LCAgCiAgICAgICAgQmVnaW5zV2l0aCAgICAgID0gMHgwMDAwMiwgIAogICAgICAgIEVuZHNXaXRo ICAgICAgICA9IDB4MDAwMDQsICAKICAgICAgICBDb250YWlucyAgICAgICAgPSAweDAwMDA4LCAg CiAgICAgICAgRXhhY3RNYXRjaCAgICAgID0gMHgwMDAxMCAgIAogICAgfTsKCiAgICAgCiAgICAg CgoKCgoKICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBIQU5ETEU7CgoKCn07CgoKY2xhc3MgICBR SW50ZXJuYWwgewpwdWJsaWM6CiAgICBlbnVtIFBhaW50RGV2aWNlRmxhZ3MgewoJVW5kZWZpbmVk RGV2aWNlID0gMHgwMCwKCVdpZGdldCA9IDB4MDEsCglQaXhtYXAgPSAweDAyLAoJUHJpbnRlciA9 IDB4MDMsCglQaWN0dXJlID0gMHgwNCwKCVN5c3RlbSA9IDB4MDUsCglEZXZpY2VUeXBlTWFzayA9 IDB4MGYsCglFeHRlcm5hbERldmljZSA9IDB4MTAsCgkgCglDb21wYXRpYmlsaXR5TW9kZSA9IDB4 MjAKICAgIH07Cn07CgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F3aW5kb3dkZWZzLmgi IDIKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2lu Y2x1ZGUvbGltaXRzLmgiIDEgMwogCgoKIAoKCgoKCiAKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3lzbGltaXRzLmgiIDEgMwogCgoKCgoK IyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUv bGltaXRzLmgiIDEgMwogCgoKIAoKIyAxMTQgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFr ZS1saW51eC8yLjk1LjMvaW5jbHVkZS9saW1pdHMuaCIgMwoKCgojIDEgIi91c3IvaW5jbHVkZS9s aW1pdHMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCiAKIyAxICIvdXNyL2lu Y2x1ZGUvYml0cy9wb3NpeDFfbGltLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoK CgogCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCgogCgoKIAoKCiAKCgogCgoKIAoK CgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgoKIAoKCiAK CgogCgoKIAoKCiAKCgoKIAojIDEgIi91c3IvaW5jbHVkZS9iaXRzL2xvY2FsX2xpbS5oIiAxIDMK IAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAojIDEgIi91c3IvaW5jbHVkZS9saW51eC9saW1p dHMuaCIgMSAzCgoKCgoKCgoKCgoKCgoKCgoKCgojIDI3ICIvdXNyL2luY2x1ZGUvYml0cy9sb2Nh bF9saW0uaCIgMiAzCgoKIAoKCgoKCiAKCiAKCgogCgogCgoKIAoKIAoKCiAKCgoKIAoKIyAxMjYg Ii91c3IvaW5jbHVkZS9iaXRzL3Bvc2l4MV9saW0uaCIgMiAzCgoKCgoKCgoKIAoKCgoKCgoKIyAz MCAiL3Vzci9pbmNsdWRlL2xpbWl0cy5oIiAyIDMKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMv cG9zaXgyX2xpbS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCiAKCgogCgoKIAoK CiAKCgogCgoKCgogCgoKCgogCgoKCiAKCgogCgoKCiAKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCiAKCgoKIyAzNCAiL3Vzci9pbmNsdWRlL2xpbWl0cy5oIiAyIDMKCgoKCgoK CgogCgoKCgoKIAoKIyAxMjEgIi91c3IvaW5jbHVkZS9saW1pdHMuaCIgMwoKCgoKICAKCgoKCgoK CgojIDExNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNs dWRlL2xpbWl0cy5oIiAyIDMKCgoKCiMgNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtl LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N5c2xpbWl0cy5oIiAyIDMKCgojIDExICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvbGltaXRzLmgiIDIgMwoK CgoKCiAKCgoKIAoKCgogCgoKCgogCgoKCgoKIAoKCgogCgoKCgoKCgoKCgoKCiAKCiAKCgoKCiAK CgoKIAoKCgoKCgoKCiAKCgoKIAoKCgoKCgoKCgoKCgoKIAoKCgojIDEwNyAiL3Vzci9saWIvZ2Nj LWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL2xpbWl0cy5oIiAzCgoKCgog CgoKCgoKCgoKCiMgNDggIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2luZG93ZGVmcy5oIiAyCgoK IAoKY2xhc3MgUVBhaW50RGV2aWNlOwpjbGFzcyBRUGFpbnREZXZpY2VNZXRyaWNzOwpjbGFzcyBR V2lkZ2V0OwpjbGFzcyBRV2lkZ2V0TWFwcGVyOwpjbGFzcyBRRGlhbG9nOwpjbGFzcyBRQ29sb3I7 CmNsYXNzIFFDb2xvckdyb3VwOwpjbGFzcyBRUGFsZXR0ZTsKY2xhc3MgUUN1cnNvcjsKY2xhc3Mg UVBvaW50OwpjbGFzcyBRU2l6ZTsKY2xhc3MgUVJlY3Q7CmNsYXNzIFFQb2ludEFycmF5OwpjbGFz cyBRUGFpbnRlcjsKY2xhc3MgUVJlZ2lvbjsKY2xhc3MgUUZvbnQ7CmNsYXNzIFFGb250TWV0cmlj czsKY2xhc3MgUUZvbnRJbmZvOwpjbGFzcyBRUGVuOwpjbGFzcyBRQnJ1c2g7CmNsYXNzIFFXTWF0 cml4OwpjbGFzcyBRUGl4bWFwOwpjbGFzcyBRQml0bWFwOwpjbGFzcyBRTW92aWU7CmNsYXNzIFFJ bWFnZTsKY2xhc3MgUUltYWdlSU87CmNsYXNzIFFQaWN0dXJlOwpjbGFzcyBRUHJpbnRlcjsKY2xh c3MgUUFjY2VsOwpjbGFzcyBRVGltZXI7CmNsYXNzIFFUaW1lOwpjbGFzcyBRQ2xpcGJvYXJkOwoK CiAKCmNsYXNzIFFXaWRnZXRMaXN0OwpjbGFzcyBRV2lkZ2V0TGlzdEl0OwoKCiAKCiMgMTMwICIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcXdpbmRvd2RlZnMuaCIKCgoKCgoKCgoKdHlwZWRlZiBzdHJ1 Y3QgX1hEaXNwbGF5IERpc3BsYXk7CnR5cGVkZWYgdW5pb24gIF9YRXZlbnQgWEV2ZW50Owp0eXBl ZGVmIHN0cnVjdCBfWEdDICpHQzsKdHlwZWRlZiBzdHJ1Y3QgX1hSZWdpb24gKlJlZ2lvbjsKdHlw ZWRlZiB1bnNpZ25lZCBsb25nICBXSWQ7CgogIERpc3BsYXkgKnF0X3hkaXNwbGF5KCk7CiAgaW50 CSBxdF94c2NyZWVuKCk7CiAgV0lkCSBxdF94cm9vdHdpbigpOwogIEdDCSBxdF94Z2V0X3JlYWRv bmx5X2djKCBpbnQgc2NybiwgYm9vbCBtb25vY2hyb21lICk7CiAgR0MJIHF0X3hnZXRfdGVtcF9n YyggaW50IHNjcm4sIGJvb2wgbW9ub2Nocm9tZSApOwoKCgoKCgoKCgoKCmNsYXNzIFFBcHBsaWNh dGlvbjsKCgoKCgogCgp0eXBlZGVmIFFfSU5UMzIgUUNPT1JEOwkJCQkgCmNvbnN0IFFDT09SRCBR Q09PUkRfTUFYID0gIDIxNDc0ODM2NDc7CmNvbnN0IFFDT09SRCBRQ09PUkRfTUlOID0gLVFDT09S RF9NQVggLSAxOwoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgUVJnYjsJCQkgCgogIGNvbnN0IGNoYXIg KnFBcHBOYW1lKCk7CQkgCgogCgp0eXBlZGVmIHZvaWQgKCpRdENsZWFuVXBGdW5jdGlvbikoKTsK ICB2b2lkIHFBZGRQb3N0Um91dGluZSggUXRDbGVhblVwRnVuY3Rpb24gKTsKICB2b2lkIHFSZW1v dmVQb3N0Um91dGluZSggUXRDbGVhblVwRnVuY3Rpb24gKTsKCgogCnR5cGVkZWYgUXRDbGVhblVw RnVuY3Rpb24gUV9DbGVhblVwRnVuY3Rpb247CgoKIAogIHZvaWQgKnF0X2ZpbmRfb2JqX2NoaWxk KCBRT2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqICk7CgoKCgoKIyA0MiAiL3Vz ci9sb2NhbC9xdC9pbmNsdWRlL3Fjb2xvci5oIiAyCgoKCmNvbnN0IFFSZ2IgIFJHQl9NQVNLICAg ID0gMHgwMGZmZmZmZjsJCSAKCiAgaW5saW5lIGludCBxUmVkKCBRUmdiIHJnYiApCQkgCnsgcmV0 dXJuIChpbnQpKChyZ2IgPj4gMTYpICYgMHhmZik7IH0KCiAgaW5saW5lIGludCBxR3JlZW4oIFFS Z2IgcmdiICkJCSAKeyByZXR1cm4gKGludCkoKHJnYiA+PiA4KSAmIDB4ZmYpOyB9CgogIGlubGlu ZSBpbnQgcUJsdWUoIFFSZ2IgcmdiICkJCSAKeyByZXR1cm4gKGludCkocmdiICYgMHhmZik7IH0K CiAgaW5saW5lIGludCBxQWxwaGEoIFFSZ2IgcmdiICkJCSAKeyByZXR1cm4gKGludCkoKHJnYiA+ PiAyNCkgJiAweGZmKTsgfQoKICBpbmxpbmUgUVJnYiBxUmdiKCBpbnQgciwgaW50IGcsIGludCBi ICkgCnsgcmV0dXJuICgweGZmIDw8IDI0KSB8ICgociAmIDB4ZmYpIDw8IDE2KSB8ICgoZyAmIDB4 ZmYpIDw8IDgpIHwgKGIgJiAweGZmKTsgfQoKICBpbmxpbmUgUVJnYiBxUmdiYSggaW50IHIsIGlu dCBnLCBpbnQgYiwgaW50IGEgKSAKeyByZXR1cm4gKChhICYgMHhmZikgPDwgMjQpIHwgKChyICYg MHhmZikgPDwgMTYpIHwgKChnICYgMHhmZikgPDwgOCkgfCAoYiAmIDB4ZmYpOyB9CgogIGlubGlu ZSBpbnQgcUdyYXkoIGludCByLCBpbnQgZywgaW50IGIgKSAKeyByZXR1cm4gKHIqMTErZyoxNiti KjUpLzMyOyB9CgogIGlubGluZSBpbnQgcUdyYXkoIFFSZ2IgcmdiICkJCSAKeyByZXR1cm4gcUdy YXkoIHFSZWQocmdiKSwgcUdyZWVuKHJnYiksIHFCbHVlKHJnYikgKTsgfQoKCmNsYXNzICAgUUNv bG9yCnsKcHVibGljOgogICAgZW51bSBTcGVjIHsgUmdiLCBIc3YgfTsKCiAgICBRQ29sb3IoKTsK ICAgIFFDb2xvciggaW50IHIsIGludCBnLCBpbnQgYiApOwogICAgUUNvbG9yKCBpbnQgeCwgaW50 IHksIGludCB6LCBTcGVjICk7CiAgICBRQ29sb3IoIFFSZ2IgcmdiLCB1aW50IHBpeGVsPTB4ZmZm ZmZmZmYpOwogICAgUUNvbG9yKCBjb25zdCBRU3RyaW5nJiBuYW1lICk7CiAgICBRQ29sb3IoIGNv bnN0IGNoYXIgKm5hbWUgKTsKICAgIFFDb2xvciggY29uc3QgUUNvbG9yICYgKTsKICAgIFFDb2xv ciAmb3BlcmF0b3I9KCBjb25zdCBRQ29sb3IgJiApOwoKICAgIGJvb2wgICBpc1ZhbGlkKCkgY29u c3Q7CiAgICBib29sICAgaXNEaXJ0eSgpIGNvbnN0OwoKICAgIFFTdHJpbmcgbmFtZSgpIGNvbnN0 OwoKICAgIHZvaWQgICBzZXROYW1lZENvbG9yKCBjb25zdCBRU3RyaW5nJiBuYW1lICk7CgogICAg dm9pZCAgIHJnYiggaW50ICpyLCBpbnQgKmcsIGludCAqYiApIGNvbnN0OwogICAgUVJnYiAgIHJn YigpICAgIGNvbnN0OwogICAgdm9pZCAgIHNldFJnYiggaW50IHIsIGludCBnLCBpbnQgYiApOwog ICAgdm9pZCAgIHNldFJnYiggUVJnYiByZ2IgKTsKCiAgICBpbnQJICAgcmVkKCkgICAgY29uc3Q7 CiAgICBpbnQJICAgZ3JlZW4oKSAgY29uc3Q7CiAgICBpbnQJICAgYmx1ZSgpICAgY29uc3Q7Cgog ICAgdm9pZCAgIGhzdiggaW50ICpoLCBpbnQgKnMsIGludCAqdiApIGNvbnN0OwogICAgdm9pZCAg IGdldEhzdiggaW50ICZoLCBpbnQgJnMsIGludCAmdiApIGNvbnN0IHsgaHN2KCAmaCwgJnMsICZ2 ICk7IH0KICAgIHZvaWQgICBzZXRIc3YoIGludCBoLCBpbnQgcywgaW50IHYgKTsKCiAgICBRQ29s b3IgbGlnaHQoIGludCBmID0gMTUwICkgY29uc3Q7CiAgICBRQ29sb3IgZGFyayggaW50IGYgPSAy MDAgKQljb25zdDsKCiAgICBib29sICAgb3BlcmF0b3I9PSggY29uc3QgUUNvbG9yICZjICkgY29u c3Q7CiAgICBib29sICAgb3BlcmF0b3IhPSggY29uc3QgUUNvbG9yICZjICkgY29uc3Q7CgogICAg dWludCAgIGFsbG9jKCk7CiAgICB1aW50ICAgcGl4ZWwoKSAgY29uc3Q7CgogICAgc3RhdGljIGlu dCAgbWF4Q29sb3JzKCk7CiAgICBzdGF0aWMgaW50ICBudW1CaXRQbGFuZXMoKTsKCiAgICBzdGF0 aWMgaW50ICBlbnRlckFsbG9jQ29udGV4dCgpOwogICAgc3RhdGljIHZvaWQgbGVhdmVBbGxvY0Nv bnRleHQoKTsKICAgIHN0YXRpYyBpbnQgIGN1cnJlbnRBbGxvY0NvbnRleHQoKTsKICAgIHN0YXRp YyB2b2lkIGRlc3Ryb3lBbGxvY0NvbnRleHQoIGludCApOwoKCgoKCgoKCgogICAgc3RhdGljIHZv aWQgaW5pdGlhbGl6ZSgpOwogICAgc3RhdGljIHZvaWQgY2xlYW51cCgpOwoKICAgIGVudW0geyBE aXJ0ID0gMHg0NDQ5NTI1NCwgSW52YWxpZCA9IDB4NDkwMDAwMDAgfTsKCnByaXZhdGU6CiAgICB2 b2lkIHNldFN5c3RlbU5hbWVkQ29sb3IoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKTsKICAgIHZvaWQg c2V0UGl4ZWwoIHVpbnQgcGl4ZWwgKTsKICAgIHN0YXRpYyB2b2lkIGluaXRHbG9iYWxDb2xvcnMo KTsKICAgIHN0YXRpYyB1aW50IGFyZ2JUb1BpeDMyKFFSZ2IpOwogICAgc3RhdGljIFFDb2xvciog Z2xvYmFsQ29sb3JzKCk7CiAgICBzdGF0aWMgYm9vbCBjb2xvcl9pbml0OwogICAgc3RhdGljIGJv b2wgZ2xvYmFsc19pbml0OwoKCgogICAgc3RhdGljIGVudW0gQ29sb3JNb2RlbCB7IGQ4LCBkMzIg fSBjb2xvcm1vZGVsOwogICAgdW5pb24gewoJUVJnYiBhcmdiOwoJc3RydWN0IHsKCSAgICBRUmdi IGFyZ2I7CgkgICAgdWNoYXIgcGl4OwoJICAgIHVjaGFyIGludmFsaWQ7CgkgICAgdWNoYXIgZGly dHk7CgkgICAgdWNoYXIgZGlyZWN0OwoJfSBkODsKCXN0cnVjdCBEMzIgewoJICAgIFFSZ2IgYXJn YjsKCSAgICB1aW50IHBpeDsKCSAgICBib29sIGludmFsaWQoKSBjb25zdCB7IHJldHVybiBhcmdi ID09IFFDb2xvcjo6SW52YWxpZCAmJiBwaXggPT0gUUNvbG9yOjpEaXJ0OyB9CgkgICAgYm9vbCBw cm9iYWJseURpcnR5KCkgY29uc3QgeyByZXR1cm4gcGl4ID09IFFDb2xvcjo6RGlydDsgfQoJfSBk MzI7CiAgICB9IGQ7Cn07CgoKaW5saW5lIFFDb2xvcjo6UUNvbG9yKCkKeyBkLmQzMi5hcmdiID0g SW52YWxpZDsgZC5kMzIucGl4ID0gRGlydDsgfQoKaW5saW5lIFFDb2xvcjo6UUNvbG9yKCBpbnQg ciwgaW50IGcsIGludCBiICkKeyBzZXRSZ2IoIHIsIGcsIGIgKTsgfQoKaW5saW5lIFFSZ2IgUUNv bG9yOjpyZ2IoKSBjb25zdAp7IHJldHVybiBkLmFyZ2I7IH0KCmlubGluZSBpbnQgUUNvbG9yOjpy ZWQoKSBjb25zdAp7IHJldHVybiBxUmVkKGQuYXJnYik7IH0KCmlubGluZSBpbnQgUUNvbG9yOjpn cmVlbigpIGNvbnN0CnsgcmV0dXJuIHFHcmVlbihkLmFyZ2IpOyB9CgppbmxpbmUgaW50IFFDb2xv cjo6Ymx1ZSgpIGNvbnN0CnsgcmV0dXJuIHFCbHVlKGQuYXJnYik7IH0KCmlubGluZSBib29sIFFD b2xvcjo6aXNWYWxpZCgpIGNvbnN0CnsKICAgIGlmICggY29sb3Jtb2RlbCA9PSBkOCApCglyZXR1 cm4gIWQuZDguaW52YWxpZDsKICAgIGVsc2UKCXJldHVybiAhZC5kMzIuaW52YWxpZCgpOwp9Cgpp bmxpbmUgYm9vbCBRQ29sb3I6Om9wZXJhdG9yPT0oIGNvbnN0IFFDb2xvciAmYyApIGNvbnN0CnsK ICAgIHJldHVybiBkLmFyZ2IgPT0gYy5kLmFyZ2IgJiYgaXNWYWxpZCgpID09IGMuaXNWYWxpZCgp Owp9CgppbmxpbmUgYm9vbCBRQ29sb3I6Om9wZXJhdG9yIT0oIGNvbnN0IFFDb2xvciAmYyApIGNv bnN0CnsKICAgIHJldHVybiAhb3BlcmF0b3I9PShjKTsKfQoKCiAKCgoKCiAgUURhdGFTdHJlYW0g Jm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFDb2xvciAmICk7CiAgUURhdGFTdHJl YW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFDb2xvciAmICk7CgoKCiMgNCAiZWxlbWVu dC5oIiAyCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F2YWx1ZXZlY3Rvci5oIiAxCiAK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQv aW5jbHVkZS9xdGwuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXRleHRzdHJlYW0uaCIgMQogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVk ZS9xaW9kZXZpY2UuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCgoKCiAKCgoKCgoKCgoKIAoKCgoKCiAKCgoKCgoKCgoK CgoKY2xhc3MgICBRSU9EZXZpY2UJCQkgCnsKcHVibGljOgoKCgogICAgdHlwZWRlZiBRX1VMT05H IE9mZnNldDsKCgogICAgUUlPRGV2aWNlKCk7CiAgICB2aXJ0dWFsIH5RSU9EZXZpY2UoKTsKCiAg ICBpbnQJCSBmbGFncygpICBjb25zdCB7IHJldHVybiBpb01vZGU7IH0KICAgIGludAkJIG1vZGUo KQkgIGNvbnN0IHsgcmV0dXJuIGlvTW9kZSAmIDB4MDBmZiA7IH0KICAgIGludAkJIHN0YXRlKCkg IGNvbnN0IHsgcmV0dXJuIGlvTW9kZSAmIDB4ZjAwMCA7IH0KCiAgICBib29sCSBpc0RpcmVjdEFj Y2VzcygpICAgICBjb25zdCB7IHJldHVybiAoKGlvTW9kZSAmIDB4MDEwMCApICAgICA9PSAweDAx MDAgKTsgfQogICAgYm9vbAkgaXNTZXF1ZW50aWFsQWNjZXNzKCkgY29uc3QgeyByZXR1cm4gKChp b01vZGUgJiAweDAyMDAgKSA9PSAweDAyMDAgKTsgfQogICAgYm9vbAkgaXNDb21iaW5lZEFjY2Vz cygpICAgY29uc3QgeyByZXR1cm4gKChpb01vZGUgJiAweDAzMDAgKSAgID09IDB4MDMwMCApOyB9 CiAgICBib29sCSBpc0J1ZmZlcmVkKCkJICAgICAgY29uc3QgeyByZXR1cm4gKChpb01vZGUgJiAw eDAwNDAgKSAgICAgICAgIT0gMHgwMDQwICk7IH0KICAgIGJvb2wJIGlzUmF3KCkJICAgICAgY29u c3QgeyByZXR1cm4gKChpb01vZGUgJiAweDAwNDAgKSAgICAgICAgPT0gMHgwMDQwICk7IH0KICAg IGJvb2wJIGlzU3luY2hyb25vdXMoKSAgICAgIGNvbnN0IHsgcmV0dXJuICgoaW9Nb2RlICYgMHgw MDgwICkgICAgICAhPSAweDAwODAgKTsgfQogICAgYm9vbAkgaXNBc3luY2hyb25vdXMoKSAgICAg Y29uc3QgeyByZXR1cm4gKChpb01vZGUgJiAweDAwODAgKSAgICAgID09IDB4MDA4MCApOyB9CiAg ICBib29sCSBpc1RyYW5zbGF0ZWQoKQkgICAgICBjb25zdCB7IHJldHVybiAoKGlvTW9kZSAmIDB4 MDAxMCApICA9PSAweDAwMTAgKTsgfQogICAgYm9vbAkgaXNSZWFkYWJsZSgpCSAgICAgIGNvbnN0 IHsgcmV0dXJuICgoaW9Nb2RlICYgMHgwMDAxICkgICA9PSAweDAwMDEgKTsgfQogICAgYm9vbAkg aXNXcml0YWJsZSgpCSAgICAgIGNvbnN0IHsgcmV0dXJuICgoaW9Nb2RlICYgMHgwMDAyICkgID09 IDB4MDAwMiApOyB9CiAgICBib29sCSBpc1JlYWRXcml0ZSgpCSAgICAgIGNvbnN0IHsgcmV0dXJu ICgoaW9Nb2RlICYgMHgwMDAzICkgID09IDB4MDAwMyApOyB9CiAgICBib29sCSBpc0luYWN0aXZl KCkJICAgICAgY29uc3QgeyByZXR1cm4gc3RhdGUoKSA9PSAwOyB9CiAgICBib29sCSBpc09wZW4o KQkgICAgICBjb25zdCB7IHJldHVybiBzdGF0ZSgpID09IDB4MTAwMCA7IH0KCiAgICBpbnQJCSBz dGF0dXMoKSBjb25zdCB7IHJldHVybiBpb1N0OyB9CiAgICB2b2lkCSByZXNldFN0YXR1cygpCXsg aW9TdCA9IDAgOyB9CgogICAgdmlydHVhbCBib29sIG9wZW4oIGludCBtb2RlICkgPSAwOwogICAg dmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOwogICAgdmlydHVhbCB2b2lkIGZsdXNoKCkgPSAwOwoK ICAgIHZpcnR1YWwgT2Zmc2V0IHNpemUoKSAgY29uc3QgPSAwOwogICAgdmlydHVhbCBPZmZzZXQg YXQoKSAgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgYXQoIE9mZnNldCApOwogICAgdmlydHVhbCBi b29sIGF0RW5kKCkgIGNvbnN0OwogICAgYm9vbAkgcmVzZXQoKSB7IHJldHVybiBhdCgwKTsgfQoK ICAgIHZpcnR1YWwgUV9MT05HIHJlYWRCbG9jayggY2hhciAqZGF0YSwgUV9VTE9ORyBtYXhsZW4g KSA9IDA7CiAgICB2aXJ0dWFsIFFfTE9ORyB3cml0ZUJsb2NrKCBjb25zdCBjaGFyICpkYXRhLCBR X1VMT05HIGxlbiApID0gMDsKICAgIHZpcnR1YWwgUV9MT05HIHJlYWRMaW5lKCBjaGFyICpkYXRh LCBRX1VMT05HIG1heGxlbiApOwogICAgUV9MT05HIHdyaXRlQmxvY2soIGNvbnN0IFFCeXRlQXJy YXkmIGRhdGEgKTsKICAgIHZpcnR1YWwgUUJ5dGVBcnJheSByZWFkQWxsKCk7CgogICAgdmlydHVh bCBpbnQJIGdldGNoKCkgPSAwOwogICAgdmlydHVhbCBpbnQJIHB1dGNoKCBpbnQgKSA9IDA7CiAg ICB2aXJ0dWFsIGludAkgdW5nZXRjaCggaW50ICkgPSAwOwoKcHJvdGVjdGVkOgogICAgdm9pZAkg c2V0RmxhZ3MoIGludCBmICkgeyBpb01vZGUgPSBmOyB9CiAgICB2b2lkCSBzZXRUeXBlKCBpbnQg KTsKICAgIHZvaWQJIHNldE1vZGUoIGludCApOwogICAgdm9pZAkgc2V0U3RhdGUoIGludCApOwog ICAgdm9pZAkgc2V0U3RhdHVzKCBpbnQgKTsKICAgIE9mZnNldAkgaW9JbmRleDsKCnByaXZhdGU6 CiAgICBpbnQJCSBpb01vZGU7CiAgICBpbnQJCSBpb1N0OwoKcHJpdmF0ZToJIAoKICAgIFFJT0Rl dmljZSggY29uc3QgUUlPRGV2aWNlICYgKTsKICAgIFFJT0RldmljZSAmb3BlcmF0b3I9KCBjb25z dCBRSU9EZXZpY2UgJiApOwoKfTsKCgoKIyA0MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F0ZXh0 c3RyZWFtLmgiIDIKCgojIDEgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAxIDMKIAoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKCgoKCgoKZXh0ZXJuICJDIiB7IAoKCgojIDEgIi91c3IvbGliL2djYy1saWIv aTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAK CgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1 ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAK CgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCiAKCiMgMTMxICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgogCgoKIyAx ODggIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9z dGRkZWYuaCIgMwoKCgoKCiAKCgoKCiAKCiMgMjcxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgojIDI4MyAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK IAoKIAoKIyAzMTcgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMv aW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDMzICIvdXNy L2luY2x1ZGUvc3RkaW8uaCIgMiAzCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkYXJnLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK CnR5cGVkZWYgdm9pZCAqX19nbnVjX3ZhX2xpc3Q7CgoKCiAKCiMgMTIyICIvdXNyL2xpYi9nY2Mt bGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkYXJnLmgiIDMKCgoKCgoK CgoKCgoKCgoKCgoKCgojIDIwOSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy9pbmNsdWRlL3N0ZGFyZy5oIiAzCgoKCgojIDM4ICIvdXNyL2luY2x1ZGUvc3RkaW8u aCIgMiAzCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAxIDMKIAoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK CiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51 eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2Mt bGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgog CgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUu My9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIyAyODMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5k cmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNy L2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgi IDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAyOSAiL3Vzci9pbmNsdWRlL2JpdHMvdHlw ZXMuaCIgMiAzCgoKIAp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191X2NoYXI7CnR5cGVkZWYgdW5z aWduZWQgc2hvcnQgX191X3Nob3J0Owp0eXBlZGVmIHVuc2lnbmVkIGludCBfX3VfaW50Owp0eXBl ZGVmIHVuc2lnbmVkIGxvbmcgX191X2xvbmc7CgpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWdu ZWQgbG9uZyBsb25nIGludCBfX3VfcXVhZF90OwpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBs b25nIGludCBfX3F1YWRfdDsKIyA0OCAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMwoKdHlw ZWRlZiBzaWduZWQgY2hhciBfX2ludDhfdDsKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdWludDhf dDsKdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IF9faW50MTZfdDsKdHlwZWRlZiB1bnNpZ25lZCBz aG9ydCBpbnQgX191aW50MTZfdDsKdHlwZWRlZiBzaWduZWQgaW50IF9faW50MzJfdDsKdHlwZWRl ZiB1bnNpZ25lZCBpbnQgX191aW50MzJfdDsKCl9fZXh0ZW5zaW9uX18gdHlwZWRlZiBzaWduZWQg bG9uZyBsb25nIGludCBfX2ludDY0X3Q7Cl9fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBs b25nIGxvbmcgaW50IF9fdWludDY0X3Q7Cgp0eXBlZGVmIF9fcXVhZF90ICpfX3FhZGRyX3Q7Cgp0 eXBlZGVmIF9fdV9xdWFkX3QgX19kZXZfdDsJCSAKdHlwZWRlZiBfX3VfaW50IF9fdWlkX3Q7CQkg CnR5cGVkZWYgX191X2ludCBfX2dpZF90OwkJIAp0eXBlZGVmIF9fdV9sb25nIF9faW5vX3Q7CQkg CnR5cGVkZWYgX191X2ludCBfX21vZGVfdDsJCSAKdHlwZWRlZiBfX3VfaW50IF9fbmxpbmtfdDsg CQkgCnR5cGVkZWYgbG9uZyBpbnQgX19vZmZfdDsJCSAKdHlwZWRlZiBfX3F1YWRfdCBfX2xvZmZf dDsJCSAKdHlwZWRlZiBpbnQgX19waWRfdDsJCQkgCnR5cGVkZWYgaW50IF9fc3NpemVfdDsJCQkg CnR5cGVkZWYgbG9uZyBpbnQgX19ybGltX3Q7CQkgCnR5cGVkZWYgX19xdWFkX3QgX19ybGltNjRf dDsJCSAKdHlwZWRlZiBfX3VfaW50IF9faWRfdDsJCQkgCgp0eXBlZGVmIHN0cnVjdAogIHsKICAg IGludCBfX3ZhbFsyXTsKICB9IF9fZnNpZF90OwkJCQkgCgogCnR5cGVkZWYgaW50IF9fZGFkZHJf dDsJCQkgCnR5cGVkZWYgY2hhciAqX19jYWRkcl90Owp0eXBlZGVmIGxvbmcgaW50IF9fdGltZV90 Owp0eXBlZGVmIGxvbmcgaW50IF9fc3dibGtfdDsJCSAKDAp0eXBlZGVmIGxvbmcgaW50IF9fY2xv Y2tfdDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX2ZkX21hc2s7CgogCgoKIAoKCgoK IAp0eXBlZGVmIHN0cnVjdAogIHsKICAgICAKCgoKCgogICAgX19mZF9tYXNrIF9fZmRzX2JpdHNb MTAyNCAgLyAoOCAqIHNpemVvZiAoX19mZF9tYXNrKSkgXTsKCgogIH0gX19mZF9zZXQ7CgoKdHlw ZWRlZiBpbnQgX19rZXlfdDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX19pcGNfcGlk X3Q7CgoKIAoKIAp0eXBlZGVmIGxvbmcgaW50IF9fYmxrY250X3Q7CnR5cGVkZWYgX19xdWFkX3Qg X19ibGtjbnQ2NF90OwoKIAp0eXBlZGVmIF9fdV9sb25nIF9fZnNibGtjbnRfdDsKdHlwZWRlZiBf X3VfcXVhZF90IF9fZnNibGtjbnQ2NF90OwoKIAp0eXBlZGVmIF9fdV9sb25nIF9fZnNmaWxjbnRf dDsKdHlwZWRlZiBfX3VfcXVhZF90IF9fZnNmaWxjbnQ2NF90OwoKIAp0eXBlZGVmIF9fdV9sb25n IF9faW5vNjRfdDsKCiAKdHlwZWRlZiBfX2xvZmZfdCBfX29mZjY0X3Q7CgogCnR5cGVkZWYgbG9u ZyBpbnQgX190X3NjYWxhcl90Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IF9fdF91c2NhbGFy X3Q7CgogCnR5cGVkZWYgaW50IF9faW50cHRyX3Q7CgoKIAoKCgoKCiMgNDAgIi91c3IvaW5jbHVk ZS9zdGRpby5oIiAyIDMKCgoKCgoKCiAKdHlwZWRlZiBzdHJ1Y3QgX0lPX0ZJTEUgRklMRTsKCgoK CgoKCgojIDEgIi91c3IvaW5jbHVkZS9saWJpby5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvX0dfY29uZmlnLmgiIDEgMwogCgoKCgoKIAoKCgoK CgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVk ZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAKCgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgogCgoK IyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCiAKCiMg MTMxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUv c3RkZGVmLmgiIDMKCgogCgogCgoKIyAxODggIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFr ZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCiAKCgoKCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgdW5zaWduZWQgaW50ICB3aW50X3Q7CgoKCgogCgogCgoj IDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMTQgIi91c3IvaW5jbHVk ZS9fR19jb25maWcuaCIgMiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgaW50IF9HX2lu dDE2X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX0hJX18pKSk7CnR5cGVkZWYgaW50IF9H X2ludDMyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7CnR5cGVkZWYgdW5z aWduZWQgaW50IF9HX3VpbnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19ISV9fKSkp Owp0eXBlZGVmIHVuc2lnbmVkIGludCBfR191aW50MzJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2Rl X18gKF9fU0lfXykpKTsKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKIAoKCgoKCgoKCgoK CgoKCiMgMzAgIi91c3IvaW5jbHVkZS9saWJpby5oIiAyIDMKCgoKCgoKCgoKCgoKCgoKCiAKCiMg MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0 ZGFyZy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKIAoKIyAxMjIgIi91c3IvbGliL2djYy1s aWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIgMwoKCgoKCgoK CgoKCgoKCgoKCgoKCiMgMjA5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgv Mi45NS4zL2luY2x1ZGUvc3RkYXJnLmgiIDMKCgoKCiMgNDggIi91c3IvaW5jbHVkZS9saWJpby5o IiAyIDMKCgoKCgoKCiMgNjcgIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKIAoKCgoKCgoKCgoK CgoKCgoKCiMgOTggIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKCgoKCgoKCgoKIAoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgpzdHJ1Y3QgX0lPX2p1bXBfdDsg IHN0cnVjdCBfSU9fRklMRTsKCiAKCgoKCgoKCnR5cGVkZWYgdm9pZCBfSU9fbG9ja190OwoKCgog CgpzdHJ1Y3QgX0lPX21hcmtlciB7CiAgc3RydWN0IF9JT19tYXJrZXIgKl9uZXh0OwogIHN0cnVj dCBfSU9fRklMRSAqX3NidWY7CiAgIAoKICAgCiAgaW50IF9wb3M7CiMgMTg2ICIvdXNyL2luY2x1 ZGUvbGliaW8uaCIgMwoKfTsKCnN0cnVjdCBfSU9fRklMRSB7CiAgaW50IF9mbGFnczsJCSAKCgog ICAKICAgCiAgY2hhciogX0lPX3JlYWRfcHRyOwkgCiAgY2hhciogX0lPX3JlYWRfZW5kOwkgCiAg Y2hhciogX0lPX3JlYWRfYmFzZTsJIAogIGNoYXIqIF9JT193cml0ZV9iYXNlOwkgCiAgY2hhciog X0lPX3dyaXRlX3B0cjsJIAogIGNoYXIqIF9JT193cml0ZV9lbmQ7CSAKICBjaGFyKiBfSU9fYnVm X2Jhc2U7CSAKICBjaGFyKiBfSU9fYnVmX2VuZDsJIAogICAKICBjaGFyICpfSU9fc2F2ZV9iYXNl OyAgCiAgY2hhciAqX0lPX2JhY2t1cF9iYXNlOyAgIAogIGNoYXIgKl9JT19zYXZlX2VuZDsgIAoK ICBzdHJ1Y3QgX0lPX21hcmtlciAqX21hcmtlcnM7CgogIHN0cnVjdCBfSU9fRklMRSAqX2NoYWlu OwoKICBpbnQgX2ZpbGVubzsKICBpbnQgX2Jsa3NpemU7CiAgX19vZmZfdCAgIF9vbGRfb2Zmc2V0 OyAgCgoKICAgCiAgdW5zaWduZWQgc2hvcnQgX2N1cl9jb2x1bW47CiAgc2lnbmVkIGNoYXIgX3Z0 YWJsZV9vZmZzZXQ7CiAgY2hhciBfc2hvcnRidWZbMV07CgogICAKCiAgX0lPX2xvY2tfdCAqX2xv Y2s7CgoKCgoKCgoKICBfX29mZjY0X3QgICBfb2Zmc2V0OwogICAKICBpbnQgX3VudXNlZDJbMTZd OwoKfTsKCgoKCgpzdHJ1Y3QgX0lPX0ZJTEVfcGx1czsKZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9w bHVzIF9JT18yXzFfc3RkaW5fOwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9z dGRvdXRfOwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRlcnJfOwoKCgoK CgoKCgoKCiAKCiAKCnR5cGVkZWYgX19zc2l6ZV90IF9faW9fcmVhZF9mbiAgKHZvaWQgKiAgX19j b29raWUsIGNoYXIgKl9fYnVmLAoJCQkJICAgICAgIHNpemVfdCBfX25ieXRlcykgIDsKCiAKCgoK Cgp0eXBlZGVmIF9fc3NpemVfdCBfX2lvX3dyaXRlX2ZuICAodm9pZCAqICBfX2Nvb2tpZSwgX19j b25zdCBjaGFyICpfX2J1ZiwKCQkJCSAgICAgIHNpemVfdCBfX24pICA7CgogCgoKCgoKdHlwZWRl ZiBpbnQgX19pb19zZWVrX2ZuICAodm9pZCAqICBfX2Nvb2tpZSwgX19vZmZfdCAgIF9fcG9zLCBp bnQgX193KSAgOwoKIAp0eXBlZGVmIGludCBfX2lvX2Nsb3NlX2ZuICAodm9pZCAqICBfX2Nvb2tp ZSkgIDsKCgojIDMxMSAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMKCgoKCmV4dGVybiAiQyIgewoK CmV4dGVybiBpbnQgX191bmRlcmZsb3cgIChfSU9fRklMRSAqKSAgdGhyb3cgKCkgIDsKZXh0ZXJu IGludCBfX3VmbG93ICAoX0lPX0ZJTEUgKikgIHRocm93ICgpICA7CmV4dGVybiBpbnQgX19vdmVy ZmxvdyAgKF9JT19GSUxFICosIGludCkgIHRocm93ICgpICA7CgoKCgoKCgoKCgoKCgoKCgpleHRl cm4gaW50IF9JT19nZXRjICAoX0lPX0ZJTEUgKl9fZnApICB0aHJvdyAoKSAgOwpleHRlcm4gaW50 IF9JT19wdXRjICAoaW50IF9fYywgX0lPX0ZJTEUgKl9fZnApICB0aHJvdyAoKSAgOwpleHRlcm4g aW50IF9JT19mZW9mICAoX0lPX0ZJTEUgKl9fZnApICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IF9J T19mZXJyb3IgIChfSU9fRklMRSAqX19mcCkgIHRocm93ICgpICA7CgpleHRlcm4gaW50IF9JT19w ZWVrY19sb2NrZWQgIChfSU9fRklMRSAqX19mcCkgIHRocm93ICgpICA7CgogCgoKCmV4dGVybiB2 b2lkIF9JT19mbG9ja2ZpbGUgIChfSU9fRklMRSAqKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIHZvaWQg X0lPX2Z1bmxvY2tmaWxlICAoX0lPX0ZJTEUgKikgIHRocm93ICgpICA7CmV4dGVybiBpbnQgX0lP X2Z0cnlsb2NrZmlsZSAgKF9JT19GSUxFICopICB0aHJvdyAoKSAgOwoKCgoKCgoKCgoKCgpleHRl cm4gaW50IF9JT192ZnNjYW5mICAoX0lPX0ZJTEUgKiBfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICog X19yZXN0cmljdCwKCQkJICAgICBfX2dudWNfdmFfbGlzdCAsIGludCAqX19yZXN0cmljdCkgIHRo cm93ICgpICA7CmV4dGVybiBpbnQgX0lPX3ZmcHJpbnRmICAoX0lPX0ZJTEUgKl9fcmVzdHJpY3Qs IGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QsCgkJCSAgICAgIF9fZ251Y192YV9saXN0ICkgIHRocm93 ICgpICA7CmV4dGVybiBfX3NzaXplX3QgICBfSU9fcGFkbiAgKF9JT19GSUxFICosIGludCwgX19z c2l6ZV90ICApICB0aHJvdyAoKSAgOwpleHRlcm4gc2l6ZV90ICAgX0lPX3NnZXRuICAoX0lPX0ZJ TEUgKiwgdm9pZCAqLCBzaXplX3QgICkgIHRocm93ICgpICA7CgpleHRlcm4gX19vZmY2NF90ICAg X0lPX3NlZWtvZmYgIChfSU9fRklMRSAqLCBfX29mZjY0X3QgICwgaW50LCBpbnQpICB0aHJvdyAo KSAgOwpleHRlcm4gX19vZmY2NF90ICAgX0lPX3NlZWtwb3MgIChfSU9fRklMRSAqLCBfX29mZjY0 X3QgICwgaW50KSAgdGhyb3cgKCkgIDsKCmV4dGVybiB2b2lkIF9JT19mcmVlX2JhY2t1cF9hcmVh ICAoX0lPX0ZJTEUgKikgIHRocm93ICgpICA7CgoKfQoKCgojIDU3ICIvdXNyL2luY2x1ZGUvc3Rk aW8uaCIgMiAzCgoKIAoKdHlwZWRlZiBfX29mZl90ICBmcG9zX3Q7CgoKCgoKCgogCgoKCgoKIAoK CgoKCiAKCgoKCgoKIAoKCgoKCgoKIAoKCgoKIAoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2Jp dHMvc3RkaW9fbGltLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CiMgMTEwICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMiAzCgoKCiAKZXh0ZXJuIEZJTEUgKnN0ZGlu OwkJIApleHRlcm4gRklMRSAqc3Rkb3V0OwkJIApleHRlcm4gRklMRSAqc3RkZXJyOwkJIAogCgoK CgoKIApleHRlcm4gaW50IHJlbW92ZSAgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSkgIHRocm93 ICgpICA7CiAKZXh0ZXJuIGludCByZW5hbWUgIChfX2NvbnN0IGNoYXIgKl9fb2xkLCBfX2NvbnN0 IGNoYXIgKl9fbmV3KSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4gRklMRSAqdG1wZmlsZSAgKHZv aWQpICB0aHJvdyAoKSAgOwoKCgoKCgoKCgoKIApleHRlcm4gY2hhciAqdG1wbmFtICAoY2hhciAq X19zKSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4gY2hhciAqdG1wbmFtX3IgIChjaGFyICpfX3Mp ICB0aHJvdyAoKSAgOwoKCgoKIAoKCgoKCgpleHRlcm4gY2hhciAqdGVtcG5hbSAgKF9fY29uc3Qg Y2hhciAqX19kaXIsIF9fY29uc3QgY2hhciAqX19wZngpICB0aHJvdyAoKSAgOwoKCgogCmV4dGVy biBpbnQgZmNsb3NlICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwogCmV4dGVybiBpbnQg ZmZsdXNoICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIGludCBmZmx1 c2hfdW5sb2NrZWQgIChGSUxFICpfX3N0cmVhbSkgIHRocm93ICgpICA7CgoKCgoKCgoKCiAKZXh0 ZXJuIEZJTEUgKmZvcGVuICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCgkJ CSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcykgIHRocm93ICgpICA7CiAKZXh0ZXJu IEZJTEUgKmZyZW9wZW4gIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKCQkJ ICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMsCgkJCSAgIEZJTEUgKl9fcmVzdHJp Y3QgX19zdHJlYW0pICB0aHJvdyAoKSAgOwojIDIwMSAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMK CgoKCgoKCgoKCiAKZXh0ZXJuIEZJTEUgKmZkb3BlbiAgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIg Kl9fbW9kZXMpICB0aHJvdyAoKSAgOwoKCiMgMjI3ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoK CgogCgpleHRlcm4gdm9pZCBzZXRidWYgIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBjaGFy ICpfX3Jlc3RyaWN0IF9fYnVmKSAgdGhyb3cgKCkgIDsKIAoKCmV4dGVybiBpbnQgc2V0dmJ1ZiAg KEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCgkJCSBp bnQgX19tb2Rlcywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgoKIAoKZXh0ZXJuIHZvaWQgc2V0 YnVmZmVyICAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgY2hhciAqX19yZXN0cmljdCBfX2J1 ZiwKCQkJICAgIHNpemVfdCBfX3NpemUpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gdm9pZCBzZXRs aW5lYnVmICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCgogCmV4dGVybiBpbnQgZnBy aW50ZiAgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCgkJCSBfX2NvbnN0IGNoYXIgKl9fcmVz dHJpY3QgX19mb3JtYXQsIC4uLikgIHRocm93ICgpICA7CiAKZXh0ZXJuIGludCBwcmludGYgIChf X2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgIHRocm93ICgpICA7CiAKZXh0 ZXJuIGludCBzcHJpbnRmICAoY2hhciAqX19yZXN0cmljdCBfX3MsCgkJCSBfX2NvbnN0IGNoYXIg Kl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgdmZw cmludGYgIChGSUxFICpfX3Jlc3RyaWN0IF9fcywKCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJp Y3QgX19mb3JtYXQsCgkJCSAgX19nbnVjX3ZhX2xpc3QgIF9fYXJnKSAgdGhyb3cgKCkgIDsKIApl eHRlcm4gaW50IHZwcmludGYgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCgkJ CSBfX2dudWNfdmFfbGlzdCAgX19hcmcpICB0aHJvdyAoKSAgOwogCmV4dGVybiBpbnQgdnNwcmlu dGYgIChjaGFyICpfX3Jlc3RyaWN0IF9fcywKCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3Qg X19mb3JtYXQsCgkJCSAgX19nbnVjX3ZhX2xpc3QgIF9fYXJnKSAgdGhyb3cgKCkgIDsKCgogCmV4 dGVybiBpbnQgc25wcmludGYgIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVu LAoJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSAgdGhyb3cgKCkg IAogICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOwoK ZXh0ZXJuIGludCBfX3ZzbnByaW50ZiAgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19t YXhsZW4sCgkJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAoJCQkgICAg IF9fZ251Y192YV9saXN0ICBfX2FyZykgIHRocm93ICgpICAKICAgICBfX2F0dHJpYnV0ZV9fICgo X19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKTsKZXh0ZXJuIGludCB2c25wcmludGYgIChj aGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVuLAoJCQkgICBfX2NvbnN0IGNoYXIg Kl9fcmVzdHJpY3QgX19mb3JtYXQsCgkJCSAgIF9fZ251Y192YV9saXN0ICBfX2FyZykgIHRocm93 ICgpICAKICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkp KTsKCgojIDMwNiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKIApleHRlcm4gaW50IGZzY2Fu ZiAgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCgkJCV9fY29uc3QgY2hhciAqX19yZXN0cmlj dCBfX2Zvcm1hdCwgLi4uKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gaW50IHNjYW5mICAoX19jb25z dCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pICB0aHJvdyAoKSAgOwogCmV4dGVybiBp bnQgc3NjYW5mICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKCQkJX19jb25zdCBjaGFy ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pICB0aHJvdyAoKSAgOwoKIyAzMzQgIi91c3IvaW5j bHVkZS9zdGRpby5oIiAzCgoKCiAKZXh0ZXJuIGludCBmZ2V0YyAgKEZJTEUgKl9fc3RyZWFtKSAg dGhyb3cgKCkgIDsKZXh0ZXJuIGludCBnZXRjICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAg OwoKIApleHRlcm4gaW50IGdldGNoYXIgICh2b2lkKSAgdGhyb3cgKCkgIDsKCiAKCgoKCiAKZXh0 ZXJuIGludCBnZXRjX3VubG9ja2VkICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwpleHRl cm4gaW50IGdldGNoYXJfdW5sb2NrZWQgICh2b2lkKSAgdGhyb3cgKCkgIDsKCgoKIApleHRlcm4g aW50IGZnZXRjX3VubG9ja2VkICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCgogCmV4 dGVybiBpbnQgZnB1dGMgIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgIHRocm93ICgpICA7CmV4 dGVybiBpbnQgcHV0YyAgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKCiAK ZXh0ZXJuIGludCBwdXRjaGFyICAoaW50IF9fYykgIHRocm93ICgpICA7CgogCgoKCgogCmV4dGVy biBpbnQgZnB1dGNfdW5sb2NrZWQgIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgIHRocm93ICgp ICA7CgoKCiAKZXh0ZXJuIGludCBwdXRjX3VubG9ja2VkICAoaW50IF9fYywgRklMRSAqX19zdHJl YW0pICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHB1dGNoYXJfdW5sb2NrZWQgIChpbnQgX19jKSAg dGhyb3cgKCkgIDsKCgoKCiAKZXh0ZXJuIGludCBnZXR3ICAoRklMRSAqX19zdHJlYW0pICB0aHJv dyAoKSAgOwoKIApleHRlcm4gaW50IHB1dHcgIChpbnQgX193LCBGSUxFICpfX3N0cmVhbSkgIHRo cm93ICgpICA7CgoKCiAKZXh0ZXJuIGNoYXIgKmZnZXRzICAoY2hhciAqX19yZXN0cmljdCBfX3Ms IGludCBfX24sCgkJCSBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKCgoK CgoKCiAKCmV4dGVybiBjaGFyICpnZXRzICAoY2hhciAqX19zKSAgdGhyb3cgKCkgIDsKCgojIDQy NCAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKIApleHRlcm4gaW50IGZwdXRzICAoX19jb25z dCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKCQkgICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVh bSkgIHRocm93ICgpICA7CgoKCgoKCgogCmV4dGVybiBpbnQgcHV0cyAgKF9fY29uc3QgY2hhciAq X19zKSAgdGhyb3cgKCkgIDsKCgogCmV4dGVybiBpbnQgdW5nZXRjICAoaW50IF9fYywgRklMRSAq X19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIHNpemVfdCBmcmVhZCAgKHZvaWQgKl9f cmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCgkJCSAgc2l6ZV90IF9fbiwgRklMRSAqX19y ZXN0cmljdCBfX3N0cmVhbSkgIHRocm93ICgpICA7CiAKZXh0ZXJuIHNpemVfdCBmd3JpdGUgIChf X2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCgkJCSAgIHNpemVf dCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zKSAgdGhyb3cgKCkgIDsKCgogCmV4dGVybiBzaXpl X3QgZnJlYWRfdW5sb2NrZWQgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXpl LAoJCQkJICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgIHRocm93ICgp ICA7CmV4dGVybiBzaXplX3QgZndyaXRlX3VubG9ja2VkICAoX19jb25zdCB2b2lkICpfX3Jlc3Ry aWN0IF9fcHRyLAoJCQkJICAgIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCgkJCQkgICAgRklM RSAqX19yZXN0cmljdCBfX3N0cmVhbSkgIHRocm93ICgpICA7CgoKCiAKZXh0ZXJuIGludCBmc2Vl ayAgKEZJTEUgKl9fc3RyZWFtLCBsb25nIGludCBfX29mZiwgaW50IF9fd2hlbmNlKSAgdGhyb3cg KCkgIDsKIApleHRlcm4gbG9uZyBpbnQgZnRlbGwgIChGSUxFICpfX3N0cmVhbSkgIHRocm93ICgp ICA7CiAKZXh0ZXJuIHZvaWQgcmV3aW5kICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoK IAoKCgoKIAoKCnR5cGVkZWYgX19vZmZfdCBvZmZfdDsKCgoKCgoKCgoKCgoKCgoKCgoKCgogCmV4 dGVybiBpbnQgZmdldHBvcyAgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCgkJCSBmcG9zX3Qg Kl9fcmVzdHJpY3QgX19wb3MpICB0aHJvdyAoKSAgOwogCmV4dGVybiBpbnQgZnNldHBvcyAgKEZJ TEUgKl9fc3RyZWFtLCBfX2NvbnN0IGZwb3NfdCAqX19wb3MpICB0aHJvdyAoKSAgOwojIDUyMyAi L3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgojIDUzMyAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMK CgogCmV4dGVybiB2b2lkIGNsZWFyZXJyICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwog CmV4dGVybiBpbnQgZmVvZiAgKEZJTEUgKl9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKIApleHRlcm4g aW50IGZlcnJvciAgKEZJTEUgKl9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKCgogCmV4dGVybiB2b2lk IGNsZWFyZXJyX3VubG9ja2VkICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwpleHRlcm4g aW50IGZlb2ZfdW5sb2NrZWQgIChGSUxFICpfX3N0cmVhbSkgIHRocm93ICgpICA7CmV4dGVybiBp bnQgZmVycm9yX3VubG9ja2VkICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCgogCmV4 dGVybiB2b2lkIHBlcnJvciAgKF9fY29uc3QgY2hhciAqX19zKSAgdGhyb3cgKCkgIDsKCiAKCgpl eHRlcm4gaW50IHN5c19uZXJyOwpleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IHN5c19lcnJs aXN0W107CgoKCgoKCgoKIApleHRlcm4gaW50IGZpbGVubyAgKEZJTEUgKl9fc3RyZWFtKSAgdGhy b3cgKCkgIDsKCgoKIApleHRlcm4gaW50IGZpbGVub191bmxvY2tlZCAgKEZJTEUgKl9fc3RyZWFt KSAgdGhyb3cgKCkgIDsKCgoKCgogCmV4dGVybiBGSUxFICpwb3BlbiAgKF9fY29uc3QgY2hhciAq X19jb21tYW5kLCBfX2NvbnN0IGNoYXIgKl9fbW9kZXMpICB0aHJvdyAoKSAgOwoKIApleHRlcm4g aW50IHBjbG9zZSAgKEZJTEUgKl9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKCgoKCiAKZXh0ZXJuIGNo YXIgKmN0ZXJtaWQgIChjaGFyICpfX3MpICB0aHJvdyAoKSAgOwoKCgoKCgoKCgojIDYwNyAiL3Vz ci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKCiAKCiAKZXh0ZXJuIHZvaWQgZmxvY2tmaWxlICAoRklM RSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKIAoKZXh0ZXJuIGludCBmdHJ5bG9ja2ZpbGUgIChG SUxFICpfX3N0cmVhbSkgIHRocm93ICgpICA7CgogCmV4dGVybiB2b2lkIGZ1bmxvY2tmaWxlICAo RklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCgoKCgoKCgoKIAoKCiMgMSAiL3Vzci9pbmNs dWRlL2JpdHMvc3RkaW8uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCmlu bGluZSAgaW50CnZwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX19nbnVj X3ZhX2xpc3QgIF9fYXJnKSB0aHJvdyAoKSAKewogIHJldHVybiB2ZnByaW50ZiAoc3Rkb3V0ICwg X19mbXQsIF9fYXJnKTsKfQoKIAppbmxpbmUgIGludApnZXRjaGFyICh2b2lkKSB0aHJvdyAoKSAK ewogIHJldHVybiBfSU9fZ2V0YyAoc3RkaW4gKTsKfQoKCgogCmlubGluZSAgaW50CmdldGNfdW5s b2NrZWQgKEZJTEUgKl9fZnApIHRocm93ICgpIAp7CiAgcmV0dXJuICgoIF9fZnAgKS0+X0lPX3Jl YWRfcHRyID49ICggX19mcCApLT5fSU9fcmVhZF9lbmQgPyBfX3VmbG93ICggX19mcCApIDogKih1 bnNpZ25lZCBjaGFyICopICggX19mcCApLT5fSU9fcmVhZF9wdHIrKykgOwp9CgogCmlubGluZSAg aW50CmdldGNoYXJfdW5sb2NrZWQgKHZvaWQpIHRocm93ICgpIAp7CiAgcmV0dXJuICgoIHN0ZGlu ICApLT5fSU9fcmVhZF9wdHIgPj0gKCBzdGRpbiAgKS0+X0lPX3JlYWRfZW5kID8gX191ZmxvdyAo IHN0ZGluICApIDogKih1bnNpZ25lZCBjaGFyICopICggc3RkaW4gICktPl9JT19yZWFkX3B0cisr KSA7Cn0KCgoKIAppbmxpbmUgIGludApwdXRjaGFyIChpbnQgX19jKSB0aHJvdyAoKSAKewogIHJl dHVybiBfSU9fcHV0YyAoX19jLCBzdGRvdXQgKTsKfQoKCgogCmlubGluZSAgaW50CmZwdXRjX3Vu bG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgCnsKICByZXR1cm4gKCgo ICBfX3N0cmVhbSApLT5fSU9fd3JpdGVfcHRyID49ICggIF9fc3RyZWFtICktPl9JT193cml0ZV9l bmQpID8gX19vdmVyZmxvdyAoICBfX3N0cmVhbSAsICh1bnNpZ25lZCBjaGFyKSAoIF9fYyApKSA6 ICh1bnNpZ25lZCBjaGFyKSAoKiggIF9fc3RyZWFtICktPl9JT193cml0ZV9wdHIrKyA9ICggX19j ICkpKSA7Cn0KCgoKCiAKaW5saW5lICBpbnQKcHV0Y191bmxvY2tlZCAoaW50IF9fYywgRklMRSAq X19zdHJlYW0pIHRocm93ICgpIAp7CiAgcmV0dXJuICgoKCAgX19zdHJlYW0gKS0+X0lPX3dyaXRl X3B0ciA+PSAoICBfX3N0cmVhbSApLT5fSU9fd3JpdGVfZW5kKSA/IF9fb3ZlcmZsb3cgKCAgX19z dHJlYW0gLCAodW5zaWduZWQgY2hhcikgKCBfX2MgKSkgOiAodW5zaWduZWQgY2hhcikgKCooICBf X3N0cmVhbSApLT5fSU9fd3JpdGVfcHRyKysgPSAoIF9fYyApKSkgOwp9CgogCmlubGluZSAgaW50 CnB1dGNoYXJfdW5sb2NrZWQgKGludCBfX2MpIHRocm93ICgpIAp7CiAgcmV0dXJuICgoKCAgc3Rk b3V0ICApLT5fSU9fd3JpdGVfcHRyID49ICggIHN0ZG91dCAgKS0+X0lPX3dyaXRlX2VuZCkgPyBf X292ZXJmbG93ICggIHN0ZG91dCAgLCAodW5zaWduZWQgY2hhcikgKCBfX2MgKSkgOiAodW5zaWdu ZWQgY2hhcikgKCooICBzdGRvdXQgICktPl9JT193cml0ZV9wdHIrKyA9ICggX19jICkpKSA7Cn0K CgoKCgoKCgoKCgoKCgogCmlubGluZSAgaW50CmZlb2ZfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFt KSB0aHJvdyAoKSAKewogIHJldHVybiAoKCggX19zdHJlYW0gKS0+X2ZsYWdzICYgMHgxMCApICE9 IDApIDsKfQoKIAppbmxpbmUgIGludApmZXJyb3JfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSB0 aHJvdyAoKSAKewogIHJldHVybiAoKCggX19zdHJlYW0gKS0+X2ZsYWdzICYgMHgyMCApICE9IDAp IDsKfQoKCgoKCgogCgojIDE0OSAiL3Vzci9pbmNsdWRlL2JpdHMvc3RkaW8uaCIgMwoKCiMgMTY1 ICIvdXNyL2luY2x1ZGUvYml0cy9zdGRpby5oIiAzCgoKIAoKIyA2MzUgIi91c3IvaW5jbHVkZS9z dGRpby5oIiAyIDMKCgoKfSAKCgoKCiMgNDQgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdGV4dHN0 cmVhbS5oIiAyCgoKCgpjbGFzcyBRVGV4dENvZGVjOwpjbGFzcyBRVGV4dERlY29kZXI7CgpjbGFz cyBRVGV4dFN0cmVhbVByaXZhdGU7CgpjbGFzcyAgIFFUZXh0U3RyZWFtCQkJCSAKewpwdWJsaWM6 CiAgICBlbnVtIEVuY29kaW5nIHsgTG9jYWxlLCBMYXRpbjEsIFVuaWNvZGUsIFVuaWNvZGVOZXR3 b3JrT3JkZXIsCgkJICAgIFVuaWNvZGVSZXZlcnNlLCBSYXdVbmljb2RlLCBVbmljb2RlVVRGOCB9 OwoKICAgIHZvaWQJc2V0RW5jb2RpbmcoIEVuY29kaW5nICk7CgogICAgdm9pZAlzZXRDb2RlYygg UVRleHRDb2RlYyogKTsKCgogICAgIAoKICAgIFFUZXh0U3RyZWFtKCk7CiAgICBRVGV4dFN0cmVh bSggUUlPRGV2aWNlICogKTsKICAgIFFUZXh0U3RyZWFtKCBRU3RyaW5nKiwgaW50IG1vZGUgKTsK ICAgIFFUZXh0U3RyZWFtKCBRU3RyaW5nJiwgaW50IG1vZGUgKTsJCSAKICAgIFFUZXh0U3RyZWFt KCBRQnl0ZUFycmF5LCBpbnQgbW9kZSApOwogICAgUVRleHRTdHJlYW0oIEZJTEUgKiwgaW50IG1v ZGUgKTsKICAgIHZpcnR1YWwgflFUZXh0U3RyZWFtKCk7CgogICAgUUlPRGV2aWNlCSpkZXZpY2Uo KSBjb25zdDsKICAgIHZvaWQJIHNldERldmljZSggUUlPRGV2aWNlICogKTsKICAgIHZvaWQJIHVu c2V0RGV2aWNlKCk7CgogICAgYm9vbAkgYXRFbmQoKSBjb25zdDsKICAgIGJvb2wJIGVvZigpIGNv bnN0OwoKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcj4+KCBRQ2hhciAmICk7CiAgICBRVGV4dFN0 cmVhbSAmb3BlcmF0b3I+PiggY2hhciAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+Pigg c2lnbmVkIHNob3J0ICYgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcj4+KCB1bnNpZ25lZCBz aG9ydCAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+Piggc2lnbmVkIGludCAmICk7CiAg ICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggdW5zaWduZWQgaW50ICYgKTsKICAgIFFUZXh0U3Ry ZWFtICZvcGVyYXRvcj4+KCBzaWduZWQgbG9uZyAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0 b3I+PiggdW5zaWduZWQgbG9uZyAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggZmxv YXQgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIGRvdWJsZSAmICk7CiAgICBRVGV4 dFN0cmVhbSAmb3BlcmF0b3I+PiggY2hhciAqICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+ PiggUVN0cmluZyAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggUUNTdHJpbmcgJiAp OwoKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBRQ2hhciApOwogICAgUVRleHRTdHJlYW0g Jm9wZXJhdG9yPDwoIGNoYXIgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBzaWduZWQg c2hvcnQgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCB1bnNpZ25lZCBzaG9ydCApOwog ICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIHNpZ25lZCBpbnQgKTsKICAgIFFUZXh0U3RyZWFt ICZvcGVyYXRvcjw8KCB1bnNpZ25lZCBpbnQgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8 KCBzaWduZWQgbG9uZyApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIHVuc2lnbmVkIGxv bmcgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBmbG9hdCApOwogICAgUVRleHRTdHJl YW0gJm9wZXJhdG9yPDwoIGRvdWJsZSApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIGNv bnN0IGNoYXIqICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggY29uc3QgUVN0cmluZyAm ICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggY29uc3QgUUNTdHJpbmcgJiApOwogICAg UVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIHZvaWQgKiApOwkJIAoKICAgIFFUZXh0U3RyZWFtICZy ZWFkUmF3Qnl0ZXMoIGNoYXIgKiwgdWludCBsZW4gKTsKICAgIFFUZXh0U3RyZWFtICZ3cml0ZVJh d0J5dGVzKCBjb25zdCBjaGFyKiAsIHVpbnQgbGVuICk7CgogICAgUVN0cmluZwlyZWFkTGluZSgp OwogICAgUVN0cmluZwlyZWFkKCk7CiAgICB2b2lkCXNraXBXaGl0ZVNwYWNlKCk7CgogICAgZW51 bSB7Cglza2lwd3MJICA9IDB4MDAwMSwJCQkgCglsZWZ0CSAgPSAweDAwMDIsCQkJIAoJcmlnaHQJ ICA9IDB4MDAwNCwJCQkgCglpbnRlcm5hbCAgPSAweDAwMDgsCQkJIAoJYmluCSAgPSAweDAwMTAs CQkJIAoJb2N0CSAgPSAweDAwMjAsCQkJIAoJZGVjCSAgPSAweDAwNDAsCQkJIAoJaGV4CSAgPSAw eDAwODAsCQkJIAoJc2hvd2Jhc2UgID0gMHgwMTAwLAkJCSAKCXNob3dwb2ludCA9IDB4MDIwMCwJ CQkgCgl1cHBlcmNhc2UgPSAweDA0MDAsCQkJIAoJc2hvd3BvcwkgID0gMHgwODAwLAkJCSAKCXNj aWVudGlmaWM9IDB4MTAwMCwJCQkgCglmaXhlZAkgID0gMHgyMDAwCQkJIAogICAgfTsKCiAgICBz dGF0aWMgY29uc3QgaW50IGJhc2VmaWVsZDsJCQkgCiAgICBzdGF0aWMgY29uc3QgaW50IGFkanVz dGZpZWxkOwkJIAogICAgc3RhdGljIGNvbnN0IGludCBmbG9hdGZpZWxkOwkJIAoKICAgIGludAkg IGZsYWdzKCkgY29uc3Q7CiAgICBpbnQJICBmbGFncyggaW50IGYgKTsKICAgIGludAkgIHNldGYo IGludCBiaXRzICk7CiAgICBpbnQJICBzZXRmKCBpbnQgYml0cywgaW50IG1hc2sgKTsKICAgIGlu dAkgIHVuc2V0ZiggaW50IGJpdHMgKTsKCiAgICB2b2lkICByZXNldCgpOwoKICAgIGludAkgIHdp ZHRoKCkJY29uc3Q7CiAgICBpbnQJICB3aWR0aCggaW50ICk7CiAgICBpbnQJICBmaWxsKCkJY29u c3Q7CiAgICBpbnQJICBmaWxsKCBpbnQgKTsKICAgIGludAkgIHByZWNpc2lvbigpCWNvbnN0Owog ICAgaW50CSAgcHJlY2lzaW9uKCBpbnQgKTsKCnByaXZhdGU6CiAgICBsb25nCWlucHV0X2ludCgp OwogICAgdm9pZAlpbml0KCk7CiAgICBRVGV4dFN0cmVhbSAmb3V0cHV0X2ludCggaW50LCB1bG9u ZywgYm9vbCApOwogICAgUUlPRGV2aWNlCSpkZXY7CgogICAgaW50CQlmZmxhZ3M7CiAgICBpbnQJ CWZ3aWR0aDsKICAgIGludAkJZmlsbGNoYXI7CiAgICBpbnQJCWZwcmVjOwogICAgYm9vbAlkb1Vu aWNvZGVIZWFkZXI7CiAgICBib29sCW93bmRldjsKICAgIFFUZXh0Q29kZWMgCSptYXBwZXI7CiAg ICBRVGV4dFN0cmVhbVByaXZhdGUgKiBkOwogICAgUUNoYXIJdW51c2VkMTsgIAogICAgYm9vbAls YXRpbjE7CiAgICBib29sIAlpbnRlcm5hbE9yZGVyOwogICAgYm9vbAluZXR3b3JrT3JkZXI7CiAg ICB2b2lkCSp1bnVzZWQyOyAgCgogICAgUUNoYXIJZWF0X3dzKCk7CiAgICB1aW50IAl0c19nZXRs aW5lKCBRQ2hhciogKTsKICAgIHZvaWQJdHNfdW5nZXRjKCBRQ2hhciApOwogICAgUUNoYXIJdHNf Z2V0YygpOwogICAgdWludAl0c19nZXRidWYoIFFDaGFyKiwgdWludCApOwogICAgdm9pZAl0c19w dXRjKGludCk7CiAgICB2b2lkCXRzX3B1dGMoUUNoYXIpOwogICAgYm9vbAl0c19pc3NwYWNlKFFD aGFyKTsKICAgIGJvb2wJdHNfaXNkaWdpdChRQ2hhcik7CiAgICB1bG9uZwlpbnB1dF9iaW4oKTsK ICAgIHVsb25nCWlucHV0X29jdCgpOwogICAgdWxvbmcJaW5wdXRfZGVjKCk7CiAgICB1bG9uZwlp bnB1dF9oZXgoKTsKICAgIGRvdWJsZQlpbnB1dF9kb3VibGUoKTsKICAgIFFUZXh0U3RyZWFtICZ3 cml0ZUJsb2NrKCBjb25zdCBjaGFyKiBwLCB1aW50IGxlbiApOwogICAgUVRleHRTdHJlYW0gJndy aXRlQmxvY2soIGNvbnN0IFFDaGFyKiBwLCB1aW50IGxlbiApOwoKcHJpdmF0ZToJIAoKICAgIFFU ZXh0U3RyZWFtKCBjb25zdCBRVGV4dFN0cmVhbSAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0 b3I9KCBjb25zdCBRVGV4dFN0cmVhbSAmICk7Cgp9OwoKdHlwZWRlZiBRVGV4dFN0cmVhbSBRVFM7 CgpjbGFzcyAgIFFUZXh0SVN0cmVhbSA6IHB1YmxpYyBRVGV4dFN0cmVhbSB7CnB1YmxpYzoKICAg IFFUZXh0SVN0cmVhbSggY29uc3QgUVN0cmluZyogcyApIDoKCVFUZXh0U3RyZWFtKChRU3RyaW5n KilzLDB4MDAwMSApIHsgfQogICAgUVRleHRJU3RyZWFtKCBRQnl0ZUFycmF5IGJhICkgOgoJUVRl eHRTdHJlYW0oYmEsMHgwMDAxICkgeyB9CiAgICBRVGV4dElTdHJlYW0oIEZJTEUgKmYgKSA6CglR VGV4dFN0cmVhbShmLDB4MDAwMSApIHsgfQp9OwoKY2xhc3MgICBRVGV4dE9TdHJlYW0gOiBwdWJs aWMgUVRleHRTdHJlYW0gewpwdWJsaWM6CiAgICBRVGV4dE9TdHJlYW0oIFFTdHJpbmcqIHMgKSA6 CglRVGV4dFN0cmVhbShzLDB4MDAwMiApIHsgfQogICAgUVRleHRPU3RyZWFtKCBRQnl0ZUFycmF5 IGJhICkgOgoJUVRleHRTdHJlYW0oYmEsMHgwMDAyICkgeyB9CiAgICBRVGV4dE9TdHJlYW0oIEZJ TEUgKmYgKSA6CglRVGV4dFN0cmVhbShmLDB4MDAwMiApIHsgfQp9OwoKIAoKCgppbmxpbmUgUUlP RGV2aWNlICpRVGV4dFN0cmVhbTo6ZGV2aWNlKCkgY29uc3QKeyByZXR1cm4gZGV2OyB9Cgppbmxp bmUgYm9vbCBRVGV4dFN0cmVhbTo6YXRFbmQoKSBjb25zdAp7IHJldHVybiBkZXYgPyBkZXYtPmF0 RW5kKCkgOiBGQUxTRTsgfQoKaW5saW5lIGJvb2wgUVRleHRTdHJlYW06OmVvZigpIGNvbnN0Cnsg cmV0dXJuIGF0RW5kKCk7IH0KCmlubGluZSBpbnQgUVRleHRTdHJlYW06OmZsYWdzKCkgY29uc3QK eyByZXR1cm4gZmZsYWdzOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjpmbGFncyggaW50IGYg KQp7IGludCBvbGRmID0gZmZsYWdzOyAgZmZsYWdzID0gZjsgIHJldHVybiBvbGRmOyB9Cgppbmxp bmUgaW50IFFUZXh0U3RyZWFtOjpzZXRmKCBpbnQgYml0cyApCnsgaW50IG9sZGYgPSBmZmxhZ3M7 ICBmZmxhZ3MgfD0gYml0czsgIHJldHVybiBvbGRmOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFt OjpzZXRmKCBpbnQgYml0cywgaW50IG1hc2sgKQp7IGludCBvbGRmID0gZmZsYWdzOyAgZmZsYWdz ID0gKGZmbGFncyAmIH5tYXNrKSB8IChiaXRzICYgbWFzayk7IHJldHVybiBvbGRmOyB9Cgppbmxp bmUgaW50IFFUZXh0U3RyZWFtOjp1bnNldGYoIGludCBiaXRzICkKeyBpbnQgb2xkZiA9IGZmbGFn czsgIGZmbGFncyAmPSB+Yml0czsJcmV0dXJuIG9sZGY7IH0KCmlubGluZSBpbnQgUVRleHRTdHJl YW06OndpZHRoKCkgY29uc3QKeyByZXR1cm4gZndpZHRoOyB9CgppbmxpbmUgaW50IFFUZXh0U3Ry ZWFtOjp3aWR0aCggaW50IHcgKQp7IGludCBvbGR3ID0gZndpZHRoOyAgZndpZHRoID0gdzsgIHJl dHVybiBvbGR3OwkgfQoKaW5saW5lIGludCBRVGV4dFN0cmVhbTo6ZmlsbCgpIGNvbnN0CnsgcmV0 dXJuIGZpbGxjaGFyOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjpmaWxsKCBpbnQgZiApCnsg aW50IG9sZGMgPSBmaWxsY2hhcjsJZmlsbGNoYXIgPSBmOyAgcmV0dXJuIG9sZGM7ICB9Cgppbmxp bmUgaW50IFFUZXh0U3RyZWFtOjpwcmVjaXNpb24oKSBjb25zdAp7IHJldHVybiBmcHJlYzsgfQoK aW5saW5lIGludCBRVGV4dFN0cmVhbTo6cHJlY2lzaW9uKCBpbnQgcCApCnsgaW50IG9sZHAgPSBm cHJlYzsgIGZwcmVjID0gcDsJIHJldHVybiBvbGRwOyAgfQoKIAoKCmlubGluZSBRQ2hhciBRVGV4 dFN0cmVhbTo6dHNfZ2V0YygpCnsgUUNoYXIgcjsgcmV0dXJuICggdHNfZ2V0YnVmKCAmciwxICkg PT0gMSA/IHIgOiBRQ2hhcigodXNob3J0KTB4ZmZmZikgKTsgfQoKIAoKCgp0eXBlZGVmIFFUZXh0 U3RyZWFtICYgKCpRVFNGVU5DKShRVGV4dFN0cmVhbSAmKTsgCnR5cGVkZWYgaW50IChRVGV4dFN0 cmVhbTo6KlFUU01GSSkoaW50KTsJIAoKY2xhc3MgICBRVFNNYW5pcCB7CQkJIApwdWJsaWM6CiAg ICBRVFNNYW5pcCggUVRTTUZJIG0sIGludCBhICkgeyBtZj1tOyBhcmc9YTsgfQogICAgdm9pZCBl eGVjKCBRVGV4dFN0cmVhbSAmcyApIHsgKHMuKm1mKShhcmcpOyB9CnByaXZhdGU6CiAgICBRVFNN RkkgbWY7CQkJCQkgCiAgICBpbnQJICAgYXJnOwkJCQkJIAp9OwoKICBpbmxpbmUgUVRleHRTdHJl YW0gJm9wZXJhdG9yPj4oIFFUZXh0U3RyZWFtICZzLCBRVFNGVU5DIGYgKQp7IHJldHVybiAoKmYp KCBzICk7IH0KCiAgaW5saW5lIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBRVGV4dFN0cmVhbSAm cywgUVRTRlVOQyBmICkKeyByZXR1cm4gKCpmKSggcyApOyB9CgogIGlubGluZSBRVGV4dFN0cmVh bSAmb3BlcmF0b3I8PCggUVRleHRTdHJlYW0gJnMsIFFUU01hbmlwIG0gKQp7IG0uZXhlYyhzKTsg cmV0dXJuIHM7IH0KCiAgUVRleHRTdHJlYW0gJmJpbiggUVRleHRTdHJlYW0gJnMgKTsJIAogIFFU ZXh0U3RyZWFtICZvY3QoIFFUZXh0U3RyZWFtICZzICk7CSAKICBRVGV4dFN0cmVhbSAmZGVjKCBR VGV4dFN0cmVhbSAmcyApOwkgCiAgUVRleHRTdHJlYW0gJmhleCggUVRleHRTdHJlYW0gJnMgKTsJ IAogIFFUZXh0U3RyZWFtICZlbmRsKCBRVGV4dFN0cmVhbSAmcyApOwkgCiAgUVRleHRTdHJlYW0g JmZsdXNoKCBRVGV4dFN0cmVhbSAmcyApOwkgCiAgUVRleHRTdHJlYW0gJndzKCBRVGV4dFN0cmVh bSAmcyApOwkgCiAgUVRleHRTdHJlYW0gJnJlc2V0KCBRVGV4dFN0cmVhbSAmcyApOwkgCgogIGlu bGluZSBRVFNNYW5pcCBxU2V0VyggaW50IHcgKQp7CiAgICBRVFNNRkkgZnVuYyA9ICZRVGV4dFN0 cmVhbTo6d2lkdGg7CiAgICByZXR1cm4gUVRTTWFuaXAoZnVuYyx3KTsKfQoKICBpbmxpbmUgUVRT TWFuaXAgcVNldEZpbGwoIGludCBmICkKewogICAgUVRTTUZJIGZ1bmMgPSAmUVRleHRTdHJlYW06 OmZpbGw7CiAgICByZXR1cm4gUVRTTWFuaXAoZnVuYyxmKTsKfQoKICBpbmxpbmUgUVRTTWFuaXAg cVNldFByZWNpc2lvbiggaW50IHAgKQp7CiAgICBRVFNNRkkgZnVuYyA9ICZRVGV4dFN0cmVhbTo6 cHJlY2lzaW9uOwogICAgcmV0dXJuIFFUU01hbmlwKGZ1bmMscCk7Cn0KCgoKIyA0MyAiL3Vzci9s b2NhbC9xdC9pbmNsdWRlL3F0bC5oIiAyCgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIFFU ZXh0T1N0cmVhbUl0ZXJhdG9yCnsKcHJvdGVjdGVkOgogICAgUVRleHRPU3RyZWFtJiBzdHJlYW07 CiAgICBRU3RyaW5nIHNlcGFyYXRvcjsKCnB1YmxpYzoKICAgIFFUZXh0T1N0cmVhbUl0ZXJhdG9y KCBRVGV4dE9TdHJlYW0mIHMpIDogc3RyZWFtKCBzICkge30KICAgIFFUZXh0T1N0cmVhbUl0ZXJh dG9yKCBRVGV4dE9TdHJlYW0mIHMsIGNvbnN0IFFTdHJpbmcmIHNlcCApCgk6IHN0cmVhbSggcyAp LCBzZXBhcmF0b3IoIHNlcCApICB7fQogICAgUVRleHRPU3RyZWFtSXRlcmF0b3I8VD4mIG9wZXJh dG9yPSAoIGNvbnN0IFQmIHggKSB7CglzdHJlYW0gPDwgeDsKCWlmICggIXNlcGFyYXRvci5pc0Vt cHR5KCkgKQoJICAgIHN0cmVhbSA8PCBzZXBhcmF0b3I7CglyZXR1cm4gKnRoaXM7CiAgICB9CiAg ICBRVGV4dE9TdHJlYW1JdGVyYXRvcjxUPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0K ICAgIFFUZXh0T1N0cmVhbUl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7 IH0KICAgIFFUZXh0T1N0cmVhbUl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4g KnRoaXM7IH0KfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0 SXRlcmF0b3I+CmlubGluZSBPdXRwdXRJdGVyYXRvciBxQ29weSggSW5wdXRJdGVyYXRvciBfYmVn aW4sIElucHV0SXRlcmF0b3IgX2VuZCwKCQkJICAgICBPdXRwdXRJdGVyYXRvciBfZGVzdCApCnsK ICAgIHdoaWxlKCBfYmVnaW4gIT0gX2VuZCApCgkqX2Rlc3QrKyA9ICpfYmVnaW4rKzsKICAgIHJl dHVybiBfZGVzdDsKfQoKdGVtcGxhdGUgPGNsYXNzIEJpSXRlcmF0b3IsIGNsYXNzIEJpT3V0cHV0 SXRlcmF0b3I+CmlubGluZSBCaU91dHB1dEl0ZXJhdG9yIHFDb3B5QmFja3dhcmQoIEJpSXRlcmF0 b3IgX2JlZ2luLCBCaUl0ZXJhdG9yIF9lbmQsCgkJCQkgICAgICAgQmlPdXRwdXRJdGVyYXRvciBf ZGVzdCApCnsKICAgIHdoaWxlICggX2JlZ2luICE9IF9lbmQgKQoJKi0tX2Rlc3QgPSAqLS1fZW5k OwogICAgcmV0dXJuIF9kZXN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNs YXNzIElucHV0SXRlcmF0b3IyPgppbmxpbmUgYm9vbCBxRXF1YWwoIElucHV0SXRlcmF0b3IxIGZp cnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsIElucHV0SXRlcmF0b3IyIGZpcnN0MiApCnsKICAg IGZvciAoIDsgZmlyc3QxICE9IGxhc3QxOyArK2ZpcnN0MSwgKytmaXJzdDIgKQoJaWYgKCAqZmly c3QxICE9ICpmaXJzdDIgKQoJICAgIHJldHVybiBGQUxTRTsKICAgIHJldHVybiBUUlVFOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBUPgppbmxpbmUgdm9pZCBxRmls bCggRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCwgY29uc3QgVCYg dmFsICkKewogICAgZm9yICggOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0ICkKCSpmaXJzdCA9IHZh bDsKfQoKIyAxMTcgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdGwuaCIKCgoKdGVtcGxhdGUgPGNs YXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFQ+CmlubGluZSBJbnB1dEl0ZXJhdG9yIHFGaW5kKCBJ bnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCgkJCSAgICBjb25zdCBUJiB2 YWwgKQp7CiAgICB3aGlsZSAoIGZpcnN0ICE9IGxhc3QgJiYgKmZpcnN0ICE9IHZhbCApCgkrK2Zp cnN0OwogICAgcmV0dXJuIGZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwg Y2xhc3MgVCwgY2xhc3MgU2l6ZT4KaW5saW5lIHZvaWQgcUNvdW50KCBJbnB1dEl0ZXJhdG9yIGZp cnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IFQmIHZhbHVlLAoJCSAgICBTaXplJiBuICkK ewogICAgZm9yICggOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0ICkKCWlmICggKmZpcnN0ID09IHZh bHVlICkKCSAgICArK247Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgppbmxpbmUgdm9pZCBxU3dhcCgg VCYgX3ZhbHVlMSwgVCYgX3ZhbHVlMiApCnsKICAgIFQgdG1wID0gX3ZhbHVlMTsKICAgIF92YWx1 ZTEgPSBfdmFsdWUyOwogICAgX3ZhbHVlMiA9IHRtcDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBJbnB1 dEl0ZXJhdG9yPgogIHZvaWQgcUJ1YmJsZVNvcnQoIElucHV0SXRlcmF0b3IgYiwgSW5wdXRJdGVy YXRvciBlICkKewogICAgIAogICAgSW5wdXRJdGVyYXRvciBsYXN0ID0gZTsKICAgIC0tbGFzdDsK ICAgICAKICAgIGlmICggbGFzdCA9PSBiICkKCXJldHVybjsKCiAgICAgCiAgICB3aGlsZSggYiAh PSBsYXN0ICkgewoJYm9vbCBzd2FwcGVkID0gRkFMU0U7CglJbnB1dEl0ZXJhdG9yIHN3YXBfcG9z ID0gYjsKCUlucHV0SXRlcmF0b3IgeCA9IGU7CglJbnB1dEl0ZXJhdG9yIHkgPSB4OwoJeS0tOwoJ ZG8gewoJICAgIC0teDsKCSAgICAtLXk7CgkgICAgaWYgKCAqeCA8ICp5ICkgewoJCXN3YXBwZWQg PSBUUlVFOwoJCXFTd2FwKCAqeCwgKnkgKTsKCQlzd2FwX3BvcyA9IHk7CgkgICAgfQoJfSB3aGls ZSggeSAhPSBiICk7CglpZiAoICFzd2FwcGVkICkKCSAgICByZXR1cm47CgliID0gc3dhcF9wb3M7 CgliKys7CiAgICB9Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgppbmxpbmUgdm9pZCBx QnViYmxlU29ydCggQ29udGFpbmVyICZjICkKewogIHFCdWJibGVTb3J0KCBjLmJlZ2luKCksIGMu ZW5kKCkgKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBWYWx1ZT4KICB2b2lkIHFIZWFwU29ydFB1c2hE b3duKCBWYWx1ZSogaGVhcCwgaW50IGZpcnN0LCBpbnQgbGFzdCApCnsKICAgIGludCByID0gZmly c3Q7CiAgICB3aGlsZSggciA8PSBsYXN0LzIgKSB7CgkgCglpZiAoIGxhc3QgPT0gMipyICkgewoJ ICAgICAKCSAgICBpZiAoIGhlYXBbcl0gPiBoZWFwWyAyKnIgXSApCgkJcVN3YXAoIGhlYXBbcl0s IGhlYXBbIDIqciBdICk7CgkgICAgIAoJICAgIHIgPSBsYXN0OwoJfSBlbHNlIHsgIAoJICAgIGlm ICggaGVhcFtyXSA+IGhlYXBbIDIqciBdICYmIGhlYXBbIDIqciBdIDw9IGhlYXBbIDIqcisxIF0g KSB7CgkJIAoJCXFTd2FwKCBoZWFwW3JdLCBoZWFwWyAyKnIgXSApOwoJCXIgKj0gMjsKCSAgICB9 IGVsc2UgaWYgKCBoZWFwW3JdID4gaGVhcFsgMipyKzEgXSAmJgoJCQloZWFwWyAyKnIrMSBdIDwg aGVhcFsgMipyIF0gKSB7CgkJIAoJCXFTd2FwKCBoZWFwW3JdLCBoZWFwWyAyKnIrMSBdICk7CgkJ ciA9IDIqcisxOwoJICAgIH0gZWxzZSB7CgkJIAoJCXIgPSBsYXN0OwoJICAgIH0KCX0KICAgIH0K fQoKCnRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBWYWx1ZT4KICB2b2lkIHFI ZWFwU29ydEhlbHBlciggSW5wdXRJdGVyYXRvciBiLCBJbnB1dEl0ZXJhdG9yIGUsIFZhbHVlLCB1 aW50IG4gKQp7CiAgICAgCiAgICBJbnB1dEl0ZXJhdG9yIGluc2VydCA9IGI7CiAgICBWYWx1ZSog cmVhbGhlYXAgPSBuZXcgVmFsdWVbIG4gXTsKICAgICAKICAgIFZhbHVlKiBoZWFwID0gcmVhbGhl YXAgLSAxOwogICAgaW50IHNpemUgPSAwOwogICAgZm9yKCA7IGluc2VydCAhPSBlOyArK2luc2Vy dCApIHsKCWhlYXBbKytzaXplXSA9ICppbnNlcnQ7CglpbnQgaSA9IHNpemU7Cgl3aGlsZSggaSA+ IDEgJiYgaGVhcFtpXSA8IGhlYXBbIGkgLyAyIF0gKSB7CgkgICAgcVN3YXAoIGhlYXBbaV0sIGhl YXBbIGkgLyAyIF0gKTsKCSAgICBpIC89IDI7Cgl9CiAgICB9CgogICAgIAogICAgZm9yKCB1aW50 IGkgPSBuOyBpID4gMDsgaS0tICkgewoJKmIrKyA9IGhlYXBbMV07CglpZiAoIGkgPiAxICkgewoJ ICAgIGhlYXBbMV0gPSBoZWFwW2ldOwoJICAgIHFIZWFwU29ydFB1c2hEb3duKCBoZWFwLCAxLCAo aW50KWkgLSAxICk7Cgl9CiAgICB9CgogICAgZGVsZXRlW10gcmVhbGhlYXA7Cn0KCgp0ZW1wbGF0 ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KICB2b2lkIHFIZWFwU29ydCggSW5wdXRJdGVyYXRvciBi LCBJbnB1dEl0ZXJhdG9yIGUgKQp7CiAgICAgCiAgICBpZiAoIGIgPT0gZSApCglyZXR1cm47Cgog ICAgIAogICAgSW5wdXRJdGVyYXRvciBpdCA9IGI7CiAgICB1aW50IG4gPSAwOwogICAgd2hpbGUg KCBpdCAhPSBlICkgewoJKytuOwoJKytpdDsKICAgIH0KCiAgICAgCiAgICAgCiAgICBxSGVhcFNv cnRIZWxwZXIoIGIsIGUsICpiLCBuICk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgog IHZvaWQgcUhlYXBTb3J0KCBDb250YWluZXIgJmMgKQp7CiAgICBpZiAoIGMuYmVnaW4oKSA9PSBj LmVuZCgpICkKCXJldHVybjsKCiAgICAgCiAgICAgCiAgICBxSGVhcFNvcnRIZWxwZXIoIGMuYmVn aW4oKSwgYy5lbmQoKSwgKihjLmJlZ2luKCkpLCAodWludCljLmNvdW50KCkgKTsKfQoKCiMgNDAg Ii91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWV2ZWN0b3IuaCIgMgoKCiMgMSAiL3Vzci9sb2Nh bC9xdC9pbmNsdWRlL3FkYXRhc3RyZWFtLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyAgIFFEYXRhU3RyZWFtCQkJCSAKewpwdWJsaWM6CiAg ICBRRGF0YVN0cmVhbSgpOwogICAgUURhdGFTdHJlYW0oIFFJT0RldmljZSAqICk7CiAgICBRRGF0 YVN0cmVhbSggUUJ5dGVBcnJheSwgaW50IG1vZGUgKTsKICAgIHZpcnR1YWwgflFEYXRhU3RyZWFt KCk7CgogICAgUUlPRGV2aWNlCSpkZXZpY2UoKSBjb25zdDsKICAgIHZvaWQJIHNldERldmljZSgg UUlPRGV2aWNlICogKTsKICAgIHZvaWQJIHVuc2V0RGV2aWNlKCk7CgogICAgYm9vbAkgYXRFbmQo KSBjb25zdDsKICAgIGJvb2wJIGVvZigpIGNvbnN0OwoKICAgIGVudW0gQnl0ZU9yZGVyIHsgQmln RW5kaWFuLCBMaXR0bGVFbmRpYW4gfTsKICAgIGludAkJIGJ5dGVPcmRlcigpCWNvbnN0OwogICAg dm9pZAkgc2V0Qnl0ZU9yZGVyKCBpbnQgKTsKCiAgICBib29sCSBpc1ByaW50YWJsZURhdGEoKSBj b25zdDsKICAgIHZvaWQJIHNldFByaW50YWJsZURhdGEoIGJvb2wgKTsKCiAgICBpbnQJCSB2ZXJz aW9uKCkgY29uc3Q7CiAgICB2b2lkCSBzZXRWZXJzaW9uKCBpbnQgKTsKCiAgICBRRGF0YVN0cmVh bSAmb3BlcmF0b3I+PiggUV9JTlQ4ICZpICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I+Pigg UV9VSU5UOCAmaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFfSU5UMTYgJmkgKTsK ICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRX1VJTlQxNiAmaSApOwogICAgUURhdGFTdHJl YW0gJm9wZXJhdG9yPj4oIFFfSU5UMzIgJmkgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBRX1VJTlQzMiAmaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFfTE9ORyAmaSAp OwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFfVUxPTkcgJmkgKTsKCiAgICBRRGF0YVN0 cmVhbSAmb3BlcmF0b3I+PiggZmxvYXQgJmYgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBkb3VibGUgJmYgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBjaGFyIComc3RyICk7 CgogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFfSU5UOCBpICk7CiAgICBRRGF0YVN0cmVh bSAmb3BlcmF0b3I8PCggUV9VSU5UOCBpICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCgg UV9JTlQxNiBpICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUV9VSU5UMTYgaSApOwog ICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFfSU5UMzIgaSApOwogICAgUURhdGFTdHJlYW0g Jm9wZXJhdG9yPDwoIFFfVUlOVDMyIGkgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBR X0xPTkcgaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFfVUxPTkcgaSApOwogICAg UURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIGZsb2F0IGYgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVy YXRvcjw8KCBkb3VibGUgZiApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIGNvbnN0IGNo YXIgKnN0ciApOwoKICAgIFFEYXRhU3RyZWFtICZyZWFkQnl0ZXMoIGNoYXIgKiYsIHVpbnQgJmxl biApOwogICAgUURhdGFTdHJlYW0gJnJlYWRSYXdCeXRlcyggY2hhciAqLCB1aW50IGxlbiApOwoK ICAgIFFEYXRhU3RyZWFtICZ3cml0ZUJ5dGVzKCBjb25zdCBjaGFyICosIHVpbnQgbGVuICk7CiAg ICBRRGF0YVN0cmVhbSAmd3JpdGVSYXdCeXRlcyggY29uc3QgY2hhciAqLCB1aW50IGxlbiApOwoK cHJpdmF0ZToKICAgIFFJT0RldmljZQkqZGV2OwogICAgYm9vbAkgb3duZGV2OwogICAgaW50CQkg Ynl0ZW9yZGVyOwogICAgYm9vbAkgcHJpbnRhYmxlOwogICAgYm9vbAkgbm9zd2FwOwogICAgaW50 CQkgdmVyOwoKcHJpdmF0ZToJIAoKICAgIFFEYXRhU3RyZWFtKCBjb25zdCBRRGF0YVN0cmVhbSAm ICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I9KCBjb25zdCBRRGF0YVN0cmVhbSAmICk7Cgp9 OwoKCiAKCgoKaW5saW5lIFFJT0RldmljZSAqUURhdGFTdHJlYW06OmRldmljZSgpIGNvbnN0Cnsg cmV0dXJuIGRldjsgfQoKaW5saW5lIGJvb2wgUURhdGFTdHJlYW06OmF0RW5kKCkgY29uc3QKeyBy ZXR1cm4gZGV2ID8gZGV2LT5hdEVuZCgpIDogVFJVRTsgfQoKaW5saW5lIGJvb2wgUURhdGFTdHJl YW06OmVvZigpIGNvbnN0CnsgcmV0dXJuIGF0RW5kKCk7IH0KCmlubGluZSBpbnQgUURhdGFTdHJl YW06OmJ5dGVPcmRlcigpIGNvbnN0CnsgcmV0dXJuIGJ5dGVvcmRlcjsgfQoKaW5saW5lIGJvb2wg UURhdGFTdHJlYW06OmlzUHJpbnRhYmxlRGF0YSgpIGNvbnN0CnsgcmV0dXJuIHByaW50YWJsZTsg fQoKaW5saW5lIHZvaWQgUURhdGFTdHJlYW06OnNldFByaW50YWJsZURhdGEoIGJvb2wgcCApCnsg cHJpbnRhYmxlID0gcDsgfQoKaW5saW5lIGludCBRRGF0YVN0cmVhbTo6dmVyc2lvbigpIGNvbnN0 CnsgcmV0dXJuIHZlcjsgfQoKaW5saW5lIHZvaWQgUURhdGFTdHJlYW06OnNldFZlcnNpb24oIGlu dCB2ICkKeyB2ZXIgPSB2OyB9CgppbmxpbmUgUURhdGFTdHJlYW0gJlFEYXRhU3RyZWFtOjpvcGVy YXRvcj4+KCBRX1VJTlQ4ICZpICkKeyByZXR1cm4gKnRoaXMgPj4gKFFfSU5UOCYpaTsgfQoKaW5s aW5lIFFEYXRhU3RyZWFtICZRRGF0YVN0cmVhbTo6b3BlcmF0b3I+PiggUV9VSU5UMTYgJmkgKQp7 IHJldHVybiAqdGhpcyA+PiAoUV9JTlQxNiYpaTsgfQoKaW5saW5lIFFEYXRhU3RyZWFtICZRRGF0 YVN0cmVhbTo6b3BlcmF0b3I+PiggUV9VSU5UMzIgJmkgKQp7IHJldHVybiAqdGhpcyA+PiAoUV9J TlQzMiYpaTsgfQoKaW5saW5lIFFEYXRhU3RyZWFtICZRRGF0YVN0cmVhbTo6b3BlcmF0b3I+Pigg UV9VTE9ORyAmaSApCnsgcmV0dXJuICp0aGlzID4+IChRX0xPTkcmKWk7IH0KCmlubGluZSBRRGF0 YVN0cmVhbSAmUURhdGFTdHJlYW06Om9wZXJhdG9yPDwoIFFfVUlOVDggaSApCnsgcmV0dXJuICp0 aGlzIDw8IChRX0lOVDgpaTsgfQoKaW5saW5lIFFEYXRhU3RyZWFtICZRRGF0YVN0cmVhbTo6b3Bl cmF0b3I8PCggUV9VSU5UMTYgaSApCnsgcmV0dXJuICp0aGlzIDw8IChRX0lOVDE2KWk7IH0KCmlu bGluZSBRRGF0YVN0cmVhbSAmUURhdGFTdHJlYW06Om9wZXJhdG9yPDwoIFFfVUlOVDMyIGkgKQp7 IHJldHVybiAqdGhpcyA8PCAoUV9JTlQzMilpOyB9CgppbmxpbmUgUURhdGFTdHJlYW0gJlFEYXRh U3RyZWFtOjpvcGVyYXRvcjw8KCBRX1VMT05HIGkgKQp7IHJldHVybiAqdGhpcyA8PCAoUV9MT05H KWk7IH0KCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWV2ZWN0b3IuaCIgMgoK CgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4u Ly4uLy4uL2luY2x1ZGUvZysrLTMvdmVjdG9yIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDEgMwogCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJh a2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2NvbmZpZy5oIiAx IDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAogCiAKIAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKCgogCiAKIAogCiAKIAogCiAKIAogCiAKCgogCgogCiAKIAogCiAKIAogCgoKCgoK CgoKIyAxNDggIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4v Li4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfY29uZmlnLmgiIDMKCgoKCgoKCgoKCgoKCgoKCgoK CgoKICAgICAgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDIzNCAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0bF9jb25maWcuaCIgMwoKCiMgMjQ4ICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2Nv bmZpZy5oIiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAogCiAKIAoKCgoK CgoKCgoKCgoKCgoKCgogCiAKIyAzMTYgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfY29uZmlnLmgiIDMKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCiAKIAojIDM2ICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX2FsZ29iYXNlLmgiIDIgMwoKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5k cmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfcmVsb3BzLmgi IDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCnRlbXBsYXRlIDxjbGFz cyBfVHA+CmlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYg X195KSB7CiAgcmV0dXJuICEoX194ID09IF9feSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+Cmlu bGluZSBib29sIG9wZXJhdG9yPihjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIHsKICBy ZXR1cm4gX195IDwgX194Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgYm9vbCBvcGVy YXRvcjw9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgewogIHJldHVybiAhKF9feSA8 IF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSBib29sIG9wZXJhdG9yPj0oY29u c3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSB7CiAgcmV0dXJuICEoX194IDwgX195KTsKfQoK IAoKCgogCiAKIAojIDM5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45 NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIgMwoKCgojIDEg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4v aW5jbHVkZS9nKystMy9zdGxfcGFpci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IAoKCgoKCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CnN0cnVjdCBwYWlyIHsK ICB0eXBlZGVmIF9UMSBmaXJzdF90eXBlOwogIHR5cGVkZWYgX1QyIHNlY29uZF90eXBlOwoKICBf VDEgZmlyc3Q7CiAgX1QyIHNlY29uZDsKICBwYWlyKCkgOiBmaXJzdChfVDEoKSksIHNlY29uZChf VDIoKSkge30KICBwYWlyKGNvbnN0IF9UMSYgX19hLCBjb25zdCBfVDImIF9fYikgOiBmaXJzdChf X2EpLCBzZWNvbmQoX19iKSB7fQoKCiAgdGVtcGxhdGUgPGNsYXNzIF9VMSwgY2xhc3MgX1UyPgog IHBhaXIoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9fcCkgOiBmaXJzdChfX3AuZmlyc3QpLCBzZWNv bmQoX19wLnNlY29uZCkge30KCn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Cmlu bGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFp cjxfVDEsIF9UMj4mIF9feSkKeyAKICByZXR1cm4gX194LmZpcnN0ID09IF9feS5maXJzdCAmJiBf X3guc2Vjb25kID09IF9feS5zZWNvbmQ7IAp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBf VDI+CmlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25z dCBwYWlyPF9UMSwgX1QyPiYgX195KQp7IAogIHJldHVybiBfX3guZmlyc3QgPCBfX3kuZmlyc3Qg fHwgCiAgICAgICAgICghKF9feS5maXJzdCA8IF9feC5maXJzdCkgJiYgX194LnNlY29uZCA8IF9f eS5zZWNvbmQpOyAKfQoKdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgcGFp cjxfVDEsIF9UMj4gbWFrZV9wYWlyKGNvbnN0IF9UMSYgX194LCBjb25zdCBfVDImIF9feSkKewog IHJldHVybiBwYWlyPF9UMSwgX1QyPihfX3gsIF9feSk7Cn0KCiAKCgoKIAogCiAKIyA0MiAiL3Vz ci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNs dWRlL2crKy0zL3N0bF9hbGdvYmFzZS5oIiAyIDMKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvdHlwZV90 cmFpdHMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKc3RydWN0IF9fdHJ1ZV90eXBlIHsKfTsKCnN0cnVjdCBfX2ZhbHNlX3R5cGUg ewp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9fdHlwZV90cmFpdHMgeyAKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICAgdGhpc19kdW1teV9tZW1iZXJfbXVzdF9iZV9maXJzdDsKICAg ICAgICAgICAgICAgICAgICAKCgoKCgogICAgCgoKCgoKCgoKIAoKICAgdHlwZWRlZiBfX2ZhbHNl X3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX2Zh bHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX2Zh bHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBf X2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX2ZhbHNl X3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07CgoKCiAKIAogCgoKCnRlbXBsYXRlPD4gIHN0cnVjdCBf X3R5cGVfdHJhaXRzPGJvb2w+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9 OwoKCgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxjaGFyPiB7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJh aXRzPHNpZ25lZCBjaGFyPiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxf ZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFs X2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsK CnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRzPHVuc2lnbmVkIGNoYXI+IHsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0 eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5 cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAg dHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKCgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190 eXBlX3RyYWl0czx3Y2hhcl90PiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3Ry aXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsK fTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8c2hvcnQ+IHsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90 cmFpdHM8dW5zaWduZWQgc2hvcnQ+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190 cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3Ry aXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNf dHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBl Owp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8aW50PiB7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJh aXRzPHVuc2lnbmVkIGludD4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFs X2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07 Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxsb25nPiB7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBf X3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVf dHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRz PHVuc2lnbmVkIGxvbmc+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9k ZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFs X2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxf YXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoK Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxsb25nIGxvbmc+IHsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90 cmFpdHM8dW5zaWduZWQgbG9uZyBsb25nPiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFz X3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBo YXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhh c190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAg aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0Rf dHlwZTsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8ZmxvYXQ+IHsKICAg dHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwog ICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAg IHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsK ICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9f dHlwZV90cmFpdHM8ZG91YmxlPiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3Ry aXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsK fTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRzPGxvbmcgZG91YmxlPiB7CiAgIHR5 cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAg dHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0 eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAg IHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCgoKdGVtcGxhdGUgPGNsYXNzIF9UcD4K c3RydWN0IF9fdHlwZV90cmFpdHM8X1RwKj4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhh c190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAg aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBo YXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAg IGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9E X3R5cGU7Cn07CgojIDI5NSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3R5cGVfdHJhaXRzLmgiIDMKCgoKIAogCgp0 ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0lzX2ludGVnZXIgewogIHR5cGVkZWYgX19mYWxz ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2VyPGJv b2w+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCgoKdGVtcGxhdGU8PiAg c3RydWN0IF9Jc19pbnRlZ2VyPGNoYXI+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3Jh bDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxzaWduZWQgY2hhcj4gewogIHR5 cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19p bnRlZ2VyPHVuc2lnbmVkIGNoYXI+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsK fTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2VyPHdjaGFyX3Q+IHsKICB0eXBlZGVm IF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRl Z2VyPHNob3J0PiB7CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0 ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8dW5zaWduZWQgc2hvcnQ+IHsKICB0eXBlZGVmIF9fdHJ1 ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxpbnQ+ IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVj dCBfSXNfaW50ZWdlcjx1bnNpZ25lZCBpbnQ+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRl Z3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxsb25nPiB7CiAgdHlwZWRl ZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVn ZXI8dW5zaWduZWQgbG9uZz4gewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoK Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8bG9uZyBsb25nPiB7CiAgdHlwZWRlZiBf X3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8 dW5zaWduZWQgbG9uZyBsb25nPiB7CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07 CgoKCgoKIAogCiAKIyA0NSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGdvYmFzZS5oIiAyIDMKCgoKCiMg MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL2xp bWl0cy5oIiAxIDMKIAoKCiAKCiMgMTE0ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2Ut bGludXgvMi45NS4zL2luY2x1ZGUvbGltaXRzLmgiIDMKCgoKCgoKCiMgNDkgIi91c3IvbGliL2dj Yy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKyst My9zdGxfYWxnb2Jhc2UuaCIgMiAzCgojIDEgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMSAzCiAK CgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgogCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoK IyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTU4 Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2 LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4 ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3Rk ZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKIyAyNjkgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5k cmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIyAyODMgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4z L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzMyAiL3Vz ci9pbmNsdWRlL3N0ZGxpYi5oIiAyIDMKCgpleHRlcm4gIkMiIHsgCgoKCgogCnR5cGVkZWYgc3Ry dWN0CiAgewogICAgaW50IHF1b3Q7CQkJIAogICAgaW50IHJlbTsJCQkgCiAgfSBkaXZfdDsKCiAK CnR5cGVkZWYgc3RydWN0CiAgewogICAgbG9uZyBpbnQgcXVvdDsJCSAKICAgIGxvbmcgaW50IHJl bTsJCSAKICB9IGxkaXZfdDsKCgoKIyA2NSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCgoKCiAK CgoKIAoKCgoKCiAKCmV4dGVybiBzaXplX3QgX19jdHlwZV9nZXRfbWJfY3VyX21heCAgKHZvaWQp ICB0aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIGRvdWJsZSBhdG9mICAoX19jb25zdCBjaGFyICpfX25w dHIpICB0aHJvdyAoKSAgOwogCmV4dGVybiBpbnQgYXRvaSAgKF9fY29uc3QgY2hhciAqX19ucHRy KSAgdGhyb3cgKCkgIDsKIApleHRlcm4gbG9uZyBpbnQgYXRvbCAgKF9fY29uc3QgY2hhciAqX19u cHRyKSAgdGhyb3cgKCkgIDsKCgogCl9fZXh0ZW5zaW9uX18gZXh0ZXJuIGxvbmcgbG9uZyBpbnQg YXRvbGwgIChfX2NvbnN0IGNoYXIgKl9fbnB0cikgIHRocm93ICgpICA7CgoKIApleHRlcm4gZG91 YmxlIHN0cnRvZCAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCSAgIGNoYXIg KipfX3Jlc3RyaWN0IF9fZW5kcHRyKSAgdGhyb3cgKCkgIDsKCgoKCgoKCgoKCiAKZXh0ZXJuIGxv bmcgaW50IHN0cnRvbCAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCSAgICAg Y2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpICB0aHJvdyAoKSAgOwogCmV4 dGVybiB1bnNpZ25lZCBsb25nIGludCBzdHJ0b3VsICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0 IF9fbnB0ciwKCQkJCSAgICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCQkJCSAgICAg ICBpbnQgX19iYXNlKSAgdGhyb3cgKCkgIDsKCgogCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIGxvbmcg bG9uZyBpbnQgc3RydG9xICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCSAg Y2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpICB0aHJvdyAoKSAgOwogCl9f ZXh0ZW5zaW9uX18KZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgc3RydG91cSAgKF9fY29u c3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkJICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9f ZW5kcHRyLAoJCQkJCSAgICBpbnQgX19iYXNlKSAgdGhyb3cgKCkgIDsKCgoKIAoKIApfX2V4dGVu c2lvbl9fCmV4dGVybiBsb25nIGxvbmcgaW50IHN0cnRvbGwgIChfX2NvbnN0IGNoYXIgKl9fcmVz dHJpY3QgX19ucHRyLAoJCQkJICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jh c2UpICB0aHJvdyAoKSAgOwogCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9u ZyBpbnQgc3RydG91bGwgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkJCSAg ICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkJCQkJICAgICBpbnQgX19iYXNlKSAgdGhy b3cgKCkgIDsKCgoKIyAxOTAgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwoKCgogCgoKZXh0ZXJu IGRvdWJsZSBfX3N0cnRvZF9pbnRlcm5hbCAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25w dHIsCgkJCQkgICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCQkJCSAgICAgIGludCBf X2dyb3VwKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGZsb2F0IF9fc3RydG9mX2ludGVybmFsICAoX19j b25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCSAgICAgY2hhciAqKl9fcmVzdHJpY3Qg X19lbmRwdHIsIGludCBfX2dyb3VwKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGxvbmcgZG91YmxlICBf X3N0cnRvbGRfaW50ZXJuYWwgIChfX2NvbnN0IGNoYXIgKgoJCQkJCQlfX3Jlc3RyaWN0IF9fbnB0 ciwKCQkJCQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkJCQkJCWludCBfX2dyb3VwKSAg dGhyb3cgKCkgIDsKCmV4dGVybiBsb25nIGludCBfX3N0cnRvbF9pbnRlcm5hbCAgKF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIs CgkJCQkJaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApICB0aHJvdyAoKSAgOwoKCgpleHRlcm4gdW5z aWduZWQgbG9uZyBpbnQgX19zdHJ0b3VsX2ludGVybmFsICAoX19jb25zdCBjaGFyICoKCQkJCQkJ ICBfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCQkJICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwK CQkJCQkJICBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkgIHRocm93ICgpICA7CgoKCgpfX2V4dGVu c2lvbl9fCmV4dGVybiBsb25nIGxvbmcgaW50IF9fc3RydG9sbF9pbnRlcm5hbCAgKF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkJICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19l bmRwdHIsCgkJCQkJICAgICAgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApICB0aHJvdyAoKSAgOwoK CgpfX2V4dGVuc2lvbl9fCmV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fc3RydG91bGxf aW50ZXJuYWwgIChfX2NvbnN0IGNoYXIgKgoJCQkJCQkJX19yZXN0cmljdCBfX25wdHIsCgkJCQkJ CQljaGFyICoqCgkJCQkJCQlfX3Jlc3RyaWN0IF9fZW5kcHRyLAoJCQkJCQkJaW50IF9fYmFzZSwK CQkJCQkJCWludCBfX2dyb3VwKSAgdGhyb3cgKCkgIDsKCgoKCgoKIAoKZXh0ZXJuIF9faW5saW5l IGRvdWJsZQpzdHJ0b2QgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsIGNoYXIgKipf X3Jlc3RyaWN0IF9fZW5kcHRyKSB0aHJvdyAoKSAKewogIHJldHVybiBfX3N0cnRvZF9pbnRlcm5h bCAoX19ucHRyLCBfX2VuZHB0ciwgMCk7Cn0KZXh0ZXJuIF9faW5saW5lIGxvbmcgaW50CnN0cnRv bCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgX19l bmRwdHIsCglpbnQgX19iYXNlKSB0aHJvdyAoKSAKewogIHJldHVybiBfX3N0cnRvbF9pbnRlcm5h bCAoX19ucHRyLCBfX2VuZHB0ciwgX19iYXNlLCAwKTsKfQpleHRlcm4gX19pbmxpbmUgdW5zaWdu ZWQgbG9uZyBpbnQKc3RydG91bCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hh ciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkgaW50IF9fYmFzZSkgdGhyb3cgKCkgCnsKICByZXR1 cm4gX19zdHJ0b3VsX2ludGVybmFsIChfX25wdHIsIF9fZW5kcHRyLCBfX2Jhc2UsIDApOwp9Cgoj IDI3MSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCgoKCl9fZXh0ZW5zaW9uX18gZXh0ZXJuIF9f aW5saW5lIGxvbmcgbG9uZyBpbnQKc3RydG9xIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19u cHRyLCBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCWludCBfX2Jhc2UpIHRocm93ICgpIAp7 CiAgcmV0dXJuIF9fc3RydG9sbF9pbnRlcm5hbCAoX19ucHRyLCBfX2VuZHB0ciwgX19iYXNlLCAw KTsKfQpfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgaW50 CnN0cnRvdXEgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsIGNoYXIgKipfX3Jlc3Ry aWN0IF9fZW5kcHRyLAoJIGludCBfX2Jhc2UpIHRocm93ICgpIAp7CiAgcmV0dXJuIF9fc3RydG91 bGxfaW50ZXJuYWwgKF9fbnB0ciwgX19lbmRwdHIsIF9fYmFzZSwgMCk7Cn0KCgoKX19leHRlbnNp b25fXyBleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIGludApzdHJ0b2xsIChfX2NvbnN0IGNoYXIg Kl9fcmVzdHJpY3QgX19ucHRyLCBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCSBpbnQgX19i YXNlKSB0aHJvdyAoKSAKewogIHJldHVybiBfX3N0cnRvbGxfaW50ZXJuYWwgKF9fbnB0ciwgX19l bmRwdHIsIF9fYmFzZSwgMCk7Cn0KX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgdW5zaWdu ZWQgbG9uZyBsb25nIGludApzdHJ0b3VsbCAoX19jb25zdCBjaGFyICogX19yZXN0cmljdCBfX25w dHIsIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAoJICBpbnQgX19iYXNlKSB0aHJvdyAoKSAK ewogIHJldHVybiBfX3N0cnRvdWxsX2ludGVybmFsIChfX25wdHIsIF9fZW5kcHRyLCBfX2Jhc2Us IDApOwp9CgoKZXh0ZXJuIF9faW5saW5lIGRvdWJsZQphdG9mIChfX2NvbnN0IGNoYXIgKl9fbnB0 cikgdGhyb3cgKCkgCnsKICByZXR1cm4gc3RydG9kIChfX25wdHIsIChjaGFyICoqKSBfX251bGwg KTsKfQpleHRlcm4gX19pbmxpbmUgaW50CmF0b2kgKF9fY29uc3QgY2hhciAqX19ucHRyKSB0aHJv dyAoKSAKewogIHJldHVybiAoaW50KSBzdHJ0b2wgKF9fbnB0ciwgKGNoYXIgKiopIF9fbnVsbCAs IDEwKTsKfQpleHRlcm4gX19pbmxpbmUgbG9uZyBpbnQKYXRvbCAoX19jb25zdCBjaGFyICpfX25w dHIpIHRocm93ICgpIAp7CiAgcmV0dXJuIHN0cnRvbCAoX19ucHRyLCAoY2hhciAqKikgX19udWxs ICwgMTApOwp9CgoKX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIGludAph dG9sbCAoX19jb25zdCBjaGFyICpfX25wdHIpIHRocm93ICgpIAp7CiAgcmV0dXJuIHN0cnRvbGwg KF9fbnB0ciwgKGNoYXIgKiopIF9fbnVsbCAsIDEwKTsKfQoKCgoKCiAKCgpleHRlcm4gY2hhciAq bDY0YSAgKGxvbmcgaW50IF9fbikgIHRocm93ICgpICA7CgogCmV4dGVybiBsb25nIGludCBhNjRs ICAoX19jb25zdCBjaGFyICpfX3MpICB0aHJvdyAoKSAgOwoKCiMgMSAiL3Vzci9pbmNsdWRlL3N5 cy90eXBlcy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgpleHRlcm4gIkMiIHsg CgoKCgp0eXBlZGVmIF9fdV9jaGFyIHVfY2hhcjsKdHlwZWRlZiBfX3Vfc2hvcnQgdV9zaG9ydDsK dHlwZWRlZiBfX3VfaW50IHVfaW50Owp0eXBlZGVmIF9fdV9sb25nIHVfbG9uZzsKdHlwZWRlZiBf X3F1YWRfdCBxdWFkX3Q7CnR5cGVkZWYgX191X3F1YWRfdCB1X3F1YWRfdDsKdHlwZWRlZiBfX2Zz aWRfdCBmc2lkX3Q7CgoKdHlwZWRlZiBfX2xvZmZfdCBsb2ZmX3Q7CgoKCnR5cGVkZWYgX19pbm9f dCBpbm9fdDsKCgoKCgoKCgoKCgp0eXBlZGVmIF9fZGV2X3QgZGV2X3Q7CgoKCgp0eXBlZGVmIF9f Z2lkX3QgZ2lkX3Q7CgoKCgp0eXBlZGVmIF9fbW9kZV90IG1vZGVfdDsKCgoKCnR5cGVkZWYgX19u bGlua190IG5saW5rX3Q7CgoKCgp0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CgoKCgoKCgoKCgoKCgoK CgoKdHlwZWRlZiBfX3BpZF90IHBpZF90OwoKCgoKdHlwZWRlZiBfX2lkX3QgaWRfdDsKCgoKdHlw ZWRlZiBfX3NzaXplX3Qgc3NpemVfdDsKCgoKCnR5cGVkZWYgX19kYWRkcl90IGRhZGRyX3Q7CnR5 cGVkZWYgX19jYWRkcl90IGNhZGRyX3Q7CgoKCnR5cGVkZWYgX19rZXlfdCBrZXlfdDsKCgoKCgoK CiMgMSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK CgoKCgoKCgoKIyA1MSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgojIDYyICIvdXNyL2luY2x1 ZGUvdGltZS5oIiAzCgoKCgoKCgoKIAp0eXBlZGVmIF9fdGltZV90IHRpbWVfdDsKCgoKCgojIDg5 ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCgojIDI3OSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIg MwoKCgojIDEyMyAiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIiAyIDMKCgoKIyAxICIvdXNyL2xp Yi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEg MwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK IAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4z L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxp Yi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIyAyODMg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IyAxMjYgIi91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCIgMiAzCgoKCiAKdHlwZWRlZiB1bnNpZ25l ZCBsb25nIGludCB1bG9uZzsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgdXNob3J0Owp0eXBl ZGVmIHVuc2lnbmVkIGludCB1aW50OwoKCiAKCiMgMTYwICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVz LmgiIDMKCgogCgoKCgoKCgp0eXBlZGVmIGludCBpbnQ4X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9k ZV9fICggIF9fUUlfXyApKSkgOwp0eXBlZGVmIGludCBpbnQxNl90IF9fYXR0cmlidXRlX18gKChf X21vZGVfXyAoICBfX0hJX18gKSkpIDsKdHlwZWRlZiBpbnQgaW50MzJfdCBfX2F0dHJpYnV0ZV9f ICgoX19tb2RlX18gKCAgX19TSV9fICkpKSA7CnR5cGVkZWYgaW50IGludDY0X3QgX19hdHRyaWJ1 dGVfXyAoKF9fbW9kZV9fICggIF9fRElfXyApKSkgOwoKCnR5cGVkZWYgdW5zaWduZWQgaW50IHVf aW50OF90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoICBfX1FJX18gKSkpIDsKdHlwZWRlZiB1 bnNpZ25lZCBpbnQgdV9pbnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoICBfX0hJX18g KSkpIDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQzMl90IF9fYXR0cmlidXRlX18gKChfX21v ZGVfXyAoICBfX1NJX18gKSkpIDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQ2NF90IF9fYXR0 cmlidXRlX18gKChfX21vZGVfXyAoICBfX0RJX18gKSkpIDsKCnR5cGVkZWYgaW50IHJlZ2lzdGVy X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX3dvcmRfXykpKTsKCgogCgoKCgoKCiAKIyAx ICIvdXNyL2luY2x1ZGUvZW5kaWFuLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoK CgoKCgoKCiAKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9lbmRpYW4uaCIgMSAzCiAKCgoKCgoKIyAz NSAiL3Vzci9pbmNsdWRlL2VuZGlhbi5oIiAyIDMKCgogCgoKCgoKCgoKCgoKCgojIDE5MiAiL3Vz ci9pbmNsdWRlL3N5cy90eXBlcy5oIiAyIDMKCgogCiMgMSAiL3Vzci9pbmNsdWRlL3N5cy9zZWxl Y3QuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgogCgoKIAojIDEgIi91c3IvaW5j bHVkZS9iaXRzL3NlbGVjdC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzNiAi L3Vzci9pbmNsdWRlL2JpdHMvc2VsZWN0LmgiIDMKCgoKCgoKCgoKCgoKIyA1NiAiL3Vzci9pbmNs dWRlL2JpdHMvc2VsZWN0LmgiIDMKCiMgNzIgIi91c3IvaW5jbHVkZS9iaXRzL3NlbGVjdC5oIiAz CgojIDMxICIvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oIiAyIDMKCgogCiMgMSAiL3Vzci9pbmNs dWRlL2JpdHMvc2lnc2V0LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgaW50 IF9fc2lnX2F0b21pY190OwoKIAoKCnR5cGVkZWYgc3RydWN0CiAgewogICAgdW5zaWduZWQgbG9u ZyBpbnQgX192YWxbKDEwMjQgLyAoOCAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKSkgXTsK ICB9IF9fc2lnc2V0X3Q7CgoKCgogCgoKCgoKIyAxMjUgIi91c3IvaW5jbHVkZS9iaXRzL3NpZ3Nl dC5oIiAzCgojIDM0ICIvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oIiAyIDMKCgogCgojIDEgIi91 c3IvaW5jbHVkZS90aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoK CiMgNTEgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKIyA2MiAiL3Vzci9pbmNsdWRlL3RpbWUu aCIgMwoKCgojIDczICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCgoKCgoKIAoKc3RydWN0IHRp bWVzcGVjCiAgewogICAgbG9uZyBpbnQgdHZfc2VjOwkJIAogICAgbG9uZyBpbnQgdHZfbnNlYzsJ CSAKICB9OwoKCgoKCiMgMjc5ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCiMgMzggIi91c3Iv aW5jbHVkZS9zeXMvc2VsZWN0LmgiIDIgMwoKCmV4dGVybiAiQyIgeyAKCiAKCgoKc3RydWN0IHRp bWV2YWw7Cgp0eXBlZGVmIF9fZmRfbWFzayBmZF9tYXNrOwoKIAp0eXBlZGVmIF9fZmRfc2V0IGZk X3NldDsKCiAKCgoKIAoKCgoKIAoKCgoKCgogCgoKCgpleHRlcm4gaW50IF9fc2VsZWN0ICAoaW50 IF9fbmZkcywgX19mZF9zZXQgKl9fcmVhZGZkcywKCQkJICBfX2ZkX3NldCAqX193cml0ZWZkcywg X19mZF9zZXQgKl9fZXhjZXB0ZmRzLAoJCQkgIHN0cnVjdCB0aW1ldmFsICpfX3RpbWVvdXQpICB0 aHJvdyAoKSAgOwpleHRlcm4gaW50IHNlbGVjdCAgKGludCBfX25mZHMsIF9fZmRfc2V0ICpfX3Jl YWRmZHMsCgkJCV9fZmRfc2V0ICpfX3dyaXRlZmRzLCBfX2ZkX3NldCAqX19leGNlcHRmZHMsCgkJ CXN0cnVjdCB0aW1ldmFsICpfX3RpbWVvdXQpICB0aHJvdyAoKSAgOwoKIyA5MSAiL3Vzci9pbmNs dWRlL3N5cy9zZWxlY3QuaCIgMwoKCn0gCgoKIyAxOTUgIi91c3IvaW5jbHVkZS9zeXMvdHlwZXMu aCIgMiAzCgoKIAojIDEgIi91c3IvaW5jbHVkZS9zeXMvc3lzbWFjcm9zLmgiIDEgMwogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgojIDQ3ICIvdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jv cy5oIiAzCgoKCiMgMTk4ICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDIgMwoKCgoKIAoKdHlw ZWRlZiBfX2Jsa2NudF90IGJsa2NudF90OwkgIAp0eXBlZGVmIF9fZnNibGtjbnRfdCBmc2Jsa2Nu dF90OyAgCnR5cGVkZWYgX19mc2ZpbGNudF90IGZzZmlsY250X3Q7ICAKCgoKCgoKCgoKCgoKfSAK CgojIDMzOSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAyIDMKCgogCgoKCiAKZXh0ZXJuIGludDMy X3QgcmFuZG9tICAodm9pZCkgIHRocm93ICgpICA7CgogCmV4dGVybiB2b2lkIHNyYW5kb20gICh1 bnNpZ25lZCBpbnQgX19zZWVkKSAgdGhyb3cgKCkgIDsKCiAKCgoKZXh0ZXJuIHZvaWQgKiAgaW5p dHN0YXRlICAodW5zaWduZWQgaW50IF9fc2VlZCwgdm9pZCAqICBfX3N0YXRlYnVmLAoJCQkgICAg ICAgc2l6ZV90IF9fc3RhdGVsZW4pICB0aHJvdyAoKSAgOwoKIAoKZXh0ZXJuIHZvaWQgKiAgc2V0 c3RhdGUgICh2b2lkICogIF9fc3RhdGVidWYpICB0aHJvdyAoKSAgOwoKCgogCgoKCnN0cnVjdCBy YW5kb21fZGF0YQogIHsKICAgIGludDMyX3QgKmZwdHI7CQkgCiAgICBpbnQzMl90ICpycHRyOwkJ IAogICAgaW50MzJfdCAqc3RhdGU7CQkgCiAgICBpbnQgcmFuZF90eXBlOwkJIAogICAgaW50IHJh bmRfZGVnOwkJIAogICAgaW50IHJhbmRfc2VwOwkJIAogICAgaW50MzJfdCAqZW5kX3B0cjsJCSAK ICB9OwoKZXh0ZXJuIGludCByYW5kb21fciAgKHN0cnVjdCByYW5kb21fZGF0YSAqX19yZXN0cmlj dCBfX2J1ZiwKCQkJICBpbnQzMl90ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSAgdGhyb3cgKCkgIDsK CmV4dGVybiBpbnQgc3JhbmRvbV9yICAodW5zaWduZWQgaW50IF9fc2VlZCwgc3RydWN0IHJhbmRv bV9kYXRhICpfX2J1ZikgIHRocm93ICgpICA7CgpleHRlcm4gaW50IGluaXRzdGF0ZV9yICAodW5z aWduZWQgaW50IF9fc2VlZCwKCQkJICAgICB2b2lkICogIF9fcmVzdHJpY3QgX19zdGF0ZWJ1ZiwK CQkJICAgICBzaXplX3QgX19zdGF0ZWxlbiwKCQkJICAgICBzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9f cmVzdHJpY3QgX19idWYpICB0aHJvdyAoKSAgOwoKZXh0ZXJuIGludCBzZXRzdGF0ZV9yICAodm9p ZCAqICBfX3Jlc3RyaWN0IF9fc3RhdGVidWYsCgkJCSAgICBzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9f cmVzdHJpY3QgX19idWYpICB0aHJvdyAoKSAgOwoKCgoKIApleHRlcm4gaW50IHJhbmQgICh2b2lk KSAgdGhyb3cgKCkgIDsKIApleHRlcm4gdm9pZCBzcmFuZCAgKHVuc2lnbmVkIGludCBfX3NlZWQp ICB0aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIGludCByYW5kX3IgICh1bnNpZ25lZCBpbnQgKl9fc2Vl ZCkgIHRocm93ICgpICA7CgoKCgogCgogCmV4dGVybiBkb3VibGUgZHJhbmQ0OCAgKHZvaWQpICB0 aHJvdyAoKSAgOwpleHRlcm4gZG91YmxlIGVyYW5kNDggICh1bnNpZ25lZCBzaG9ydCBpbnQgX194 c3ViaVszXSkgIHRocm93ICgpICA7CgogCmV4dGVybiBsb25nIGludCBscmFuZDQ4ICAodm9pZCkg IHRocm93ICgpICA7CmV4dGVybiBsb25nIGludCBucmFuZDQ4ICAodW5zaWduZWQgc2hvcnQgaW50 IF9feHN1YmlbM10pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gbG9uZyBpbnQgbXJhbmQ0OCAgKHZv aWQpICB0aHJvdyAoKSAgOwpleHRlcm4gbG9uZyBpbnQganJhbmQ0OCAgKHVuc2lnbmVkIHNob3J0 IGludCBfX3hzdWJpWzNdKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgc3JhbmQ0OCAgKGxv bmcgaW50IF9fc2VlZHZhbCkgIHRocm93ICgpICA7CmV4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQg KnNlZWQ0OCAgKHVuc2lnbmVkIHNob3J0IGludCBfX3NlZWQxNnZbM10pICB0aHJvdyAoKSAgOwpl eHRlcm4gdm9pZCBsY29uZzQ4ICAodW5zaWduZWQgc2hvcnQgaW50IF9fcGFyYW1bN10pICB0aHJv dyAoKSAgOwoKIApzdHJ1Y3QgZHJhbmQ0OF9kYXRhCiAgewogICAgdW5zaWduZWQgc2hvcnQgaW50 IHhbM107CSAKICAgIHVuc2lnbmVkIHNob3J0IGludCBhWzNdOwkgCiAgICB1bnNpZ25lZCBzaG9y dCBpbnQgYzsJIAogICAgdW5zaWduZWQgc2hvcnQgaW50IG9sZF94WzNdOyAgCiAgICBpbnQgaW5p dDsJCQkgCiAgfTsKCgogCmV4dGVybiBpbnQgZHJhbmQ0OF9yICAoc3RydWN0IGRyYW5kNDhfZGF0 YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKCQkJICAgZG91YmxlICpfX3Jlc3RyaWN0IF9fcmVzdWx0 KSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBlcmFuZDQ4X3IgICh1bnNpZ25lZCBzaG9ydCBpbnQg X194c3ViaVszXSwKCQkJICAgc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZl ciwKCQkJICAgZG91YmxlICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSAgdGhyb3cgKCkgIDsKCiAKZXh0 ZXJuIGludCBscmFuZDQ4X3IgIChzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVm ZmVyLAoJCQkgICBsb25nIGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkgIHRocm93ICgpICA7CmV4 dGVybiBpbnQgbnJhbmQ0OF9yICAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10sCgkJCSAg IHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCgkJCSAgIGxvbmcgaW50 ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBtcmFuZDQ4 X3IgIChzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAoJCQkgICBsb25n IGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkgIHRocm93ICgpICA7CmV4dGVybiBpbnQganJhbmQ0 OF9yICAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10sCgkJCSAgIHN0cnVjdCBkcmFuZDQ4 X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCgkJCSAgIGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9f cmVzdWx0KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBzcmFuZDQ4X3IgIChsb25nIGludCBf X3NlZWR2YWwsIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSAgdGhyb3cgKCkgIDsKCmV4 dGVybiBpbnQgc2VlZDQ4X3IgICh1bnNpZ25lZCBzaG9ydCBpbnQgX19zZWVkMTZ2WzNdLAoJCQkg IHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSAgdGhyb3cgKCkgIDsKCmV4dGVybiBpbnQg bGNvbmc0OF9yICAodW5zaWduZWQgc2hvcnQgaW50IF9fcGFyYW1bN10sCgkJCSAgIHN0cnVjdCBk cmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSAgdGhyb3cgKCkgIDsKCgoKCgoKCiAKZXh0ZXJuIHZvaWQg KiAgbWFsbG9jICAoc2l6ZV90IF9fc2l6ZSkgIHRocm93ICgpICA7CiAKZXh0ZXJuIHZvaWQgKiAg Y2FsbG9jICAoc2l6ZV90IF9fbm1lbWIsIHNpemVfdCBfX3NpemUpICB0aHJvdyAoKSAgOwoKCgog CgpleHRlcm4gdm9pZCAqICByZWFsbG9jICAodm9pZCAqICBfX3B0ciwgc2l6ZV90IF9fc2l6ZSkg IHRocm93ICgpICA7CiAKZXh0ZXJuIHZvaWQgZnJlZSAgKHZvaWQgKiAgX19wdHIpICB0aHJvdyAo KSAgOwoKCiAKZXh0ZXJuIHZvaWQgY2ZyZWUgICh2b2lkICogIF9fcHRyKSAgdGhyb3cgKCkgIDsK CgoKIyAxICIvdXNyL2luY2x1ZGUvYWxsb2NhLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1 ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoK CiMgNjEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVk ZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgoj IDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJh a2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgojIDI3MSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRl Zi5oIiAzCgoKIyAyODMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1 LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKIyAyNSAiL3Vzci9pbmNsdWRlL2FsbG9jYS5oIiAyIDMKCgpleHRlcm4g IkMiIHsgCgogCgoKIApleHRlcm4gdm9pZCAqICBhbGxvY2EgIChzaXplX3QgX19zaXplKSAgdGhy b3cgKCkgIDsKCgoKCgp9IAoKCiMgNDkyICIvdXNyL2luY2x1ZGUvc3RkbGliLmgiIDIgMwoKCgoK IApleHRlcm4gdm9pZCAqICB2YWxsb2MgIChzaXplX3QgX19zaXplKSAgdGhyb3cgKCkgIDsKCgoK IApleHRlcm4gdm9pZCBhYm9ydCAgKHZvaWQpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChf X25vcmV0dXJuX18pKTsKCgogCmV4dGVybiBpbnQgYXRleGl0ICAodm9pZCAoKl9fZnVuYykgKHZv aWQpKSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4gaW50IF9fb25fZXhpdCAgKHZvaWQgKCpfX2Z1 bmMpIChpbnQgX19zdGF0dXMsIHZvaWQgKiAgX19hcmcpLAoJCQkgICB2b2lkICogIF9fYXJnKSAg dGhyb3cgKCkgIDsKZXh0ZXJuIGludCBvbl9leGl0ICAodm9pZCAoKl9fZnVuYykgKGludCBfX3N0 YXR1cywgdm9pZCAqICBfX2FyZyksCgkJCSB2b2lkICogIF9fYXJnKSAgdGhyb3cgKCkgIDsKCgog CgoKZXh0ZXJuIHZvaWQgZXhpdCAgKGludCBfX3N0YXR1cykgIHRocm93ICgpICAgX19hdHRyaWJ1 dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKCgoKCgoKCiAKZXh0ZXJuIGNoYXIgKmdldGVudiAgKF9f Y29uc3QgY2hhciAqX19uYW1lKSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBjaGFyICpfX3NlY3Vy ZV9nZXRlbnYgIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgIHRocm93ICgpICA7CgoKIAogCgpleHRl cm4gaW50IHB1dGVudiAgKGNoYXIgKl9fc3RyaW5nKSAgdGhyb3cgKCkgIDsKCgoKIAoKZXh0ZXJu IGludCBzZXRlbnYgIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgX19jb25zdCBjaGFyICpfX3ZhbHVl LAoJCQlpbnQgX19yZXBsYWNlKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgdW5zZXRlbnYg IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgIHRocm93ICgpICA7CgoKCiAKCgpleHRlcm4gaW50IGNs ZWFyZW52ICAodm9pZCkgIHRocm93ICgpICA7CgoKCgogCgoKCmV4dGVybiBjaGFyICpta3RlbXAg IChjaGFyICpfX3RlbXBsYXRlKSAgdGhyb3cgKCkgIDsKCiAKCgoKCmV4dGVybiBpbnQgbWtzdGVt cCAgKGNoYXIgKl9fdGVtcGxhdGUpICB0aHJvdyAoKSAgOwoKCgogCmV4dGVybiBpbnQgc3lzdGVt ICAoX19jb25zdCBjaGFyICpfX2NvbW1hbmQpICB0aHJvdyAoKSAgOwoKCgoKCgoKCgoKIAoKCgoK CmV4dGVybiBjaGFyICpyZWFscGF0aCAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUs CgkJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpICB0aHJvdyAoKSAgOwoKCgogCgoK dHlwZWRlZiBpbnQgKCpfX2NvbXBhcl9mbl90KSAgKF9fY29uc3Qgdm9pZCAqICwgX19jb25zdCB2 b2lkICogKSAgOwoKCgoKCgogCgpleHRlcm4gdm9pZCAqICBic2VhcmNoICAoX19jb25zdCB2b2lk ICogIF9fa2V5LCBfX2NvbnN0IHZvaWQgKiAgX19iYXNlLAoJCQkgICAgICAgc2l6ZV90IF9fbm1l bWIsIHNpemVfdCBfX3NpemUsCgkJCSAgICAgICBfX2NvbXBhcl9mbl90IF9fY29tcGFyKSAgOwoK IAoKZXh0ZXJuIHZvaWQgcXNvcnQgICh2b2lkICogIF9fYmFzZSwgc2l6ZV90IF9fbm1lbWIsIHNp emVfdCBfX3NpemUsCgkJCSAgX19jb21wYXJfZm5fdCBfX2NvbXBhcikgIDsKCgogCmV4dGVybiBp bnQgYWJzICAoaW50IF9feCkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykp OwpleHRlcm4gbG9uZyBpbnQgbGFicyAgKGxvbmcgaW50IF9feCkgIHRocm93ICgpICAgX19hdHRy aWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKCgoKCgogCgogCmV4dGVybiBkaXZfdCBkaXYgIChpbnQg X19udW1lciwgaW50IF9fZGVub20pICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0 X18pKTsKZXh0ZXJuIGxkaXZfdCBsZGl2ICAobG9uZyBpbnQgX19udW1lciwgbG9uZyBpbnQgX19k ZW5vbSkgIHRocm93ICgpICAKICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CgoKCgoK CgoKIAoKCiAKCgpleHRlcm4gY2hhciAqZWN2dCAgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGln aXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAoJCQlpbnQgKl9fcmVzdHJpY3QgX19zaWduKSAg dGhyb3cgKCkgIDsKCiAKCgpleHRlcm4gY2hhciAqZmN2dCAgKGRvdWJsZSBfX3ZhbHVlLCBpbnQg X19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAoJCQlpbnQgKl9fcmVzdHJpY3QgX19z aWduKSAgdGhyb3cgKCkgIDsKCiAKCgpleHRlcm4gY2hhciAqZ2N2dCAgKGRvdWJsZSBfX3ZhbHVl LCBpbnQgX19uZGlnaXQsIGNoYXIgKl9fYnVmKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGNoYXIg KnFlY3Z0ICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBfX25kaWdpdCwKCQkJIGludCAqX19y ZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduKSAgdGhyb3cgKCkgIDsKZXh0 ZXJuIGNoYXIgKnFmY3Z0ICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBfX25kaWdpdCwKCQkJ IGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduKSAgdGhyb3cg KCkgIDsKZXh0ZXJuIGNoYXIgKnFnY3Z0ICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBfX25k aWdpdCwgY2hhciAqX19idWYpICB0aHJvdyAoKSAgOwoKCgogCgpleHRlcm4gaW50IGVjdnRfciAg KGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAoJ CQlpbnQgKl9fcmVzdHJpY3QgX19zaWduLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAoJCQlzaXpl X3QgX19sZW4pICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IGZjdnRfciAgKGRvdWJsZSBfX3ZhbHVl LCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAoJCQlpbnQgKl9fcmVzdHJp Y3QgX19zaWduLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAoJCQlzaXplX3QgX19sZW4pICB0aHJv dyAoKSAgOwoKZXh0ZXJuIGludCBxZWN2dF9yICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBf X25kaWdpdCwKCQkJIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19z aWduLAoJCQkgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKSAgdGhyb3cgKCkg IDsKZXh0ZXJuIGludCBxZmN2dF9yICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBfX25kaWdp dCwKCQkJIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduLAoJ CQkgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKSAgdGhyb3cgKCkgIDsKCgoK CiAKCmV4dGVybiBpbnQgbWJsZW4gIChfX2NvbnN0IGNoYXIgKl9fcywgc2l6ZV90IF9fbikgIHRo cm93ICgpICA7CiAKCmV4dGVybiBpbnQgbWJ0b3djICAod2NoYXJfdCAqX19yZXN0cmljdCBfX3B3 YywKCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbikgIHRocm93ICgp ICA7CiAKCmV4dGVybiBpbnQgd2N0b21iICAoY2hhciAqX19zLCB3Y2hhcl90IF9fd2NoYXIpICB0 aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIHNpemVfdCBtYnN0b3djcyAgKHdjaGFyX3QgKl9fcmVzdHJp Y3QgIF9fcHdjcywKCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3Qg X19uKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gc2l6ZV90IHdjc3RvbWJzICAoY2hhciAqX19yZXN0 cmljdCBfX3MsCgkJCSAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcHdjcywgc2l6 ZV90IF9fbikgIHRocm93ICgpICA7CgoKCiAKCgoKZXh0ZXJuIGludCBycG1hdGNoICAoX19jb25z dCBjaGFyICpfX3Jlc3BvbnNlKSAgdGhyb3cgKCkgIDsKCgoKIyA3MzIgIi91c3IvaW5jbHVkZS9z dGRsaWIuaCIgMwoKCgojIDc1NiAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCgoKIyA3NjYgIi91 c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwoKCgoKCn0gCgoKIyA1MCAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9h bGdvYmFzZS5oIiAyIDMKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCgoKCgoKIAoKIAoKCgoKIAoK CiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoK CgoKCiAKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKdHlwZWRlZiBpbnQgcHRyZGlmZl90OwoKCgoK CgoKCgogCgoKCgogCgogCgoKIyAxODggIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCiAKCgoKCiAKCgojIDI2OSAiL3Vz ci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5o IiAzCgoKCgoKCgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoK CgogCgoKCgoKCgojIDUxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45 NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIgMwoKIyAxICIv dXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvbmV3Lmgi IDEgMwogCgoKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1 LjMvaW5jbHVkZS9uZXciIDEgMwogCiAKCgoKCiNwcmFnbWEgaW50ZXJmYWNlICJuZXciCiMgMSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRl Zi5oIiAxIDMKIyAzNDIgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1 LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKIyA4ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJh a2UtbGludXgvMi45NS4zL2luY2x1ZGUvbmV3IiAyIDMKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL2V4Y2VwdGlvbiIgMSAzCiAKIAoKCgoK I3ByYWdtYSBpbnRlcmZhY2UgImV4Y2VwdGlvbiIKCmV4dGVybiAiQysrIiB7CgpuYW1lc3BhY2Ug c3RkIHsKCmNsYXNzIGV4Y2VwdGlvbiB7CnB1YmxpYzoKICBleGNlcHRpb24gKCkgeyB9CiAgdmly dHVhbCB+ZXhjZXB0aW9uICgpIHsgfQogIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCAoKSBjb25z dDsKfTsKCmNsYXNzIGJhZF9leGNlcHRpb24gOiBwdWJsaWMgZXhjZXB0aW9uIHsKcHVibGljOgog IGJhZF9leGNlcHRpb24gKCkgeyB9CiAgdmlydHVhbCB+YmFkX2V4Y2VwdGlvbiAoKSB7IH0KfTsK CnR5cGVkZWYgdm9pZCAoKnRlcm1pbmF0ZV9oYW5kbGVyKSAoKTsKdHlwZWRlZiB2b2lkICgqdW5l eHBlY3RlZF9oYW5kbGVyKSAoKTsKCnRlcm1pbmF0ZV9oYW5kbGVyIHNldF90ZXJtaW5hdGUgKHRl cm1pbmF0ZV9oYW5kbGVyKTsKdm9pZCB0ZXJtaW5hdGUgKCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9y ZXR1cm5fXykpOwp1bmV4cGVjdGVkX2hhbmRsZXIgc2V0X3VuZXhwZWN0ZWQgKHVuZXhwZWN0ZWRf aGFuZGxlcik7CnZvaWQgdW5leHBlY3RlZCAoKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9f KSk7CmJvb2wgdW5jYXVnaHRfZXhjZXB0aW9uICgpOwoKfSAgCgp9ICAKCgojIDkgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9uZXciIDIgMwoKCmV4 dGVybiAiQysrIiB7CgpuYW1lc3BhY2Ugc3RkIHsKCiAgY2xhc3MgYmFkX2FsbG9jIDogcHVibGlj IGV4Y2VwdGlvbiB7CiAgcHVibGljOgogICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29u c3QgdGhyb3coKSB7IHJldHVybiAiYmFkX2FsbG9jIjsgfQogIH07CgogIHN0cnVjdCBub3Rocm93 X3Qge307CiAgZXh0ZXJuIGNvbnN0IG5vdGhyb3dfdCBub3Rocm93OwogIHR5cGVkZWYgdm9pZCAo Km5ld19oYW5kbGVyKSgpOwogIG5ld19oYW5kbGVyIHNldF9uZXdfaGFuZGxlciAobmV3X2hhbmRs ZXIpOwoKfSAgCgogCnZvaWQgKm9wZXJhdG9yIG5ldyAoc2l6ZV90KSB0aHJvdyAoc3RkOjpiYWRf YWxsb2MpOwp2b2lkICpvcGVyYXRvciBuZXdbXSAoc2l6ZV90KSB0aHJvdyAoc3RkOjpiYWRfYWxs b2MpOwp2b2lkIG9wZXJhdG9yIGRlbGV0ZSAodm9pZCAqKSB0aHJvdygpOwp2b2lkIG9wZXJhdG9y IGRlbGV0ZVtdICh2b2lkICopIHRocm93KCk7CnZvaWQgKm9wZXJhdG9yIG5ldyAoc2l6ZV90LCBj b25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCk7CnZvaWQgKm9wZXJhdG9yIG5ld1tdIChzaXpl X3QsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKdm9pZCBvcGVyYXRvciBkZWxldGUg KHZvaWQgKiwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpOwp2b2lkIG9wZXJhdG9yIGRl bGV0ZVtdICh2b2lkICosIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKCiAKaW5saW5l IHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHZvaWQgKnBsYWNlKSB0aHJvdygpIHsgcmV0dXJu IHBsYWNlOyB9CmlubGluZSB2b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3QsIHZvaWQgKnBsYWNl KSB0aHJvdygpIHsgcmV0dXJuIHBsYWNlOyB9Cn0gIAoKCiMgNiAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL25ldy5oIiAyIDMKCgp1c2luZyBzdGQ6 Om5ld19oYW5kbGVyOwp1c2luZyBzdGQ6OnNldF9uZXdfaGFuZGxlcjsKCgojIDUyICIvdXNyL2xp Yi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUv ZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIgMwoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvaW9zdHJlYW0uaCIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCiMgMSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0cmVhbWJ1Zi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CiNwcmFnbWEgaW50ZXJmYWNlCgoKICAgCgoKCmV4dGVybiAiQyIgewoKfQogCgojIDEgIi91c3Iv bGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCiAKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCnZvaWQgdmFf ZW5kIChfX2dudWNfdmFfbGlzdCk7CQkgCgoKIAoKCgogCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgogCiAKCgoKCgoKCgoKCgoKCiMgMTc1ICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkYXJnLmgiIDMKCgogCgoKCgogCgog CgogCgp0eXBlZGVmIF9fZ251Y192YV9saXN0IHZhX2xpc3Q7CgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCiMgNDAgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4v Li4vLi4vLi4vaW5jbHVkZS9nKystMy9zdHJlYW1idWYuaCIgMiAzCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgpleHRlcm4gIkMrKyIgewpjbGFzcyBpc3RyZWFtOyAgCmNsYXNzIG9zdHJlYW07IGNs YXNzIHN0cmVhbWJ1ZjsKCiAKCgoKCnR5cGVkZWYgX19vZmY2NF90ICAgc3RyZWFtb2ZmOwp0eXBl ZGVmIF9fb2ZmNjRfdCAgIHN0cmVhbXBvczsKCgoKCnR5cGVkZWYgX19zc2l6ZV90ICAgc3RyZWFt c2l6ZTsKCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX2ZtdGZsYWdzOwp0eXBlZGVmIHVuc2lnbmVk IGNoYXIgX19pb3N0YXRlOwoKc3RydWN0IF9pb3NfZmllbGRzCnsgIAogICAgc3RyZWFtYnVmICpf c3RyYnVmOwogICAgb3N0cmVhbSogX3RpZTsKICAgIGludCBfd2lkdGg7CiAgICBfX2ZtdGZsYWdz IF9mbGFnczsKICAgIHdjaGFyX3QgICBfZmlsbDsKICAgIF9faW9zdGF0ZSBfc3RhdGU7CiAgICBf X2lvc3RhdGUgX2V4Y2VwdGlvbnM7CiAgICBpbnQgX3ByZWNpc2lvbjsKCiAgICB2b2lkICpfYXJy YXlzOyAgCn07CgoKCgoKCgoKCgoKCgoKCiMgMTI0ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RyZWFtYnVmLmgi IDMKCgpjbGFzcyBpb3MgOiBwdWJsaWMgX2lvc19maWVsZHMgewogIGlvcyYgb3BlcmF0b3I9KGlv cyYpOyAgIAogIGlvcyAoY29uc3QgaW9zJik7ICAKICBwdWJsaWM6CiAgICB0eXBlZGVmIF9fZm10 ZmxhZ3MgZm10ZmxhZ3M7CiAgICB0eXBlZGVmIGludCBpb3N0YXRlOwogICAgdHlwZWRlZiBpbnQg b3Blbm1vZGU7CiAgICB0eXBlZGVmIF9fc3NpemVfdCAgIHN0cmVhbXNpemU7CiAgICBlbnVtIGlv X3N0YXRlIHsKCWdvb2RiaXQgPSAwICwKCWVvZmJpdCA9IDEgLAoJZmFpbGJpdCA9IDIgLAoJYmFk Yml0ID0gNCAgfTsKICAgIGVudW0gb3Blbl9tb2RlIHsKCWluID0gMSAsCglvdXQgPSAyICwKCWF0 ZSA9IDQgLAoJYXBwID0gOCAsCgl0cnVuYyA9IDE2ICwKCW5vY3JlYXRlID0gMzIgLAoJbm9yZXBs YWNlID0gNjQgLAoJYmluID0gMTI4ICwgIAoJYmluYXJ5ID0gMTI4ICB9OwogICAgZW51bSBzZWVr X2RpciB7IGJlZywgY3VyLCBlbmR9OwogICAgdHlwZWRlZiBlbnVtIHNlZWtfZGlyIHNlZWtkaXI7 CiAgICAgCiAgICBlbnVtIHsgc2tpcHdzPSAwMSAsCgkgICBsZWZ0PSAwMiAsIHJpZ2h0PSAwNCAs IGludGVybmFsPSAwMTAgLAoJICAgZGVjPSAwMjAgLCBvY3Q9IDA0MCAsIGhleD0gMDEwMCAsCgkg ICBzaG93YmFzZT0gMDIwMCAsIHNob3dwb2ludD0gMDQwMCAsCgkgICB1cHBlcmNhc2U9IDAxMDAw ICwgc2hvd3Bvcz0gMDIwMDAgLAoJICAgc2NpZW50aWZpYz0gMDQwMDAgLCBmaXhlZD0gMDEwMDAw ICwKCSAgIHVuaXRidWY9IDAyMDAwMCAsIHN0ZGlvPSAwNDAwMDAgCgoKCgkgICB9OwogICAgZW51 bSB7ICAKCWJhc2VmaWVsZD1kZWMrb2N0K2hleCwKCWZsb2F0ZmllbGQgPSBzY2llbnRpZmljK2Zp eGVkLAoJYWRqdXN0ZmllbGQgPSBsZWZ0K3JpZ2h0K2ludGVybmFsCiAgICB9OwoKIyAxNzcgIi91 c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5j bHVkZS9nKystMy9zdHJlYW1idWYuaCIgMwoKCiAgICBvc3RyZWFtKiB0aWUoKSBjb25zdCB7IHJl dHVybiBfdGllOyB9CiAgICBvc3RyZWFtKiB0aWUob3N0cmVhbSogdmFsKSB7IG9zdHJlYW0qIHNh dmU9X3RpZTsgX3RpZT12YWw7IHJldHVybiBzYXZlOyB9CgogICAgIAogICAgd2NoYXJfdCAgIGZp bGwoKSBjb25zdCB7IHJldHVybiBfZmlsbDsgfQogICAgd2NoYXJfdCAgIGZpbGwod2NoYXJfdCAg IG5ld2YpCgl7d2NoYXJfdCAgIG9sZGYgPSBfZmlsbDsgX2ZpbGwgPSBuZXdmOyByZXR1cm4gb2xk Zjt9CiAgICBmbXRmbGFncyBmbGFncygpIGNvbnN0IHsgcmV0dXJuIF9mbGFnczsgfQogICAgZm10 ZmxhZ3MgZmxhZ3MoZm10ZmxhZ3MgbmV3X3ZhbCkgewoJZm10ZmxhZ3Mgb2xkX3ZhbCA9IF9mbGFn czsgX2ZsYWdzID0gbmV3X3ZhbDsgcmV0dXJuIG9sZF92YWw7IH0KICAgIGludCBwcmVjaXNpb24o KSBjb25zdCB7IHJldHVybiBfcHJlY2lzaW9uOyB9CiAgICBpbnQgcHJlY2lzaW9uKGludCBuZXdw KSB7Cgl1bnNpZ25lZCBzaG9ydCBvbGRwID0gX3ByZWNpc2lvbjsgX3ByZWNpc2lvbiA9ICh1bnNp Z25lZCBzaG9ydCluZXdwOwoJcmV0dXJuIG9sZHA7IH0KICAgIGZtdGZsYWdzIHNldGYoZm10Zmxh Z3MgdmFsKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzIHw9IHZhbDsgcmV0 dXJuIG9sZGJpdHM7IH0KICAgIGZtdGZsYWdzIHNldGYoZm10ZmxhZ3MgdmFsLCBmbXRmbGFncyBt YXNrKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzID0gKF9mbGFncyAmIH5t YXNrKSB8ICh2YWwgJiBtYXNrKTsgcmV0dXJuIG9sZGJpdHM7IH0KICAgIGZtdGZsYWdzIHVuc2V0 ZihmbXRmbGFncyBtYXNrKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzICY9 IH5tYXNrOyByZXR1cm4gb2xkYml0czsgfQogICAgaW50IHdpZHRoKCkgY29uc3QgeyByZXR1cm4g X3dpZHRoOyB9CiAgICBpbnQgd2lkdGgoaW50IHZhbCkgeyBpbnQgc2F2ZSA9IF93aWR0aDsgX3dp ZHRoID0gdmFsOyByZXR1cm4gc2F2ZTsgfQoKCgoKICAgIHZvaWQgX3Rocm93X2ZhaWx1cmUoKSBj b25zdCB7IH0KCiAgICB2b2lkIGNsZWFyKGlvc3RhdGUgc3RhdGUgPSAwKSB7Cglfc3RhdGUgPSBf c3RyYnVmID8gc3RhdGUgOiBzdGF0ZXxiYWRiaXQ7CglpZiAoX3N0YXRlICYgX2V4Y2VwdGlvbnMp IF90aHJvd19mYWlsdXJlKCk7IH0KICAgIHZvaWQgc2V0KGlvc3RhdGUgZmxhZykgeyBfc3RhdGUg fD0gZmxhZzsKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQog ICAgdm9pZCBzZXRzdGF0ZShpb3N0YXRlIGZsYWcpIHsgX3N0YXRlIHw9IGZsYWc7ICAKCWlmIChf c3RhdGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQogICAgaW50IGdvb2QoKSBj b25zdCB7IHJldHVybiBfc3RhdGUgPT0gMDsgfQogICAgaW50IGVvZigpIGNvbnN0IHsgcmV0dXJu IF9zdGF0ZSAmIGlvczo6ZW9mYml0OyB9CiAgICBpbnQgZmFpbCgpIGNvbnN0IHsgcmV0dXJuIF9z dGF0ZSAmIChpb3M6OmJhZGJpdHxpb3M6OmZhaWxiaXQpOyB9CiAgICBpbnQgYmFkKCkgY29uc3Qg eyByZXR1cm4gX3N0YXRlICYgaW9zOjpiYWRiaXQ7IH0KICAgIGlvc3RhdGUgcmRzdGF0ZSgpIGNv bnN0IHsgcmV0dXJuIF9zdGF0ZTsgfQogICAgb3BlcmF0b3Igdm9pZCooKSBjb25zdCB7IHJldHVy biBmYWlsKCkgPyAodm9pZCopMCA6ICh2b2lkKikoLTEpOyB9CiAgICBpbnQgb3BlcmF0b3IhKCkg Y29uc3QgeyByZXR1cm4gZmFpbCgpOyB9CiAgICBpb3N0YXRlIGV4Y2VwdGlvbnMoKSBjb25zdCB7 IHJldHVybiBfZXhjZXB0aW9uczsgfQogICAgdm9pZCBleGNlcHRpb25zKGlvc3RhdGUgZW5hYmxl KSB7CglfZXhjZXB0aW9ucyA9IGVuYWJsZTsKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9ucykgX3Ro cm93X2ZhaWx1cmUoKTsgfQoKICAgIHN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdCB7IHJldHVybiBf c3RyYnVmOyB9CiAgICBzdHJlYW1idWYqIHJkYnVmKHN0cmVhbWJ1ZiAqX3MpIHsKICAgICAgc3Ry ZWFtYnVmICpfb2xkID0gX3N0cmJ1ZjsgX3N0cmJ1ZiA9IF9zOyBjbGVhciAoKTsgcmV0dXJuIF9v bGQ7IH0KCiAgICBzdGF0aWMgaW50IHN5bmNfd2l0aF9zdGRpbyhpbnQgb24pOwogICAgc3RhdGlj IHZvaWQgc3luY193aXRoX3N0ZGlvKCkgeyBzeW5jX3dpdGhfc3RkaW8oMSk7IH0KICAgIHN0YXRp YyBmbXRmbGFncyBiaXRhbGxvYygpOwogICAgc3RhdGljIGludCB4YWxsb2MoKTsKICAgIHZvaWQq JiBwd29yZChpbnQpOwogICAgdm9pZCogcHdvcmQoaW50KSBjb25zdDsKICAgIGxvbmcmIGl3b3Jk KGludCk7CiAgICBsb25nIGl3b3JkKGludCkgY29uc3Q7CgoKCgoKCgoKCiAgICAgCiAgICBjbGFz cyBJbml0IHsKICAgIHB1YmxpYzoKICAgICAgSW5pdCAoKSB7IH0KICAgIH07CgogIHByb3RlY3Rl ZDoKICAgIGlubGluZSBpb3Moc3RyZWFtYnVmKiBzYiA9IDAsIG9zdHJlYW0qIHRpZV90byA9IDAp OwogICAgaW5saW5lIHZpcnR1YWwgfmlvcygpOwogICAgaW5saW5lIHZvaWQgaW5pdChzdHJlYW1i dWYqIHNiLCBvc3RyZWFtKiB0aWUgPSAwKTsKfTsKCgoKCnR5cGVkZWYgaW9zOjpzZWVrX2RpciBf c2Vla19kaXI7CgoKIAogCiAKIAogCgogCiAKY2xhc3Mgc3RyZWFtbWFya2VyIDogcHJpdmF0ZSBf SU9fbWFya2VyIHsKICAgIGZyaWVuZCBjbGFzcyBzdHJlYW1idWY7CiAgICB2b2lkIHNldF9vZmZz ZXQoaW50IG9mZnNldCkgeyBfcG9zID0gb2Zmc2V0OyB9CiAgcHVibGljOgogICAgc3RyZWFtbWFy a2VyKHN0cmVhbWJ1ZiAqc2IpOwogICAgfnN0cmVhbW1hcmtlcigpOwogICAgaW50IHNhdmluZygp IHsgcmV0dXJuICAxOyB9CiAgICBpbnQgZGVsdGEoc3RyZWFtbWFya2VyJik7CiAgICBpbnQgZGVs dGEoKTsKfTsKCnN0cnVjdCBzdHJlYW1idWYgOiBwdWJsaWMgX0lPX0ZJTEUgeyAgCiAgICBmcmll bmQgY2xhc3MgaW9zOwogICAgZnJpZW5kIGNsYXNzIGlzdHJlYW07CiAgICBmcmllbmQgY2xhc3Mg b3N0cmVhbTsKICAgIGZyaWVuZCBjbGFzcyBzdHJlYW1tYXJrZXI7CiAgICBjb25zdCB2b2lkICom X3Z0YWJsZSgpIHsgcmV0dXJuICooY29uc3Qgdm9pZCoqKSgoX0lPX0ZJTEUqKXRoaXMgKyAxKTsg fQogIHByb3RlY3RlZDoKICAgIHN0YXRpYyBzdHJlYW1idWYqIF9saXN0X2FsbDsgIAogICAgX0lP X0ZJTEUqJiB4Y2hhaW4oKSB7IHJldHVybiBfY2hhaW47IH0KICAgIHZvaWQgX3VuX2xpbmsoKTsK ICAgIHZvaWQgX2xpbmtfaW4oKTsKICAgIGNoYXIqIGdwdHIoKSBjb25zdAogICAgICB7IHJldHVy biBfZmxhZ3MgICYgMHgxMDAgID8gX0lPX3NhdmVfYmFzZSA6IF9JT19yZWFkX3B0cjsgfQogICAg Y2hhciogcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9JT193cml0ZV9wdHI7IH0KICAgIGNoYXIqIGVn cHRyKCkgY29uc3QKICAgICAgeyByZXR1cm4gX2ZsYWdzICAmIDB4MTAwICA/IF9JT19zYXZlX2Vu ZCA6IF9JT19yZWFkX2VuZDsgfQogICAgY2hhciogZXBwdHIoKSBjb25zdCB7IHJldHVybiBfSU9f d3JpdGVfZW5kOyB9CiAgICBjaGFyKiBwYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9JT193cml0ZV9i YXNlOyB9CiAgICBjaGFyKiBlYmFjaygpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9mbGFncyAgJiAw eDEwMCAgPyBfSU9fc2F2ZV9iYXNlIDogX0lPX3JlYWRfYmFzZTt9CiAgICBjaGFyKiBiYXNlKCkg Y29uc3QgeyByZXR1cm4gX0lPX2J1Zl9iYXNlOyB9CiAgICBjaGFyKiBlYnVmKCkgY29uc3QgeyBy ZXR1cm4gX0lPX2J1Zl9lbmQ7IH0KICAgIGludCBibGVuKCkgY29uc3QgeyByZXR1cm4gX0lPX2J1 Zl9lbmQgLSBfSU9fYnVmX2Jhc2U7IH0KICAgIHZvaWQgeHB1dF9jaGFyKGNoYXIgYykgeyAqX0lP X3dyaXRlX3B0cisrID0gYzsgfQogICAgaW50IHhmbGFncygpIHsgcmV0dXJuIF9mbGFncyA7IH0K ICAgIGludCB4ZmxhZ3MoaW50IGYpIHtpbnQgZmwgPSBfZmxhZ3MgOyBfZmxhZ3MgID0gZjsgcmV0 dXJuIGZsO30KICAgIHZvaWQgeHNldGZsYWdzKGludCBmKSB7IF9mbGFncyAgfD0gZjsgfQogICAg dm9pZCB4c2V0ZmxhZ3MoaW50IGYsIGludCBtYXNrKQogICAgICB7IF9mbGFncyAgPSAoX2ZsYWdz ICAmIH5tYXNrKSB8IChmICYgbWFzayk7IH0KICAgIHZvaWQgZ2J1bXAoaW50IG4pCiAgICAgIHsg X2ZsYWdzICAmIDB4MTAwICA/IChfSU9fc2F2ZV9iYXNlKz1uKTooX0lPX3JlYWRfcHRyKz1uKTt9 CiAgICB2b2lkIHBidW1wKGludCBuKSB7IF9JT193cml0ZV9wdHIgKz0gbjsgfQogICAgdm9pZCBz ZXRiKGNoYXIqIGIsIGNoYXIqIGViLCBpbnQgYT0wKTsKICAgIHZvaWQgc2V0cChjaGFyKiBwLCBj aGFyKiBlcCkKICAgICAgeyBfSU9fd3JpdGVfYmFzZT1fSU9fd3JpdGVfcHRyPXA7IF9JT193cml0 ZV9lbmQ9ZXA7IH0KICAgIHZvaWQgc2V0ZyhjaGFyKiBlYiwgY2hhciogZywgY2hhciAqZWcpIHsK ICAgICAgaWYgKF9mbGFncyAgJiAweDEwMCApIF9JT19mcmVlX2JhY2t1cF9hcmVhKHRoaXMpOyAK ICAgICAgX0lPX3JlYWRfYmFzZSA9IGViOyBfSU9fcmVhZF9wdHIgPSBnOyBfSU9fcmVhZF9lbmQg PSBlZzsgfQogICAgY2hhciAqc2hvcnRidWYoKSB7IHJldHVybiBfc2hvcnRidWY7IH0KCiAgICBp bnQgaW5fYmFja3VwKCkgeyByZXR1cm4gX2ZsYWdzICYgMHgxMDAgOyB9CiAgICAgCiAgICBjaGFy ICpHYmFzZSgpIHsgcmV0dXJuIGluX2JhY2t1cCgpID8gX0lPX3NhdmVfYmFzZSA6IF9JT19yZWFk X2Jhc2U7IH0KICAgICAKICAgIGNoYXIgKmVHcHRyKCkgeyByZXR1cm4gaW5fYmFja3VwKCkgPyBf SU9fc2F2ZV9lbmQgOiBfSU9fcmVhZF9lbmQ7IH0KICAgICAKICAgIGNoYXIgKkJiYXNlKCkgeyBy ZXR1cm4gaW5fYmFja3VwKCkgPyBfSU9fcmVhZF9iYXNlIDogX0lPX3NhdmVfYmFzZTsgfQogICAg Y2hhciAqQnB0cigpIHsgcmV0dXJuIF9JT19iYWNrdXBfYmFzZTsgfQogICAgIAogICAgY2hhciAq ZUJwdHIoKSB7IHJldHVybiBpbl9iYWNrdXAoKSA/IF9JT19yZWFkX2VuZCA6IF9JT19zYXZlX2Vu ZDsgfQogICAgY2hhciAqTmJhc2UoKSB7IHJldHVybiBfSU9fc2F2ZV9iYXNlOyB9CiAgICBjaGFy ICplTnB0cigpIHsgcmV0dXJuIF9JT19zYXZlX2VuZDsgfQogICAgaW50IGhhdmVfYmFja3VwKCkg eyByZXR1cm4gX0lPX3NhdmVfYmFzZSAhPSBfX251bGwgOyB9CiAgICBpbnQgaGF2ZV9tYXJrZXJz KCkgeyByZXR1cm4gX21hcmtlcnMgIT0gX19udWxsIDsgfQogICAgdm9pZCBmcmVlX2JhY2t1cF9h cmVhKCk7CiAgICB2b2lkIHVuc2F2ZV9tYXJrZXJzKCk7ICAKICAgIGludCBwdXRfbW9kZSgpIHsg cmV0dXJuIF9mbGFncyAmIDB4ODAwIDsgfQogICAgaW50IHN3aXRjaF90b19nZXRfbW9kZSgpOwog ICAgCiAgICBzdHJlYW1idWYoaW50IGZsYWdzPTApOwogIHB1YmxpYzoKICAgIHN0YXRpYyBpbnQg Zmx1c2hfYWxsKCk7CiAgICBzdGF0aWMgdm9pZCBmbHVzaF9hbGxfbGluZWJ1ZmZlcmVkKCk7ICAK ICAgIHZpcnR1YWwgfnN0cmVhbWJ1ZigpOwogICAgdmlydHVhbCBpbnQgb3ZlcmZsb3coaW50IGMg PSAoLTEpICk7ICAKICAgIHZpcnR1YWwgaW50IHVuZGVyZmxvdygpOyAgCiAgICB2aXJ0dWFsIGlu dCB1ZmxvdygpOyAgCiAgICB2aXJ0dWFsIGludCBwYmFja2ZhaWwoaW50IGMpOwogCiAgICB2aXJ0 dWFsIHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICB2 aXJ0dWFsIHN0cmVhbXNpemUgeHNnZXRuKGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICB2aXJ0 dWFsIHN0cmVhbXBvcyBzZWVrb2ZmKHN0cmVhbW9mZiwgX3NlZWtfZGlyLCBpbnQgbW9kZT1pb3M6 OmlufGlvczo6b3V0KTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHNlZWtwb3Moc3RyZWFtcG9zIHBv cywgaW50IG1vZGUgPSBpb3M6OmlufGlvczo6b3V0KTsKCiAgICBzdHJlYW1wb3MgcHVic2Vla29m ZihzdHJlYW1vZmYgbywgX3NlZWtfZGlyIGQsIGludCBtb2RlPWlvczo6aW58aW9zOjpvdXQpCiAg ICAgIHsgcmV0dXJuIF9JT19zZWVrb2ZmICh0aGlzLCBvLCBkLCBtb2RlKTsgfQogICAgc3RyZWFt cG9zIHB1YnNlZWtwb3Moc3RyZWFtcG9zIHBvcywgaW50IG1vZGUgPSBpb3M6OmlufGlvczo6b3V0 KQogICAgICB7IHJldHVybiBfSU9fc2Vla3BvcyAodGhpcywgcG9zLCBtb2RlKTsgfQogICAgc3Ry ZWFtcG9zIHNzZWVrb2ZmKHN0cmVhbW9mZiwgX3NlZWtfZGlyLCBpbnQgbW9kZT1pb3M6OmlufGlv czo6b3V0KTsKICAgIHN0cmVhbXBvcyBzc2Vla3BvcyhzdHJlYW1wb3MgcG9zLCBpbnQgbW9kZSA9 IGlvczo6aW58aW9zOjpvdXQpOwogICAgdmlydHVhbCBzdHJlYW1idWYqIHNldGJ1ZihjaGFyKiBw LCBpbnQgbGVuKTsKICAgIHZpcnR1YWwgaW50IHN5bmMoKTsKICAgIHZpcnR1YWwgaW50IGRvYWxs b2NhdGUoKTsKCiAgICBpbnQgc2Vla21hcmsoc3RyZWFtbWFya2VyJiBtYXJrLCBpbnQgZGVsdGEg PSAwKTsKICAgIGludCBzcHV0YmFja2MoY2hhciBjKTsKICAgIGludCBzdW5nZXRjKCk7CiAgICBp bnQgdW5idWZmZXJlZCgpIHsgcmV0dXJuIF9mbGFncyAmIDIgID8gMSA6IDA7IH0KICAgIGludCBs aW5lYnVmZmVyZWQoKSB7IHJldHVybiBfZmxhZ3MgJiAweDIwMCAgPyAxIDogMDsgfQogICAgdm9p ZCB1bmJ1ZmZlcmVkKGludCBpKQoJeyBpZiAoaSkgX2ZsYWdzIHw9IDIgOyBlbHNlIF9mbGFncyAm PSB+MiA7IH0KICAgIHZvaWQgbGluZWJ1ZmZlcmVkKGludCBpKQoJeyBpZiAoaSkgX2ZsYWdzIHw9 IDB4MjAwIDsgZWxzZSBfZmxhZ3MgJj0gfjB4MjAwIDsgfQogICAgaW50IGFsbG9jYXRlKCkgeyAg CglpZiAoYmFzZSgpIHx8IHVuYnVmZmVyZWQoKSkgcmV0dXJuIDA7CgllbHNlIHJldHVybiBkb2Fs bG9jYXRlKCk7IH0KICAgICAKICAgIHZvaWQgYWxsb2NidWYoKSB7IGlmIChiYXNlKCkgPT0gX19u dWxsICkgZG9hbGxvY2J1ZigpOyB9CiAgICB2b2lkIGRvYWxsb2NidWYoKTsKICAgIGludCBpbl9h dmFpbCgpIHsgcmV0dXJuIF9JT19yZWFkX2VuZCAtIF9JT19yZWFkX3B0cjsgfQogICAgaW50IG91 dF93YWl0aW5nKCkgeyByZXR1cm4gX0lPX3dyaXRlX3B0ciAtIF9JT193cml0ZV9iYXNlOyB9CiAg ICBzdHJlYW1zaXplIHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUgbikgeyByZXR1cm4g eHNwdXRuKHMsIG4pOyB9CiAgICBzdHJlYW1zaXplIHBhZG4oY2hhciBwYWQsIHN0cmVhbXNpemUg bikgeyByZXR1cm4gX0lPX3BhZG4odGhpcywgcGFkLCBuKTsgfQogICAgc3RyZWFtc2l6ZSBzZ2V0 bihjaGFyKiBzLCBzdHJlYW1zaXplIG4pIHsgcmV0dXJuIF9JT19zZ2V0bih0aGlzLCBzLCBuKTsg fQogICAgaW50IGlnbm9yZShpbnQpOwogICAgaW50IGdldF9jb2x1bW4oKTsKICAgIGludCBzZXRf Y29sdW1uKGludCk7CiAgICBsb25nIHNnZXRsaW5lKGNoYXIqIGJ1Ziwgc2l6ZV90ICAgbiwgY2hh ciBkZWxpbSwgaW50IHB1dGJhY2tfZGVsaW0pOwogICAgaW50IHNwdXRjKGludCBjKSB7IHJldHVy biBfSU9fcHV0YyhjLCB0aGlzKTsgfQogICAgaW50IHNidW1wYygpIHsgcmV0dXJuIF9JT19nZXRj KHRoaXMpOyB9CiAgICBpbnQgc2dldGMoKSB7IHJldHVybiAoKCAgdGhpcyAgKS0+X0lPX3JlYWRf cHRyID49ICggIHRoaXMgICktPl9JT19yZWFkX2VuZCAmJiBfX3VuZGVyZmxvdyAoICB0aGlzICAp ID09ICgtMSkgID8gKC0xKSAgOiAqKHVuc2lnbmVkIGNoYXIgKikgKCAgdGhpcyAgKS0+X0lPX3Jl YWRfcHRyKSAgOyB9CiAgICBpbnQgc25leHRjKCkgewoJaWYgKF9JT19yZWFkX3B0ciA+PSBfSU9f cmVhZF9lbmQgJiYgX191bmRlcmZsb3codGhpcykgPT0gKC0xKSApCgkgIHJldHVybiAoLTEpIDsK CWVsc2UgcmV0dXJuIF9JT19yZWFkX3B0cisrLCBzZ2V0YygpOyB9CiAgICB2b2lkIHN0b3NzYygp IHsgaWYgKF9JT19yZWFkX3B0ciA8IF9JT19yZWFkX2VuZCkgX0lPX3JlYWRfcHRyKys7IH0KICAg IGludCB2c2NhbihjaGFyIGNvbnN0ICpmbXQwLCBfX2dudWNfdmFfbGlzdCAgYXAsIGlvcyogc3Ry ZWFtID0gX19udWxsICk7CiAgICBpbnQgc2NhbihjaGFyIGNvbnN0ICpmbXQwIC4uLik7CiAgICBp bnQgdmZvcm0oY2hhciBjb25zdCAqZm10MCwgX19nbnVjX3ZhX2xpc3QgIGFwKTsKICAgIGludCBm b3JtKGNoYXIgY29uc3QgKmZtdDAgLi4uKTsKCgoKCiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgc3lz X3JlYWQoY2hhciogYnVmLCBzdHJlYW1zaXplIHNpemUpOwogICAgdmlydHVhbCBzdHJlYW1zaXpl IHN5c193cml0ZShjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZSk7CiAgICB2aXJ0dWFsIHN0cmVhbXBv cyBzeXNfc2VlayhzdHJlYW1vZmYsIF9zZWVrX2Rpcik7CiAgICB2aXJ0dWFsIGludCBzeXNfY2xv c2UoKTsKICAgIHZpcnR1YWwgaW50IHN5c19zdGF0KHZvaWQqKTsgIAoKICAgIHZpcnR1YWwgaW50 IHNob3dtYW55YygpOwogICAgdmlydHVhbCB2b2lkIGltYnVlKHZvaWQgKik7Cgp9OwoKIAogCgpj bGFzcyBmaWxlYnVmIDogcHVibGljIHN0cmVhbWJ1ZiB7CiAgcHJvdGVjdGVkOgogICAgdm9pZCBp bml0KCk7CiAgcHVibGljOgogICAgc3RhdGljIGNvbnN0IGludCBvcGVucHJvdDsgIAogICAgZmls ZWJ1ZigpOwogICAgZmlsZWJ1ZihpbnQgZmQpOwogICAgZmlsZWJ1ZihpbnQgZmQsIGNoYXIqIHAs IGludCBsZW4pOwoKCgogICAgfmZpbGVidWYoKTsKICAgIGZpbGVidWYqIGF0dGFjaChpbnQgZmQp OwogICAgZmlsZWJ1Ziogb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9k ZSk7CiAgICBmaWxlYnVmKiBvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpb3M6Om9wZW5tb2Rl IG1vZGUsIGludCBwcm90ID0gMDY2NCk7CiAgICB2aXJ0dWFsIGludCB1bmRlcmZsb3coKTsKICAg IHZpcnR1YWwgaW50IG92ZXJmbG93KGludCBjID0gKC0xKSApOwogICAgaW50IGlzX29wZW4oKSBj b25zdCB7IHJldHVybiBfZmlsZW5vID49IDA7IH0KICAgIGludCBmZCgpIGNvbnN0IHsgcmV0dXJu IGlzX29wZW4oKSA/IF9maWxlbm8gOiAoLTEpIDsgfQogICAgZmlsZWJ1ZiogY2xvc2UoKTsKICAg IHZpcnR1YWwgaW50IGRvYWxsb2NhdGUoKTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHNlZWtvZmYo c3RyZWFtb2ZmLCBfc2Vla19kaXIsIGludCBtb2RlPWlvczo6aW58aW9zOjpvdXQpOwogICAgdmly dHVhbCBzdHJlYW1idWYqIHNldGJ1ZihjaGFyKiBwLCBpbnQgbGVuKTsKICAgIHN0cmVhbXNpemUg eHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICBzdHJlYW1zaXplIHhzZ2V0 bihjaGFyKiBzLCBzdHJlYW1zaXplIG4pOwogICAgdmlydHVhbCBpbnQgc3luYygpOwogIHByb3Rl Y3RlZDogIAogCiAgICBpbnQgaXNfcmVhZGluZygpIHsgcmV0dXJuIGViYWNrKCkgIT0gZWdwdHIo KTsgfQogICAgY2hhciogY3VyX3B0cigpIHsgcmV0dXJuIGlzX3JlYWRpbmcoKSA/ICBncHRyKCkg OiBwcHRyKCk7IH0KICAgICAKICAgIGNoYXIqIGZpbGVfcHRyKCkgeyByZXR1cm4gZUdwdHIoKTsg fQogICAgIAogICAgdmlydHVhbCBzdHJlYW1zaXplIHN5c19yZWFkKGNoYXIqIGJ1Ziwgc3RyZWFt c2l6ZSBzaXplKTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHN5c19zZWVrKHN0cmVhbW9mZiwgX3Nl ZWtfZGlyKTsKICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSBzeXNfd3JpdGUoY29uc3QgY2hhciosIHN0 cmVhbXNpemUpOwogICAgdmlydHVhbCBpbnQgc3lzX3N0YXQodm9pZCopOyAgCiAgICB2aXJ0dWFs IGludCBzeXNfY2xvc2UoKTsKCgoKCn07CgppbmxpbmUgdm9pZCBpb3M6OmluaXQoc3RyZWFtYnVm KiBzYiwgb3N0cmVhbSogdGllX3RvKSB7CgkJX3N0YXRlID0gc2IgPyBpb3M6Omdvb2RiaXQgOiBp b3M6OmJhZGJpdDsgX2V4Y2VwdGlvbnM9MDsKCQlfc3RyYnVmPXNiOyBfdGllID0gdGllX3RvOyBf d2lkdGg9MDsgX2ZpbGw9JyAnOwoKCQlfZmxhZ3M9aW9zOjpza2lwd3N8aW9zOjpkZWM7CgoKCgkJ X3ByZWNpc2lvbj02OyBfYXJyYXlzID0gMDsgfQoKaW5saW5lIGlvczo6aW9zKHN0cmVhbWJ1Ziog c2IsIG9zdHJlYW0qIHRpZV90bykgeyBpbml0KHNiLCB0aWVfdG8pOyB9CgppbmxpbmUgaW9zOjp+ aW9zKCkgewoKCgogICAgIAogICAgIAogICAgb3BlcmF0b3IgZGVsZXRlW10gKF9hcnJheXMpOwp9 Cn0gIAoKIyAzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8u Li8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2lvc3RyZWFtLmgiIDIgMwoKCmV4dGVybiAiQysrIiB7 CmNsYXNzIGlzdHJlYW07IGNsYXNzIG9zdHJlYW07CnR5cGVkZWYgaW9zJiAoKl9fbWFuaXApKGlv cyYpOwp0eXBlZGVmIGlzdHJlYW0mICgqX19pbWFuaXApKGlzdHJlYW0mKTsKdHlwZWRlZiBvc3Ry ZWFtJiAoKl9fb21hbmlwKShvc3RyZWFtJik7CgpleHRlcm4gaXN0cmVhbSYgd3MoaXN0cmVhbSYg aW5zKTsKZXh0ZXJuIG9zdHJlYW0mIGZsdXNoKG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0cmVh bSYgZW5kbChvc3RyZWFtJiBvdXRzKTsKZXh0ZXJuIG9zdHJlYW0mIGVuZHMob3N0cmVhbSYgb3V0 cyk7CgpjbGFzcyBvc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgaW9zCnsKICAgICAKICAgIHZvaWQg ZG9fb3NmeCgpOwogIHB1YmxpYzoKICAgIG9zdHJlYW0oKSB7IH0KICAgIG9zdHJlYW0oc3RyZWFt YnVmKiBzYiwgb3N0cmVhbSogdGllZD0gX19udWxsICk7CiAgICBpbnQgb3BmeCgpIHsKCWlmICgh Z29vZCgpKSByZXR1cm4gMDsKCWVsc2UgeyBpZiAoX3RpZSkgX3RpZS0+Zmx1c2goKTsgIDsgcmV0 dXJuIDE7fSB9CiAgICB2b2lkIG9zZngoKSB7ICA7CgkJICBpZiAoZmxhZ3MoKSAmIChpb3M6OnVu aXRidWZ8aW9zOjpzdGRpbykpCgkJICAgICAgZG9fb3NmeCgpOyB9CiAgICBvc3RyZWFtJiBmbHVz aCgpOwogICAgb3N0cmVhbSYgcHV0KGNoYXIgYykgeyBfc3RyYnVmLT5zcHV0YyhjKTsgcmV0dXJu ICp0aGlzOyB9CgoKCgoKICAgIG9zdHJlYW0mIHdyaXRlKGNvbnN0IGNoYXIgKnMsIHN0cmVhbXNp emUgbik7CiAgICBvc3RyZWFtJiB3cml0ZShjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBzdHJlYW1z aXplIG4pCiAgICAgIHsgcmV0dXJuIHdyaXRlKChjb25zdCBjaGFyKilzLCBuKTt9CiAgICBvc3Ry ZWFtJiB3cml0ZShjb25zdCBzaWduZWQgY2hhciAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJl dHVybiB3cml0ZSgoY29uc3QgY2hhciopcywgbik7fQogICAgb3N0cmVhbSYgd3JpdGUoY29uc3Qg dm9pZCAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiB3cml0ZSgoY29uc3QgY2hhciop cywgbik7fQogICAgb3N0cmVhbSYgc2Vla3Aoc3RyZWFtcG9zKTsKICAgIG9zdHJlYW0mIHNlZWtw KHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxscCgpOwogICAgb3N0cmVh bSYgZm9ybShjb25zdCBjaGFyICpmb3JtYXQgLi4uKTsKICAgIG9zdHJlYW0mIHZmb3JtKGNvbnN0 IGNoYXIgKmZvcm1hdCwgX19nbnVjX3ZhX2xpc3QgIGFyZ3MpOwoKICAgIG9zdHJlYW0mIG9wZXJh dG9yPDwoY2hhciBjKTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBjKSB7 IHJldHVybiAoKnRoaXMpIDw8IChjaGFyKWM7IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc2ln bmVkIGNoYXIgYykgeyByZXR1cm4gKCp0aGlzKSA8PCAoY2hhciljOyB9CiAgICBvc3RyZWFtJiBv cGVyYXRvcjw8KGNvbnN0IGNoYXIgKnMpOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCB1 bnNpZ25lZCBjaGFyICpzKQoJeyByZXR1cm4gKCp0aGlzKSA8PCAoY29uc3QgY2hhciopczsgfQog ICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCBzaWduZWQgY2hhciAqcykKCXsgcmV0dXJuICgq dGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY29uc3Qg dm9pZCAqcCk7CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGludCBuKTsKICAgIG9zdHJlYW0mIG9w ZXJhdG9yPDwodW5zaWduZWQgaW50IG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIG4p OwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIG4pOwoKICAgIF9fZXh0ZW5z aW9uX18gb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIGxvbmcgbik7CiAgICBfX2V4dGVuc2lvbl9f IG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIG4pOwoKICAgIG9zdHJlYW0m IG9wZXJhdG9yPDwoc2hvcnQgbikge3JldHVybiBvcGVyYXRvcjw8KChpbnQpbik7fQogICAgb3N0 cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBuKSB7cmV0dXJuIG9wZXJhdG9yPDwoKHVu c2lnbmVkIGludCluKTt9CgogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChib29sIGIpIHsgcmV0dXJu IG9wZXJhdG9yPDwoKGludCliKTsgfQoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoZG91YmxlIG4p OwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChmbG9hdCBuKSB7IHJldHVybiBvcGVyYXRvcjw8KChk b3VibGUpbik7IH0KCiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGxvbmcgZG91YmxlIG4pOwoKCgog ICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX29tYW5pcCBmdW5jKSB7IHJldHVybiAoKmZ1bmMpKCp0 aGlzKTsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX21hbmlwIGZ1bmMpIHsoKmZ1bmMpKCp0 aGlzKTsgcmV0dXJuICp0aGlzO30KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc3RyZWFtYnVmKik7 CgoKCn07CgpjbGFzcyBpc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgaW9zCnsKICAgICAKcHJvdGVj dGVkOgogICAgc2l6ZV90ICAgX2djb3VudDsKCiAgICBpbnQgX3NraXBfd3MoKTsKICBwdWJsaWM6 CiAgICBpc3RyZWFtKCk6IF9nY291bnQgKDApIHsgfQogICAgaXN0cmVhbShzdHJlYW1idWYqIHNi LCBvc3RyZWFtKnRpZWQ9IF9fbnVsbCApOwogICAgaXN0cmVhbSYgZ2V0KGNoYXIqIHB0ciwgaW50 IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwogICAgaXN0cmVhbSYgZ2V0KHVuc2lnbmVkIGNoYXIq IHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpCgl7IHJldHVybiBnZXQoKGNoYXIqKXB0 ciwgbGVuLCBkZWxpbSk7IH0KICAgIGlzdHJlYW0mIGdldChjaGFyJiBjKTsKICAgIGlzdHJlYW0m IGdldCh1bnNpZ25lZCBjaGFyJiBjKSB7IHJldHVybiBnZXQoKGNoYXImKWMpOyB9CiAgICBpc3Ry ZWFtJiBnZXRsaW5lKGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwogICAg aXN0cmVhbSYgZ2V0bGluZSh1bnNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0g PSAnXG4nKQoJeyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAg aXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyJiBjKSAgeyByZXR1cm4gZ2V0KChjaGFyJiljKTsgfQog ICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAn XG4nKQoJeyByZXR1cm4gZ2V0KChjaGFyKilwdHIsIGxlbiwgZGVsaW0pOyB9CiAgICBpc3RyZWFt JiBnZXRsaW5lKHNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJ eyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAgaXN0cmVhbSYg cmVhZChjaGFyICpwdHIsIHN0cmVhbXNpemUgbik7CiAgICBpc3RyZWFtJiByZWFkKHVuc2lnbmVk IGNoYXIgKnB0ciwgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiByZWFkKChjaGFyKilwdHIs IG4pOyB9CiAgICBpc3RyZWFtJiByZWFkKHNpZ25lZCBjaGFyICpwdHIsIHN0cmVhbXNpemUgbikK ICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRyLCBuKTsgfQogICAgaXN0cmVhbSYgcmVhZCh2 b2lkICpwdHIsIHN0cmVhbXNpemUgbikKICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRyLCBu KTsgfQogICAgaXN0cmVhbSYgZ2V0KHN0cmVhbWJ1ZiYgc2IsIGNoYXIgZGVsaW0gPSAnXG4nKTsK ICAgIGlzdHJlYW0mIGdldHMoY2hhciAqKnMsIGNoYXIgZGVsaW0gPSAnXG4nKTsKICAgIGludCBp cGZ4KGludCBuZWVkID0gMCkgewoJaWYgKCFnb29kKCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJl dHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYgKF90aWUgJiYgKG5lZWQgPT0gMCB8fCByZGJ1 ZigpLT5pbl9hdmFpbCgpIDwgbmVlZCkpIF90aWUtPmZsdXNoKCk7CgkgIGlmICghbmVlZCAmJiAo ZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSkgcmV0dXJuIF9za2lwX3dzKCk7CgkgIGVsc2UgcmV0dXJu IDE7Cgl9CiAgICB9CiAgICBpbnQgaXBmeDAoKSB7ICAKCWlmICghZ29vZCgpKSB7IHNldChpb3M6 OmZhaWxiaXQpOyByZXR1cm4gMDsgfQoJZWxzZSB7CgkgICA7CgkgIGlmIChfdGllKSBfdGllLT5m bHVzaCgpOwoJICBpZiAoZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSByZXR1cm4gX3NraXBfd3MoKTsK CSAgZWxzZSByZXR1cm4gMTsKCX0KICAgIH0KICAgIGludCBpcGZ4MSgpIHsgIAoJaWYgKCFnb29k KCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYg KF90aWUgJiYgcmRidWYoKS0+aW5fYXZhaWwoKSA9PSAwKSBfdGllLT5mbHVzaCgpOwoJICByZXR1 cm4gMTsKCX0KICAgIH0KICAgIHZvaWQgaXNmeCgpIHsgIDsgfQogICAgaW50IGdldCgpIHsgaWYg KCFpcGZ4MSgpKSByZXR1cm4gKC0xKSA7CgkJZWxzZSB7IGludCBjaCA9IF9zdHJidWYtPnNidW1w YygpOwoJCSAgICAgICBpZiAoY2ggPT0gKC0xKSApIHNldChpb3M6OmVvZmJpdCk7CgkJICAgICAg IGlzZngoKTsKCQkgICAgICAgcmV0dXJuIGNoOwoJCSAgICAgfSB9CiAgICBpbnQgcGVlaygpOwog ICAgc2l6ZV90ICAgZ2NvdW50KCkgeyByZXR1cm4gX2djb3VudDsgfQogICAgaXN0cmVhbSYgaWdu b3JlKGludCBuPTEsIGludCBkZWxpbSA9ICgtMSkgKTsKICAgIGludCBzeW5jICgpOwogICAgaXN0 cmVhbSYgc2Vla2coc3RyZWFtcG9zKTsKICAgIGlzdHJlYW0mIHNlZWtnKHN0cmVhbW9mZiwgX3Nl ZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxsZygpOwogICAgaXN0cmVhbSYgcHV0YmFjayhjaGFy IGNoKSB7CglpZiAoZ29vZCgpICYmIF9zdHJidWYtPnNwdXRiYWNrYyhjaCkgPT0gKC0xKSApIGNs ZWFyKGlvczo6YmFkYml0KTsKCXJldHVybiAqdGhpczt9CiAgICBpc3RyZWFtJiB1bmdldCgpIHsK CWlmIChnb29kKCkgJiYgX3N0cmJ1Zi0+c3VuZ2V0YygpID09ICgtMSkgKSBjbGVhcihpb3M6OmJh ZGJpdCk7CglyZXR1cm4gKnRoaXM7fQogICAgaXN0cmVhbSYgc2Nhbihjb25zdCBjaGFyICpmb3Jt YXQgLi4uKTsKICAgIGlzdHJlYW0mIHZzY2FuKGNvbnN0IGNoYXIgKmZvcm1hdCwgX19nbnVjX3Zh X2xpc3QgIGFyZ3MpOwoKCgoKCgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihjaGFyKik7CiAgICBp c3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGNoYXIqIHApIHsgcmV0dXJuIG9wZXJhdG9yPj4o KGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHNpZ25lZCBjaGFyKnApIHsgcmV0 dXJuIG9wZXJhdG9yPj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KGNoYXIm IGMpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBjaGFyJiBjKSB7cmV0dXJuIG9w ZXJhdG9yPj4oKGNoYXImKWMpO30KICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oc2lnbmVkIGNoYXIm IGMpIHtyZXR1cm4gb3BlcmF0b3I+PigoY2hhciYpYyk7fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+ PihpbnQmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyYpOwoKICAgIF9fZXh0ZW5zaW9u X18gaXN0cmVhbSYgb3BlcmF0b3I+Pihsb25nIGxvbmcmKTsKICAgIF9fZXh0ZW5zaW9uX18gaXN0 cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nIGxvbmcmKTsKCiAgICBpc3RyZWFtJiBvcGVy YXRvcj4+KHNob3J0Jik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGludCYpOwog ICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJik7CiAgICBpc3RyZWFtJiBvcGVy YXRvcj4+KHVuc2lnbmVkIHNob3J0Jik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pihib29sJik7 CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihmbG9hdCYpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+ Pihkb3VibGUmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyBkb3VibGUmKTsKICAgIGlz dHJlYW0mIG9wZXJhdG9yPj4oIF9fbWFuaXAgZnVuYykgeygqZnVuYykoKnRoaXMpOyByZXR1cm4g KnRoaXM7fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihfX2ltYW5pcCBmdW5jKSB7IHJldHVybiAo KmZ1bmMpKCp0aGlzKTsgfQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihzdHJlYW1idWYqKTsKfTsK CmNsYXNzIGlvc3RyZWFtIDogcHVibGljIGlzdHJlYW0sIHB1YmxpYyBvc3RyZWFtCnsKICBwdWJs aWM6CiAgICBpb3N0cmVhbSgpIHsgfQogICAgaW9zdHJlYW0oc3RyZWFtYnVmKiBzYiwgb3N0cmVh bSp0aWVkPSBfX251bGwgKTsKfTsKCmNsYXNzIF9JT19pc3RyZWFtX3dpdGhhc3NpZ24gOiBwdWJs aWMgaXN0cmVhbSB7CnB1YmxpYzoKICBfSU9faXN0cmVhbV93aXRoYXNzaWduJiBvcGVyYXRvcj0o aXN0cmVhbSYpOwogIF9JT19pc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShfSU9faXN0cmVh bV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRpY19jYXN0PGlz dHJlYW0mPiAocmhzKSk7IH0KfTsKCmNsYXNzIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24gOiBwdWJs aWMgb3N0cmVhbSB7CnB1YmxpYzoKICBfSU9fb3N0cmVhbV93aXRoYXNzaWduJiBvcGVyYXRvcj0o b3N0cmVhbSYpOwogIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShfSU9fb3N0cmVh bV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRpY19jYXN0PG9z dHJlYW0mPiAocmhzKSk7IH0KfTsKCmV4dGVybiBfSU9faXN0cmVhbV93aXRoYXNzaWduIGNpbjsK IApleHRlcm4gX0lPX29zdHJlYW1fd2l0aGFzc2lnbiBjb3V0LCBjZXJyOwoKZXh0ZXJuIF9JT19v c3RyZWFtX3dpdGhhc3NpZ24gY2xvZwoKCgo7CgpleHRlcm4gaXN0cmVhbSYgbG9jayhpc3RyZWFt JiBpbnMpOwpleHRlcm4gaXN0cmVhbSYgdW5sb2NrKGlzdHJlYW0mIGlucyk7CmV4dGVybiBvc3Ry ZWFtJiBsb2NrKG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0cmVhbSYgdW5sb2NrKG9zdHJlYW0m IG91dHMpOwoKc3RydWN0IElvc3RyZWFtX2luaXQgeyB9IDsgICAKCmlubGluZSBpb3MmIGRlYyhp b3MmIGkpCnsgaS5zZXRmKGlvczo6ZGVjLCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJl dHVybiBpOyB9CmlubGluZSBpb3MmIGhleChpb3MmIGkpCnsgaS5zZXRmKGlvczo6aGV4LCBpb3M6 OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBpOyB9CmlubGluZSBpb3MmIG9jdChpb3Mm IGkpCnsgaS5zZXRmKGlvczo6b2N0LCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVy biBpOyB9Cn0gIAoKCiMgNTMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8y Ljk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMiAzCgoKCiMg MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8u Li9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRvci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKIAoKCgoKCgogCgpzdHJ1Y3QgaW5wdXRfaXRlcmF0b3JfdGFnIHt9OwpzdHJ1Y3Qgb3V0 cHV0X2l0ZXJhdG9yX3RhZyB7fTsKc3RydWN0IGZvcndhcmRfaXRlcmF0b3JfdGFnIDogcHVibGlj IGlucHV0X2l0ZXJhdG9yX3RhZyB7fTsKc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFn IDogcHVibGljIGZvcndhcmRfaXRlcmF0b3JfdGFnIHt9OwpzdHJ1Y3QgcmFuZG9tX2FjY2Vzc19p dGVyYXRvcl90YWcgOiBwdWJsaWMgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcge307CgogCiAK IAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+IHN0cnVjdCBpbnB1dF9p dGVyYXRvciB7CiAgdHlwZWRlZiBpbnB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7 CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIF9EaXN0 YW5jZSAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqICAgICAgICAgICAg ICAgcG9pbnRlcjsKICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICByZWZlcmVuY2U7Cn07Cgpz dHJ1Y3Qgb3V0cHV0X2l0ZXJhdG9yIHsKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRl cmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7 CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVm IHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAg ICAgcmVmZXJlbmNlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBz dHJ1Y3QgZm9yd2FyZF9pdGVyYXRvciB7CiAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBp dGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgIHZhbHVlX3R5 cGU7CiAgdHlwZWRlZiBfRGlzdGFuY2UgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlw ZWRlZiBfVHAqICAgICAgICAgICAgICAgICBwb2ludGVyOwogIHR5cGVkZWYgX1RwJiAgICAgICAg ICAgICAgICAgcmVmZXJlbmNlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0 YW5jZT4gc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3IgewogIHR5cGVkZWYgYmlkaXJlY3Rp b25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAgICAg ICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgX0Rpc3RhbmNlICAgICAgICAg ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAg ICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgIHJlZmVy ZW5jZTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4gc3RydWN0IHJh bmRvbV9hY2Nlc3NfaXRlcmF0b3IgewogIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90 YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAg ICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgX0Rpc3RhbmNlICAgICAgICAgICAgICAgICAgZGlmZmVy ZW5jZV90eXBlOwogIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsK ICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKfTsKCiMgOTgg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4v aW5jbHVkZS9nKystMy9zdGxfaXRlcmF0b3IuaCIgMwoKCgoKdGVtcGxhdGUgPGNsYXNzIF9JdGVy YXRvcj4Kc3RydWN0IGl0ZXJhdG9yX3RyYWl0cyB7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0 b3I6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgdHlwZW5h bWUgX0l0ZXJhdG9yOjp2YWx1ZV90eXBlICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgdHlw ZW5hbWUgX0l0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlw ZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CiAgdHlw ZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnJlZmVyZW5jZSAgICAgICAgIHJlZmVyZW5jZTsKfTsK CnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBpdGVyYXRvcl90cmFpdHM8X1RwKj4gewogIHR5 cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlw ZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHB0 cmRpZmZfdCAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAq ICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIF9UcCYgICAgICAgICAg ICAgICAgICAgICAgICByZWZlcmVuY2U7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3Qg aXRlcmF0b3JfdHJhaXRzPGNvbnN0IF9UcCo+IHsKICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRl cmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAg ICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAg ICAgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAg IHBvaW50ZXI7CiAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAgICAgICAgICAgcmVmZXJlbmNl Owp9OwoKIAogCiAKIAoKIAoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5hbWUg aXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkKX19pdGVyYXRvcl9jYXRl Z29yeShjb25zdCBfSXRlciYpCnsKICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxf SXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKICByZXR1cm4gX0NhdGVnb3J5KCk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0 czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSoKX19kaXN0YW5jZV90eXBlKGNvbnN0IF9JdGVyJikK ewogIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojpk aWZmZXJlbmNlX3R5cGUqPigwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlw ZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFsdWVfdHlwZSoKX192YWx1ZV90eXBlKGNv bnN0IF9JdGVyJikKewogIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBpdGVyYXRvcl90cmFp dHM8X0l0ZXI+Ojp2YWx1ZV90eXBlKj4oMCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KaW5s aW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5Cml0 ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9JdGVyJiBfX2kpIHsgcmV0dXJuIF9faXRlcmF0b3JfY2F0 ZWdvcnkoX19pKTsgfQoKCnRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KaW5saW5lIHR5cGVuYW1lIGl0 ZXJhdG9yX3RyYWl0czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSoKZGlzdGFuY2VfdHlwZShjb25z dCBfSXRlciYgX19pKSB7IHJldHVybiBfX2Rpc3RhbmNlX3R5cGUoX19pKTsgfQoKdGVtcGxhdGUg PGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFs dWVfdHlwZSoKdmFsdWVfdHlwZShjb25zdCBfSXRlciYgX19pKSB7IHJldHVybiBfX3ZhbHVlX3R5 cGUoX19pKTsgfQoKCgoKCiMgMjU5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIHZv aWQgX19kaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlJiBfX24sIGlucHV0X2l0ZXJhdG9y X3RhZykKewogIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeyArK19fZmlyc3Q7ICsrX19uOyB9 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5j ZT4KaW5saW5lIHZvaWQgX19kaXN0YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwg CiAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgCiAg ICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlJiBfX24sIHJhbmRvbV9hY2Nlc3NfaXRlcmF0 b3JfdGFnKQp7CiAgX19uICs9IF9fbGFzdCAtIF9fZmlyc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBf SW5wdXRJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9pZCBkaXN0YW5jZShfSW5w dXRJdGVyYXRvciBfX2ZpcnN0LCAKICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3Ig X19sYXN0LCBfRGlzdGFuY2UmIF9fbikKewogIF9fZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBf X24sIGl0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lu cHV0SXRlcmF0b3I+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0 b3I+OjpkaWZmZXJlbmNlX3R5cGUKX19kaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBf SW5wdXRJdGVyYXRvciBfX2xhc3QsIGlucHV0X2l0ZXJhdG9yX3RhZykKewogIHR5cGVuYW1lIGl0 ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24gPSAwOwog IHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewogICAgKytfX2ZpcnN0OyArK19fbjsKICB9CiAg cmV0dXJuIF9fbjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KaW5s aW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZm ZXJlbmNlX3R5cGUKX19kaXN0YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1Jh bmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJh dG9yX3RhZykgewogIHJldHVybiBfX2xhc3QgLSBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0lucHV0SXRlcmF0b3I+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRl cmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwg X0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CiAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFp dHM8X0lucHV0SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSAKICAgIF9DYXRlZ29yeTsKICBy ZXR1cm4gX19kaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9DYXRlZ29yeSgpKTsKfQoKCgp0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9pZCBfX2Fk dmFuY2UoX0lucHV0SXRlciYgX19pLCBfRGlzdGFuY2UgX19uLCBpbnB1dF9pdGVyYXRvcl90YWcp IHsKICB3aGlsZSAoX19uLS0pICsrX19pOwp9CgoKCgoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVj dGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIHZvaWQgX19hZHZhbmNlKF9C aWRpcmVjdGlvbmFsSXRlcmF0b3ImIF9faSwgX0Rpc3RhbmNlIF9fbiwgCiAgICAgICAgICAgICAg ICAgICAgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykgewogIGlmIChfX24gPj0gMCkKICAg IHdoaWxlIChfX24tLSkgKytfX2k7CiAgZWxzZQogICAgd2hpbGUgKF9fbisrKSAtLV9faTsKfQoK CgoKCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5j ZT4KaW5saW5lIHZvaWQgX19hZHZhbmNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciYgX19pLCBfRGlz dGFuY2UgX19uLCAKICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3Jf dGFnKSB7CiAgX19pICs9IF9fbjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBj bGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lkIGFkdmFuY2UoX0lucHV0SXRlcmF0b3ImIF9faSwg X0Rpc3RhbmNlIF9fbikgewogIF9fYWR2YW5jZShfX2ksIF9fbiwgaXRlcmF0b3JfY2F0ZWdvcnko X19pKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgpjbGFzcyBiYWNrX2luc2VydF9p dGVyYXRvciB7CnByb3RlY3RlZDoKICBfQ29udGFpbmVyKiBjb250YWluZXI7CnB1YmxpYzoKICB0 eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CiAgdHlwZWRlZiBvdXRw dXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgdm9pZCAgICAgICAg ICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJl bmNlX3R5cGU7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRl ZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKCiAgZXhwbGljaXQgYmFja19pbnNlcnRf aXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQogIGJhY2tfaW5z ZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgogIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29u dGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKSB7IAogICAgY29udGFpbmVyLT5wdXNoX2JhY2so X192YWx1ZSk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9D b250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQogIGJhY2tfaW5zZXJ0X2l0 ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KICBiYWNr X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0 aGlzOyB9Cn07CgojIDM3OCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRvci5oIiAzCgoKdGVtcGxh dGUgPGNsYXNzIF9Db250YWluZXI+CmlubGluZSBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFp bmVyPiBiYWNrX2luc2VydGVyKF9Db250YWluZXImIF9feCkgewogIHJldHVybiBiYWNrX2luc2Vy dF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5l cj4KY2xhc3MgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yIHsKcHJvdGVjdGVkOgogIF9Db250YWluZXIq IGNvbnRhaW5lcjsKcHVibGljOgogIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWlu ZXJfdHlwZTsKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7 CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2b2lk ICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAg ICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwoK ICBleHBsaWNpdCBmcm9udF9pbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRh aW5lcigmX194KSB7fQogIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKICBvcGVy YXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkgeyAK ICAgIGNvbnRhaW5lci0+cHVzaF9mcm9udChfX3ZhbHVlKTsKICAgIHJldHVybiAqdGhpczsKICB9 CiAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVy biAqdGhpczsgfQogIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3Ir KygpIHsgcmV0dXJuICp0aGlzOyB9CiAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+ JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KfTsKCiMgNDE3ICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KaW5saW5l IGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiBmcm9udF9pbnNlcnRlcihfQ29udGFp bmVyJiBfX3gpIHsKICByZXR1cm4gZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+KF9f eCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgpjbGFzcyBpbnNlcnRfaXRlcmF0b3Ig ewpwcm90ZWN0ZWQ6CiAgX0NvbnRhaW5lciogY29udGFpbmVyOwogIHR5cGVuYW1lIF9Db250YWlu ZXI6Oml0ZXJhdG9yIGl0ZXI7CnB1YmxpYzoKICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAg Y29udGFpbmVyX3R5cGU7CiAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2Nh dGVnb3J5OwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVk ZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiB2b2lkICAg ICAgICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVy ZW5jZTsKCiAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRh aW5lcjo6aXRlcmF0b3IgX19pKSAKICAgIDogY29udGFpbmVyKCZfX3gpLCBpdGVyKF9faSkge30K ICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCiAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1l IF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpIHsgCiAgICBpdGVyID0gY29udGFpbmVy LT5pbnNlcnQoaXRlciwgX192YWx1ZSk7CiAgICArK2l0ZXI7CiAgICByZXR1cm4gKnRoaXM7CiAg fQogIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRo aXM7IH0KICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVy biAqdGhpczsgfQogIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQp IHsgcmV0dXJuICp0aGlzOyB9Cn07CgojIDQ1OSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRy YWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRvci5o IiAzCgoKdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9JdGVyYXRvcj4KaW5saW5l IAppbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194LCBf SXRlcmF0b3IgX19pKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBf X2l0ZXI7CiAgcmV0dXJuIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gsIF9faXRlcihf X2kpKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBf VHAsIGNsYXNzIF9SZWZlcmVuY2UgPSBfVHAmLCAKICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZSA9 IHB0cmRpZmZfdD4gCgoKCgpjbGFzcyByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3Igewog IHR5cGVkZWYgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRl cmF0b3IsIF9UcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Jl ZmVyZW5jZSwgX0Rpc3RhbmNlPiAgX1NlbGY7CnByb3RlY3RlZDoKICBfQmlkaXJlY3Rpb25hbEl0 ZXJhdG9yIGN1cnJlbnQ7CnB1YmxpYzoKICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3Jf dGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAg ICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIF9EaXN0YW5jZSAgICAgICAgICAgICAgICAgIGRpZmZl cmVuY2VfdHlwZTsKICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7 CiAgdHlwZWRlZiBfUmVmZXJlbmNlICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CgogIHJldmVy c2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcigpIHt9CiAgZXhwbGljaXQgcmV2ZXJzZV9iaWRpcmVj dGlvbmFsX2l0ZXJhdG9yKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX194KQogICAgOiBjdXJyZW50 KF9feCkge30KICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGJhc2UoKSBjb25zdCB7IHJldHVybiBj dXJyZW50OyB9CiAgX1JlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CiAgICBfQmlkaXJlY3Rp b25hbEl0ZXJhdG9yIF9fdG1wID0gY3VycmVudDsKICAgIHJldHVybiAqLS1fX3RtcDsKICB9Cgog IHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9Cgog IF9TZWxmJiBvcGVyYXRvcisrKCkgewogICAgLS1jdXJyZW50OwogICAgcmV0dXJuICp0aGlzOwog IH0KICBfU2VsZiBvcGVyYXRvcisrKGludCkgewogICAgX1NlbGYgX190bXAgPSAqdGhpczsKICAg IC0tY3VycmVudDsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7 CiAgICArK2N1cnJlbnQ7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIF9TZWxmIG9wZXJhdG9yLS0o aW50KSB7CiAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwogICAgKytjdXJyZW50OwogICAgcmV0dXJu IF9fdG1wOwogIH0KfTsKCiMgNTUwICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfUmVmLAogICAgICAgICAg Y2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KAogICAgY29uc3QgcmV2ZXJz ZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaUl0ZXIsIF9UcCwgX1JlZiwgX0Rpc3RhbmNlPiYg X194LCAKICAgIGNvbnN0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlJdGVyLCBf VHAsIF9SZWYsIF9EaXN0YW5jZT4mIF9feSkKewogIHJldHVybiBfX3guYmFzZSgpID09IF9feS5i YXNlKCk7Cn0KCgoKIAogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgpjbGFzcyBy ZXZlcnNlX2l0ZXJhdG9yIAp7CnByb3RlY3RlZDoKICBfSXRlcmF0b3IgY3VycmVudDsKcHVibGlj OgogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9y X2NhdGVnb3J5CiAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIHR5cGVuYW1l IGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCiAgICAgICAgICB2YWx1ZV90 eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZl cmVuY2VfdHlwZQogICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUg aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnBvaW50ZXIKICAgICAgICAgIHBvaW50ZXI7CiAg dHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6cmVmZXJlbmNlCiAg ICAgICAgICByZWZlcmVuY2U7CgogIHR5cGVkZWYgX0l0ZXJhdG9yIGl0ZXJhdG9yX3R5cGU7CiAg dHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4gX1NlbGY7CgpwdWJsaWM6CiAgcmV2 ZXJzZV9pdGVyYXRvcigpIHt9CiAgZXhwbGljaXQgcmV2ZXJzZV9pdGVyYXRvcihpdGVyYXRvcl90 eXBlIF9feCkgOiBjdXJyZW50KF9feCkge30KCiAgcmV2ZXJzZV9pdGVyYXRvcihjb25zdCBfU2Vs ZiYgX194KSA6IGN1cnJlbnQoX194LmN1cnJlbnQpIHt9CgogIHRlbXBsYXRlIDxjbGFzcyBfSXRl cj4KICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXI+JiBfX3gp CiAgICA6IGN1cnJlbnQoX194LmJhc2UoKSkge30KCiAgICAKICBpdGVyYXRvcl90eXBlIGJhc2Uo KSBjb25zdCB7IHJldHVybiBjdXJyZW50OyB9CiAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0 IHsKICAgIF9JdGVyYXRvciBfX3RtcCA9IGN1cnJlbnQ7CiAgICByZXR1cm4gKi0tX190bXA7CiAg fQoKICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsg fQoKCiAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CiAgICAtLWN1cnJlbnQ7CiAgICByZXR1cm4gKnRo aXM7CiAgfQogIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CiAgICBfU2VsZiBfX3RtcCA9ICp0aGlz OwogICAgLS1jdXJyZW50OwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBfU2VsZiYgb3BlcmF0b3It LSgpIHsKICAgICsrY3VycmVudDsKICAgIHJldHVybiAqdGhpczsKICB9CiAgX1NlbGYgb3BlcmF0 b3ItLShpbnQpIHsKICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CiAgICArK2N1cnJlbnQ7CiAgICBy ZXR1cm4gX190bXA7CiAgfQoKICBfU2VsZiBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbikg Y29uc3QgewogICAgcmV0dXJuIF9TZWxmKGN1cnJlbnQgLSBfX24pOwogIH0KICBfU2VsZiYgb3Bl cmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7CiAgICBjdXJyZW50IC09IF9fbjsKICAgIHJl dHVybiAqdGhpczsKICB9CiAgX1NlbGYgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNv bnN0IHsKICAgIHJldHVybiBfU2VsZihjdXJyZW50ICsgX19uKTsKICB9CiAgX1NlbGYmIG9wZXJh dG9yLT0oZGlmZmVyZW5jZV90eXBlIF9fbikgewogICAgY3VycmVudCArPSBfX247CiAgICByZXR1 cm4gKnRoaXM7CiAgfQogIHJlZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24p IGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBfX24pOyB9ICAKfTsgCiAKdGVtcGxhdGUgPGNsYXNz IF9JdGVyYXRvcj4KaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCByZXZlcnNlX2l0ZXJhdG9y PF9JdGVyYXRvcj4mIF9feCwgCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9p dGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICByZXR1cm4gX194LmJhc2UoKSA9PSBfX3kuYmFz ZSgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgppbmxpbmUgYm9vbCBvcGVyYXRvcjwo Y29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsIAogICAgICAgICAgICAgICAg ICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICByZXR1cm4g X195LmJhc2UoKSA8IF9feC5iYXNlKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cmlu bGluZSB0eXBlbmFtZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlw ZQpvcGVyYXRvci0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsIAogICAg ICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICByZXR1cm4g X195LmJhc2UoKSAtIF9feC5iYXNlKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cmlu bGluZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4gCm9wZXJhdG9yKyh0eXBlbmFtZSByZXZl cnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24sCiAgICAgICAgICBj b25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCkgewogIHJldHVybiByZXZlcnNl X2l0ZXJhdG9yPF9JdGVyYXRvcj4oX194LmJhc2UoKSAtIF9fbik7Cn0KCiMgODA1ICIvdXNyL2xp Yi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUv ZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgogCiAKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNz IF9EaXN0ID0gcHRyZGlmZl90PiAKY2xhc3MgaXN0cmVhbV9pdGVyYXRvciB7CiAgZnJpZW5kIGJv b2wgb3BlcmF0b3I9PSA8PiAgKGNvbnN0IGlzdHJlYW1faXRlcmF0b3ImLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzdHJlYW1faXRlcmF0b3Im KTsKcHJvdGVjdGVkOgogIGlzdHJlYW0qIF9NX3N0cmVhbTsKICBfVHAgX01fdmFsdWU7CiAgYm9v bCBfTV9lbmRfbWFya2VyOwogIHZvaWQgX01fcmVhZCgpIHsKICAgIF9NX2VuZF9tYXJrZXIgPSAo Kl9NX3N0cmVhbSkgPyB0cnVlIDogZmFsc2U7CiAgICBpZiAoX01fZW5kX21hcmtlcikgKl9NX3N0 cmVhbSA+PiBfTV92YWx1ZTsKICAgIF9NX2VuZF9tYXJrZXIgPSAoKl9NX3N0cmVhbSkgPyB0cnVl IDogZmFsc2U7CiAgfQpwdWJsaWM6CiAgdHlwZWRlZiBpbnB1dF9pdGVyYXRvcl90YWcgIGl0ZXJh dG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwog IHR5cGVkZWYgX0Rpc3QgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBj b25zdCBfVHAqICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAg IHJlZmVyZW5jZTsKCiAgaXN0cmVhbV9pdGVyYXRvcigpIDogX01fc3RyZWFtKCZjaW4pLCBfTV9l bmRfbWFya2VyKGZhbHNlKSB7fQogIGlzdHJlYW1faXRlcmF0b3IoaXN0cmVhbSYgX19zKSA6IF9N X3N0cmVhbSgmX19zKSB7IF9NX3JlYWQoKTsgfQogIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25z dCB7IHJldHVybiBfTV92YWx1ZTsgfQoKICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJl dHVybiAmKG9wZXJhdG9yKigpKTsgfQoKICBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0Rpc3Q+JiBv cGVyYXRvcisrKCkgeyAKICAgIF9NX3JlYWQoKTsgCiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlz dHJlYW1faXRlcmF0b3I8X1RwLCBfRGlzdD4gb3BlcmF0b3IrKyhpbnQpICB7CiAgICBpc3RyZWFt X2l0ZXJhdG9yPF9UcCwgX0Rpc3Q+IF9fdG1wID0gKnRoaXM7CiAgICBfTV9yZWFkKCk7CiAgICBy ZXR1cm4gX190bXA7CiAgfQp9OwoKIyA4NjQgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFr ZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaXRlcmF0b3IuaCIg MwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIGJvb2wgb3Bl cmF0b3I9PShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYgX194LAogICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+ JiBfX3kpIHsKICByZXR1cm4gKF9feC5fTV9zdHJlYW0gPT0gX195Ll9NX3N0cmVhbSAmJgogICAg ICAgICAgX194Ll9NX2VuZF9tYXJrZXIgPT0gX195Ll9NX2VuZF9tYXJrZXIpIHx8CiAgICAgICAg IF9feC5fTV9lbmRfbWFya2VyID09IGZhbHNlICYmIF9feS5fTV9lbmRfbWFya2VyID09IGZhbHNl Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpjbGFzcyBvc3RyZWFtX2l0ZXJhdG9yIHsKcHJvdGVj dGVkOgogIG9zdHJlYW0qIF9NX3N0cmVhbTsKICBjb25zdCBjaGFyKiBfTV9zdHJpbmc7CnB1Ymxp YzoKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlw ZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2b2lkICAgICAg ICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAg cG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwoKICBvc3Ry ZWFtX2l0ZXJhdG9yKG9zdHJlYW0mIF9fcykgOiBfTV9zdHJlYW0oJl9fcyksIF9NX3N0cmluZygw KSB7fQogIG9zdHJlYW1faXRlcmF0b3Iob3N0cmVhbSYgX19zLCBjb25zdCBjaGFyKiBfX2MpIAog ICAgOiBfTV9zdHJlYW0oJl9fcyksIF9NX3N0cmluZyhfX2MpICB7fQogIG9zdHJlYW1faXRlcmF0 b3I8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IF9UcCYgX192YWx1ZSkgeyAKICAgICpfTV9zdHJlYW0g PDwgX192YWx1ZTsKICAgIGlmIChfTV9zdHJpbmcpICpfTV9zdHJlYW0gPDwgX01fc3RyaW5nOwog ICAgcmV0dXJuICp0aGlzOwogIH0KICBvc3RyZWFtX2l0ZXJhdG9yPF9UcD4mIG9wZXJhdG9yKigp IHsgcmV0dXJuICp0aGlzOyB9CiAgb3N0cmVhbV9pdGVyYXRvcjxfVHA+JiBvcGVyYXRvcisrKCkg eyByZXR1cm4gKnRoaXM7IH0gCiAgb3N0cmVhbV9pdGVyYXRvcjxfVHA+JiBvcGVyYXRvcisrKGlu dCkgeyByZXR1cm4gKnRoaXM7IH0gCn07CgojIDkwNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRv ci5oIiAzCgoKIAoKCgogCiAKIAojIDU2ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2Ut bGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIg MwoKCgogCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJ dGVyMiwgY2xhc3MgX1RwPgppbmxpbmUgdm9pZCBfX2l0ZXJfc3dhcChfRm9yd2FyZEl0ZXIxIF9f YSwgX0ZvcndhcmRJdGVyMiBfX2IsIF9UcCopIHsKICBfVHAgX190bXAgPSAqX19hOwogICpfX2Eg PSAqX19iOwogICpfX2IgPSBfX3RtcDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEs IGNsYXNzIF9Gb3J3YXJkSXRlcjI+CmlubGluZSB2b2lkIGl0ZXJfc3dhcChfRm9yd2FyZEl0ZXIx IF9fYSwgX0ZvcndhcmRJdGVyMiBfX2IpIHsKICBfX2l0ZXJfc3dhcChfX2EsIF9fYiwgX192YWx1 ZV90eXBlKCBfX2EgKSApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgdm9pZCBzd2Fw KF9UcCYgX19hLCBfVHAmIF9fYikgewogIF9UcCBfX3RtcCA9IF9fYTsKICBfX2EgPSBfX2I7CiAg X19iID0gX190bXA7Cn0KCiAKIAoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgY29u c3QgX1RwJiBtaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKSB7CiAgcmV0dXJuIF9f YiA8IF9fYSA/IF9fYiA6IF9fYTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcD4KaW5saW5lIGNvbnN0 IF9UcCYgbWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikgewogIHJldHVybiAgX19h IDwgX19iID8gX19iIDogX19hOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21w YXJlPgppbmxpbmUgY29uc3QgX1RwJiBtaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19i LCBfQ29tcGFyZSBfX2NvbXApIHsKICByZXR1cm4gX19jb21wKF9fYiwgX19hKSA/IF9fYiA6IF9f YTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CmlubGluZSBjb25zdCBf VHAmIG1heChjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIF9Db21wYXJlIF9fY29tcCkg ewogIHJldHVybiBfX2NvbXAoX19hLCBfX2IpID8gX19iIDogX19hOwp9CgogCiAKCiAKIAogCiAK IAogCiAKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xh c3MgX0Rpc3RhbmNlPgppbmxpbmUgX091dHB1dEl0ZXIgX19jb3B5KF9JbnB1dEl0ZXIgX19maXJz dCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0 ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFn LCBfRGlzdGFuY2UqKQp7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwg KytfX2ZpcnN0KQogICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CiAgcmV0dXJuIF9fcmVzdWx0Owp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBj bGFzcyBfRGlzdGFuY2U+CmlubGluZSBfT3V0cHV0SXRlcgpfX2NvcHkoX1JhbmRvbUFjY2Vzc0l0 ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAogICAgICAgX091dHB1dEl0ZXIg X19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBfRGlzdGFuY2UqKQp7CiAgZm9y IChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pIHsKICAg ICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwogICAgKytfX2ZpcnN0OwogICAgKytfX3Jlc3VsdDsKICB9 CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgX1RwKgpf X2NvcHlfdHJpdmlhbChjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAq IF9fcmVzdWx0KSB7CiAgbWVtbW92ZShfX3Jlc3VsdCwgX19maXJzdCwgc2l6ZW9mKF9UcCkgKiAo X19sYXN0IC0gX19maXJzdCkpOwogIHJldHVybiBfX3Jlc3VsdCArIChfX2xhc3QgLSBfX2ZpcnN0 KTsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNs YXNzIF9Cb29sVHlwZT4Kc3RydWN0IF9fY29weV9kaXNwYXRjaCB7CiAgc3RhdGljIF9PdXRwdXRJ dGVyIGNvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgewogICAgdHlwZWRlZiB0eXBl bmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRl Z29yeTsKICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXI+Ojpk aWZmZXJlbmNlX3R5cGUgX0Rpc3RhbmNlOwogICAgcmV0dXJuIF9fY29weShfX2ZpcnN0LCBfX2xh c3QsIF9fcmVzdWx0LCBfQ2F0ZWdvcnkoKSwgKF9EaXN0YW5jZSopIDApOwogIH0KfTsKCnRlbXBs YXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBfX2NvcHlfZGlzcGF0Y2g8X1RwKiwgX1RwKiwgX190cnVl X3R5cGU+CnsKICBzdGF0aWMgX1RwKiBjb3B5KGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1Rw KiBfX2xhc3QsIF9UcCogX19yZXN1bHQpIHsKICAgIHJldHVybiBfX2NvcHlfdHJpdmlhbChfX2Zp cnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1 Y3QgX19jb3B5X2Rpc3BhdGNoPGNvbnN0IF9UcCosIF9UcCosIF9fdHJ1ZV90eXBlPgp7CiAgc3Rh dGljIF9UcCogY29weShjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAq IF9fcmVzdWx0KSB7CiAgICByZXR1cm4gX19jb3B5X3RyaXZpYWwoX19maXJzdCwgX19sYXN0LCBf X3Jlc3VsdCk7CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRw dXRJdGVyPgppbmxpbmUgX091dHB1dEl0ZXIgY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1 dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3Vs dCkgewogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXI+Ojp2YWx1 ZV90eXBlIF9UcDsKICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3Ry aXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcgogICAgICAgICAgX1RyaXZpYWw7CiAgcmV0dXJuIF9f Y29weV9kaXNwYXRjaDxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlciwgX1RyaXZpYWw+CiAgICA6OmNv cHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Cn0KCiMgMjEzICIvdXNyL2xpYi9nY2MtbGli L2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3Rs X2FsZ29iYXNlLmgiIDMKCgogCiAKCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIx LCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIyLCAKICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4K aW5saW5lIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19jb3B5X2JhY2t3YXJkKF9CaWRpcmVjdGlvbmFs SXRlcjEgX19maXJzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fcmVzdWx0LAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90 YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2Uq KQp7CiAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQogICAgKi0tX19yZXN1bHQgPSAqLS1fX2xh c3Q7CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0 ZXIsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgX0Jp ZGlyZWN0aW9uYWxJdGVyIF9fY29weV9iYWNrd2FyZChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0 LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vz c0l0ZXIgX19sYXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X0JpZGlyZWN0aW9uYWxJdGVyIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKikKewogIGZvciAoX0Rpc3RhbmNl IF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKQogICAgKi0tX19yZXN1bHQg PSAqLS1fX2xhc3Q7CiAgcmV0dXJuIF9fcmVzdWx0Owp9CgoKCiAKIAogCiAKCnRlbXBsYXRlIDxj bGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIxLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIyLAogICAg ICAgICAgY2xhc3MgX0Jvb2xUeXBlPgpzdHJ1Y3QgX19jb3B5X2JhY2t3YXJkX2Rpc3BhdGNoCnsK ICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXIxPjo6 aXRlcmF0b3JfY2F0ZWdvcnkgCiAgICAgICAgICBfQ2F0OwogIHR5cGVkZWYgdHlwZW5hbWUgaXRl cmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcjE+OjpkaWZmZXJlbmNlX3R5cGUKICAgICAg ICAgIF9EaXN0YW5jZTsKCiAgc3RhdGljIF9CaWRpcmVjdGlvbmFsSXRlcjIgY29weShfQmlkaXJl Y3Rpb25hbEl0ZXIxIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X0JpZGlyZWN0aW9uYWxJdGVyMSBfX2xhc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX3Jlc3VsdCkgewogICAgcmV0dXJuIF9fY29weV9i YWNrd2FyZChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfQ2F0KCksIChfRGlzdGFuY2UqKSAw KTsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX19jb3B5X2JhY2t3YXJkX2Rp c3BhdGNoPF9UcCosIF9UcCosIF9fdHJ1ZV90eXBlPgp7CiAgc3RhdGljIF9UcCogY29weShjb25z dCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAqIF9fcmVzdWx0KSB7CiAgICBj b25zdCBwdHJkaWZmX3QgX051bSA9IF9fbGFzdCAtIF9fZmlyc3Q7CiAgICBtZW1tb3ZlKF9fcmVz dWx0IC0gX051bSwgX19maXJzdCwgc2l6ZW9mKF9UcCkgKiBfTnVtKTsKICAgIHJldHVybiBfX3Jl c3VsdCAtIF9OdW07CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9fY29weV9i YWNrd2FyZF9kaXNwYXRjaDxjb25zdCBfVHAqLCBfVHAqLCBfX3RydWVfdHlwZT4KewogIHN0YXRp YyBfVHAqIGNvcHkoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwgX1RwKiBf X3Jlc3VsdCkgewogICAgcmV0dXJuICBfX2NvcHlfYmFja3dhcmRfZGlzcGF0Y2g8X1RwKiwgX1Rw KiwgX190cnVlX3R5cGU+CiAgICAgIDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsK ICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JJMSwgY2xhc3MgX0JJMj4KaW5saW5lIF9CSTIgY29w eV9iYWNrd2FyZChfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KSB7CiAg dHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxf QkkyPjo6dmFsdWVfdHlwZT4KICAgICAgICAgICAgICAgICAgICAgICAgOjpoYXNfdHJpdmlhbF9h c3NpZ25tZW50X29wZXJhdG9yCiAgICAgICAgICBfVHJpdmlhbDsKICByZXR1cm4gX19jb3B5X2Jh Y2t3YXJkX2Rpc3BhdGNoPF9CSTEsIF9CSTIsIF9Ucml2aWFsPgogICAgICAgICAgICAgIDo6Y29w eShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKfQoKIyAzMDMgIi91c3IvbGliL2djYy1saWIv aTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxf YWxnb2Jhc2UuaCIgMwoKCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9T aXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KcGFpcjxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlcj4gX19j b3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKSB7CiAgZm9yICgg OyBfX2NvdW50ID4gMDsgLS1fX2NvdW50KSB7CiAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKICAg ICsrX19maXJzdDsKICAgICsrX19yZXN1bHQ7CiAgfQogIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIs IF9PdXRwdXRJdGVyPihfX2ZpcnN0LCBfX3Jlc3VsdCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUkFJ dGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX091dHB1dEl0ZXI+CmlubGluZSBwYWlyPF9SQUl0ZXIs IF9PdXRwdXRJdGVyPgpfX2NvcHlfbihfUkFJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCiAg ICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAogICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJh dG9yX3RhZykgewogIF9SQUl0ZXIgX19sYXN0ID0gX19maXJzdCArIF9fY291bnQ7CiAgcmV0dXJu IHBhaXI8X1JBSXRlciwgX091dHB1dEl0ZXI+KF9fbGFzdCwgY29weShfX2ZpcnN0LCBfX2xhc3Qs IF9fcmVzdWx0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwg Y2xhc3MgX091dHB1dEl0ZXI+CmlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPgpf X2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsIF9PdXRwdXRJdGVyIF9f cmVzdWx0KSB7CiAgcmV0dXJuIF9fY29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LAog ICAgICAgICAgICAgICAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KCBfX2ZpcnN0ICkgKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4K aW5saW5lIHBhaXI8X0lucHV0SXRlciwgX091dHB1dEl0ZXI+CmNvcHlfbihfSW5wdXRJdGVyIF9f Zmlyc3QsIF9TaXplIF9fY291bnQsIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CiAgcmV0dXJuIF9f Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0KTsKfQoKIAogCgoKdGVtcGxhdGUgPGNs YXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgp2b2lkIGZpbGwoX0ZvcndhcmRJdGVyIF9fZmly c3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSkgewogIGZvciAoIDsg X19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKICAgICpfX2ZpcnN0ID0gX192YWx1ZTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgpfT3V0 cHV0SXRlciBmaWxsX24oX091dHB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAm IF9fdmFsdWUpIHsKICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZmlyc3QpCiAgICAqX19m aXJzdCA9IF9fdmFsdWU7CiAgcmV0dXJuIF9fZmlyc3Q7Cn0KCiAKIAoKdGVtcGxhdGUgPGNsYXNz IF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KcGFpcjxfSW5wdXRJdGVyMSwgX0lucHV0 SXRlcjI+IG1pc21hdGNoKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyKSB7CiAgd2hpbGUg KF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgKl9fZmlyc3QxID09ICpfX2ZpcnN0MikgewogICAgKytf X2ZpcnN0MTsKICAgICsrX19maXJzdDI7CiAgfQogIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIxLCBf SW5wdXRJdGVyMj4oX19maXJzdDEsIF9fZmlyc3QyKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1 dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KcGFpcjxf SW5wdXRJdGVyMSwgX0lucHV0SXRlcjI+IG1pc21hdGNoKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjEgX19sYXN0 MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9f Zmlyc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVBy ZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CiAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYg X19iaW5hcnlfcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKICAgICsrX19maXJzdDE7CiAg ICArK19fZmlyc3QyOwogIH0KICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyMSwgX0lucHV0SXRlcjI+ KF9fZmlyc3QxLCBfX2ZpcnN0Mik7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xh c3MgX0lucHV0SXRlcjI+CmlubGluZSBib29sIGVxdWFsKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBf SW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0 MikgewogIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0 MikKICAgIGlmICgqX19maXJzdDEgIT0gKl9fZmlyc3QyKQogICAgICByZXR1cm4gZmFsc2U7CiAg cmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0 SXRlcjIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CmlubGluZSBib29sIGVxdWFsKF9JbnB1dEl0 ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICBfSW5w dXRJdGVyMiBfX2ZpcnN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CiAgZm9y ICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQogICAgaWYg KCFfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKICAgICAgcmV0dXJuIGZhbHNl OwogIHJldHVybiB0cnVlOwp9CgogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBj bGFzcyBfSW5wdXRJdGVyMj4KYm9vbCBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSW5wdXRJdGVy MSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgewogIGZvciAo IDsgX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyCiAgICAgICAgOyAr K19fZmlyc3QxLCArK19fZmlyc3QyKSB7CiAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQog ICAgICByZXR1cm4gdHJ1ZTsKICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCiAgICAgIHJl dHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIF9fZmlyc3QxID09IF9fbGFzdDEgJiYgX19maXJzdDIg IT0gX19sYXN0MjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJ dGVyMiwgY2xhc3MgX0NvbXBhcmU+CmJvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lucHV0 SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CiAgZm9yICggOyBfX2Zp cnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIKICAgICAgICA7ICsrX19maXJz dDEsICsrX19maXJzdDIpIHsKICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKQog ICAgICByZXR1cm4gdHJ1ZTsKICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQog ICAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBfX2ZpcnN0MSA9PSBfX2xhc3QxICYmIF9f Zmlyc3QyICE9IF9fbGFzdDI7Cn0KCmlubGluZSBib29sIApsZXhpY29ncmFwaGljYWxfY29tcGFy ZShjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0MSwKICAgICAgICAgICAgICAgICAgICAgICAg Y29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgY29u c3QgdW5zaWduZWQgY2hhciogX19maXJzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDIpCnsKICBjb25zdCBzaXplX3QgX19sZW4xID0gX19sYXN0 MSAtIF9fZmlyc3QxOwogIGNvbnN0IHNpemVfdCBfX2xlbjIgPSBfX2xhc3QyIC0gX19maXJzdDI7 CiAgY29uc3QgaW50IF9fcmVzdWx0ID0gbWVtY21wKF9fZmlyc3QxLCBfX2ZpcnN0MiwgbWluKF9f bGVuMSwgX19sZW4yKSk7CiAgcmV0dXJuIF9fcmVzdWx0ICE9IDAgPyBfX3Jlc3VsdCA8IDAgOiBf X2xlbjEgPCBfX2xlbjI7Cn0KCmlubGluZSBib29sIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKGNv bnN0IGNoYXIqIF9fZmlyc3QxLCBjb25zdCBjaGFyKiBfX2xhc3QxLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBfX2ZpcnN0MiwgY29uc3QgY2hhciogX19s YXN0MikKewoKICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKGNvbnN0IHNpZ25lZCBj aGFyKikgX19maXJzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBz aWduZWQgY2hhciopIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChj b25zdCBzaWduZWQgY2hhciopIF9fZmlyc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2xhc3QyKTsKCgoKCgoKfQoKdGVtcGxhdGUgPGNs YXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KaW50IF9fbGV4aWNvZ3JhcGhpY2Fs X2NvbXBhcmVfM3dheShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0Miwg X0lucHV0SXRlcjIgX19sYXN0MikKewogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9f Zmlyc3QyICE9IF9fbGFzdDIpIHsKICAgIGlmICgqX19maXJzdDEgPCAqX19maXJzdDIpCiAgICAg IHJldHVybiAtMTsKICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCiAgICAgIHJldHVybiAx OwogICAgKytfX2ZpcnN0MTsKICAgICsrX19maXJzdDI7CiAgfQogIGlmIChfX2ZpcnN0MiA9PSBf X2xhc3QyKSB7CiAgICByZXR1cm4gIShfX2ZpcnN0MSA9PSBfX2xhc3QxKTsKICB9CiAgZWxzZSB7 CiAgICByZXR1cm4gLTE7CiAgfQp9CgppbmxpbmUgaW50Cl9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBh cmVfM3dheShjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0MSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDEsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0MiwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDIpCnsKICBj b25zdCBwdHJkaWZmX3QgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOwogIGNvbnN0IHB0cmRp ZmZfdCBfX2xlbjIgPSBfX2xhc3QyIC0gX19maXJzdDI7CiAgY29uc3QgaW50IF9fcmVzdWx0ID0g bWVtY21wKF9fZmlyc3QxLCBfX2ZpcnN0MiwgbWluKF9fbGVuMSwgX19sZW4yKSk7CiAgcmV0dXJu IF9fcmVzdWx0ICE9IDAgPyBfX3Jlc3VsdCAKICAgICAgICAgICAgICAgICAgICAgICA6IChfX2xl bjEgPT0gX19sZW4yID8gMCA6IChfX2xlbjEgPCBfX2xlbjIgPyAtMSA6IDEpKTsKfQoKaW5saW5l IGludCAKX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KGNvbnN0IGNoYXIqIF9fZmlyc3Qx LCBjb25zdCBjaGFyKiBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u c3QgY2hhciogX19maXJzdDIsIGNvbnN0IGNoYXIqIF9fbGFzdDIpCnsKCiAgcmV0dXJuIF9fbGV4 aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2ZpcnN0MSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChjb25zdCBzaWduZWQgY2hhciopIF9fZmlyc3QyLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChjb25zdCBzaWduZWQgY2hhciopIF9fbGFzdDIpOwoKCgoKCgp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgppbnQgbGV4 aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRl cjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIg X19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIpCnsKICByZXR1cm4gX19sZXhpY29ncmFwaGlj YWxfY29tcGFyZV8zd2F5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7Cn0K CiAKCgoKIAogCiAKIyAzMCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3ZlY3RvciIgMiAzCgojIDEgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9zdGxfYWxsb2MuaCIgMSAzCiAKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoK IAogCiAKIAogCiAKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRy YWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKIyAzNDIgIi91c3IvbGliL2dj Yy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKIyA1 MyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8u Li9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAyIDMKCgoKIyAxICIvdXNyL2luY2x1ZGUvYXNz ZXJ0LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgojIDMyICIvdXNyL2luY2x1ZGUvYXNz ZXJ0LmgiIDMKCgoKCgogCgoKCgojIDU2ICIvdXNyL2luY2x1ZGUvYXNzZXJ0LmgiIDMKCgpleHRl cm4gIkMiIHsgCgogCmV4dGVybiB2b2lkIF9fYXNzZXJ0X2ZhaWwgIChfX2NvbnN0IGNoYXIgKl9f YXNzZXJ0aW9uLAoJCQkJX19jb25zdCBjaGFyICpfX2ZpbGUsCgkJCQl1bnNpZ25lZCBpbnQgX19s aW5lLAoJCQkJX19jb25zdCBjaGFyICpfX2Z1bmN0aW9uKSAgdGhyb3cgKCkgIAogICAgIF9fYXR0 cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKCiAKZXh0ZXJuIHZvaWQgX19hc3NlcnRfcGVycm9y X2ZhaWwgIChpbnQgX19lcnJudW0sCgkJCQkgICAgICAgX19jb25zdCBjaGFyICpfX2ZpbGUsCgkJ CQkgICAgICAgdW5zaWduZWQgaW50IF9fbGluZSwKCQkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9f ZnVuY3Rpb24pICB0aHJvdyAoKSAgCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykp OwoKfSAKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyA1NiAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2cr Ky0zL3N0bF9hbGxvYy5oIiAyIDMKCgoKCgoKCgoKCgoKICAgICAKICAgICAKICAgICAKIyAxICIv dXNyL2luY2x1ZGUvcHRocmVhZC5oIiAxIDMKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoK CgojIDEgIi91c3IvaW5jbHVkZS9zY2hlZC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKIyAxICIvdXNyL2luY2x1ZGUvdGltZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAK CgoKCgoKCgoKCgoKCgojIDUxICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCiMgNjIgIi91c3Iv aW5jbHVkZS90aW1lLmgiIDMKCgoKIyA3MyAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoKIyA4 OSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoKIyAyNzkgIi91c3IvaW5jbHVkZS90aW1lLmgi IDMKCgoKIyAyOSAiL3Vzci9pbmNsdWRlL3NjaGVkLmgiIDIgMwoKCiAKIyAxICIvdXNyL2luY2x1 ZGUvYml0cy9zY2hlZC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgog CgoKCgoKCgoKCgoKIApzdHJ1Y3Qgc2NoZWRfcGFyYW0KICB7CiAgICBpbnQgc2NoZWRfcHJpb3Jp dHk7CiAgfTsKCmV4dGVybiAiQyIgeyAKCiAKCmV4dGVybiBpbnQgY2xvbmUgIChpbnQgKCpfX2Zu KSAodm9pZCAqX19hcmcpLCB2b2lkICpfX2NoaWxkX3N0YWNrLAoJCSAgICAgICBpbnQgX19mbGFn cywgdm9pZCAqX19hcmcpICB0aHJvdyAoKSAgOwoKCn0gCgoKCgoKCiAKc3RydWN0IF9fc2NoZWRf cGFyYW0KICB7CiAgICBpbnQgc2NoZWRfcHJpb3JpdHk7CiAgfTsKCgojIDMyICIvdXNyL2luY2x1 ZGUvc2NoZWQuaCIgMiAzCgoKZXh0ZXJuICJDIiB7IAoKIApleHRlcm4gaW50IF9fc2NoZWRfc2V0 cGFyYW0gIChfX3BpZF90IF9fcGlkLAoJCQkJICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAq X19wYXJhbSkgIHRocm93ICgpICA7CmV4dGVybiBpbnQgc2NoZWRfc2V0cGFyYW0gIChfX3BpZF90 IF9fcGlkLAoJCQkJX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pICB0aHJvdyAo KSAgOwoKIApleHRlcm4gaW50IF9fc2NoZWRfZ2V0cGFyYW0gIChfX3BpZF90IF9fcGlkLCBzdHJ1 Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHNjaGVkX2dl dHBhcmFtICAoX19waWRfdCBfX3BpZCwgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSAgdGhy b3cgKCkgIDsKCiAKZXh0ZXJuIGludCBfX3NjaGVkX3NldHNjaGVkdWxlciAgKF9fcGlkX3QgX19w aWQsIGludCBfX3BvbGljeSwKCQkJCSAgICAgIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpf X3BhcmFtKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBzY2hlZF9zZXRzY2hlZHVsZXIgIChfX3Bp ZF90IF9fcGlkLCBpbnQgX19wb2xpY3ksCgkJCQkgICAgX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFy YW0gKl9fcGFyYW0pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IF9fc2NoZWRfZ2V0c2NoZWR1 bGVyICAoX19waWRfdCBfX3BpZCkgIHRocm93ICgpICA7CmV4dGVybiBpbnQgc2NoZWRfZ2V0c2No ZWR1bGVyICAoX19waWRfdCBfX3BpZCkgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgX19zY2hl ZF95aWVsZCAgKHZvaWQpICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHNjaGVkX3lpZWxkICAodm9p ZCkgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgX19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4ICAo aW50IF9fYWxnb3JpdGhtKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBzY2hlZF9nZXRfcHJpb3Jp dHlfbWF4ICAoaW50IF9fYWxnb3JpdGhtKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBfX3Nj aGVkX2dldF9wcmlvcml0eV9taW4gIChpbnQgX19hbGdvcml0aG0pICB0aHJvdyAoKSAgOwpleHRl cm4gaW50IHNjaGVkX2dldF9wcmlvcml0eV9taW4gIChpbnQgX19hbGdvcml0aG0pICB0aHJvdyAo KSAgOwoKIApleHRlcm4gaW50IF9fc2NoZWRfcnJfZ2V0X2ludGVydmFsICAoX19waWRfdCBfX3Bp ZCwgc3RydWN0IHRpbWVzcGVjICpfX3QpICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHNjaGVkX3Jy X2dldF9pbnRlcnZhbCAgKF9fcGlkX3QgX19waWQsIHN0cnVjdCB0aW1lc3BlYyAqX190KSAgdGhy b3cgKCkgIDsKCn0gCgoKIyAyMCAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMiAzCgojIDEgIi91 c3IvaW5jbHVkZS90aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKZXh0 ZXJuICJDIiB7IAoKCgoKIAoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxp bnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoK CgogCgoKCgoKIAoKIAoKCiMgMTI2ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgogCgogCgoKIyAxODggIi91c3Iv bGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIg MwoKCgoKCiAKCgoKCiAKCgojIDI2OSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxp bnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKCgoKCgoKCgoKCgogCgogCgojIDMx NyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0 ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgogCgoKCgoKCgojIDM4ICIvdXNyL2luY2x1ZGUv dGltZS5oIiAyIDMKCgogCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3RpbWUuaCIgMSAzCiAKCgoK CgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKIAoKCiAKCgoKCgogCgoKCgoKCgojIDU5ICIvdXNyL2lu Y2x1ZGUvYml0cy90aW1lLmgiIDMKIAojIDQyICIvdXNyL2luY2x1ZGUvdGltZS5oIiAyIDMKCgog CgoKCgoKCgoKCgoKCgoKIAp0eXBlZGVmIF9fY2xvY2tfdCBjbG9ja190OwoKCgoKIyA3MyAiL3Vz ci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoKIyA4OSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoK CiAKc3RydWN0IHRtCnsKICBpbnQgdG1fc2VjOwkJCSAKICBpbnQgdG1fbWluOwkJCSAKICBpbnQg dG1faG91cjsJCQkgCiAgaW50IHRtX21kYXk7CQkJIAogIGludCB0bV9tb247CQkJIAogIGludCB0 bV95ZWFyOwkJCSAKICBpbnQgdG1fd2RheTsJCQkgCiAgaW50IHRtX3lkYXk7CQkJIAogIGludCB0 bV9pc2RzdDsJCQkgCgoKICBsb25nIGludCB0bV9nbXRvZmY7CQkgCiAgX19jb25zdCBjaGFyICp0 bV96b25lOwkgCgoKCgp9OwoKCiAKCmV4dGVybiBjbG9ja190IGNsb2NrICAodm9pZCkgIHRocm93 ICgpICA7CgogCmV4dGVybiB0aW1lX3QgdGltZSAgKHRpbWVfdCAqX190aW1lcikgIHRocm93ICgp ICA7CgogCmV4dGVybiBkb3VibGUgZGlmZnRpbWUgICh0aW1lX3QgX190aW1lMSwgdGltZV90IF9f dGltZTApICB0aHJvdyAoKSAgCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKIApl eHRlcm4gdGltZV90IG1rdGltZSAgKHN0cnVjdCB0bSAqX190cCkgIHRocm93ICgpICA7CgoKIAoK CmV4dGVybiBzaXplX3Qgc3RyZnRpbWUgIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9f bWF4c2l6ZSwKCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCgkJCSAg ICAgX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgIHRocm93ICgpICA7CgoKCgoK CgoKCiAKCmV4dGVybiBzdHJ1Y3QgdG0gKmdtdGltZSAgKF9fY29uc3QgdGltZV90ICpfX3RpbWVy KSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBzdHJ1Y3QgdG0gKmxvY2FsdGltZSAgKF9fY29uc3Qg dGltZV90ICpfX3RpbWVyKSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4gc3RydWN0IHRtICpfX2dt dGltZV9yICAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwKCQkJCSAgIHN0cnVj dCB0bSAqX19yZXN0cmljdCBfX3RwKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIHN0cnVjdCB0bSAqZ210 aW1lX3IgIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVyLAoJCQkJIHN0cnVjdCB0 bSAqX19yZXN0cmljdCBfX3RwKSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBzdHJ1Y3QgdG0gKmxv Y2FsdGltZV9yICAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwKCQkJCSAgICBz dHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgIHRocm93ICgpICA7CgoKIAoKZXh0ZXJuIGNoYXIg KmFzY3RpbWUgIChfX2NvbnN0IHN0cnVjdCB0bSAqX190cCkgIHRocm93ICgpICA7CgogCmV4dGVy biBjaGFyICpjdGltZSAgKF9fY29uc3QgdGltZV90ICpfX3RpbWVyKSAgdGhyb3cgKCkgIDsKCgog CgogCgpleHRlcm4gY2hhciAqYXNjdGltZV9yICAoX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJp Y3QgX190cCwKCQkJICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSAgdGhyb3cgKCkgIDsKCiAK ZXh0ZXJuIGNoYXIgKmN0aW1lX3IgIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVy LAoJCQkgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSAgdGhyb3cgKCkgIDsKCgoKIApleHRlcm4g Y2hhciAqX190em5hbWVbMl07CSAKZXh0ZXJuIGludCBfX2RheWxpZ2h0OwkJIApleHRlcm4gbG9u ZyBpbnQgX190aW1lem9uZTsJIAoKCgogCmV4dGVybiBjaGFyICp0em5hbWVbMl07CgogCgpleHRl cm4gdm9pZCB0enNldCAgKHZvaWQpICB0aHJvdyAoKSAgOwoKCgpleHRlcm4gaW50IGRheWxpZ2h0 OwpleHRlcm4gbG9uZyBpbnQgdGltZXpvbmU7CgoKCiAKCmV4dGVybiBpbnQgc3RpbWUgIChfX2Nv bnN0IHRpbWVfdCAqX193aGVuKSAgdGhyb3cgKCkgIDsKCgoKIAoKCgoKCgogCgoKIApleHRlcm4g dGltZV90IHRpbWVnbSAgKHN0cnVjdCB0bSAqX190cCkgIHRocm93ICgpICA7CgogCmV4dGVybiB0 aW1lX3QgdGltZWxvY2FsICAoc3RydWN0IHRtICpfX3RwKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJu IGludCBkeXNpemUgIChpbnQgX195ZWFyKSAgdGhyb3cgKCkgIDsKCgoKCiAKZXh0ZXJuIGludCBu YW5vc2xlZXAgIChfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXF1ZXN0ZWRfdGltZSwKCQkJ ICAgc3RydWN0IHRpbWVzcGVjICpfX3JlbWFpbmluZykgIHRocm93ICgpICA7CgoKCiMgMjY0ICIv dXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKIyAyNzQgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoK fSAKCgoKCiMgMjEgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDIgMwoKCgojIDEgIi91c3IvaW5j bHVkZS9zaWduYWwuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKZXh0ZXJu ICJDIiB7IAoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zaWdzZXQuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgoKIyAzMyAiL3Vzci9pbmNsdWRlL2JpdHMvc2lnc2V0LmgiIDMKCgoKIAoKCgoKCiMg MTI1ICIvdXNyL2luY2x1ZGUvYml0cy9zaWdzZXQuaCIgMwoKIyAzMyAiL3Vzci9pbmNsdWRlL3Np Z25hbC5oIiAyIDMKCgogCgoKCgoKCgoKCgoKCgp0eXBlZGVmIF9fc2lnc2V0X3Qgc2lnc2V0X3Q7 CgoKCiMgMzYwICIvdXNyL2luY2x1ZGUvc2lnbmFsLmgiIDMKCgp9IAoKCiMgMjQgIi91c3IvaW5j bHVkZS9wdGhyZWFkLmgiIDIgMwoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMu aCIgMSAzCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1 ZGUvYml0cy9zY2hlZC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKIyA2MiAiL3Vzci9pbmNs dWRlL2JpdHMvc2NoZWQuaCIgMwoKCiMgNzMgIi91c3IvaW5jbHVkZS9iaXRzL3NjaGVkLmgiIDMK CiMgMjMgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAyIDMKCgogCnN0cnVjdCBf cHRocmVhZF9mYXN0bG9jawp7CiAgbG9uZyBpbnQgX19zdGF0dXM7ICAgICAgICAgICAgIAogIGlu dCBfX3NwaW5sb2NrOyAgICAgICAgICAgICAgICAKfTsKCgogCnR5cGVkZWYgc3RydWN0IF9wdGhy ZWFkX2Rlc2NyX3N0cnVjdCAqX3B0aHJlYWRfZGVzY3I7CgoKCgogCnR5cGVkZWYgc3RydWN0CnsK ICBpbnQgX19kZXRhY2hzdGF0ZTsKICBpbnQgX19zY2hlZHBvbGljeTsKICBzdHJ1Y3QgX19zY2hl ZF9wYXJhbSBfX3NjaGVkcGFyYW07CiAgaW50IF9faW5oZXJpdHNjaGVkOwogIGludCBfX3Njb3Bl OwogIHNpemVfdCBfX2d1YXJkc2l6ZTsKICBpbnQgX19zdGFja2FkZHJfc2V0OwogIHZvaWQgKl9f c3RhY2thZGRyOwogIHNpemVfdCBfX3N0YWNrc2l6ZTsKfSBwdGhyZWFkX2F0dHJfdDsKCgogCnR5 cGVkZWYgc3RydWN0CnsKICBzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19jX2xvY2s7ICAKICBf cHRocmVhZF9kZXNjciBfX2Nfd2FpdGluZzsgICAgICAgICAKfSBwdGhyZWFkX2NvbmRfdDsKCgog CnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19kdW1teTsKfSBwdGhyZWFkX2NvbmRhdHRyX3Q7Cgog CnR5cGVkZWYgdW5zaWduZWQgaW50IHB0aHJlYWRfa2V5X3Q7CgoKIAogCgp0eXBlZGVmIHN0cnVj dAp7CiAgaW50IF9fbV9yZXNlcnZlZDsgICAgICAgICAgICAgICAgCiAgaW50IF9fbV9jb3VudDsg ICAgICAgICAgICAgICAgICAgCiAgX3B0aHJlYWRfZGVzY3IgX19tX293bmVyOyAgICAgICAgCiAg aW50IF9fbV9raW5kOyAgICAgICAgICAgICAgICAgICAgCiAgc3RydWN0IF9wdGhyZWFkX2Zhc3Rs b2NrIF9fbV9sb2NrOyAgCn0gcHRocmVhZF9tdXRleF90OwoKCiAKdHlwZWRlZiBzdHJ1Y3QKewog IGludCBfX211dGV4a2luZDsKfSBwdGhyZWFkX211dGV4YXR0cl90OwoKCiAKdHlwZWRlZiBpbnQg cHRocmVhZF9vbmNlX3Q7CgoKIyAxMTYgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5o IiAzCgoKCiAKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBwdGhyZWFkX3Q7CgoKIyAyNSAiL3Vz ci9pbmNsdWRlL3B0aHJlYWQuaCIgMiAzCgoKCmV4dGVybiAiQyIgeyAKCiAKCgoKCgoKCgoKCgoK CgoKCiAKCmVudW0KewogIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFLAoKICBQVEhSRUFEX0NSRUFU RV9ERVRBQ0hFRAoKfTsKCmVudW0KewogIFBUSFJFQURfSU5IRVJJVF9TQ0hFRCwKCiAgUFRIUkVB RF9FWFBMSUNJVF9TQ0hFRAoKfTsKCmVudW0KewogIFBUSFJFQURfU0NPUEVfU1lTVEVNLAoKICBQ VEhSRUFEX1NDT1BFX1BST0NFU1MKCn07CgplbnVtCnsKICBQVEhSRUFEX01VVEVYX0ZBU1RfTlAs CiAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAsCiAgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNL X05QCgoKCgoKCgp9OwoKZW51bQp7CiAgUFRIUkVBRF9QUk9DRVNTX1BSSVZBVEUsCgogIFBUSFJF QURfUFJPQ0VTU19TSEFSRUQKCn07CgojIDEwMyAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwoK CgoKIAoKc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyCnsKICB2b2lkICgqX19yb3V0aW5l KSAgKHZvaWQgKikgIDsJICAgCiAgdm9pZCAqX19hcmc7CQkJCSAgIAogIGludCBfX2NhbmNlbHR5 cGU7CQkJICAgCiAgc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpfX3ByZXY7ICAKfTsK CiAKCmVudW0KewogIFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwKCiAgUFRIUkVBRF9DQU5DRUxfRElT QUJMRQoKfTsKZW51bQp7CiAgUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQsCgogIFBUSFJFQURfQ0FO Q0VMX0FTWU5DSFJPTk9VUwoKfTsKCgoKIAoKIAoKCmV4dGVybiBpbnQgcHRocmVhZF9jcmVhdGUg IChwdGhyZWFkX3QgKl9fdGhyZWFkLAoJCQkJX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRy LAoJCQkJdm9pZCAqKCpfX3N0YXJ0X3JvdXRpbmUpICh2b2lkICopLAoJCQkJdm9pZCAqX19hcmcp ICB0aHJvdyAoKSAgOwoKIApleHRlcm4gcHRocmVhZF90IHB0aHJlYWRfc2VsZiAgKHZvaWQpICB0 aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfZXF1YWwgIChwdGhyZWFkX3QgX190aHJl YWQxLCBwdGhyZWFkX3QgX190aHJlYWQyKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgcHRo cmVhZF9leGl0ICAodm9pZCAqX19yZXR2YWwpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChf X25vcmV0dXJuX18pKTsKCiAKCgpleHRlcm4gaW50IHB0aHJlYWRfam9pbiAgKHB0aHJlYWRfdCBf X3RoLCB2b2lkICoqX190aHJlYWRfcmV0dXJuKSAgdGhyb3cgKCkgIDsKCiAKCgoKZXh0ZXJuIGlu dCBwdGhyZWFkX2RldGFjaCAgKHB0aHJlYWRfdCBfX3RoKSAgdGhyb3cgKCkgIDsKCgogCgogCgoK ZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfaW5pdCAgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIpICB0 aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9kZXN0cm95ICAocHRocmVhZF9h dHRyX3QgKl9fYXR0cikgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3Nl dGRldGFjaHN0YXRlICAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKCQkJCQkgICAgIGludCBfX2Rl dGFjaHN0YXRlKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0ZGV0 YWNoc3RhdGUgIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCgkJCQkJICAgICBpbnQg Kl9fZGV0YWNoc3RhdGUpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9z ZXRzY2hlZHBhcmFtICAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKCQkJCSAgICAgICAgX19jb25z dCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50 IHB0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtICAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19h dHRyLAoJCQkJCSAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pICB0aHJvdyAoKSAgOwoK IApleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSAgKHB0aHJlYWRfYXR0cl90 ICpfX2F0dHIsCgkJCQkJICAgICBpbnQgX19wb2xpY3kpICB0aHJvdyAoKSAgOwoKIApleHRlcm4g aW50IHB0aHJlYWRfYXR0cl9nZXRzY2hlZHBvbGljeSAgKF9fY29uc3QgcHRocmVhZF9hdHRyX3Qg Kl9fYXR0ciwKCQkJCQkgICAgIGludCAqX19wb2xpY3kpICB0aHJvdyAoKSAgOwoKIApleHRlcm4g aW50IHB0aHJlYWRfYXR0cl9zZXRpbmhlcml0c2NoZWQgIChwdGhyZWFkX2F0dHJfdCAqX19hdHRy LAoJCQkJCSAgICAgIGludCBfX2luaGVyaXQpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0 aHJlYWRfYXR0cl9nZXRpbmhlcml0c2NoZWQgIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0 dHIsCgkJCQkJICAgICAgaW50ICpfX2luaGVyaXQpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50 IHB0aHJlYWRfYXR0cl9zZXRzY29wZSAgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIGludCBfX3Nj b3BlKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c2NvcGUgIChf X2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCgkJCQkgICAgICAgaW50ICpfX3Njb3BlKSAg dGhyb3cgKCkgIDsKCiMgMjI0ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCgoKIAoKCgpleHRl cm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzdGFja2FkZHIgIChwdGhyZWFkX2F0dHJfdCAqX19hdHRy LAoJCQkJCSAgIHZvaWQgKl9fc3RhY2thZGRyKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBw dGhyZWFkX2F0dHJfZ2V0c3RhY2thZGRyICAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRy LAoJCQkJCSAgIHZvaWQgKipfX3N0YWNrYWRkcikgIHRocm93ICgpICA7CgogCgoKZXh0ZXJuIGlu dCBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplICAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKCQkJ CQkgICBzaXplX3QgX19zdGFja3NpemUpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0aHJl YWRfYXR0cl9nZXRzdGFja3NpemUgIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCgkJ CQkJICAgc2l6ZV90ICpfX3N0YWNrc2l6ZSkgIHRocm93ICgpICA7CgogCgogCgpleHRlcm4gaW50 IHB0aHJlYWRfc2V0c2NoZWRwYXJhbSAgKHB0aHJlYWRfdCBfX3RhcmdldF90aHJlYWQsIGludCBf X3BvbGljeSwKCQkJCSAgICAgICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkg IHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9nZXRzY2hlZHBhcmFtICAocHRocmVh ZF90IF9fdGFyZ2V0X3RocmVhZCwKCQkJCSAgICAgICBpbnQgKl9fcG9saWN5LAoJCQkJICAgICAg IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgIHRocm93ICgpICA7CgoKCgoKCgoKCiAKCiAK CmV4dGVybiBpbnQgX19wdGhyZWFkX211dGV4X2luaXQgIChwdGhyZWFkX211dGV4X3QgKl9fbXV0 ZXgsCgkJCQkgICBfX2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fbXV0ZXhfYXR0cikgIHRo cm93ICgpICA7CmV4dGVybiBpbnQgcHRocmVhZF9tdXRleF9pbml0ICAocHRocmVhZF9tdXRleF90 ICpfX211dGV4LAoJCQkJICAgX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4X2F0 dHIpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9kZXN0cm95ICAo cHRocmVhZF9tdXRleF90ICpfX211dGV4KSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBwdGhyZWFk X211dGV4X2Rlc3Ryb3kgIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpICB0aHJvdyAoKSAgOwoK IApleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF90cnlsb2NrICAocHRocmVhZF9tdXRleF90ICpf X211dGV4KSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X3RyeWxvY2sgIChw dGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IF9fcHRo cmVhZF9tdXRleF9sb2NrICAocHRocmVhZF9tdXRleF90ICpfX211dGV4KSAgdGhyb3cgKCkgIDsK ZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2xvY2sgIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgp ICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF91bmxvY2sgIChwdGhy ZWFkX211dGV4X3QgKl9fbXV0ZXgpICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHB0aHJlYWRfbXV0 ZXhfdW5sb2NrICAocHRocmVhZF9tdXRleF90ICpfX211dGV4KSAgdGhyb3cgKCkgIDsKCgogCgog CgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCAgKHB0aHJlYWRfbXV0ZXhhdHRy X3QgKl9fYXR0cikgIHRocm93ICgpICA7CmV4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfaW5p dCAgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cikgIHRocm93ICgpICA7CgogCmV4dGVybiBp bnQgX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICAocHRocmVhZF9tdXRleGF0dHJfdCAqX19h dHRyKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICAo cHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKSAgdGhyb3cgKCkgIDsKCiMgMzE2ICIvdXNyL2lu Y2x1ZGUvcHRocmVhZC5oIiAzCgoKCiAKCiAKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX2luaXQg IChwdGhyZWFkX2NvbmRfdCAqX19jb25kLAoJCQkJICAgX19jb25zdCBwdGhyZWFkX2NvbmRhdHRy X3QgKl9fY29uZF9hdHRyKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRf ZGVzdHJveSAgKHB0aHJlYWRfY29uZF90ICpfX2NvbmQpICB0aHJvdyAoKSAgOwoKIApleHRlcm4g aW50IHB0aHJlYWRfY29uZF9zaWduYWwgIChwdGhyZWFkX2NvbmRfdCAqX19jb25kKSAgdGhyb3cg KCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0ICAocHRocmVhZF9jb25k X3QgKl9fY29uZCkgIHRocm93ICgpICA7CgogCgpleHRlcm4gaW50IHB0aHJlYWRfY29uZF93YWl0 ICAocHRocmVhZF9jb25kX3QgKl9fY29uZCwKCQkJCSAgIHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRl eCkgIHRocm93ICgpICA7CgogCgoKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX3RpbWVkd2FpdCAg KHB0aHJlYWRfY29uZF90ICpfX2NvbmQsCgkJCQkJcHRocmVhZF9tdXRleF90ICpfX211dGV4LAoJ CQkJCV9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX2Fic3RpbWUpICB0aHJvdyAoKSAgOwoKIAoK IApleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfaW5pdCAgKHB0aHJlYWRfY29uZGF0dHJfdCAq X19hdHRyKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ry b3kgIChwdGhyZWFkX2NvbmRhdHRyX3QgKl9fYXR0cikgIHRocm93ICgpICA7CgoKIyA0MDkgIi91 c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDMKCgoKIAoKIAoKCgoKCmV4dGVybiBpbnQgX19wdGhyZWFk X2tleV9jcmVhdGUgIChwdGhyZWFkX2tleV90ICpfX2tleSwKCQkJCSAgICAgIHZvaWQgKCpfX2Rl c3RyX2Z1bmN0aW9uKSAodm9pZCAqKSkgIHRocm93ICgpICA7CmV4dGVybiBpbnQgcHRocmVhZF9r ZXlfY3JlYXRlICAocHRocmVhZF9rZXlfdCAqX19rZXksCgkJCQkgICAgdm9pZCAoKl9fZGVzdHJf ZnVuY3Rpb24pICh2b2lkICopKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2tl eV9kZWxldGUgIChwdGhyZWFkX2tleV90IF9fa2V5KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGlu dCBfX3B0aHJlYWRfc2V0c3BlY2lmaWMgIChwdGhyZWFkX2tleV90IF9fa2V5LAoJCQkJICAgICAg IF9fY29uc3Qgdm9pZCAqX19wb2ludGVyKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBwdGhyZWFk X3NldHNwZWNpZmljICAocHRocmVhZF9rZXlfdCBfX2tleSwKCQkJCSAgICAgX19jb25zdCB2b2lk ICpfX3BvaW50ZXIpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gdm9pZCAqX19wdGhyZWFkX2dldHNw ZWNpZmljICAocHRocmVhZF9rZXlfdCBfX2tleSkgIHRocm93ICgpICA7CmV4dGVybiB2b2lkICpw dGhyZWFkX2dldHNwZWNpZmljICAocHRocmVhZF9rZXlfdCBfX2tleSkgIHRocm93ICgpICA7CgoK IAoKIAoKCgpleHRlcm4gaW50IF9fcHRocmVhZF9vbmNlICAocHRocmVhZF9vbmNlX3QgKl9fb25j ZV9jb250cm9sLAoJCQkJdm9pZCAoKl9faW5pdF9yb3V0aW5lKSAodm9pZCkpICB0aHJvdyAoKSAg OwpleHRlcm4gaW50IHB0aHJlYWRfb25jZSAgKHB0aHJlYWRfb25jZV90ICpfX29uY2VfY29udHJv bCwKCQkJICAgICAgdm9pZCAoKl9faW5pdF9yb3V0aW5lKSAodm9pZCkpICB0aHJvdyAoKSAgOwoK CiAKCiAKCmV4dGVybiBpbnQgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSAgKGludCBfX3N0YXRlLCBp bnQgKl9fb2xkc3RhdGUpICB0aHJvdyAoKSAgOwoKIAoKZXh0ZXJuIGludCBwdGhyZWFkX3NldGNh bmNlbHR5cGUgIChpbnQgX190eXBlLCBpbnQgKl9fb2xkdHlwZSkgIHRocm93ICgpICA7CgogCmV4 dGVybiBpbnQgcHRocmVhZF9jYW5jZWwgIChwdGhyZWFkX3QgX190aHJlYWQpICB0aHJvdyAoKSAg OwoKIAoKCmV4dGVybiB2b2lkIHB0aHJlYWRfdGVzdGNhbmNlbCAgKHZvaWQpICB0aHJvdyAoKSAg OwoKCiAKCgoKCgoKCgoKCmV4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaCAgKHN0cnVj dCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqX19idWZmZXIsCgkJCQkJdm9pZCAoKl9fcm91dGlu ZSkgKHZvaWQgKiksCgkJCQkJdm9pZCAqX19hcmcpICB0aHJvdyAoKSAgOwoKIAoKCgoKCmV4dGVy biB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wICAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVm ZmVyICpfX2J1ZmZlciwKCQkJCSAgICAgICBpbnQgX19leGVjdXRlKSAgdGhyb3cgKCkgIDsKCiAK CgojIDUxNSAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwoKCiAKIyAxICIvdXNyL2luY2x1ZGUv Yml0cy9zaWd0aHJlYWQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCiAKCmV4 dGVybiBpbnQgcHRocmVhZF9zaWdtYXNrICAoaW50IF9faG93LCBfX2NvbnN0IF9fc2lnc2V0X3Qg Kl9fbmV3bWFzaywKCQkJCSBfX3NpZ3NldF90ICpfX29sZG1hc2spICB0aHJvdyAoKSAgOwoKIApl eHRlcm4gaW50IHB0aHJlYWRfa2lsbCAgKHB0aHJlYWRfdCBfX3RocmVhZCwgaW50IF9fc2lnbm8p ICB0aHJvdyAoKSAgOwoKCiMgNTE4ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAyIDMKCgoKIAoK IAoKCgoKCgoKCgoKZXh0ZXJuIGludCBfX3B0aHJlYWRfYXRmb3JrICAodm9pZCAoKl9fcHJlcGFy ZSkgKHZvaWQpLAoJCQkJICB2b2lkICgqX19wYXJlbnQpICh2b2lkKSwKCQkJCSAgdm9pZCAoKl9f Y2hpbGQpICh2b2lkKSkgIHRocm93ICgpICA7CmV4dGVybiBpbnQgcHRocmVhZF9hdGZvcmsgICh2 b2lkICgqX19wcmVwYXJlKSAodm9pZCksCgkJCQl2b2lkICgqX19wYXJlbnQpICh2b2lkKSwKCQkJ CXZvaWQgKCpfX2NoaWxkKSAodm9pZCkpICB0aHJvdyAoKSAgOwoKIAoKCmV4dGVybiB2b2lkIHB0 aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wICAodm9pZCkgIHRocm93ICgpICA7CgoKIApleHRl cm4gdm9pZCBfX3B0aHJlYWRfaW5pdGlhbGl6ZSAgKHZvaWQpICB0aHJvdyAoKSAgOwoKfSAKCgoj IDcxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4u Ly4uL2luY2x1ZGUvZysrLTMvc3RsX2FsbG9jLmgiIDIgMwoKCgoKCgoKCiMgODcgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9zdGxfYWxsb2MuaCIgMwoKIyA5NyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtl LWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAzCgoj IDExNSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8u Li8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAzCgoKCgoKCgoKCiAKCgoKCgogCiAKCgoK CgoKCgoKdGVtcGxhdGUgPGludCBfX2luc3Q+CmNsYXNzIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRl IHsKCnByaXZhdGU6CgogIHN0YXRpYyB2b2lkKiBfU19vb21fbWFsbG9jKHNpemVfdCk7CiAgc3Rh dGljIHZvaWQqIF9TX29vbV9yZWFsbG9jKHZvaWQqLCBzaXplX3QpOwoKCiAgc3RhdGljIHZvaWQg KCogX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRsZXIpKCk7CgoKcHVibGljOgoKICBzdGF0aWMgdm9p ZCogYWxsb2NhdGUoc2l6ZV90IF9fbikKICB7CiAgICB2b2lkKiBfX3Jlc3VsdCA9IG1hbGxvYyhf X24pOwogICAgaWYgKDAgPT0gX19yZXN1bHQpIF9fcmVzdWx0ID0gX1Nfb29tX21hbGxvYyhfX24p OwogICAgcmV0dXJuIF9fcmVzdWx0OwogIH0KCiAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZSh2b2lk KiBfX3AsIHNpemVfdCAgKQogIHsKICAgIGZyZWUoX19wKTsKICB9CgogIHN0YXRpYyB2b2lkKiBy ZWFsbG9jYXRlKHZvaWQqIF9fcCwgc2l6ZV90ICAsIHNpemVfdCBfX25ld19zeikKICB7CiAgICB2 b2lkKiBfX3Jlc3VsdCA9IHJlYWxsb2MoX19wLCBfX25ld19zeik7CiAgICBpZiAoMCA9PSBfX3Jl c3VsdCkgX19yZXN1bHQgPSBfU19vb21fcmVhbGxvYyhfX3AsIF9fbmV3X3N6KTsKICAgIHJldHVy biBfX3Jlc3VsdDsKICB9CgogIHN0YXRpYyB2b2lkICgqIF9fc2V0X21hbGxvY19oYW5kbGVyKHZv aWQgKCpfX2YpKCkpKSgpCiAgewogICAgdm9pZCAoKiBfX29sZCkoKSA9IF9fbWFsbG9jX2FsbG9j X29vbV9oYW5kbGVyOwogICAgX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRsZXIgPSBfX2Y7CiAgICBy ZXR1cm4oX19vbGQpOwogIH0KCn07CgogCgoKdGVtcGxhdGUgPGludCBfX2luc3Q+CnZvaWQgKCog X19tYWxsb2NfYWxsb2NfdGVtcGxhdGU8X19pbnN0Pjo6X19tYWxsb2NfYWxsb2Nfb29tX2hhbmRs ZXIpKCkgPSAwOwoKCnRlbXBsYXRlIDxpbnQgX19pbnN0Pgp2b2lkKgpfX21hbGxvY19hbGxvY190 ZW1wbGF0ZTxfX2luc3Q+OjpfU19vb21fbWFsbG9jKHNpemVfdCBfX24pCnsKICAgIHZvaWQgKCog X19teV9tYWxsb2NfaGFuZGxlcikoKTsKICAgIHZvaWQqIF9fcmVzdWx0OwoKICAgIGZvciAoOzsp IHsKICAgICAgICBfX215X21hbGxvY19oYW5kbGVyID0gX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRs ZXI7CiAgICAgICAgaWYgKDAgPT0gX19teV9tYWxsb2NfaGFuZGxlcikgeyBjZXJyIDw8ICJvdXQg b2YgbWVtb3J5IiA8PCBlbmRsOyBleGl0KDEpIDsgfQogICAgICAgICgqX19teV9tYWxsb2NfaGFu ZGxlcikoKTsKICAgICAgICBfX3Jlc3VsdCA9IG1hbGxvYyhfX24pOwogICAgICAgIGlmIChfX3Jl c3VsdCkgcmV0dXJuKF9fcmVzdWx0KTsKICAgIH0KfQoKdGVtcGxhdGUgPGludCBfX2luc3Q+CnZv aWQqIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD46Ol9TX29vbV9yZWFsbG9jKHZvaWQq IF9fcCwgc2l6ZV90IF9fbikKewogICAgdm9pZCAoKiBfX215X21hbGxvY19oYW5kbGVyKSgpOwog ICAgdm9pZCogX19yZXN1bHQ7CgogICAgZm9yICg7OykgewogICAgICAgIF9fbXlfbWFsbG9jX2hh bmRsZXIgPSBfX21hbGxvY19hbGxvY19vb21faGFuZGxlcjsKICAgICAgICBpZiAoMCA9PSBfX215 X21hbGxvY19oYW5kbGVyKSB7IGNlcnIgPDwgIm91dCBvZiBtZW1vcnkiIDw8IGVuZGw7IGV4aXQo MSkgOyB9CiAgICAgICAgKCpfX215X21hbGxvY19oYW5kbGVyKSgpOwogICAgICAgIF9fcmVzdWx0 ID0gcmVhbGxvYyhfX3AsIF9fbik7CiAgICAgICAgaWYgKF9fcmVzdWx0KSByZXR1cm4oX19yZXN1 bHQpOwogICAgfQp9Cgp0eXBlZGVmIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPDA+IG1hbGxvY19h bGxvYzsKCnRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpjbGFzcyBzaW1wbGVfYWxs b2MgewoKcHVibGljOgogICAgc3RhdGljIF9UcCogYWxsb2NhdGUoc2l6ZV90IF9fbikKICAgICAg eyByZXR1cm4gMCA9PSBfX24gPyAwIDogKF9UcCopIF9BbGxvYzo6YWxsb2NhdGUoX19uICogc2l6 ZW9mIChfVHApKTsgfQogICAgc3RhdGljIF9UcCogYWxsb2NhdGUodm9pZCkKICAgICAgeyByZXR1 cm4gKF9UcCopIF9BbGxvYzo6YWxsb2NhdGUoc2l6ZW9mIChfVHApKTsgfQogICAgc3RhdGljIHZv aWQgZGVhbGxvY2F0ZShfVHAqIF9fcCwgc2l6ZV90IF9fbikKICAgICAgeyBpZiAoMCAhPSBfX24p IF9BbGxvYzo6ZGVhbGxvY2F0ZShfX3AsIF9fbiAqIHNpemVvZiAoX1RwKSk7IH0KICAgIHN0YXRp YyB2b2lkIGRlYWxsb2NhdGUoX1RwKiBfX3ApCiAgICAgIHsgX0FsbG9jOjpkZWFsbG9jYXRlKF9f cCwgc2l6ZW9mIChfVHApKTsgfQp9OwoKIAogCiAKIAogCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+ CmNsYXNzIGRlYnVnX2FsbG9jIHsKCnByaXZhdGU6CgogIGVudW0ge19TX2V4dHJhID0gOH07ICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIAoKcHVi bGljOgoKICBzdGF0aWMgdm9pZCogYWxsb2NhdGUoc2l6ZV90IF9fbikKICB7CiAgICBjaGFyKiBf X3Jlc3VsdCA9IChjaGFyKilfQWxsb2M6OmFsbG9jYXRlKF9fbiArIF9TX2V4dHJhKTsKICAgICoo c2l6ZV90KilfX3Jlc3VsdCA9IF9fbjsKICAgIHJldHVybiBfX3Jlc3VsdCArIF9TX2V4dHJhOwog IH0KCiAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX24pCiAgewog ICAgY2hhciogX19yZWFsX3AgPSAoY2hhciopX19wIC0gX1NfZXh0cmE7CiAgICAoKHZvaWQpICgo ICooc2l6ZV90KilfX3JlYWxfcCA9PSBfX24gKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoIiooc2l6 ZV90KilfX3JlYWxfcCA9PSBfX24iICwJIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxsb2MuaCIsIDI2Mywg X19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgIF9BbGxvYzo6ZGVhbGxvY2F0ZShfX3Jl YWxfcCwgX19uICsgX1NfZXh0cmEpOwogIH0KCiAgc3RhdGljIHZvaWQqIHJlYWxsb2NhdGUodm9p ZCogX19wLCBzaXplX3QgX19vbGRfc3osIHNpemVfdCBfX25ld19zeikKICB7CiAgICBjaGFyKiBf X3JlYWxfcCA9IChjaGFyKilfX3AgLSBfU19leHRyYTsKICAgICgodm9pZCkgKCggKihzaXplX3Qq KV9fcmVhbF9wID09IF9fb2xkX3N6ICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCIqKHNpemVfdCop X19yZWFsX3AgPT0gX19vbGRfc3oiICwJIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxsb2MuaCIsIDI3MCwg X19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgIGNoYXIqIF9fcmVzdWx0ID0gKGNoYXIq KQogICAgICBfQWxsb2M6OnJlYWxsb2NhdGUoX19yZWFsX3AsIF9fb2xkX3N6ICsgX1NfZXh0cmEs IF9fbmV3X3N6ICsgX1NfZXh0cmEpOwogICAgKihzaXplX3QqKV9fcmVzdWx0ID0gX19uZXdfc3o7 CiAgICByZXR1cm4gX19yZXN1bHQgKyBfU19leHRyYTsKICB9Cgp9OwoKCgoKCgoKCgoKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCgogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKdGVtcGxhdGUg PGJvb2wgdGhyZWFkcywgaW50IGluc3Q+CmNsYXNzIF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZSB7 Cgpwcml2YXRlOgogICAKICAgCgogICAgZW51bSB7X0FMSUdOID0gOH07CiAgICBlbnVtIHtfTUFY X0JZVEVTID0gMTI4fTsKICAgIGVudW0ge19ORlJFRUxJU1RTID0gX01BWF9CWVRFUy9fQUxJR059 OwoKICBzdGF0aWMgc2l6ZV90CiAgX1Nfcm91bmRfdXAoc2l6ZV90IF9fYnl0ZXMpCiAgICB7IHJl dHVybiAoKChfX2J5dGVzKSArIF9BTElHTi0xKSAmIH4oX0FMSUdOIC0gMSkpOyB9Cgpwcml2YXRl IDoKICB1bmlvbiBfT2JqIHsKICAgICAgICB1bmlvbiBfT2JqKiBfTV9mcmVlX2xpc3RfbGluazsK ICAgICAgICBjaGFyIF9NX2NsaWVudF9kYXRhWzFdOyAgICAgCiAgfTsKcHJpdmF0ZToKCgoKCiAg ICBzdGF0aWMgX09iaiogdm9sYXRpbGUgIF9TX2ZyZWVfbGlzdFtfTkZSRUVMSVNUU107CgogIHN0 YXRpYyAgc2l6ZV90IF9TX2ZyZWVsaXN0X2luZGV4KHNpemVfdCBfX2J5dGVzKSB7CiAgICAgICAg cmV0dXJuICgoKF9fYnl0ZXMpICsgX0FMSUdOLTEpL19BTElHTiAtIDEpOwogIH0KCiAgIAogIHN0 YXRpYyB2b2lkKiBfU19yZWZpbGwoc2l6ZV90IF9fbik7CiAgIAogICAKICBzdGF0aWMgY2hhciog X1NfY2h1bmtfYWxsb2Moc2l6ZV90IF9fc2l6ZSwgaW50JiBfX25vYmpzKTsKCiAgIAogIHN0YXRp YyBjaGFyKiBfU19zdGFydF9mcmVlOwogIHN0YXRpYyBjaGFyKiBfU19lbmRfZnJlZTsKICBzdGF0 aWMgc2l6ZV90IF9TX2hlYXBfc2l6ZTsKCgoKCgoKCgogICAgc3RhdGljIHB0aHJlYWRfbXV0ZXhf dCBfU19ub2RlX2FsbG9jYXRvcl9sb2NrOwoKCgoKCgojIDM4OSAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9h bGxvYy5oIiAzCgoKICAgIGNsYXNzIF9Mb2NrIHsKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAg IF9Mb2NrKCkgeyBpZiAodGhyZWFkcykgcHRocmVhZF9tdXRleF9sb2NrKCZfU19ub2RlX2FsbG9j YXRvcl9sb2NrKSA7IH0KICAgICAgICAgICAgfl9Mb2NrKCkgeyBpZiAodGhyZWFkcykgcHRocmVh ZF9tdXRleF91bmxvY2soJl9TX25vZGVfYWxsb2NhdG9yX2xvY2spIDsgfQogICAgfTsKICAgIGZy aWVuZCBjbGFzcyBfTG9jazsKCnB1YmxpYzoKCiAgIAogIHN0YXRpYyB2b2lkKiBhbGxvY2F0ZShz aXplX3QgX19uKQogIHsKICAgIF9PYmoqIHZvbGF0aWxlICogX19teV9mcmVlX2xpc3Q7CiAgICBf T2JqKiAgIF9fcmVzdWx0OwoKICAgIGlmIChfX24gPiAoc2l6ZV90KSBfTUFYX0JZVEVTKSB7CiAg ICAgICAgcmV0dXJuKG1hbGxvY19hbGxvYzo6YWxsb2NhdGUoX19uKSk7CiAgICB9CiAgICBfX215 X2ZyZWVfbGlzdCA9IF9TX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4KF9fbik7CiAgICAg CiAgICAgCiAgICAgCgogICAgICAgICAKICAgICAgICBfTG9jayBfX2xvY2tfaW5zdGFuY2U7Cgog ICAgX19yZXN1bHQgPSAqX19teV9mcmVlX2xpc3Q7CiAgICBpZiAoX19yZXN1bHQgPT0gMCkgewog ICAgICAgIHZvaWQqIF9fciA9IF9TX3JlZmlsbChfU19yb3VuZF91cChfX24pKTsKICAgICAgICBy ZXR1cm4gX19yOwogICAgfQogICAgKl9fbXlfZnJlZV9saXN0ID0gX19yZXN1bHQgLT4gX01fZnJl ZV9saXN0X2xpbms7CiAgICByZXR1cm4gKF9fcmVzdWx0KTsKICB9OwoKICAgCiAgc3RhdGljIHZv aWQgZGVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX24pCiAgewogICAgX09iaiogX19xID0g KF9PYmoqKV9fcDsKICAgIF9PYmoqIHZvbGF0aWxlICogX19teV9mcmVlX2xpc3Q7CgogICAgaWYg KF9fbiA+IChzaXplX3QpIF9NQVhfQllURVMpIHsKICAgICAgICBtYWxsb2NfYWxsb2M6OmRlYWxs b2NhdGUoX19wLCBfX24pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIF9fbXlfZnJlZV9saXN0 ID0gX1NfZnJlZV9saXN0ICsgX1NfZnJlZWxpc3RfaW5kZXgoX19uKTsKICAgICAKCiAgICAgICAg IAogICAgICAgIF9Mb2NrIF9fbG9ja19pbnN0YW5jZTsKCiAgICBfX3EgLT4gX01fZnJlZV9saXN0 X2xpbmsgPSAqX19teV9mcmVlX2xpc3Q7CiAgICAqX19teV9mcmVlX2xpc3QgPSBfX3E7CiAgICAg CiAgfQoKICBzdGF0aWMgdm9pZCogcmVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX29sZF9z eiwgc2l6ZV90IF9fbmV3X3N6KTsKCn0gOwoKdHlwZWRlZiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxh dGU8IHRydWUgLCAwPiBhbGxvYzsKdHlwZWRlZiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8ZmFs c2UsIDA+IHNpbmdsZV9jbGllbnRfYWxsb2M7CgoKCiAKIAogCiAKdGVtcGxhdGUgPGJvb2wgX190 aHJlYWRzLCBpbnQgX19pbnN0PgpjaGFyKgpfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJl YWRzLCBfX2luc3Q+OjpfU19jaHVua19hbGxvYyhzaXplX3QgX19zaXplLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIF9fbm9i anMpCnsKICAgIGNoYXIqIF9fcmVzdWx0OwogICAgc2l6ZV90IF9fdG90YWxfYnl0ZXMgPSBfX3Np emUgKiBfX25vYmpzOwogICAgc2l6ZV90IF9fYnl0ZXNfbGVmdCA9IF9TX2VuZF9mcmVlIC0gX1Nf c3RhcnRfZnJlZTsKCiAgICBpZiAoX19ieXRlc19sZWZ0ID49IF9fdG90YWxfYnl0ZXMpIHsKICAg ICAgICBfX3Jlc3VsdCA9IF9TX3N0YXJ0X2ZyZWU7CiAgICAgICAgX1Nfc3RhcnRfZnJlZSArPSBf X3RvdGFsX2J5dGVzOwogICAgICAgIHJldHVybihfX3Jlc3VsdCk7CiAgICB9IGVsc2UgaWYgKF9f Ynl0ZXNfbGVmdCA+PSBfX3NpemUpIHsKICAgICAgICBfX25vYmpzID0gKGludCkoX19ieXRlc19s ZWZ0L19fc2l6ZSk7CiAgICAgICAgX190b3RhbF9ieXRlcyA9IF9fc2l6ZSAqIF9fbm9ianM7CiAg ICAgICAgX19yZXN1bHQgPSBfU19zdGFydF9mcmVlOwogICAgICAgIF9TX3N0YXJ0X2ZyZWUgKz0g X190b3RhbF9ieXRlczsKICAgICAgICByZXR1cm4oX19yZXN1bHQpOwogICAgfSBlbHNlIHsKICAg ICAgICBzaXplX3QgX19ieXRlc190b19nZXQgPQoJICAyICogX190b3RhbF9ieXRlcyArIF9TX3Jv dW5kX3VwKF9TX2hlYXBfc2l6ZSA+PiA0KTsKICAgICAgICAgCiAgICAgICAgaWYgKF9fYnl0ZXNf bGVmdCA+IDApIHsKICAgICAgICAgICAgX09iaiogdm9sYXRpbGUgKiBfX215X2ZyZWVfbGlzdCA9 CiAgICAgICAgICAgICAgICAgICAgICAgIF9TX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4 KF9fYnl0ZXNfbGVmdCk7CgogICAgICAgICAgICAoKF9PYmoqKV9TX3N0YXJ0X2ZyZWUpIC0+IF9N X2ZyZWVfbGlzdF9saW5rID0gKl9fbXlfZnJlZV9saXN0OwogICAgICAgICAgICAqX19teV9mcmVl X2xpc3QgPSAoX09iaiopX1Nfc3RhcnRfZnJlZTsKICAgICAgICB9CiAgICAgICAgX1Nfc3RhcnRf ZnJlZSA9IChjaGFyKiltYWxsb2MoX19ieXRlc190b19nZXQpOwogICAgICAgIGlmICgwID09IF9T X3N0YXJ0X2ZyZWUpIHsKICAgICAgICAgICAgc2l6ZV90IF9faTsKICAgICAgICAgICAgX09iaiog dm9sYXRpbGUgKiBfX215X2ZyZWVfbGlzdDsKCSAgICBfT2JqKiBfX3A7CiAgICAgICAgICAgICAK ICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoX19pID0gX19zaXpl OyBfX2kgPD0gX01BWF9CWVRFUzsgX19pICs9IF9BTElHTikgewogICAgICAgICAgICAgICAgX19t eV9mcmVlX2xpc3QgPSBfU19mcmVlX2xpc3QgKyBfU19mcmVlbGlzdF9pbmRleChfX2kpOwogICAg ICAgICAgICAgICAgX19wID0gKl9fbXlfZnJlZV9saXN0OwogICAgICAgICAgICAgICAgaWYgKDAg IT0gX19wKSB7CiAgICAgICAgICAgICAgICAgICAgKl9fbXlfZnJlZV9saXN0ID0gX19wIC0+IF9N X2ZyZWVfbGlzdF9saW5rOwogICAgICAgICAgICAgICAgICAgIF9TX3N0YXJ0X2ZyZWUgPSAoY2hh ciopX19wOwogICAgICAgICAgICAgICAgICAgIF9TX2VuZF9mcmVlID0gX1Nfc3RhcnRfZnJlZSAr IF9faTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4oX1NfY2h1bmtfYWxsb2MoX19zaXplLCBf X25vYmpzKSk7CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoJICAgIF9TX2VuZF9mcmVlID0gMDsJIAogICAg ICAgICAgICBfU19zdGFydF9mcmVlID0gKGNoYXIqKW1hbGxvY19hbGxvYzo6YWxsb2NhdGUoX19i eXRlc190b19nZXQpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAog ICAgICAgIH0KICAgICAgICBfU19oZWFwX3NpemUgKz0gX19ieXRlc190b19nZXQ7CiAgICAgICAg X1NfZW5kX2ZyZWUgPSBfU19zdGFydF9mcmVlICsgX19ieXRlc190b19nZXQ7CiAgICAgICAgcmV0 dXJuKF9TX2NodW5rX2FsbG9jKF9fc2l6ZSwgX19ub2JqcykpOwogICAgfQp9CgoKIAogCiAKdGVt cGxhdGUgPGJvb2wgX190aHJlYWRzLCBpbnQgX19pbnN0Pgp2b2lkKgpfX2RlZmF1bHRfYWxsb2Nf dGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+OjpfU19yZWZpbGwoc2l6ZV90IF9fbikKewogICAg aW50IF9fbm9ianMgPSAyMDsKICAgIGNoYXIqIF9fY2h1bmsgPSBfU19jaHVua19hbGxvYyhfX24s IF9fbm9ianMpOwogICAgX09iaiogdm9sYXRpbGUgKiBfX215X2ZyZWVfbGlzdDsKICAgIF9PYmoq IF9fcmVzdWx0OwogICAgX09iaiogX19jdXJyZW50X29iajsKICAgIF9PYmoqIF9fbmV4dF9vYmo7 CiAgICBpbnQgX19pOwoKICAgIGlmICgxID09IF9fbm9ianMpIHJldHVybihfX2NodW5rKTsKICAg IF9fbXlfZnJlZV9saXN0ID0gX1NfZnJlZV9saXN0ICsgX1NfZnJlZWxpc3RfaW5kZXgoX19uKTsK CiAgICAgCiAgICAgIF9fcmVzdWx0ID0gKF9PYmoqKV9fY2h1bms7CiAgICAgICpfX215X2ZyZWVf bGlzdCA9IF9fbmV4dF9vYmogPSAoX09iaiopKF9fY2h1bmsgKyBfX24pOwogICAgICBmb3IgKF9f aSA9IDE7IDsgX19pKyspIHsKICAgICAgICBfX2N1cnJlbnRfb2JqID0gX19uZXh0X29iajsKICAg ICAgICBfX25leHRfb2JqID0gKF9PYmoqKSgoY2hhciopX19uZXh0X29iaiArIF9fbik7CiAgICAg ICAgaWYgKF9fbm9ianMgLSAxID09IF9faSkgewogICAgICAgICAgICBfX2N1cnJlbnRfb2JqIC0+ IF9NX2ZyZWVfbGlzdF9saW5rID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNl IHsKICAgICAgICAgICAgX19jdXJyZW50X29iaiAtPiBfTV9mcmVlX2xpc3RfbGluayA9IF9fbmV4 dF9vYmo7CiAgICAgICAgfQogICAgICB9CiAgICByZXR1cm4oX19yZXN1bHQpOwp9Cgp0ZW1wbGF0 ZSA8Ym9vbCB0aHJlYWRzLCBpbnQgaW5zdD4Kdm9pZCoKX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRl PHRocmVhZHMsIGluc3Q+OjpyZWFsbG9jYXRlKHZvaWQqIF9fcCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX29sZF9zeiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX25l d19zeikKewogICAgdm9pZCogX19yZXN1bHQ7CiAgICBzaXplX3QgX19jb3B5X3N6OwoKICAgIGlm IChfX29sZF9zeiA+IChzaXplX3QpIF9NQVhfQllURVMgJiYgX19uZXdfc3ogPiAoc2l6ZV90KSBf TUFYX0JZVEVTKSB7CiAgICAgICAgcmV0dXJuKHJlYWxsb2MoX19wLCBfX25ld19zeikpOwogICAg fQogICAgaWYgKF9TX3JvdW5kX3VwKF9fb2xkX3N6KSA9PSBfU19yb3VuZF91cChfX25ld19zeikp IHJldHVybihfX3ApOwogICAgX19yZXN1bHQgPSBhbGxvY2F0ZShfX25ld19zeik7CiAgICBfX2Nv cHlfc3ogPSBfX25ld19zeiA+IF9fb2xkX3N6PyBfX29sZF9zeiA6IF9fbmV3X3N6OwogICAgbWVt Y3B5KF9fcmVzdWx0LCBfX3AsIF9fY29weV9zeik7CiAgICBkZWFsbG9jYXRlKF9fcCwgX19vbGRf c3opOwogICAgcmV0dXJuKF9fcmVzdWx0KTsKfQoKCiAgICB0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVh ZHMsIGludCBfX2luc3Q+CiAgICBwdGhyZWFkX211dGV4X3QKICAgIF9fZGVmYXVsdF9hbGxvY190 ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD46Ol9TX25vZGVfYWxsb2NhdG9yX2xvY2sKICAgICAg ICA9IHswLCAwLCAwLCBQVEhSRUFEX01VVEVYX0ZBU1RfTlAsIHswLCAwfX0gOwoKCgoKCgoKCgoj IDYwMiAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8u Li8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAzCgoKIyA2ODkgIi91c3IvbGliL2djYy1s aWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9z dGxfYWxsb2MuaCIgMwoKCnRlbXBsYXRlIDxib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4KY2hh ciogX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFkcywgX19pbnN0Pjo6X1Nfc3RhcnRf ZnJlZSA9IDA7Cgp0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2luc3Q+CmNoYXIqIF9f ZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD46Ol9TX2VuZF9mcmVlID0g MDsKCnRlbXBsYXRlIDxib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4Kc2l6ZV90IF9fZGVmYXVs dF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD46Ol9TX2hlYXBfc2l6ZSA9IDA7Cgp0 ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2luc3Q+Cl9fZGVmYXVsdF9hbGxvY190ZW1w bGF0ZTxfX3RocmVhZHMsIF9faW5zdD46Ol9PYmoqIHZvbGF0aWxlIApfX2RlZmF1bHRfYWxsb2Nf dGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+IDo6X1NfZnJlZV9saXN0WwogICAgX05GUkVFTElT VFMKXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCB9 OwogCiAKIAoKCgoKCgoKCgoKIAogCiAKIAogCiAKIAoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpj bGFzcyBhbGxvY2F0b3IgewogIHR5cGVkZWYgYWxsb2MgX0FsbG9jOyAgICAgICAgICAgCnB1Ymxp YzoKICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOwogIHR5cGVkZWYgcHRyZGlmZl90ICBk aWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBj b25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsK ICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgX1RwICAgICAg ICB2YWx1ZV90eXBlOwoKICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7CiAg ICB0eXBlZGVmIGFsbG9jYXRvcjxfVHAxPiBvdGhlcjsKICB9OwoKICBhbGxvY2F0b3IoKSB0aHJv dygpICB7fQogIGFsbG9jYXRvcihjb25zdCBhbGxvY2F0b3ImKSB0aHJvdygpICB7fQogIHRlbXBs YXRlIDxjbGFzcyBfVHAxPiBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yPF9UcDE+JikgdGhyb3co KSAge30KICB+YWxsb2NhdG9yKCkgdGhyb3coKSAge30KCiAgcG9pbnRlciBhZGRyZXNzKHJlZmVy ZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KICBjb25zdF9wb2ludGVyIGFkZHJlc3Mo Y29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQoKICAgCiAgIAogIF9U cCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKSB7CiAgICByZXR1cm4g X19uICE9IDAgPyBzdGF0aWNfY2FzdDxfVHAqPihfQWxsb2M6OmFsbG9jYXRlKF9fbiAqIHNpemVv ZihfVHApKSkKICAgICAgICAgICAgICAgICAgICA6IDA7CiAgfQoKICAgCiAgdm9pZCBkZWFsbG9j YXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQogICAgeyBfQWxsb2M6OmRlYWxsb2NhdGUo X19wLCBfX24gKiBzaXplb2YoX1RwKSk7IH0KCiAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qg dGhyb3coKSAKICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQoKICB2b2lk IGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgeyBuZXcoX19wKSBfVHAo X192YWwpOyB9CiAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9Cn07 Cgp0ZW1wbGF0ZTw+CmNsYXNzIGFsbG9jYXRvcjx2b2lkPiB7CiAgdHlwZWRlZiBzaXplX3QgICAg ICBzaXplX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZmX3QgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlw ZWRlZiB2b2lkKiAgICAgICBwb2ludGVyOwogIHR5cGVkZWYgY29uc3Qgdm9pZCogY29uc3RfcG9p bnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CgogIHRlbXBsYXRlIDxjbGFz cyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+IG90aGVy OwogIH07Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgYm9vbCBv cGVyYXRvcj09KGNvbnN0IGFsbG9jYXRvcjxfVDE+JiwgY29uc3QgYWxsb2NhdG9yPF9UMj4mKQp7 CiAgcmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KaW5saW5l IGJvb2wgb3BlcmF0b3IhPShjb25zdCBhbGxvY2F0b3I8X1QxPiYsIGNvbnN0IGFsbG9jYXRvcjxf VDI+JikKewogIHJldHVybiBmYWxzZTsKfQoKIAogCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBf VHAsIGNsYXNzIF9BbGxvYz4Kc3RydWN0IF9fYWxsb2NhdG9yIHsKICBfQWxsb2MgX191bmRlcmx5 aW5nX2FsbG9jOwoKICB0eXBlZGVmIHNpemVfdCAgICBzaXplX3R5cGU7CiAgdHlwZWRlZiBwdHJk aWZmX3QgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOwogIHR5 cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgX1RwJiAgICAgICByZWZl cmVuY2U7CiAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVmIF9U cCAgICAgICAgdmFsdWVfdHlwZTsKCiAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJp bmQgewogICAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAxLCBfQWxsb2M+IG90aGVyOwogIH07Cgog IF9fYWxsb2NhdG9yKCkgdGhyb3coKSAge30KICBfX2FsbG9jYXRvcihjb25zdCBfX2FsbG9jYXRv ciYgX19hKSB0aHJvdygpIAogICAgOiBfX3VuZGVybHlpbmdfYWxsb2MoX19hLl9fdW5kZXJseWlu Z19hbGxvYykge30KICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4KICBfX2FsbG9jYXRvcihjb25zdCBf X2FsbG9jYXRvcjxfVHAxLCBfQWxsb2M+JiBfX2EpIHRocm93KCkgCiAgICA6IF9fdW5kZXJseWlu Z19hbGxvYyhfX2EuX191bmRlcmx5aW5nX2FsbG9jKSB7fQogIH5fX2FsbG9jYXRvcigpIHRocm93 KCkgIHt9CgogIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAm X194OyB9CiAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0 IHsgcmV0dXJuICZfX3g7IH0KCiAgIAogIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29u c3Qgdm9pZCogPSAwKSB7CiAgICByZXR1cm4gX19uICE9IDAKICAgICAgICA/IHN0YXRpY19jYXN0 PF9UcCo+KF9fdW5kZXJseWluZ19hbGxvYy5hbGxvY2F0ZShfX24gKiBzaXplb2YoX1RwKSkpCiAg ICAgICAgOiAwOwogIH0KCiAgIAogIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90 eXBlIF9fbikKICAgIHsgX191bmRlcmx5aW5nX2FsbG9jLmRlYWxsb2NhdGUoX19wLCBfX24gKiBz aXplb2YoX1RwKSk7IH0KCiAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgdGhyb3coKSAKICAg IHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQoKICB2b2lkIGNvbnN0cnVjdChw b2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgeyBuZXcoX19wKSBfVHAoX192YWwpOyB9CiAg dm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0FsbG9jPgpjbGFzcyBfX2FsbG9jYXRvcjx2b2lkLCBfQWxsb2M+IHsKICB0eXBlZGVm IHNpemVfdCAgICAgIHNpemVfdHlwZTsKICB0eXBlZGVmIHB0cmRpZmZfdCAgIGRpZmZlcmVuY2Vf dHlwZTsKICB0eXBlZGVmIHZvaWQqICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBjb25zdCB2b2lk KiBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgdm9pZCAgICAgICAgdmFsdWVfdHlwZTsKCiAgdGVt cGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgewogICAgdHlwZWRlZiBfX2FsbG9jYXRv cjxfVHAxLCBfQWxsb2M+IG90aGVyOwogIH07Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFz cyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX19hbGxvY2F0b3I8X1RwLCBf QWxsb2M+JiBfX2ExLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fYWxsb2NhdG9yPF9U cCwgX0FsbG9jPiYgX19hMikKewogIHJldHVybiBfX2ExLl9fdW5kZXJseWluZ19hbGxvYyA9PSBf X2EyLl9fdW5kZXJseWluZ19hbGxvYzsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9B bGxvYz4KaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxv Yz4mIF9fYTEsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19hbGxvY2F0b3I8X1RwLCBf QWxsb2M+JiBfX2EyKQp7CiAgcmV0dXJuIF9fYTEuX191bmRlcmx5aW5nX2FsbG9jICE9IF9fYTIu X191bmRlcmx5aW5nX2FsbG9jOwp9CgoKIAogCiAKCnRlbXBsYXRlIDxpbnQgaW5zdD4KaW5saW5l IGJvb2wgb3BlcmF0b3I9PShjb25zdCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxpbnN0PiYsCiAg ICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tYWxsb2NfYWxsb2NfdGVtcGxhdGU8aW5zdD4m KQp7CiAgcmV0dXJuIHRydWU7Cn0KCgp0ZW1wbGF0ZSA8aW50IF9faW5zdD4KaW5saW5lIGJvb2wg b3BlcmF0b3IhPShjb25zdCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+JiwKICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+JikK ewogIHJldHVybiBmYWxzZTsKfQoKCgp0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2lu c3Q+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRl PF9fdGhyZWFkcywgX19pbnN0PiYsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19kZWZh dWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFkcywgX19pbnN0PiYpCnsKICByZXR1cm4gdHJ1ZTsK fQoKCnRlbXBsYXRlIDxib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4KaW5saW5lIGJvb2wgb3Bl cmF0b3IhPShjb25zdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+ JiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8 X190aHJlYWRzLCBfX2luc3Q+JikKewogIHJldHVybiBmYWxzZTsKfQoKCgp0ZW1wbGF0ZSA8Y2xh c3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRlYnVnX2FsbG9jPF9BbGxv Yz4mLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlYnVnX2FsbG9jPF9BbGxvYz4mKSB7 CiAgcmV0dXJuIHRydWU7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBv cGVyYXRvciE9KGNvbnN0IGRlYnVnX2FsbG9jPF9BbGxvYz4mLAogICAgICAgICAgICAgICAgICAg ICAgIGNvbnN0IGRlYnVnX2FsbG9jPF9BbGxvYz4mKSB7CiAgcmV0dXJuIGZhbHNlOwp9CgoKIAog CiAKIAogCiAKCiAKIAogCiAKIAogCgogCiAKIAogCiAKIAogCiAKIAogCiAKCiAKCnRlbXBsYXRl IDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CnN0cnVjdCBfQWxsb2NfdHJhaXRzCnsKICBz dGF0aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSBmYWxzZTsKICB0eXBlZGVmIHR5cGVu YW1lIF9BbGxvY2F0b3I6OiAgIHJlYmluZDxfVHA+OjpvdGhlcgogICAgICAgICAgYWxsb2NhdG9y X3R5cGU7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgpjb25zdCBi b29sIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2NhdG9yPjo6X1NfaW5zdGFuY2VsZXNzOwoKIAoK dGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RwMT4Kc3RydWN0IF9BbGxvY190cmFpdHM8X1Rw LCBhbGxvY2F0b3I8X1RwMT4gPgp7CiAgc3RhdGljIGNvbnN0IGJvb2wgX1NfaW5zdGFuY2VsZXNz ID0gdHJ1ZTsKICB0eXBlZGVmIHNpbXBsZV9hbGxvYzxfVHAsIGFsbG9jPiBfQWxsb2NfdHlwZTsK ICB0eXBlZGVmIGFsbG9jYXRvcjxfVHA+IGFsbG9jYXRvcl90eXBlOwp9OwoKIAoKdGVtcGxhdGUg PGNsYXNzIF9UcCwgaW50IF9faW5zdD4Kc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBfX21hbGxv Y19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+ID4KewogIHN0YXRpYyBjb25zdCBib29sIF9TX2luc3Rh bmNlbGVzcyA9IHRydWU7CiAgdHlwZWRlZiBzaW1wbGVfYWxsb2M8X1RwLCBfX21hbGxvY19hbGxv Y190ZW1wbGF0ZTxfX2luc3Q+ID4gX0FsbG9jX3R5cGU7CiAgdHlwZWRlZiBfX2FsbG9jYXRvcjxf VHAsIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4gPiBhbGxvY2F0b3JfdHlwZTsKfTsK Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4Kc3RydWN0 IF9BbGxvY190cmFpdHM8X1RwLCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBf X2luc3Q+ID4KewogIHN0YXRpYyBjb25zdCBib29sIF9TX2luc3RhbmNlbGVzcyA9IHRydWU7CiAg dHlwZWRlZiBzaW1wbGVfYWxsb2M8X1RwLCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJl YWRzLCBfX2luc3Q+ID4KICAgICAgICAgIF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19hbGxvY2F0 b3I8X1RwLCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+ID4KICAg ICAgICAgIGFsbG9jYXRvcl90eXBlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9B bGxvYz4Kc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBkZWJ1Z19hbGxvYzxfQWxsb2M+ID4Kewog IHN0YXRpYyBjb25zdCBib29sIF9TX2luc3RhbmNlbGVzcyA9IHRydWU7CiAgdHlwZWRlZiBzaW1w bGVfYWxsb2M8X1RwLCBkZWJ1Z19hbGxvYzxfQWxsb2M+ID4gX0FsbG9jX3R5cGU7CiAgdHlwZWRl ZiBfX2FsbG9jYXRvcjxfVHAsIGRlYnVnX2FsbG9jPF9BbGxvYz4gPiBhbGxvY2F0b3JfdHlwZTsK fTsKCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RwMSwgaW50IF9faW5zdD4Kc3Ry dWN0IF9BbGxvY190cmFpdHM8X1RwLAogICAgICAgICAgICAgICAgICAgICBfX2FsbG9jYXRvcjxf VHAxLCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+ID4gPgp7CiAgc3RhdGljIGNvbnN0 IGJvb2wgX1NfaW5zdGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVmIHNpbXBsZV9hbGxvYzxfVHAs IF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4gPiBfQWxsb2NfdHlwZTsKICB0eXBlZGVm IF9fYWxsb2NhdG9yPF9UcCwgX19tYWxsb2NfYWxsb2NfdGVtcGxhdGU8X19pbnN0PiA+IGFsbG9j YXRvcl90eXBlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcDEsIGJvb2wgX190 aHIsIGludCBfX2luc3Q+CnN0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwKICAgICAgICAgICAgICAg ICAgICAgIF9fYWxsb2NhdG9yPF9UcDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHIsIF9faW5zdD4gPiA+CnsKICBzdGF0aWMg Y29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxlX2FsbG9j PF9UcCwgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyLF9faW5zdD4gPgogICAgICAgICAg X0FsbG9jX3R5cGU7CiAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAsIF9fZGVmYXVsdF9hbGxvY190 ZW1wbGF0ZTxfX3RocixfX2luc3Q+ID4KICAgICAgICAgIGFsbG9jYXRvcl90eXBlOwp9OwoKCnRl bXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcDEsIGNsYXNzIF9BbGxvYz4Kc3RydWN0IF9BbGxv Y190cmFpdHM8X1RwLCBfX2FsbG9jYXRvcjxfVHAxLCBkZWJ1Z19hbGxvYzxfQWxsb2M+ID4gPgp7 CiAgc3RhdGljIGNvbnN0IGJvb2wgX1NfaW5zdGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVmIHNp bXBsZV9hbGxvYzxfVHAsIGRlYnVnX2FsbG9jPF9BbGxvYz4gPiBfQWxsb2NfdHlwZTsKICB0eXBl ZGVmIF9fYWxsb2NhdG9yPF9UcCwgZGVidWdfYWxsb2M8X0FsbG9jPiA+IGFsbG9jYXRvcl90eXBl Owp9OwoKCgoKCgoKCiAKCgoKCgogCiAKIAojIDMxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvdmVjdG9yIiAyIDMK CiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8u Li8uLi9pbmNsdWRlL2crKy0zL3N0bF9jb25zdHJ1Y3QuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCiAKCgoKCgoKCgogCgogCiAKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSB2 b2lkIGRlc3Ryb3koX1RwKiBfX3BvaW50ZXIpIHsKICBfX3BvaW50ZXItPn5fVHAoKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgdm9pZCBjb25zdHJ1Y3QoX1QxKiBf X3AsIGNvbnN0IF9UMiYgX192YWx1ZSkgewogIG5ldyAoX19wKSBfVDEoX192YWx1ZSk7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfVDE+CmlubGluZSB2b2lkIGNvbnN0cnVjdChfVDEqIF9fcCkgewogIG5l dyAoX19wKSBfVDEoKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CmlubGlu ZSB2b2lkCl9fZGVzdHJveV9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0 ZXJhdG9yIF9fbGFzdCwgX19mYWxzZV90eXBlKQp7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFz dDsgKytfX2ZpcnN0KQogICAgZGVzdHJveSgmKl9fZmlyc3QpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0ZvcndhcmRJdGVyYXRvcj4KaW5saW5lIHZvaWQgX19kZXN0cm95X2F1eChfRm9yd2FyZEl0ZXJh dG9yLCBfRm9yd2FyZEl0ZXJhdG9yLCBfX3RydWVfdHlwZSkge30KCnRlbXBsYXRlIDxjbGFzcyBf Rm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CmlubGluZSB2b2lkCl9fZGVzdHJveShfRm9yd2Fy ZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfVHAqKQp7CiAgdHlw ZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2Rlc3RydWN0b3IK ICAgICAgICAgIF9Ucml2aWFsX2Rlc3RydWN0b3I7CiAgX19kZXN0cm95X2F1eChfX2ZpcnN0LCBf X2xhc3QsIF9Ucml2aWFsX2Rlc3RydWN0b3IoKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2Fy ZEl0ZXJhdG9yPgppbmxpbmUgdm9pZCBkZXN0cm95KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwg X0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpIHsKICBfX2Rlc3Ryb3koX19maXJzdCwgX19sYXN0LCBf X3ZhbHVlX3R5cGUoIF9fZmlyc3QgKSApOwp9CgppbmxpbmUgdm9pZCBkZXN0cm95KGNoYXIqLCBj aGFyKikge30KaW5saW5lIHZvaWQgZGVzdHJveSh3Y2hhcl90Kiwgd2NoYXJfdCopIHt9CgogCgoK CiAKIAogCiMgMzIgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMv Li4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy92ZWN0b3IiIDIgMwoKIyAxICIvdXNyL2xpYi9nY2Mt bGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMv c3RsX3VuaW5pdGlhbGl6ZWQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoK CgoKIAoKIAoKIAogCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0 ZXI+CmlubGluZSBfRm9yd2FyZEl0ZXIgCl9fdW5pbml0aWFsaXplZF9jb3B5X2F1eChfSW5wdXRJ dGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAg X0ZvcndhcmRJdGVyIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgX190cnVlX3R5 cGUpCnsKICByZXR1cm4gY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KX0ZvcndhcmRJdGVyIApf X3VuaW5pdGlhbGl6ZWRfY29weV9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9f bGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwKICAg ICAgICAgICAgICAgICAgICAgICAgIF9fZmFsc2VfdHlwZSkKewogIF9Gb3J3YXJkSXRlciBfX2N1 ciA9IF9fcmVzdWx0OwogIHRyeSAgewogICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytf X2ZpcnN0LCArK19fY3VyKQogICAgICBjb25zdHJ1Y3QoJipfX2N1ciwgKl9fZmlyc3QpOwogICAg cmV0dXJuIF9fY3VyOwogIH0KICBjYXRjaCguLi4pIHsgIGRlc3Ryb3koX19yZXN1bHQsIF9fY3Vy KSA7IHRocm93OyB9IDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9y d2FyZEl0ZXIsIGNsYXNzIF9UcD4KaW5saW5lIF9Gb3J3YXJkSXRlcgpfX3VuaW5pdGlhbGl6ZWRf Y29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsIF9UcCopCnsKICB0eXBlZGVmIHR5cGVuYW1l IF9fdHlwZV90cmFpdHM8X1RwPjo6aXNfUE9EX3R5cGUgX0lzX1BPRDsKICByZXR1cm4gX191bmlu aXRpYWxpemVkX2NvcHlfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9Jc19QT0QoKSk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXI+CmlubGlu ZSBfRm9yd2FyZEl0ZXIKICB1bmluaXRpYWxpemVkX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBf SW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fcmVz dWx0KQp7CiAgcmV0dXJuIF9fdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19y ZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdmFsdWVfdHlwZSggX19yZXN1 bHQgKSApOwp9CgppbmxpbmUgY2hhciogdW5pbml0aWFsaXplZF9jb3B5KGNvbnN0IGNoYXIqIF9f Zmlyc3QsIGNvbnN0IGNoYXIqIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjaGFyKiBfX3Jlc3VsdCkgewogIG1lbW1vdmUoX19yZXN1bHQsIF9fZmlyc3QsIF9fbGFzdCAt IF9fZmlyc3QpOwogIHJldHVybiBfX3Jlc3VsdCArIChfX2xhc3QgLSBfX2ZpcnN0KTsKfQoKaW5s aW5lIHdjaGFyX3QqIAp1bmluaXRpYWxpemVkX2NvcHkoY29uc3Qgd2NoYXJfdCogX19maXJzdCwg Y29uc3Qgd2NoYXJfdCogX19sYXN0LAogICAgICAgICAgICAgICAgICAgd2NoYXJfdCogX19yZXN1 bHQpCnsKICBtZW1tb3ZlKF9fcmVzdWx0LCBfX2ZpcnN0LCBzaXplb2Yod2NoYXJfdCkgKiAoX19s YXN0IC0gX19maXJzdCkpOwogIHJldHVybiBfX3Jlc3VsdCArIChfX2xhc3QgLSBfX2ZpcnN0KTsK fQoKIAoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9y d2FyZEl0ZXI+CnBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgpfX3VuaW5pdGlhbGl6ZWRf Y29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKICAgICAgICAgICAgICAg ICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgaW5w dXRfaXRlcmF0b3JfdGFnKQp7CiAgX0ZvcndhcmRJdGVyIF9fY3VyID0gX19yZXN1bHQ7CiAgdHJ5 ICB7CiAgICBmb3IgKCA7IF9fY291bnQgPiAwIDsgLS1fX2NvdW50LCArK19fZmlyc3QsICsrX19j dXIpIAogICAgICBjb25zdHJ1Y3QoJipfX2N1ciwgKl9fZmlyc3QpOwogICAgcmV0dXJuIHBhaXI8 X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPihfX2ZpcnN0LCBfX2N1cik7CiAgfQogIGNhdGNoKC4u LikgeyAgZGVzdHJveShfX3Jlc3VsdCwgX19jdXIpIDsgdGhyb3c7IH0gOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0ZXI+ CmlubGluZSBwYWlyPF9SYW5kb21BY2Nlc3NJdGVyLCBfRm9yd2FyZEl0ZXI+Cl9fdW5pbml0aWFs aXplZF9jb3B5X24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKICAg ICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAg ICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpIHsKICBfUmFuZG9tQWNjZXNzSXRl ciBfX2xhc3QgPSBfX2ZpcnN0ICsgX19jb3VudDsKICByZXR1cm4gcGFpcjxfUmFuZG9tQWNjZXNz SXRlciwgX0ZvcndhcmRJdGVyPigKICAgICAgICAgICAgICAgICBfX2xhc3QsCiAgICAgICAgICAg ICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpKTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0 ZXI+CmlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4KX191bmluaXRpYWxpemVk X2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCiAgICAgICAgICAgICAg ICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkgewogIHJldHVybiBfX3VuaW5pdGlhbGl6ZWRf Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnkoIF9fZmlyc3QgKSApOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KaW5saW5l IHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgp1bmluaXRpYWxpemVkX2NvcHlfbihfSW5w dXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCiAgICAgICAgICAgICAgICAgICAgIF9Gb3J3 YXJkSXRlciBfX3Jlc3VsdCkgewogIHJldHVybiBfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9fZmly c3QsIF9fY291bnQsIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9f aXRlcmF0b3JfY2F0ZWdvcnkoIF9fZmlyc3QgKSApOwp9CgogCiAKdGVtcGxhdGUgPGNsYXNzIF9G b3J3YXJkSXRlciwgY2xhc3MgX1RwPgppbmxpbmUgdm9pZApfX3VuaW5pdGlhbGl6ZWRfZmlsbF9h dXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIAogICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gsIF9fdHJ1ZV90eXBlKQp7CiAgZmlsbChfX2Zp cnN0LCBfX2xhc3QsIF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNz IF9UcD4Kdm9pZApfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3Qs IF9Gb3J3YXJkSXRlciBfX2xhc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1Rw JiBfX3gsIF9fZmFsc2VfdHlwZSkKewogIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fZmlyc3Q7CiAg dHJ5ICB7CiAgICBmb3IgKCA7IF9fY3VyICE9IF9fbGFzdDsgKytfX2N1cikKICAgICAgY29uc3Ry dWN0KCYqX19jdXIsIF9feCk7CiAgfQogIGNhdGNoKC4uLikgeyAgZGVzdHJveShfX2ZpcnN0LCBf X2N1cikgOyB0aHJvdzsgfSA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNz IF9UcCwgY2xhc3MgX1RwMT4KaW5saW5lIHZvaWQgX191bmluaXRpYWxpemVkX2ZpbGwoX0Zvcndh cmRJdGVyIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2Fy ZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9feCwgX1RwMSopCnsKICB0eXBlZGVmIHR5cGVuYW1l IF9fdHlwZV90cmFpdHM8X1RwMT46OmlzX1BPRF90eXBlIF9Jc19QT0Q7CiAgX191bmluaXRpYWxp emVkX2ZpbGxfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX194LCBfSXNfUE9EKCkpOwogICAgICAgICAg ICAgICAgICAgCn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KaW5s aW5lIHZvaWQgdW5pbml0aWFsaXplZF9maWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwgCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCkKewogIF9fdW5pbml0aWFsaXplZF9m aWxsKF9fZmlyc3QsIF9fbGFzdCwgX194LCBfX3ZhbHVlX3R5cGUoIF9fZmlyc3QgKSApOwp9Cgog CiAKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4K aW5saW5lIF9Gb3J3YXJkSXRlcgpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2F1eChfRm9yd2FyZEl0 ZXIgX19maXJzdCwgX1NpemUgX19uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBf VHAmIF9feCwgX190cnVlX3R5cGUpCnsKICByZXR1cm4gZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194 KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9U cD4KX0ZvcndhcmRJdGVyCl9fdW5pbml0aWFsaXplZF9maWxsX25fYXV4KF9Gb3J3YXJkSXRlciBf X2ZpcnN0LCBfU2l6ZSBfX24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYg X194LCBfX2ZhbHNlX3R5cGUpCnsKICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX2ZpcnN0OwogIHRy eSAgewogICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2N1cikKICAgICAgY29uc3RydWN0 KCYqX19jdXIsIF9feCk7CiAgICByZXR1cm4gX19jdXI7CiAgfQogIGNhdGNoKC4uLikgeyAgZGVz dHJveShfX2ZpcnN0LCBfX2N1cikgOyB0aHJvdzsgfSA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9y d2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHAsIGNsYXNzIF9UcDE+CmlubGluZSBfRm9y d2FyZEl0ZXIgCl9fdW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9T aXplIF9fbiwgY29uc3QgX1RwJiBfX3gsIF9UcDEqKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5 cGVfdHJhaXRzPF9UcDE+Ojppc19QT0RfdHlwZSBfSXNfUE9EOwogIHJldHVybiBfX3VuaW5pdGlh bGl6ZWRfZmlsbF9uX2F1eChfX2ZpcnN0LCBfX24sIF9feCwgX0lzX1BPRCgpKTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KaW5saW5lIF9G b3J3YXJkSXRlciAKdW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9T aXplIF9fbiwgY29uc3QgX1RwJiBfX3gpCnsKICByZXR1cm4gX191bmluaXRpYWxpemVkX2ZpbGxf bihfX2ZpcnN0LCBfX24sIF9feCwgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoKIAogCgog CiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBj bGFzcyBfRm9yd2FyZEl0ZXI+CmlubGluZSBfRm9yd2FyZEl0ZXIKX191bmluaXRpYWxpemVkX2Nv cHlfY29weShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAg ICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19s YXN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQpCnsK ICBfRm9yd2FyZEl0ZXIgX19taWQgPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdDEsIF9fbGFz dDEsIF9fcmVzdWx0KTsKICB0cnkgIHsKICAgIHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19m aXJzdDIsIF9fbGFzdDIsIF9fbWlkKTsKICB9CiAgY2F0Y2goLi4uKSB7ICBkZXN0cm95KF9fcmVz dWx0LCBfX21pZCkgOyB0aHJvdzsgfSA7Cn0KCiAKIAogCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2Fy ZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0lucHV0SXRlcj4KaW5saW5lIF9Gb3J3YXJkSXRlciAK X191bmluaXRpYWxpemVkX2ZpbGxfY29weShfRm9yd2FyZEl0ZXIgX19yZXN1bHQsIF9Gb3J3YXJk SXRlciBfX21pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwKICAg ICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19s YXN0KQp7CiAgdW5pbml0aWFsaXplZF9maWxsKF9fcmVzdWx0LCBfX21pZCwgX194KTsKICB0cnkg IHsKICAgIHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX21pZCk7 CiAgfQogIGNhdGNoKC4uLikgeyAgZGVzdHJveShfX3Jlc3VsdCwgX19taWQpIDsgdGhyb3c7IH0g Owp9CgogCiAKIAp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVy LCBjbGFzcyBfVHA+CmlubGluZSB2b2lkCl9fdW5pbml0aWFsaXplZF9jb3B5X2ZpbGwoX0lucHV0 SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAg ICAgIF9Gb3J3YXJkSXRlciBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyIF9fbGFzdDIsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gpCnsKICBfRm9yd2FyZEl0ZXIgX19taWQy ID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0Mik7CiAgdHJ5 ICB7CiAgICB1bmluaXRpYWxpemVkX2ZpbGwoX19taWQyLCBfX2xhc3QyLCBfX3gpOwogIH0KICBj YXRjaCguLi4pIHsgIGRlc3Ryb3koX19maXJzdDIsIF9fbWlkMikgOyB0aHJvdzsgfSA7Cn0KCiAK CgoKIAogCiAKIyAzMyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUu My8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3ZlY3RvciIgMiAzCgojIDEgIi91c3IvbGliL2dj Yy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKyst My9zdGxfdmVjdG9yLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAg CgoKCgoKCiAKIAogCiAKIAoKCgogCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0 b3IsIGJvb2wgX0lzU3RhdGljPgpjbGFzcyBfVmVjdG9yX2FsbG9jX2Jhc2UgewpwdWJsaWM6CiAg dHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9UcCwgX0FsbG9jYXRvcj46OmFsbG9jYXRv cl90eXBlCiAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxs b2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fZGF0YV9hbGxvY2F0b3I7IH0KCiAgX1ZlY3Rvcl9h bGxvY19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCiAgICA6IF9NX2RhdGFfYWxsb2Nh dG9yKF9fYSksIF9NX3N0YXJ0KDApLCBfTV9maW5pc2goMCksIF9NX2VuZF9vZl9zdG9yYWdlKDAp IAogIHt9CiAgCnByb3RlY3RlZDoKICBhbGxvY2F0b3JfdHlwZSBfTV9kYXRhX2FsbG9jYXRvcjsK ICBfVHAqIF9NX3N0YXJ0OwogIF9UcCogX01fZmluaXNoOwogIF9UcCogX01fZW5kX29mX3N0b3Jh Z2U7CgogIF9UcCogX01fYWxsb2NhdGUoc2l6ZV90IF9fbikKICAgIHsgcmV0dXJuIF9NX2RhdGFf YWxsb2NhdG9yLmFsbG9jYXRlKF9fbik7IH0KICB2b2lkIF9NX2RlYWxsb2NhdGUoX1RwKiBfX3As IHNpemVfdCBfX24pCiAgICB7IGlmIChfX3ApIF9NX2RhdGFfYWxsb2NhdG9yLmRlYWxsb2NhdGUo X19wLCBfX24pOyB9Cn07CgogCiAKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRv cj4KY2xhc3MgX1ZlY3Rvcl9hbGxvY19iYXNlPF9UcCwgX0FsbG9jYXRvciwgdHJ1ZT4gewpwdWJs aWM6CiAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9UcCwgX0FsbG9jYXRvcj46OmFs bG9jYXRvcl90eXBlCiAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBn ZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoKTsgfQoKICBfVmVj dG9yX2FsbG9jX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmKQogICAgOiBfTV9zdGFydCgwKSwg X01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKSAKICB7fQogIApwcm90ZWN0ZWQ6CiAg X1RwKiBfTV9zdGFydDsKICBfVHAqIF9NX2ZpbmlzaDsKICBfVHAqIF9NX2VuZF9vZl9zdG9yYWdl OwoKICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2NhdG9yPjo6X0Fs bG9jX3R5cGUgX0FsbG9jX3R5cGU7CiAgX1RwKiBfTV9hbGxvY2F0ZShzaXplX3QgX19uKQogICAg eyByZXR1cm4gX0FsbG9jX3R5cGU6OmFsbG9jYXRlKF9fbik7IH0KICB2b2lkIF9NX2RlYWxsb2Nh dGUoX1RwKiBfX3AsIHNpemVfdCBfX24pCiAgICB7IF9BbGxvY190eXBlOjpkZWFsbG9jYXRlKF9f cCwgX19uKTt9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnN0cnVjdCBf VmVjdG9yX2Jhc2UKICA6IHB1YmxpYyBfVmVjdG9yX2FsbG9jX2Jhc2U8X1RwLCBfQWxsb2MsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+Ojpf U19pbnN0YW5jZWxlc3M+CnsKICB0eXBlZGVmIF9WZWN0b3JfYWxsb2NfYmFzZTxfVHAsIF9BbGxv YywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxv Yz46Ol9TX2luc3RhbmNlbGVzcz4KICAgICAgICAgIF9CYXNlOwogIHR5cGVkZWYgdHlwZW5hbWUg X0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwoKICBfVmVjdG9yX2Jhc2UoY29u c3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkgOiBfQmFzZShfX2EpIHt9CiAgX1ZlY3Rvcl9iYXNlKHNp emVfdCBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDogX0Jhc2UoX19hKSB7CiAgICBf TV9zdGFydCA9IF9NX2FsbG9jYXRlKF9fbik7CiAgICBfTV9maW5pc2ggPSBfTV9zdGFydDsKICAg IF9NX2VuZF9vZl9zdG9yYWdlID0gX01fc3RhcnQgKyBfX247CiAgfQoKICB+X1ZlY3Rvcl9iYXNl KCkgeyBfTV9kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0 KTsgfQp9OyAgICAKCiMgMTUwICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgv Mi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX3ZlY3Rvci5oIiAzCgoKdGVtcGxh dGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPCBfVHAgPiAgPgpjbGFzcyB2 ZWN0b3IgOiBwcm90ZWN0ZWQgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPiAKewpwcml2YXRlOgog IHR5cGVkZWYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPiBfQmFzZTsKcHVibGljOgogIHR5cGVk ZWYgX1RwIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogIHR5cGVk ZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKICB0eXBlZGVmIHZhbHVlX3R5cGUq IGl0ZXJhdG9yOwogIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfaXRlcmF0b3I7CiAg dHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CiAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBl JiBjb25zdF9yZWZlcmVuY2U7CiAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwogIHR5cGVkZWYg cHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKCiAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxs b2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRv cigpIGNvbnN0IHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KCgogIHR5cGVkZWYg cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsK ICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7CgoK CgoKCgpwcm90ZWN0ZWQ6CgogIHVzaW5nIF9CYXNlOjpfTV9hbGxvY2F0ZTsKICB1c2luZyBfQmFz ZTo6X01fZGVhbGxvY2F0ZTsKICB1c2luZyBfQmFzZTo6X01fc3RhcnQ7CiAgdXNpbmcgX0Jhc2U6 Ol9NX2ZpbmlzaDsKICB1c2luZyBfQmFzZTo6X01fZW5kX29mX3N0b3JhZ2U7CgoKcHJvdGVjdGVk OgogIHZvaWQgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9f eCk7CiAgdm9pZCBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24pOwoKcHVibGljOgog IGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01fc3RhcnQ7IH0KICBjb25zdF9pdGVyYXRvciBi ZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3N0YXJ0OyB9CiAgaXRlcmF0b3IgZW5kKCkgeyByZXR1 cm4gX01fZmluaXNoOyB9CiAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01f ZmluaXNoOyB9CgogIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkKICAgIHsgcmV0dXJuIHJldmVy c2VfaXRlcmF0b3IoZW5kKCkpOyB9CiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBj b25zdAogICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KICByZXZl cnNlX2l0ZXJhdG9yIHJlbmQoKQogICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigp KTsgfQogIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0CiAgICB7IHJldHVybiBj b25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CgogIHNpemVfdHlwZSBzaXplKCkgY29u c3QKICAgIHsgcmV0dXJuIHNpemVfdHlwZShlbmQoKSAtIGJlZ2luKCkpOyB9CiAgc2l6ZV90eXBl IG1heF9zaXplKCkgY29uc3QKICAgIHsgcmV0dXJuIHNpemVfdHlwZSgtMSkgLyBzaXplb2YoX1Rw KTsgfQogIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0CiAgICB7IHJldHVybiBzaXplX3R5cGUo X01fZW5kX29mX3N0b3JhZ2UgLSBiZWdpbigpKTsgfQogIGJvb2wgZW1wdHkoKSBjb25zdAogICAg eyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQoKICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXpl X3R5cGUgX19uKSB7IHJldHVybiAqKGJlZ2luKCkgKyBfX24pOyB9CiAgY29uc3RfcmVmZXJlbmNl IG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gKihiZWdpbigpICsgX19u KTsgfQoKICBleHBsaWNpdCB2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9j YXRvcl90eXBlKCkpCiAgICA6IF9CYXNlKF9fYSkge30KCiAgdmVjdG9yKHNpemVfdHlwZSBfX24s IGNvbnN0IF9UcCYgX192YWx1ZSwKICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9 IGFsbG9jYXRvcl90eXBlKCkpIAogICAgOiBfQmFzZShfX24sIF9fYSkKICAgIHsgX01fZmluaXNo ID0gdW5pbml0aWFsaXplZF9maWxsX24oX01fc3RhcnQsIF9fbiwgX192YWx1ZSk7IH0KCiAgZXhw bGljaXQgdmVjdG9yKHNpemVfdHlwZSBfX24pCiAgICA6IF9CYXNlKF9fbiwgYWxsb2NhdG9yX3R5 cGUoKSkKICAgIHsgX01fZmluaXNoID0gdW5pbml0aWFsaXplZF9maWxsX24oX01fc3RhcnQsIF9f biwgX1RwKCkpOyB9CgogIHZlY3Rvcihjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gpIAog ICAgOiBfQmFzZShfX3guc2l6ZSgpLCBfX3guZ2V0X2FsbG9jYXRvcigpKQogICAgeyBfTV9maW5p c2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX01fc3RhcnQp OyB9CgoKICAgCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZlY3RvcihfSW5w dXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgIGNvbnN0 IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IF9CYXNlKF9fYSkgewog ICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9JbnRlZ3Jh bCBfSW50ZWdyYWw7CiAgICBfTV9pbml0aWFsaXplX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRl Z3JhbCgpKTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KICB2b2lkIF9NX2luaXRp YWxpemVfYXV4KF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWx1ZSwgX190cnVlX3R5cGUpIHsK ICAgIF9NX3N0YXJ0ID0gX01fYWxsb2NhdGUoX19uKTsKICAgIF9NX2VuZF9vZl9zdG9yYWdlID0g X01fc3RhcnQgKyBfX247IAogICAgX01fZmluaXNoID0gdW5pbml0aWFsaXplZF9maWxsX24oX01f c3RhcnQsIF9fbiwgX192YWx1ZSk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0 b3I+CiAgdm9pZCBfTV9pbml0aWFsaXplX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5w dXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZhbHNlX3R5cGUp IHsKICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19maXJzdCwgX19sYXN0LCBfX2l0ZXJhdG9yX2Nh dGVnb3J5KCBfX2ZpcnN0ICkgKTsKICB9CgoKCgoKCgoKICB+dmVjdG9yKCkgeyBkZXN0cm95KF9N X3N0YXJ0LCBfTV9maW5pc2gpOyB9CgogIHZlY3RvcjxfVHAsIF9BbGxvYz4mIG9wZXJhdG9yPShj b25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gpOwogIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUg X19uKSB7CiAgICBpZiAoY2FwYWNpdHkoKSA8IF9fbikgewogICAgICBjb25zdCBzaXplX3R5cGUg X19vbGRfc2l6ZSA9IHNpemUoKTsKICAgICAgaXRlcmF0b3IgX190bXAgPSBfTV9hbGxvY2F0ZV9h bmRfY29weShfX24sIF9NX3N0YXJ0LCBfTV9maW5pc2gpOwogICAgICBkZXN0cm95KF9NX3N0YXJ0 LCBfTV9maW5pc2gpOwogICAgICBfTV9kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3Rv cmFnZSAtIF9NX3N0YXJ0KTsKICAgICAgX01fc3RhcnQgPSBfX3RtcDsKICAgICAgX01fZmluaXNo ID0gX190bXAgKyBfX29sZF9zaXplOwogICAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9NX3N0YXJ0 ICsgX19uOwogICAgfQogIH0KCiAgIAogICAKICAgCiAgIAoKICB2b2lkIGFzc2lnbihzaXplX3R5 cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKTsKCgogIAogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJ dGVyYXRvcj4KICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVy YXRvciBfX2xhc3QpIHsKICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRl cmF0b3I+OjpfSW50ZWdyYWwgX0ludGVncmFsOwogICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmly c3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2Vy PgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWws IF9fdHJ1ZV90eXBlKQogICAgeyBhc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7 IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CiAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0 Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX19mYWxzZV90eXBlKQog ICAgeyBfTV9hc3NpZ25fYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19pdGVyYXRvcl9jYXRlZ29yeSgg X19maXJzdCApICk7IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQg X01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZyk7CgogIHRlbXBsYXRl IDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgogIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0 ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAg ICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7IAoKCgogIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0 dXJuICpiZWdpbigpOyB9CiAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4g KmJlZ2luKCk7IH0KICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQog IGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9Cgog IHZvaWQgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194KSB7CiAgICBpZiAoX01fZmluaXNoICE9IF9N X2VuZF9vZl9zdG9yYWdlKSB7CiAgICAgIGNvbnN0cnVjdChfTV9maW5pc2gsIF9feCk7CiAgICAg ICsrX01fZmluaXNoOwogICAgfQogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpLCBf X3gpOwogIH0KICB2b2lkIHB1c2hfYmFjaygpIHsKICAgIGlmIChfTV9maW5pc2ggIT0gX01fZW5k X29mX3N0b3JhZ2UpIHsKICAgICAgY29uc3RydWN0KF9NX2ZpbmlzaCk7CiAgICAgICsrX01fZmlu aXNoOwogICAgfQogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpKTsKICB9CiAgdm9p ZCBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCkgewogICAgIDo6c3dhcChfTV9zdGFydCwg X194Ll9NX3N0YXJ0KTsKICAgICA6OnN3YXAoX01fZmluaXNoLCBfX3guX01fZmluaXNoKTsKICAg ICA6OnN3YXAoX01fZW5kX29mX3N0b3JhZ2UsIF9feC5fTV9lbmRfb2Zfc3RvcmFnZSk7CiAgfQoK ICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gpIHsK ICAgIHNpemVfdHlwZSBfX24gPSBfX3Bvc2l0aW9uIC0gYmVnaW4oKTsKICAgIGlmIChfTV9maW5p c2ggIT0gX01fZW5kX29mX3N0b3JhZ2UgJiYgX19wb3NpdGlvbiA9PSBlbmQoKSkgewogICAgICBj b25zdHJ1Y3QoX01fZmluaXNoLCBfX3gpOwogICAgICArK19NX2ZpbmlzaDsKICAgIH0KICAgIGVs c2UKICAgICAgX01faW5zZXJ0X2F1eChfX3Bvc2l0aW9uLCBfX3gpOwogICAgcmV0dXJuIGJlZ2lu KCkgKyBfX247CiAgfQogIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uKSB7CiAg ICBzaXplX3R5cGUgX19uID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CiAgICBpZiAoX01fZmluaXNo ICE9IF9NX2VuZF9vZl9zdG9yYWdlICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpIHsKICAgICAgY29u c3RydWN0KF9NX2ZpbmlzaCk7CiAgICAgICsrX01fZmluaXNoOwogICAgfQogICAgZWxzZQogICAg ICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24pOwogICAgcmV0dXJuIGJlZ2luKCkgKyBfX247CiAg fQoKICAgCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgaW5zZXJ0KGl0 ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xh c3QpIHsKICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+Ojpf SW50ZWdyYWwgX0ludGVncmFsOwogICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0 LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4K ICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBf SW50ZWdlciBfX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RydWVfdHlwZSkgewog ICAgaW5zZXJ0KF9fcG9zLCAoc2l6ZV90eXBlKSBfX24sIChfVHApIF9fdmFsKTsKICB9CgogIHRl bXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChp dGVyYXRvciBfX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBf X2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAg X19mYWxzZV90eXBlKSB7CiAgICBfTV9yYW5nZV9pbnNlcnQoX19wb3MsIF9fZmlyc3QsIF9fbGFz dCwgX19pdGVyYXRvcl9jYXRlZ29yeSggX19maXJzdCApICk7CiAgfQoKCgoKCiAgdm9pZCBpbnNl cnQgKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCk7CgogIHZv aWQgcG9wX2JhY2soKSB7CiAgICAtLV9NX2ZpbmlzaDsKICAgIGRlc3Ryb3koX01fZmluaXNoKTsK ICB9CiAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikgewogICAgaWYgKF9fcG9z aXRpb24gKyAxICE9IGVuZCgpKQogICAgICBjb3B5KF9fcG9zaXRpb24gKyAxLCBfTV9maW5pc2gs IF9fcG9zaXRpb24pOwogICAgLS1fTV9maW5pc2g7CiAgICBkZXN0cm95KF9NX2ZpbmlzaCk7CiAg ICByZXR1cm4gX19wb3NpdGlvbjsKICB9CiAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJz dCwgaXRlcmF0b3IgX19sYXN0KSB7CiAgICBpdGVyYXRvciBfX2kgPSBjb3B5KF9fbGFzdCwgX01f ZmluaXNoLCBfX2ZpcnN0KTsKICAgIGRlc3Ryb3koX19pLCBfTV9maW5pc2gpOwogICAgX01fZmlu aXNoID0gX01fZmluaXNoIC0gKF9fbGFzdCAtIF9fZmlyc3QpOwogICAgcmV0dXJuIF9fZmlyc3Q7 CiAgfQoKICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gp IHsKICAgIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKSAKICAgICAgZXJhc2UoYmVnaW4oKSArIF9f bmV3X3NpemUsIGVuZCgpKTsKICAgIGVsc2UKICAgICAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXpl IC0gc2l6ZSgpLCBfX3gpOwogIH0KICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkg eyByZXNpemUoX19uZXdfc2l6ZSwgX1RwKCkpOyB9CiAgdm9pZCBjbGVhcigpIHsgZXJhc2UoYmVn aW4oKSwgZW5kKCkpOyB9Cgpwcm90ZWN0ZWQ6CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJ dGVyYXRvcj4KICBpdGVyYXRvciBfTV9hbGxvY2F0ZV9hbmRfY29weShzaXplX3R5cGUgX19uLCBf Rm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQp7CiAgICBpdGVyYXRvciBf X3Jlc3VsdCA9IF9NX2FsbG9jYXRlKF9fbik7CiAgICB0cnkgIHsKICAgICAgdW5pbml0aWFsaXpl ZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOwogICAgICByZXR1cm4gX19yZXN1bHQ7 CiAgICB9CiAgICBjYXRjaCguLi4pIHsgIF9NX2RlYWxsb2NhdGUoX19yZXN1bHQsIF9fbikgOyB0 aHJvdzsgfSA7CiAgfQojIDQ0MCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF92ZWN0b3IuaCIgMwoKCgoKICB0 ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXpl KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lu cHV0SXRlcmF0b3IgX19sYXN0LCBpbnB1dF9pdGVyYXRvcl90YWcpCiAgewogICAgZm9yICggOyBf X2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgICBwdXNoX2JhY2soKl9fZmlyc3QpOwog IH0KCiAgIAogIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgogIHZvaWQgX01fcmFu Z2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBmb3J3YXJkX2l0ZXJhdG9yX3RhZykK ICB7CiAgICBzaXplX3R5cGUgX19uID0gMDsKICAgIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwg X19uKTsKICAgIF9NX3N0YXJ0ID0gX01fYWxsb2NhdGUoX19uKTsKICAgIF9NX2VuZF9vZl9zdG9y YWdlID0gX01fc3RhcnQgKyBfX247CiAgICBfTV9maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHko X19maXJzdCwgX19sYXN0LCBfTV9zdGFydCk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0 SXRlcmF0b3I+CiAgdm9pZCBfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19wb3MsCiAgICAgICAg ICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19s YXN0LAogICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZyk7CgogIHRlbXBs YXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgogIHZvaWQgX01fcmFuZ2VfaW5zZXJ0KGl0ZXJh dG9yIF9fcG9zLAogICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJz dCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgZm9yd2Fy ZF9pdGVyYXRvcl90YWcpOwoKCn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+ CmlubGluZSBib29sIApvcGVyYXRvcj09KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwg Y29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQp7CiAgcmV0dXJuIF9feC5zaXplKCkgPT0g X195LnNpemUoKSAmJgogICAgICAgICBlcXVhbChfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX3ku YmVnaW4oKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KaW5saW5lIGJv b2wgCm9wZXJhdG9yPChjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IHZlY3Rv cjxfVHAsIF9BbGxvYz4mIF9feSkKewogIHJldHVybiBsZXhpY29ncmFwaGljYWxfY29tcGFyZShf X3guYmVnaW4oKSwgX194LmVuZCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X195LmJlZ2luKCksIF9feS5lbmQoKSk7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3Mg X0FsbG9jPgppbmxpbmUgdm9pZCBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgdmVjdG9y PF9UcCwgX0FsbG9jPiYgX195KQp7CiAgX194LnN3YXAoX195KTsKfQoKCgp0ZW1wbGF0ZSA8Y2xh c3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZlY3RvcjxfVHAsX0FsbG9jPiYgCnZlY3RvcjxfVHAsX0Fs bG9jPjo6b3BlcmF0b3I9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCkKewogIGlmICgm X194ICE9IHRoaXMpIHsKICAgIGNvbnN0IHNpemVfdHlwZSBfX3hsZW4gPSBfX3guc2l6ZSgpOwog ICAgaWYgKF9feGxlbiA+IGNhcGFjaXR5KCkpIHsKICAgICAgaXRlcmF0b3IgX190bXAgPSBfTV9h bGxvY2F0ZV9hbmRfY29weShfX3hsZW4sIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOwogICAgICBk ZXN0cm95KF9NX3N0YXJ0LCBfTV9maW5pc2gpOwogICAgICBfTV9kZWFsbG9jYXRlKF9NX3N0YXJ0 LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0KTsKICAgICAgX01fc3RhcnQgPSBfX3RtcDsK ICAgICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfTV9zdGFydCArIF9feGxlbjsKICAgIH0KICAgIGVs c2UgaWYgKHNpemUoKSA+PSBfX3hsZW4pIHsKICAgICAgaXRlcmF0b3IgX19pID0gY29weShfX3gu YmVnaW4oKSwgX194LmVuZCgpLCBiZWdpbigpKTsKICAgICAgZGVzdHJveShfX2ksIF9NX2Zpbmlz aCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgY29weShfX3guYmVnaW4oKSwgX194LmJlZ2luKCkg KyBzaXplKCksIF9NX3N0YXJ0KTsKICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9feC5iZWdpbigp ICsgc2l6ZSgpLCBfX3guZW5kKCksIF9NX2ZpbmlzaCk7CiAgICB9CiAgICBfTV9maW5pc2ggPSBf TV9zdGFydCArIF9feGxlbjsKICB9CiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6YXNzaWduKHNpemVf dCBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKSB7CiAgaWYgKF9fbiA+IGNhcGFjaXR5KCkp IHsKICAgIHZlY3RvcjxfVHAsIF9BbGxvYz4gX190bXAoX19uLCBfX3ZhbCwgZ2V0X2FsbG9jYXRv cigpKTsKICAgIF9fdG1wLnN3YXAoKnRoaXMpOwogIH0KICBlbHNlIGlmIChfX24gPiBzaXplKCkp IHsKICAgIGZpbGwoYmVnaW4oKSwgZW5kKCksIF9fdmFsKTsKICAgIF9NX2ZpbmlzaCA9IHVuaW5p dGlhbGl6ZWRfZmlsbF9uKF9NX2ZpbmlzaCwgX19uIC0gc2l6ZSgpLCBfX3ZhbCk7CiAgfQogIGVs c2UKICAgIGVyYXNlKGZpbGxfbihiZWdpbigpLCBfX24sIF9fdmFsKSwgZW5kKCkpOwp9CgoKCnRl bXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4gdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0 ZXI+CnZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fYXNzaWduX2F1eChfSW5wdXRJdGVyIF9f Zmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKSB7CiAgaXRlcmF0b3IgX19jdXIgPSBiZWdpbigp OwogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIs ICsrX19maXJzdCkKICAgICpfX2N1ciA9ICpfX2ZpcnN0OwogIGlmIChfX2ZpcnN0ID09IF9fbGFz dCkKICAgIGVyYXNlKF9fY3VyLCBlbmQoKSk7CiAgZWxzZQogICAgaW5zZXJ0KGVuZCgpLCBfX2Zp cnN0LCBfX2xhc3QpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+IHRlbXBs YXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CnZvaWQKdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fYXNz aWduX2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykgewogIHNp emVfdHlwZSBfX2xlbiA9IDA7CiAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX2xlbik7Cgog IGlmIChfX2xlbiA+IGNhcGFjaXR5KCkpIHsKICAgIGl0ZXJhdG9yIF9fdG1wID0gX01fYWxsb2Nh dGVfYW5kX2NvcHkoX19sZW4sIF9fZmlyc3QsIF9fbGFzdCk7CiAgICBkZXN0cm95KF9NX3N0YXJ0 LCBfTV9maW5pc2gpOwogICAgX01fZGVhbGxvY2F0ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3Jh Z2UgLSBfTV9zdGFydCk7CiAgICBfTV9zdGFydCA9IF9fdG1wOwogICAgX01fZW5kX29mX3N0b3Jh Z2UgPSBfTV9maW5pc2ggPSBfTV9zdGFydCArIF9fbGVuOwogIH0KICBlbHNlIGlmIChzaXplKCkg Pj0gX19sZW4pIHsKICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IGNvcHkoX19maXJzdCwgX19s YXN0LCBfTV9zdGFydCk7CiAgICBkZXN0cm95KF9fbmV3X2ZpbmlzaCwgX01fZmluaXNoKTsKICAg IF9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKICB9CiAgZWxzZSB7CiAgICBfRm9yd2FyZEl0ZXIg X19taWQgPSBfX2ZpcnN0OwogICAgYWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKICAgIGNvcHkoX19m aXJzdCwgX19taWQsIF9NX3N0YXJ0KTsKICAgIF9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29w eShfX21pZCwgX19sYXN0LCBfTV9maW5pc2gpOwogIH0KfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1Rw LCBjbGFzcyBfQWxsb2M+CnZvaWQgCnZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX2luc2VydF9hdXgo aXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gpCnsKICBpZiAoX01fZmluaXNoICE9 IF9NX2VuZF9vZl9zdG9yYWdlKSB7CiAgICBjb25zdHJ1Y3QoX01fZmluaXNoLCAqKF9NX2Zpbmlz aCAtIDEpKTsKICAgICsrX01fZmluaXNoOwogICAgX1RwIF9feF9jb3B5ID0gX194OwogICAgY29w eV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBfTV9maW5pc2ggLSAyLCBfTV9maW5pc2ggLSAxKTsKICAg ICpfX3Bvc2l0aW9uID0gX194X2NvcHk7CiAgfQogIGVsc2UgewogICAgY29uc3Qgc2l6ZV90eXBl IF9fb2xkX3NpemUgPSBzaXplKCk7CiAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9z aXplICE9IDAgPyAyICogX19vbGRfc2l6ZSA6IDE7CiAgICBpdGVyYXRvciBfX25ld19zdGFydCA9 IF9NX2FsbG9jYXRlKF9fbGVuKTsKICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0 YXJ0OwogICAgdHJ5ICB7CiAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShf TV9zdGFydCwgX19wb3NpdGlvbiwgX19uZXdfc3RhcnQpOwogICAgICBjb25zdHJ1Y3QoX19uZXdf ZmluaXNoLCBfX3gpOwogICAgICArK19fbmV3X2ZpbmlzaDsKICAgICAgX19uZXdfZmluaXNoID0g dW5pbml0aWFsaXplZF9jb3B5KF9fcG9zaXRpb24sIF9NX2ZpbmlzaCwgX19uZXdfZmluaXNoKTsK ICAgIH0KICAgIGNhdGNoKC4uLikgeyAgKGRlc3Ryb3koX19uZXdfc3RhcnQsX19uZXdfZmluaXNo KSwgCiAgICAgICAgICAgICAgICAgIF9NX2RlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKSA7 IHRocm93OyB9IDsKICAgIGRlc3Ryb3koYmVnaW4oKSwgZW5kKCkpOwogICAgX01fZGVhbGxvY2F0 ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3JhZ2UgLSBfTV9zdGFydCk7CiAgICBfTV9zdGFydCA9 IF9fbmV3X3N0YXJ0OwogICAgX01fZmluaXNoID0gX19uZXdfZmluaXNoOwogICAgX01fZW5kX29m X3N0b3JhZ2UgPSBfX25ld19zdGFydCArIF9fbGVuOwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9U cCwgY2xhc3MgX0FsbG9jPgp2b2lkIAp2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9pbnNlcnRfYXV4 KGl0ZXJhdG9yIF9fcG9zaXRpb24pCnsKICBpZiAoX01fZmluaXNoICE9IF9NX2VuZF9vZl9zdG9y YWdlKSB7CiAgICBjb25zdHJ1Y3QoX01fZmluaXNoLCAqKF9NX2ZpbmlzaCAtIDEpKTsKICAgICsr X01fZmluaXNoOwogICAgY29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBfTV9maW5pc2ggLSAyLCBf TV9maW5pc2ggLSAxKTsKICAgICpfX3Bvc2l0aW9uID0gX1RwKCk7CiAgfQogIGVsc2UgewogICAg Y29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7CiAgICBjb25zdCBzaXplX3R5cGUg X19sZW4gPSBfX29sZF9zaXplICE9IDAgPyAyICogX19vbGRfc2l6ZSA6IDE7CiAgICBpdGVyYXRv ciBfX25ld19zdGFydCA9IF9NX2FsbG9jYXRlKF9fbGVuKTsKICAgIGl0ZXJhdG9yIF9fbmV3X2Zp bmlzaCA9IF9fbmV3X3N0YXJ0OwogICAgdHJ5ICB7CiAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5p dGlhbGl6ZWRfY29weShfTV9zdGFydCwgX19wb3NpdGlvbiwgX19uZXdfc3RhcnQpOwogICAgICBj b25zdHJ1Y3QoX19uZXdfZmluaXNoKTsKICAgICAgKytfX25ld19maW5pc2g7CiAgICAgIF9fbmV3 X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX3Bvc2l0aW9uLCBfTV9maW5pc2gsIF9fbmV3 X2ZpbmlzaCk7CiAgICB9CiAgICBjYXRjaCguLi4pIHsgIChkZXN0cm95KF9fbmV3X3N0YXJ0LF9f bmV3X2ZpbmlzaCksIAogICAgICAgICAgICAgICAgICBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0 LF9fbGVuKSkgOyB0aHJvdzsgfSA7CiAgICBkZXN0cm95KGJlZ2luKCksIGVuZCgpKTsKICAgIF9N X2RlYWxsb2NhdGUoX01fc3RhcnQsIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3RhcnQpOwogICAg X01fc3RhcnQgPSBfX25ld19zdGFydDsKICAgIF9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKICAg IF9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQgKyBfX2xlbjsKICB9Cn0KCnRlbXBsYXRl IDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4Kdm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjppbnNl cnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194KQp7CiAgaWYgKF9fbiAhPSAwKSB7CiAgICBp ZiAoc2l6ZV90eXBlKF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fZmluaXNoKSA+PSBfX24pIHsKICAg ICAgX1RwIF9feF9jb3B5ID0gX194OwogICAgICBjb25zdCBzaXplX3R5cGUgX19lbGVtc19hZnRl ciA9IF9NX2ZpbmlzaCAtIF9fcG9zaXRpb247CiAgICAgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9 IF9NX2ZpbmlzaDsKICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBfX24pIHsKICAgICAgICB1bmlu aXRpYWxpemVkX2NvcHkoX01fZmluaXNoIC0gX19uLCBfTV9maW5pc2gsIF9NX2ZpbmlzaCk7CiAg ICAgICAgX01fZmluaXNoICs9IF9fbjsKICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24s IF9fb2xkX2ZpbmlzaCAtIF9fbiwgX19vbGRfZmluaXNoKTsKICAgICAgICBmaWxsKF9fcG9zaXRp b24sIF9fcG9zaXRpb24gKyBfX24sIF9feF9jb3B5KTsKICAgICAgfQogICAgICBlbHNlIHsKICAg ICAgICB1bmluaXRpYWxpemVkX2ZpbGxfbihfTV9maW5pc2gsIF9fbiAtIF9fZWxlbXNfYWZ0ZXIs IF9feF9jb3B5KTsKICAgICAgICBfTV9maW5pc2ggKz0gX19uIC0gX19lbGVtc19hZnRlcjsKICAg ICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19wb3NpdGlvbiwgX19vbGRfZmluaXNoLCBfTV9maW5p c2gpOwogICAgICAgIF9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOwogICAgICAgIGZpbGwoX19w b3NpdGlvbiwgX19vbGRfZmluaXNoLCBfX3hfY29weSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2Ug ewogICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsgICAgICAgIAogICAg ICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgbWF4KF9fb2xkX3NpemUsIF9f bik7CiAgICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fYWxsb2NhdGUoX19sZW4pOwogICAg ICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKICAgICAgdHJ5ICB7CiAgICAg ICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9NX3N0YXJ0LCBfX3Bvc2l0aW9u LCBfX25ld19zdGFydCk7CiAgICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9maWxs X24oX19uZXdfZmluaXNoLCBfX24sIF9feCk7CiAgICAgICAgX19uZXdfZmluaXNoCiAgICAgICAg ICA9IHVuaW5pdGlhbGl6ZWRfY29weShfX3Bvc2l0aW9uLCBfTV9maW5pc2gsIF9fbmV3X2Zpbmlz aCk7CiAgICAgIH0KICAgICAgY2F0Y2goLi4uKSB7ICAoZGVzdHJveShfX25ld19zdGFydCxfX25l d19maW5pc2gpLCAKICAgICAgICAgICAgICAgICAgICBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0 LF9fbGVuKSkgOyB0aHJvdzsgfSA7CiAgICAgIGRlc3Ryb3koX01fc3RhcnQsIF9NX2ZpbmlzaCk7 CiAgICAgIF9NX2RlYWxsb2NhdGUoX01fc3RhcnQsIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3Rh cnQpOwogICAgICBfTV9zdGFydCA9IF9fbmV3X3N0YXJ0OwogICAgICBfTV9maW5pc2ggPSBfX25l d19maW5pc2g7CiAgICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQgKyBfX2xlbjsK ICAgIH0KICB9Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1wbGF0 ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CnZvaWQgCnZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX3Jh bmdlX2luc2VydChpdGVyYXRvciBfX3BvcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCAKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykKewogIGZvciAoIDsgX19maXJzdCAh PSBfX2xhc3Q7ICsrX19maXJzdCkgewogICAgX19wb3MgPSBpbnNlcnQoX19wb3MsICpfX2ZpcnN0 KTsKICAgICsrX19wb3M7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+ IHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgp2b2lkIAp2ZWN0b3I8X1RwLCBfQWxs b2M+OjpfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCnsK ICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKICAgIHNpemVfdHlwZSBfX24gPSAwOwogICAgZGlz dGFuY2UoX19maXJzdCwgX19sYXN0LCBfX24pOwogICAgaWYgKHNpemVfdHlwZShfTV9lbmRfb2Zf c3RvcmFnZSAtIF9NX2ZpbmlzaCkgPj0gX19uKSB7CiAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2Vs ZW1zX2FmdGVyID0gX01fZmluaXNoIC0gX19wb3NpdGlvbjsKICAgICAgaXRlcmF0b3IgX19vbGRf ZmluaXNoID0gX01fZmluaXNoOwogICAgICBpZiAoX19lbGVtc19hZnRlciA+IF9fbikgewogICAg ICAgIHVuaW5pdGlhbGl6ZWRfY29weShfTV9maW5pc2ggLSBfX24sIF9NX2ZpbmlzaCwgX01fZmlu aXNoKTsKICAgICAgICBfTV9maW5pc2ggKz0gX19uOwogICAgICAgIGNvcHlfYmFja3dhcmQoX19w b3NpdGlvbiwgX19vbGRfZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gpOwogICAgICAgIGNvcHko X19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAg ICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKICAgICAgICBhZHZhbmNlKF9fbWlk LCBfX2VsZW1zX2FmdGVyKTsKICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19taWQsIF9fbGFz dCwgX01fZmluaXNoKTsKICAgICAgICBfTV9maW5pc2ggKz0gX19uIC0gX19lbGVtc19hZnRlcjsK ICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19wb3NpdGlvbiwgX19vbGRfZmluaXNoLCBfTV9m aW5pc2gpOwogICAgICAgIF9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOwogICAgICAgIGNvcHko X19maXJzdCwgX19taWQsIF9fcG9zaXRpb24pOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAg ICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7CiAgICAgIGNvbnN0IHNpemVf dHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyBtYXgoX19vbGRfc2l6ZSwgX19uKTsKICAgICAgaXRl cmF0b3IgX19uZXdfc3RhcnQgPSBfTV9hbGxvY2F0ZShfX2xlbik7CiAgICAgIGl0ZXJhdG9yIF9f bmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OwogICAgICB0cnkgIHsKICAgICAgICBfX25ld19maW5p c2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX01fc3RhcnQsIF9fcG9zaXRpb24sIF9fbmV3X3N0YXJ0 KTsKICAgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19s YXN0LCBfX25ld19maW5pc2gpOwogICAgICAgIF9fbmV3X2ZpbmlzaAogICAgICAgICAgPSB1bmlu aXRpYWxpemVkX2NvcHkoX19wb3NpdGlvbiwgX01fZmluaXNoLCBfX25ld19maW5pc2gpOwogICAg ICB9CiAgICAgIGNhdGNoKC4uLikgeyAgKGRlc3Ryb3koX19uZXdfc3RhcnQsX19uZXdfZmluaXNo KSwgCiAgICAgICAgICAgICAgICAgICAgX01fZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikp IDsgdGhyb3c7IH0gOwogICAgICBkZXN0cm95KF9NX3N0YXJ0LCBfTV9maW5pc2gpOwogICAgICBf TV9kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0KTsKICAg ICAgX01fc3RhcnQgPSBfX25ld19zdGFydDsKICAgICAgX01fZmluaXNoID0gX19uZXdfZmluaXNo OwogICAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CiAgICB9CiAg fQp9CgojIDgxMCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8u Li8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF92ZWN0b3IuaCIgMwoKCgoKCgoKICAKCgoKIAog CiAKIyAzNCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8u Li8uLi8uLi9pbmNsdWRlL2crKy0zL3ZlY3RvciIgMiAzCgojIDEgIi91c3IvbGliL2djYy1saWIv aTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxf YnZlY3Rvci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgogIAoKc3Rh dGljIGNvbnN0IGludCBfX1dPUkRfQklUID0gaW50KDggKnNpemVvZih1bnNpZ25lZCBpbnQpKTsK CgoKCgoKc3RydWN0IF9CaXRfcmVmZXJlbmNlIHsKICB1bnNpZ25lZCBpbnQqIF9NX3A7CiAgdW5z aWduZWQgaW50IF9NX21hc2s7CiAgX0JpdF9yZWZlcmVuY2UodW5zaWduZWQgaW50KiBfX3gsIHVu c2lnbmVkIGludCBfX3kpIAogICAgOiBfTV9wKF9feCksIF9NX21hc2soX195KSB7fQoKcHVibGlj OgogIF9CaXRfcmVmZXJlbmNlKCkgOiBfTV9wKDApLCBfTV9tYXNrKDApIHt9CiAgb3BlcmF0b3Ig Ym9vbCgpIGNvbnN0IHsgcmV0dXJuICEoISgqX01fcCAmIF9NX21hc2spKTsgfQogIF9CaXRfcmVm ZXJlbmNlJiBvcGVyYXRvcj0oYm9vbCBfX3gpCiAgewogICAgaWYgKF9feCkgICpfTV9wIHw9IF9N X21hc2s7CiAgICBlbHNlICAgICAgKl9NX3AgJj0gfl9NX21hc2s7CiAgICByZXR1cm4gKnRoaXM7 CiAgfQogIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvcj0oY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9f eCkgCiAgICB7IHJldHVybiAqdGhpcyA9IGJvb2woX194KTsgfQogIGJvb2wgb3BlcmF0b3I9PShj b25zdCBfQml0X3JlZmVyZW5jZSYgX194KSBjb25zdAogICAgeyByZXR1cm4gYm9vbCgqdGhpcykg PT0gYm9vbChfX3gpOyB9CiAgYm9vbCBvcGVyYXRvcjwoY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9f eCkgY29uc3QgewogICAgcmV0dXJuICFib29sKCp0aGlzKSAmJiBib29sKF9feCk7CiAgfQogIHZv aWQgZmxpcCgpIHsgKl9NX3AgXj0gX01fbWFzazsgfQp9OwoKaW5saW5lIHZvaWQgc3dhcChfQml0 X3JlZmVyZW5jZSBfX3gsIF9CaXRfcmVmZXJlbmNlIF9feSkKewogIGJvb2wgX190bXAgPSBfX3g7 CiAgX194ID0gX195OwogIF9feSA9IF9fdG1wOwp9CgpzdHJ1Y3QgX0JpdF9pdGVyYXRvciA6IHB1 YmxpYyByYW5kb21fYWNjZXNzX2l0ZXJhdG9yPGJvb2wsIHB0cmRpZmZfdD4gewogIHR5cGVkZWYg X0JpdF9yZWZlcmVuY2UgIHJlZmVyZW5jZTsKICB0eXBlZGVmIF9CaXRfcmVmZXJlbmNlKiBwb2lu dGVyOwogIHR5cGVkZWYgX0JpdF9pdGVyYXRvciAgIGl0ZXJhdG9yOwoKICB1bnNpZ25lZCBpbnQq IF9NX3A7CiAgdW5zaWduZWQgaW50IF9NX29mZnNldDsKICB2b2lkIGJ1bXBfdXAoKSB7CiAgICBp ZiAoX01fb2Zmc2V0KysgPT0gX19XT1JEX0JJVCAtIDEpIHsKICAgICAgX01fb2Zmc2V0ID0gMDsK ICAgICAgKytfTV9wOwogICAgfQogIH0KICB2b2lkIGJ1bXBfZG93bigpIHsKICAgIGlmIChfTV9v ZmZzZXQtLSA9PSAwKSB7CiAgICAgIF9NX29mZnNldCA9IF9fV09SRF9CSVQgLSAxOwogICAgICAt LV9NX3A7CiAgICB9CiAgfQoKICBfQml0X2l0ZXJhdG9yKCkgOiBfTV9wKDApLCBfTV9vZmZzZXQo MCkge30KICBfQml0X2l0ZXJhdG9yKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195 KSAKICAgIDogX01fcChfX3gpLCBfTV9vZmZzZXQoX195KSB7fQogIHJlZmVyZW5jZSBvcGVyYXRv ciooKSBjb25zdCB7IHJldHVybiByZWZlcmVuY2UoX01fcCwgMVUgPDwgX01fb2Zmc2V0KTsgfQog IGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgewogICAgYnVtcF91cCgpOwogICAgcmV0dXJuICp0aGlz OwogIH0KICBpdGVyYXRvciBvcGVyYXRvcisrKGludCkgewogICAgaXRlcmF0b3IgX190bXAgPSAq dGhpczsKICAgIGJ1bXBfdXAoKTsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgaXRlcmF0b3ImIG9w ZXJhdG9yLS0oKSB7CiAgICBidW1wX2Rvd24oKTsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaXRl cmF0b3Igb3BlcmF0b3ItLShpbnQpIHsKICAgIGl0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CiAgICBi dW1wX2Rvd24oKTsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgaXRlcmF0b3ImIG9wZXJhdG9yKz0o ZGlmZmVyZW5jZV90eXBlIF9faSkgewogICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9faSArIF9N X29mZnNldDsKICAgIF9NX3AgKz0gX19uIC8gX19XT1JEX0JJVDsKICAgIF9fbiA9IF9fbiAlIF9f V09SRF9CSVQ7CiAgICBpZiAoX19uIDwgMCkgewogICAgICBfTV9vZmZzZXQgPSAodW5zaWduZWQg aW50KSBfX24gKyBfX1dPUkRfQklUOwogICAgICAtLV9NX3A7CiAgICB9IGVsc2UKICAgICAgX01f b2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgX19uOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpdGVy YXRvciYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19pKSB7CiAgICAqdGhpcyArPSAtX19p OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90 eXBlIF9faSkgY29uc3QgewogICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKICAgIHJldHVybiBf X3RtcCArPSBfX2k7CiAgfQogIGl0ZXJhdG9yIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19p KSBjb25zdCB7CiAgICBpdGVyYXRvciBfX3RtcCA9ICp0aGlzOwogICAgcmV0dXJuIF9fdG1wIC09 IF9faTsKICB9CiAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShpdGVyYXRvciBfX3gpIGNvbnN0 IHsKICAgIHJldHVybiBfX1dPUkRfQklUICogKF9NX3AgLSBfX3guX01fcCkgKyBfTV9vZmZzZXQg LSBfX3guX01fb2Zmc2V0OwogIH0KICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5 cGUgX19pKSB7IHJldHVybiAqKCp0aGlzICsgX19pKTsgfQogIGJvb2wgb3BlcmF0b3I9PShjb25z dCBpdGVyYXRvciYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX01fcCA9PSBfX3guX01fcCAmJiBf TV9vZmZzZXQgPT0gX194Ll9NX29mZnNldDsKICB9CiAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0 ZXJhdG9yJiBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBfTV9wICE9IF9feC5fTV9wIHx8IF9NX29m ZnNldCAhPSBfX3guX01fb2Zmc2V0OwogIH0KICBib29sIG9wZXJhdG9yPChpdGVyYXRvciBfX3gp IGNvbnN0IHsKICAgIHJldHVybiBfTV9wIDwgX194Ll9NX3AgfHwgKF9NX3AgPT0gX194Ll9NX3Ag JiYgX01fb2Zmc2V0IDwgX194Ll9NX29mZnNldCk7CiAgfQp9OwoKc3RydWN0IF9CaXRfY29uc3Rf aXRlcmF0b3IKICA6IHB1YmxpYyByYW5kb21fYWNjZXNzX2l0ZXJhdG9yPGJvb2wsIHB0cmRpZmZf dD4KewogIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwogIHR5cGVkZWYg Ym9vbCAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgY29uc3QgYm9v bCogICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3IgIGNvbnN0 X2l0ZXJhdG9yOwoKICB1bnNpZ25lZCBpbnQqIF9NX3A7CiAgdW5zaWduZWQgaW50IF9NX29mZnNl dDsKICB2b2lkIGJ1bXBfdXAoKSB7CiAgICBpZiAoX01fb2Zmc2V0KysgPT0gX19XT1JEX0JJVCAt IDEpIHsKICAgICAgX01fb2Zmc2V0ID0gMDsKICAgICAgKytfTV9wOwogICAgfQogIH0KICB2b2lk IGJ1bXBfZG93bigpIHsKICAgIGlmIChfTV9vZmZzZXQtLSA9PSAwKSB7CiAgICAgIF9NX29mZnNl dCA9IF9fV09SRF9CSVQgLSAxOwogICAgICAtLV9NX3A7CiAgICB9CiAgfQoKICBfQml0X2NvbnN0 X2l0ZXJhdG9yKCkgOiBfTV9wKDApLCBfTV9vZmZzZXQoMCkge30KICBfQml0X2NvbnN0X2l0ZXJh dG9yKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KSAKICAgIDogX01fcChfX3gp LCBfTV9vZmZzZXQoX195KSB7fQogIF9CaXRfY29uc3RfaXRlcmF0b3IoY29uc3QgX0JpdF9pdGVy YXRvciYgX194KSAKICAgIDogX01fcChfX3guX01fcCksIF9NX29mZnNldChfX3guX01fb2Zmc2V0 KSB7fQogIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CiAgICByZXR1cm4gX0Jp dF9yZWZlcmVuY2UoX01fcCwgMVUgPDwgX01fb2Zmc2V0KTsKICB9CiAgY29uc3RfaXRlcmF0b3Im IG9wZXJhdG9yKysoKSB7CiAgICBidW1wX3VwKCk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGNv bnN0X2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CiAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9 ICp0aGlzOwogICAgYnVtcF91cCgpOwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBjb25zdF9pdGVy YXRvciYgb3BlcmF0b3ItLSgpIHsKICAgIGJ1bXBfZG93bigpOwogICAgcmV0dXJuICp0aGlzOwog IH0KICBjb25zdF9pdGVyYXRvciBvcGVyYXRvci0tKGludCkgewogICAgY29uc3RfaXRlcmF0b3Ig X190bXAgPSAqdGhpczsKICAgIGJ1bXBfZG93bigpOwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBj b25zdF9pdGVyYXRvciYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19pKSB7CiAgICBkaWZm ZXJlbmNlX3R5cGUgX19uID0gX19pICsgX01fb2Zmc2V0OwogICAgX01fcCArPSBfX24gLyBfX1dP UkRfQklUOwogICAgX19uID0gX19uICUgX19XT1JEX0JJVDsKICAgIGlmIChfX24gPCAwKSB7CiAg ICAgIF9NX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIF9fbiArIF9fV09SRF9CSVQ7CiAgICAgIC0t X01fcDsKICAgIH0gZWxzZQogICAgICBfTV9vZmZzZXQgPSAodW5zaWduZWQgaW50KSBfX247CiAg ICByZXR1cm4gKnRoaXM7CiAgfQogIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVu Y2VfdHlwZSBfX2kpIHsKICAgICp0aGlzICs9IC1fX2k7CiAgICByZXR1cm4gKnRoaXM7CiAgfQog IGNvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdCB7CiAg ICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOwogICAgcmV0dXJuIF9fdG1wICs9IF9faTsK ICB9CiAgY29uc3RfaXRlcmF0b3Igb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0 IHsKICAgIGNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CiAgICByZXR1cm4gX190bXAgLT0g X19pOwogIH0KICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0X2l0ZXJhdG9yIF9feCkg Y29uc3QgewogICAgcmV0dXJuIF9fV09SRF9CSVQgKiAoX01fcCAtIF9feC5fTV9wKSArIF9NX29m ZnNldCAtIF9feC5fTV9vZmZzZXQ7CiAgfQogIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKGRp ZmZlcmVuY2VfdHlwZSBfX2kpIHsgCiAgICByZXR1cm4gKigqdGhpcyArIF9faSk7IAogIH0KICBi b29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIF9feCkgY29uc3QgewogICAgcmV0 dXJuIF9NX3AgPT0gX194Ll9NX3AgJiYgX01fb2Zmc2V0ID09IF9feC5fTV9vZmZzZXQ7CiAgfQog IGJvb2wgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciYgX194KSBjb25zdCB7CiAgICBy ZXR1cm4gX01fcCAhPSBfX3guX01fcCB8fCBfTV9vZmZzZXQgIT0gX194Ll9NX29mZnNldDsKICB9 CiAgYm9vbCBvcGVyYXRvcjwoY29uc3RfaXRlcmF0b3IgX194KSBjb25zdCB7CiAgICByZXR1cm4g X01fcCA8IF9feC5fTV9wIHx8IChfTV9wID09IF9feC5fTV9wICYmIF9NX29mZnNldCA8IF9feC5f TV9vZmZzZXQpOwogIH0KfTsKCiAKIAoKCgogCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yLCBi b29sIF9faXNfc3RhdGljPgpjbGFzcyBfQnZlY3Rvcl9hbGxvY19iYXNlIHsKcHVibGljOgogIHR5 cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxib29sLCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9y X3R5cGUKICAgICAgICAgIGFsbG9jYXRvcl90eXBlOwogIGFsbG9jYXRvcl90eXBlIGdldF9hbGxv Y2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9kYXRhX2FsbG9jYXRvcjsgfQoKICBfQnZlY3Rvcl9h bGxvY19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCiAgICA6IF9NX2RhdGFfYWxsb2Nh dG9yKF9fYSksIF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKSB7 fQoKcHJvdGVjdGVkOgogIHVuc2lnbmVkIGludCogX01fYml0X2FsbG9jKHNpemVfdCBfX24pIAog ICAgeyByZXR1cm4gX01fZGF0YV9hbGxvY2F0b3IuYWxsb2NhdGUoKF9fbiArIF9fV09SRF9CSVQg LSAxKS9fX1dPUkRfQklUKTsgfQogIHZvaWQgX01fZGVhbGxvY2F0ZSgpIHsKICAgIGlmIChfTV9z dGFydC5fTV9wKQogICAgICBfTV9kYXRhX2FsbG9jYXRvci5kZWFsbG9jYXRlKF9NX3N0YXJ0Ll9N X3AsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2VuZF9vZl9zdG9yYWdl IC0gX01fc3RhcnQuX01fcCk7CiAgfSAgCgogIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dW5zaWdu ZWQgaW50LCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9yX3R5cGUgCiAgICAgICAgICBfTV9kYXRhX2Fs bG9jYXRvcjsKICBfQml0X2l0ZXJhdG9yIF9NX3N0YXJ0OwogIF9CaXRfaXRlcmF0b3IgX01fZmlu aXNoOwogIHVuc2lnbmVkIGludCogX01fZW5kX29mX3N0b3JhZ2U7Cn07CgogCnRlbXBsYXRlIDxj bGFzcyBfQWxsb2NhdG9yPgpjbGFzcyBfQnZlY3Rvcl9hbGxvY19iYXNlPF9BbGxvY2F0b3IsIHRy dWU+IHsKcHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxib29sLCBfQWxs b2NhdG9yPjo6YWxsb2NhdG9yX3R5cGUKICAgICAgICAgIGFsbG9jYXRvcl90eXBlOwogIGFsbG9j YXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0b3JfdHlwZSgp OyB9CgogIF9CdmVjdG9yX2FsbG9jX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmKQogICAgOiBf TV9zdGFydCgpLCBfTV9maW5pc2goKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkge30KCnByb3RlY3Rl ZDoKICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dW5zaWduZWQgaW50LCBfQWxsb2Nh dG9yPjo6X0FsbG9jX3R5cGUKICAgICAgICAgIF9BbGxvY190eXBlOwogICAgICAgICAgCiAgdW5z aWduZWQgaW50KiBfTV9iaXRfYWxsb2Moc2l6ZV90IF9fbikgCiAgICB7IHJldHVybiBfQWxsb2Nf dHlwZTo6YWxsb2NhdGUoKF9fbiArIF9fV09SRF9CSVQgLSAxKS9fX1dPUkRfQklUKTsgfQogIHZv aWQgX01fZGVhbGxvY2F0ZSgpIHsKICAgIGlmIChfTV9zdGFydC5fTV9wKQogICAgICBfQWxsb2Nf dHlwZTo6ZGVhbGxvY2F0ZShfTV9zdGFydC5fTV9wLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0Ll9NX3ApOwogIH0gIAoKICBfQml0X2l0 ZXJhdG9yIF9NX3N0YXJ0OwogIF9CaXRfaXRlcmF0b3IgX01fZmluaXNoOwogIHVuc2lnbmVkIGlu dCogX01fZW5kX29mX3N0b3JhZ2U7Cn07ICAKCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CmNsYXNz IF9CdmVjdG9yX2Jhc2UKICA6IHB1YmxpYyBfQnZlY3Rvcl9hbGxvY19iYXNlPF9BbGxvYywKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8Ym9vbCwgX0FsbG9jPjo6 X1NfaW5zdGFuY2VsZXNzPgp7CiAgdHlwZWRlZiBfQnZlY3Rvcl9hbGxvY19iYXNlPF9BbGxvYywK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jX3RyYWl0czxib29sLCBfQWxsb2M+ OjpfU19pbnN0YW5jZWxlc3M+CiAgICAgICAgICBfQmFzZTsKcHVibGljOgogIHR5cGVkZWYgdHlw ZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwoKICBfQnZlY3Rvcl9i YXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDogX0Jhc2UoX19hKSB7fQogIH5fQnZlY3Rv cl9iYXNlKCkgeyBfQmFzZTo6X01fZGVhbGxvY2F0ZSgpOyB9Cn07CgojIDM0OCAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2cr Ky0zL3N0bF9idmVjdG9yLmgiIDMKCgogCiAKIAogCgoKCgoKCgoKCgogICAgICAgIAoKICAgICAg ICAKdGVtcGxhdGU8Y2xhc3MgX0FsbG9jPiBjbGFzcyB2ZWN0b3I8Ym9vbCxfQWxsb2M+CiAgOiBw dWJsaWMgX0J2ZWN0b3JfYmFzZTxfQWxsb2M+CgoKCgp7CgogIHR5cGVkZWYgX0J2ZWN0b3JfYmFz ZTxfQWxsb2M+IF9CYXNlOwoKCgpwdWJsaWM6CiAgdHlwZWRlZiBib29sIHZhbHVlX3R5cGU7CiAg dHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwogIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2Vf dHlwZTsgCiAgdHlwZWRlZiBfQml0X3JlZmVyZW5jZSByZWZlcmVuY2U7CiAgdHlwZWRlZiBib29s IGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVmIF9CaXRfcmVmZXJlbmNlKiBwb2ludGVyOwogIHR5 cGVkZWYgY29uc3QgYm9vbCogY29uc3RfcG9pbnRlcjsKCiAgdHlwZWRlZiBfQml0X2l0ZXJhdG9y ICAgICAgICAgICAgICAgIGl0ZXJhdG9yOwogIHR5cGVkZWYgX0JpdF9jb25zdF9pdGVyYXRvciAg ICAgICAgICBjb25zdF9pdGVyYXRvcjsKCgogIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxjb25z dF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKICB0eXBlZGVmIHJldmVyc2VfaXRl cmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7CgoKCgoKCgogIHR5cGVkZWYgdHlwZW5h bWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwogIGFsbG9jYXRvcl90eXBl IGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfQmFzZTo6Z2V0X2FsbG9jYXRvcigpOyB9 Cgpwcm90ZWN0ZWQ6CgoKCgoKCgoKcHJvdGVjdGVkOgogIHZvaWQgX01faW5pdGlhbGl6ZShzaXpl X3R5cGUgX19uKSB7CiAgICB1bnNpZ25lZCBpbnQqIF9fcSA9IF9NX2JpdF9hbGxvYyhfX24pOwog ICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfX3EgKyAoX19uICsgX19XT1JEX0JJVCAtIDEpL19fV09S RF9CSVQ7CiAgICBfTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CiAgICBfTV9maW5pc2ggPSBf TV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24pOwogIH0KICB2b2lkIF9NX2luc2VydF9hdXgo aXRlcmF0b3IgX19wb3NpdGlvbiwgYm9vbCBfX3gpIHsKICAgIGlmIChfTV9maW5pc2guX01fcCAh PSBfTV9lbmRfb2Zfc3RvcmFnZSkgewogICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIF9N X2ZpbmlzaCwgX01fZmluaXNoICsgMSk7CiAgICAgICpfX3Bvc2l0aW9uID0gX194OwogICAgICAr K19NX2ZpbmlzaDsKICAgIH0KICAgIGVsc2UgewogICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXpl KCkgPyAyICogc2l6ZSgpIDogX19XT1JEX0JJVDsKICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSBf TV9iaXRfYWxsb2MoX19sZW4pOwogICAgICBpdGVyYXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9f cG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOwogICAgICAqX19pKysgPSBfX3g7CiAgICAgIF9N X2ZpbmlzaCA9IGNvcHkoX19wb3NpdGlvbiwgZW5kKCksIF9faSk7CiAgICAgIF9NX2RlYWxsb2Nh dGUoKTsKICAgICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfX3EgKyAoX19sZW4gKyBfX1dPUkRfQklU IC0gMSkvX19XT1JEX0JJVDsKICAgICAgX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwogICAg fQogIH0KCgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2luaXRp YWxpemVfcmFuZ2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpIHsKICAgIF9N X3N0YXJ0ID0gaXRlcmF0b3IoKTsKICAgIF9NX2ZpbmlzaCA9IGl0ZXJhdG9yKCk7CiAgICBfTV9l bmRfb2Zfc3RvcmFnZSA9IDA7CiAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmly c3QpIAogICAgICBwdXNoX2JhY2soKl9fZmlyc3QpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9G b3J3YXJkSXRlcmF0b3I+CiAgdm9pZCBfTV9pbml0aWFsaXplX3JhbmdlKF9Gb3J3YXJkSXRlcmF0 b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKSB7CiAgICBzaXplX3R5cGUgX19uID0gMDsKICAg IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwgX19uKTsKICAgIF9NX2luaXRpYWxpemUoX19uKTsK ICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfTV9zdGFydCk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xh c3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBfTV9pbnNlcnRfcmFuZ2UoaXRlcmF0b3IgX19wb3Ms CiAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRl cmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykg ewogICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CiAgICAgIF9fcG9z ID0gaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7CiAgICAgICsrX19wb3M7CiAgICB9CiAgfQoKICB0 ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KICB2b2lkIF9NX2luc2VydF9yYW5nZShp dGVyYXRvciBfX3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0 b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAg ICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpIHsKICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgewog ICAgICBzaXplX3R5cGUgX19uID0gMDsKICAgICAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBf X24pOwogICAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24pIHsKICAgICAgICBjb3B5 X2JhY2t3YXJkKF9fcG9zaXRpb24sIGVuZCgpLCBfTV9maW5pc2ggKyBkaWZmZXJlbmNlX3R5cGUo X19uKSk7CiAgICAgICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zaXRpb24pOwogICAgICAg IF9NX2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKICAgICAgfQogICAgICBlbHNlIHsK ICAgICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyBtYXgoc2l6ZSgpLCBfX24pOwogICAg ICAgIHVuc2lnbmVkIGludCogX19xID0gX01fYml0X2FsbG9jKF9fbGVuKTsKICAgICAgICBpdGVy YXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9fcG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOwog ICAgICAgIF9faSA9IGNvcHkoX19maXJzdCwgX19sYXN0LCBfX2kpOwogICAgICAgIF9NX2Zpbmlz aCA9IGNvcHkoX19wb3NpdGlvbiwgZW5kKCksIF9faSk7CiAgICAgICAgX01fZGVhbGxvY2F0ZSgp OwogICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX19xICsgKF9fbGVuICsgX19XT1JEX0JJVCAt IDEpL19fV09SRF9CSVQ7CiAgICAgICAgX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwogICAg ICB9CiAgICB9CiAgfSAgICAgIAoKCgpwdWJsaWM6CiAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVy biBfTV9zdGFydDsgfQogIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01f c3RhcnQ7IH0KICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9maW5pc2g7IH0KICBjb25zdF9p dGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9maW5pc2g7IH0KCiAgcmV2ZXJzZV9pdGVy YXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQogIGNvbnN0 X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyAKICAgIHJldHVybiBjb25zdF9yZXZl cnNlX2l0ZXJhdG9yKGVuZCgpKTsgCiAgfQogIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0 dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9y IHJlbmQoKSBjb25zdCB7IAogICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4o KSk7IAogIH0KCiAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoZW5k KCkgLSBiZWdpbigpKTsgfQogIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNp emVfdHlwZSgtMSk7IH0KICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCB7CiAgICByZXR1cm4g c2l6ZV90eXBlKGNvbnN0X2l0ZXJhdG9yKF9NX2VuZF9vZl9zdG9yYWdlLCAwKSAtIGJlZ2luKCkp OwogIH0KICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQog IHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIHsKICAgIHJldHVybiAqKGJlZ2lu KCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CiAgfQogIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRv cltdKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKICAgIHJldHVybiAqKGJlZ2luKCkgKyBkaWZmZXJl bmNlX3R5cGUoX19uKSk7CiAgfQoKICBleHBsaWNpdCB2ZWN0b3IgKGNvbnN0IGFsbG9jYXRvcl90 eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQogICAgOiBfQmFzZShfX2EpIHt9CgogIHZlY3Rv ciAoc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3ZhbHVlLAogICAgICAgICAgICBjb25zdCBhbGxvY2F0 b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDogX0Jhc2UoX19hKQogIHsKICAg IF9NX2luaXRpYWxpemUoX19uKTsKICAgIGZpbGwoX01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0 b3JhZ2UsIF9fdmFsdWUgPyB+MCA6IDApOwogIH0KCiAgZXhwbGljaXQgdmVjdG9yIChzaXplX3R5 cGUgX19uKQogICAgOiBfQmFzZShhbGxvY2F0b3JfdHlwZSgpKQogIHsKICAgIF9NX2luaXRpYWxp emUoX19uKTsKICAgIGZpbGwoX01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0b3JhZ2UsIDApOwog IH0KCiAgdmVjdG9yIChjb25zdCB2ZWN0b3IgJiBfX3gpIDogX0Jhc2UoX194LmdldF9hbGxvY2F0 b3IoKSkgewogICAgX01faW5pdGlhbGl6ZShfX3guc2l6ZSgpKTsKICAgIGNvcHkoX194LmJlZ2lu KCksIF9feC5lbmQoKSwgX01fc3RhcnQpOwogIH0KCgogICAKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lu cHV0SXRlcmF0b3I+CiAgdmVjdG9yIChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVy YXRvciBfX2xhc3QsCiAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxv Y2F0b3JfdHlwZSgpKQogICAgOiBfQmFzZShfX2EpCiAgewogICAgdHlwZWRlZiB0eXBlbmFtZSBf SXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9JbnRlZ3JhbCBfSW50ZWdyYWw7CiAgICBfTV9p bml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwogIH0KICAg IAogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0 Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIF9fdHJ1ZV90eXBlKSB7CiAgICBfTV9pbml0 aWFsaXplKF9fbik7CiAgICBmaWxsKF9NX3N0YXJ0Ll9NX3AsIF9NX2VuZF9vZl9zdG9yYWdlLCBf X3ggPyB+MCA6IDApOwogIH0KICAgIAogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4K ICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lu cHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZhbHNl X3R5cGUpIHsKICAgIF9NX2luaXRpYWxpemVfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX2l0ZXJh dG9yX2NhdGVnb3J5KCBfX2ZpcnN0ICkgKTsKICB9CiMgNTg3ICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2J2 ZWN0b3IuaCIgMwoKCiAgfnZlY3RvciAoKSB7IH0KCiAgdmVjdG9yICYgb3BlcmF0b3I9KGNvbnN0 IHZlY3RvciAmIF9feCkgewogICAgaWYgKCZfX3ggPT0gdGhpcykgcmV0dXJuICp0aGlzOwogICAg aWYgKF9feC5zaXplKCkgPiBjYXBhY2l0eSgpKSB7CiAgICAgIF9NX2RlYWxsb2NhdGUoKTsKICAg ICAgX01faW5pdGlhbGl6ZShfX3guc2l6ZSgpKTsKICAgIH0KICAgIGNvcHkoX194LmJlZ2luKCks IF9feC5lbmQoKSwgYmVnaW4oKSk7CiAgICBfTV9maW5pc2ggPSBiZWdpbigpICsgZGlmZmVyZW5j ZV90eXBlKF9feC5zaXplKCkpOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgIAogICAKICAgCiAg IAoKICB2b2lkIGFzc2lnbihzaXplX3QgX19uLCBib29sIF9feCkgewogICAgaWYgKF9fbiA+IHNp emUoKSkgewogICAgICBmaWxsKF9NX3N0YXJ0Ll9NX3AsIF9NX2VuZF9vZl9zdG9yYWdlLCBfX3gg PyB+MCA6IDApOwogICAgICBpbnNlcnQoZW5kKCksIF9fbiAtIHNpemUoKSwgX194KTsKICAgIH0K ICAgIGVsc2UgewogICAgICBlcmFzZShiZWdpbigpICsgX19uLCBlbmQoKSk7CiAgICAgIGZpbGwo X01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0b3JhZ2UsIF9feCA/IH4wIDogMCk7CiAgICB9CiAg fQoKCgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIGFzc2lnbihfSW5w dXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKICAgIHR5cGVkZWYg dHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfSW50ZWdyYWwgX0ludGVncmFs OwogICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwog IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNo KF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQogICAgeyBhc3NpZ24o KHNpemVfdCkgX19uLCAoYm9vbCkgX192YWwpOyB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJ dGVyPgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0 SXRlciBfX2xhc3QsIF9fZmFsc2VfdHlwZSkKICAgIHsgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBf X2xhc3QsIF9faXRlcmF0b3JfY2F0ZWdvcnkoIF9fZmlyc3QgKSApOyB9CgogIHRlbXBsYXRlIDxj bGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2Fzc2lnbl9hdXgoX0lucHV0SXRlcmF0b3Ig X19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICBpbnB1 dF9pdGVyYXRvcl90YWcpIHsKICAgIGl0ZXJhdG9yIF9fY3VyID0gYmVnaW4oKTsKICAgIGZvciAo IDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIsICsrX19maXJz dCkKICAgICAgKl9fY3VyID0gKl9fZmlyc3Q7CiAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCiAg ICAgIGVyYXNlKF9fY3VyLCBlbmQoKSk7CiAgICBlbHNlCiAgICAgIGluc2VydChlbmQoKSwgX19m aXJzdCwgX19sYXN0KTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgog IHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRl cmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykg ewogICAgc2l6ZV90eXBlIF9fbGVuID0gMDsKICAgIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwg X19sZW4pOwogICAgaWYgKF9fbGVuIDwgc2l6ZSgpKQogICAgICBlcmFzZShjb3B5KF9fZmlyc3Qs IF9fbGFzdCwgYmVnaW4oKSksIGVuZCgpKTsKICAgIGVsc2UgewogICAgICBfRm9yd2FyZEl0ZXJh dG9yIF9fbWlkID0gX19maXJzdDsKICAgICAgYWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKICAgICAg Y29weShfX2ZpcnN0LCBfX21pZCwgYmVnaW4oKSk7CiAgICAgIGluc2VydChlbmQoKSwgX19taWQs IF9fbGFzdCk7CiAgICB9CiAgfSAgICAKCgoKICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9fbikg ewogICAgaWYgKGNhcGFjaXR5KCkgPCBfX24pIHsKICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSBf TV9iaXRfYWxsb2MoX19uKTsKICAgICAgX01fZmluaXNoID0gY29weShiZWdpbigpLCBlbmQoKSwg aXRlcmF0b3IoX19xLCAwKSk7CiAgICAgIF9NX2RlYWxsb2NhdGUoKTsKICAgICAgX01fc3RhcnQg PSBpdGVyYXRvcihfX3EsIDApOwogICAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9fcSArIChfX24g KyBfX1dPUkRfQklUIC0gMSkvX19XT1JEX0JJVDsKICAgIH0KICB9CgogIHJlZmVyZW5jZSBmcm9u dCgpIHsgcmV0dXJuICpiZWdpbigpOyB9CiAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Qg eyByZXR1cm4gKmJlZ2luKCk7IH0KICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooZW5kKCkg LSAxKTsgfQogIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeyByZXR1cm4gKihlbmQoKSAt IDEpOyB9CiAgdm9pZCBwdXNoX2JhY2soYm9vbCBfX3gpIHsKICAgIGlmIChfTV9maW5pc2guX01f cCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSkKICAgICAgKl9NX2ZpbmlzaCsrID0gX194OwogICAgZWxz ZQogICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpLCBfX3gpOwogIH0KICB2b2lkIHN3YXAodmVjdG9y ICYgX194KSB7CiAgICAgOjpzd2FwKF9NX3N0YXJ0LCBfX3guX01fc3RhcnQpOwogICAgIDo6c3dh cChfTV9maW5pc2gsIF9feC5fTV9maW5pc2gpOwogICAgIDo6c3dhcChfTV9lbmRfb2Zfc3RvcmFn ZSwgX194Ll9NX2VuZF9vZl9zdG9yYWdlKTsKICB9CiAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9y IF9fcG9zaXRpb24sIGJvb2wgX194ID0gYm9vbCgpKSB7CiAgICBkaWZmZXJlbmNlX3R5cGUgX19u ID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CiAgICBpZiAoX01fZmluaXNoLl9NX3AgIT0gX01fZW5k X29mX3N0b3JhZ2UgJiYgX19wb3NpdGlvbiA9PSBlbmQoKSkKICAgICAgKl9NX2ZpbmlzaCsrID0g X194OwogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIF9feCk7CiAgICBy ZXR1cm4gYmVnaW4oKSArIF9fbjsKICB9CgoKICAgCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0 ZXJhdG9yPgogIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCiAgICAgICAgICAgICAg X0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CiAgICB0eXBl ZGVmIHR5cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X0ludGVncmFsIF9JbnRl Z3JhbDsKICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3Qs IF9JbnRlZ3JhbCgpKTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KICB2b2lkIF9N X2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBf X3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX190cnVlX3R5cGUpIHsKICAgIGluc2VydChf X3BvcywgKHNpemVfdHlwZSkgX19uLCAoYm9vbCkgX194KTsKICB9CgogIHRlbXBsYXRlIDxjbGFz cyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3Bv cywKICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5w dXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX19mYWxzZV90eXBl KSB7CiAgICBfTV9pbnNlcnRfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX19pdGVyYXRv cl9jYXRlZ29yeSggX19maXJzdCApICk7CiAgfQojIDc2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2 LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9idmVj dG9yLmgiIDMKCiAgCiAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBl IF9fbiwgYm9vbCBfX3gpIHsKICAgIGlmIChfX24gPT0gMCkgcmV0dXJuOwogICAgaWYgKGNhcGFj aXR5KCkgLSBzaXplKCkgPj0gX19uKSB7CiAgICAgIGNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwg ZW5kKCksIF9NX2ZpbmlzaCArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKICAgICAgZmlsbChfX3Bv c2l0aW9uLCBfX3Bvc2l0aW9uICsgZGlmZmVyZW5jZV90eXBlKF9fbiksIF9feCk7CiAgICAgIF9N X2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKICAgIH0KICAgIGVsc2UgewogICAgICBz aXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyBtYXgoc2l6ZSgpLCBfX24pOwogICAgICB1bnNpZ25l ZCBpbnQqIF9fcSA9IF9NX2JpdF9hbGxvYyhfX2xlbik7CiAgICAgIGl0ZXJhdG9yIF9faSA9IGNv cHkoYmVnaW4oKSwgX19wb3NpdGlvbiwgaXRlcmF0b3IoX19xLCAwKSk7CiAgICAgIGZpbGxfbihf X2ksIF9fbiwgX194KTsKICAgICAgX01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwg X19pICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOwogICAgICBfTV9kZWFsbG9jYXRlKCk7CiAgICAg IF9NX2VuZF9vZl9zdG9yYWdlID0gX19xICsgKF9fbGVuICsgX19XT1JEX0JJVCAtIDEpL19fV09S RF9CSVQ7CiAgICAgIF9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKICAgIH0KICB9CgogIHZv aWQgcG9wX2JhY2soKSB7IC0tX01fZmluaXNoOyB9CiAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3Ig X19wb3NpdGlvbikgewogICAgaWYgKF9fcG9zaXRpb24gKyAxICE9IGVuZCgpKQogICAgICBjb3B5 KF9fcG9zaXRpb24gKyAxLCBlbmQoKSwgX19wb3NpdGlvbik7CiAgICAgIC0tX01fZmluaXNoOwog ICAgcmV0dXJuIF9fcG9zaXRpb247CiAgfQogIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmly c3QsIGl0ZXJhdG9yIF9fbGFzdCkgewogICAgX01fZmluaXNoID0gY29weShfX2xhc3QsIGVuZCgp LCBfX2ZpcnN0KTsKICAgIHJldHVybiBfX2ZpcnN0OwogIH0KICB2b2lkIHJlc2l6ZShzaXplX3R5 cGUgX19uZXdfc2l6ZSwgYm9vbCBfX3ggPSBib29sKCkpIHsKICAgIGlmIChfX25ld19zaXplIDwg c2l6ZSgpKSAKICAgICAgZXJhc2UoYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX25ld19zaXpl KSwgZW5kKCkpOwogICAgZWxzZQogICAgICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBzaXpl KCksIF9feCk7CiAgfQogIHZvaWQgY2xlYXIoKSB7IGVyYXNlKGJlZ2luKCksIGVuZCgpKTsgfQp9 OwoKCgp0eXBlZGVmIHZlY3Rvcjxib29sLCBhbGxvYz4gYml0X3ZlY3RvcjsKCiMgODIyICIvdXNy L2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1 ZGUvZysrLTMvc3RsX2J2ZWN0b3IuaCIgMwoKCgoKCgoKCgoKICAKCgoKIAogCiAKIyAzNSAiL3Vz ci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNs dWRlL2crKy0zL3ZlY3RvciIgMiAzCgoKCgogCiAKIAojIDQ2ICIvdXNyL2xvY2FsL3F0L2luY2x1 ZGUvcXZhbHVldmVjdG9yLmgiIDIKCgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIFFWYWx1ZVZl Y3RvclByaXZhdGUgCiAgICA6IHB1YmxpYyBRU2hhcmVkCnsKcHVibGljOgoKICAgIHR5cGVkZWYg VCB2YWx1ZV90eXBlOwogICAgdHlwZWRlZiBUKiBwb2ludGVyOwoKICAgIFFWYWx1ZVZlY3RvclBy aXZhdGUoKQoJOiBzdGFydCggMCApLCBmaW5pc2goIDAgKSwgZW5kKCAwICkKICAgIHsKICAgIH0K CiAgICBRVmFsdWVWZWN0b3JQcml2YXRlKCBjb25zdCBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+JiB4 ICk7CiAgICBRVmFsdWVWZWN0b3JQcml2YXRlKCBzaXplX3Qgc2l6ZSApOwoKICAgIHZvaWQgZGVy ZWZBbmREZWxldGUoKSAgCiAgICB7CglpZiAoIGRlcmVmKCkgKQoJICAgIGRlbGV0ZSB0aGlzOwog ICAgfQoKCgoKCiAgICB+UVZhbHVlVmVjdG9yUHJpdmF0ZSgpCiAgICB7CglkZWxldGVbXSBzdGFy dDsKICAgIH0KCiAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0CiAgICB7CglyZXR1cm4gZmluaXNoIC0g c3RhcnQ7CiAgICB9CgogICAgYm9vbCBlbXB0eSgpIGNvbnN0CiAgICB7CglyZXR1cm4gc3RhcnQg PT0gZmluaXNoOwogICAgfQoKICAgIHNpemVfdCBjYXBhY2l0eSgpIGNvbnN0CiAgICB7CglyZXR1 cm4gZW5kIC0gc3RhcnQ7CiAgICB9CgogICAgdm9pZCBpbnNlcnQoIHBvaW50ZXIgcG9zLCBjb25z dCBUJiB4ICk7CiAgICB2b2lkIGluc2VydCggcG9pbnRlciBwb3MsIHNpemVfdCBuLCBjb25zdCBU JiB4ICk7CiAgICB2b2lkIHJlc2VydmUoIHNpemVfdCBuICk7CgogICAgdm9pZCBjbGVhcigpCiAg ICB7CglkZWxldGVbXSBzdGFydDsKCXN0YXJ0ID0gMDsKCWZpbmlzaCA9IDA7CgllbmQgPSAwOwog ICAgfQoKCiAgICBwb2ludGVyIHN0YXJ0OwogICAgcG9pbnRlciBmaW5pc2g7CiAgICBwb2ludGVy IGVuZDsKCnByaXZhdGU6CiAgICBwb2ludGVyIGdyb3dBbmRDb3B5KCBzaXplX3QgbiwgcG9pbnRl ciBzLCBwb2ludGVyIGYgKTsKCiAgICBRVmFsdWVWZWN0b3JQcml2YXRlJiBvcGVyYXRvcj0oIGNv bnN0IFFWYWx1ZVZlY3RvclByaXZhdGU8VD4mIHggKTsKCn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4K ICBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+OjpRVmFsdWVWZWN0b3JQcml2YXRlKCBjb25zdCBRVmFs dWVWZWN0b3JQcml2YXRlPFQ+JiB4ICkKICAgIDogUVNoYXJlZCgpCnsKICAgIGlmICggeC5zaXpl KCkgPiAwICkgewoJc3RhcnQgPSBuZXcgVFsgeC5zaXplKCkgXTsKCWZpbmlzaCA9IHN0YXJ0ICsg eC5zaXplKCk7CgllbmQgPSBzdGFydCArIHguc2l6ZSgpOwoJcUNvcHkoIHguc3RhcnQsIHguZmlu aXNoLCBzdGFydCApOwogICAgfSBlbHNlIHsKCXN0YXJ0ID0gMDsKCWZpbmlzaCA9IDA7CgllbmQg PSAwOwogICAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+ OjpRVmFsdWVWZWN0b3JQcml2YXRlKCBzaXplX3Qgc2l6ZSApCnsKICAgIGlmICggc2l6ZSA+IDAg KSB7CglzdGFydCA9IG5ldyBUW3NpemVdOwoJZmluaXNoID0gc3RhcnQgKyBzaXplOwoJZW5kID0g c3RhcnQgKyBzaXplOwogICAgfSBlbHNlIHsKCXN0YXJ0ID0gMDsKCWZpbmlzaCA9IDA7CgllbmQg PSAwOwogICAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICB2b2lkIFFWYWx1ZVZlY3RvclByaXZh dGU8VD46Omluc2VydCggcG9pbnRlciBwb3MsIGNvbnN0IFQmIHggKQp7CiAgICBjb25zdCBzaXpl X3QgbGFzdFNpemUgPSBzaXplKCk7CiAgICBjb25zdCBzaXplX3QgbiA9IGxhc3RTaXplICE9MCA/ IDIqbGFzdFNpemUgOiAxOwogICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IHBvcyAtIHN0YXJ0Owog ICAgcG9pbnRlciBuZXdTdGFydCA9IG5ldyBUW25dOwogICAgcG9pbnRlciBuZXdGaW5pc2ggPSBu ZXdTdGFydCArIG9mZnNldDsKICAgIHFDb3B5KCBzdGFydCwgcG9zLCBuZXdTdGFydCApOwogICAg Km5ld0ZpbmlzaCA9IHg7CiAgICBxQ29weSggcG9zLCBmaW5pc2gsICsrbmV3RmluaXNoICk7CiAg ICBkZWxldGVbXSBzdGFydDsKICAgIHN0YXJ0ID0gbmV3U3RhcnQ7CiAgICBmaW5pc2ggPSBuZXdT dGFydCArIGxhc3RTaXplICsgMTsKICAgIGVuZCA9IG5ld1N0YXJ0ICsgbjsKfQoKdGVtcGxhdGUg PGNsYXNzIFQ+CiAgdm9pZCBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+OjppbnNlcnQoIHBvaW50ZXIg cG9zLCBzaXplX3QgbiwgY29uc3QgVCYgeCApCnsKICAgIGlmICggc2l6ZV90KCBlbmQgLSBmaW5p c2ggKSA+PSBuICkgewoJIAoJY29uc3Qgc2l6ZV90IGVsZW1zX2FmdGVyID0gZmluaXNoIC0gcG9z OwoJcG9pbnRlciBvbGRfZmluaXNoID0gZmluaXNoOwoJaWYgKCBlbGVtc19hZnRlciA+IG4gKSB7 CgkgICAgcUNvcHkoIGZpbmlzaCAtIG4sIGZpbmlzaCwgZmluaXNoICk7CgkgICAgZmluaXNoICs9 IG47CgkgICAgcUNvcHlCYWNrd2FyZCggcG9zLCBvbGRfZmluaXNoIC0gbiwgb2xkX2ZpbmlzaCAp OwoJICAgIHFGaWxsKCBwb3MsIHBvcyArIG4sIHggKTsKCX0gZWxzZSB7CgkgICAgcG9pbnRlciBm aWxsZXIgPSBmaW5pc2g7CgkgICAgc2l6ZV90IGkgPSBuIC0gZWxlbXNfYWZ0ZXI7CgkgICAgZm9y ICggOyBpID4gMDsgLS1pLCArK2ZpbGxlciApCgkJKmZpbGxlciA9IHg7CgkgICAgZmluaXNoICs9 IG4gLSBlbGVtc19hZnRlcjsKCSAgICBxQ29weSggcG9zLCBvbGRfZmluaXNoLCBmaW5pc2ggKTsK CSAgICBmaW5pc2ggKz0gZWxlbXNfYWZ0ZXI7CgkgICAgcUZpbGwoIHBvcywgb2xkX2ZpbmlzaCwg eCApOwoJfQogICAgfSBlbHNlIHsKCSAKCWNvbnN0IHNpemVfdCBsYXN0U2l6ZSA9IHNpemUoKTsK CWNvbnN0IHNpemVfdCBsZW4gPSBsYXN0U2l6ZSArICgoICBuICApIDwgKCAgbGFzdFNpemUgKSA/ ICggIGxhc3RTaXplICkgOiAoICBuICApKSA7Cglwb2ludGVyIG5ld1N0YXJ0ID0gbmV3IFRbbGVu XTsKCXBvaW50ZXIgbmV3RmluaXNoID0gcUNvcHkoIHN0YXJ0LCBwb3MsIG5ld1N0YXJ0ICk7Cgkg CglzaXplX3QgaSA9IG47Cglmb3IgKCA7IGkgPiAwOyAtLWksICsrbmV3RmluaXNoICkKCSAgICAq bmV3RmluaXNoID0geDsKCW5ld0ZpbmlzaCA9IHFDb3B5KCBwb3MsIGZpbmlzaCwgbmV3RmluaXNo ICk7CglkZWxldGVbXSBzdGFydDsKCXN0YXJ0ID0gbmV3U3RhcnQ7CglmaW5pc2ggPSBuZXdGaW5p c2g7CgllbmQgPSBuZXdTdGFydCArIGxlbjsKICAgIH0KfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAg dm9pZCBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+OjpyZXNlcnZlKCBzaXplX3QgbiApCnsKICAgIGNv bnN0IHNpemVfdCBsYXN0U2l6ZSA9IHNpemUoKTsKICAgIHBvaW50ZXIgdG1wID0gZ3Jvd0FuZENv cHkoIG4sIHN0YXJ0LCBmaW5pc2ggKTsKICAgIHN0YXJ0ID0gdG1wOwogICAgZmluaXNoID0gdG1w ICsgbGFzdFNpemU7CiAgICBlbmQgPSBzdGFydCArIG47Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgog IHR5cGVuYW1lICBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+Ojpwb2ludGVyIFFWYWx1ZVZlY3RvclBy aXZhdGU8VD46Omdyb3dBbmRDb3B5KCBzaXplX3QgbiwgcG9pbnRlciBzLCBwb2ludGVyIGYgKQp7 CiAgICBwb2ludGVyIG5ld1N0YXJ0ID0gbmV3IFRbbl07CiAgICBxQ29weSggcywgZiwgbmV3U3Rh cnQgKTsKICAgIGRlbGV0ZVtdIHN0YXJ0OwogICAgcmV0dXJuIG5ld1N0YXJ0Owp9CgoKdGVtcGxh dGUgPGNsYXNzIFQ+CmNsYXNzIFFWYWx1ZVZlY3Rvcgp7CnB1YmxpYzoKICAgIHR5cGVkZWYgVCB2 YWx1ZV90eXBlOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogICAgdHlwZWRlZiBj b25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlKiBp dGVyYXRvcjsKICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfaXRlcmF0b3I7CiAg ICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKICAgIHR5cGVkZWYgY29uc3QgdmFsdWVf dHlwZSYgY29uc3RfcmVmZXJlbmNlOwogICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwoKICAg IHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CgoKCgogICAgUVZhbHVlVmVjdG9y KCkKICAgIHsKCXNoID0gbmV3IFFWYWx1ZVZlY3RvclByaXZhdGU8VD47CiAgICB9CgogICAgUVZh bHVlVmVjdG9yKCBjb25zdCBRVmFsdWVWZWN0b3I8VD4mIHYgKQogICAgewoJc2ggPSB2LnNoOwoJ c2gtPnJlZigpOwogICAgfQoKICAgIFFWYWx1ZVZlY3Rvciggc2l6ZV90eXBlIG4sIGNvbnN0IFQm IHZhbCA9IFQoKSApOwoKCiAgICBRVmFsdWVWZWN0b3IoIHN0ZDo6dmVjdG9yPFQ+JiB2ICkKICAg IHsKCXNoID0gbmV3IFFWYWx1ZVZlY3RvclByaXZhdGU8VD4oIHYuc2l6ZSgpICk7CglxQ29weSgg di5iZWdpbigpLCB2LmVuZCgpLCBiZWdpbigpICk7CiAgICB9CgoKICAgIH5RVmFsdWVWZWN0b3Io KQogICAgewoJc2gtPmRlcmVmQW5kRGVsZXRlKCk7CiAgICB9CgogICAgUVZhbHVlVmVjdG9yPFQ+ JiBvcGVyYXRvcj0gKCBjb25zdCBRVmFsdWVWZWN0b3I8VD4mIHYgKQogICAgewoJdi5zaC0+cmVm KCk7CglzaC0+ZGVyZWZBbmREZWxldGUoKTsKCXNoID0gdi5zaDsKCXJldHVybiAqdGhpczsKICAg IH0KCgogICAgUVZhbHVlVmVjdG9yPFQ+JiBvcGVyYXRvcj0gKCBjb25zdCBzdGQ6OnZlY3RvcjxU PiYgdiApCiAgICB7CgljbGVhcigpOwoJcmVzaXplKCB2LnNpemUoKSApOwoJcUNvcHkoIHYuYmVn aW4oKSwgdi5lbmQoKSwgYmVnaW4oKSApOwoJcmV0dXJuICp0aGlzOwogICAgfQoKCiAgICBzaXpl X3R5cGUgc2l6ZSgpIGNvbnN0CiAgICB7CglyZXR1cm4gc2gtPnNpemUoKTsKICAgIH0KCiAgICBi b29sIGVtcHR5KCkgY29uc3QKICAgIHsKCXJldHVybiBzaC0+ZW1wdHkoKTsKICAgIH0KCiAgICBz aXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdAogICAgewoJcmV0dXJuIHNpemVfdHlwZSggc2gtPmNh cGFjaXR5KCkgKTsKICAgIH0KCiAgICBpdGVyYXRvciBiZWdpbigpCiAgICB7CglkZXRhY2goKTsK CXJldHVybiBzaC0+c3RhcnQ7CiAgICB9CgogICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25z dAogICAgewoJcmV0dXJuIHNoLT5zdGFydDsKICAgIH0KCiAgICBpdGVyYXRvciBlbmQoKQogICAg ewoJZGV0YWNoKCk7CglyZXR1cm4gc2gtPmZpbmlzaDsKICAgIH0KCiAgICBjb25zdF9pdGVyYXRv ciBlbmQoKSBjb25zdAogICAgewoJcmV0dXJuIHNoLT5maW5pc2g7CiAgICB9CgogICAgcmVmZXJl bmNlIGF0KCBzaXplX3R5cGUgaSwgYm9vbCogb2sgPSAwICkKICAgIHsKCWRldGFjaCgpOwoJaWYg KCBvayApIHsKCSAgICBpZiAoIGkgPCBzaXplKCkgKQoJCSpvayA9IFRSVUU7CgkgICAgZWxzZQoJ CSpvayA9IEZBTFNFOwoJfQoJcmV0dXJuICooIGJlZ2luKCkgKyBpICk7CiAgICB9CgogICAgY29u c3RfcmVmZXJlbmNlIGF0KCBzaXplX3R5cGUgaSwgYm9vbCogb2sgPSAwICkgY29uc3QKICAgIHsK CWlmICggb2sgKSB7CgkgICAgaWYgKCBpIDwgc2l6ZSgpICkKCQkqb2sgPSBUUlVFOwoJICAgIGVs c2UKCQkqb2sgPSBGQUxTRTsKCX0KCXJldHVybiAqKCBiZWdpbigpICsgaSApOwogICAgfQoKICAg IHJlZmVyZW5jZSBvcGVyYXRvcltdKCBzaXplX3R5cGUgaSApCiAgICB7CglkZXRhY2goKTsKCXJl dHVybiAqKCBiZWdpbigpICsgaSApOwogICAgfQoKICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRv cltdKCBzaXplX3R5cGUgaSApIGNvbnN0CiAgICB7CglyZXR1cm4gKiggYmVnaW4oKSArIGkgKTsK ICAgIH0KCiAgICByZWZlcmVuY2UgZnJvbnQoKQogICAgewoJKCggICFlbXB0eSgpICApID8gKHZv aWQpMCA6IHFXYXJuaW5nKCJBU1NFUlQ6IFwiJXNcIiBpbiAlcyAoJWQpIiwiIWVtcHR5KCkiLCIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcXZhbHVldmVjdG9yLmgiLDM2MikpIDsKCWRldGFjaCgpOwoJ cmV0dXJuICpiZWdpbigpOwogICAgfQoKICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0 CiAgICB7CgkoKCAgIWVtcHR5KCkgICkgPyAodm9pZCkwIDogcVdhcm5pbmcoIkFTU0VSVDogXCIl c1wiIGluICVzICglZCkiLCIhZW1wdHkoKSIsIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWV2 ZWN0b3IuaCIsMzY5KSkgOwoJcmV0dXJuICpiZWdpbigpOwogICAgfQoKICAgIHJlZmVyZW5jZSBi YWNrKCkKICAgIHsKCSgoICAhZW1wdHkoKSAgKSA/ICh2b2lkKTAgOiBxV2FybmluZygiQVNTRVJU OiBcIiVzXCIgaW4gJXMgKCVkKSIsIiFlbXB0eSgpIiwiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F2 YWx1ZXZlY3Rvci5oIiwzNzUpKSA7CglkZXRhY2goKTsKCXJldHVybiAqKCBlbmQoKSAtIDEgKTsK ICAgIH0KCiAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0CiAgICB7CgkoKCAgIWVtcHR5 KCkgICkgPyAodm9pZCkwIDogcVdhcm5pbmcoIkFTU0VSVDogXCIlc1wiIGluICVzICglZCkiLCIh ZW1wdHkoKSIsIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWV2ZWN0b3IuaCIsMzgyKSkgOwoJ cmV0dXJuICooIGVuZCgpIC0gMSApOwogICAgfQoKICAgIHZvaWQgcHVzaF9iYWNrKCBjb25zdCBU JiB4ICkKICAgIHsKCWRldGFjaCgpOwoJaWYgKCBzaC0+ZmluaXNoID09IHNoLT5lbmQgKSB7Cgkg ICAgc2gtPnJlc2VydmUoIHNpemUoKSsxICk7Cgl9Cgkqc2gtPmZpbmlzaCA9IHg7CgkrK3NoLT5m aW5pc2g7CiAgICB9CgogICAgdm9pZCBwb3BfYmFjaygpCiAgICB7CglkZXRhY2goKTsKCWlmICgg ZW1wdHkoKSApCgkgICAgcmV0dXJuOwoJLS1zaC0+ZmluaXNoOwogICAgfQoKICAgIGl0ZXJhdG9y IGluc2VydCggaXRlcmF0b3IgcG9zLCBjb25zdCBUJiB4ICk7CiAgICBpdGVyYXRvciBpbnNlcnQo IGl0ZXJhdG9yIHBvcywgc2l6ZV90eXBlIG4sIGNvbnN0IFQmIHggKTsKICAgIAogICAgdm9pZCBy ZXNlcnZlKCBzaXplX3R5cGUgbiApCiAgICB7CglpZiAoIGNhcGFjaXR5KCkgPCBuICkgewoJICAg IGRldGFjaCgpOwoJICAgIHNoLT5yZXNlcnZlKCBuICk7Cgl9CiAgICB9CgogICAgdm9pZCByZXNp emUoIHNpemVfdHlwZSBuLCBjb25zdCBUJiB2YWwgPSBUKCkgKQogICAgewoJaWYgKCBuIDwgc2l6 ZSgpICkKCSAgICBlcmFzZSggYmVnaW4oKSArIG4sIGVuZCgpICk7CgllbHNlCgkgICAgaW5zZXJ0 KCBlbmQoKSwgbiAtIHNpemUoKSwgdmFsICk7CiAgICB9CgogICAgdm9pZCBjbGVhcigpCiAgICB7 CglkZXRhY2goKTsKCXNoLT5jbGVhcigpOwogICAgfQoKICAgIGl0ZXJhdG9yIGVyYXNlKCBpdGVy YXRvciBwb3MgKQogICAgewoJZGV0YWNoKCk7CglpZiAoIHBvcyArIDEgIT0gZW5kKCkgKQoJICAg IHFDb3B5KCBwb3MgKyAxLCBzaC0+ZmluaXNoLCBwb3MgKTsKCS0tc2gtPmZpbmlzaDsKCXJldHVy biBwb3M7CiAgICB9CgogICAgaXRlcmF0b3IgZXJhc2UoIGl0ZXJhdG9yIGZpcnN0LCBpdGVyYXRv ciBsYXN0ICkKICAgIHsKCWRldGFjaCgpOwoJcUNvcHkoIGxhc3QsIHNoLT5maW5pc2gsIGZpcnN0 ICk7CglzaC0+ZmluaXNoID0gc2gtPmZpbmlzaCAtICggbGFzdCAtIGZpcnN0ICk7CglyZXR1cm4g Zmlyc3Q7CiAgICB9CgogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRVmFsdWVWZWN0b3I8VD4m IHggKQogICAgewoJcmV0dXJuIHFFcXVhbCggYmVnaW4oKSwgZW5kKCksIHguYmVnaW4oKSApOwog ICAgfQoKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVZhbHVlVmVjdG9yPFQ+JiB4ICkgY29u c3QKICAgIHsKCXJldHVybiBxRXF1YWwoIGJlZ2luKCksIGVuZCgpLCB4LmJlZ2luKCkgKTsKICAg IH0KCnByb3RlY3RlZDoKICAgIHZvaWQgZGV0YWNoKCkKICAgIHsKCWlmICggc2gtPmNvdW50ID4g MSApIHsgZGV0YWNoSW50ZXJuYWwoKTsgfQogICAgfQogICAgdm9pZCBkZXRhY2hJbnRlcm5hbCgp OwogICAgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPiogc2g7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4K ICBRVmFsdWVWZWN0b3I8VD46OlFWYWx1ZVZlY3Rvciggc2l6ZV90eXBlIG4sIGNvbnN0IFQmIHZh bCApCnsKICAgIHNoID0gbmV3IFFWYWx1ZVZlY3RvclByaXZhdGU8VD4oIG4gKTsKICAgIHFGaWxs KCBiZWdpbigpLCBlbmQoKSwgdmFsICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIHZvaWQgUVZh bHVlVmVjdG9yPFQ+OjpkZXRhY2hJbnRlcm5hbCgpCnsKICAgIHNoLT5kZXJlZigpOwogICAgc2gg PSBuZXcgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPiggKnNoICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBU PgogIHR5cGVuYW1lICBRVmFsdWVWZWN0b3I8VD46Oml0ZXJhdG9yIFFWYWx1ZVZlY3RvcjxUPjo6 aW5zZXJ0KCBpdGVyYXRvciBwb3MsIGNvbnN0IFQmIHggKQp7CiAgICBzaXplX3R5cGUgb2Zmc2V0 ID0gcG9zIC0gc2gtPnN0YXJ0OwogICAgZGV0YWNoKCk7CiAgICBpZiAoIHBvcyA9PSBlbmQoKSAp IHsKCWlmICggc2gtPmZpbmlzaCA9PSBzaC0+ZW5kICkKCSAgICBwdXNoX2JhY2soIHggKTsKCWVs c2UgewoJICAgICpzaC0+ZmluaXNoID0geDsKCSAgICArK3NoLT5maW5pc2g7Cgl9CiAgICB9IGVs c2UgewoJaWYgKCBzaC0+ZmluaXNoID09IHNoLT5lbmQgKSB7CgkgICAgc2gtPmluc2VydCggcG9z LCB4ICk7Cgl9IGVsc2UgewoJICAgICpzaC0+ZmluaXNoID0gKihzaC0+ZmluaXNoIC0gMSk7Cgkg ICAgKytzaC0+ZmluaXNoOwoJICAgIHFDb3B5QmFja3dhcmQoIHBvcywgc2gtPmZpbmlzaCAtIDIs IHNoLT5maW5pc2ggLSAxICk7CgkgICAgKnBvcyA9IHg7Cgl9CiAgICB9CiAgICByZXR1cm4gYmVn aW4oKSArIG9mZnNldDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgdHlwZW5hbWUgIFFWYWx1ZVZl Y3RvcjxUPjo6aXRlcmF0b3IgUVZhbHVlVmVjdG9yPFQ+OjppbnNlcnQoIGl0ZXJhdG9yIHBvcywg c2l6ZV90eXBlIG4sIGNvbnN0IFQmIHggKQp7CiAgICBpZiAoIG4gIT0gMCApIHsKCXNpemVfdHlw ZSBvZmZzZXQgPSBwb3MgLSBzaC0+c3RhcnQ7CglkZXRhY2goKTsKCXBvcyA9IGJlZ2luKCkgKyBv ZmZzZXQ7CglzaC0+aW5zZXJ0KCBwb3MsIG4sIHggKTsKICAgIH0KICAgIHJldHVybiBwb3M7Cn0K CgoKdGVtcGxhdGU8Y2xhc3MgVD4KICBRRGF0YVN0cmVhbSYgb3BlcmF0b3I+PiggUURhdGFTdHJl YW0mIHMsIFFWYWx1ZVZlY3RvcjxUPiYgdiApCnsKICAgIHYuY2xlYXIoKTsKICAgIFFfVUlOVDMy IGM7CiAgICBzID4+IGM7CiAgICB2LnJlc2l6ZSggYyApOwogICAgZm9yKCBRX1VJTlQzMiBpID0g MDsgaSA8IGM7ICsraSApCiAgICB7CglUIHQ7CglzID4+IHQ7Cgl2W2ldID0gdDsKICAgIH0KICAg IHJldHVybiBzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUPgogIFFEYXRhU3RyZWFtJiBvcGVyYXRvcjw8 KCBRRGF0YVN0cmVhbSYgcywgY29uc3QgUVZhbHVlVmVjdG9yPFQ+JiB2ICkKewogICAgcyA8PCAo UV9VSU5UMzIpdi5zaXplKCk7CiAgICAgCiAgICAgCiAgICBjb25zdCBUKiBpdCA9IHYuYmVnaW4o KTsKICAgIGZvciggOyBpdCAhPSB2LmVuZCgpOyArK2l0ICkKCXMgPDwgKml0OwogICAgcmV0dXJu IHM7Cn0KCgoKCgojIDcgImVsZW1lbnQuaCIgMgoKCmNsYXNzIEVsZW1lbnQ7Cgp0eXBlZGVmIFFW YWx1ZVZlY3RvcjxFbGVtZW50PiBFbGVtZW50VmVjdG9yOwoKIAoKCmNvbnN0IGRvdWJsZSBFUFNJ TE9OID0gMC4wMDAwMDAxOyAgCgoKY2xhc3MgRWxlbWVudAp7CnB1YmxpYzoKICAgIGVudW0geyBJ TlZBTElEID0gLTEgfTsKICAgIGVudW0geyBOT19QUk9QT1JUSU9OID0gLTEgfTsKICAgIGVudW0g eyBNQVhfUFJPUE9JTlRTID0gMyB9OyAgCgogICAgRWxlbWVudCggZG91YmxlIHZhbHVlID0gSU5W QUxJRCwgUUNvbG9yIHZhbHVlQ29sb3IgPSBRdDo6Z3JheSwKCSAgICAgaW50IHZhbHVlUGF0dGVy biA9IFF0OjpTb2xpZFBhdHRlcm4sCgkgICAgIGNvbnN0IFFTdHJpbmcmIGxhYmVsID0gUVN0cmlu Zzo6bnVsbCwKCSAgICAgUUNvbG9yIGxhYmVsQ29sb3IgPSBRdDo6YmxhY2sgKSB7Cglpbml0KCB2 YWx1ZSwgdmFsdWVDb2xvciwgdmFsdWVQYXR0ZXJuLCBsYWJlbCwgbGFiZWxDb2xvciApOwoJZm9y ICggaW50IGkgPSAwOyBpIDwgTUFYX1BST1BPSU5UUyAqIDI7ICsraSApCgkgICAgbV9wcm9wb2lu dHNbaV0gPSBOT19QUk9QT1JUSU9OOwogICAgfQogICAgfkVsZW1lbnQoKSB7fQoKICAgIGJvb2wg aXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWUgPiBFUFNJTE9OOyB9CgogICAgZG91Ymxl IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQogICAgUUNvbG9yIHZhbHVlQ29sb3Io KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlQ29sb3I7IH0KICAgIGludCB2YWx1ZVBhdHRlcm4oKSBj b25zdCB7IHJldHVybiBtX3ZhbHVlUGF0dGVybjsgfQogICAgUVN0cmluZyBsYWJlbCgpIGNvbnN0 IHsgcmV0dXJuIG1fbGFiZWw7IH0KICAgIFFDb2xvciBsYWJlbENvbG9yKCkgY29uc3QgeyByZXR1 cm4gbV9sYWJlbENvbG9yOyB9CiAgICBkb3VibGUgcHJvWCggaW50IGluZGV4ICkgY29uc3Q7CiAg ICBkb3VibGUgcHJvWSggaW50IGluZGV4ICkgY29uc3Q7CgogICAgdm9pZCBzZXQoIGRvdWJsZSB2 YWx1ZSA9IElOVkFMSUQsIFFDb2xvciB2YWx1ZUNvbG9yID0gUXQ6OmdyYXksCgkgICAgICBpbnQg dmFsdWVQYXR0ZXJuID0gUXQ6OlNvbGlkUGF0dGVybiwKCSAgICAgIGNvbnN0IFFTdHJpbmcmIGxh YmVsID0gUVN0cmluZzo6bnVsbCwKCSAgICAgIFFDb2xvciBsYWJlbENvbG9yID0gUXQ6OmJsYWNr ICkgewoJaW5pdCggdmFsdWUsIHZhbHVlQ29sb3IsIHZhbHVlUGF0dGVybiwgbGFiZWwsIGxhYmVs Q29sb3IgKTsKICAgIH0KICAgIHZvaWQgc2V0VmFsdWUoIGRvdWJsZSB2YWx1ZSApIHsgbV92YWx1 ZSA9IHZhbHVlOyB9CiAgICB2b2lkIHNldFZhbHVlQ29sb3IoIFFDb2xvciB2YWx1ZUNvbG9yICkg eyBtX3ZhbHVlQ29sb3IgPSB2YWx1ZUNvbG9yOyB9CiAgICB2b2lkIHNldFZhbHVlUGF0dGVybigg aW50IHZhbHVlUGF0dGVybiApOwogICAgdm9pZCBzZXRMYWJlbCggY29uc3QgUVN0cmluZyYgbGFi ZWwgKSB7IG1fbGFiZWwgPSBsYWJlbDsgfQogICAgdm9pZCBzZXRMYWJlbENvbG9yKCBRQ29sb3Ig bGFiZWxDb2xvciApIHsgbV9sYWJlbENvbG9yID0gbGFiZWxDb2xvcjsgfQogICAgdm9pZCBzZXRQ cm9YKCBpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSApOwogICAgdm9pZCBzZXRQcm9ZKCBpbnQgaW5k ZXgsIGRvdWJsZSB2YWx1ZSApOwoKcHJpdmF0ZToKICAgIHZvaWQgaW5pdCggZG91YmxlIHZhbHVl LCBRQ29sb3IgdmFsdWVDb2xvciwgaW50IHZhbHVlUGF0dGVybiwKCSAgICAgICBjb25zdCBRU3Ry aW5nJiBsYWJlbCwgUUNvbG9yIGxhYmVsQ29sb3IgKTsKCiAgICBkb3VibGUgbV92YWx1ZTsKICAg IFFDb2xvciBtX3ZhbHVlQ29sb3I7CiAgICBpbnQgbV92YWx1ZVBhdHRlcm47CiAgICBRU3RyaW5n IG1fbGFiZWw7CiAgICBRQ29sb3IgbV9sYWJlbENvbG9yOwogICAgZG91YmxlIG1fcHJvcG9pbnRz WzIgKiBNQVhfUFJPUE9JTlRTXTsKfTsKCgpRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggUVRleHRT dHJlYW0mLCBjb25zdCBFbGVtZW50JiApOwpRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggUVRleHRT dHJlYW0mLCBFbGVtZW50JiApOwoKCiMgNCAiY2FudmFzdmlldy5oIiAyCgojIDEgImNhbnZhc3Rl eHQuaCIgMQoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xY2FudmFzLmgiIDEKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2lu Y2x1ZGUvcXNjcm9sbHZpZXcuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FmcmFtZS5oIiAxCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3F3aWRnZXQuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW9iamVjdC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fl dmVudC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEg Ii91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcmVnaW9uLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FyZWN0Lmgi IDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xv Y2FsL3F0L2luY2x1ZGUvcXNpemUuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcG9pbnQuaCIgMQogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgICBRUG9pbnQKewpw dWJsaWM6CiAgICBRUG9pbnQoKTsKICAgIFFQb2ludCggaW50IHhwb3MsIGludCB5cG9zICk7Cgog ICAgYm9vbCAgIGlzTnVsbCgpCWNvbnN0OwoKICAgIGludAkgICB4KCkJCWNvbnN0OwogICAgaW50 CSAgIHkoKQkJY29uc3Q7CiAgICB2b2lkICAgc2V0WCggaW50IHggKTsKICAgIHZvaWQgICBzZXRZ KCBpbnQgeSApOwoKICAgIGludCBtYW5oYXR0YW5MZW5ndGgoKSBjb25zdDsKCiAgICBRQ09PUkQg JnJ4KCk7CiAgICBRQ09PUkQgJnJ5KCk7CgogICAgUVBvaW50ICZvcGVyYXRvcis9KCBjb25zdCBR UG9pbnQgJnAgKTsKICAgIFFQb2ludCAmb3BlcmF0b3ItPSggY29uc3QgUVBvaW50ICZwICk7CiAg ICBRUG9pbnQgJm9wZXJhdG9yKj0oIGludCBjICk7CiAgICBRUG9pbnQgJm9wZXJhdG9yKj0oIGRv dWJsZSBjICk7CiAgICBRUG9pbnQgJm9wZXJhdG9yLz0oIGludCBjICk7CiAgICBRUG9pbnQgJm9w ZXJhdG9yLz0oIGRvdWJsZSBjICk7CgogICAgZnJpZW5kIGlubGluZSBib29sCSBvcGVyYXRvcj09 KCBjb25zdCBRUG9pbnQgJiwgY29uc3QgUVBvaW50ICYgKTsKICAgIGZyaWVuZCBpbmxpbmUgYm9v bAkgb3BlcmF0b3IhPSggY29uc3QgUVBvaW50ICYsIGNvbnN0IFFQb2ludCAmICk7CiAgICBmcmll bmQgaW5saW5lIGNvbnN0IFFQb2ludCBvcGVyYXRvcisoIGNvbnN0IFFQb2ludCAmLCBjb25zdCBR UG9pbnQgJiApOwogICAgZnJpZW5kIGlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3ItKCBjb25z dCBRUG9pbnQgJiwgY29uc3QgUVBvaW50ICYgKTsKICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgUVBv aW50IG9wZXJhdG9yKiggY29uc3QgUVBvaW50ICYsIGludCApOwogICAgZnJpZW5kIGlubGluZSBj b25zdCBRUG9pbnQgb3BlcmF0b3IqKCBpbnQsIGNvbnN0IFFQb2ludCAmICk7CiAgICBmcmllbmQg aW5saW5lIGNvbnN0IFFQb2ludCBvcGVyYXRvciooIGNvbnN0IFFQb2ludCAmLCBkb3VibGUgKTsK ICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgUVBvaW50IG9wZXJhdG9yKiggZG91YmxlLCBjb25zdCBR UG9pbnQgJiApOwogICAgZnJpZW5kIGlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3ItKCBjb25z dCBRUG9pbnQgJiApOwogICAgZnJpZW5kIGlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3IvKCBj b25zdCBRUG9pbnQgJiwgaW50ICk7CiAgICBmcmllbmQgaW5saW5lIGNvbnN0IFFQb2ludCBvcGVy YXRvci8oIGNvbnN0IFFQb2ludCAmLCBkb3VibGUgKTsKCnByaXZhdGU6CiAgICBzdGF0aWMgdm9p ZCB3YXJuaW5nRGl2QnlaZXJvKCk7CgoKCgoKICAgIFFDT09SRCB4cDsKICAgIFFDT09SRCB5cDsK Cn07CgoKIAoKCgogIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmLCBjb25z dCBRUG9pbnQgJiApOwogIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBR UG9pbnQgJiApOwoKCiAKCgoKaW5saW5lIFFQb2ludDo6UVBvaW50KCkKeyB4cD0wOyB5cD0wOyB9 CgppbmxpbmUgUVBvaW50OjpRUG9pbnQoIGludCB4cG9zLCBpbnQgeXBvcyApCnsgeHA9KFFDT09S RCl4cG9zOyB5cD0oUUNPT1JEKXlwb3M7IH0KCmlubGluZSBib29sIFFQb2ludDo6aXNOdWxsKCkg Y29uc3QKeyByZXR1cm4geHAgPT0gMCAmJiB5cCA9PSAwOyB9CgppbmxpbmUgaW50IFFQb2ludDo6 eCgpIGNvbnN0CnsgcmV0dXJuIHhwOyB9CgppbmxpbmUgaW50IFFQb2ludDo6eSgpIGNvbnN0Cnsg cmV0dXJuIHlwOyB9CgppbmxpbmUgdm9pZCBRUG9pbnQ6OnNldFgoIGludCB4ICkKeyB4cCA9IChR Q09PUkQpeDsgfQoKaW5saW5lIHZvaWQgUVBvaW50OjpzZXRZKCBpbnQgeSApCnsgeXAgPSAoUUNP T1JEKXk7IH0KCmlubGluZSBRQ09PUkQgJlFQb2ludDo6cngoKQp7IHJldHVybiB4cDsgfQoKaW5s aW5lIFFDT09SRCAmUVBvaW50OjpyeSgpCnsgcmV0dXJuIHlwOyB9CgppbmxpbmUgUVBvaW50ICZR UG9pbnQ6Om9wZXJhdG9yKz0oIGNvbnN0IFFQb2ludCAmcCApCnsgeHArPXAueHA7IHlwKz1wLnlw OyByZXR1cm4gKnRoaXM7IH0KCmlubGluZSBRUG9pbnQgJlFQb2ludDo6b3BlcmF0b3ItPSggY29u c3QgUVBvaW50ICZwICkKeyB4cC09cC54cDsgeXAtPXAueXA7IHJldHVybiAqdGhpczsgfQoKaW5s aW5lIFFQb2ludCAmUVBvaW50OjpvcGVyYXRvcio9KCBpbnQgYyApCnsgeHAqPShRQ09PUkQpYzsg eXAqPShRQ09PUkQpYzsgcmV0dXJuICp0aGlzOyB9CgppbmxpbmUgUVBvaW50ICZRUG9pbnQ6Om9w ZXJhdG9yKj0oIGRvdWJsZSBjICkKeyB4cD0oUUNPT1JEKSh4cCpjKTsgeXA9KFFDT09SRCkoeXAq Yyk7IHJldHVybiAqdGhpczsgfQoKaW5saW5lIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVBvaW50 ICZwMSwgY29uc3QgUVBvaW50ICZwMiApCnsgcmV0dXJuIHAxLnhwID09IHAyLnhwICYmIHAxLnlw ID09IHAyLnlwOyB9CgppbmxpbmUgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRUG9pbnQgJnAxLCBj b25zdCBRUG9pbnQgJnAyICkKeyByZXR1cm4gcDEueHAgIT0gcDIueHAgfHwgcDEueXAgIT0gcDIu eXA7IH0KCmlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3IrKCBjb25zdCBRUG9pbnQgJnAxLCBj b25zdCBRUG9pbnQgJnAyICkKeyByZXR1cm4gUVBvaW50KHAxLnhwK3AyLnhwLCBwMS55cCtwMi55 cCk7IH0KCmlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3ItKCBjb25zdCBRUG9pbnQgJnAxLCBj b25zdCBRUG9pbnQgJnAyICkKeyByZXR1cm4gUVBvaW50KHAxLnhwLXAyLnhwLCBwMS55cC1wMi55 cCk7IH0KCmlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3IqKCBjb25zdCBRUG9pbnQgJnAsIGlu dCBjICkKeyByZXR1cm4gUVBvaW50KHAueHAqYywgcC55cCpjKTsgfQoKaW5saW5lIGNvbnN0IFFQ b2ludCBvcGVyYXRvciooIGludCBjLCBjb25zdCBRUG9pbnQgJnAgKQp7IHJldHVybiBRUG9pbnQo cC54cCpjLCBwLnlwKmMpOyB9CgppbmxpbmUgY29uc3QgUVBvaW50IG9wZXJhdG9yKiggY29uc3Qg UVBvaW50ICZwLCBkb3VibGUgYyApCnsgcmV0dXJuIFFQb2ludCgoUUNPT1JEKShwLnhwKmMpLCAo UUNPT1JEKShwLnlwKmMpKTsgfQoKaW5saW5lIGNvbnN0IFFQb2ludCBvcGVyYXRvciooIGRvdWJs ZSBjLCBjb25zdCBRUG9pbnQgJnAgKQp7IHJldHVybiBRUG9pbnQoKFFDT09SRCkocC54cCpjKSwg KFFDT09SRCkocC55cCpjKSk7IH0KCmlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3ItKCBjb25z dCBRUG9pbnQgJnAgKQp7IHJldHVybiBRUG9pbnQoLXAueHAsIC1wLnlwKTsgfQoKaW5saW5lIFFQ b2ludCAmUVBvaW50OjpvcGVyYXRvci89KCBpbnQgYyApCnsKCiAgICBpZiAoIGMgPT0gMCApCgl3 YXJuaW5nRGl2QnlaZXJvKCk7CgogICAgeHAvPShRQ09PUkQpYzsKICAgIHlwLz0oUUNPT1JEKWM7 CiAgICByZXR1cm4gKnRoaXM7Cn0KCmlubGluZSBRUG9pbnQgJlFQb2ludDo6b3BlcmF0b3IvPSgg ZG91YmxlIGMgKQp7CgogICAgaWYgKCBjID09IDAuMCApCgl3YXJuaW5nRGl2QnlaZXJvKCk7Cgog ICAgeHA9KFFDT09SRCkoeHAvYyk7CiAgICB5cD0oUUNPT1JEKSh5cC9jKTsKICAgIHJldHVybiAq dGhpczsKfQoKaW5saW5lIGNvbnN0IFFQb2ludCBvcGVyYXRvci8oIGNvbnN0IFFQb2ludCAmcCwg aW50IGMgKQp7CgogICAgaWYgKCBjID09IDAgKQoJUVBvaW50Ojp3YXJuaW5nRGl2QnlaZXJvKCk7 CgogICAgcmV0dXJuIFFQb2ludChwLnhwL2MsIHAueXAvYyk7Cn0KCmlubGluZSBjb25zdCBRUG9p bnQgb3BlcmF0b3IvKCBjb25zdCBRUG9pbnQgJnAsIGRvdWJsZSBjICkKewoKICAgIGlmICggYyA9 PSAwLjAgKQoJUVBvaW50Ojp3YXJuaW5nRGl2QnlaZXJvKCk7CgogICAgcmV0dXJuIFFQb2ludCgo UUNPT1JEKShwLnhwL2MpLCAoUUNPT1JEKShwLnlwL2MpKTsKfQoKCgojIDQyICIvdXNyL2xvY2Fs L3F0L2luY2x1ZGUvcXNpemUuaCIgMgoKCgoKY2xhc3MgICBRU2l6ZQp7CnB1YmxpYzoKICAgIFFT aXplKCk7CiAgICBRU2l6ZSggaW50IHcsIGludCBoICk7CgogICAgYm9vbCAgIGlzTnVsbCgpCWNv bnN0OwogICAgYm9vbCAgIGlzRW1wdHkoKQljb25zdDsKICAgIGJvb2wgICBpc1ZhbGlkKCkJY29u c3Q7CgogICAgaW50CSAgIHdpZHRoKCkJY29uc3Q7CiAgICBpbnQJICAgaGVpZ2h0KCkJY29uc3Q7 CiAgICB2b2lkICAgc2V0V2lkdGgoIGludCB3ICk7CiAgICB2b2lkICAgc2V0SGVpZ2h0KCBpbnQg aCApOwogICAgdm9pZCAgIHRyYW5zcG9zZSgpOwoKICAgIFFTaXplIGV4cGFuZGVkVG8oIGNvbnN0 IFFTaXplICYgKSBjb25zdDsKICAgIFFTaXplIGJvdW5kZWRUbyggY29uc3QgUVNpemUgJiApIGNv bnN0OwoKICAgIFFDT09SRCAmcndpZHRoKCk7CiAgICBRQ09PUkQgJnJoZWlnaHQoKTsKCiAgICBR U2l6ZSAmb3BlcmF0b3IrPSggY29uc3QgUVNpemUgJiApOwogICAgUVNpemUgJm9wZXJhdG9yLT0o IGNvbnN0IFFTaXplICYgKTsKICAgIFFTaXplICZvcGVyYXRvcio9KCBpbnQgYyApOwogICAgUVNp emUgJm9wZXJhdG9yKj0oIGRvdWJsZSBjICk7CiAgICBRU2l6ZSAmb3BlcmF0b3IvPSggaW50IGMg KTsKICAgIFFTaXplICZvcGVyYXRvci89KCBkb3VibGUgYyApOwoKICAgIGZyaWVuZCBpbmxpbmUg Ym9vbAlvcGVyYXRvcj09KCBjb25zdCBRU2l6ZSAmLCBjb25zdCBRU2l6ZSAmICk7CiAgICBmcmll bmQgaW5saW5lIGJvb2wJb3BlcmF0b3IhPSggY29uc3QgUVNpemUgJiwgY29uc3QgUVNpemUgJiAp OwogICAgZnJpZW5kIGlubGluZSBjb25zdCBRU2l6ZSBvcGVyYXRvcisoIGNvbnN0IFFTaXplICYs IGNvbnN0IFFTaXplICYgKTsKICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgUVNpemUgb3BlcmF0b3It KCBjb25zdCBRU2l6ZSAmLCBjb25zdCBRU2l6ZSAmICk7CiAgICBmcmllbmQgaW5saW5lIGNvbnN0 IFFTaXplIG9wZXJhdG9yKiggY29uc3QgUVNpemUgJiwgaW50ICk7CiAgICBmcmllbmQgaW5saW5l IGNvbnN0IFFTaXplIG9wZXJhdG9yKiggaW50LCBjb25zdCBRU2l6ZSAmICk7CiAgICBmcmllbmQg aW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yKiggY29uc3QgUVNpemUgJiwgZG91YmxlICk7CiAg ICBmcmllbmQgaW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yKiggZG91YmxlLCBjb25zdCBRU2l6 ZSAmICk7CiAgICBmcmllbmQgaW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yLyggY29uc3QgUVNp emUgJiwgaW50ICk7CiAgICBmcmllbmQgaW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yLyggY29u c3QgUVNpemUgJiwgZG91YmxlICk7Cgpwcml2YXRlOgogICAgc3RhdGljIHZvaWQgd2FybmluZ0Rp dkJ5WmVybygpOwoKICAgIFFDT09SRCB3ZDsKICAgIFFDT09SRCBodDsKfTsKCgogCgoKCiAgUURh dGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFTaXplICYgKTsKICBR RGF0YVN0cmVhbSAmb3BlcmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUVNpemUgJiApOwoKCiAKCgoK aW5saW5lIFFTaXplOjpRU2l6ZSgpCnsgd2QgPSBodCA9IC0xOyB9CgppbmxpbmUgUVNpemU6OlFT aXplKCBpbnQgdywgaW50IGggKQp7IHdkPShRQ09PUkQpdzsgaHQ9KFFDT09SRCloOyB9Cgppbmxp bmUgYm9vbCBRU2l6ZTo6aXNOdWxsKCkgY29uc3QKeyByZXR1cm4gd2Q9PTAgJiYgaHQ9PTA7IH0K CmlubGluZSBib29sIFFTaXplOjppc0VtcHR5KCkgY29uc3QKeyByZXR1cm4gd2Q8MSB8fCBodDwx OyB9CgppbmxpbmUgYm9vbCBRU2l6ZTo6aXNWYWxpZCgpIGNvbnN0CnsgcmV0dXJuIHdkPj0wICYm IGh0Pj0wOyB9CgppbmxpbmUgaW50IFFTaXplOjp3aWR0aCgpIGNvbnN0CnsgcmV0dXJuIHdkOyB9 CgppbmxpbmUgaW50IFFTaXplOjpoZWlnaHQoKSBjb25zdAp7IHJldHVybiBodDsgfQoKaW5saW5l IHZvaWQgUVNpemU6OnNldFdpZHRoKCBpbnQgdyApCnsgd2Q9KFFDT09SRCl3OyB9CgppbmxpbmUg dm9pZCBRU2l6ZTo6c2V0SGVpZ2h0KCBpbnQgaCApCnsgaHQ9KFFDT09SRCloOyB9CgppbmxpbmUg UUNPT1JEICZRU2l6ZTo6cndpZHRoKCkKeyByZXR1cm4gd2Q7IH0KCmlubGluZSBRQ09PUkQgJlFT aXplOjpyaGVpZ2h0KCkKeyByZXR1cm4gaHQ7IH0KCmlubGluZSBRU2l6ZSAmUVNpemU6Om9wZXJh dG9yKz0oIGNvbnN0IFFTaXplICZzICkKeyB3ZCs9cy53ZDsgaHQrPXMuaHQ7IHJldHVybiAqdGhp czsgfQoKaW5saW5lIFFTaXplICZRU2l6ZTo6b3BlcmF0b3ItPSggY29uc3QgUVNpemUgJnMgKQp7 IHdkLT1zLndkOyBodC09cy5odDsgcmV0dXJuICp0aGlzOyB9CgppbmxpbmUgUVNpemUgJlFTaXpl OjpvcGVyYXRvcio9KCBpbnQgYyApCnsgd2QqPShRQ09PUkQpYzsgaHQqPShRQ09PUkQpYzsgcmV0 dXJuICp0aGlzOyB9CgppbmxpbmUgUVNpemUgJlFTaXplOjpvcGVyYXRvcio9KCBkb3VibGUgYyAp Cnsgd2Q9KFFDT09SRCkod2QqYyk7IGh0PShRQ09PUkQpKGh0KmMpOyByZXR1cm4gKnRoaXM7IH0K CmlubGluZSBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFTaXplICZzMSwgY29uc3QgUVNpemUgJnMy ICkKeyByZXR1cm4gczEud2QgPT0gczIud2QgJiYgczEuaHQgPT0gczIuaHQ7IH0KCmlubGluZSBi b29sIG9wZXJhdG9yIT0oIGNvbnN0IFFTaXplICZzMSwgY29uc3QgUVNpemUgJnMyICkKeyByZXR1 cm4gczEud2QgIT0gczIud2QgfHwgczEuaHQgIT0gczIuaHQ7IH0KCmlubGluZSBjb25zdCBRU2l6 ZSBvcGVyYXRvcisoIGNvbnN0IFFTaXplICYgczEsIGNvbnN0IFFTaXplICYgczIgKQp7IHJldHVy biBRU2l6ZShzMS53ZCtzMi53ZCwgczEuaHQrczIuaHQpOyB9CgppbmxpbmUgY29uc3QgUVNpemUg b3BlcmF0b3ItKCBjb25zdCBRU2l6ZSAmczEsIGNvbnN0IFFTaXplICZzMiApCnsgcmV0dXJuIFFT aXplKHMxLndkLXMyLndkLCBzMS5odC1zMi5odCk7IH0KCmlubGluZSBjb25zdCBRU2l6ZSBvcGVy YXRvciooIGNvbnN0IFFTaXplICZzLCBpbnQgYyApCnsgcmV0dXJuIFFTaXplKHMud2QqYywgcy5o dCpjKTsgfQoKaW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yKiggaW50IGMsIGNvbnN0IFFTaXpl ICZzICkKeyAgcmV0dXJuIFFTaXplKHMud2QqYywgcy5odCpjKTsgfQoKaW5saW5lIGNvbnN0IFFT aXplIG9wZXJhdG9yKiggY29uc3QgUVNpemUgJnMsIGRvdWJsZSBjICkKeyByZXR1cm4gUVNpemUo KFFDT09SRCkocy53ZCpjKSwgKFFDT09SRCkocy5odCpjKSk7IH0KCmlubGluZSBjb25zdCBRU2l6 ZSBvcGVyYXRvciooIGRvdWJsZSBjLCBjb25zdCBRU2l6ZSAmcyApCnsgcmV0dXJuIFFTaXplKChR Q09PUkQpKHMud2QqYyksIChRQ09PUkQpKHMuaHQqYykpOyB9CgppbmxpbmUgUVNpemUgJlFTaXpl OjpvcGVyYXRvci89KCBpbnQgYyApCnsKCiAgICBpZiAoIGMgPT0gMCApCgl3YXJuaW5nRGl2Qnla ZXJvKCk7CgogICAgd2QvPShRQ09PUkQpYzsgaHQvPShRQ09PUkQpYzsKICAgIHJldHVybiAqdGhp czsKfQoKaW5saW5lIFFTaXplICZRU2l6ZTo6b3BlcmF0b3IvPSggZG91YmxlIGMgKQp7CgogICAg aWYgKCBjID09IDAuMCApCgl3YXJuaW5nRGl2QnlaZXJvKCk7CgogICAgd2Q9KFFDT09SRCkod2Qv Yyk7IGh0PShRQ09PUkQpKGh0L2MpOwogICAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgY29uc3Qg UVNpemUgb3BlcmF0b3IvKCBjb25zdCBRU2l6ZSAmcywgaW50IGMgKQp7CgogICAgaWYgKCBjID09 IDAgKQoJUVNpemU6Ondhcm5pbmdEaXZCeVplcm8oKTsKCiAgICByZXR1cm4gUVNpemUocy53ZC9j LCBzLmh0L2MpOwp9CgppbmxpbmUgY29uc3QgUVNpemUgb3BlcmF0b3IvKCBjb25zdCBRU2l6ZSAm cywgZG91YmxlIGMgKQp7CgogICAgaWYgKCBjID09IDAuMCApCglRU2l6ZTo6d2FybmluZ0RpdkJ5 WmVybygpOwoKICAgIHJldHVybiBRU2l6ZSgoUUNPT1JEKShzLndkL2MpLCAoUUNPT1JEKShzLmh0 L2MpKTsKfQoKaW5saW5lIFFTaXplIFFTaXplOjpleHBhbmRlZFRvKCBjb25zdCBRU2l6ZSAmIG90 aGVyU2l6ZSApIGNvbnN0CnsKICAgIHJldHVybiBRU2l6ZSggKCggb3RoZXJTaXplLndkICkgPCAo IHdkICkgPyAoIHdkICkgOiAoIG90aGVyU2l6ZS53ZCApKSAsICgoIG90aGVyU2l6ZS5odCApIDwg KCBodCApID8gKCBodCApIDogKCBvdGhlclNpemUuaHQgKSkgICk7Cn0KCmlubGluZSBRU2l6ZSBR U2l6ZTo6Ym91bmRlZFRvKCBjb25zdCBRU2l6ZSAmIG90aGVyU2l6ZSApIGNvbnN0CnsKICAgIHJl dHVybiBRU2l6ZSggKCggd2QgKSA8ICggb3RoZXJTaXplLndkICkgPyAoIHdkICkgOiAoIG90aGVy U2l6ZS53ZCApKSAsICgoIGh0ICkgPCAoIG90aGVyU2l6ZS5odCApID8gKCBodCApIDogKCBvdGhl clNpemUuaHQgKSkgICk7Cn0KCgoKIyA0MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FyZWN0Lmgi IDIKCgoKCgoKCgpjbGFzcyAgIFFSZWN0CQkJCQkgCnsKcHVibGljOgogICAgUVJlY3QoKQl7IHgx ID0geTEgPSAwOyB4MiA9IHkyID0gLTE7IH0KICAgIFFSZWN0KCBjb25zdCBRUG9pbnQgJnRvcGxl ZnQsIGNvbnN0IFFQb2ludCAmYm90dG9tcmlnaHQgKTsKICAgIFFSZWN0KCBjb25zdCBRUG9pbnQg JnRvcGxlZnQsIGNvbnN0IFFTaXplICZzaXplICk7CiAgICBRUmVjdCggaW50IGxlZnQsIGludCB0 b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCApOwoKICAgIGJvb2wgICBpc051bGwoKQljb25zdDsK ICAgIGJvb2wgICBpc0VtcHR5KCkJY29uc3Q7CiAgICBib29sICAgaXNWYWxpZCgpCWNvbnN0Owog ICAgUVJlY3QgIG5vcm1hbGl6ZSgpCWNvbnN0OwoKICAgIGludAkgICBsZWZ0KCkJY29uc3Q7CiAg ICBpbnQJICAgdG9wKCkJY29uc3Q7CiAgICBpbnQJICAgcmlnaHQoKQljb25zdDsKICAgIGludAkg ICBib3R0b20oKQljb25zdDsKCiAgICBRQ09PUkQgJnJMZWZ0KCk7CiAgICBRQ09PUkQgJnJUb3Ao KTsKICAgIFFDT09SRCAmclJpZ2h0KCk7CiAgICBRQ09PUkQgJnJCb3R0b20oKTsKCQogICAgaW50 CSAgIHgoKQkJY29uc3Q7CiAgICBpbnQJICAgeSgpCQljb25zdDsKICAgIHZvaWQgICBzZXRMZWZ0 KCBpbnQgcG9zICk7CiAgICB2b2lkICAgc2V0VG9wKCBpbnQgcG9zICk7CiAgICB2b2lkICAgc2V0 UmlnaHQoIGludCBwb3MgKTsKICAgIHZvaWQgICBzZXRCb3R0b20oIGludCBwb3MgKTsKICAgIHZv aWQgICBzZXRYKCBpbnQgeCApOwogICAgdm9pZCAgIHNldFkoIGludCB5ICk7CgogICAgUVBvaW50 IHRvcExlZnQoKQkgY29uc3Q7CiAgICBRUG9pbnQgYm90dG9tUmlnaHQoKSBjb25zdDsKICAgIFFQ b2ludCB0b3BSaWdodCgpCSBjb25zdDsKICAgIFFQb2ludCBib3R0b21MZWZ0KCkJIGNvbnN0Owog ICAgUVBvaW50IGNlbnRlcigpCSBjb25zdDsKCiAgICB2b2lkICAgcmVjdCggaW50ICp4LCBpbnQg KnksIGludCAqdywgaW50ICpoICkgY29uc3Q7CiAgICB2b2lkICAgY29vcmRzKCBpbnQgKngxLCBp bnQgKnkxLCBpbnQgKngyLCBpbnQgKnkyICkgY29uc3Q7CgogICAgdm9pZCAgIG1vdmVUb3BMZWZ0 KCBjb25zdCBRUG9pbnQgJnAgKTsKICAgIHZvaWQgICBtb3ZlQm90dG9tUmlnaHQoIGNvbnN0IFFQ b2ludCAmcCApOwogICAgdm9pZCAgIG1vdmVUb3BSaWdodCggY29uc3QgUVBvaW50ICZwICk7CiAg ICB2b2lkICAgbW92ZUJvdHRvbUxlZnQoIGNvbnN0IFFQb2ludCAmcCApOwogICAgdm9pZCAgIG1v dmVDZW50ZXIoIGNvbnN0IFFQb2ludCAmcCApOwogICAgdm9pZCAgIG1vdmVCeSggaW50IGR4LCBp bnQgZHkgKTsKCiAgICB2b2lkICAgc2V0UmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgg KTsKICAgIHZvaWQgICBzZXRDb29yZHMoIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiAp OwogICAgdm9pZCAgIGFkZENvb3JkcyggaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyICk7 CiAgICAKICAgIFFTaXplICBzaXplKCkJY29uc3Q7CiAgICBpbnQJICAgd2lkdGgoKQljb25zdDsK ICAgIGludAkgICBoZWlnaHQoKQljb25zdDsKICAgIHZvaWQgICBzZXRXaWR0aCggaW50IHcgKTsK ICAgIHZvaWQgICBzZXRIZWlnaHQoIGludCBoICk7CiAgICB2b2lkICAgc2V0U2l6ZSggY29uc3Qg UVNpemUgJnMgKTsKCiAgICBRUmVjdCAgb3BlcmF0b3J8KGNvbnN0IFFSZWN0ICZyKSBjb25zdDsK ICAgIFFSZWN0ICBvcGVyYXRvciYoY29uc3QgUVJlY3QgJnIpIGNvbnN0OwogICAgUVJlY3QmICBv cGVyYXRvcnw9KGNvbnN0IFFSZWN0ICZyKTsKICAgIFFSZWN0JiAgb3BlcmF0b3ImPShjb25zdCBR UmVjdCAmcik7CgogICAgYm9vbCAgIGNvbnRhaW5zKCBjb25zdCBRUG9pbnQgJnAsIGJvb2wgcHJv cGVyPUZBTFNFICkgY29uc3Q7CiAgICBib29sICAgY29udGFpbnMoIGludCB4LCBpbnQgeSwgYm9v bCBwcm9wZXI9RkFMU0UgKSBjb25zdDsKICAgIGJvb2wgICBjb250YWlucyggY29uc3QgUVJlY3Qg JnIsIGJvb2wgcHJvcGVyPUZBTFNFICkgY29uc3Q7CiAgICBRUmVjdCAgdW5pdGUoIGNvbnN0IFFS ZWN0ICZyICkgY29uc3Q7CiAgICBRUmVjdCAgaW50ZXJzZWN0KCBjb25zdCBRUmVjdCAmciApIGNv bnN0OwogICAgYm9vbCAgIGludGVyc2VjdHMoIGNvbnN0IFFSZWN0ICZyICkgY29uc3Q7CgogICAg ZnJpZW5kICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRUmVjdCAmLCBjb25zdCBRUmVjdCAmICk7 CiAgICBmcmllbmQgICBib29sIG9wZXJhdG9yIT0oIGNvbnN0IFFSZWN0ICYsIGNvbnN0IFFSZWN0 ICYgKTsKCnByaXZhdGU6CgoKCgoKCiAgICBRQ09PUkQgeDE7CiAgICBRQ09PUkQgeTE7CiAgICBR Q09PUkQgeDI7CiAgICBRQ09PUkQgeTI7Cgp9OwoKICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFS ZWN0ICYsIGNvbnN0IFFSZWN0ICYgKTsKICBib29sIG9wZXJhdG9yIT0oIGNvbnN0IFFSZWN0ICYs IGNvbnN0IFFSZWN0ICYgKTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRh U3RyZWFtICYsIGNvbnN0IFFSZWN0ICYgKTsKICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I+PiggUURh dGFTdHJlYW0gJiwgUVJlY3QgJiApOwoKCiAKCgoKaW5saW5lIFFSZWN0OjpRUmVjdCggaW50IGxl ZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCApCnsKICAgIHgxID0gKFFDT09SRCls ZWZ0OwogICAgeTEgPSAoUUNPT1JEKXRvcDsKICAgIHgyID0gKFFDT09SRCkobGVmdCt3aWR0aC0x KTsKICAgIHkyID0gKFFDT09SRCkodG9wK2hlaWdodC0xKTsKfQoKaW5saW5lIGJvb2wgUVJlY3Q6 OmlzTnVsbCgpIGNvbnN0CnsgcmV0dXJuIHgyID09IHgxLTEgJiYgeTIgPT0geTEtMTsgfQoKaW5s aW5lIGJvb2wgUVJlY3Q6OmlzRW1wdHkoKSBjb25zdAp7IHJldHVybiB4MSA+IHgyIHx8IHkxID4g eTI7IH0KCmlubGluZSBib29sIFFSZWN0Ojppc1ZhbGlkKCkgY29uc3QKeyByZXR1cm4geDEgPD0g eDIgJiYgeTEgPD0geTI7IH0KCmlubGluZSBpbnQgUVJlY3Q6OmxlZnQoKSBjb25zdAp7IHJldHVy biB4MTsgfQoKaW5saW5lIGludCBRUmVjdDo6dG9wKCkgY29uc3QKeyByZXR1cm4geTE7IH0KCmlu bGluZSBpbnQgUVJlY3Q6OnJpZ2h0KCkgY29uc3QKeyByZXR1cm4geDI7IH0KCmlubGluZSBpbnQg UVJlY3Q6OmJvdHRvbSgpIGNvbnN0CnsgcmV0dXJuIHkyOyB9CgppbmxpbmUgUUNPT1JEICZRUmVj dDo6ckxlZnQoKQp7IHJldHVybiB4MTsgfQoKaW5saW5lIFFDT09SRCAmIFFSZWN0OjpyVG9wKCkK eyByZXR1cm4geTE7IH0KCmlubGluZSBRQ09PUkQgJiBRUmVjdDo6clJpZ2h0KCkKeyByZXR1cm4g eDI7IH0KCmlubGluZSBRQ09PUkQgJiBRUmVjdDo6ckJvdHRvbSgpCnsgcmV0dXJuIHkyOyB9Cgpp bmxpbmUgaW50IFFSZWN0Ojp4KCkgY29uc3QKeyByZXR1cm4geDE7IH0KCmlubGluZSBpbnQgUVJl Y3Q6OnkoKSBjb25zdAp7IHJldHVybiB5MTsgfQoKaW5saW5lIHZvaWQgUVJlY3Q6OnNldExlZnQo IGludCBwb3MgKQp7IHgxID0gKFFDT09SRClwb3M7IH0KCmlubGluZSB2b2lkIFFSZWN0OjpzZXRU b3AoIGludCBwb3MgKQp7IHkxID0gKFFDT09SRClwb3M7IH0KCmlubGluZSB2b2lkIFFSZWN0Ojpz ZXRSaWdodCggaW50IHBvcyApCnsgeDIgPSAoUUNPT1JEKXBvczsgfQoKaW5saW5lIHZvaWQgUVJl Y3Q6OnNldEJvdHRvbSggaW50IHBvcyApCnsgeTIgPSAoUUNPT1JEKXBvczsgfQoKaW5saW5lIHZv aWQgUVJlY3Q6OnNldFgoIGludCB4ICkKeyB4MSA9IChRQ09PUkQpeDsgfQoKaW5saW5lIHZvaWQg UVJlY3Q6OnNldFkoIGludCB5ICkKeyB5MSA9IChRQ09PUkQpeTsgfQoKaW5saW5lIFFQb2ludCBR UmVjdDo6dG9wTGVmdCgpIGNvbnN0CnsgcmV0dXJuIFFQb2ludCh4MSwgeTEpOyB9CgppbmxpbmUg UVBvaW50IFFSZWN0Ojpib3R0b21SaWdodCgpIGNvbnN0CnsgcmV0dXJuIFFQb2ludCh4MiwgeTIp OyB9CgppbmxpbmUgUVBvaW50IFFSZWN0Ojp0b3BSaWdodCgpIGNvbnN0CnsgcmV0dXJuIFFQb2lu dCh4MiwgeTEpOyB9CgppbmxpbmUgUVBvaW50IFFSZWN0Ojpib3R0b21MZWZ0KCkgY29uc3QKeyBy ZXR1cm4gUVBvaW50KHgxLCB5Mik7IH0KCmlubGluZSBRUG9pbnQgUVJlY3Q6OmNlbnRlcigpIGNv bnN0CnsgcmV0dXJuIFFQb2ludCgoeDEreDIpLzIsICh5MSt5MikvMik7IH0KCmlubGluZSBpbnQg UVJlY3Q6OndpZHRoKCkgY29uc3QKeyByZXR1cm4gIHgyIC0geDEgKyAxOyB9CgppbmxpbmUgaW50 IFFSZWN0OjpoZWlnaHQoKSBjb25zdAp7IHJldHVybiAgeTIgLSB5MSArIDE7IH0KCmlubGluZSBR U2l6ZSBRUmVjdDo6c2l6ZSgpIGNvbnN0CnsgcmV0dXJuIFFTaXplKHgyLXgxKzEsIHkyLXkxKzEp OyB9CgppbmxpbmUgYm9vbCBRUmVjdDo6Y29udGFpbnMoIGludCB4LCBpbnQgeSwgYm9vbCBwcm9w ZXIgKSBjb25zdAp7CiAgICBpZiAoIHByb3BlciApCiAgICAgICAgcmV0dXJuIHggPiB4MSAmJiB4 IDwgeDIgJiYKICAgICAgICAgICAgICAgeSA+IHkxICYmIHkgPCB5MjsKICAgIGVsc2UKICAgICAg ICByZXR1cm4geCA+PSB4MSAmJiB4IDw9IHgyICYmCiAgICAgICAgICAgICAgIHkgPj0geTEgJiYg eSA8PSB5MjsKfQoKCiMgNDMgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcmVnaW9uLmgiIDIKCgoK CmNsYXNzICAgUVJlZ2lvbgp7CnB1YmxpYzoKICAgIGVudW0gUmVnaW9uVHlwZSB7IFJlY3Rhbmds ZSwgRWxsaXBzZSB9OwoKICAgIFFSZWdpb24oKTsKICAgIFFSZWdpb24oIGludCB4LCBpbnQgeSwg aW50IHcsIGludCBoLCBSZWdpb25UeXBlID0gUmVjdGFuZ2xlICk7CiAgICBRUmVnaW9uKCBjb25z dCBRUmVjdCAmLCBSZWdpb25UeXBlID0gUmVjdGFuZ2xlICk7CiAgICBRUmVnaW9uKCBjb25zdCBR UG9pbnRBcnJheSAmLCBib29sIHdpbmRpbmc9RkFMU0UgKTsKICAgIFFSZWdpb24oIGNvbnN0IFFS ZWdpb24gJiApOwogICAgUVJlZ2lvbiggY29uc3QgUUJpdG1hcCAmICk7CiAgIH5RUmVnaW9uKCk7 CiAgICBRUmVnaW9uICZvcGVyYXRvcj0oIGNvbnN0IFFSZWdpb24gJiApOwoKICAgIGJvb2wgICAg aXNOdWxsKCkgICBjb25zdDsKICAgIGJvb2wgICAgaXNFbXB0eSgpICBjb25zdDsKCiAgICBib29s ICAgIGNvbnRhaW5zKCBjb25zdCBRUG9pbnQgJnAgKSBjb25zdDsKICAgIGJvb2wgICAgY29udGFp bnMoIGNvbnN0IFFSZWN0ICZyICkJY29uc3Q7CgogICAgdm9pZCAgICB0cmFuc2xhdGUoIGludCBk eCwgaW50IGR5ICk7CgogICAgUVJlZ2lvbiB1bml0ZSggY29uc3QgUVJlZ2lvbiAmICkJY29uc3Q7 CiAgICBRUmVnaW9uIGludGVyc2VjdCggY29uc3QgUVJlZ2lvbiAmKSBjb25zdDsKICAgIFFSZWdp b24gc3VidHJhY3QoIGNvbnN0IFFSZWdpb24gJiApIGNvbnN0OwogICAgUVJlZ2lvbiBlb3IoIGNv bnN0IFFSZWdpb24gJiApCWNvbnN0OwoKICAgIFFSZWN0ICAgYm91bmRpbmdSZWN0KCkgY29uc3Q7 CiAgICBRTWVtQXJyYXk8UVJlY3Q+IHJlY3RzKCkgY29uc3Q7CiAgICB2b2lkIHNldFJlY3RzKCBj b25zdCBRUmVjdCAqLCBpbnQgKTsKCiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yfCggY29uc3Qg UVJlZ2lvbiAmICkgY29uc3Q7CiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yKyggY29uc3QgUVJl Z2lvbiAmICkgY29uc3Q7CiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yJiggY29uc3QgUVJlZ2lv biAmICkgY29uc3Q7CiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yLSggY29uc3QgUVJlZ2lvbiAm ICkgY29uc3Q7CiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yXiggY29uc3QgUVJlZ2lvbiAmICkg Y29uc3Q7CiAgICBRUmVnaW9uJiBvcGVyYXRvcnw9KCBjb25zdCBRUmVnaW9uICYgKTsKICAgIFFS ZWdpb24mIG9wZXJhdG9yKz0oIGNvbnN0IFFSZWdpb24gJiApOwogICAgUVJlZ2lvbiYgb3BlcmF0 b3ImPSggY29uc3QgUVJlZ2lvbiAmICk7CiAgICBRUmVnaW9uJiBvcGVyYXRvci09KCBjb25zdCBR UmVnaW9uICYgKTsKICAgIFFSZWdpb24mIG9wZXJhdG9yXj0oIGNvbnN0IFFSZWdpb24gJiApOwoK ICAgIGJvb2wgICAgb3BlcmF0b3I9PSggY29uc3QgUVJlZ2lvbiAmICkgIGNvbnN0OwogICAgYm9v bCAgICBvcGVyYXRvciE9KCBjb25zdCBRUmVnaW9uICZyICkgY29uc3QKCQkJeyByZXR1cm4gIShv cGVyYXRvcj09KHIpKTsgfQoKCgoKICAgIFJlZ2lvbiAgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4g ZGF0YS0+cmduOyB9CgoKCgoKCgoKICAgIGZyaWVuZCAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8 KCBRRGF0YVN0cmVhbSAmLCBjb25zdCBRUmVnaW9uICYgKTsKICAgIGZyaWVuZCAgIFFEYXRhU3Ry ZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRUmVnaW9uICYgKTsKCnByaXZhdGU6CiAg ICBRUmVnaW9uKCBib29sICk7CiAgICBRUmVnaW9uIGNvcHkoKSBjb25zdDsKICAgIHZvaWQgICAg ZGV0YWNoKCk7CgoKCiAgICB2b2lkICAgIGV4ZWMoIGNvbnN0IFFCeXRlQXJyYXkgJiwgaW50IHZl ciA9IDAgKTsKICAgIHN0cnVjdCBRUmVnaW9uRGF0YSA6IHB1YmxpYyBRU2hhcmVkIHsKCgoKCVFS ZWN0IHJlY3Q7CglSZWdpb24gcmduOwoKCgoKCgoKCWJvb2wgICBpc19udWxsOwogICAgfSAqZGF0 YTsKCgoKCgoKCn07CgoKCgoKCgoKCgoKCgoKIAoKCgoKICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8 PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUVJlZ2lvbiAmICk7CiAgUURhdGFTdHJlYW0gJm9wZXJh dG9yPj4oIFFEYXRhU3RyZWFtICYsIFFSZWdpb24gJiApOwoKCgoKIyA0MyAiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3FldmVudC5oIiAyCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW1pbWUu aCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcW1hcC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FwYWlyLmgiIDEKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBU MSwgY2xhc3MgVDI+CnN0cnVjdCBRUGFpcgp7CiAgICB0eXBlZGVmIFQxIGZpcnN0X3R5cGU7CiAg ICB0eXBlZGVmIFQyIHNlY29uZF90eXBlOwoKICAgIFFQYWlyKCkKCTogZmlyc3QoIFQxKCkgKSwg c2Vjb25kKCBUMigpICkKICAgIHt9CiAgICBRUGFpciggY29uc3QgVDEmIHQxLCBjb25zdCBUMiYg dDIgKQoJOiBmaXJzdCggdDEgKSwgc2Vjb25kKCB0MiApCiAgICB7fQoKICAgIFQxIGZpcnN0Owog ICAgVDIgc2Vjb25kOwp9OwoKdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KICBib29sIG9w ZXJhdG9yPT0oIGNvbnN0IFFQYWlyPFQxLCBUMj4mIHgsIGNvbnN0IFFQYWlyPFQxLCBUMj4mIHkg KQp7CiAgICByZXR1cm4geC5maXJzdCA9PSB5LmZpcnN0ICYmIHguc2Vjb25kID09IHkuc2Vjb25k Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgogIGJvb2wgb3BlcmF0b3I8KCBjb25z dCBRUGFpcjxUMSwgVDI+JiB4LCBjb25zdCBRUGFpcjxUMSwgVDI+JiB5ICkKewogICAgIAogICAg IAogICAgIAogICAgcmV0dXJuIHguZmlyc3QgPCB5LmZpcnN0IHx8CSggISggeS5maXJzdCA8IHgu Zmlyc3QgKSAmJiB4LnNlY29uZCA8IHkuc2Vjb25kICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUMSwg Y2xhc3MgVDI+CiAgUVBhaXI8VDEsIFQyPiBxTWFrZVBhaXIoIGNvbnN0IFQxJiB4LCBjb25zdCBU MiYgeSApCnsKICAgIHJldHVybiBRUGFpcjxUMSwgVDI+KCB4LCB5ICk7Cn0KCgojIDQ1ICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcW1hcC5oIiAyCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUv cXZhbHVlbGlzdC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8u Li8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2l0ZXJhdG9yIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8y Ljk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMzQyICIvdXNyL2xpYi9nY2MtbGliL2k1ODYt bWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCiMgMzIgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9pdGVyYXRvciIgMiAzCgoKCgoKCgoKCgogCiAKIAojIDQ4ICIvdXNyL2xvY2FsL3F0L2lu Y2x1ZGUvcXZhbHVlbGlzdC5oIiAyCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFr ZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9saXN0IiAxIDMKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9saXN0Lmgi IDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCgoKCgoKdGVtcGxhdGUg PGNsYXNzIF9UcD4Kc3RydWN0IF9MaXN0X25vZGUgewogIHR5cGVkZWYgdm9pZCogX1ZvaWRfcG9p bnRlcjsKICBfVm9pZF9wb2ludGVyIF9NX25leHQ7CiAgX1ZvaWRfcG9pbnRlciBfTV9wcmV2Owog IF9UcCBfTV9kYXRhOwp9OwoKdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfUmVmLCBjbGFzcyBf UHRyPgpzdHJ1Y3QgX0xpc3RfaXRlcmF0b3IgewogIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1Rw LF9UcCYsX1RwKj4gICAgICAgICAgICAgaXRlcmF0b3I7CiAgdHlwZWRlZiBfTGlzdF9pdGVyYXRv cjxfVHAsY29uc3QgX1RwJixjb25zdCBfVHAqPiBjb25zdF9pdGVyYXRvcjsKICB0eXBlZGVmIF9M aXN0X2l0ZXJhdG9yPF9UcCxfUmVmLF9QdHI+ICAgICAgICAgICAgIF9TZWxmOwoKICB0eXBlZGVm IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYg X1RwIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfUHRyIHBvaW50ZXI7CiAgdHlwZWRlZiBfUmVmIHJl ZmVyZW5jZTsKICB0eXBlZGVmIF9MaXN0X25vZGU8X1RwPiBfTm9kZTsKICB0eXBlZGVmIHNpemVf dCBzaXplX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwoKICBfTm9k ZSogX01fbm9kZTsKCiAgX0xpc3RfaXRlcmF0b3IoX05vZGUqIF9feCkgOiBfTV9ub2RlKF9feCkg e30KICBfTGlzdF9pdGVyYXRvcigpIHt9CiAgX0xpc3RfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3Im IF9feCkgOiBfTV9ub2RlKF9feC5fTV9ub2RlKSB7fQoKICBib29sIG9wZXJhdG9yPT0oY29uc3Qg X1NlbGYmIF9feCkgY29uc3QgeyByZXR1cm4gX01fbm9kZSA9PSBfX3guX01fbm9kZTsgfQogIGJv b2wgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgX194KSBjb25zdCB7IHJldHVybiBfTV9ub2RlICE9 IF9feC5fTV9ub2RlOyB9CiAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICgq X01fbm9kZSkuX01fZGF0YTsgfQoKCiAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1 cm4gJihvcGVyYXRvciooKSk7IH0KCgogIF9TZWxmJiBvcGVyYXRvcisrKCkgeyAKICAgIF9NX25v ZGUgPSAoX05vZGUqKShfTV9ub2RlLT5fTV9uZXh0KTsKICAgIHJldHVybiAqdGhpczsKICB9CiAg X1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsgCiAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwogICAgKysq dGhpczsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7IAogICAg X01fbm9kZSA9IChfTm9kZSopKF9NX25vZGUtPl9NX3ByZXYpOwogICAgcmV0dXJuICp0aGlzOwog IH0KICBfU2VsZiBvcGVyYXRvci0tKGludCkgeyAKICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CiAg ICAtLSp0aGlzOwogICAgcmV0dXJuIF9fdG1wOwogIH0KfTsKCiMgMTIwICIvdXNyL2xpYi9nY2Mt bGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMv c3RsX2xpc3QuaCIgMwoKCgogCiAKIAogCiAKIAoKCgogCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNs YXNzIF9BbGxvY2F0b3IsIGJvb2wgX0lzU3RhdGljPgpjbGFzcyBfTGlzdF9hbGxvY19iYXNlIHsK cHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvY2F0b3I+ OjphbGxvY2F0b3JfdHlwZQogICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9yX3R5 cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9Ob2RlX2FsbG9jYXRvcjsgfQoKICBf TGlzdF9hbGxvY19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDogX05vZGVfYWxsb2Nh dG9yKF9fYSkge30KCnByb3RlY3RlZDoKICBfTGlzdF9ub2RlPF9UcD4qIF9NX2dldF9ub2RlKCkK ICAgeyByZXR1cm4gX05vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOyB9CiAgdm9pZCBfTV9wdXRf bm9kZShfTGlzdF9ub2RlPF9UcD4qIF9fcCkKICAgIHsgX05vZGVfYWxsb2NhdG9yLmRlYWxsb2Nh dGUoX19wLCAxKTsgfQoKcHJvdGVjdGVkOgogIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X0xpc3Rf bm9kZTxfVHA+LCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9yX3R5cGUKICAgICAgICAgICBfTm9kZV9h bGxvY2F0b3I7CiAgX0xpc3Rfbm9kZTxfVHA+KiBfTV9ub2RlOwp9OwoKIAoKdGVtcGxhdGUgPGNs YXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KY2xhc3MgX0xpc3RfYWxsb2NfYmFzZTxfVHAsIF9B bGxvY2F0b3IsIHRydWU+IHsKcHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0 czxfVHAsIF9BbGxvY2F0b3I+OjphbGxvY2F0b3JfdHlwZQogICAgICAgICAgYWxsb2NhdG9yX3R5 cGU7CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIGFsbG9j YXRvcl90eXBlKCk7IH0KCiAgX0xpc3RfYWxsb2NfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYp IHt9Cgpwcm90ZWN0ZWQ6CiAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9MaXN0X25v ZGU8X1RwPiwgX0FsbG9jYXRvcj46Ol9BbGxvY190eXBlCiAgICAgICAgICBfQWxsb2NfdHlwZTsK ICBfTGlzdF9ub2RlPF9UcD4qIF9NX2dldF9ub2RlKCkgeyByZXR1cm4gX0FsbG9jX3R5cGU6OmFs bG9jYXRlKDEpOyB9CiAgdm9pZCBfTV9wdXRfbm9kZShfTGlzdF9ub2RlPF9UcD4qIF9fcCkgeyBf QWxsb2NfdHlwZTo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9Cgpwcm90ZWN0ZWQ6CiAgX0xpc3Rfbm9k ZTxfVHA+KiBfTV9ub2RlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpj bGFzcyBfTGlzdF9iYXNlIAogIDogcHVibGljIF9MaXN0X2FsbG9jX2Jhc2U8X1RwLCBfQWxsb2Ms CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2NfdHJhaXRzPF9UcCwgX0FsbG9jPjo6 X1NfaW5zdGFuY2VsZXNzPgp7CnB1YmxpYzoKICB0eXBlZGVmIF9MaXN0X2FsbG9jX2Jhc2U8X1Rw LCBfQWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8X1RwLCBf QWxsb2M+OjpfU19pbnN0YW5jZWxlc3M+CiAgICAgICAgICBfQmFzZTsgCiAgdHlwZWRlZiB0eXBl bmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CgogIF9MaXN0X2Jhc2Uo Y29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkgOiBfQmFzZShfX2EpIHsKICAgIF9NX25vZGUgPSBf TV9nZXRfbm9kZSgpOwogICAgX01fbm9kZS0+X01fbmV4dCA9IF9NX25vZGU7CiAgICBfTV9ub2Rl LT5fTV9wcmV2ID0gX01fbm9kZTsKICB9CiAgfl9MaXN0X2Jhc2UoKSB7CiAgICBjbGVhcigpOwog ICAgX01fcHV0X25vZGUoX01fbm9kZSk7CiAgfQoKICB2b2lkIGNsZWFyKCk7Cn07CgojIDIyOSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0bF9saXN0LmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBf QWxsb2M+CnZvaWQgCl9MaXN0X2Jhc2U8X1RwLF9BbGxvYz46OmNsZWFyKCkgCnsKICBfTGlzdF9u b2RlPF9UcD4qIF9fY3VyID0gKF9MaXN0X25vZGU8X1RwPiopIF9NX25vZGUtPl9NX25leHQ7CiAg d2hpbGUgKF9fY3VyICE9IF9NX25vZGUpIHsKICAgIF9MaXN0X25vZGU8X1RwPiogX190bXAgPSBf X2N1cjsKICAgIF9fY3VyID0gKF9MaXN0X25vZGU8X1RwPiopIF9fY3VyLT5fTV9uZXh0OwogICAg ZGVzdHJveSgmX190bXAtPl9NX2RhdGEpOwogICAgX01fcHV0X25vZGUoX190bXApOwogIH0KICBf TV9ub2RlLT5fTV9uZXh0ID0gX01fbm9kZTsKICBfTV9ub2RlLT5fTV9wcmV2ID0gX01fbm9kZTsK fQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPCBfVHAgPiAg PgpjbGFzcyBsaXN0IDogcHJvdGVjdGVkIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+IHsKICB0eXBl ZGVmIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+IF9CYXNlOwpwcm90ZWN0ZWQ6CiAgdHlwZWRlZiB2 b2lkKiBfVm9pZF9wb2ludGVyOwoKcHVibGljOiAgICAgIAogIHR5cGVkZWYgX1RwIHZhbHVlX3R5 cGU7CiAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogIHR5cGVkZWYgY29uc3QgdmFsdWVf dHlwZSogY29uc3RfcG9pbnRlcjsKICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKICB0 eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVmIF9MaXN0 X25vZGU8X1RwPiBfTm9kZTsKICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CiAgdHlwZWRlZiBw dHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwoKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxv Y2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9y KCkgY29uc3QgeyByZXR1cm4gX0Jhc2U6OmdldF9hbGxvY2F0b3IoKTsgfQoKcHVibGljOgogIHR5 cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLF9UcCYsX1RwKj4gICAgICAgICAgICAgaXRlcmF0b3I7 CiAgdHlwZWRlZiBfTGlzdF9pdGVyYXRvcjxfVHAsY29uc3QgX1RwJixjb25zdCBfVHAqPiBjb25z dF9pdGVyYXRvcjsKCgogIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4g Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0 b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CgoKCgoKCgoKCnByb3RlY3RlZDoKCiAgdXNpbmcg X0Jhc2U6Ol9NX25vZGU7CiAgdXNpbmcgX0Jhc2U6Ol9NX3B1dF9ub2RlOwogIHVzaW5nIF9CYXNl OjpfTV9nZXRfbm9kZTsKCgpwcm90ZWN0ZWQ6CiAgX05vZGUqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0 IF9UcCYgX194KQogIHsKICAgIF9Ob2RlKiBfX3AgPSBfTV9nZXRfbm9kZSgpOwogICAgdHJ5ICB7 CiAgICAgIGNvbnN0cnVjdCgmX19wLT5fTV9kYXRhLCBfX3gpOwogICAgfQogICAgY2F0Y2goLi4u KSB7ICBfTV9wdXRfbm9kZShfX3ApIDsgdGhyb3c7IH0gOwogICAgcmV0dXJuIF9fcDsKICB9Cgog IF9Ob2RlKiBfTV9jcmVhdGVfbm9kZSgpCiAgewogICAgX05vZGUqIF9fcCA9IF9NX2dldF9ub2Rl KCk7CiAgICB0cnkgIHsKICAgICAgY29uc3RydWN0KCZfX3AtPl9NX2RhdGEpOwogICAgfQogICAg Y2F0Y2goLi4uKSB7ICBfTV9wdXRfbm9kZShfX3ApIDsgdGhyb3c7IH0gOwogICAgcmV0dXJuIF9f cDsKICB9CgpwdWJsaWM6CiAgZXhwbGljaXQgbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19h ID0gYWxsb2NhdG9yX3R5cGUoKSkgOiBfQmFzZShfX2EpIHt9CgogIGl0ZXJhdG9yIGJlZ2luKCkg ICAgICAgICAgICAgeyByZXR1cm4gKF9Ob2RlKikoX01fbm9kZS0+X01fbmV4dCk7IH0KICBjb25z dF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIChfTm9kZSopKF9NX25vZGUtPl9NX25l eHQpOyB9CgogIGl0ZXJhdG9yIGVuZCgpICAgICAgICAgICAgIHsgcmV0dXJuIF9NX25vZGU7IH0K ICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9ub2RlOyB9CgogIHJldmVy c2VfaXRlcmF0b3IgcmJlZ2luKCkgCiAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgp KTsgfQogIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgCiAgICB7IHJldHVy biBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQoKICByZXZlcnNlX2l0ZXJhdG9yIHJl bmQoKQogICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQogIGNvbnN0X3Jl dmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0CiAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0 ZXJhdG9yKGJlZ2luKCkpOyB9CgogIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub2Rl LT5fTV9uZXh0ID09IF9NX25vZGU7IH0KICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsKICAgIHNp emVfdHlwZSBfX3Jlc3VsdCA9IDA7CiAgICBkaXN0YW5jZShiZWdpbigpLCBlbmQoKSwgX19yZXN1 bHQpOwogICAgcmV0dXJuIF9fcmVzdWx0OwogIH0KICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25z dCB7IHJldHVybiBzaXplX3R5cGUoLTEpOyB9CgogIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0dXJu ICpiZWdpbigpOyB9CiAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gKmJl Z2luKCk7IH0KICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooLS1lbmQoKSk7IH0KICBjb25z dF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsgcmV0dXJuICooLS1lbmQoKSk7IH0KCiAgdm9pZCBz d2FwKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gpIHsgIDo6c3dhcChfTV9ub2RlLCBfX3guX01fbm9k ZSk7IH0KCiAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYg X194KSB7CiAgICBfTm9kZSogX190bXAgPSBfTV9jcmVhdGVfbm9kZShfX3gpOwogICAgX190bXAt Pl9NX25leHQgPSBfX3Bvc2l0aW9uLl9NX25vZGU7CiAgICBfX3RtcC0+X01fcHJldiA9IF9fcG9z aXRpb24uX01fbm9kZS0+X01fcHJldjsKICAgICgoX05vZGUqKSAoX19wb3NpdGlvbi5fTV9ub2Rl LT5fTV9wcmV2KSktPl9NX25leHQgPSBfX3RtcDsKICAgIF9fcG9zaXRpb24uX01fbm9kZS0+X01f cHJldiA9IF9fdG1wOwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBpdGVyYXRvciBpbnNlcnQoaXRl cmF0b3IgX19wb3NpdGlvbikgeyByZXR1cm4gaW5zZXJ0KF9fcG9zaXRpb24sIF9UcCgpKTsgfQoK ICAgCgogIHRlbXBsYXRlPGNsYXNzIF9JbnRlZ2VyPgogIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNo KGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKICAgICAgICAgICAg ICAgICAgICAgICAgICBfX3RydWVfdHlwZSkgewogICAgaW5zZXJ0KF9fcG9zLCAoc2l6ZV90eXBl KSBfX24sIChfVHApIF9feCk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+ CiAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmFsc2VfdHlwZSk7CgogIHRlbXBsYXRlIDxj bGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0 SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CiAgICB0eXBlZGVmIHR5 cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X0ludGVncmFsIF9JbnRlZ3JhbDsK ICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwo KSk7CiAgfQoKCgoKCgogIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19u LCBjb25zdCBfVHAmIF9feCk7CiAKICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgX1RwJiBfX3gpIHsg aW5zZXJ0KGJlZ2luKCksIF9feCk7IH0KICB2b2lkIHB1c2hfZnJvbnQoKSB7aW5zZXJ0KGJlZ2lu KCkpO30KICB2b2lkIHB1c2hfYmFjayhjb25zdCBfVHAmIF9feCkgeyBpbnNlcnQoZW5kKCksIF9f eCk7IH0KICB2b2lkIHB1c2hfYmFjaygpIHtpbnNlcnQoZW5kKCkpO30KCiAgaXRlcmF0b3IgZXJh c2UoaXRlcmF0b3IgX19wb3NpdGlvbikgewogICAgX05vZGUqIF9fbmV4dF9ub2RlID0gKF9Ob2Rl KikgKF9fcG9zaXRpb24uX01fbm9kZS0+X01fbmV4dCk7CiAgICBfTm9kZSogX19wcmV2X25vZGUg PSAoX05vZGUqKSAoX19wb3NpdGlvbi5fTV9ub2RlLT5fTV9wcmV2KTsKICAgIF9fcHJldl9ub2Rl LT5fTV9uZXh0ID0gX19uZXh0X25vZGU7CiAgICBfX25leHRfbm9kZS0+X01fcHJldiA9IF9fcHJl dl9ub2RlOwogICAgZGVzdHJveSgmX19wb3NpdGlvbi5fTV9ub2RlLT5fTV9kYXRhKTsKICAgIF9N X3B1dF9ub2RlKF9fcG9zaXRpb24uX01fbm9kZSk7CiAgICByZXR1cm4gaXRlcmF0b3IoX19uZXh0 X25vZGUpOwogIH0KICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBf X2xhc3QpOwogIHZvaWQgY2xlYXIoKSB7IF9CYXNlOjpjbGVhcigpOyB9CgogIHZvaWQgcmVzaXpl KHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCBfVHAmIF9feCk7CiAgdm9pZCByZXNpemUoc2l6 ZV90eXBlIF9fbmV3X3NpemUpIHsgcmVzaXplKF9fbmV3X3NpemUsIF9UcCgpKTsgfQoKICB2b2lk IHBvcF9mcm9udCgpIHsgZXJhc2UoYmVnaW4oKSk7IH0KICB2b2lkIHBvcF9iYWNrKCkgeyAKICAg IGl0ZXJhdG9yIF9fdG1wID0gZW5kKCk7CiAgICBlcmFzZSgtLV9fdG1wKTsKICB9CiAgbGlzdChz aXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCiAgICAgICBjb25zdCBhbGxvY2F0b3Jf dHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDogX0Jhc2UoX19hKQogICAgeyBpbnNl cnQoYmVnaW4oKSwgX19uLCBfX3ZhbHVlKTsgfQogIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIF9f bikKICAgIDogX0Jhc2UoYWxsb2NhdG9yX3R5cGUoKSkKICAgIHsgaW5zZXJ0KGJlZ2luKCksIF9f biwgX1RwKCkpOyB9CgoKCiAgIAogICAKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+ CiAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAg ICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDog X0Jhc2UoX19hKQogICAgeyBpbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQoKIyA0 MzMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4v Li4vaW5jbHVkZS9nKystMy9zdGxfbGlzdC5oIiAzCgogIGxpc3QoY29uc3QgbGlzdDxfVHAsIF9B bGxvYz4mIF9feCkgOiBfQmFzZShfX3guZ2V0X2FsbG9jYXRvcigpKQogICAgeyBpbnNlcnQoYmVn aW4oKSwgX194LmJlZ2luKCksIF9feC5lbmQoKSk7IH0KCiAgfmxpc3QoKSB7IH0KCiAgbGlzdDxf VHAsIF9BbGxvYz4mIG9wZXJhdG9yPShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194KTsKCnB1 YmxpYzoKICAgCiAgIAogICAKICAgCgogIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0 IF9UcCYgX192YWwpOwoKCgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lk IGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsK ICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfSW50ZWdy YWwgX0ludGVncmFsOwogICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0lu dGVncmFsKCkpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgogIHZvaWQgX01fYXNz aWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQog ICAgeyBhc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7IH0KCiAgdGVtcGxhdGUg PGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0 ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICAgICAgICAg ICAgICAgICBfX2ZhbHNlX3R5cGUpOwoKCgpwcm90ZWN0ZWQ6CiAgdm9pZCB0cmFuc2ZlcihpdGVy YXRvciBfX3Bvc2l0aW9uLCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKICAg IGlmIChfX3Bvc2l0aW9uICE9IF9fbGFzdCkgewogICAgICAgCiAgICAgICgoX05vZGUqKSAoX19s YXN0Ll9NX25vZGUtPl9NX3ByZXYpKS0+X01fbmV4dCAgICAgPSBfX3Bvc2l0aW9uLl9NX25vZGU7 CiAgICAgICgoX05vZGUqKSAoX19maXJzdC5fTV9ub2RlLT5fTV9wcmV2KSktPl9NX25leHQgICAg PSBfX2xhc3QuX01fbm9kZTsKICAgICAgKChfTm9kZSopIChfX3Bvc2l0aW9uLl9NX25vZGUtPl9N X3ByZXYpKS0+X01fbmV4dCA9IF9fZmlyc3QuX01fbm9kZTsgCgogICAgICAgCiAgICAgIF9Ob2Rl KiBfX3RtcCA9IChfTm9kZSopIChfX3Bvc2l0aW9uLl9NX25vZGUtPl9NX3ByZXYpOwogICAgICBf X3Bvc2l0aW9uLl9NX25vZGUtPl9NX3ByZXYgPSBfX2xhc3QuX01fbm9kZS0+X01fcHJldjsKICAg ICAgX19sYXN0Ll9NX25vZGUtPl9NX3ByZXYgICAgICA9IF9fZmlyc3QuX01fbm9kZS0+X01fcHJl djsgCiAgICAgIF9fZmlyc3QuX01fbm9kZS0+X01fcHJldiAgICA9IF9fdG1wOwogICAgfQogIH0K CnB1YmxpYzoKICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gpIHsK ICAgIGlmICghX194LmVtcHR5KCkpIAogICAgICB0cmFuc2ZlcihfX3Bvc2l0aW9uLCBfX3guYmVn aW4oKSwgX194LmVuZCgpKTsKICB9CiAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwg bGlzdCYsIGl0ZXJhdG9yIF9faSkgewogICAgaXRlcmF0b3IgX19qID0gX19pOwogICAgKytfX2o7 CiAgICBpZiAoX19wb3NpdGlvbiA9PSBfX2kgfHwgX19wb3NpdGlvbiA9PSBfX2opIHJldHVybjsK ICAgIHRyYW5zZmVyKF9fcG9zaXRpb24sIF9faSwgX19qKTsKICB9CiAgdm9pZCBzcGxpY2UoaXRl cmF0b3IgX19wb3NpdGlvbiwgbGlzdCYsIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFz dCkgewogICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSAKICAgICAgdHJhbnNmZXIoX19wb3NpdGlv biwgX19maXJzdCwgX19sYXN0KTsKICB9CiAgdm9pZCByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbHVl KTsKICB2b2lkIHVuaXF1ZSgpOwogIHZvaWQgbWVyZ2UobGlzdCYgX194KTsKICB2b2lkIHJldmVy c2UoKTsKICB2b2lkIHNvcnQoKTsKCgogIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPiB2b2lk IHJlbW92ZV9pZihfUHJlZGljYXRlKTsKICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0 ZT4gdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSk7CiAgdGVtcGxhdGUgPGNsYXNzIF9TdHJp Y3RXZWFrT3JkZXJpbmc+IHZvaWQgbWVyZ2UobGlzdCYsIF9TdHJpY3RXZWFrT3JkZXJpbmcpOwog IHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPiB2b2lkIHNvcnQoX1N0cmljdFdl YWtPcmRlcmluZyk7CgoKICBmcmllbmQgYm9vbCBvcGVyYXRvcj09IDw+ICAoCiAgICBjb25zdCBs aXN0JiBfX3gsIGNvbnN0IGxpc3QmIF9feSk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFz cyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgbGlzdDxfVHAsX0FsbG9jPiYg X194LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3Q8X1RwLF9BbGxvYz4mIF9feSkK ewogIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsX0FsbG9jPjo6X05vZGUgX05vZGU7CiAgX05v ZGUqIF9fZTEgPSBfX3guX01fbm9kZTsKICBfTm9kZSogX19lMiA9IF9feS5fTV9ub2RlOwogIF9O b2RlKiBfX24xID0gKF9Ob2RlKikgX19lMS0+X01fbmV4dDsKICBfTm9kZSogX19uMiA9IChfTm9k ZSopIF9fZTItPl9NX25leHQ7CiAgZm9yICggOyBfX24xICE9IF9fZTEgJiYgX19uMiAhPSBfX2Uy IDsKICAgICAgICAgIF9fbjEgPSAoX05vZGUqKSBfX24xLT5fTV9uZXh0LCBfX24yID0gKF9Ob2Rl KikgX19uMi0+X01fbmV4dCkKICAgIGlmIChfX24xLT5fTV9kYXRhICE9IF9fbjItPl9NX2RhdGEp CiAgICAgIHJldHVybiBmYWxzZTsKICByZXR1cm4gX19uMSA9PSBfX2UxICYmIF9fbjIgPT0gX19l MjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVy YXRvcjwoY29uc3QgbGlzdDxfVHAsX0FsbG9jPiYgX194LAogICAgICAgICAgICAgICAgICAgICAg Y29uc3QgbGlzdDxfVHAsX0FsbG9jPiYgX195KQp7CiAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9j b21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAs IGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgCnN3YXAobGlzdDxfVHAsIF9BbGxvYz4mIF9feCwg bGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKewogIF9feC5zd2FwKF9feSk7Cn0KCgoKCgp0ZW1wbGF0 ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+IHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgp2 b2lkIApsaXN0PF9UcCwgX0FsbG9jPjo6X01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9z aXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBf X2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfX2ZhbHNlX3R5cGUpCnsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19f Zmlyc3QpCiAgICBpbnNlcnQoX19wb3NpdGlvbiwgKl9fZmlyc3QpOwp9CgojIDU4MiAiL3Vzci9s aWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRl L2crKy0zL3N0bF9saXN0LmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+ CnZvaWQgCmxpc3Q8X1RwLCBfQWxsb2M+OjppbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6 ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpCnsKICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uKQog ICAgaW5zZXJ0KF9fcG9zaXRpb24sIF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNz IF9BbGxvYz4KbGlzdDxfVHAsX0FsbG9jPjo6aXRlcmF0b3IgbGlzdDxfVHAsIF9BbGxvYz46OmVy YXNlKGl0ZXJhdG9yIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgX19sYXN0KQp7CiAgd2hpbGUgKF9fZmlyc3QgIT0g X19sYXN0KQogICAgZXJhc2UoX19maXJzdCsrKTsKICByZXR1cm4gX19sYXN0Owp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQgbGlzdDxfVHAsIF9BbGxvYz46OnJlc2l6 ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpCnsKICBpdGVyYXRvciBfX2kg PSBiZWdpbigpOwogIHNpemVfdHlwZSBfX2xlbiA9IDA7CiAgZm9yICggOyBfX2kgIT0gZW5kKCkg JiYgX19sZW4gPCBfX25ld19zaXplOyArK19faSwgKytfX2xlbikKICAgIDsKICBpZiAoX19sZW4g PT0gX19uZXdfc2l6ZSkKICAgIGVyYXNlKF9faSwgZW5kKCkpOwogIGVsc2UgICAgICAgICAgICAg ICAgICAgICAgICAgICAKICAgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAtIF9fbGVuLCBfX3gp Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cmxpc3Q8X1RwLCBfQWxsb2M+ JiBsaXN0PF9UcCwgX0FsbG9jPjo6b3BlcmF0b3I9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBf X3gpCnsKICBpZiAodGhpcyAhPSAmX194KSB7CiAgICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2lu KCk7CiAgICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CiAgICBjb25zdF9pdGVyYXRvciBfX2Zp cnN0MiA9IF9feC5iZWdpbigpOwogICAgY29uc3RfaXRlcmF0b3IgX19sYXN0MiA9IF9feC5lbmQo KTsKICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIp IAogICAgICAqX19maXJzdDErKyA9ICpfX2ZpcnN0MisrOwogICAgaWYgKF9fZmlyc3QyID09IF9f bGFzdDIpCiAgICAgIGVyYXNlKF9fZmlyc3QxLCBfX2xhc3QxKTsKICAgIGVsc2UKICAgICAgaW5z ZXJ0KF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKICB9CiAgcmV0dXJuICp0aGlzOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQgbGlzdDxfVHAsIF9BbGxvYz46 OmFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CiAgaXRlcmF0b3IgX19p ID0gYmVnaW4oKTsKICBmb3IgKCA7IF9faSAhPSBlbmQoKSAmJiBfX24gPiAwOyArK19faSwgLS1f X24pCiAgICAqX19pID0gX192YWw7CiAgaWYgKF9fbiA+IDApCiAgICBpbnNlcnQoZW5kKCksIF9f biwgX192YWwpOwogIGVsc2UKICAgIGVyYXNlKF9faSwgZW5kKCkpOwp9CgoKCnRlbXBsYXRlIDxj bGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4gdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CnZvaWQK bGlzdDxfVHAsIF9BbGxvYz46Ol9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZmlyc3Qy LCBfSW5wdXRJdGVyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX19mYWxzZV90eXBlKQp7CiAgaXRlcmF0b3IgX19maXJzdDEgPSBiZWdpbigpOwogIGl0ZXJh dG9yIF9fbGFzdDEgPSBlbmQoKTsKICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19m aXJzdDIgIT0gX19sYXN0MjsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKICAgICpfX2ZpcnN0MSA9 ICpfX2ZpcnN0MjsKICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKICAgIGVyYXNlKF9fZmlyc3Qx LCBfX2xhc3QxKTsKICBlbHNlCiAgICBpbnNlcnQoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIp Owp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4Kdm9pZCBsaXN0PF9UcCwg X0FsbG9jPjo6cmVtb3ZlKGNvbnN0IF9UcCYgX192YWx1ZSkKewogIGl0ZXJhdG9yIF9fZmlyc3Qg PSBiZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOwogIHdoaWxlIChfX2ZpcnN0ICE9 IF9fbGFzdCkgewogICAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKICAgICsrX19uZXh0Owog ICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsdWUpIGVyYXNlKF9fZmlyc3QpOwogICAgX19maXJzdCA9 IF9fbmV4dDsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4Kdm9pZCBs aXN0PF9UcCwgX0FsbG9jPjo6dW5pcXVlKCkKewogIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigp OwogIGl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOwogIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0 dXJuOwogIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CiAgd2hpbGUgKCsrX19uZXh0ICE9IF9f bGFzdCkgewogICAgaWYgKCpfX2ZpcnN0ID09ICpfX25leHQpCiAgICAgIGVyYXNlKF9fbmV4dCk7 CiAgICBlbHNlCiAgICAgIF9fZmlyc3QgPSBfX25leHQ7CiAgICBfX25leHQgPSBfX2ZpcnN0Owog IH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgp2b2lkIGxpc3Q8X1RwLCBf QWxsb2M+OjptZXJnZShsaXN0PF9UcCwgX0FsbG9jPiYgX194KQp7CiAgaXRlcmF0b3IgX19maXJz dDEgPSBiZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKICBpdGVyYXRvciBfX2Zp cnN0MiA9IF9feC5iZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdDIgPSBfX3guZW5kKCk7CiAgd2hp bGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKICAgIGlmICgq X19maXJzdDIgPCAqX19maXJzdDEpIHsKICAgICAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDI7 CiAgICAgIHRyYW5zZmVyKF9fZmlyc3QxLCBfX2ZpcnN0MiwgKytfX25leHQpOwogICAgICBfX2Zp cnN0MiA9IF9fbmV4dDsKICAgIH0KICAgIGVsc2UKICAgICAgKytfX2ZpcnN0MTsKICBpZiAoX19m aXJzdDIgIT0gX19sYXN0MikgdHJhbnNmZXIoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQgbGlzdDxfVHAsIF9BbGxv Yz46OnJldmVyc2UoKSAKewogICAKICBpZiAoX01fbm9kZS0+X01fbmV4dCAhPSBfTV9ub2RlICYm CiAgICAgICgoX05vZGUqKSAoX01fbm9kZS0+X01fbmV4dCkpLT5fTV9uZXh0ICE9IF9NX25vZGUp IHsKICAgIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOwogICAgKytfX2ZpcnN0OwogICAgd2hp bGUgKF9fZmlyc3QgIT0gZW5kKCkpIHsKICAgICAgaXRlcmF0b3IgX19vbGQgPSBfX2ZpcnN0Owog ICAgICArK19fZmlyc3Q7CiAgICAgIHRyYW5zZmVyKGJlZ2luKCksIF9fb2xkLCBfX2ZpcnN0KTsK ICAgIH0KICB9Cn0gICAgCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQg bGlzdDxfVHAsIF9BbGxvYz46OnNvcnQoKQp7CiAgIAogIGlmIChfTV9ub2RlLT5fTV9uZXh0ICE9 IF9NX25vZGUgJiYKICAgICAgKChfTm9kZSopIChfTV9ub2RlLT5fTV9uZXh0KSktPl9NX25leHQg IT0gX01fbm9kZSkgewogICAgbGlzdDxfVHAsIF9BbGxvYz4gX19jYXJyeTsKICAgIGxpc3Q8X1Rw LCBfQWxsb2M+IF9fY291bnRlcls2NF07CiAgICBpbnQgX19maWxsID0gMDsKICAgIHdoaWxlICgh ZW1wdHkoKSkgewogICAgICBfX2NhcnJ5LnNwbGljZShfX2NhcnJ5LmJlZ2luKCksICp0aGlzLCBi ZWdpbigpKTsKICAgICAgaW50IF9faSA9IDA7CiAgICAgIHdoaWxlKF9faSA8IF9fZmlsbCAmJiAh X19jb3VudGVyW19faV0uZW1wdHkoKSkgewogICAgICAgIF9fY291bnRlcltfX2ldLm1lcmdlKF9f Y2FycnkpOwogICAgICAgIF9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19pKytdKTsKICAgICAgfQog ICAgICBfX2NhcnJ5LnN3YXAoX19jb3VudGVyW19faV0pOyAgICAgICAgIAogICAgICBpZiAoX19p ID09IF9fZmlsbCkgKytfX2ZpbGw7CiAgICB9IAoKICAgIGZvciAoaW50IF9faSA9IDE7IF9faSA8 IF9fZmlsbDsgKytfX2kpCiAgICAgIF9fY291bnRlcltfX2ldLm1lcmdlKF9fY291bnRlcltfX2kt MV0pOwogICAgc3dhcChfX2NvdW50ZXJbX19maWxsLTFdKTsKICB9Cn0KCgoKdGVtcGxhdGUgPGNs YXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4Kdm9pZCBs aXN0PF9UcCwgX0FsbG9jPjo6cmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKQp7CiAgaXRlcmF0 b3IgX19maXJzdCA9IGJlZ2luKCk7CiAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CiAgd2hpbGUg KF9fZmlyc3QgIT0gX19sYXN0KSB7CiAgICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OwogICAg KytfX25leHQ7CiAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgZXJhc2UoX19maXJzdCk7CiAgICBf X2ZpcnN0ID0gX19uZXh0OwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9j PiB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4Kdm9pZCBsaXN0PF9UcCwgX0FsbG9j Pjo6dW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKewogIGl0ZXJhdG9yIF9f Zmlyc3QgPSBiZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOwogIGlmIChfX2ZpcnN0 ID09IF9fbGFzdCkgcmV0dXJuOwogIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CiAgd2hpbGUg KCsrX19uZXh0ICE9IF9fbGFzdCkgewogICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpf X25leHQpKQogICAgICBlcmFzZShfX25leHQpOwogICAgZWxzZQogICAgICBfX2ZpcnN0ID0gX19u ZXh0OwogICAgX19uZXh0ID0gX19maXJzdDsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNs YXNzIF9BbGxvYz4gdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CnZvaWQgbGlz dDxfVHAsIF9BbGxvYz46Om1lcmdlKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQp7CiAgaXRlcmF0 b3IgX19maXJzdDEgPSBiZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKICBpdGVy YXRvciBfX2ZpcnN0MiA9IF9feC5iZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdDIgPSBfX3guZW5k KCk7CiAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikK ICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CiAgICAgIGl0ZXJhdG9yIF9f bmV4dCA9IF9fZmlyc3QyOwogICAgICB0cmFuc2ZlcihfX2ZpcnN0MSwgX19maXJzdDIsICsrX19u ZXh0KTsKICAgICAgX19maXJzdDIgPSBfX25leHQ7CiAgICB9CiAgICBlbHNlCiAgICAgICsrX19m aXJzdDE7CiAgaWYgKF9fZmlyc3QyICE9IF9fbGFzdDIpIHRyYW5zZmVyKF9fbGFzdDEsIF9fZmly c3QyLCBfX2xhc3QyKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1w bGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4Kdm9pZCBsaXN0PF9UcCwgX0FsbG9jPjo6 c29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKewogICAKICBpZiAoX01fbm9kZS0+X01f bmV4dCAhPSBfTV9ub2RlICYmCiAgICAgICgoX05vZGUqKSAoX01fbm9kZS0+X01fbmV4dCkpLT5f TV9uZXh0ICE9IF9NX25vZGUpIHsKICAgIGxpc3Q8X1RwLCBfQWxsb2M+IF9fY2Fycnk7CiAgICBs aXN0PF9UcCwgX0FsbG9jPiBfX2NvdW50ZXJbNjRdOwogICAgaW50IF9fZmlsbCA9IDA7CiAgICB3 aGlsZSAoIWVtcHR5KCkpIHsKICAgICAgX19jYXJyeS5zcGxpY2UoX19jYXJyeS5iZWdpbigpLCAq dGhpcywgYmVnaW4oKSk7CiAgICAgIGludCBfX2kgPSAwOwogICAgICB3aGlsZShfX2kgPCBfX2Zp bGwgJiYgIV9fY291bnRlcltfX2ldLmVtcHR5KCkpIHsKICAgICAgICBfX2NvdW50ZXJbX19pXS5t ZXJnZShfX2NhcnJ5LCBfX2NvbXApOwogICAgICAgIF9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19p KytdKTsKICAgICAgfQogICAgICBfX2NhcnJ5LnN3YXAoX19jb3VudGVyW19faV0pOyAgICAgICAg IAogICAgICBpZiAoX19pID09IF9fZmlsbCkgKytfX2ZpbGw7CiAgICB9IAoKICAgIGZvciAoaW50 IF9faSA9IDE7IF9faSA8IF9fZmlsbDsgKytfX2kpIAogICAgICBfX2NvdW50ZXJbX19pXS5tZXJn ZShfX2NvdW50ZXJbX19pLTFdLCBfX2NvbXApOwogICAgc3dhcChfX2NvdW50ZXJbX19maWxsLTFd KTsKICB9Cn0KCgoKCgoKCgogIAoKCgogCiAKIAojIDM0ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYt bWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvbGlzdCIgMiAz CgoKCgogCiAKIAojIDQ5ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXZhbHVlbGlzdC5oIiAyCgoK CiAKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgUVZhbHVlTGlzdE5vZGUKewpwdWJsaWM6 CiAgICBRVmFsdWVMaXN0Tm9kZSggY29uc3QgVCYgdCApIDogZGF0YSggdCApIHsgfQogICAgUVZh bHVlTGlzdE5vZGUoKSB7IH0KCgoKCgogICAgUVZhbHVlTGlzdE5vZGU8VD4qIG5leHQ7CiAgICBR VmFsdWVMaXN0Tm9kZTxUPiogcHJldjsKICAgIFQgZGF0YTsKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+ CmNsYXNzIFFWYWx1ZUxpc3RJdGVyYXRvcgp7CiBwdWJsaWM6CiAgICAgCgoKICAgIHR5cGVkZWYg UVZhbHVlTGlzdE5vZGU8VD4qIE5vZGVQdHI7CgogICAgdHlwZWRlZiBzdGQ6OmJpZGlyZWN0aW9u YWxfaXRlcmF0b3JfdGFnICBpdGVyYXRvcl9jYXRlZ29yeTsKCiAgICB0eXBlZGVmIFQgICAgICAg IHZhbHVlX3R5cGU7CiAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CgogICAgdHlwZWRlZiBw dHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKCgoKICAgIHR5cGVkZWYgVCogICBwb2ludGVyOwog ICAgdHlwZWRlZiBUJiByZWZlcmVuY2U7CgogICAgIAoKCiAgICBOb2RlUHRyIG5vZGU7CgogICAg IAoKCiAgICBRVmFsdWVMaXN0SXRlcmF0b3IoKSA6IG5vZGUoIDAgKSB7fQogICAgUVZhbHVlTGlz dEl0ZXJhdG9yKCBOb2RlUHRyIHAgKSA6IG5vZGUoIHAgKSB7fQogICAgUVZhbHVlTGlzdEl0ZXJh dG9yKCBjb25zdCBRVmFsdWVMaXN0SXRlcmF0b3I8VD4mIGl0ICkgOiBub2RlKCBpdC5ub2RlICkg e30KCiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiYgaXQg KSBjb25zdCB7IHJldHVybiBub2RlID09IGl0Lm5vZGU7IH0KICAgIGJvb2wgb3BlcmF0b3IhPSgg Y29uc3QgUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+JiBpdCApIGNvbnN0IHsgcmV0dXJuIG5vZGUgIT0g aXQubm9kZTsgfQogICAgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gbm9kZS0+ ZGF0YTsgfQogICAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gbm9kZS0+ZGF0YTsgfQogICAgIAog ICAgIAoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygpIHsKCW5vZGUgPSBu b2RlLT5uZXh0OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxU PiBvcGVyYXRvcisrKGludCkgewoJUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+IHRtcCA9ICp0aGlzOwoJ bm9kZSA9IG5vZGUtPm5leHQ7CglyZXR1cm4gdG1wOwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVy YXRvcjxUPiYgb3BlcmF0b3ItLSgpIHsKCW5vZGUgPSBub2RlLT5wcmV2OwoJcmV0dXJuICp0aGlz OwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiBvcGVyYXRvci0tKGludCkgewoJUVZh bHVlTGlzdEl0ZXJhdG9yPFQ+IHRtcCA9ICp0aGlzOwoJbm9kZSA9IG5vZGUtPnByZXY7CglyZXR1 cm4gdG1wOwogICAgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgUVZhbHVlTGlzdENvbnN0 SXRlcmF0b3IKewogcHVibGljOgogICAgIAoKCiAgICB0eXBlZGVmIFFWYWx1ZUxpc3ROb2RlPFQ+ KiBOb2RlUHRyOwoKICAgIHR5cGVkZWYgc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAg aXRlcmF0b3JfY2F0ZWdvcnk7CgogICAgdHlwZWRlZiBUICAgICAgICB2YWx1ZV90eXBlOwogICAg dHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwoKICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJl bmNlX3R5cGU7CgoKCiAgICB0eXBlZGVmIGNvbnN0IFQqICAgcG9pbnRlcjsKICAgIHR5cGVkZWYg Y29uc3QgVCYgcmVmZXJlbmNlOwoKICAgICAKCgogICAgTm9kZVB0ciBub2RlOwoKICAgICAKCgog ICAgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3IoKSA6IG5vZGUoIDAgKSB7fQogICAgUVZhbHVlTGlz dENvbnN0SXRlcmF0b3IoIE5vZGVQdHIgcCApIDogbm9kZSggcCApIHt9CiAgICBRVmFsdWVMaXN0 Q29uc3RJdGVyYXRvciggY29uc3QgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8VD4mIGl0ICkgOiBu b2RlKCBpdC5ub2RlICkge30KICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yKCBjb25zdCBRVmFs dWVMaXN0SXRlcmF0b3I8VD4mIGl0ICkgOiBub2RlKCBpdC5ub2RlICkge30KCiAgICBib29sIG9w ZXJhdG9yPT0oIGNvbnN0IFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFQ+JiBpdCApIGNvbnN0IHsg cmV0dXJuIG5vZGUgPT0gaXQubm9kZTsgfQogICAgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRVmFs dWVMaXN0Q29uc3RJdGVyYXRvcjxUPiYgaXQgKSBjb25zdCB7IHJldHVybiBub2RlICE9IGl0Lm5v ZGU7IH0KICAgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIG5vZGUtPmRhdGE7 IH0KICAgICAKICAgICAKCiAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3Ir KygpIHsKCW5vZGUgPSBub2RlLT5uZXh0OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1 ZUxpc3RDb25zdEl0ZXJhdG9yPFQ+IG9wZXJhdG9yKysoaW50KSB7CglRVmFsdWVMaXN0Q29uc3RJ dGVyYXRvcjxUPiB0bXAgPSAqdGhpczsKCW5vZGUgPSBub2RlLT5uZXh0OwoJcmV0dXJuIHRtcDsK ICAgIH0KCiAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3ItLSgpIHsKCW5v ZGUgPSBub2RlLT5wcmV2OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3RDb25z dEl0ZXJhdG9yPFQ+IG9wZXJhdG9yLS0oaW50KSB7CglRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxU PiB0bXAgPSAqdGhpczsKCW5vZGUgPSBub2RlLT5wcmV2OwoJcmV0dXJuIHRtcDsKICAgIH0KfTsK CnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBRVmFsdWVMaXN0UHJpdmF0ZSAKICAgIDogcHVibGlj IFFTaGFyZWQKewpwdWJsaWM6CiAgICAgCgoKICAgIHR5cGVkZWYgUVZhbHVlTGlzdEl0ZXJhdG9y PFQ+IEl0ZXJhdG9yOwogICAgdHlwZWRlZiBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiBDb25z dEl0ZXJhdG9yOwogICAgdHlwZWRlZiBRVmFsdWVMaXN0Tm9kZTxUPiBOb2RlOwogICAgdHlwZWRl ZiBRVmFsdWVMaXN0Tm9kZTxUPiogTm9kZVB0cjsKICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlw ZTsKCiAgICAgCgoKICAgIFFWYWx1ZUxpc3RQcml2YXRlKCk7CiAgICBRVmFsdWVMaXN0UHJpdmF0 ZSggY29uc3QgUVZhbHVlTGlzdFByaXZhdGU8VD4mIF9wICk7CgogICAgdm9pZCBkZXJlZkFuZERl bGV0ZSgpICAKICAgIHsKCWlmICggZGVyZWYoKSApCgkgICAgZGVsZXRlIHRoaXM7CiAgICB9CgoK CgoKICAgIH5RVmFsdWVMaXN0UHJpdmF0ZSgpOwoKICAgIEl0ZXJhdG9yIGluc2VydCggSXRlcmF0 b3IgaXQsIGNvbnN0IFQmIHggKTsKICAgIEl0ZXJhdG9yIHJlbW92ZSggSXRlcmF0b3IgaXQgKTsK ICAgIE5vZGVQdHIgZmluZCggTm9kZVB0ciBzdGFydCwgY29uc3QgVCYgeCApIGNvbnN0OwogICAg aW50IGZpbmRJbmRleCggTm9kZVB0ciBzdGFydCwgY29uc3QgVCYgeCApIGNvbnN0OwogICAgdWlu dCBjb250YWlucyggY29uc3QgVCYgeCApIGNvbnN0OwogICAgdWludCByZW1vdmUoIGNvbnN0IFQm IHggKTsKICAgIE5vZGVQdHIgYXQoIHNpemVfdHlwZSBpICkgY29uc3Q7CiAgICB2b2lkIGNsZWFy KCk7CgogICAgTm9kZVB0ciBub2RlOwogICAgc2l6ZV90eXBlIG5vZGVzOwp9OwoKdGVtcGxhdGUg PGNsYXNzIFQ+CiAgUVZhbHVlTGlzdFByaXZhdGU8VD46OlFWYWx1ZUxpc3RQcml2YXRlKCkKewog ICAgbm9kZSA9IG5ldyBOb2RlOyBub2RlLT5uZXh0ID0gbm9kZS0+cHJldiA9IG5vZGU7IG5vZGVz ID0gMDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgUVZhbHVlTGlzdFByaXZhdGU8VD46OlFWYWx1 ZUxpc3RQcml2YXRlKCBjb25zdCBRVmFsdWVMaXN0UHJpdmF0ZTxUPiYgX3AgKQogICAgOiBRU2hh cmVkKCkKewogICAgbm9kZSA9IG5ldyBOb2RlOyBub2RlLT5uZXh0ID0gbm9kZS0+cHJldiA9IG5v ZGU7IG5vZGVzID0gMDsKICAgIEl0ZXJhdG9yIGIoIF9wLm5vZGUtPm5leHQgKTsKICAgIEl0ZXJh dG9yIGUoIF9wLm5vZGUgKTsKICAgIEl0ZXJhdG9yIGkoIG5vZGUgKTsKICAgIHdoaWxlKCBiICE9 IGUgKQoJaW5zZXJ0KCBpLCAqYisrICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIFFWYWx1ZUxp c3RQcml2YXRlPFQ+Ojp+UVZhbHVlTGlzdFByaXZhdGUoKSB7CiAgICBOb2RlUHRyIHAgPSBub2Rl LT5uZXh0OwogICAgd2hpbGUoIHAgIT0gbm9kZSApIHsKCU5vZGVQdHIgeCA9IHAtPm5leHQ7Cglk ZWxldGUgcDsKCXAgPSB4OwogICAgfQogICAgZGVsZXRlIG5vZGU7Cn0KCnRlbXBsYXRlIDxjbGFz cyBUPgogIHR5cGVuYW1lICBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6SXRlcmF0b3IgUVZhbHVlTGlz dFByaXZhdGU8VD46Omluc2VydCggdHlwZW5hbWUgIFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjpJdGVy YXRvciBpdCwgY29uc3QgVCYgeCApCnsKICAgIE5vZGVQdHIgcCA9IG5ldyBOb2RlKCB4ICk7CiAg ICBwLT5uZXh0ID0gaXQubm9kZTsKICAgIHAtPnByZXYgPSBpdC5ub2RlLT5wcmV2OwogICAgaXQu bm9kZS0+cHJldi0+bmV4dCA9IHA7CiAgICBpdC5ub2RlLT5wcmV2ID0gcDsKICAgIG5vZGVzKys7 CiAgICByZXR1cm4gcDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgdHlwZW5hbWUgIFFWYWx1ZUxp c3RQcml2YXRlPFQ+OjpJdGVyYXRvciBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6cmVtb3ZlKCB0eXBl bmFtZSAgUVZhbHVlTGlzdFByaXZhdGU8VD46Okl0ZXJhdG9yIGl0ICkKewogICAgKCggIGl0Lm5v ZGUgIT0gbm9kZSAgKSA/ICh2b2lkKTAgOiBxV2FybmluZygiQVNTRVJUOiBcIiVzXCIgaW4gJXMg KCVkKSIsIml0Lm5vZGUgIT0gbm9kZSIsIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWVsaXN0 LmgiLDI4OSkpIDsKICAgIE5vZGVQdHIgbmV4dCA9IGl0Lm5vZGUtPm5leHQ7CiAgICBOb2RlUHRy IHByZXYgPSBpdC5ub2RlLT5wcmV2OwogICAgcHJldi0+bmV4dCA9IG5leHQ7CiAgICBuZXh0LT5w cmV2ID0gcHJldjsKICAgIGRlbGV0ZSBpdC5ub2RlOwogICAgbm9kZXMtLTsKICAgIHJldHVybiBJ dGVyYXRvciggbmV4dCApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICB0eXBlbmFtZSAgUVZhbHVl TGlzdFByaXZhdGU8VD46Ok5vZGVQdHIgUVZhbHVlTGlzdFByaXZhdGU8VD46OmZpbmQoIHR5cGVu YW1lICBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6Tm9kZVB0ciBzdGFydCwgY29uc3QgVCYgeCApIGNv bnN0CnsKICAgIENvbnN0SXRlcmF0b3IgZmlyc3QoIHN0YXJ0ICk7CiAgICBDb25zdEl0ZXJhdG9y IGxhc3QoIG5vZGUgKTsKICAgIHdoaWxlKCBmaXJzdCAhPSBsYXN0KSB7CglpZiAoICpmaXJzdCA9 PSB4ICkKCSAgICByZXR1cm4gZmlyc3Qubm9kZTsKCSsrZmlyc3Q7CiAgICB9CiAgICByZXR1cm4g bGFzdC5ub2RlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBpbnQgUVZhbHVlTGlzdFByaXZhdGU8 VD46OmZpbmRJbmRleCggdHlwZW5hbWUgIFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjpOb2RlUHRyIHN0 YXJ0LCBjb25zdCBUJiB4ICkgY29uc3QKewogICAgQ29uc3RJdGVyYXRvciBmaXJzdCggc3RhcnQg KTsKICAgIENvbnN0SXRlcmF0b3IgbGFzdCggbm9kZSApOwogICAgaW50IHBvcyA9IDA7CiAgICB3 aGlsZSggZmlyc3QgIT0gbGFzdCkgewoJaWYgKCAqZmlyc3QgPT0geCApCgkgICAgcmV0dXJuIHBv czsKCSsrZmlyc3Q7CgkrK3BvczsKICAgIH0KICAgIHJldHVybiAtMTsKfQoKdGVtcGxhdGUgPGNs YXNzIFQ+CiAgdWludCBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6Y29udGFpbnMoIGNvbnN0IFQmIHgg KSBjb25zdAp7CiAgICB1aW50IHJlc3VsdCA9IDA7CiAgICBJdGVyYXRvciBmaXJzdCA9IEl0ZXJh dG9yKCBub2RlLT5uZXh0ICk7CiAgICBJdGVyYXRvciBsYXN0ID0gSXRlcmF0b3IoIG5vZGUgKTsK ICAgIHdoaWxlKCBmaXJzdCAhPSBsYXN0KSB7CglpZiAoICpmaXJzdCA9PSB4ICkKCSAgICArK3Jl c3VsdDsKCSsrZmlyc3Q7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgVD4KICB1aW50IFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjpyZW1vdmUoIGNvbnN0IFQmIHggKQp7 CiAgICB1aW50IHJlc3VsdCA9IDA7CiAgICBJdGVyYXRvciBmaXJzdCA9IEl0ZXJhdG9yKCBub2Rl LT5uZXh0ICk7CiAgICBJdGVyYXRvciBsYXN0ID0gSXRlcmF0b3IoIG5vZGUgKTsKICAgIHdoaWxl KCBmaXJzdCAhPSBsYXN0KSB7CglpZiAoICpmaXJzdCA9PSB4ICkgewoJICAgIGZpcnN0ID0gcmVt b3ZlKCBmaXJzdCApOwoJICAgICsrcmVzdWx0OwoJfSBlbHNlCgkgICAgKytmaXJzdDsKICAgIH0K ICAgIHJldHVybiByZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIHR5cGVuYW1lICBRVmFs dWVMaXN0UHJpdmF0ZTxUPjo6Tm9kZVB0ciBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6YXQoIHNpemVf dHlwZSBpICkgY29uc3QKewogICAgKCggIGkgPD0gbm9kZXMgICkgPyAodm9pZCkwIDogcVdhcm5p bmcoIkFTU0VSVDogXCIlc1wiIGluICVzICglZCkiLCJpIDw9IG5vZGVzIiwiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3F2YWx1ZWxpc3QuaCIsMzYwKSkgOwogICAgTm9kZVB0ciBwID0gbm9kZS0+bmV4 dDsKICAgIGZvciggc2l6ZV90eXBlIHggPSAwOyB4IDwgaTsgKyt4ICkKCXAgPSBwLT5uZXh0Owog ICAgcmV0dXJuIHA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIHZvaWQgUVZhbHVlTGlzdFByaXZh dGU8VD46OmNsZWFyKCkKewogICAgbm9kZXMgPSAwOwogICAgTm9kZVB0ciBwID0gbm9kZS0+bmV4 dDsKICAgIHdoaWxlKCBwICE9IG5vZGUgKSB7CglOb2RlUHRyIG5leHQgPSBwLT5uZXh0OwoJZGVs ZXRlIHA7CglwID0gbmV4dDsKICAgIH0KICAgIG5vZGUtPm5leHQgPSBub2RlLT5wcmV2ID0gbm9k ZTsKfQoKCgoKCgoKCgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBRVmFsdWVMaXN0CnsK cHVibGljOgogICAgIAoKCiAgICB0eXBlZGVmIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiBpdGVyYXRv cjsKICAgIHR5cGVkZWYgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8VD4gY29uc3RfaXRlcmF0b3I7 CiAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRl cjsKICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKICAgIHR5cGVk ZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwogICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBj b25zdF9yZWZlcmVuY2U7CiAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CgogICAgdHlwZWRl ZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKCgoKCiAgICAgCgoKICAgIFFWYWx1ZUxpc3Qo KSB7IHNoID0gbmV3IFFWYWx1ZUxpc3RQcml2YXRlPFQ+OyB9CiAgICBRVmFsdWVMaXN0KCBjb25z dCBRVmFsdWVMaXN0PFQ+JiBsICkgeyBzaCA9IGwuc2g7IHNoLT5yZWYoKTsgfQoKCgoKCiAgICBR VmFsdWVMaXN0KCBjb25zdCB0eXBlbmFtZSAgc3RkOjpsaXN0PFQ+JiBsICkKICAgIHsKCXNoID0g bmV3IFFWYWx1ZUxpc3RQcml2YXRlPFQ+OwoJcUNvcHkoIGwuYmVnaW4oKSwgbC5lbmQoKSwgc3Rk OjpiYWNrX2luc2VydGVyKCAqdGhpcyApICk7CiAgICB9CgogICAgflFWYWx1ZUxpc3QoKSB7IHNo LT5kZXJlZkFuZERlbGV0ZSgpOyB9CgogICAgUVZhbHVlTGlzdDxUPiYgb3BlcmF0b3I9ICggY29u c3QgUVZhbHVlTGlzdDxUPiYgbCApCiAgICB7CglsLnNoLT5yZWYoKTsKCXNoLT5kZXJlZkFuZERl bGV0ZSgpOwoJc2ggPSBsLnNoOwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3Q8 VD4mIG9wZXJhdG9yPSAoIGNvbnN0IHR5cGVuYW1lICBzdGQ6Omxpc3Q8VD4mIGwgKQogICAgewoJ ZGV0YWNoKCk7CglxQ29weSggbC5iZWdpbigpLCBsLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIo ICp0aGlzICkgKTsKCXJldHVybiAqdGhpczsKICAgIH0KICAgIGJvb2wgb3BlcmF0b3I9PSAoIGNv bnN0IHR5cGVuYW1lICBzdGQ6Omxpc3Q8VD4mIGwgKSBjb25zdAogICAgewoJaWYgKCBzaXplKCkg IT0gbC5zaXplKCkgKQoJICAgIHJldHVybiBGQUxTRTsKCWNvbnN0X2l0ZXJhdG9yIGl0MiA9IGJl Z2luKCk7CgoJdHlwZW5hbWUKCglzdGQ6Omxpc3Q8VD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbC5i ZWdpbigpOwoJZm9yICggOyBpdDIgIT0gZW5kKCk7ICsraXQyLCArK2l0ICkKCWlmICggISgoKml0 MikgPT0gKCppdCkpICkKCSAgICByZXR1cm4gRkFMU0U7CglyZXR1cm4gVFJVRTsKICAgIH0KCgoK CgogICAgYm9vbCBvcGVyYXRvcj09ICggY29uc3QgUVZhbHVlTGlzdDxUPiYgbCApIGNvbnN0Owog ICAgYm9vbCBvcGVyYXRvciE9ICggY29uc3QgUVZhbHVlTGlzdDxUPiYgbCApIGNvbnN0IHsgcmV0 dXJuICEoICp0aGlzID09IGwgKTsgfQogICAgaXRlcmF0b3IgYmVnaW4oKSB7IGRldGFjaCgpOyBy ZXR1cm4gaXRlcmF0b3IoIHNoLT5ub2RlLT5uZXh0ICk7IH0KICAgIGNvbnN0X2l0ZXJhdG9yIGJl Z2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoIHNoLT5ub2RlLT5uZXh0ICk7IH0K ICAgIGl0ZXJhdG9yIGVuZCgpIHsgZGV0YWNoKCk7IHJldHVybiBpdGVyYXRvciggc2gtPm5vZGUg KTsgfQogICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0 b3IoIHNoLT5ub2RlICk7IH0KICAgIGl0ZXJhdG9yIGluc2VydCggaXRlcmF0b3IgaXQsIGNvbnN0 IFQmIHggKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPmluc2VydCggaXQsIHggKTsgfQogICAgdWlu dCByZW1vdmUoIGNvbnN0IFQmIHggKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPnJlbW92ZSggeCAp OyB9CiAgICB2b2lkIGNsZWFyKCk7CgogICAgUVZhbHVlTGlzdDxUPiYgb3BlcmF0b3I8PCAoIGNv bnN0IFQmIHggKQogICAgewoJYXBwZW5kKCB4ICk7CglyZXR1cm4gKnRoaXM7CiAgICB9CgogICAg c2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBzaC0+bm9kZXM7IH0KICAgIGJvb2wgZW1w dHkoKSBjb25zdCB7IHJldHVybiBzaC0+bm9kZXMgPT0gMDsgfQogICAgdm9pZCBwdXNoX2Zyb250 KCBjb25zdCBUJiB4ICkgeyBkZXRhY2goKTsgc2gtPmluc2VydCggYmVnaW4oKSwgeCApOyB9CiAg ICB2b2lkIHB1c2hfYmFjayggY29uc3QgVCYgeCApIHsgZGV0YWNoKCk7IHNoLT5pbnNlcnQoIGVu ZCgpLCB4ICk7IH0KICAgIGl0ZXJhdG9yIGVyYXNlKCBpdGVyYXRvciBwb3MgKSB7IGRldGFjaCgp OyByZXR1cm4gc2gtPnJlbW92ZSggcG9zICk7IH0KICAgIGl0ZXJhdG9yIGVyYXNlKCBpdGVyYXRv ciBmaXJzdCwgaXRlcmF0b3IgbGFzdCApOwogICAgcmVmZXJlbmNlIGZyb250KCkgeyAgOyByZXR1 cm4gKmJlZ2luKCk7IH0KICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgIDsgcmV0 dXJuICpiZWdpbigpOyB9CiAgICByZWZlcmVuY2UgYmFjaygpIHsgIDsgcmV0dXJuICooLS1lbmQo KSk7IH0KICAgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeyAgOyByZXR1cm4gKigtLWVu ZCgpKTsgfQogICAgdm9pZCBwb3BfZnJvbnQoKSB7ICA7IGVyYXNlKCBiZWdpbigpICk7IH0KICAg IHZvaWQgcG9wX2JhY2soKSB7CgkgOwoJaXRlcmF0b3IgdG1wID0gZW5kKCk7CgllcmFzZSggLS10 bXAgKTsKICAgIH0KICAgIHZvaWQgaW5zZXJ0KCBpdGVyYXRvciBwb3MsIHNpemVfdHlwZSBuLCBj b25zdCBUJiB4ICk7CiAgICAgCiAgICAgCiAgICAgCiAgICAgCgoKCgoKCiAgICBRVmFsdWVMaXN0 PFQ+IG9wZXJhdG9yKyAoIGNvbnN0IFFWYWx1ZUxpc3Q8VD4mIGwgKSBjb25zdDsKICAgIFFWYWx1 ZUxpc3Q8VD4mIG9wZXJhdG9yKz0gKCBjb25zdCBRVmFsdWVMaXN0PFQ+JiBsICk7CgogICAgaXRl cmF0b3IgZnJvbUxhc3QoKSB7IGRldGFjaCgpOyByZXR1cm4gaXRlcmF0b3IoIHNoLT5ub2RlLT5w cmV2ICk7IH0KICAgIGNvbnN0X2l0ZXJhdG9yIGZyb21MYXN0KCkgY29uc3QgeyByZXR1cm4gY29u c3RfaXRlcmF0b3IoIHNoLT5ub2RlLT5wcmV2ICk7IH0KCiAgICBib29sIGlzRW1wdHkoKSBjb25z dCB7IHJldHVybiAoIHNoLT5ub2RlcyA9PSAwICk7IH0KCiAgICBpdGVyYXRvciBhcHBlbmQoIGNv bnN0IFQmIHggKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPmluc2VydCggZW5kKCksIHggKTsgfQog ICAgaXRlcmF0b3IgcHJlcGVuZCggY29uc3QgVCYgeCApIHsgZGV0YWNoKCk7IHJldHVybiBzaC0+ aW5zZXJ0KCBiZWdpbigpLCB4ICk7IH0KCiAgICBpdGVyYXRvciByZW1vdmUoIGl0ZXJhdG9yIGl0 ICkgeyBkZXRhY2goKTsgcmV0dXJuIHNoLT5yZW1vdmUoIGl0ICk7IH0KCiAgICBUJiBmaXJzdCgp IHsgIDsgZGV0YWNoKCk7IHJldHVybiBzaC0+bm9kZS0+bmV4dC0+ZGF0YTsgfQogICAgY29uc3Qg VCYgZmlyc3QoKSBjb25zdCB7ICA7IHJldHVybiBzaC0+bm9kZS0+bmV4dC0+ZGF0YTsgfQogICAg VCYgbGFzdCgpIHsgIDsgZGV0YWNoKCk7IHJldHVybiBzaC0+bm9kZS0+cHJldi0+ZGF0YTsgfQog ICAgY29uc3QgVCYgbGFzdCgpIGNvbnN0IHsgIDsgcmV0dXJuIHNoLT5ub2RlLT5wcmV2LT5kYXRh OyB9CgogICAgVCYgb3BlcmF0b3JbXSAoIHNpemVfdHlwZSBpICkgeyAgOyBkZXRhY2goKTsgcmV0 dXJuIHNoLT5hdChpKS0+ZGF0YTsgfQogICAgY29uc3QgVCYgb3BlcmF0b3JbXSAoIHNpemVfdHlw ZSBpICkgY29uc3QgeyAgOyByZXR1cm4gc2gtPmF0KGkpLT5kYXRhOyB9CiAgICBpdGVyYXRvciBh dCggc2l6ZV90eXBlIGkgKSB7ICA7IGRldGFjaCgpOyByZXR1cm4gaXRlcmF0b3IoIHNoLT5hdChp KSApOyB9CiAgICBjb25zdF9pdGVyYXRvciBhdCggc2l6ZV90eXBlIGkgKSBjb25zdCB7ICA7IHJl dHVybiBjb25zdF9pdGVyYXRvciggc2gtPmF0KGkpICk7IH0KICAgIGl0ZXJhdG9yIGZpbmQgKCBj b25zdCBUJiB4ICkgeyBkZXRhY2goKTsgcmV0dXJuIGl0ZXJhdG9yKCBzaC0+ZmluZCggc2gtPm5v ZGUtPm5leHQsIHgpICk7IH0KICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQgKCBjb25zdCBUJiB4ICkg Y29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoIHNoLT5maW5kKCBzaC0+bm9kZS0+bmV4dCwg eCkgKTsgfQogICAgaXRlcmF0b3IgZmluZCAoIGl0ZXJhdG9yIGl0LCBjb25zdCBUJiB4ICkgeyBk ZXRhY2goKTsgcmV0dXJuIGl0ZXJhdG9yKCBzaC0+ZmluZCggaXQubm9kZSwgeCApICk7IH0KICAg IGNvbnN0X2l0ZXJhdG9yIGZpbmQgKCBjb25zdF9pdGVyYXRvciBpdCwgY29uc3QgVCYgeCApIGNv bnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCBzaC0+ZmluZCggaXQubm9kZSwgeCApICk7IH0K ICAgIGludCBmaW5kSW5kZXgoIGNvbnN0IFQmIHggKSBjb25zdCB7IHJldHVybiBzaC0+ZmluZElu ZGV4KCBzaC0+bm9kZS0+bmV4dCwgeCkgOyB9CiAgICBzaXplX3R5cGUgY29udGFpbnMoIGNvbnN0 IFQmIHggKSBjb25zdCB7IHJldHVybiBzaC0+Y29udGFpbnMoIHggKTsgfQoKICAgIHNpemVfdHlw ZSBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIHNoLT5ub2RlczsgfQoKICAgIFFWYWx1ZUxpc3Q8VD4m IG9wZXJhdG9yKz0gKCBjb25zdCBUJiB4ICkKICAgIHsKCWFwcGVuZCggeCApOwoJcmV0dXJuICp0 aGlzOwogICAgfQogICAgdHlwZWRlZiBRVmFsdWVMaXN0SXRlcmF0b3I8VD4gSXRlcmF0b3I7CiAg ICB0eXBlZGVmIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFQ+IENvbnN0SXRlcmF0b3I7CiAgICB0 eXBlZGVmIFQgVmFsdWVUeXBlOwoKcHJvdGVjdGVkOgogICAgIAoKCiAgICB2b2lkIGRldGFjaCgp IHsgaWYgKCBzaC0+Y291bnQgPiAxICkgZGV0YWNoSW50ZXJuYWwoKTsgfQoKICAgICAKCgogICAg UVZhbHVlTGlzdFByaXZhdGU8VD4qIHNoOwogICAgCnByaXZhdGU6CiAgICB2b2lkIGRldGFjaElu dGVybmFsKCk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBib29sIFFWYWx1ZUxpc3Q8VD46Om9w ZXJhdG9yPT0gKCBjb25zdCBRVmFsdWVMaXN0PFQ+JiBsICkgY29uc3QKewogICAgaWYgKCBzaXpl KCkgIT0gbC5zaXplKCkgKQoJcmV0dXJuIEZBTFNFOwogICAgY29uc3RfaXRlcmF0b3IgaXQyID0g YmVnaW4oKTsKICAgIGNvbnN0X2l0ZXJhdG9yIGl0ID0gbC5iZWdpbigpOwogICAgZm9yKCA7IGl0 ICE9IGwuZW5kKCk7ICsraXQsICsraXQyICkKCWlmICggISggKml0ID09ICppdDIgKSApCgkgICAg cmV0dXJuIEZBTFNFOwogICAgcmV0dXJuIFRSVUU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIHZv aWQgUVZhbHVlTGlzdDxUPjo6Y2xlYXIoKQp7CiAgICBpZiAoIHNoLT5jb3VudCA9PSAxICkgc2gt PmNsZWFyKCk7IGVsc2UgeyBzaC0+ZGVyZWYoKTsgc2ggPSBuZXcgUVZhbHVlTGlzdFByaXZhdGU8 VD47IH0KfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgdHlwZW5hbWUgIFFWYWx1ZUxpc3Q8VD46Oml0 ZXJhdG9yIFFWYWx1ZUxpc3Q8VD46OmVyYXNlKCB0eXBlbmFtZSAgUVZhbHVlTGlzdDxUPjo6aXRl cmF0b3IgZmlyc3QsIHR5cGVuYW1lICBRVmFsdWVMaXN0PFQ+OjppdGVyYXRvciBsYXN0ICkKewog ICAgd2hpbGUgKCBmaXJzdCAhPSBsYXN0ICkKCWVyYXNlKCBmaXJzdCsrICk7CiAgICByZXR1cm4g bGFzdDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBUPgogIHZvaWQgUVZhbHVlTGlzdDxUPjo6aW5zZXJ0 KCB0eXBlbmFtZSAgUVZhbHVlTGlzdDxUPjo6aXRlcmF0b3IgcG9zLCBzaXplX3R5cGUgbiwgY29u c3QgVCYgeCApCnsKICAgIGZvciAoIDsgbiA+IDA7IC0tbiApCglpbnNlcnQoIHBvcywgeCApOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBRVmFsdWVMaXN0PFQ+IFFWYWx1ZUxpc3Q8VD46Om9wZXJh dG9yKyAoIGNvbnN0IFFWYWx1ZUxpc3Q8VD4mIGwgKSBjb25zdAp7CiAgICBRVmFsdWVMaXN0PFQ+ IGwyKCAqdGhpcyApOwogICAgZm9yKCBjb25zdF9pdGVyYXRvciBpdCA9IGwuYmVnaW4oKTsgaXQg IT0gbC5lbmQoKTsgKytpdCApCglsMi5hcHBlbmQoICppdCApOwogICAgcmV0dXJuIGwyOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgVD4KICBRVmFsdWVMaXN0PFQ+JiBRVmFsdWVMaXN0PFQ+OjpvcGVyYXRv cis9ICggY29uc3QgUVZhbHVlTGlzdDxUPiYgbCApCnsKICAgIGZvciggY29uc3RfaXRlcmF0b3Ig aXQgPSBsLmJlZ2luKCk7IGl0ICE9IGwuZW5kKCk7ICsraXQgKQoJYXBwZW5kKCAqaXQgKTsKICAg IHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgdm9pZCBRVmFsdWVMaXN0PFQ+ OjpkZXRhY2hJbnRlcm5hbCgpCnsKICAgIHNoLT5kZXJlZigpOyBzaCA9IG5ldyBRVmFsdWVMaXN0 UHJpdmF0ZTxUPiggKnNoICk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBRRGF0YVN0cmVhbSYg b3BlcmF0b3I+PiggUURhdGFTdHJlYW0mIHMsIFFWYWx1ZUxpc3Q8VD4mIGwgKQp7CiAgICBsLmNs ZWFyKCk7CiAgICBRX1VJTlQzMiBjOwogICAgcyA+PiBjOwogICAgZm9yKCBRX1VJTlQzMiBpID0g MDsgaSA8IGM7ICsraSApCiAgICB7CglUIHQ7CglzID4+IHQ7CglsLmFwcGVuZCggdCApOwoJaWYg KCBzLmF0RW5kKCkgKQoJICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIHM7Cn0KCnRlbXBsYXRl IDxjbGFzcyBUPgogIFFEYXRhU3RyZWFtJiBvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSYgcywgY29u c3QgUVZhbHVlTGlzdDxUPiYgbCApCnsKICAgIHMgPDwgKFFfVUlOVDMyKWwuc2l6ZSgpOwogICAg UVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8VD4gaXQgPSBsLmJlZ2luKCk7CiAgICBmb3IoIDsgaXQg IT0gbC5lbmQoKTsgKytpdCApCglzIDw8ICppdDsKICAgIHJldHVybiBzOwp9CgoKIyA0NyAiL3Vz ci9sb2NhbC9xdC9pbmNsdWRlL3FtYXAuaCIgMgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL21hcCIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbGliL2djYy1saWIv aTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxf dHJlZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9mdW5jdGlvbi5oIiAxIDMKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0FyZywg Y2xhc3MgX1Jlc3VsdD4Kc3RydWN0IHVuYXJ5X2Z1bmN0aW9uIHsKICB0eXBlZGVmIF9BcmcgYXJn dW1lbnRfdHlwZTsKICB0eXBlZGVmIF9SZXN1bHQgcmVzdWx0X3R5cGU7Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0PgpzdHJ1Y3QgYmluYXJ5X2Z1 bmN0aW9uIHsKICB0eXBlZGVmIF9BcmcxIGZpcnN0X2FyZ3VtZW50X3R5cGU7CiAgdHlwZWRlZiBf QXJnMiBzZWNvbmRfYXJndW1lbnRfdHlwZTsKICB0eXBlZGVmIF9SZXN1bHQgcmVzdWx0X3R5cGU7 Cn07ICAgICAgCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgcGx1cyA6IHB1YmxpYyBiaW5h cnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+IHsKICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9f eCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCArIF9feTsgfQp9OwoKdGVtcGxh dGUgPGNsYXNzIF9UcD4Kc3RydWN0IG1pbnVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAs X1RwLF9UcD4gewogIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9f eSkgY29uc3QgeyByZXR1cm4gX194IC0gX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpz dHJ1Y3QgbXVsdGlwbGllcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+IHsK ICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsg cmV0dXJuIF9feCAqIF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGRpdmlk ZXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsX1RwPiB7CiAgX1RwIG9wZXJhdG9y KCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggLyBf X3k7IH0KfTsKCiAKCnRlbXBsYXRlIDxjbGFzcyBfVHA+IGlubGluZSBfVHAgaWRlbnRpdHlfZWxl bWVudChwbHVzPF9UcD4pIHsKICByZXR1cm4gX1RwKDApOwp9CnRlbXBsYXRlIDxjbGFzcyBfVHA+ IGlubGluZSBfVHAgaWRlbnRpdHlfZWxlbWVudChtdWx0aXBsaWVzPF9UcD4pIHsKICByZXR1cm4g X1RwKDEpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgbW9kdWx1cyA6IHB1YmxpYyBi aW5hcnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+IAp7CiAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1Rw JiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggJSBfX3k7IH0KfTsKCnRl bXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBuZWdhdGUgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248 X1RwLF9UcD4gCnsKICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29uc3QgeyByZXR1 cm4gLV9feDsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGVxdWFsX3RvIDogcHVi bGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9vbCBvcGVyYXRvcigpKGNv bnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ID09IF9feTsg fQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IG5vdF9lcXVhbF90byA6IHB1YmxpYyBi aW5hcnlfZnVuY3Rpb248X1RwLF9UcCxib29sPiAKewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBf VHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAhPSBfX3k7IH0KfTsK CnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBncmVhdGVyIDogcHVibGljIGJpbmFyeV9mdW5j dGlvbjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBj b25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ID4gX195OyB9Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1RwPgpzdHJ1Y3QgbGVzcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxi b29sPiAKewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kp IGNvbnN0IHsgcmV0dXJuIF9feCA8IF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3Ry dWN0IGdyZWF0ZXJfZXF1YWwgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4K ewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0 IHsgcmV0dXJuIF9feCA+PSBfX3k7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBs ZXNzX2VxdWFsIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9v bCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1 cm4gX194IDw9IF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGxvZ2ljYWxf YW5kIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+CnsKICBib29sIG9wZXJh dG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3gg JiYgX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgbG9naWNhbF9vciA6IHB1 YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxib29sPgp7CiAgYm9vbCBvcGVyYXRvcigpKGNv bnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194IHx8IF9feTsg fQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGxvZ2ljYWxfbm90IDogcHVibGljIHVu YXJ5X2Z1bmN0aW9uPF9UcCxib29sPgp7CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194 KSBjb25zdCB7IHJldHVybiAhX194OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4K Y2xhc3MgdW5hcnlfbmVnYXRlCiAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1By ZWRpY2F0ZTo6YXJndW1lbnRfdHlwZSwgYm9vbD4gewpwcm90ZWN0ZWQ6CiAgX1ByZWRpY2F0ZSBf TV9wcmVkOwpwdWJsaWM6CiAgZXhwbGljaXQgdW5hcnlfbmVnYXRlKGNvbnN0IF9QcmVkaWNhdGUm IF9feCkgOiBfTV9wcmVkKF9feCkge30KICBib29sIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUg X1ByZWRpY2F0ZTo6YXJndW1lbnRfdHlwZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gIV9NX3By ZWQoX194KTsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KaW5saW5lIHVuYXJ5 X25lZ2F0ZTxfUHJlZGljYXRlPiAKbm90MShjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpCnsKICBy ZXR1cm4gdW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+KF9fcHJlZCk7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfUHJlZGljYXRlPiAKY2xhc3MgYmluYXJ5X25lZ2F0ZSAKICA6IHB1YmxpYyBiaW5hcnlfZnVu Y3Rpb248dHlwZW5hbWUgX1ByZWRpY2F0ZTo6Zmlyc3RfYXJndW1lbnRfdHlwZSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZTo6c2Vjb25kX2FyZ3VtZW50X3R5 cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+IHsKcHJvdGVjdGVkOgogIF9QcmVk aWNhdGUgX01fcHJlZDsKcHVibGljOgogIGV4cGxpY2l0IGJpbmFyeV9uZWdhdGUoY29uc3QgX1By ZWRpY2F0ZSYgX194KSA6IF9NX3ByZWQoX194KSB7fQogIGJvb2wgb3BlcmF0b3IoKShjb25zdCB0 eXBlbmFtZSBfUHJlZGljYXRlOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3gsIAogICAgICAgICAg ICAgICAgICBjb25zdCB0eXBlbmFtZSBfUHJlZGljYXRlOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYg X195KSBjb25zdAogIHsKICAgIHJldHVybiAhX01fcHJlZChfX3gsIF9feSk7IAogIH0KfTsKCnRl bXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgppbmxpbmUgYmluYXJ5X25lZ2F0ZTxfUHJlZGljYXRl PiAKbm90Mihjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpCnsKICByZXR1cm4gYmluYXJ5X25lZ2F0 ZTxfUHJlZGljYXRlPihfX3ByZWQpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbj4gCmNs YXNzIGJpbmRlcjFzdAogIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9PcGVyYXRp b246OnNlY29uZF9hcmd1bWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVu YW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlPiB7CnByb3RlY3RlZDoKICBfT3BlcmF0aW9uIG9w OwogIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgdmFsdWU7CnB1Ymxp YzoKICBiaW5kZXIxc3QoY29uc3QgX09wZXJhdGlvbiYgX194LAogICAgICAgICAgICBjb25zdCB0 eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3kpCiAgICAgIDogb3Ao X194KSwgdmFsdWUoX195KSB7fQogIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlCiAg b3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlw ZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gb3AodmFsdWUsIF9feCk7IAogIH0KfTsKCnRlbXBs YXRlIDxjbGFzcyBfT3BlcmF0aW9uLCBjbGFzcyBfVHA+CmlubGluZSBiaW5kZXIxc3Q8X09wZXJh dGlvbj4gCmJpbmQxc3QoY29uc3QgX09wZXJhdGlvbiYgX19vcGVyLCBjb25zdCBfVHAmIF9feCkg CnsKICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgX0Fy ZzFfdHlwZTsKICByZXR1cm4gYmluZGVyMXN0PF9PcGVyYXRpb24+KF9fb3BlciwgX0FyZzFfdHlw ZShfX3gpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24+IApjbGFzcyBiaW5kZXIybmQK ICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1 bWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9PcGVyYXRpb246 OnJlc3VsdF90eXBlPiB7CnByb3RlY3RlZDoKICBfT3BlcmF0aW9uIG9wOwogIHR5cGVuYW1lIF9P cGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlIHZhbHVlOwpwdWJsaWM6CiAgYmluZGVyMm5k KGNvbnN0IF9PcGVyYXRpb24mIF9feCwKICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgX09wZXJh dGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUmIF9feSkgCiAgICAgIDogb3AoX194KSwgdmFsdWUo X195KSB7fQogIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlCiAgb3BlcmF0b3IoKShj b25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0 IHsKICAgIHJldHVybiBvcChfX3gsIHZhbHVlKTsgCiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9P cGVyYXRpb24sIGNsYXNzIF9UcD4KaW5saW5lIGJpbmRlcjJuZDxfT3BlcmF0aW9uPiAKYmluZDJu ZChjb25zdCBfT3BlcmF0aW9uJiBfX29wZXIsIGNvbnN0IF9UcCYgX194KSAKewogIHR5cGVkZWYg dHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgX0FyZzJfdHlwZTsKICBy ZXR1cm4gYmluZGVyMm5kPF9PcGVyYXRpb24+KF9fb3BlciwgX0FyZzJfdHlwZShfX3gpKTsKfQoK IAoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMj4KY2xhc3Mg dW5hcnlfY29tcG9zZQogIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9PcGVyYXRp b24yOjphcmd1bWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9P cGVyYXRpb24xOjpyZXN1bHRfdHlwZT4gCnsKcHJvdGVjdGVkOgogIF9PcGVyYXRpb24xIF9fb3Ax OwogIF9PcGVyYXRpb24yIF9fb3AyOwpwdWJsaWM6CiAgdW5hcnlfY29tcG9zZShjb25zdCBfT3Bl cmF0aW9uMSYgX194LCBjb25zdCBfT3BlcmF0aW9uMiYgX195KSAKICAgIDogX19vcDEoX194KSwg X19vcDIoX195KSB7fQogIHR5cGVuYW1lIF9PcGVyYXRpb24xOjpyZXN1bHRfdHlwZQogIG9wZXJh dG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29u c3QgewogICAgcmV0dXJuIF9fb3AxKF9fb3AyKF9feCkpOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFz cyBfT3BlcmF0aW9uMSwgY2xhc3MgX09wZXJhdGlvbjI+CmlubGluZSB1bmFyeV9jb21wb3NlPF9P cGVyYXRpb24xLF9PcGVyYXRpb24yPiAKY29tcG9zZTEoY29uc3QgX09wZXJhdGlvbjEmIF9fb3Ax LCBjb25zdCBfT3BlcmF0aW9uMiYgX19vcDIpCnsKICByZXR1cm4gdW5hcnlfY29tcG9zZTxfT3Bl cmF0aW9uMSxfT3BlcmF0aW9uMj4oX19vcDEsIF9fb3AyKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9P cGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMiwgY2xhc3MgX09wZXJhdGlvbjM+CmNsYXNzIGJp bmFyeV9jb21wb3NlCiAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX09wZXJhdGlv bjI6OmFyZ3VtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX09w ZXJhdGlvbjE6OnJlc3VsdF90eXBlPiB7CnByb3RlY3RlZDoKICBfT3BlcmF0aW9uMSBfTV9vcDE7 CiAgX09wZXJhdGlvbjIgX01fb3AyOwogIF9PcGVyYXRpb24zIF9NX29wMzsKcHVibGljOgogIGJp bmFyeV9jb21wb3NlKGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBf X3ksIAogICAgICAgICAgICAgICAgIGNvbnN0IF9PcGVyYXRpb24zJiBfX3opIAogICAgOiBfTV9v cDEoX194KSwgX01fb3AyKF9feSksIF9NX29wMyhfX3opIHsgfQogIHR5cGVuYW1lIF9PcGVyYXRp b24xOjpyZXN1bHRfdHlwZQogIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjI6 OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9NX29wMShfTV9vcDIoX194 KSwgX01fb3AzKF9feCkpOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uMSwgY2xh c3MgX09wZXJhdGlvbjIsIGNsYXNzIF9PcGVyYXRpb24zPgppbmxpbmUgYmluYXJ5X2NvbXBvc2U8 X09wZXJhdGlvbjEsIF9PcGVyYXRpb24yLCBfT3BlcmF0aW9uMz4gCmNvbXBvc2UyKGNvbnN0IF9P cGVyYXRpb24xJiBfX29wMSwgY29uc3QgX09wZXJhdGlvbjImIF9fb3AyLCAKICAgICAgICAgY29u c3QgX09wZXJhdGlvbjMmIF9fb3AzKQp7CiAgcmV0dXJuIGJpbmFyeV9jb21wb3NlPF9PcGVyYXRp b24xLF9PcGVyYXRpb24yLF9PcGVyYXRpb24zPgogICAgKF9fb3AxLCBfX29wMiwgX19vcDMpOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KY2xhc3MgcG9pbnRlcl90b191 bmFyeV9mdW5jdGlvbiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PiB7CnBy b3RlY3RlZDoKICBfUmVzdWx0ICgqX01fcHRyKShfQXJnKTsKcHVibGljOgogIHBvaW50ZXJfdG9f dW5hcnlfZnVuY3Rpb24oKSB7fQogIGV4cGxpY2l0IHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24o X1Jlc3VsdCAoKl9feCkoX0FyZykpIDogX01fcHRyKF9feCkge30KICBfUmVzdWx0IG9wZXJhdG9y KCkoX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3B0cihfX3gpOyB9Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KaW5saW5lIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rp b248X0FyZywgX1Jlc3VsdD4gcHRyX2Z1bihfUmVzdWx0ICgqX194KShfQXJnKSkKewogIHJldHVy biBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uPF9BcmcsIF9SZXN1bHQ+KF9feCk7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzIsIGNsYXNzIF9SZXN1bHQ+CmNsYXNzIHBvaW50 ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uIDogCiAgcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxf QXJnMixfUmVzdWx0PiB7CnByb3RlY3RlZDoKICAgIF9SZXN1bHQgKCpfTV9wdHIpKF9BcmcxLCBf QXJnMik7CnB1YmxpYzoKICAgIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKCkge30KICAgIGV4 cGxpY2l0IHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKF9SZXN1bHQgKCpfX3gpKF9BcmcxLCBf QXJnMikpIAogICAgICA6IF9NX3B0cihfX3gpIHt9CiAgICBfUmVzdWx0IG9wZXJhdG9yKCkoX0Fy ZzEgX194LCBfQXJnMiBfX3kpIGNvbnN0IHsKICAgICAgcmV0dXJuIF9NX3B0cihfX3gsIF9feSk7 CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVz dWx0PgppbmxpbmUgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb248X0FyZzEsX0FyZzIsX1Jlc3Vs dD4gCnB0cl9mdW4oX1Jlc3VsdCAoKl9feCkoX0FyZzEsIF9BcmcyKSkgewogIHJldHVybiBwb2lu dGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PihfX3gpOwp9CgogCnRl bXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBfSWRlbnRpdHkgOiBwdWJsaWMgdW5hcnlfZnVuY3Rp b248X1RwLF9UcD4gewogIGNvbnN0IF9UcCYgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29u c3QgeyByZXR1cm4gX194OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgaWRlbnRp dHkgOiBwdWJsaWMgX0lkZW50aXR5PF9UcD4ge307CgogCnRlbXBsYXRlIDxjbGFzcyBfUGFpcj4K c3RydWN0IF9TZWxlY3Qxc3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIHR5cGVuYW1l IF9QYWlyOjpmaXJzdF90eXBlPiB7CiAgY29uc3QgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGUm IG9wZXJhdG9yKCkoY29uc3QgX1BhaXImIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9feC5maXJz dDsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+CnN0cnVjdCBfU2VsZWN0Mm5kIDogcHVi bGljIHVuYXJ5X2Z1bmN0aW9uPF9QYWlyLCB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGU+CnsK ICBjb25zdCB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGUmIG9wZXJhdG9yKCkoY29uc3QgX1Bh aXImIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9feC5zZWNvbmQ7CiAgfQp9OwoKdGVtcGxhdGUg PGNsYXNzIF9QYWlyPiBzdHJ1Y3Qgc2VsZWN0MXN0IDogcHVibGljIF9TZWxlY3Qxc3Q8X1BhaXI+ IHt9Owp0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+IHN0cnVjdCBzZWxlY3QybmQgOiBwdWJsaWMgX1Nl bGVjdDJuZDxfUGFpcj4ge307CgogCnRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+ CnN0cnVjdCBfUHJvamVjdDFzdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0FyZzEsIF9Bcmcy LCBfQXJnMT4gewogIF9BcmcxIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmIF9feCwgY29uc3QgX0Fy ZzImKSBjb25zdCB7IHJldHVybiBfX3g7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xh c3MgX0FyZzI+CnN0cnVjdCBfUHJvamVjdDJuZCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0Fy ZzEsIF9BcmcyLCBfQXJnMj4gewogIF9BcmcyIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmLCBjb25z dCBfQXJnMiYgX195KSBjb25zdCB7IHJldHVybiBfX3k7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBf QXJnMSwgY2xhc3MgX0FyZzI+IApzdHJ1Y3QgcHJvamVjdDFzdCA6IHB1YmxpYyBfUHJvamVjdDFz dDxfQXJnMSwgX0FyZzI+IHt9OwoKdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4K c3RydWN0IHByb2plY3QybmQgOiBwdWJsaWMgX1Byb2plY3QybmQ8X0FyZzEsIF9BcmcyPiB7fTsK CiAKIAogCnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0PgpzdHJ1Y3QgY29uc3RhbnRfdm9pZF9mdW4K ewogIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKICByZXN1bHRfdHlwZSBfX3ZhbDsKICBj b25zdGFudF92b2lkX2Z1bihjb25zdCByZXN1bHRfdHlwZSYgX192KSA6IF9fdmFsKF9fdikge30K ICBjb25zdCByZXN1bHRfdHlwZSYgb3BlcmF0b3IoKSgpIGNvbnN0IHsgcmV0dXJuIF9fdmFsOyB9 Cn07ICAKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZ3VtZW50ID0gX1Jlc3Vs dD4KCgoKc3RydWN0IGNvbnN0YW50X3VuYXJ5X2Z1biA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxf QXJndW1lbnQsIF9SZXN1bHQ+IHsKICBfUmVzdWx0IF9NX3ZhbDsKICBjb25zdGFudF91bmFyeV9m dW4oY29uc3QgX1Jlc3VsdCYgX192KSA6IF9NX3ZhbChfX3YpIHt9CiAgY29uc3QgX1Jlc3VsdCYg b3BlcmF0b3IoKShjb25zdCBfQXJndW1lbnQmKSBjb25zdCB7IHJldHVybiBfTV92YWw7IH0KfTsK Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZzEgPSBfUmVzdWx0LCBjbGFzcyBf QXJnMiA9IF9BcmcxPgoKCgpzdHJ1Y3QgY29uc3RhbnRfYmluYXJ5X2Z1biA6IHB1YmxpYyBiaW5h cnlfZnVuY3Rpb248X0FyZzEsIF9BcmcyLCBfUmVzdWx0PiB7CiAgX1Jlc3VsdCBfTV92YWw7CiAg Y29uc3RhbnRfYmluYXJ5X2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpIDogX01fdmFsKF9fdikge30K ICBjb25zdCBfUmVzdWx0JiBvcGVyYXRvcigpKGNvbnN0IF9BcmcxJiwgY29uc3QgX0FyZzImKSBj b25zdCB7CiAgICByZXR1cm4gX01fdmFsOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0 PgppbmxpbmUgY29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4gY29uc3RhbnQwKGNvbnN0IF9SZXN1 bHQmIF9fdmFsKQp7CiAgcmV0dXJuIGNvbnN0YW50X3ZvaWRfZnVuPF9SZXN1bHQ+KF9fdmFsKTsK fQoKdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CmlubGluZSBjb25zdGFudF91bmFyeV9mdW48X1Jl c3VsdCxfUmVzdWx0PiBjb25zdGFudDEoY29uc3QgX1Jlc3VsdCYgX192YWwpCnsKICByZXR1cm4g Y29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsX1Jlc3VsdD4oX192YWwpOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1Jlc3VsdD4KaW5saW5lIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0 LF9SZXN1bHQ+IApjb25zdGFudDIoY29uc3QgX1Jlc3VsdCYgX192YWwpCnsKICByZXR1cm4gY29u c3RhbnRfYmluYXJ5X2Z1bjxfUmVzdWx0LF9SZXN1bHQsX1Jlc3VsdD4oX192YWwpOwp9CgogCiAK Y2xhc3Mgc3VidHJhY3RpdmVfcm5nIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHVuc2lnbmVkIGlu dCwgdW5zaWduZWQgaW50PiB7CnByaXZhdGU6CiAgdW5zaWduZWQgaW50IF9NX3RhYmxlWzU1XTsK ICBzaXplX3QgX01faW5kZXgxOwogIHNpemVfdCBfTV9pbmRleDI7CnB1YmxpYzoKICB1bnNpZ25l ZCBpbnQgb3BlcmF0b3IoKSh1bnNpZ25lZCBpbnQgX19saW1pdCkgewogICAgX01faW5kZXgxID0g KF9NX2luZGV4MSArIDEpICUgNTU7CiAgICBfTV9pbmRleDIgPSAoX01faW5kZXgyICsgMSkgJSA1 NTsKICAgIF9NX3RhYmxlW19NX2luZGV4MV0gPSBfTV90YWJsZVtfTV9pbmRleDFdIC0gX01fdGFi bGVbX01faW5kZXgyXTsKICAgIHJldHVybiBfTV90YWJsZVtfTV9pbmRleDFdICUgX19saW1pdDsK ICB9CgogIHZvaWQgX01faW5pdGlhbGl6ZSh1bnNpZ25lZCBpbnQgX19zZWVkKQogIHsKICAgIHVu c2lnbmVkIGludCBfX2sgPSAxOwogICAgX01fdGFibGVbNTRdID0gX19zZWVkOwogICAgc2l6ZV90 IF9faTsKICAgIGZvciAoX19pID0gMDsgX19pIDwgNTQ7IF9faSsrKSB7CiAgICAgICAgc2l6ZV90 IF9faWkgPSAoMjEgKiAoX19pICsgMSkgJSA1NSkgLSAxOwogICAgICAgIF9NX3RhYmxlW19faWld ID0gX19rOwogICAgICAgIF9fayA9IF9fc2VlZCAtIF9fazsKICAgICAgICBfX3NlZWQgPSBfTV90 YWJsZVtfX2lpXTsKICAgIH0KICAgIGZvciAoaW50IF9fbG9vcCA9IDA7IF9fbG9vcCA8IDQ7IF9f bG9vcCsrKSB7CiAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCA1NTsgX19pKyspCiAgICAgICAg ICAgIF9NX3RhYmxlW19faV0gPSBfTV90YWJsZVtfX2ldIC0gX01fdGFibGVbKDEgKyBfX2kgKyAz MCkgJSA1NV07CiAgICB9CiAgICBfTV9pbmRleDEgPSAwOwogICAgX01faW5kZXgyID0gMzE7CiAg fQoKICBzdWJ0cmFjdGl2ZV9ybmcodW5zaWduZWQgaW50IF9fc2VlZCkgeyBfTV9pbml0aWFsaXpl KF9fc2VlZCk7IH0KICBzdWJ0cmFjdGl2ZV9ybmcoKSB7IF9NX2luaXRpYWxpemUoMTYxODAzMzk4 dSk7IH0KfTsKCgogCgogCiAKIAogCiAKIAogCgogCiAKIAogCiAKCiAKIAogCiAKIAoKCnRlbXBs YXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmNsYXNzIG1lbV9mdW5fdCA6IHB1YmxpYyB1bmFy eV9mdW5jdGlvbjxfVHAqLF9SZXQ+IHsKcHVibGljOgogIGV4cGxpY2l0IG1lbV9mdW5fdChfUmV0 IChfVHA6OipfX3BmKSgpKSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoX1RwKiBf X3ApIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9CnByaXZhdGU6CiAgX1JldCAoX1Rw OjoqX01fZikoKTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmNsYXNzIGNv bnN0X21lbV9mdW5fdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLF9SZXQ+IHsK cHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fdChfUmV0IChfVHA6OipfX3BmKSgpIGNv bnN0KSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3ApIGNv bnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9CnByaXZhdGU6CiAgX1JldCAoX1RwOjoqX01f ZikoKSBjb25zdDsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgpjbGFzcyBt ZW1fZnVuX3JlZl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCxfUmV0PiB7CnB1YmxpYzoK ICBleHBsaWNpdCBtZW1fZnVuX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkpIDogX01fZihfX3Bm KSB7fQogIF9SZXQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29uc3QgeyByZXR1cm4gKF9fci4qX01f ZikoKTsgfQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKCk7Cn07Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1JldCwgY2xhc3MgX1RwPgpjbGFzcyBjb25zdF9tZW1fZnVuX3JlZl90IDogcHVibGljIHVu YXJ5X2Z1bmN0aW9uPF9UcCxfUmV0PiB7CnB1YmxpYzoKICBleHBsaWNpdCBjb25zdF9tZW1fZnVu X3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkgY29uc3QpIDogX01fZihfX3BmKSB7fQogIF9SZXQg b3BlcmF0b3IoKShjb25zdCBfVHAmIF9fcikgY29uc3QgeyByZXR1cm4gKF9fci4qX01fZikoKTsg fQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKCkgY29uc3Q7Cn07Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBtZW1fZnVuMV90IDogcHVibGlj IGJpbmFyeV9mdW5jdGlvbjxfVHAqLF9BcmcsX1JldD4gewpwdWJsaWM6CiAgZXhwbGljaXQgbWVt X2Z1bjFfdChfUmV0IChfVHA6OipfX3BmKShfQXJnKSkgOiBfTV9mKF9fcGYpIHt9CiAgX1JldCBv cGVyYXRvcigpKF9UcCogX19wLCBfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2Yp KF9feCk7IH0KcHJpdmF0ZToKICBfUmV0IChfVHA6OipfTV9mKShfQXJnKTsKfTsKCnRlbXBsYXRl IDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIGNvbnN0X21lbV9mdW4x X3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX0FyZyxfUmV0PiB7CnB1Ymxp YzoKICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpIGNv bnN0KSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3AsIF9B cmcgX194KSBjb25zdAogICAgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKF9feCk7IH0KcHJpdmF0ZToK ICBfUmV0IChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfUmV0 LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIG1lbV9mdW4xX3JlZl90IDogcHVibGljIGJp bmFyeV9mdW5jdGlvbjxfVHAsX0FyZyxfUmV0PiB7CnB1YmxpYzoKICBleHBsaWNpdCBtZW1fZnVu MV9yZWZfdChfUmV0IChfVHA6OipfX3BmKShfQXJnKSkgOiBfTV9mKF9fcGYpIHt9CiAgX1JldCBv cGVyYXRvcigpKF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gKF9fci4qX01fZiko X194KTsgfQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpOwp9OwoKdGVtcGxhdGUg PGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KY2xhc3MgY29uc3RfbWVtX2Z1bjFf cmVmX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLF9SZXQ+IHsKcHVibGljOgog IGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpIGNv bnN0KSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3IsIF9B cmcgX194KSBjb25zdCB7IHJldHVybiAoX19yLipfTV9mKShfX3gpOyB9CnByaXZhdGU6CiAgX1Jl dCAoX1RwOjoqX01fZikoX0FyZykgY29uc3Q7Cn07CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmNs YXNzIG1lbV9mdW5fdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCosdm9p ZD4gewpwdWJsaWM6CiAgZXhwbGljaXQgbWVtX2Z1bl90KHZvaWQgKF9UcDo6Kl9fcGYpKCkpIDog X01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4q X01fZikoKTsgfQpwcml2YXRlOgogIHZvaWQgKF9UcDo6Kl9NX2YpKCk7Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1RwPgpjbGFzcyBjb25zdF9tZW1fZnVuX3Q8dm9pZCwgX1RwPiA6IHB1YmxpYyB1bmFy eV9mdW5jdGlvbjxjb25zdCBfVHAqLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21l bV9mdW5fdCh2b2lkIChfVHA6OipfX3BmKSgpIGNvbnN0KSA6IF9NX2YoX19wZikge30KICB2b2lk IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3ApIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKCk7IH0KcHJp dmF0ZToKICB2b2lkIChfVHA6OipfTV9mKSgpIGNvbnN0Owp9OwoKdGVtcGxhdGUgPGNsYXNzIF9U cD4KY2xhc3MgbWVtX2Z1bl9yZWZfdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9u PF9UcCx2b2lkPiB7CnB1YmxpYzoKICBleHBsaWNpdCBtZW1fZnVuX3JlZl90KHZvaWQgKF9UcDo6 Kl9fcGYpKCkpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29u c3QgeyAoX19yLipfTV9mKSgpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZikoKTsKfTsK CnRlbXBsYXRlIDxjbGFzcyBfVHA+CmNsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3Q8dm9pZCwgX1Rw PiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsdm9pZD4gewpwdWJsaWM6CiAgZXhwbGljaXQg Y29uc3RfbWVtX2Z1bl9yZWZfdCh2b2lkIChfVHA6OipfX3BmKSgpIGNvbnN0KSA6IF9NX2YoX19w Zikge30KICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3IpIGNvbnN0IHsgKF9fci4qX01f ZikoKTsgfQpwcml2YXRlOgogIHZvaWQgKF9UcDo6Kl9NX2YpKCkgY29uc3Q7Cn07Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBtZW1fZnVuMV90PHZvaWQsIF9UcCwgX0Fy Zz4gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosX0FyZyx2b2lkPiB7CnB1YmxpYzoKICBl eHBsaWNpdCBtZW1fZnVuMV90KHZvaWQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9NX2YoX19wZikg e30KICB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IChfX3AtPipf TV9mKShfX3gpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZikoX0FyZyk7Cn07Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBjb25zdF9tZW1fZnVuMV90PHZvaWQs IF9UcCwgX0FyZz4gCiAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX0FyZyx2 b2lkPiB7CnB1YmxpYzoKICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV90KHZvaWQgKF9UcDo6Kl9f cGYpKF9BcmcpIGNvbnN0KSA6IF9NX2YoX19wZikge30KICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qg X1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IChfX3AtPipfTV9mKShfX3gpOyB9CnByaXZhdGU6 CiAgdm9pZCAoX1RwOjoqX01fZikoX0FyZykgY29uc3Q7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Rw LCBjbGFzcyBfQXJnPgpjbGFzcyBtZW1fZnVuMV9yZWZfdDx2b2lkLCBfVHAsIF9Bcmc+CiAgOiBw dWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0 IG1lbV9mdW4xX3JlZl90KHZvaWQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9NX2YoX19wZikge30K ICB2b2lkIG9wZXJhdG9yKCkoX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdCB7IChfX3IuKl9NX2Yp KF9feCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6OipfTV9mKShfQXJnKTsKfTsKCnRlbXBsYXRl IDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIGNvbnN0X21lbV9mdW4xX3JlZl90PHZvaWQs IF9UcCwgX0FyZz4KICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9Bcmcsdm9pZD4gewpw dWJsaWM6CiAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfcmVmX3Qodm9pZCAoX1RwOjoqX19wZiko X0FyZykgY29uc3QpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAm IF9fciwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fci4qX01fZikoX194KTsgfQpwcml2YXRlOgogIHZv aWQgKF9UcDo6Kl9NX2YpKF9BcmcpIGNvbnN0Owp9OwoKCgogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xh c3MgX1JldCwgY2xhc3MgX1RwPgppbmxpbmUgbWVtX2Z1bl90PF9SZXQsX1RwPiBtZW1fZnVuKF9S ZXQgKF9UcDo6Kl9fZikoKSkKICB7IHJldHVybiBtZW1fZnVuX3Q8X1JldCxfVHA+KF9fZik7IH0K CnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmlubGluZSBjb25zdF9tZW1fZnVuX3Q8 X1JldCxfVHA+IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKSgpIGNvbnN0KQogIHsgcmV0dXJuIGNv bnN0X21lbV9mdW5fdDxfUmV0LF9UcD4oX19mKTsgfQoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNs YXNzIF9UcD4KaW5saW5lIG1lbV9mdW5fcmVmX3Q8X1JldCxfVHA+IG1lbV9mdW5fcmVmKF9SZXQg KF9UcDo6Kl9fZikoKSkgCiAgeyByZXR1cm4gbWVtX2Z1bl9yZWZfdDxfUmV0LF9UcD4oX19mKTsg fQoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcD4KaW5saW5lIGNvbnN0X21lbV9mdW5f cmVmX3Q8X1JldCxfVHA+IG1lbV9mdW5fcmVmKF9SZXQgKF9UcDo6Kl9fZikoKSBjb25zdCkKICB7 IHJldHVybiBjb25zdF9tZW1fZnVuX3JlZl90PF9SZXQsX1RwPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgbWVtX2Z1bjFfdDxfUmV0 LF9UcCxfQXJnPiBtZW1fZnVuKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykpCiAgeyByZXR1cm4gbWVt X2Z1bjFfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xh c3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgY29uc3RfbWVtX2Z1bjFfdDxfUmV0LF9UcCxfQXJn PiBtZW1fZnVuKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpCiAgeyByZXR1cm4gY29uc3Rf bWVtX2Z1bjFfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwg Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgbWVtX2Z1bjFfcmVmX3Q8X1JldCxfVHAsX0Fy Zz4gbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSkKICB7IHJldHVybiBtZW1fZnVu MV9yZWZfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xh c3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCxfVHAs X0FyZz4KbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKICB7IHJldHVy biBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgbWVtX2Z1bjFfdDxfUmV0 LF9UcCxfQXJnPiBtZW1fZnVuMShfUmV0IChfVHA6OipfX2YpKF9BcmcpKQogIHsgcmV0dXJuIG1l bV9mdW4xX3Q8X1JldCxfVHAsX0FyZz4oX19mKTsgfQoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNs YXNzIF9UcCwgY2xhc3MgX0FyZz4KaW5saW5lIGNvbnN0X21lbV9mdW4xX3Q8X1JldCxfVHAsX0Fy Zz4gbWVtX2Z1bjEoX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKICB7IHJldHVybiBjb25z dF9tZW1fZnVuMV90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFzcyBfUmV0 LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBtZW1fZnVuMV9yZWZfdDxfUmV0LF9UcCxf QXJnPiBtZW1fZnVuMV9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSkKICB7IHJldHVybiBtZW1f ZnVuMV9yZWZfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwg Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCxf VHAsX0FyZz4KbWVtX2Z1bjFfcmVmKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpCiAgeyBy ZXR1cm4gY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCxfVHAsX0FyZz4oX19mKTsgfQoKIAoKCgog CiAKIAojIDU5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX3RyZWUuaCIgMiAzCgoKICAKCgoKCgp0eXBlZGVm IGJvb2wgX1JiX3RyZWVfQ29sb3JfdHlwZTsKY29uc3QgX1JiX3RyZWVfQ29sb3JfdHlwZSBfU19y Yl90cmVlX3JlZCA9IGZhbHNlOwpjb25zdCBfUmJfdHJlZV9Db2xvcl90eXBlIF9TX3JiX3RyZWVf YmxhY2sgPSB0cnVlOwoKc3RydWN0IF9SYl90cmVlX25vZGVfYmFzZQp7CiAgdHlwZWRlZiBfUmJf dHJlZV9Db2xvcl90eXBlIF9Db2xvcl90eXBlOwogIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNl KiBfQmFzZV9wdHI7CgogIF9Db2xvcl90eXBlIF9NX2NvbG9yOyAKICBfQmFzZV9wdHIgX01fcGFy ZW50OwogIF9CYXNlX3B0ciBfTV9sZWZ0OwogIF9CYXNlX3B0ciBfTV9yaWdodDsKCiAgc3RhdGlj IF9CYXNlX3B0ciBfU19taW5pbXVtKF9CYXNlX3B0ciBfX3gpCiAgewogICAgd2hpbGUgKF9feC0+ X01fbGVmdCAhPSAwKSBfX3ggPSBfX3gtPl9NX2xlZnQ7CiAgICByZXR1cm4gX194OwogIH0KCiAg c3RhdGljIF9CYXNlX3B0ciBfU19tYXhpbXVtKF9CYXNlX3B0ciBfX3gpCiAgewogICAgd2hpbGUg KF9feC0+X01fcmlnaHQgIT0gMCkgX194ID0gX194LT5fTV9yaWdodDsKICAgIHJldHVybiBfX3g7 CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZT4Kc3RydWN0IF9SYl90cmVlX25vZGUgOiBw dWJsaWMgX1JiX3RyZWVfbm9kZV9iYXNlCnsKICB0eXBlZGVmIF9SYl90cmVlX25vZGU8X1ZhbHVl PiogX0xpbmtfdHlwZTsKICBfVmFsdWUgX01fdmFsdWVfZmllbGQ7Cn07CgoKc3RydWN0IF9SYl90 cmVlX2Jhc2VfaXRlcmF0b3IKewogIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlOjpfQmFzZV9w dHIgX0Jhc2VfcHRyOwogIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0 b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwogIF9CYXNl X3B0ciBfTV9ub2RlOwoKICB2b2lkIF9NX2luY3JlbWVudCgpCiAgewogICAgaWYgKF9NX25vZGUt Pl9NX3JpZ2h0ICE9IDApIHsKICAgICAgX01fbm9kZSA9IF9NX25vZGUtPl9NX3JpZ2h0OwogICAg ICB3aGlsZSAoX01fbm9kZS0+X01fbGVmdCAhPSAwKQogICAgICAgIF9NX25vZGUgPSBfTV9ub2Rl LT5fTV9sZWZ0OwogICAgfQogICAgZWxzZSB7CiAgICAgIF9CYXNlX3B0ciBfX3kgPSBfTV9ub2Rl LT5fTV9wYXJlbnQ7CiAgICAgIHdoaWxlIChfTV9ub2RlID09IF9feS0+X01fcmlnaHQpIHsKICAg ICAgICBfTV9ub2RlID0gX195OwogICAgICAgIF9feSA9IF9feS0+X01fcGFyZW50OwogICAgICB9 CiAgICAgIGlmIChfTV9ub2RlLT5fTV9yaWdodCAhPSBfX3kpCiAgICAgICAgX01fbm9kZSA9IF9f eTsKICAgIH0KICB9CgogIHZvaWQgX01fZGVjcmVtZW50KCkKICB7CiAgICBpZiAoX01fbm9kZS0+ X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQgJiYKICAgICAgICBfTV9ub2RlLT5fTV9wYXJlbnQt Pl9NX3BhcmVudCA9PSBfTV9ub2RlKQogICAgICBfTV9ub2RlID0gX01fbm9kZS0+X01fcmlnaHQ7 CiAgICBlbHNlIGlmIChfTV9ub2RlLT5fTV9sZWZ0ICE9IDApIHsKICAgICAgX0Jhc2VfcHRyIF9f eSA9IF9NX25vZGUtPl9NX2xlZnQ7CiAgICAgIHdoaWxlIChfX3ktPl9NX3JpZ2h0ICE9IDApCiAg ICAgICAgX195ID0gX195LT5fTV9yaWdodDsKICAgICAgX01fbm9kZSA9IF9feTsKICAgIH0KICAg IGVsc2UgewogICAgICBfQmFzZV9wdHIgX195ID0gX01fbm9kZS0+X01fcGFyZW50OwogICAgICB3 aGlsZSAoX01fbm9kZSA9PSBfX3ktPl9NX2xlZnQpIHsKICAgICAgICBfTV9ub2RlID0gX195Owog ICAgICAgIF9feSA9IF9feS0+X01fcGFyZW50OwogICAgICB9CiAgICAgIF9NX25vZGUgPSBfX3k7 CiAgICB9CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX1JlZiwgY2xhc3Mg X1B0cj4Kc3RydWN0IF9SYl90cmVlX2l0ZXJhdG9yIDogcHVibGljIF9SYl90cmVlX2Jhc2VfaXRl cmF0b3IKewogIHR5cGVkZWYgX1ZhbHVlIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfUmVmIHJlZmVy ZW5jZTsKICB0eXBlZGVmIF9QdHIgcG9pbnRlcjsKICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9y PF9WYWx1ZSwgX1ZhbHVlJiwgX1ZhbHVlKj4gICAgICAgICAgICAgCiAgICBpdGVyYXRvcjsKICB0 eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPF9WYWx1ZSwgY29uc3QgX1ZhbHVlJiwgY29uc3QgX1Zh bHVlKj4gCiAgICBjb25zdF9pdGVyYXRvcjsKICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPF9W YWx1ZSwgX1JlZiwgX1B0cj4gICAgICAgICAgICAgICAgICAgCiAgICBfU2VsZjsKICB0eXBlZGVm IF9SYl90cmVlX25vZGU8X1ZhbHVlPiogX0xpbmtfdHlwZTsKCiAgX1JiX3RyZWVfaXRlcmF0b3Io KSB7fQogIF9SYl90cmVlX2l0ZXJhdG9yKF9MaW5rX3R5cGUgX194KSB7IF9NX25vZGUgPSBfX3g7 IH0KICBfUmJfdHJlZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkgeyBfTV9ub2RlID0g X19pdC5fTV9ub2RlOyB9CgogIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBf TGlua190eXBlKF9NX25vZGUpLT5fTV92YWx1ZV9maWVsZDsgfQoKICBwb2ludGVyIG9wZXJhdG9y LT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQoKCiAgX1NlbGYmIG9wZXJhdG9y KysoKSB7IF9NX2luY3JlbWVudCgpOyByZXR1cm4gKnRoaXM7IH0KICBfU2VsZiBvcGVyYXRvcisr KGludCkgewogICAgX1NlbGYgX190bXAgPSAqdGhpczsKICAgIF9NX2luY3JlbWVudCgpOwogICAg cmV0dXJuIF9fdG1wOwogIH0KICAgIAogIF9TZWxmJiBvcGVyYXRvci0tKCkgeyBfTV9kZWNyZW1l bnQoKTsgcmV0dXJuICp0aGlzOyB9CiAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKICAgIF9TZWxm IF9fdG1wID0gKnRoaXM7CiAgICBfTV9kZWNyZW1lbnQoKTsKICAgIHJldHVybiBfX3RtcDsKICB9 Cn07CgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9SYl90cmVlX2Jhc2VfaXRlcmF0b3Im IF9feCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9y JiBfX3kpIHsKICByZXR1cm4gX194Ll9NX25vZGUgPT0gX195Ll9NX25vZGU7Cn0KCmlubGluZSBi b29sIG9wZXJhdG9yIT0oY29uc3QgX1JiX3RyZWVfYmFzZV9pdGVyYXRvciYgX194LAogICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IF9SYl90cmVlX2Jhc2VfaXRlcmF0b3ImIF9feSkgewogIHJl dHVybiBfX3guX01fbm9kZSAhPSBfX3kuX01fbm9kZTsKfQoKIyAyMTQgIi91c3IvbGliL2djYy1s aWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9z dGxfdHJlZS5oIiAzCgoKaW5saW5lIHZvaWQgCl9SYl90cmVlX3JvdGF0ZV9sZWZ0KF9SYl90cmVl X25vZGVfYmFzZSogX194LCBfUmJfdHJlZV9ub2RlX2Jhc2UqJiBfX3Jvb3QpCnsKICBfUmJfdHJl ZV9ub2RlX2Jhc2UqIF9feSA9IF9feC0+X01fcmlnaHQ7CiAgX194LT5fTV9yaWdodCA9IF9feS0+ X01fbGVmdDsKICBpZiAoX195LT5fTV9sZWZ0ICE9MCkKICAgIF9feS0+X01fbGVmdC0+X01fcGFy ZW50ID0gX194OwogIF9feS0+X01fcGFyZW50ID0gX194LT5fTV9wYXJlbnQ7CgogIGlmIChfX3gg PT0gX19yb290KQogICAgX19yb290ID0gX195OwogIGVsc2UgaWYgKF9feCA9PSBfX3gtPl9NX3Bh cmVudC0+X01fbGVmdCkKICAgIF9feC0+X01fcGFyZW50LT5fTV9sZWZ0ID0gX195OwogIGVsc2UK ICAgIF9feC0+X01fcGFyZW50LT5fTV9yaWdodCA9IF9feTsKICBfX3ktPl9NX2xlZnQgPSBfX3g7 CiAgX194LT5fTV9wYXJlbnQgPSBfX3k7Cn0KCmlubGluZSB2b2lkIApfUmJfdHJlZV9yb3RhdGVf cmlnaHQoX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3gsIF9SYl90cmVlX25vZGVfYmFzZSomIF9fcm9v dCkKewogIF9SYl90cmVlX25vZGVfYmFzZSogX195ID0gX194LT5fTV9sZWZ0OwogIF9feC0+X01f bGVmdCA9IF9feS0+X01fcmlnaHQ7CiAgaWYgKF9feS0+X01fcmlnaHQgIT0gMCkKICAgIF9feS0+ X01fcmlnaHQtPl9NX3BhcmVudCA9IF9feDsKICBfX3ktPl9NX3BhcmVudCA9IF9feC0+X01fcGFy ZW50OwoKICBpZiAoX194ID09IF9fcm9vdCkKICAgIF9fcm9vdCA9IF9feTsKICBlbHNlIGlmIChf X3ggPT0gX194LT5fTV9wYXJlbnQtPl9NX3JpZ2h0KQogICAgX194LT5fTV9wYXJlbnQtPl9NX3Jp Z2h0ID0gX195OwogIGVsc2UKICAgIF9feC0+X01fcGFyZW50LT5fTV9sZWZ0ID0gX195OwogIF9f eS0+X01fcmlnaHQgPSBfX3g7CiAgX194LT5fTV9wYXJlbnQgPSBfX3k7Cn0KCmlubGluZSB2b2lk IApfUmJfdHJlZV9yZWJhbGFuY2UoX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3gsIF9SYl90cmVlX25v ZGVfYmFzZSomIF9fcm9vdCkKewogIF9feC0+X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKICB3 aGlsZSAoX194ICE9IF9fcm9vdCAmJiBfX3gtPl9NX3BhcmVudC0+X01fY29sb3IgPT0gX1NfcmJf dHJlZV9yZWQpIHsKICAgIGlmIChfX3gtPl9NX3BhcmVudCA9PSBfX3gtPl9NX3BhcmVudC0+X01f cGFyZW50LT5fTV9sZWZ0KSB7CiAgICAgIF9SYl90cmVlX25vZGVfYmFzZSogX195ID0gX194LT5f TV9wYXJlbnQtPl9NX3BhcmVudC0+X01fcmlnaHQ7CiAgICAgIGlmIChfX3kgJiYgX195LT5fTV9j b2xvciA9PSBfU19yYl90cmVlX3JlZCkgewogICAgICAgIF9feC0+X01fcGFyZW50LT5fTV9jb2xv ciA9IF9TX3JiX3RyZWVfYmxhY2s7CiAgICAgICAgX195LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVf YmxhY2s7CiAgICAgICAgX194LT5fTV9wYXJlbnQtPl9NX3BhcmVudC0+X01fY29sb3IgPSBfU19y Yl90cmVlX3JlZDsKICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50OwogICAg ICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmIChfX3ggPT0gX194LT5fTV9wYXJlbnQtPl9NX3Jp Z2h0KSB7CiAgICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudDsKICAgICAgICAgIF9SYl90cmVl X3JvdGF0ZV9sZWZ0KF9feCwgX19yb290KTsKICAgICAgICB9CiAgICAgICAgX194LT5fTV9wYXJl bnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKICAgICAgICBfX3gtPl9NX3BhcmVudC0+ X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOwogICAgICAgIF9SYl90cmVlX3Jv dGF0ZV9yaWdodChfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LCBfX3Jvb3QpOwogICAgICB9CiAg ICB9CiAgICBlbHNlIHsKICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3kgPSBfX3gtPl9NX3Bh cmVudC0+X01fcGFyZW50LT5fTV9sZWZ0OwogICAgICBpZiAoX195ICYmIF9feS0+X01fY29sb3Ig PT0gX1NfcmJfdHJlZV9yZWQpIHsKICAgICAgICBfX3gtPl9NX3BhcmVudC0+X01fY29sb3IgPSBf U19yYl90cmVlX2JsYWNrOwogICAgICAgIF9feS0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNr OwogICAgICAgIF9feC0+X01fcGFyZW50LT5fTV9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJl ZV9yZWQ7CiAgICAgICAgX194ID0gX194LT5fTV9wYXJlbnQtPl9NX3BhcmVudDsKICAgICAgfQog ICAgICBlbHNlIHsKICAgICAgICBpZiAoX194ID09IF9feC0+X01fcGFyZW50LT5fTV9sZWZ0KSB7 CiAgICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudDsKICAgICAgICAgIF9SYl90cmVlX3JvdGF0 ZV9yaWdodChfX3gsIF9fcm9vdCk7CiAgICAgICAgfQogICAgICAgIF9feC0+X01fcGFyZW50LT5f TV9jb2xvciA9IF9TX3JiX3RyZWVfYmxhY2s7CiAgICAgICAgX194LT5fTV9wYXJlbnQtPl9NX3Bh cmVudC0+X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKICAgICAgICBfUmJfdHJlZV9yb3RhdGVf bGVmdChfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LCBfX3Jvb3QpOwogICAgICB9CiAgICB9CiAg fQogIF9fcm9vdC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwp9CgppbmxpbmUgX1JiX3Ry ZWVfbm9kZV9iYXNlKgpfUmJfdHJlZV9yZWJhbGFuY2VfZm9yX2VyYXNlKF9SYl90cmVlX25vZGVf YmFzZSogX196LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYl90cmVlX25vZGVfYmFz ZSomIF9fcm9vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jh c2UqJiBfX2xlZnRtb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYl90cmVlX25v ZGVfYmFzZSomIF9fcmlnaHRtb3N0KQp7CiAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3kgPSBfX3o7 CiAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3ggPSAwOwogIF9SYl90cmVlX25vZGVfYmFzZSogX194 X3BhcmVudCA9IDA7CiAgaWYgKF9feS0+X01fbGVmdCA9PSAwKSAgICAgIAogICAgX194ID0gX195 LT5fTV9yaWdodDsgICAgICAKICBlbHNlCiAgICBpZiAoX195LT5fTV9yaWdodCA9PSAwKSAgIAog ICAgICBfX3ggPSBfX3ktPl9NX2xlZnQ7ICAgICAKICAgIGVsc2UgeyAgICAgICAgICAgICAgICAg ICAgCiAgICAgIF9feSA9IF9feS0+X01fcmlnaHQ7ICAgIAogICAgICB3aGlsZSAoX195LT5fTV9s ZWZ0ICE9IDApCiAgICAgICAgX195ID0gX195LT5fTV9sZWZ0OwogICAgICBfX3ggPSBfX3ktPl9N X3JpZ2h0OwogICAgfQogIGlmIChfX3kgIT0gX196KSB7ICAgICAgICAgICAKICAgIF9fei0+X01f bGVmdC0+X01fcGFyZW50ID0gX195OyAKICAgIF9feS0+X01fbGVmdCA9IF9fei0+X01fbGVmdDsK ICAgIGlmIChfX3kgIT0gX196LT5fTV9yaWdodCkgewogICAgICBfX3hfcGFyZW50ID0gX195LT5f TV9wYXJlbnQ7CiAgICAgIGlmIChfX3gpIF9feC0+X01fcGFyZW50ID0gX195LT5fTV9wYXJlbnQ7 CiAgICAgIF9feS0+X01fcGFyZW50LT5fTV9sZWZ0ID0gX194OyAgICAgICAKICAgICAgX195LT5f TV9yaWdodCA9IF9fei0+X01fcmlnaHQ7CiAgICAgIF9fei0+X01fcmlnaHQtPl9NX3BhcmVudCA9 IF9feTsKICAgIH0KICAgIGVsc2UKICAgICAgX194X3BhcmVudCA9IF9feTsgIAogICAgaWYgKF9f cm9vdCA9PSBfX3opCiAgICAgIF9fcm9vdCA9IF9feTsKICAgIGVsc2UgaWYgKF9fei0+X01fcGFy ZW50LT5fTV9sZWZ0ID09IF9feikKICAgICAgX196LT5fTV9wYXJlbnQtPl9NX2xlZnQgPSBfX3k7 CiAgICBlbHNlIAogICAgICBfX3otPl9NX3BhcmVudC0+X01fcmlnaHQgPSBfX3k7CiAgICBfX3kt Pl9NX3BhcmVudCA9IF9fei0+X01fcGFyZW50OwogICAgIDo6c3dhcChfX3ktPl9NX2NvbG9yLCBf X3otPl9NX2NvbG9yKTsKICAgIF9feSA9IF9fejsKICAgICAKICB9CiAgZWxzZSB7ICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgX194X3BhcmVudCA9IF9feS0+X01fcGFyZW50OwogICAgaWYg KF9feCkgX194LT5fTV9wYXJlbnQgPSBfX3ktPl9NX3BhcmVudDsgICAKICAgIGlmIChfX3Jvb3Qg PT0gX196KQogICAgICBfX3Jvb3QgPSBfX3g7CiAgICBlbHNlIAogICAgICBpZiAoX196LT5fTV9w YXJlbnQtPl9NX2xlZnQgPT0gX196KQogICAgICAgIF9fei0+X01fcGFyZW50LT5fTV9sZWZ0ID0g X194OwogICAgICBlbHNlCiAgICAgICAgX196LT5fTV9wYXJlbnQtPl9NX3JpZ2h0ID0gX194Owog ICAgaWYgKF9fbGVmdG1vc3QgPT0gX196KSAKICAgICAgaWYgKF9fei0+X01fcmlnaHQgPT0gMCkg ICAgICAgICAKICAgICAgICBfX2xlZnRtb3N0ID0gX196LT5fTV9wYXJlbnQ7CiAgICAgCiAgICAg IGVsc2UKICAgICAgICBfX2xlZnRtb3N0ID0gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19taW5pbXVt KF9feCk7CiAgICBpZiAoX19yaWdodG1vc3QgPT0gX196KSAgCiAgICAgIGlmIChfX3otPl9NX2xl ZnQgPT0gMCkgICAgICAgICAgCiAgICAgICAgX19yaWdodG1vc3QgPSBfX3otPl9NX3BhcmVudDsg IAogICAgIAogICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBfX3JpZ2h0 bW9zdCA9IF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWF4aW11bShfX3gpOwogIH0KICBpZiAoX195 LT5fTV9jb2xvciAhPSBfU19yYl90cmVlX3JlZCkgeyAKICAgIHdoaWxlIChfX3ggIT0gX19yb290 ICYmIChfX3ggPT0gMCB8fCBfX3gtPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfYmxhY2spKQogICAg ICBpZiAoX194ID09IF9feF9wYXJlbnQtPl9NX2xlZnQpIHsKICAgICAgICBfUmJfdHJlZV9ub2Rl X2Jhc2UqIF9fdyA9IF9feF9wYXJlbnQtPl9NX3JpZ2h0OwogICAgICAgIGlmIChfX3ctPl9NX2Nv bG9yID09IF9TX3JiX3RyZWVfcmVkKSB7CiAgICAgICAgICBfX3ctPl9NX2NvbG9yID0gX1NfcmJf dHJlZV9ibGFjazsKICAgICAgICAgIF9feF9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9y ZWQ7CiAgICAgICAgICBfUmJfdHJlZV9yb3RhdGVfbGVmdChfX3hfcGFyZW50LCBfX3Jvb3QpOwog ICAgICAgICAgX193ID0gX194X3BhcmVudC0+X01fcmlnaHQ7CiAgICAgICAgfQogICAgICAgIGlm ICgoX193LT5fTV9sZWZ0ID09IDAgfHwgCiAgICAgICAgICAgICBfX3ctPl9NX2xlZnQtPl9NX2Nv bG9yID09IF9TX3JiX3RyZWVfYmxhY2spICYmCiAgICAgICAgICAgIChfX3ctPl9NX3JpZ2h0ID09 IDAgfHwgCiAgICAgICAgICAgICBfX3ctPl9NX3JpZ2h0LT5fTV9jb2xvciA9PSBfU19yYl90cmVl X2JsYWNrKSkgewogICAgICAgICAgX193LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOwogICAg ICAgICAgX194ID0gX194X3BhcmVudDsKICAgICAgICAgIF9feF9wYXJlbnQgPSBfX3hfcGFyZW50 LT5fTV9wYXJlbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChfX3ctPl9NX3JpZ2h0 ID09IDAgfHwgCiAgICAgICAgICAgICAgX193LT5fTV9yaWdodC0+X01fY29sb3IgPT0gX1NfcmJf dHJlZV9ibGFjaykgewogICAgICAgICAgICBpZiAoX193LT5fTV9sZWZ0KSBfX3ctPl9NX2xlZnQt Pl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKICAgICAgICAgICAgX193LT5fTV9jb2xvciA9 IF9TX3JiX3RyZWVfcmVkOwogICAgICAgICAgICBfUmJfdHJlZV9yb3RhdGVfcmlnaHQoX193LCBf X3Jvb3QpOwogICAgICAgICAgICBfX3cgPSBfX3hfcGFyZW50LT5fTV9yaWdodDsKICAgICAgICAg IH0KICAgICAgICAgIF9fdy0+X01fY29sb3IgPSBfX3hfcGFyZW50LT5fTV9jb2xvcjsKICAgICAg ICAgIF9feF9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKICAgICAgICAgIGlm IChfX3ctPl9NX3JpZ2h0KSBfX3ctPl9NX3JpZ2h0LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfYmxh Y2s7CiAgICAgICAgICBfUmJfdHJlZV9yb3RhdGVfbGVmdChfX3hfcGFyZW50LCBfX3Jvb3QpOwog ICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAg ICAKICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9fdyA9IF9feF9wYXJlbnQtPl9NX2xlZnQ7 CiAgICAgICAgaWYgKF9fdy0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpIHsKICAgICAgICAg IF9fdy0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwogICAgICAgICAgX194X3BhcmVudC0+ X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKICAgICAgICAgIF9SYl90cmVlX3JvdGF0ZV9yaWdo dChfX3hfcGFyZW50LCBfX3Jvb3QpOwogICAgICAgICAgX193ID0gX194X3BhcmVudC0+X01fbGVm dDsKICAgICAgICB9CiAgICAgICAgaWYgKChfX3ctPl9NX3JpZ2h0ID09IDAgfHwgCiAgICAgICAg ICAgICBfX3ctPl9NX3JpZ2h0LT5fTV9jb2xvciA9PSBfU19yYl90cmVlX2JsYWNrKSAmJgogICAg ICAgICAgICAoX193LT5fTV9sZWZ0ID09IDAgfHwgCiAgICAgICAgICAgICBfX3ctPl9NX2xlZnQt Pl9NX2NvbG9yID09IF9TX3JiX3RyZWVfYmxhY2spKSB7CiAgICAgICAgICBfX3ctPl9NX2NvbG9y ID0gX1NfcmJfdHJlZV9yZWQ7CiAgICAgICAgICBfX3ggPSBfX3hfcGFyZW50OwogICAgICAgICAg X194X3BhcmVudCA9IF9feF9wYXJlbnQtPl9NX3BhcmVudDsKICAgICAgICB9IGVsc2UgewogICAg ICAgICAgaWYgKF9fdy0+X01fbGVmdCA9PSAwIHx8IAogICAgICAgICAgICAgIF9fdy0+X01fbGVm dC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9ibGFjaykgewogICAgICAgICAgICBpZiAoX193LT5f TV9yaWdodCkgX193LT5fTV9yaWdodC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwogICAg ICAgICAgICBfX3ctPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9yZWQ7CiAgICAgICAgICAgIF9SYl90 cmVlX3JvdGF0ZV9sZWZ0KF9fdywgX19yb290KTsKICAgICAgICAgICAgX193ID0gX194X3BhcmVu dC0+X01fbGVmdDsKICAgICAgICAgIH0KICAgICAgICAgIF9fdy0+X01fY29sb3IgPSBfX3hfcGFy ZW50LT5fTV9jb2xvcjsKICAgICAgICAgIF9feF9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJl ZV9ibGFjazsKICAgICAgICAgIGlmIChfX3ctPl9NX2xlZnQpIF9fdy0+X01fbGVmdC0+X01fY29s b3IgPSBfU19yYl90cmVlX2JsYWNrOwogICAgICAgICAgX1JiX3RyZWVfcm90YXRlX3JpZ2h0KF9f eF9wYXJlbnQsIF9fcm9vdCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAg IGlmIChfX3gpIF9feC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwogIH0KICByZXR1cm4g X195Owp9CgogCiAKIAogCgoKCiAKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBi b29sIF9TX2luc3RhbmNlbGVzcz4KY2xhc3MgX1JiX3RyZWVfYWxsb2NfYmFzZSB7CnB1YmxpYzoK ICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjphbGxvY2F0b3Jf dHlwZSBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29u c3QgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3I7IH0KCiAgX1JiX3RyZWVfYWxsb2NfYmFzZShj b25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQogICAgOiBfTV9ub2RlX2FsbG9jYXRvcihfX2EpLCBf TV9oZWFkZXIoMCkge30KCnByb3RlY3RlZDoKICB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9SYl90 cmVlX25vZGU8X1RwPiwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUKICAgICAgICAgICBfTV9ub2Rl X2FsbG9jYXRvcjsKICBfUmJfdHJlZV9ub2RlPF9UcD4qIF9NX2hlYWRlcjsKCiAgX1JiX3RyZWVf bm9kZTxfVHA+KiBfTV9nZXRfbm9kZSgpIAogICAgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3Iu YWxsb2NhdGUoMSk7IH0KICB2b2lkIF9NX3B1dF9ub2RlKF9SYl90cmVlX25vZGU8X1RwPiogX19w KSAKICAgIHsgX01fbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX3AsIDEpOyB9Cn07CgogCnRl bXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KY2xhc3MgX1JiX3RyZWVfYWxsb2NfYmFz ZTxfVHAsIF9BbGxvYywgdHJ1ZT4gewpwdWJsaWM6CiAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2Nf dHJhaXRzPF9UcCwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CiAgYWxs b2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIGFsbG9jYXRvcl90eXBl KCk7IH0KCiAgX1JiX3RyZWVfYWxsb2NfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYpIDogX01f aGVhZGVyKDApIHt9Cgpwcm90ZWN0ZWQ6CiAgX1JiX3RyZWVfbm9kZTxfVHA+KiBfTV9oZWFkZXI7 CgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfUmJfdHJlZV9ub2RlPF9UcD4sIF9B bGxvYz46Ol9BbGxvY190eXBlCiAgICAgICAgICBfQWxsb2NfdHlwZTsKCiAgX1JiX3RyZWVfbm9k ZTxfVHA+KiBfTV9nZXRfbm9kZSgpCiAgICB7IHJldHVybiBfQWxsb2NfdHlwZTo6YWxsb2NhdGUo MSk7IH0KICB2b2lkIF9NX3B1dF9ub2RlKF9SYl90cmVlX25vZGU8X1RwPiogX19wKQogICAgeyBf QWxsb2NfdHlwZTo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Rw LCBjbGFzcyBfQWxsb2M+CnN0cnVjdCBfUmJfdHJlZV9iYXNlCiAgOiBwdWJsaWMgX1JiX3RyZWVf YWxsb2NfYmFzZTxfVHAsIF9BbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9B bGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjpfU19pbnN0YW5jZWxlc3M+CnsKICB0eXBlZGVmIF9S Yl90cmVlX2FsbG9jX2Jhc2U8X1RwLCBfQWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjpfU19pbnN0YW5jZWxlc3M+CiAgICAgICAg ICBfQmFzZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0 b3JfdHlwZTsKCiAgX1JiX3RyZWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSAKICAg IDogX0Jhc2UoX19hKSB7IF9NX2hlYWRlciA9IF9NX2dldF9ub2RlKCk7IH0KICB+X1JiX3RyZWVf YmFzZSgpIHsgX01fcHV0X25vZGUoX01faGVhZGVyKTsgfQoKfTsKCiMgNTE5ICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX3RyZWUuaCIgMwoKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNs YXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfQ29tcGFyZSwKICAgICAgICAgIGNsYXNzIF9BbGxvYyA9 IGFsbG9jYXRvcjwgX1ZhbHVlID4gID4KY2xhc3MgX1JiX3RyZWUgOiBwcm90ZWN0ZWQgX1JiX3Ry ZWVfYmFzZTxfVmFsdWUsIF9BbGxvYz4gewogIHR5cGVkZWYgX1JiX3RyZWVfYmFzZTxfVmFsdWUs IF9BbGxvYz4gX0Jhc2U7CnByb3RlY3RlZDoKICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZSog X0Jhc2VfcHRyOwogIHR5cGVkZWYgX1JiX3RyZWVfbm9kZTxfVmFsdWU+IF9SYl90cmVlX25vZGU7 CiAgdHlwZWRlZiBfUmJfdHJlZV9Db2xvcl90eXBlIF9Db2xvcl90eXBlOwpwdWJsaWM6CiAgdHlw ZWRlZiBfS2V5IGtleV90eXBlOwogIHR5cGVkZWYgX1ZhbHVlIHZhbHVlX3R5cGU7CiAgdHlwZWRl ZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3Rf cG9pbnRlcjsKICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKICB0eXBlZGVmIGNvbnN0 IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVmIF9SYl90cmVlX25vZGUqIF9M aW5rX3R5cGU7CiAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwogIHR5cGVkZWYgcHRyZGlmZl90 IGRpZmZlcmVuY2VfdHlwZTsKCiAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5 cGUgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0 IHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KCnByb3RlY3RlZDoKCgoKCgoKcHJv dGVjdGVkOgoKICBfTGlua190eXBlIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9f eCkKICB7CiAgICBfTGlua190eXBlIF9fdG1wID0gX01fZ2V0X25vZGUoKTsKICAgIHRyeSAgewog ICAgICBjb25zdHJ1Y3QoJl9fdG1wLT5fTV92YWx1ZV9maWVsZCwgX194KTsKICAgIH0KICAgIGNh dGNoKC4uLikgeyAgX01fcHV0X25vZGUoX190bXApIDsgdGhyb3c7IH0gOwogICAgcmV0dXJuIF9f dG1wOwogIH0KCiAgX0xpbmtfdHlwZSBfTV9jbG9uZV9ub2RlKF9MaW5rX3R5cGUgX194KQogIHsK ICAgIF9MaW5rX3R5cGUgX190bXAgPSBfTV9jcmVhdGVfbm9kZShfX3gtPl9NX3ZhbHVlX2ZpZWxk KTsKICAgIF9fdG1wLT5fTV9jb2xvciA9IF9feC0+X01fY29sb3I7CiAgICBfX3RtcC0+X01fbGVm dCA9IDA7CiAgICBfX3RtcC0+X01fcmlnaHQgPSAwOwogICAgcmV0dXJuIF9fdG1wOwogIH0KCiAg dm9pZCBkZXN0cm95X25vZGUoX0xpbmtfdHlwZSBfX3ApCiAgewogICAgZGVzdHJveSgmX19wLT5f TV92YWx1ZV9maWVsZCk7CiAgICBfTV9wdXRfbm9kZShfX3ApOwogIH0KCnByb3RlY3RlZDoKICBz aXplX3R5cGUgX01fbm9kZV9jb3VudDsgIAogIF9Db21wYXJlIF9NX2tleV9jb21wYXJlOwoKICBf TGlua190eXBlJiBfTV9yb290KCkgY29uc3QgCiAgICB7IHJldHVybiAoX0xpbmtfdHlwZSYpIF9N X2hlYWRlci0+X01fcGFyZW50OyB9CiAgX0xpbmtfdHlwZSYgX01fbGVmdG1vc3QoKSBjb25zdCAK ICAgIHsgcmV0dXJuIChfTGlua190eXBlJikgX01faGVhZGVyLT5fTV9sZWZ0OyB9CiAgX0xpbmtf dHlwZSYgX01fcmlnaHRtb3N0KCkgY29uc3QgCiAgICB7IHJldHVybiAoX0xpbmtfdHlwZSYpIF9N X2hlYWRlci0+X01fcmlnaHQ7IH0KCiAgc3RhdGljIF9MaW5rX3R5cGUmIF9TX2xlZnQoX0xpbmtf dHlwZSBfX3gpCiAgICB7IHJldHVybiAoX0xpbmtfdHlwZSYpKF9feC0+X01fbGVmdCk7IH0KICBz dGF0aWMgX0xpbmtfdHlwZSYgX1NfcmlnaHQoX0xpbmtfdHlwZSBfX3gpCiAgICB7IHJldHVybiAo X0xpbmtfdHlwZSYpKF9feC0+X01fcmlnaHQpOyB9CiAgc3RhdGljIF9MaW5rX3R5cGUmIF9TX3Bh cmVudChfTGlua190eXBlIF9feCkKICAgIHsgcmV0dXJuIChfTGlua190eXBlJikoX194LT5fTV9w YXJlbnQpOyB9CiAgc3RhdGljIHJlZmVyZW5jZSBfU192YWx1ZShfTGlua190eXBlIF9feCkKICAg IHsgcmV0dXJuIF9feC0+X01fdmFsdWVfZmllbGQ7IH0KICBzdGF0aWMgY29uc3QgX0tleSYgX1Nf a2V5KF9MaW5rX3R5cGUgX194KQogICAgeyByZXR1cm4gX0tleU9mVmFsdWUoKShfU192YWx1ZShf X3gpKTsgfQogIHN0YXRpYyBfQ29sb3JfdHlwZSYgX1NfY29sb3IoX0xpbmtfdHlwZSBfX3gpCiAg ICB7IHJldHVybiAoX0NvbG9yX3R5cGUmKShfX3gtPl9NX2NvbG9yKTsgfQoKICBzdGF0aWMgX0xp bmtfdHlwZSYgX1NfbGVmdChfQmFzZV9wdHIgX194KQogICAgeyByZXR1cm4gKF9MaW5rX3R5cGUm KShfX3gtPl9NX2xlZnQpOyB9CiAgc3RhdGljIF9MaW5rX3R5cGUmIF9TX3JpZ2h0KF9CYXNlX3B0 ciBfX3gpCiAgICB7IHJldHVybiAoX0xpbmtfdHlwZSYpKF9feC0+X01fcmlnaHQpOyB9CiAgc3Rh dGljIF9MaW5rX3R5cGUmIF9TX3BhcmVudChfQmFzZV9wdHIgX194KQogICAgeyByZXR1cm4gKF9M aW5rX3R5cGUmKShfX3gtPl9NX3BhcmVudCk7IH0KICBzdGF0aWMgcmVmZXJlbmNlIF9TX3ZhbHVl KF9CYXNlX3B0ciBfX3gpCiAgICB7IHJldHVybiAoKF9MaW5rX3R5cGUpX194KS0+X01fdmFsdWVf ZmllbGQ7IH0KICBzdGF0aWMgY29uc3QgX0tleSYgX1Nfa2V5KF9CYXNlX3B0ciBfX3gpCiAgICB7 IHJldHVybiBfS2V5T2ZWYWx1ZSgpKF9TX3ZhbHVlKF9MaW5rX3R5cGUoX194KSkpO30gCiAgc3Rh dGljIF9Db2xvcl90eXBlJiBfU19jb2xvcihfQmFzZV9wdHIgX194KQogICAgeyByZXR1cm4gKF9D b2xvcl90eXBlJikoX0xpbmtfdHlwZShfX3gpLT5fTV9jb2xvcik7IH0KCiAgc3RhdGljIF9MaW5r X3R5cGUgX1NfbWluaW11bShfTGlua190eXBlIF9feCkgCiAgICB7IHJldHVybiAoX0xpbmtfdHlw ZSkgIF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWluaW11bShfX3gpOyB9CgogIHN0YXRpYyBfTGlu a190eXBlIF9TX21heGltdW0oX0xpbmtfdHlwZSBfX3gpCiAgICB7IHJldHVybiAoX0xpbmtfdHlw ZSkgX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19tYXhpbXVtKF9feCk7IH0KCnB1YmxpYzoKICB0eXBl ZGVmIF9SYl90cmVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIHJlZmVyZW5jZSwgcG9pbnRlcj4gaXRl cmF0b3I7CiAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBjb25zdF9yZWZl cmVuY2UsIGNvbnN0X3BvaW50ZXI+IAogICAgICAgICAgY29uc3RfaXRlcmF0b3I7CgoKICB0eXBl ZGVmIHJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0 b3I7CiAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9y OwoKCgoKCgoKIAoKcHJpdmF0ZToKICBpdGVyYXRvciBfTV9pbnNlcnQoX0Jhc2VfcHRyIF9feCwg X0Jhc2VfcHRyIF9feSwgY29uc3QgdmFsdWVfdHlwZSYgX192KTsKICBfTGlua190eXBlIF9NX2Nv cHkoX0xpbmtfdHlwZSBfX3gsIF9MaW5rX3R5cGUgX19wKTsKICB2b2lkIF9NX2VyYXNlKF9MaW5r X3R5cGUgX194KTsKCnB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg X1JiX3RyZWUoKQogICAgOiBfQmFzZShhbGxvY2F0b3JfdHlwZSgpKSwgX01fbm9kZV9jb3VudCgw KSwgX01fa2V5X2NvbXBhcmUoKQogICAgeyBfTV9lbXB0eV9pbml0aWFsaXplKCk7IH0KCiAgX1Ji X3RyZWUoY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKICAgIDogX0Jhc2UoYWxsb2NhdG9yX3R5cGUo KSksIF9NX25vZGVfY291bnQoMCksIF9NX2tleV9jb21wYXJlKF9fY29tcCkgCiAgICB7IF9NX2Vt cHR5X2luaXRpYWxpemUoKTsgfQoKICBfUmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wLCBj b25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQogICAgOiBfQmFzZShfX2EpLCBfTV9ub2RlX2NvdW50 KDApLCBfTV9rZXlfY29tcGFyZShfX2NvbXApIAogICAgeyBfTV9lbXB0eV9pbml0aWFsaXplKCk7 IH0KCiAgX1JiX3RyZWUoY29uc3QgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0Nv bXBhcmUsX0FsbG9jPiYgX194KSAKICAgIDogX0Jhc2UoX194LmdldF9hbGxvY2F0b3IoKSksCiAg ICAgIF9NX25vZGVfY291bnQoMCksIF9NX2tleV9jb21wYXJlKF9feC5fTV9rZXlfY29tcGFyZSkK ICB7IAogICAgaWYgKF9feC5fTV9yb290KCkgPT0gMCkKICAgICAgX01fZW1wdHlfaW5pdGlhbGl6 ZSgpOwogICAgZWxzZSB7CiAgICAgIF9TX2NvbG9yKF9NX2hlYWRlcikgPSBfU19yYl90cmVlX3Jl ZDsKICAgICAgX01fcm9vdCgpID0gX01fY29weShfX3guX01fcm9vdCgpLCBfTV9oZWFkZXIpOwog ICAgICBfTV9sZWZ0bW9zdCgpID0gX1NfbWluaW11bShfTV9yb290KCkpOwogICAgICBfTV9yaWdo dG1vc3QoKSA9IF9TX21heGltdW0oX01fcm9vdCgpKTsKICAgIH0KICAgIF9NX25vZGVfY291bnQg PSBfX3guX01fbm9kZV9jb3VudDsKICB9CiAgfl9SYl90cmVlKCkgeyBjbGVhcigpOyB9CiAgX1Ji X3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPiYgCiAgb3BlcmF0 b3I9KGNvbnN0IF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxv Yz4mIF9feCk7Cgpwcml2YXRlOgogIHZvaWQgX01fZW1wdHlfaW5pdGlhbGl6ZSgpIHsKICAgIF9T X2NvbG9yKF9NX2hlYWRlcikgPSBfU19yYl90cmVlX3JlZDsgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBfTV9yb290KCkgPSAwOwogICAgX01fbGVmdG1v c3QoKSA9IF9NX2hlYWRlcjsKICAgIF9NX3JpZ2h0bW9zdCgpID0gX01faGVhZGVyOwogIH0KCnB1 YmxpYzogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIF9Db21wYXJlIGtl eV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fa2V5X2NvbXBhcmU7IH0KICBpdGVyYXRvciBiZWdp bigpIHsgcmV0dXJuIF9NX2xlZnRtb3N0KCk7IH0KICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNv bnN0IHsgcmV0dXJuIF9NX2xlZnRtb3N0KCk7IH0KICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBf TV9oZWFkZXI7IH0KICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9oZWFk ZXI7IH0KICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0 b3IoZW5kKCkpOyB9CiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IAog ICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyAKICB9CiAgcmV2ZXJzZV9p dGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQogIGNv bnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgCiAgICByZXR1cm4gY29uc3RfcmV2 ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKICB9IAogIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVy biBfTV9ub2RlX2NvdW50ID09IDA7IH0KICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJu IF9NX25vZGVfY291bnQ7IH0KICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBz aXplX3R5cGUoLTEpOyB9CgogIHZvaWQgc3dhcChfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZW YWx1ZSxfQ29tcGFyZSxfQWxsb2M+JiBfX3QpIHsKICAgICA6OnN3YXAoX01faGVhZGVyLCBfX3Qu X01faGVhZGVyKTsKICAgICA6OnN3YXAoX01fbm9kZV9jb3VudCwgX190Ll9NX25vZGVfY291bnQp OwogICAgIDo6c3dhcChfTV9rZXlfY29tcGFyZSwgX190Ll9NX2tleV9jb21wYXJlKTsKICB9CiAg ICAKcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBwYWlyPGl0ZXJh dG9yLGJvb2w+IGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKICBpdGVyYXRv ciBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKCiAgaXRlcmF0b3IgaW5zZXJ0 X3VuaXF1ZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOwogIGl0 ZXJhdG9yIGluc2VydF9lcXVhbChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBl JiBfX3gpOwoKCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgaW5zZXJ0 X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOwog IHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIGluc2VydF9lcXVhbChfSW5w dXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOwoKCgoKCgoKICB2b2lk IGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pOwogIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlf dHlwZSYgX194KTsKICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFz dCk7CiAgdm9pZCBlcmFzZShjb25zdCBrZXlfdHlwZSogX19maXJzdCwgY29uc3Qga2V5X3R5cGUq IF9fbGFzdCk7CiAgdm9pZCBjbGVhcigpIHsKICAgIGlmIChfTV9ub2RlX2NvdW50ICE9IDApIHsK ICAgICAgX01fZXJhc2UoX01fcm9vdCgpKTsKICAgICAgX01fbGVmdG1vc3QoKSA9IF9NX2hlYWRl cjsKICAgICAgX01fcm9vdCgpID0gMDsKICAgICAgX01fcmlnaHRtb3N0KCkgPSBfTV9oZWFkZXI7 CiAgICAgIF9NX25vZGVfY291bnQgPSAwOwogICAgfQogIH0gICAgICAKCnB1YmxpYzoKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlw ZSYgX194KTsKICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0 OwogIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdDsKICBpdGVyYXRv ciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KTsKICBjb25zdF9pdGVyYXRvciBsb3dl cl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdDsKICBpdGVyYXRvciB1cHBlcl9ib3Vu ZChjb25zdCBrZXlfdHlwZSYgX194KTsKICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25z dCBrZXlfdHlwZSYgX194KSBjb25zdDsKICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9y YW5nZShjb25zdCBrZXlfdHlwZSYgX194KTsKICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9p dGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3Q7CgpwdWJsaWM6 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGJvb2wgX19yYl92ZXJpZnkoKSBj b25zdDsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlP ZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CmlubGluZSBi b29sIApvcGVyYXRvcj09KGNvbnN0IF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9D b21wYXJlLF9BbGxvYz4mIF9feCwgCiAgICAgICAgICAgY29uc3QgX1JiX3RyZWU8X0tleSxfVmFs dWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPiYgX195KQp7CiAgcmV0dXJuIF9feC5zaXpl KCkgPT0gX195LnNpemUoKSAmJgogICAgICAgICBlcXVhbChfX3guYmVnaW4oKSwgX194LmVuZCgp LCBfX3kuYmVnaW4oKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNs YXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+ CmlubGluZSBib29sIApvcGVyYXRvcjwoY29uc3QgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9m VmFsdWUsX0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAgICAgICAgIGNvbnN0IF9SYl90cmVlPF9L ZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4mIF9feSkKewogIHJldHVybiBs ZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLCAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX195LmJlZ2luKCksIF9feS5lbmQoKSk7Cn0KCgoKdGVt cGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAg ICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgCnN3YXAoX1Ji X3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAg ICBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+JiBfX3kp CnsKICBfX3guc3dhcChfX3kpOwp9CgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1Zh bHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3Mg X0FsbG9jPgpfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+ JiAKX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6 b3BlcmF0b3I9KGNvbnN0IF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJl LF9BbGxvYz4mIF9feCkKewogIGlmICh0aGlzICE9ICZfX3gpIHsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICBjbGVhcigpOwogICAgX01fbm9kZV9jb3VudCA9IDA7CiAgICBf TV9rZXlfY29tcGFyZSA9IF9feC5fTV9rZXlfY29tcGFyZTsgICAgICAgIAogICAgaWYgKF9feC5f TV9yb290KCkgPT0gMCkgewogICAgICBfTV9yb290KCkgPSAwOwogICAgICBfTV9sZWZ0bW9zdCgp ID0gX01faGVhZGVyOwogICAgICBfTV9yaWdodG1vc3QoKSA9IF9NX2hlYWRlcjsKICAgIH0KICAg IGVsc2UgewogICAgICBfTV9yb290KCkgPSBfTV9jb3B5KF9feC5fTV9yb290KCksIF9NX2hlYWRl cik7CiAgICAgIF9NX2xlZnRtb3N0KCkgPSBfU19taW5pbXVtKF9NX3Jvb3QoKSk7CiAgICAgIF9N X3JpZ2h0bW9zdCgpID0gX1NfbWF4aW11bShfTV9yb290KCkpOwogICAgICBfTV9ub2RlX2NvdW50 ID0gX194Ll9NX25vZGVfY291bnQ7CiAgICB9CiAgfQogIHJldHVybiAqdGhpczsKfQoKdGVtcGxh dGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAg ICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KdHlwZW5hbWUgX1JiX3RyZWU8X0tleSxf VmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6aXRlcmF0b3IKX1JiX3RyZWU8X0tl eSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6X01faW5zZXJ0KF9CYXNl X3B0ciBfX3hfLCBfQmFzZV9wdHIgX195XywgY29uc3QgX1ZhbHVlJiBfX3YpCnsKICBfTGlua190 eXBlIF9feCA9IChfTGlua190eXBlKSBfX3hfOwogIF9MaW5rX3R5cGUgX195ID0gKF9MaW5rX3R5 cGUpIF9feV87CiAgX0xpbmtfdHlwZSBfX3o7CgogIGlmIChfX3kgPT0gX01faGVhZGVyIHx8IF9f eCAhPSAwIHx8IAogICAgICBfTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksIF9TX2tl eShfX3kpKSkgewogICAgX196ID0gX01fY3JlYXRlX25vZGUoX192KTsKICAgIF9TX2xlZnQoX195 KSA9IF9fejsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAogICAgaWYgKF9feSA9PSBfTV9oZWFkZXIpIHsKICAgICAgX01fcm9vdCgpID0gX196 OwogICAgICBfTV9yaWdodG1vc3QoKSA9IF9fejsKICAgIH0KICAgIGVsc2UgaWYgKF9feSA9PSBf TV9sZWZ0bW9zdCgpKQogICAgICBfTV9sZWZ0bW9zdCgpID0gX196OyAgICAKICB9CiAgZWxzZSB7 CiAgICBfX3ogPSBfTV9jcmVhdGVfbm9kZShfX3YpOwogICAgX1NfcmlnaHQoX195KSA9IF9fejsK ICAgIGlmIChfX3kgPT0gX01fcmlnaHRtb3N0KCkpCiAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX196 OyAgIAogIH0KICBfU19wYXJlbnQoX196KSA9IF9feTsKICBfU19sZWZ0KF9feikgPSAwOwogIF9T X3JpZ2h0KF9feikgPSAwOwogIF9SYl90cmVlX3JlYmFsYW5jZShfX3osIF9NX2hlYWRlci0+X01f cGFyZW50KTsKICArK19NX25vZGVfY291bnQ7CiAgcmV0dXJuIGl0ZXJhdG9yKF9feik7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAg ICAgICAgIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CnR5cGVuYW1lIF9SYl90cmVlPF9L ZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46Oml0ZXJhdG9yCl9SYl90cmVl PF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4KICA6Omluc2VydF9lcXVh bChjb25zdCBfVmFsdWUmIF9fdikKewogIF9MaW5rX3R5cGUgX195ID0gX01faGVhZGVyOwogIF9M aW5rX3R5cGUgX194ID0gX01fcm9vdCgpOwogIHdoaWxlIChfX3ggIT0gMCkgewogICAgX195ID0g X194OwogICAgX194ID0gX01fa2V5X2NvbXBhcmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19rZXko X194KSkgPyAKICAgICAgICAgICAgX1NfbGVmdChfX3gpIDogX1NfcmlnaHQoX194KTsKICB9CiAg cmV0dXJuIF9NX2luc2VydChfX3gsIF9feSwgX192KTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfS2V5 LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21w YXJlLCBjbGFzcyBfQWxsb2M+CnBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tl eU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6aXRlcmF0b3IsIAogICAgIGJvb2w+Cl9SYl90cmVl PF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4KICA6Omluc2VydF91bmlx dWUoY29uc3QgX1ZhbHVlJiBfX3YpCnsKICBfTGlua190eXBlIF9feSA9IF9NX2hlYWRlcjsKICBf TGlua190eXBlIF9feCA9IF9NX3Jvb3QoKTsKICBib29sIF9fY29tcCA9IHRydWU7CiAgd2hpbGUg KF9feCAhPSAwKSB7CiAgICBfX3kgPSBfX3g7CiAgICBfX2NvbXAgPSBfTV9rZXlfY29tcGFyZShf S2V5T2ZWYWx1ZSgpKF9fdiksIF9TX2tleShfX3gpKTsKICAgIF9feCA9IF9fY29tcCA/IF9TX2xl ZnQoX194KSA6IF9TX3JpZ2h0KF9feCk7CiAgfQogIGl0ZXJhdG9yIF9faiA9IGl0ZXJhdG9yKF9f eSk7ICAgCiAgaWYgKF9fY29tcCkKICAgIGlmIChfX2ogPT0gYmVnaW4oKSkgICAgIAogICAgICBy ZXR1cm4gcGFpcjxpdGVyYXRvcixib29sPihfTV9pbnNlcnQoX194LCBfX3ksIF9fdiksIHRydWUp OwogICAgZWxzZQogICAgICAtLV9fajsKICBpZiAoX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fai5f TV9ub2RlKSwgX0tleU9mVmFsdWUoKShfX3YpKSkKICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLGJv b2w+KF9NX2luc2VydChfX3gsIF9feSwgX192KSwgdHJ1ZSk7CiAgcmV0dXJuIHBhaXI8aXRlcmF0 b3IsYm9vbD4oX19qLCBmYWxzZSk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1Zh bCwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9B bGxvYz4KdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJl LCBfQWxsb2M+OjppdGVyYXRvciAKX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9D b21wYXJlLCBfQWxsb2M+CiAgOjppbnNlcnRfdW5pcXVlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNv bnN0IF9WYWwmIF9fdikKewogIGlmIChfX3Bvc2l0aW9uLl9NX25vZGUgPT0gX01faGVhZGVyLT5f TV9sZWZ0KSB7ICAKICAgIGlmIChzaXplKCkgPiAwICYmIAogICAgICAgIF9NX2tleV9jb21wYXJl KF9LZXlPZlZhbHVlKCkoX192KSwgX1Nfa2V5KF9fcG9zaXRpb24uX01fbm9kZSkpKQogICAgICBy ZXR1cm4gX01faW5zZXJ0KF9fcG9zaXRpb24uX01fbm9kZSwgX19wb3NpdGlvbi5fTV9ub2RlLCBf X3YpOwogICAgIAogICAgZWxzZQogICAgICByZXR1cm4gaW5zZXJ0X3VuaXF1ZShfX3YpLmZpcnN0 OwogIH0gZWxzZSBpZiAoX19wb3NpdGlvbi5fTV9ub2RlID09IF9NX2hlYWRlcikgeyAgCiAgICBp ZiAoX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9NX3JpZ2h0bW9zdCgpKSwgX0tleU9mVmFsdWUoKShf X3YpKSkKICAgICAgcmV0dXJuIF9NX2luc2VydCgwLCBfTV9yaWdodG1vc3QoKSwgX192KTsKICAg IGVsc2UKICAgICAgcmV0dXJuIGluc2VydF91bmlxdWUoX192KS5maXJzdDsKICB9IGVsc2Ugewog ICAgaXRlcmF0b3IgX19iZWZvcmUgPSBfX3Bvc2l0aW9uOwogICAgLS1fX2JlZm9yZTsKICAgIGlm IChfTV9rZXlfY29tcGFyZShfU19rZXkoX19iZWZvcmUuX01fbm9kZSksIF9LZXlPZlZhbHVlKCko X192KSkgCiAgICAgICAgJiYgX01fa2V5X2NvbXBhcmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19r ZXkoX19wb3NpdGlvbi5fTV9ub2RlKSkpIHsKICAgICAgaWYgKF9TX3JpZ2h0KF9fYmVmb3JlLl9N X25vZGUpID09IDApCiAgICAgICAgcmV0dXJuIF9NX2luc2VydCgwLCBfX2JlZm9yZS5fTV9ub2Rl LCBfX3YpOyAKICAgICAgZWxzZQogICAgICAgIHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5f TV9ub2RlLCBfX3Bvc2l0aW9uLl9NX25vZGUsIF9fdik7CiAgICAgCiAgICB9IGVsc2UKICAgICAg cmV0dXJuIGluc2VydF91bmlxdWUoX192KS5maXJzdDsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBf S2V5LCBjbGFzcyBfVmFsLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29t cGFyZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWwsX0tleU9mVmFs dWUsX0NvbXBhcmUsX0FsbG9jPjo6aXRlcmF0b3IgCl9SYl90cmVlPF9LZXksX1ZhbCxfS2V5T2ZW YWx1ZSxfQ29tcGFyZSxfQWxsb2M+CiAgOjppbnNlcnRfZXF1YWwoaXRlcmF0b3IgX19wb3NpdGlv biwgY29uc3QgX1ZhbCYgX192KQp7CiAgaWYgKF9fcG9zaXRpb24uX01fbm9kZSA9PSBfTV9oZWFk ZXItPl9NX2xlZnQpIHsgIAogICAgaWYgKHNpemUoKSA+IDAgJiYgCiAgICAgICAgX01fa2V5X2Nv bXBhcmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19rZXkoX19wb3NpdGlvbi5fTV9ub2RlKSkpCiAg ICAgIHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5fTV9ub2RlLCBfX3Bvc2l0aW9uLl9NX25v ZGUsIF9fdik7CiAgICAgCiAgICBlbHNlCiAgICAgIHJldHVybiBpbnNlcnRfZXF1YWwoX192KTsK ICB9IGVsc2UgaWYgKF9fcG9zaXRpb24uX01fbm9kZSA9PSBfTV9oZWFkZXIpIHsgCiAgICBpZiAo IV9NX2tleV9jb21wYXJlKF9LZXlPZlZhbHVlKCkoX192KSwgX1Nfa2V5KF9NX3JpZ2h0bW9zdCgp KSkpCiAgICAgIHJldHVybiBfTV9pbnNlcnQoMCwgX01fcmlnaHRtb3N0KCksIF9fdik7CiAgICBl bHNlCiAgICAgIHJldHVybiBpbnNlcnRfZXF1YWwoX192KTsKICB9IGVsc2UgewogICAgaXRlcmF0 b3IgX19iZWZvcmUgPSBfX3Bvc2l0aW9uOwogICAgLS1fX2JlZm9yZTsKICAgIGlmICghX01fa2V5 X2NvbXBhcmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19rZXkoX19iZWZvcmUuX01fbm9kZSkpCiAg ICAgICAgJiYgIV9NX2tleV9jb21wYXJlKF9TX2tleShfX3Bvc2l0aW9uLl9NX25vZGUpLCBfS2V5 T2ZWYWx1ZSgpKF9fdikpKSB7CiAgICAgIGlmIChfU19yaWdodChfX2JlZm9yZS5fTV9ub2RlKSA9 PSAwKQogICAgICAgIHJldHVybiBfTV9pbnNlcnQoMCwgX19iZWZvcmUuX01fbm9kZSwgX192KTsg CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gX01faW5zZXJ0KF9fcG9zaXRpb24uX01fbm9kZSwg X19wb3NpdGlvbi5fTV9ub2RlLCBfX3YpOwogICAgIAogICAgfSBlbHNlCiAgICAgIHJldHVybiBp bnNlcnRfZXF1YWwoX192KTsKICB9Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9W YWwsIGNsYXNzIF9Lb1YsIGNsYXNzIF9DbXAsIGNsYXNzIF9BbGxvYz4KICB0ZW1wbGF0ZTxjbGFz cyBfSUk+CnZvaWQgX1JiX3RyZWU8X0tleSxfVmFsLF9Lb1YsX0NtcCxfQWxsb2M+CiAgOjppbnNl cnRfZXF1YWwoX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QpCnsKICBmb3IgKCA7IF9fZmlyc3QgIT0g X19sYXN0OyArK19fZmlyc3QpCiAgICBpbnNlcnRfZXF1YWwoKl9fZmlyc3QpOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbCwgY2xhc3MgX0tvViwgY2xhc3MgX0NtcCwgY2xhc3Mg X0FsbG9jPiAKICB0ZW1wbGF0ZTxjbGFzcyBfSUk+CnZvaWQgX1JiX3RyZWU8X0tleSxfVmFsLF9L b1YsX0NtcCxfQWxsb2M+CiAgOjppbnNlcnRfdW5pcXVlKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0 KSB7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgaW5zZXJ0X3Vu aXF1ZSgqX19maXJzdCk7Cn0KCiMgMTAyMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtl LWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF90cmVlLmgiIDMKCiAg ICAgICAgIAp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZW YWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgdm9p ZCBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+CiAgOjpl cmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQp7CiAgX0xpbmtfdHlwZSBfX3kgPSAKICAgIChfTGlu a190eXBlKSBfUmJfdHJlZV9yZWJhbGFuY2VfZm9yX2VyYXNlKF9fcG9zaXRpb24uX01fbm9kZSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2hlYWRlci0+ X01fcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X01faGVhZGVyLT5fTV9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX01faGVhZGVyLT5fTV9yaWdodCk7CiAgZGVzdHJveV9ub2RlKF9feSk7CiAgLS1f TV9ub2RlX2NvdW50Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFz cyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp0 eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+ OjpzaXplX3R5cGUgCl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9B bGxvYz46OmVyYXNlKGNvbnN0IF9LZXkmIF9feCkKewogIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+ IF9fcCA9IGVxdWFsX3JhbmdlKF9feCk7CiAgc2l6ZV90eXBlIF9fbiA9IDA7CiAgZGlzdGFuY2Uo X19wLmZpcnN0LCBfX3Auc2Vjb25kLCBfX24pOwogIGVyYXNlKF9fcC5maXJzdCwgX19wLnNlY29u ZCk7CiAgcmV0dXJuIF9fbjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWwsIGNs YXNzIF9Lb1YsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CnR5cGVuYW1lIF9SYl90cmVl PF9LZXksIF9WYWwsIF9Lb1YsIF9Db21wYXJlLCBfQWxsb2M+OjpfTGlua190eXBlIApfUmJfdHJl ZTxfS2V5LF9WYWwsX0tvVixfQ29tcGFyZSxfQWxsb2M+CiAgOjpfTV9jb3B5KF9MaW5rX3R5cGUg X194LCBfTGlua190eXBlIF9fcCkKewogICAgICAgICAgICAgICAgICAgICAgICAgCiAgX0xpbmtf dHlwZSBfX3RvcCA9IF9NX2Nsb25lX25vZGUoX194KTsKICBfX3RvcC0+X01fcGFyZW50ID0gX19w OwogCiAgdHJ5ICB7CiAgICBpZiAoX194LT5fTV9yaWdodCkKICAgICAgX190b3AtPl9NX3JpZ2h0 ID0gX01fY29weShfU19yaWdodChfX3gpLCBfX3RvcCk7CiAgICBfX3AgPSBfX3RvcDsKICAgIF9f eCA9IF9TX2xlZnQoX194KTsKCiAgICB3aGlsZSAoX194ICE9IDApIHsKICAgICAgX0xpbmtfdHlw ZSBfX3kgPSBfTV9jbG9uZV9ub2RlKF9feCk7CiAgICAgIF9fcC0+X01fbGVmdCA9IF9feTsKICAg ICAgX195LT5fTV9wYXJlbnQgPSBfX3A7CiAgICAgIGlmIChfX3gtPl9NX3JpZ2h0KQogICAgICAg IF9feS0+X01fcmlnaHQgPSBfTV9jb3B5KF9TX3JpZ2h0KF9feCksIF9feSk7CiAgICAgIF9fcCA9 IF9feTsKICAgICAgX194ID0gX1NfbGVmdChfX3gpOwogICAgfQogIH0KICBjYXRjaCguLi4pIHsg IF9NX2VyYXNlKF9fdG9wKSA7IHRocm93OyB9IDsKCiAgcmV0dXJuIF9fdG9wOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAg ICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp2b2lkIF9SYl90cmVlPF9LZXksX1ZhbHVl LF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4KICA6Ol9NX2VyYXNlKF9MaW5rX3R5cGUgX194 KQp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIHdoaWxlIChfX3ggIT0gMCkg ewogICAgX01fZXJhc2UoX1NfcmlnaHQoX194KSk7CiAgICBfTGlua190eXBlIF9feSA9IF9TX2xl ZnQoX194KTsKICAgIGRlc3Ryb3lfbm9kZShfX3gpOwogICAgX194ID0gX195OwogIH0KfQoKdGVt cGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAg ICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4Kdm9pZCBfUmJfdHJlZTxfS2V5LF9W YWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+CiAgOjplcmFzZShpdGVyYXRvciBfX2Zp cnN0LCBpdGVyYXRvciBfX2xhc3QpCnsKICBpZiAoX19maXJzdCA9PSBiZWdpbigpICYmIF9fbGFz dCA9PSBlbmQoKSkKICAgIGNsZWFyKCk7CiAgZWxzZQogICAgd2hpbGUgKF9fZmlyc3QgIT0gX19s YXN0KSBlcmFzZShfX2ZpcnN0KyspOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1Zh bHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3Mg X0FsbG9jPgp2b2lkIF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9B bGxvYz4KICA6OmVyYXNlKGNvbnN0IF9LZXkqIF9fZmlyc3QsIGNvbnN0IF9LZXkqIF9fbGFzdCkg CnsKICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIGVyYXNlKCpfX2ZpcnN0KyspOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAg ICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5 LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjppdGVyYXRvciAKX1JiX3RyZWU8 X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6ZmluZChjb25zdCBfS2V5 JiBfX2spCnsKICBfTGlua190eXBlIF9feSA9IF9NX2hlYWRlcjsgICAgICAgCiAgX0xpbmtfdHlw ZSBfX3ggPSBfTV9yb290KCk7ICAgICAgIAoKICB3aGlsZSAoX194ICE9IDApIAogICAgaWYgKCFf TV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKICAgICAgX195ID0gX194LCBfX3ggPSBf U19sZWZ0KF9feCk7CiAgICBlbHNlCiAgICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7CgogIGl0ZXJh dG9yIF9faiA9IGl0ZXJhdG9yKF9feSk7ICAgCiAgcmV0dXJuIChfX2ogPT0gZW5kKCkgfHwgX01f a2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX19qLl9NX25vZGUpKSkgPyAKICAgICBlbmQoKSA6IF9f ajsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFs dWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KdHlwZW5hbWUgX1Ji X3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6Y29uc3RfaXRl cmF0b3IgCl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46 OmZpbmQoY29uc3QgX0tleSYgX19rKSBjb25zdAp7CiAgX0xpbmtfdHlwZSBfX3kgPSBfTV9oZWFk ZXI7ICAKICBfTGlua190eXBlIF9feCA9IF9NX3Jvb3QoKTsgIAoKICB3aGlsZSAoX194ICE9IDAp IHsKICAgIGlmICghX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9faykpCiAgICAgIF9feSA9 IF9feCwgX194ID0gX1NfbGVmdChfX3gpOwogICAgZWxzZQogICAgICBfX3ggPSBfU19yaWdodChf X3gpOwogIH0KICBjb25zdF9pdGVyYXRvciBfX2ogPSBjb25zdF9pdGVyYXRvcihfX3kpOyAgIAog IHJldHVybiAoX19qID09IGVuZCgpIHx8IF9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9fai5f TV9ub2RlKSkpID8KICAgIGVuZCgpIDogX19qOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xh c3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwg Y2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxf Q29tcGFyZSxfQWxsb2M+OjpzaXplX3R5cGUgCl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZh bHVlLF9Db21wYXJlLF9BbGxvYz4KICA6OmNvdW50KGNvbnN0IF9LZXkmIF9faykgY29uc3QKewog IHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBfX3AgPSBlcXVhbF9yYW5nZShf X2spOwogIHNpemVfdHlwZSBfX24gPSAwOwogIGRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29u ZCwgX19uKTsKICByZXR1cm4gX19uOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1Zh bHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3Mg X0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFy ZSxfQWxsb2M+OjppdGVyYXRvciAKX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0Nv bXBhcmUsX0FsbG9jPgogIDo6bG93ZXJfYm91bmQoY29uc3QgX0tleSYgX19rKQp7CiAgX0xpbmtf dHlwZSBfX3kgPSBfTV9oZWFkZXI7ICAKICBfTGlua190eXBlIF9feCA9IF9NX3Jvb3QoKTsgIAoK ICB3aGlsZSAoX194ICE9IDApIAogICAgaWYgKCFfTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwg X19rKSkKICAgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CiAgICBlbHNlCiAgICAg IF9feCA9IF9TX3JpZ2h0KF9feCk7CgogIHJldHVybiBpdGVyYXRvcihfX3kpOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAg ICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9W YWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+Ojpjb25zdF9pdGVyYXRvciAKX1JiX3Ry ZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6bG93ZXJfYm91 bmQoY29uc3QgX0tleSYgX19rKSBjb25zdAp7CiAgX0xpbmtfdHlwZSBfX3kgPSBfTV9oZWFkZXI7 ICAKICBfTGlua190eXBlIF9feCA9IF9NX3Jvb3QoKTsgIAoKICB3aGlsZSAoX194ICE9IDApIAog ICAgaWYgKCFfTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKICAgICAgX195ID0gX194 LCBfX3ggPSBfU19sZWZ0KF9feCk7CiAgICBlbHNlCiAgICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7 CgogIHJldHVybiBjb25zdF9pdGVyYXRvcihfX3kpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwg Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFy ZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1 ZSxfQ29tcGFyZSxfQWxsb2M+OjppdGVyYXRvciAKX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9m VmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6dXBwZXJfYm91bmQoY29uc3QgX0tleSYgX19rKQp7 CiAgX0xpbmtfdHlwZSBfX3kgPSBfTV9oZWFkZXI7ICAKICBfTGlua190eXBlIF9feCA9IF9NX3Jv b3QoKTsgIAoKICAgd2hpbGUgKF9feCAhPSAwKSAKICAgICBpZiAoX01fa2V5X2NvbXBhcmUoX19r LCBfU19rZXkoX194KSkpCiAgICAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKICAg ICBlbHNlCiAgICAgICBfX3ggPSBfU19yaWdodChfX3gpOwoKICAgcmV0dXJuIGl0ZXJhdG9yKF9f eSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZh bHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CnR5cGVuYW1lIF9S Yl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46OmNvbnN0X2l0 ZXJhdG9yIApfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+ CiAgOjp1cHBlcl9ib3VuZChjb25zdCBfS2V5JiBfX2spIGNvbnN0CnsKICBfTGlua190eXBlIF9f eSA9IF9NX2hlYWRlcjsgIAogIF9MaW5rX3R5cGUgX194ID0gX01fcm9vdCgpOyAgCgogICB3aGls ZSAoX194ICE9IDApIAogICAgIGlmIChfTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3gpKSkK ICAgICAgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOwogICAgIGVsc2UKICAgICAgIF9f eCA9IF9TX3JpZ2h0KF9feCk7CgogICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX195KTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAg ICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5lIApwYWlyPHR5cGVuYW1l IF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46Oml0ZXJh dG9yLAogICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21w YXJlLF9BbGxvYz46Oml0ZXJhdG9yPgpfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxf Q29tcGFyZSxfQWxsb2M+CiAgOjplcXVhbF9yYW5nZShjb25zdCBfS2V5JiBfX2spCnsKICByZXR1 cm4gcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+KGxvd2VyX2JvdW5kKF9fayksIHVwcGVyX2JvdW5k KF9faykpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS29W LCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgCnBhaXI8dHlwZW5hbWUgX1Ji X3RyZWU8X0tleSwgX1ZhbHVlLCBfS29WLCBfQ29tcGFyZSwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0 b3IsCiAgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbHVlLCBfS29WLCBfQ29tcGFyZSwg X0FsbG9jPjo6Y29uc3RfaXRlcmF0b3I+Cl9SYl90cmVlPF9LZXksIF9WYWx1ZSwgX0tvViwgX0Nv bXBhcmUsIF9BbGxvYz4KICA6OmVxdWFsX3JhbmdlKGNvbnN0IF9LZXkmIF9faykgY29uc3QKewog IHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPihsb3dlcl9ib3VuZChf X2spLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9i b3VuZChfX2spKTsKfQoKaW5saW5lIGludCAKX19ibGFja19jb3VudChfUmJfdHJlZV9ub2RlX2Jh c2UqIF9fbm9kZSwgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3Jvb3QpCnsKICBpZiAoX19ub2RlID09 IDApCiAgICByZXR1cm4gMDsKICBlbHNlIHsKICAgIGludCBfX2JjID0gX19ub2RlLT5fTV9jb2xv ciA9PSBfU19yYl90cmVlX2JsYWNrID8gMSA6IDA7CiAgICBpZiAoX19ub2RlID09IF9fcm9vdCkK ICAgICAgcmV0dXJuIF9fYmM7CiAgICBlbHNlCiAgICAgIHJldHVybiBfX2JjICsgX19ibGFja19j b3VudChfX25vZGUtPl9NX3BhcmVudCwgX19yb290KTsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBf S2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9D b21wYXJlLCBjbGFzcyBfQWxsb2M+CmJvb2wgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFs dWUsX0NvbXBhcmUsX0FsbG9jPjo6X19yYl92ZXJpZnkoKSBjb25zdAp7CiAgaWYgKF9NX25vZGVf Y291bnQgPT0gMCB8fCBiZWdpbigpID09IGVuZCgpKQogICAgcmV0dXJuIF9NX25vZGVfY291bnQg PT0gMCAmJiBiZWdpbigpID09IGVuZCgpICYmCiAgICAgIF9NX2hlYWRlci0+X01fbGVmdCA9PSBf TV9oZWFkZXIgJiYgX01faGVhZGVyLT5fTV9yaWdodCA9PSBfTV9oZWFkZXI7CiAgCiAgaW50IF9f bGVuID0gX19ibGFja19jb3VudChfTV9sZWZ0bW9zdCgpLCBfTV9yb290KCkpOwogIGZvciAoY29u c3RfaXRlcmF0b3IgX19pdCA9IGJlZ2luKCk7IF9faXQgIT0gZW5kKCk7ICsrX19pdCkgewogICAg X0xpbmtfdHlwZSBfX3ggPSAoX0xpbmtfdHlwZSkgX19pdC5fTV9ub2RlOwogICAgX0xpbmtfdHlw ZSBfX0wgPSBfU19sZWZ0KF9feCk7CiAgICBfTGlua190eXBlIF9fUiA9IF9TX3JpZ2h0KF9feCk7 CgogICAgaWYgKF9feC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpCiAgICAgIGlmICgoX19M ICYmIF9fTC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpIHx8CiAgICAgICAgICAoX19SICYm IF9fUi0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpKQogICAgICAgIHJldHVybiBmYWxzZTsK CiAgICBpZiAoX19MICYmIF9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfU19rZXkoX19MKSkp CiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmIChfX1IgJiYgX01fa2V5X2NvbXBhcmUoX1Nfa2V5 KF9fUiksIF9TX2tleShfX3gpKSkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGlmICghX19MICYm ICFfX1IgJiYgX19ibGFja19jb3VudChfX3gsIF9NX3Jvb3QoKSkgIT0gX19sZW4pCiAgICAgIHJl dHVybiBmYWxzZTsKICB9CgogIGlmIChfTV9sZWZ0bW9zdCgpICE9IF9SYl90cmVlX25vZGVfYmFz ZTo6X1NfbWluaW11bShfTV9yb290KCkpKQogICAgcmV0dXJuIGZhbHNlOwogIGlmIChfTV9yaWdo dG1vc3QoKSAhPSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21heGltdW0oX01fcm9vdCgpKSkKICAg IHJldHVybiBmYWxzZTsKCiAgcmV0dXJuIHRydWU7Cn0KCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9L ZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9Db21wYXJlLAogICAg ICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPCBfVmFsdWUgPiAgPgpzdHJ1Y3QgcmJfdHJl ZSA6IHB1YmxpYyBfUmJfdHJlZTxfS2V5LCBfVmFsdWUsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwg X0FsbG9jPgp7CiAgdHlwZWRlZiBfUmJfdHJlZTxfS2V5LCBfVmFsdWUsIF9LZXlPZlZhbHVlLCBf Q29tcGFyZSwgX0FsbG9jPiBfQmFzZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0 b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAgcmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21w ID0gX0NvbXBhcmUoKSwKICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxv Y2F0b3JfdHlwZSgpKQogICAgOiBfQmFzZShfX2NvbXAsIF9fYSkge30KICAKICB+cmJfdHJlZSgp IHt9Cn07CgoKCgoKICAKCgoKIAogCiAKIyAzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRy YWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL21hcCIgMiAzCgoKIyAx ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4u L2luY2x1ZGUvZysrLTMvc3RsX21hcC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IAoKCgoKCgogCgoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBf Q29tcGFyZSA9IGxlc3M8X0tleT4sCiAgICAgICAgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8 IF9UcCA+ICA+CgoKCgpjbGFzcyBtYXAgewpwdWJsaWM6CgogCgogIHR5cGVkZWYgX0tleSAgICAg ICAgICAgICAgICAgIGtleV90eXBlOwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgIGRh dGFfdHlwZTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKICB0 eXBlZGVmIHBhaXI8Y29uc3QgX0tleSwgX1RwPiB2YWx1ZV90eXBlOwogIHR5cGVkZWYgX0NvbXBh cmUgICAgICAgICAgICAgIGtleV9jb21wYXJlOwogICAgCiAgY2xhc3MgdmFsdWVfY29tcGFyZQog ICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUsIGJvb2w+ IHsKICBmcmllbmQgY2xhc3MgbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz47CiAgcHJvdGVj dGVkIDoKICAgIF9Db21wYXJlIF9NX2NvbXA7CiAgICB2YWx1ZV9jb21wYXJlKF9Db21wYXJlIF9f YykgOiBfTV9jb21wKF9fYykge30KICBwdWJsaWM6CiAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qg dmFsdWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpIGNvbnN0IHsKICAgICAgcmV0 dXJuIF9NX2NvbXAoX194LmZpcnN0LCBfX3kuZmlyc3QpOwogICAgfQogIH07Cgpwcml2YXRlOgog IHR5cGVkZWYgX1JiX3RyZWU8a2V5X3R5cGUsIHZhbHVlX3R5cGUsIAogICAgICAgICAgICAgICAg ICAgX1NlbGVjdDFzdDx2YWx1ZV90eXBlPiwga2V5X2NvbXBhcmUsIF9BbGxvYz4gX1JlcF90eXBl OwogIF9SZXBfdHlwZSBfTV90OyAgIApwdWJsaWM6CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5 cGU6OnBvaW50ZXIgcG9pbnRlcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3Rf cG9pbnRlciBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpyZWZl cmVuY2UgcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZWZl cmVuY2UgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVy YXRvciBpdGVyYXRvcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0 b3IgY29uc3RfaXRlcmF0b3I7CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2Vf aXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6 Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOwogIHR5cGVkZWYg dHlwZW5hbWUgX1JlcF90eXBlOjpzaXplX3R5cGUgc2l6ZV90eXBlOwogIHR5cGVkZWYgdHlwZW5h bWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYg dHlwZW5hbWUgX1JlcF90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAgIAoK ICBtYXAoKSA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KICBleHBsaWNp dCBtYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKICAgICAgICAgICAgICAgY29uc3QgYWxsb2Nh dG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCiAgICA6IF9NX3QoX19jb21wLCBfX2Ep IHt9CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgbWFwKF9JbnB1dEl0ZXJh dG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKICAgIDogX01fdChfQ29tcGFyZSgp LCBhbGxvY2F0b3JfdHlwZSgpKQogICAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19s YXN0KTsgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgbWFwKF9JbnB1dEl0 ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9f Y29tcCwKICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkp CiAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9f bGFzdCk7IH0KIyAxMjMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1 LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfbWFwLmgiIDMKCgogIG1hcChjb25zdCBt YXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX194KSA6IF9NX3QoX194Ll9NX3QpIHt9CiAg bWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mCiAgb3BlcmF0b3I9KGNvbnN0IG1hcDxfS2V5 LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gpCiAgewogICAgX01fdCA9IF9feC5fTV90Owog ICAgcmV0dXJuICp0aGlzOyAKICB9CgogICAKCiAga2V5X2NvbXBhcmUga2V5X2NvbXAoKSBjb25z dCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAo KSBjb25zdCB7IHJldHVybiB2YWx1ZV9jb21wYXJlKF9NX3Qua2V5X2NvbXAoKSk7IH0KICBhbGxv Y2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fdC5nZXRfYWxsb2Nh dG9yKCk7IH0KCiAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KICBj b25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQogIGl0 ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KICBjb25zdF9pdGVyYXRvciBlbmQo KSBjb25zdCB7IHJldHVybiBfTV90LmVuZCgpOyB9CiAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4o KSB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVn aW4oKSBjb25zdCB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CiAgcmV2ZXJzZV9pdGVyYXRvciBy ZW5kKCkgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJl bmQoKSBjb25zdCB7IHJldHVybiBfTV90LnJlbmQoKTsgfQogIGJvb2wgZW1wdHkoKSBjb25zdCB7 IHJldHVybiBfTV90LmVtcHR5KCk7IH0KICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJu IF9NX3Quc2l6ZSgpOyB9CiAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01f dC5tYXhfc2l6ZSgpOyB9CiAgX1RwJiBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spIHsK ICAgIGl0ZXJhdG9yIF9faSA9IGxvd2VyX2JvdW5kKF9fayk7CiAgICAgCiAgICBpZiAoX19pID09 IGVuZCgpIHx8IGtleV9jb21wKCkoX19rLCAoKl9faSkuZmlyc3QpKQogICAgICBfX2kgPSBpbnNl cnQoX19pLCB2YWx1ZV90eXBlKF9faywgX1RwKCkpKTsKICAgIHJldHVybiAoKl9faSkuc2Vjb25k OwogIH0KICB2b2lkIHN3YXAobWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mIF9feCkgeyBf TV90LnN3YXAoX194Ll9NX3QpOyB9CgogICAKCiAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQo Y29uc3QgdmFsdWVfdHlwZSYgX194KSAKICAgIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X3VuaXF1ZShf X3gpOyB9CiAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIHBvc2l0aW9uLCBjb25zdCB2YWx1ZV90 eXBlJiBfX3gpCiAgICB7IHJldHVybiBfTV90Lmluc2VydF91bmlxdWUocG9zaXRpb24sIF9feCk7 IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgaW5zZXJ0KF9JbnB1 dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgewogICAgX01fdC5pbnNl cnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7CiAgfQoKCgoKCgoKCgogIHZvaWQgZXJhc2UoaXRl cmF0b3IgX19wb3NpdGlvbikgeyBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CiAgc2l6ZV90eXBl IGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpIHsgcmV0dXJuIF9NX3QuZXJhc2UoX194KTsgfQog IHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQogICAgeyBfTV90 LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7 IH0KCiAgIAoKICBpdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIHsgcmV0dXJuIF9N X3QuZmluZChfX3gpOyB9CiAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgX194 KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQogIHNpemVfdHlwZSBjb3VudChjb25z dCBrZXlfdHlwZSYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmNvdW50KF9feCk7IH0KICBpdGVy YXRvciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSB7cmV0dXJuIF9NX3QubG93ZXJf Ym91bmQoX194KTsgfQogIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBl JiBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IAogIH0KICBp dGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSB7cmV0dXJuIF9NX3QudXBw ZXJfYm91bmQoX194KTsgfQogIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90 eXBlJiBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IAogIH0K ICAKICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYg X194KSB7CiAgICByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOwogIH0KICBwYWlyPGNvbnN0 X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194 KSBjb25zdCB7CiAgICByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOwogIH0KICBmcmllbmQg Ym9vbCBvcGVyYXRvcj09IDw+ICAoY29uc3QgbWFwJiwgY29uc3QgbWFwJik7CiAgZnJpZW5kIGJv b2wgb3BlcmF0b3I8IDw+ICAoY29uc3QgbWFwJiwgY29uc3QgbWFwJik7Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxp bmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBf X3gsIAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxf QWxsb2M+JiBfX3kpIHsKICByZXR1cm4gX194Ll9NX3QgPT0gX195Ll9NX3Q7Cn0KCnRlbXBsYXRl IDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+Cmlu bGluZSBib29sIG9wZXJhdG9yPChjb25zdCBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYg X194LCAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxf QWxsb2M+JiBfX3kpIHsKICByZXR1cm4gX194Ll9NX3QgPCBfX3kuX01fdDsKfQoKCgp0ZW1wbGF0 ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgpp bmxpbmUgdm9pZCBzd2FwKG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gsIAogICAg ICAgICAgICAgICAgIG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3kpIHsKICBfX3gu c3dhcChfX3kpOwp9CgoKCgoKCgoKIAoKCgogCiAKIAojIDMzICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvbWFwIiAy IDMKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8u Li8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9tdWx0aW1hcC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKIAoKCgoKCgogCgoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3Mg X1RwLCBjbGFzcyBfQ29tcGFyZSA9IGxlc3M8X0tleT4sCiAgICAgICAgICBjbGFzcyBfQWxsb2Mg PSBhbGxvY2F0b3I8IF9UcCA+ICA+CgoKCgpjbGFzcyBtdWx0aW1hcCB7CnB1YmxpYzoKCiAKCiAg dHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CiAgdHlwZWRlZiBfVHAgICAg ICAgICAgICAgICAgICAgZGF0YV90eXBlOwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAg IG1hcHBlZF90eXBlOwogIHR5cGVkZWYgcGFpcjxjb25zdCBfS2V5LCBfVHA+IHZhbHVlX3R5cGU7 CiAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CgogIGNsYXNzIHZh bHVlX2NvbXBhcmUgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5 cGUsIGJvb2w+IHsKICBmcmllbmQgY2xhc3MgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0Fs bG9jPjsKICBwcm90ZWN0ZWQ6CiAgICBfQ29tcGFyZSBfTV9jb21wOwogICAgdmFsdWVfY29tcGFy ZShfQ29tcGFyZSBfX2MpIDogX01fY29tcChfX2MpIHt9CiAgcHVibGljOgogICAgYm9vbCBvcGVy YXRvcigpKGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgdmFsdWVfdHlwZSYgX195KSBjb25z dCB7CiAgICAgIHJldHVybiBfTV9jb21wKF9feC5maXJzdCwgX195LmZpcnN0KTsKICAgIH0KICB9 OwoKcHJpdmF0ZToKICB0eXBlZGVmIF9SYl90cmVlPGtleV90eXBlLCB2YWx1ZV90eXBlLCAKICAg ICAgICAgICAgICAgICAgX1NlbGVjdDFzdDx2YWx1ZV90eXBlPiwga2V5X2NvbXBhcmUsIF9BbGxv Yz4gX1JlcF90eXBlOwogIF9SZXBfdHlwZSBfTV90OyAgIApwdWJsaWM6CiAgdHlwZWRlZiB0eXBl bmFtZSBfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBf dHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgdHlwZW5hbWUgX1Jl cF90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBl Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX1Jl cF90eXBlOjppdGVyYXRvciBpdGVyYXRvcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6 Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7IAogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90 eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CiAgdHlwZWRlZiB0eXBlbmFt ZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRv cjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKICB0 eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlw ZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9y X3R5cGU7CgogCgogIG11bHRpbWFwKCkgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBl KCkpIHsgfQogIGV4cGxpY2l0IG11bHRpbWFwKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCiAgICAg ICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBl KCkpCiAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgfQoKCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1 dEl0ZXJhdG9yPgogIG11bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJh dG9yIF9fbGFzdCkKICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQogICAg eyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CgogIHRlbXBsYXRlIDxjbGFz cyBfSW5wdXRJdGVyYXRvcj4KICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5w dXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKICAg ICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAg IDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3Qp OyB9CiMgMTIxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX211bHRpbWFwLmgiIDMKCgogIG11bHRpbWFwKGNv bnN0IG11bHRpbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mIF9feCkgOiBfTV90KF9feC5f TV90KSB7IH0KICBtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JgogIG9wZXJhdG9y PShjb25zdCBtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gpIHsKICAgIF9N X3QgPSBfX3guX01fdDsKICAgIHJldHVybiAqdGhpczsgCiAgfQoKICAgCgogIGtleV9jb21wYXJl IGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CiAgdmFsdWVfY29t cGFyZSB2YWx1ZV9jb21wKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfY29tcGFyZShfTV90LmtleV9j b21wKCkpOyB9CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJu IF9NX3QuZ2V0X2FsbG9jYXRvcigpOyB9CgogIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01f dC5iZWdpbigpOyB9CiAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90 LmJlZ2luKCk7IH0KICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV90LmVuZCgpOyB9CiAgY29u c3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5lbmQoKTsgfQogIHJldmVyc2Vf aXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQogIGNvbnN0X3JldmVy c2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQogIHJl dmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CiAgY29uc3RfcmV2 ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KICBib29s IGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9CiAgc2l6ZV90eXBlIHNpemUo KSBjb25zdCB7IHJldHVybiBfTV90LnNpemUoKTsgfQogIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNv bnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQogIHZvaWQgc3dhcChtdWx0aW1hcDxfS2V5 LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gpIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQoKICAg CgogIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsgcmV0dXJuIF9NX3Qu aW5zZXJ0X2VxdWFsKF9feCk7IH0KICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlv biwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CiAgICByZXR1cm4gX01fdC5pbnNlcnRfZXF1YWwo X19wb3NpdGlvbiwgX194KTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4K ICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xh c3QpIHsKICAgIF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7CiAgfQoKCgoKCgoK CiAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKSB7IF9NX3QuZXJhc2UoX19wb3NpdGlv bik7IH0KICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkgeyByZXR1cm4gX01f dC5lcmFzZShfX3gpOyB9CiAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBf X2xhc3QpCiAgICB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQogIHZvaWQgY2xlYXIo KSB7IF9NX3QuY2xlYXIoKTsgfQoKICAgCgogIGl0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUm IF9feCkgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KICBjb25zdF9pdGVyYXRvciBmaW5kKGNv bnN0IGtleV90eXBlJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CiAgc2l6 ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QuY291 bnQoX194KTsgfQogIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIHty ZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CiAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91 bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9NX3QubG93ZXJfYm91 bmQoX194KTsgCiAgfQogIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gp IHtyZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CiAgY29uc3RfaXRlcmF0b3IgdXBwZXJf Ym91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9NX3QudXBwZXJf Ym91bmQoX194KTsgCiAgfQogICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShj b25zdCBrZXlfdHlwZSYgX194KSB7CiAgICByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOwog IH0KICBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25z dCBrZXlfdHlwZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gp OwogIH0KICBmcmllbmQgYm9vbCBvcGVyYXRvcj09IDw+ICAoY29uc3QgbXVsdGltYXAmLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG11bHRpbWFw Jik7CiAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8IDw+ICAoY29uc3QgbXVsdGltYXAmLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbXVsdGltYXAmKTsK fTsKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFz cyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgbXVsdGltYXA8X0tleSxfVHAs X0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtdWx0 aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3kpIHsKICByZXR1cm4gX194Ll9NX3Qg PT0gX195Ll9NX3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9D b21wYXJlLCBjbGFzcyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBtdWx0aW1h cDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gsIAogICAgICAgICAgICAgICAgICAgICAg Y29uc3QgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX195KSB7CiAgcmV0dXJu IF9feC5fTV90IDwgX195Ll9NX3Q7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9U cCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgc3dhcChtdWx0aW1h cDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gsIAogICAgICAgICAgICAgICAgIG11bHRp bWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mIF9feSkgewogIF9feC5zd2FwKF9feSk7Cn0K CgoKCgoKCgogCgoKCiAKIAogCiMgMzQgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9tYXAiIDIgMwoKCgoKIAogCiAK IyA1MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FtYXAuaCIgMgoKCgogCgpzdHJ1Y3QgICBRTWFw Tm9kZUJhc2UKewogICAgZW51bSBDb2xvciB7IFJlZCwgQmxhY2sgfTsKCiAgICBRTWFwTm9kZUJh c2UqIGxlZnQ7CiAgICBRTWFwTm9kZUJhc2UqIHJpZ2h0OwogICAgUU1hcE5vZGVCYXNlKiBwYXJl bnQ7CgogICAgQ29sb3IgY29sb3I7CgogICAgUU1hcE5vZGVCYXNlKiBtaW5pbXVtKCkgewoJUU1h cE5vZGVCYXNlKiB4ID0gdGhpczsKCXdoaWxlICggeC0+bGVmdCApCgkgICAgeCA9IHgtPmxlZnQ7 CglyZXR1cm4geDsKICAgIH0KCiAgICBRTWFwTm9kZUJhc2UqIG1heGltdW0oKSB7CglRTWFwTm9k ZUJhc2UqIHggPSB0aGlzOwoJd2hpbGUgKCB4LT5yaWdodCApCgkgICAgeCA9IHgtPnJpZ2h0OwoJ cmV0dXJuIHg7CiAgICB9Cn07CgoKdGVtcGxhdGUgPGNsYXNzIEssIGNsYXNzIFQ+CnN0cnVjdCBR TWFwTm9kZSA6IHB1YmxpYyBRTWFwTm9kZUJhc2UKewogICAgUU1hcE5vZGUoIGNvbnN0IEsmIF9r ZXksIGNvbnN0IFQmIF9kYXRhICkgeyBkYXRhID0gX2RhdGE7IGtleSA9IF9rZXk7IH0KICAgIFFN YXBOb2RlKCBjb25zdCBLJiBfa2V5ICkJICAgeyBrZXkgPSBfa2V5OyB9CiAgICBRTWFwTm9kZSgg Y29uc3QgUU1hcE5vZGU8SyxUPiYgX24gKSB7IGtleSA9IF9uLmtleTsgZGF0YSA9IF9uLmRhdGE7 IH0KICAgIFFNYXBOb2RlKCkgeyB9CiAgICBUIGRhdGE7CiAgICBLIGtleTsKfTsKCgp0ZW1wbGF0 ZTxjbGFzcyBLLCBjbGFzcyBUPgpjbGFzcyBRTWFwSXRlcmF0b3IKewogcHVibGljOgogICAgIAoK CiAgICB0eXBlZGVmIFFNYXBOb2RlPCBLLCBUID4qIE5vZGVQdHI7CgogICAgdHlwZWRlZiBzdGQ6 OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICBpdGVyYXRvcl9jYXRlZ29yeTsKCiAgICB0eXBl ZGVmIFQgICAgICAgICAgdmFsdWVfdHlwZTsKCiAgICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVy ZW5jZV90eXBlOwoKCgogICAgdHlwZWRlZiBUKiAgICAgICAgIHBvaW50ZXI7CiAgICB0eXBlZGVm IFQmICAgICAgICAgcmVmZXJlbmNlOwoKICAgICAKCgogICAgUU1hcE5vZGU8SyxUPiogbm9kZTsK CiAgICAgCgoKICAgIFFNYXBJdGVyYXRvcigpIDogbm9kZSggMCApIHt9CiAgICBRTWFwSXRlcmF0 b3IoIFFNYXBOb2RlPEssVD4qIHAgKSA6IG5vZGUoIHAgKSB7fQogICAgUU1hcEl0ZXJhdG9yKCBj b25zdCBRTWFwSXRlcmF0b3I8SyxUPiYgaXQgKSA6IG5vZGUoIGl0Lm5vZGUgKSB7fQoKICAgIGJv b2wgb3BlcmF0b3I9PSggY29uc3QgUU1hcEl0ZXJhdG9yPEssVD4mIGl0ICkgY29uc3QgeyByZXR1 cm4gbm9kZSA9PSBpdC5ub2RlOyB9CiAgICBib29sIG9wZXJhdG9yIT0oIGNvbnN0IFFNYXBJdGVy YXRvcjxLLFQ+JiBpdCApIGNvbnN0IHsgcmV0dXJuIG5vZGUgIT0gaXQubm9kZTsgfQogICAgVCYg b3BlcmF0b3IqKCkgeyByZXR1cm4gbm9kZS0+ZGF0YTsgfQogICAgY29uc3QgVCYgb3BlcmF0b3Iq KCkgY29uc3QgeyByZXR1cm4gbm9kZS0+ZGF0YTsgfQogICAgIAogICAgIAoKICAgIGNvbnN0IEsm IGtleSgpIGNvbnN0IHsgcmV0dXJuIG5vZGUtPmtleTsgfQogICAgVCYgZGF0YSgpIHsgcmV0dXJu IG5vZGUtPmRhdGE7IH0KICAgIGNvbnN0IFQmIGRhdGEoKSBjb25zdCB7IHJldHVybiBub2RlLT5k YXRhOyB9Cgpwcml2YXRlOgogICAgaW50IGluYygpOwogICAgaW50IGRlYygpOwoKcHVibGljOgog ICAgUU1hcEl0ZXJhdG9yPEssVD4mIG9wZXJhdG9yKysoKSB7CglpbmMoKTsKCXJldHVybiAqdGhp czsKICAgIH0KCiAgICBRTWFwSXRlcmF0b3I8SyxUPiBvcGVyYXRvcisrKGludCkgewoJUU1hcEl0 ZXJhdG9yPEssVD4gdG1wID0gKnRoaXM7CglpbmMoKTsKCXJldHVybiB0bXA7CiAgICB9CgogICAg UU1hcEl0ZXJhdG9yPEssVD4mIG9wZXJhdG9yLS0oKSB7CglkZWMoKTsKCXJldHVybiAqdGhpczsK ICAgIH0KCiAgICBRTWFwSXRlcmF0b3I8SyxUPiBvcGVyYXRvci0tKGludCkgewoJUU1hcEl0ZXJh dG9yPEssVD4gdG1wID0gKnRoaXM7CglkZWMoKTsKCXJldHVybiB0bXA7CiAgICB9Cn07Cgp0ZW1w bGF0ZSA8Y2xhc3MgSywgY2xhc3MgVD4KICBpbnQgUU1hcEl0ZXJhdG9yPEssVD46OmluYygpCnsK ICAgIFFNYXBOb2RlQmFzZSogdG1wID0gbm9kZTsKICAgIGlmICggdG1wLT5yaWdodCApIHsKCXRt cCA9IHRtcC0+cmlnaHQ7Cgl3aGlsZSAoIHRtcC0+bGVmdCApCgkgICAgdG1wID0gdG1wLT5sZWZ0 OwogICAgfSBlbHNlIHsKCVFNYXBOb2RlQmFzZSogeSA9IHRtcC0+cGFyZW50OwoJd2hpbGUgKHRt cCA9PSB5LT5yaWdodCkgewoJICAgIHRtcCA9IHk7CgkgICAgeSA9IHktPnBhcmVudDsKCX0KCWlm ICh0bXAtPnJpZ2h0ICE9IHkpCgkgICAgdG1wID0geTsKICAgIH0KICAgIG5vZGUgPSAoTm9kZVB0 cil0bXA7CiAgICByZXR1cm4gMDsKfQoKdGVtcGxhdGUgPGNsYXNzIEssIGNsYXNzIFQ+CiAgaW50 IFFNYXBJdGVyYXRvcjxLLFQ+OjpkZWMoKQp7CiAgICBRTWFwTm9kZUJhc2UqIHRtcCA9IG5vZGU7 CiAgICBpZiAodG1wLT5jb2xvciA9PSBRTWFwTm9kZUJhc2U6OlJlZCAmJgoJdG1wLT5wYXJlbnQt PnBhcmVudCA9PSB0bXAgKSB7Cgl0bXAgPSB0bXAtPnJpZ2h0OwogICAgfSBlbHNlIGlmICh0bXAt PmxlZnQgIT0gMCkgewoJUU1hcE5vZGVCYXNlKiB5ID0gdG1wLT5sZWZ0OwoJd2hpbGUgKCB5LT5y aWdodCApCgkgICAgeSA9IHktPnJpZ2h0OwoJdG1wID0geTsKICAgIH0gZWxzZSB7CglRTWFwTm9k ZUJhc2UqIHkgPSB0bXAtPnBhcmVudDsKCXdoaWxlICh0bXAgPT0geS0+bGVmdCkgewoJICAgIHRt cCA9IHk7CgkgICAgeSA9IHktPnBhcmVudDsKCX0KCXRtcCA9IHk7CiAgICB9CiAgICBub2RlID0g KE5vZGVQdHIpdG1wOwogICAgcmV0dXJuIDA7Cn0KCnRlbXBsYXRlPGNsYXNzIEssIGNsYXNzIFQ+ CmNsYXNzIFFNYXBDb25zdEl0ZXJhdG9yCnsKIHB1YmxpYzoKICAgICAKCgogICAgdHlwZWRlZiBR TWFwTm9kZTwgSywgVCA+KiBOb2RlUHRyOwoKICAgIHR5cGVkZWYgc3RkOjpiaWRpcmVjdGlvbmFs X2l0ZXJhdG9yX3RhZyAgaXRlcmF0b3JfY2F0ZWdvcnk7CgogICAgdHlwZWRlZiBUICAgICAgICAg IHZhbHVlX3R5cGU7CgogICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKCgoK ICAgIHR5cGVkZWYgY29uc3QgVCogICBwb2ludGVyOwogICAgdHlwZWRlZiBjb25zdCBUJiAgIHJl ZmVyZW5jZTsKCgogICAgIAoKCiAgICBRTWFwTm9kZTxLLFQ+KiBub2RlOwoKICAgICAKCgogICAg UU1hcENvbnN0SXRlcmF0b3IoKSA6IG5vZGUoIDAgKSB7fQogICAgUU1hcENvbnN0SXRlcmF0b3Io IFFNYXBOb2RlPEssVD4qIHAgKSA6IG5vZGUoIHAgKSB7fQogICAgUU1hcENvbnN0SXRlcmF0b3Io IGNvbnN0IFFNYXBDb25zdEl0ZXJhdG9yPEssVD4mIGl0ICkgOiBub2RlKCBpdC5ub2RlICkge30K ICAgIFFNYXBDb25zdEl0ZXJhdG9yKCBjb25zdCBRTWFwSXRlcmF0b3I8SyxUPiYgaXQgKSA6IG5v ZGUoIGl0Lm5vZGUgKSB7fQoKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUU1hcENvbnN0SXRl cmF0b3I8SyxUPiYgaXQgKSBjb25zdCB7IHJldHVybiBub2RlID09IGl0Lm5vZGU7IH0KICAgIGJv b2wgb3BlcmF0b3IhPSggY29uc3QgUU1hcENvbnN0SXRlcmF0b3I8SyxUPiYgaXQgKSBjb25zdCB7 IHJldHVybiBub2RlICE9IGl0Lm5vZGU7IH0KICAgIGNvbnN0IFQmIG9wZXJhdG9yKigpICBjb25z dCB7IHJldHVybiBub2RlLT5kYXRhOyB9CiAgICAgCiAgICAgCgogICAgY29uc3QgSyYga2V5KCkg Y29uc3QgeyByZXR1cm4gbm9kZS0+a2V5OyB9CiAgICBjb25zdCBUJiBkYXRhKCkgY29uc3QgeyBy ZXR1cm4gbm9kZS0+ZGF0YTsgfQoKcHJpdmF0ZToKICAgIGludCBpbmMoKTsKICAgIGludCBkZWMo KTsKCnB1YmxpYzoKICAgIFFNYXBDb25zdEl0ZXJhdG9yPEssVD4mIG9wZXJhdG9yKysoKSB7Cglp bmMoKTsKCXJldHVybiAqdGhpczsKICAgIH0KCiAgICBRTWFwQ29uc3RJdGVyYXRvcjxLLFQ+IG9w ZXJhdG9yKysoaW50KSB7CglRTWFwQ29uc3RJdGVyYXRvcjxLLFQ+IHRtcCA9ICp0aGlzOwoJaW5j KCk7CglyZXR1cm4gdG1wOwogICAgfQoKICAgIFFNYXBDb25zdEl0ZXJhdG9yPEssVD4mIG9wZXJh dG9yLS0oKSB7CglkZWMoKTsKCXJldHVybiAqdGhpczsKICAgIH0KCiAgICBRTWFwQ29uc3RJdGVy YXRvcjxLLFQ+IG9wZXJhdG9yLS0oaW50KSB7CglRTWFwQ29uc3RJdGVyYXRvcjxLLFQ+IHRtcCA9 ICp0aGlzOwoJZGVjKCk7CglyZXR1cm4gdG1wOwogICAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIEss IGNsYXNzIFQ+CiAgaW50IFFNYXBDb25zdEl0ZXJhdG9yPEssVD46OmluYygpCnsKICAgIFFNYXBO b2RlQmFzZSogdG1wID0gbm9kZTsKICAgIGlmICggdG1wLT5yaWdodCApIHsKCXRtcCA9IHRtcC0+ cmlnaHQ7Cgl3aGlsZSAoIHRtcC0+bGVmdCApCgkgICAgdG1wID0gdG1wLT5sZWZ0OwogICAgfSBl bHNlIHsKCVFNYXBOb2RlQmFzZSogeSA9IHRtcC0+cGFyZW50OwoJd2hpbGUgKHRtcCA9PSB5LT5y aWdodCkgewoJICAgIHRtcCA9IHk7CgkgICAgeSA9IHktPnBhcmVudDsKCX0KCWlmICh0bXAtPnJp Z2h0ICE9IHkpCgkgICAgdG1wID0geTsKICAgIH0KICAgIG5vZGUgPSAoTm9kZVB0cil0bXA7CiAg ICByZXR1cm4gMDsKfQoKdGVtcGxhdGUgPGNsYXNzIEssIGNsYXNzIFQ+CiAgaW50IFFNYXBDb25z dEl0ZXJhdG9yPEssVD46OmRlYygpCnsKICAgIFFNYXBOb2RlQmFzZSogdG1wID0gbm9kZTsKICAg IGlmICh0bXAtPmNvbG9yID09IFFNYXBOb2RlQmFzZTo6UmVkICYmCgl0bXAtPnBhcmVudC0+cGFy ZW50ID09IHRtcCApIHsKCXRtcCA9IHRtcC0+cmlnaHQ7CiAgICB9IGVsc2UgaWYgKHRtcC0+bGVm dCAhPSAwKSB7CglRTWFwTm9kZUJhc2UqIHkgPSB0bXAtPmxlZnQ7Cgl3aGlsZSAoIHktPnJpZ2h0 ICkKCSAgICB5ID0geS0+cmlnaHQ7Cgl0bXAgPSB5OwogICAgfSBlbHNlIHsKCVFNYXBOb2RlQmFz ZSogeSA9IHRtcC0+cGFyZW50OwoJd2hpbGUgKHRtcCA9PSB5LT5sZWZ0KSB7CgkgICAgdG1wID0g eTsKCSAgICB5ID0geS0+cGFyZW50OwoJfQoJdG1wID0geTsKICAgIH0KICAgIG5vZGUgPSAoTm9k ZVB0cil0bXA7CiAgICByZXR1cm4gMDsKfQoKY2xhc3MgICBRTWFwUHJpdmF0ZUJhc2UgOiBwdWJs aWMgUVNoYXJlZAp7CnB1YmxpYzoKICAgIFFNYXBQcml2YXRlQmFzZSgpIHsKCW5vZGVfY291bnQg PSAwOwogICAgfQogICAgUU1hcFByaXZhdGVCYXNlKCBjb25zdCBRTWFwUHJpdmF0ZUJhc2UqIF9t YXApIHsKCW5vZGVfY291bnQgPSBfbWFwLT5ub2RlX2NvdW50OwogICAgfQoKICAgICAKCgogICAg dm9pZCByb3RhdGVMZWZ0KCBRTWFwTm9kZUJhc2UqIHgsIFFNYXBOb2RlQmFzZSomIHJvb3QpOwog ICAgdm9pZCByb3RhdGVSaWdodCggUU1hcE5vZGVCYXNlKiB4LCBRTWFwTm9kZUJhc2UqJiByb290 ICk7CiAgICB2b2lkIHJlYmFsYW5jZSggUU1hcE5vZGVCYXNlKiB4LCBRTWFwTm9kZUJhc2UqJiBy b290ICk7CiAgICBRTWFwTm9kZUJhc2UqIHJlbW92ZUFuZFJlYmFsYW5jZSggUU1hcE5vZGVCYXNl KiB6LCBRTWFwTm9kZUJhc2UqJiByb290LAoJCQkJICAgICAgUU1hcE5vZGVCYXNlKiYgbGVmdG1v c3QsCgkJCQkgICAgICBRTWFwTm9kZUJhc2UqJiByaWdodG1vc3QgKTsKCiAgICAgCgoKICAgIGlu dCBub2RlX2NvdW50Owp9OwoKCnRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQ+CmNsYXNzIFFN YXBQcml2YXRlIDogcHVibGljIFFNYXBQcml2YXRlQmFzZQp7CnB1YmxpYzoKICAgICAKCgogICAg dHlwZWRlZiBRTWFwSXRlcmF0b3I8IEtleSwgVCA+IEl0ZXJhdG9yOwogICAgdHlwZWRlZiBRTWFw Q29uc3RJdGVyYXRvcjwgS2V5LCBUID4gQ29uc3RJdGVyYXRvcjsKICAgIHR5cGVkZWYgUU1hcE5v ZGU8IEtleSwgVCA+IE5vZGU7CiAgICB0eXBlZGVmIFFNYXBOb2RlPCBLZXksIFQgPiogTm9kZVB0 cjsKCiAgICAgCgoKICAgIFFNYXBQcml2YXRlKCk7CiAgICBRTWFwUHJpdmF0ZSggY29uc3QgUU1h cFByaXZhdGU8IEtleSwgVCA+KiBfbWFwICk7CiAgICB+UU1hcFByaXZhdGUoKSB7IGNsZWFyKCk7 IGRlbGV0ZSBoZWFkZXI7IH0KCiAgICBOb2RlUHRyIGNvcHkoIE5vZGVQdHIgcCApOwogICAgdm9p ZCBjbGVhcigpOwogICAgdm9pZCBjbGVhciggTm9kZVB0ciBwICk7CgogICAgSXRlcmF0b3IgYmVn aW4oKQl7IHJldHVybiBJdGVyYXRvciggKE5vZGVQdHIpKGhlYWRlci0+bGVmdCApICk7IH0KICAg IEl0ZXJhdG9yIGVuZCgpCXsgcmV0dXJuIEl0ZXJhdG9yKCBoZWFkZXIgKTsgfQogICAgQ29uc3RJ dGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIENvbnN0SXRlcmF0b3IoIChOb2RlUHRyKSho ZWFkZXItPmxlZnQgKSApOyB9CiAgICBDb25zdEl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJu IENvbnN0SXRlcmF0b3IoIGhlYWRlciApOyB9CgogICAgQ29uc3RJdGVyYXRvciBmaW5kKGNvbnN0 IEtleSYgaykgY29uc3Q7CgogICAgdm9pZCByZW1vdmUoIEl0ZXJhdG9yIGl0ICkgewoJTm9kZVB0 ciBkZWwgPSAoTm9kZVB0cikgcmVtb3ZlQW5kUmViYWxhbmNlKCBpdC5ub2RlLCBoZWFkZXItPnBh cmVudCwgaGVhZGVyLT5sZWZ0LCBoZWFkZXItPnJpZ2h0ICk7CglkZWxldGUgZGVsOwoJLS1ub2Rl X2NvdW50OwogICAgfQoKIyA0MDAgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbWFwLmgiCgoKIyA0 MTIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbWFwLmgiCgoKICAgIEl0ZXJhdG9yIGluc2VydFNp bmdsZSggY29uc3QgS2V5JiBrICk7CiAgICBJdGVyYXRvciBpbnNlcnQoIFFNYXBOb2RlQmFzZSog eCwgUU1hcE5vZGVCYXNlKiB5LCBjb25zdCBLZXkmIGsgKTsKCnByb3RlY3RlZDoKICAgICAKCgog ICAgY29uc3QgS2V5JiBrZXkoIFFNYXBOb2RlQmFzZSogYiApIGNvbnN0IHsgcmV0dXJuICgoTm9k ZVB0ciliKS0+a2V5OyB9CgogICAgIAoKCiAgICBOb2RlUHRyIGhlYWRlcjsKfTsKCgp0ZW1wbGF0 ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIFFNYXBQcml2YXRlPEtleSxUPjo6UU1hcFByaXZhdGUo KSB7CiAgICBoZWFkZXIgPSBuZXcgTm9kZTsKICAgIGhlYWRlci0+Y29sb3IgPSBRTWFwTm9kZUJh c2U6OlJlZDsgIAogICAgaGVhZGVyLT5wYXJlbnQgPSAwOwogICAgaGVhZGVyLT5sZWZ0ID0gaGVh ZGVyLT5yaWdodCA9IGhlYWRlcjsKfQp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIFFN YXBQcml2YXRlPEtleSxUPjo6UU1hcFByaXZhdGUoIGNvbnN0IFFNYXBQcml2YXRlPCBLZXksIFQg PiogX21hcCApIDogUU1hcFByaXZhdGVCYXNlKCBfbWFwICkgewogICAgaGVhZGVyID0gbmV3IE5v ZGU7CiAgICBoZWFkZXItPmNvbG9yID0gUU1hcE5vZGVCYXNlOjpSZWQ7ICAKICAgIGlmICggX21h cC0+aGVhZGVyLT5wYXJlbnQgPT0gMCApIHsKCWhlYWRlci0+cGFyZW50ID0gMDsKCWhlYWRlci0+ bGVmdCA9IGhlYWRlci0+cmlnaHQgPSBoZWFkZXI7CiAgICB9IGVsc2UgewoJaGVhZGVyLT5wYXJl bnQgPSBjb3B5KCAoTm9kZVB0cikoX21hcC0+aGVhZGVyLT5wYXJlbnQpICk7CgloZWFkZXItPnBh cmVudC0+cGFyZW50ID0gaGVhZGVyOwoJaGVhZGVyLT5sZWZ0ID0gaGVhZGVyLT5wYXJlbnQtPm1p bmltdW0oKTsKCWhlYWRlci0+cmlnaHQgPSBoZWFkZXItPnBhcmVudC0+bWF4aW11bSgpOwogICAg fQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIHR5cGVuYW1lICBRTWFwUHJpdmF0 ZTxLZXksVD46Ok5vZGVQdHIgUU1hcFByaXZhdGU8S2V5LFQ+Ojpjb3B5KCB0eXBlbmFtZSAgUU1h cFByaXZhdGU8S2V5LFQ+OjpOb2RlUHRyIHAgKQp7CiAgICBpZiAoICFwICkKCXJldHVybiAwOwog ICAgTm9kZVB0ciBuID0gbmV3IE5vZGUoICpwICk7CiAgICBuLT5jb2xvciA9IHAtPmNvbG9yOwog ICAgaWYgKCBwLT5sZWZ0ICkgewoJbi0+bGVmdCA9IGNvcHkoIChOb2RlUHRyKShwLT5sZWZ0KSAp OwoJbi0+bGVmdC0+cGFyZW50ID0gbjsKICAgIH0gZWxzZSB7CgluLT5sZWZ0ID0gMDsKICAgIH0K ICAgIGlmICggcC0+cmlnaHQgKSB7CgluLT5yaWdodCA9IGNvcHkoIChOb2RlUHRyKShwLT5yaWdo dCkgKTsKCW4tPnJpZ2h0LT5wYXJlbnQgPSBuOwogICAgfSBlbHNlIHsKCW4tPnJpZ2h0ID0gMDsK ICAgIH0KICAgIHJldHVybiBuOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIHZv aWQgUU1hcFByaXZhdGU8S2V5LFQ+OjpjbGVhcigpCnsKICAgIGNsZWFyKCAoTm9kZVB0cikoaGVh ZGVyLT5wYXJlbnQpICk7CiAgICBoZWFkZXItPmNvbG9yID0gUU1hcE5vZGVCYXNlOjpSZWQ7CiAg ICBoZWFkZXItPnBhcmVudCA9IDA7CiAgICBoZWFkZXItPmxlZnQgPSBoZWFkZXItPnJpZ2h0ID0g aGVhZGVyOwogICAgbm9kZV9jb3VudCA9IDA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNz IFQ+CiAgdm9pZCBRTWFwUHJpdmF0ZTxLZXksVD46OmNsZWFyKCB0eXBlbmFtZSAgUU1hcFByaXZh dGU8S2V5LFQ+OjpOb2RlUHRyIHAgKQp7CiAgICB3aGlsZSAoIHAgIT0gMCApIHsKCWNsZWFyKCAo Tm9kZVB0cilwLT5yaWdodCApOwoJTm9kZVB0ciB5ID0gKE5vZGVQdHIpcC0+bGVmdDsKCWRlbGV0 ZSBwOwoJcCA9IHk7CiAgICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQ+CiAgdHlw ZW5hbWUgIFFNYXBQcml2YXRlPEtleSxUPjo6Q29uc3RJdGVyYXRvciBRTWFwUHJpdmF0ZTxLZXks VD46OmZpbmQoY29uc3QgS2V5JiBrKSBjb25zdAp7CiAgICBRTWFwTm9kZUJhc2UqIHkgPSBoZWFk ZXI7ICAgICAgICAgCiAgICBRTWFwTm9kZUJhc2UqIHggPSBoZWFkZXItPnBhcmVudDsgIAoKICAg IHdoaWxlICggeCAhPSAwICkgewoJIAoJaWYgKCAhKCBrZXkoeCkgPCBrICkgKSB7CgkgICAgeSA9 IHg7CgkgICAgeCA9IHgtPmxlZnQ7Cgl9IGVsc2UgewoJICAgIHggPSB4LT5yaWdodDsKCX0KICAg IH0KCiAgICAgCiAgICAgCiAgICBpZiAoIHkgPT0gaGVhZGVyIHx8IGsgPCBrZXkoeSkgKQoJcmV0 dXJuIENvbnN0SXRlcmF0b3IoIGhlYWRlciApOwogICAgcmV0dXJuIENvbnN0SXRlcmF0b3IoIChO b2RlUHRyKXkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVD4KICB0eXBlbmFtZSAg UU1hcFByaXZhdGU8S2V5LFQ+OjpJdGVyYXRvciBRTWFwUHJpdmF0ZTxLZXksVD46Omluc2VydFNp bmdsZSggY29uc3QgS2V5JiBrICkKewogICAgIAogICAgUU1hcE5vZGVCYXNlKiB5ID0gaGVhZGVy OwogICAgUU1hcE5vZGVCYXNlKiB4ID0gaGVhZGVyLT5wYXJlbnQ7CiAgICBib29sIHJlc3VsdCA9 IFRSVUU7CiAgICB3aGlsZSAoIHggIT0gMCApIHsKCXJlc3VsdCA9ICggayA8IGtleSh4KSApOwoJ eSA9IHg7Cgl4ID0gcmVzdWx0ID8geC0+bGVmdCA6IHgtPnJpZ2h0OwogICAgfQogICAgIAogICAg SXRlcmF0b3IgaiggKE5vZGVQdHIpeSApOwogICAgaWYgKCByZXN1bHQgKSB7CgkgCglpZiAoIGog PT0gYmVnaW4oKSApIHsKCSAgICByZXR1cm4gaW5zZXJ0KHgsIHksIGsgKTsKCX0gZWxzZSB7Cgkg ICAgIAoJICAgIC0tajsKCX0KICAgIH0KICAgICAKICAgIGlmICggKGoubm9kZS0+a2V5KSA8IGsg KQoJcmV0dXJuIGluc2VydCh4LCB5LCBrICk7CiAgICAgCiAgICByZXR1cm4gajsKfQoKCnRlbXBs YXRlIDxjbGFzcyBLZXksIGNsYXNzIFQ+CiAgdHlwZW5hbWUgIFFNYXBQcml2YXRlPEtleSxUPjo6 SXRlcmF0b3IgUU1hcFByaXZhdGU8S2V5LFQ+OjppbnNlcnQoIFFNYXBOb2RlQmFzZSogeCwgUU1h cE5vZGVCYXNlKiB5LCBjb25zdCBLZXkmIGsgKQp7CiAgICBOb2RlUHRyIHogPSBuZXcgTm9kZSgg ayApOwogICAgaWYgKHkgPT0gaGVhZGVyIHx8IHggIT0gMCB8fCBrIDwga2V5KHkpICkgewoJeS0+ bGVmdCA9IHo7ICAgICAgICAgICAgICAgICAKCWlmICggeSA9PSBoZWFkZXIgKSB7CgkgICAgaGVh ZGVyLT5wYXJlbnQgPSB6OwoJICAgIGhlYWRlci0+cmlnaHQgPSB6OwoJfSBlbHNlIGlmICggeSA9 PSBoZWFkZXItPmxlZnQgKQoJICAgIGhlYWRlci0+bGVmdCA9IHo7ICAgICAgICAgICAgCiAgICB9 IGVsc2UgewoJeS0+cmlnaHQgPSB6OwoJaWYgKCB5ID09IGhlYWRlci0+cmlnaHQgKQoJICAgIGhl YWRlci0+cmlnaHQgPSB6OyAgICAgICAgICAgCiAgICB9CiAgICB6LT5wYXJlbnQgPSB5OwogICAg ei0+bGVmdCA9IDA7CiAgICB6LT5yaWdodCA9IDA7CiAgICByZWJhbGFuY2UoIHosIGhlYWRlci0+ cGFyZW50ICk7CiAgICArK25vZGVfY291bnQ7CiAgICByZXR1cm4gSXRlcmF0b3Ioeik7Cn0KCgoK CgoKCgoKCgoKCgoKdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBUPgpjbGFzcyBRTWFwCnsKcHVi bGljOgogICAgIAoKCiAgICB0eXBlZGVmIEtleSBrZXlfdHlwZTsKICAgIHR5cGVkZWYgVCBtYXBw ZWRfdHlwZTsKICAgIHR5cGVkZWYgUVBhaXI8Y29uc3Qga2V5X3R5cGUsIG1hcHBlZF90eXBlPiB2 YWx1ZV90eXBlOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogICAgdHlwZWRlZiBj b25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlJiBy ZWZlcmVuY2U7CiAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsK CiAgICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOwoKCgogICAgdHlwZWRlZiBz aXplX3QgICAgICBzaXplX3R5cGU7CiAgICB0eXBlZGVmIFFNYXBJdGVyYXRvcjxLZXksVD4gaXRl cmF0b3I7CiAgICB0eXBlZGVmIFFNYXBDb25zdEl0ZXJhdG9yPEtleSxUPiBjb25zdF9pdGVyYXRv cjsKICAgIHR5cGVkZWYgUVBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0X3BhaXI7CgogICAgdHlw ZWRlZiBRTWFwSXRlcmF0b3I8IEtleSwgVCA+IEl0ZXJhdG9yOwogICAgdHlwZWRlZiBRTWFwQ29u c3RJdGVyYXRvcjwgS2V5LCBUID4gQ29uc3RJdGVyYXRvcjsKICAgIHR5cGVkZWYgVCBWYWx1ZVR5 cGU7CiAgICB0eXBlZGVmIFFNYXBQcml2YXRlPCBLZXksIFQgPiBQcml2OwoKICAgICAKCgogICAg UU1hcCgpCiAgICB7CglzaCA9IG5ldyBRTWFwUHJpdmF0ZTwgS2V5LCBUID47CiAgICB9CiAgICBR TWFwKCBjb25zdCBRTWFwPEtleSxUPiYgbSApCiAgICB7CglzaCA9IG0uc2g7IHNoLT5yZWYoKTsK ICAgIH0KCgoKCgoKICAgIFFNYXAoIGNvbnN0IHR5cGVuYW1lICBzdGQ6Om1hcDxLZXksVD4mIG0g KQogICAgewoJc2ggPSBuZXcgUU1hcFByaXZhdGU8S2V5LFQ+OwoKCgoJUU1hcENvbnN0SXRlcmF0 b3I8S2V5LFQ+IGl0ID0gbS5iZWdpbigpOwoKCWZvciAoIDsgaXQgIT0gbS5lbmQoKTsgKytpdCAp IHsKCSAgICB2YWx1ZV90eXBlIHAoICgqaXQpLmZpcnN0LCAoKml0KS5zZWNvbmQgKTsKCSAgICBp bnNlcnQoIHAgKTsKCX0KICAgIH0KCiAgICB+UU1hcCgpCiAgICB7CglpZiAoIHNoLT5kZXJlZigp ICkKCSAgICBkZWxldGUgc2g7CiAgICB9CiAgICBRTWFwPEtleSxUPiYgb3BlcmF0b3I9ICggY29u c3QgUU1hcDxLZXksVD4mIG0gKTsKCiAgICBRTWFwPEtleSxUPiYgb3BlcmF0b3I9ICggY29uc3Qg dHlwZW5hbWUgIHN0ZDo6bWFwPEtleSxUPiYgbSApCiAgICB7CgljbGVhcigpOwoKCgoJUU1hcENv bnN0SXRlcmF0b3I8S2V5LFQ+IGl0ID0gbS5iZWdpbigpOwoKCWZvciAoIDsgaXQgIT0gbS5lbmQo KTsgKytpdCApIHsKCSAgICB2YWx1ZV90eXBlIHAoICgqaXQpLmZpcnN0LCAoKml0KS5zZWNvbmQg KTsKCSAgICBpbnNlcnQoIHAgKTsKCX0KCXJldHVybiAqdGhpczsKICAgIH0KCgoKCgoKICAgIGl0 ZXJhdG9yIGJlZ2luKCkgeyBkZXRhY2goKTsgcmV0dXJuIHNoLT5iZWdpbigpOyB9CiAgICBpdGVy YXRvciBlbmQoKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPmVuZCgpOyB9CiAgICBjb25zdF9pdGVy YXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuICgoY29uc3QgUHJpdiopc2gpLT5iZWdpbigpOyB9 CiAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiAoKGNvbnN0IFByaXYqKXNo KS0+ZW5kKCk7IH0KICAgIGl0ZXJhdG9yIHJlcGxhY2UoIGNvbnN0IEtleSYgaywgY29uc3QgVCYg diApCiAgICB7CglyZW1vdmUoIGsgKTsKCXJldHVybiBpbnNlcnQoIGssIHYgKTsKICAgIH0KCiAg ICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0CiAgICB7CglyZXR1cm4gc2gtPm5vZGVfY291bnQ7CiAg ICB9CiAgICBib29sIGVtcHR5KCkgY29uc3QKICAgIHsKCXJldHVybiBzaC0+bm9kZV9jb3VudCA9 PSAwOwogICAgfQogICAgUVBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KCBjb25zdCB2YWx1ZV90 eXBlJiB4ICk7CgogICAgdm9pZCBlcmFzZSggaXRlcmF0b3IgaXQgKQogICAgewoJZGV0YWNoKCk7 CglzaC0+cmVtb3ZlKCBpdCApOwogICAgfQogICAgdm9pZCBlcmFzZSggY29uc3Qga2V5X3R5cGUm IGsgKTsKICAgIHNpemVfdHlwZSBjb3VudCggY29uc3Qga2V5X3R5cGUmIGsgKSBjb25zdDsKICAg IFQmIG9wZXJhdG9yW10gKCBjb25zdCBLZXkmIGsgKTsKICAgIHZvaWQgY2xlYXIoKTsKCiAgICBp dGVyYXRvciBmaW5kICggY29uc3QgS2V5JiBrICkKICAgIHsKCWRldGFjaCgpOwoJcmV0dXJuIGl0 ZXJhdG9yKCBzaC0+ZmluZCggayApLm5vZGUgKTsKICAgIH0KICAgIGNvbnN0X2l0ZXJhdG9yIGZp bmQgKCBjb25zdCBLZXkmIGsgKSBjb25zdCB7CXJldHVybiBzaC0+ZmluZCggayApOyB9CgogICAg Y29uc3QgVCYgb3BlcmF0b3JbXSAoIGNvbnN0IEtleSYgayApIGNvbnN0Cgl7ICA7IHJldHVybiBz aC0+ZmluZCggayApLmRhdGEoKTsgfQogICAgYm9vbCBjb250YWlucyAoIGNvbnN0IEtleSYgayAp IGNvbnN0Cgl7IHJldHVybiBmaW5kKCBrICkgIT0gZW5kKCk7IH0KCSAKCiAgICBzaXplX3R5cGUg Y291bnQoKSBjb25zdCB7IHJldHVybiBzaC0+bm9kZV9jb3VudDsgfQoKICAgIFFWYWx1ZUxpc3Q8 S2V5PiBrZXlzKCkgY29uc3QgewoJUVZhbHVlTGlzdDxLZXk+IHI7Cglmb3IgKGNvbnN0X2l0ZXJh dG9yIGk9YmVnaW4oKTsgaSE9ZW5kKCk7ICsraSkKCSAgICByLmFwcGVuZChpLmtleSgpKTsKCXJl dHVybiByOwogICAgfQoKICAgIFFWYWx1ZUxpc3Q8VD4gdmFsdWVzKCkgY29uc3QgewoJUVZhbHVl TGlzdDxUPiByOwoJZm9yIChjb25zdF9pdGVyYXRvciBpPWJlZ2luKCk7IGkhPWVuZCgpOyArK2kp CgkgICAgci5hcHBlbmQoKmkpOwoJcmV0dXJuIHI7CiAgICB9CgogICAgYm9vbCBpc0VtcHR5KCkg Y29uc3QgeyByZXR1cm4gc2gtPm5vZGVfY291bnQgPT0gMDsgfQoKICAgIGl0ZXJhdG9yIGluc2Vy dCggY29uc3QgS2V5JiBrZXksIGNvbnN0IFQmIHZhbHVlLCBib29sIG92ZXJ3cml0ZSA9IFRSVUUg KTsKICAgIHZvaWQgcmVtb3ZlKCBpdGVyYXRvciBpdCApIHsgZGV0YWNoKCk7IHNoLT5yZW1vdmUo IGl0ICk7IH0KICAgIHZvaWQgcmVtb3ZlKCBjb25zdCBLZXkmIGsgKTsKCgoKCgoKCgpwcm90ZWN0 ZWQ6CiAgICAgCgoKICAgIHZvaWQgZGV0YWNoKCkgeyAgaWYgKCBzaC0+Y291bnQgPiAxICkgZGV0 YWNoSW50ZXJuYWwoKTsgfQoKICAgIFByaXYqIHNoOwpwcml2YXRlOgogICAgdm9pZCBkZXRhY2hJ bnRlcm5hbCgpOwp9OwoKdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIFFNYXA8S2V5LFQ+ JiBRTWFwPEtleSxUPjo6b3BlcmF0b3I9ICggY29uc3QgUU1hcDxLZXksVD4mIG0gKQp7CiAgICBt LnNoLT5yZWYoKTsKICAgIGlmICggc2gtPmRlcmVmKCkgKQoJZGVsZXRlIHNoOwogICAgc2ggPSBt LnNoOwogICAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQ+CiAg dHlwZW5hbWUgIFFNYXA8S2V5LFQ+OjppbnNlcnRfcGFpciBRTWFwPEtleSxUPjo6aW5zZXJ0KCBj b25zdCB0eXBlbmFtZSAgUU1hcDxLZXksVD46OnZhbHVlX3R5cGUmIHggKQp7CiAgICBkZXRhY2go KTsKICAgIHNpemVfdHlwZSBuID0gc2l6ZSgpOwogICAgaXRlcmF0b3IgaXQgPSBzaC0+aW5zZXJ0 U2luZ2xlKCB4LmZpcnN0ICk7CiAgICBib29sIGluc2VydGVkID0gRkFMU0U7CiAgICBpZiAoIG4g PCBzaXplKCkgKSB7CglpbnNlcnRlZCA9IFRSVUU7CglpdC5kYXRhKCkgPSB4LnNlY29uZDsKICAg IH0KICAgIHJldHVybiBRUGFpcjxpdGVyYXRvcixib29sPiggaXQsIGluc2VydGVkICk7Cn0KCnRl bXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVD4KICB2b2lkIFFNYXA8S2V5LFQ+OjplcmFzZSggY29u c3QgS2V5JiBrICkKewogICAgZGV0YWNoKCk7CiAgICBpdGVyYXRvciBpdCggc2gtPmZpbmQoIGsg KS5ub2RlICk7CiAgICBpZiAoIGl0ICE9IGVuZCgpICkKCXNoLT5yZW1vdmUoIGl0ICk7Cn0KCnRl bXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVD4KICB0eXBlbmFtZSAgUU1hcDxLZXksVD46OnNpemVf dHlwZSBRTWFwPEtleSxUPjo6Y291bnQoIGNvbnN0IEtleSYgayApIGNvbnN0CnsKICAgIGNvbnN0 X2l0ZXJhdG9yIGl0KCBzaC0+ZmluZCggayApLm5vZGUgKTsKICAgIGlmICggaXQgIT0gZW5kKCkg KSB7CglzaXplX3R5cGUgYyA9IDA7Cgl3aGlsZSAoIGl0ICE9IGVuZCgpICkgewoJICAgICsraXQ7 CgkgICAgKytjOwoJfQoJcmV0dXJuIGM7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKdGVtcGxhdGU8 Y2xhc3MgS2V5LCBjbGFzcyBUPgogIFQmIFFNYXA8S2V5LFQ+OjpvcGVyYXRvcltdICggY29uc3Qg S2V5JiBrICkKewogICAgZGV0YWNoKCk7CiAgICBRTWFwTm9kZTxLZXksVD4qIHAgPSBzaC0+Zmlu ZCggayApLm5vZGU7CiAgICBpZiAoIHAgIT0gc2gtPmVuZCgpLm5vZGUgKQoJcmV0dXJuIHAtPmRh dGE7CiAgICByZXR1cm4gaW5zZXJ0KCBrLCBUKCkgKS5kYXRhKCk7Cn0KCnRlbXBsYXRlPGNsYXNz IEtleSwgY2xhc3MgVD4KICB2b2lkIFFNYXA8S2V5LFQ+OjpjbGVhcigpCnsKICAgIGlmICggc2gt PmNvdW50ID09IDEgKQoJc2gtPmNsZWFyKCk7CiAgICBlbHNlIHsKCXNoLT5kZXJlZigpOwoJc2gg PSBuZXcgUU1hcFByaXZhdGU8S2V5LFQ+OwogICAgfQp9Cgp0ZW1wbGF0ZTxjbGFzcyBLZXksIGNs YXNzIFQ+CiAgdHlwZW5hbWUgIFFNYXA8S2V5LFQ+OjppdGVyYXRvciBRTWFwPEtleSxUPjo6aW5z ZXJ0KCBjb25zdCBLZXkmIGtleSwgY29uc3QgVCYgdmFsdWUsIGJvb2wgb3ZlcndyaXRlICkKewog ICAgZGV0YWNoKCk7CiAgICBzaXplX3R5cGUgbiA9IHNpemUoKTsKICAgIGl0ZXJhdG9yIGl0ID0g c2gtPmluc2VydFNpbmdsZSgga2V5ICk7CiAgICBpZiAoIG92ZXJ3cml0ZSB8fCBuIDwgc2l6ZSgp ICkKCWl0LmRhdGEoKSA9IHZhbHVlOwogICAgcmV0dXJuIGl0Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBL ZXksIGNsYXNzIFQ+CiAgdm9pZCBRTWFwPEtleSxUPjo6cmVtb3ZlKCBjb25zdCBLZXkmIGsgKQp7 CiAgICBkZXRhY2goKTsKICAgIGl0ZXJhdG9yIGl0KCBzaC0+ZmluZCggayApLm5vZGUgKTsKICAg IGlmICggaXQgIT0gZW5kKCkgKQoJc2gtPnJlbW92ZSggaXQgKTsKfQoKdGVtcGxhdGU8Y2xhc3Mg S2V5LCBjbGFzcyBUPgogIHZvaWQgUU1hcDxLZXksVD46OmRldGFjaEludGVybmFsKCkKewogICAg c2gtPmRlcmVmKCk7IHNoID0gbmV3IFFNYXBQcml2YXRlPEtleSxUPiggc2ggKTsKfQoKCgp0ZW1w bGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQ+CiAgUURhdGFTdHJlYW0mIG9wZXJhdG9yPj4oIFFEYXRh U3RyZWFtJiBzLCBRTWFwPEtleSxUPiYgbSApIHsKICAgIG0uY2xlYXIoKTsKICAgIFFfVUlOVDMy IGM7CiAgICBzID4+IGM7CiAgICBmb3IoIFFfVUlOVDMyIGkgPSAwOyBpIDwgYzsgKytpICkgewoJ S2V5IGs7IFQgdDsKCXMgPj4gayA+PiB0OwoJbS5pbnNlcnQoIGssIHQgKTsKCWlmICggcy5hdEVu ZCgpICkKCSAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBzOwp9CgoKdGVtcGxhdGU8Y2xhc3Mg S2V5LCBjbGFzcyBUPgogIFFEYXRhU3RyZWFtJiBvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSYgcywg Y29uc3QgUU1hcDxLZXksVD4mIG0gKSB7CiAgICBzIDw8IChRX1VJTlQzMiltLnNpemUoKTsKICAg IFFNYXBDb25zdEl0ZXJhdG9yPEtleSxUPiBpdCA9IG0uYmVnaW4oKTsKICAgIGZvciggOyBpdCAh PSBtLmVuZCgpOyArK2l0ICkKCXMgPDwgaXQua2V5KCkgPDwgaXQuZGF0YSgpOwogICAgcmV0dXJu IHM7Cn0KCgoKIyA0MyAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FtaW1lLmgiIDIKCgoKCgpjbGFz cyBRSW1hZ2VEcmFnOwpjbGFzcyBRVGV4dERyYWc7CgpjbGFzcyAgIFFNaW1lU291cmNlCnsKICAg IGZyaWVuZCBjbGFzcyBRQ2xpcGJvYXJkRGF0YTsKCnB1YmxpYzoKICAgIFFNaW1lU291cmNlKCk7 CiAgICB2aXJ0dWFsIH5RTWltZVNvdXJjZSgpOwogICAgdmlydHVhbCBjb25zdCBjaGFyKiBmb3Jt YXQoIGludCBuID0gMCApIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgYm9vbCBwcm92aWRlcyggY29u c3QgY2hhciogKSBjb25zdDsKICAgIHZpcnR1YWwgUUJ5dGVBcnJheSBlbmNvZGVkRGF0YSggY29u c3QgY2hhciogKSBjb25zdCA9IDA7CiAgICBpbnQgc2VyaWFsTnVtYmVyKCkgY29uc3Q7Cgpwcml2 YXRlOgogICAgaW50IHNlcl9ubzsKICAgIGVudW0geyBOb0NhY2hlLCBUZXh0LCBHcmFwaGljcyB9 IGNhY2hlVHlwZTsKICAgIHVuaW9uCiAgICB7CglzdHJ1Y3QKCXsKCSAgICBRU3RyaW5nICpzdHI7 CgkgICAgUUNTdHJpbmcgKnN1YnR5cGU7Cgl9IHR4dDsKCXN0cnVjdAoJewoJICAgIFFJbWFnZSAq aW1nOwoJICAgIFFQaXhtYXAgKnBpeDsKCX0gZ2Z4OwogICAgfSBjYWNoZTsKICAgIHZvaWQgY2xl YXJDYWNoZSgpOwoKICAgICAKICAgIGZyaWVuZCBjbGFzcyBRSW1hZ2VEcmFnOwogICAgZnJpZW5k IGNsYXNzIFFUZXh0RHJhZzsKCn07CgppbmxpbmUgaW50IFFNaW1lU291cmNlOjpzZXJpYWxOdW1i ZXIoKSBjb25zdAp7IHJldHVybiBzZXJfbm87IH0KCmNsYXNzIFFTdHJpbmdMaXN0OwpjbGFzcyBR TWltZVNvdXJjZUZhY3RvcnlEYXRhOwoKY2xhc3MgICBRTWltZVNvdXJjZUZhY3RvcnkgewpwdWJs aWM6CiAgICBRTWltZVNvdXJjZUZhY3RvcnkoKTsKICAgIHZpcnR1YWwgflFNaW1lU291cmNlRmFj dG9yeSgpOwoKICAgIHN0YXRpYyBRTWltZVNvdXJjZUZhY3RvcnkqIGRlZmF1bHRGYWN0b3J5KCk7 CiAgICBzdGF0aWMgdm9pZCBzZXREZWZhdWx0RmFjdG9yeSggUU1pbWVTb3VyY2VGYWN0b3J5KiAp OwogICAgc3RhdGljIFFNaW1lU291cmNlRmFjdG9yeSogdGFrZURlZmF1bHRGYWN0b3J5KCk7CiAg ICBzdGF0aWMgdm9pZCBhZGRGYWN0b3J5KCBRTWltZVNvdXJjZUZhY3RvcnkgKmYgKTsKICAgIHN0 YXRpYyB2b2lkIHJlbW92ZUZhY3RvcnkoIFFNaW1lU291cmNlRmFjdG9yeSAqZiApOwoKICAgIHZp cnR1YWwgY29uc3QgUU1pbWVTb3VyY2UqIGRhdGEoY29uc3QgUVN0cmluZyYgYWJzX25hbWUpIGNv bnN0OwogICAgdmlydHVhbCBRU3RyaW5nIG1ha2VBYnNvbHV0ZShjb25zdCBRU3RyaW5nJiBhYnNf b3JfcmVsX25hbWUsIGNvbnN0IFFTdHJpbmcmIGNvbnRleHQpIGNvbnN0OwogICAgY29uc3QgUU1p bWVTb3VyY2UqIGRhdGEoY29uc3QgUVN0cmluZyYgYWJzX29yX3JlbF9uYW1lLCBjb25zdCBRU3Ry aW5nJiBjb250ZXh0KSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dCggY29uc3QgUVN0 cmluZyYgYWJzX25hbWUsIGNvbnN0IFFTdHJpbmcmIHRleHQgKTsKICAgIHZpcnR1YWwgdm9pZCBz ZXRJbWFnZSggY29uc3QgUVN0cmluZyYgYWJzX25hbWUsIGNvbnN0IFFJbWFnZSYgaW0gKTsKICAg IHZpcnR1YWwgdm9pZCBzZXRQaXhtYXAoIGNvbnN0IFFTdHJpbmcmIGFic19uYW1lLCBjb25zdCBR UGl4bWFwJiBwbSApOwogICAgdmlydHVhbCB2b2lkIHNldERhdGEoIGNvbnN0IFFTdHJpbmcmIGFi c19uYW1lLCBRTWltZVNvdXJjZSogZGF0YSApOwogICAgdmlydHVhbCB2b2lkIHNldEZpbGVQYXRo KCBjb25zdCBRU3RyaW5nTGlzdCYgKTsKICAgIHZpcnR1YWwgUVN0cmluZ0xpc3QgZmlsZVBhdGgo KSBjb25zdDsKICAgIHZvaWQgYWRkRmlsZVBhdGgoIGNvbnN0IFFTdHJpbmcmICk7CiAgICB2aXJ0 dWFsIHZvaWQgc2V0RXh0ZW5zaW9uVHlwZSggY29uc3QgUVN0cmluZyYgZXh0LCBjb25zdCBjaGFy KiBtaW1ldHlwZSApOwoKcHJpdmF0ZToKICAgIFFNaW1lU291cmNlICpkYXRhSW50ZXJuYWwoY29u c3QgUVN0cmluZyYgYWJzX25hbWUsIGNvbnN0IFFNYXA8UVN0cmluZywgUVN0cmluZz4gJmV4dGVu c2lvbnMgKSBjb25zdDsKICAgIFFNaW1lU291cmNlRmFjdG9yeURhdGEqIGQ7Cn07CgojIDE1NyAi L3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FtaW1lLmgiCgoKCgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9p bmNsdWRlL3FldmVudC5oIiAyCgoKCgpjbGFzcyAgIFFFdmVudDogcHVibGljIFF0CQkgCnsKcHVi bGljOgogICAgZW51bSBUeXBlIHsKCgkgCgkgCgkgCgkgCgoJTm9uZSA9IDAsCQkJCSAKCgoJVGlt ZXIgPSAxLAkJCQkgCglNb3VzZUJ1dHRvblByZXNzID0gMiwJCQkgCglNb3VzZUJ1dHRvblJlbGVh c2UgPSAzLAkJCSAKCU1vdXNlQnV0dG9uRGJsQ2xpY2s9IDQsCQkJIAoJTW91c2VNb3ZlID0gNSwJ CQkJIAoJS2V5UHJlc3MgPSA2LAkJCQkgCglLZXlSZWxlYXNlID0gNywJCQkJIAoJRm9jdXNJbiA9 IDgsCQkJCSAKCUZvY3VzT3V0ID0gOSwJCQkJIAoJRW50ZXIgPSAxMCwJCQkJIAoJTGVhdmUgPSAx MSwJCQkJIAoJUGFpbnQgPSAxMiwJCQkJIAoJTW92ZSA9IDEzLAkJCQkgCglSZXNpemUgPSAxNCwJ CQkJIAoJQ3JlYXRlID0gMTUsCQkJCSAKCURlc3Ryb3kgPSAxNiwJCQkJIAoJU2hvdyA9IDE3LAkJ CQkgCglIaWRlID0gMTgsCQkJCSAKCUNsb3NlID0gMTksCQkJCSAKCVF1aXQgPSAyMCwJCQkJIAoJ UmVwYXJlbnQgPSAyMSwJCQkJIAoJU2hvd01pbmltaXplZCA9IDIyLAkJICAgICAgIAkgCglTaG93 Tm9ybWFsID0gMjMsCSAgICAgICAJCSAKCVdpbmRvd0FjdGl2YXRlID0gMjQsCSAgICAgICAJCSAK CVdpbmRvd0RlYWN0aXZhdGUgPSAyNSwJICAgICAgIAkJIAoJU2hvd1RvUGFyZW50ID0gMjYsCSAg ICAgICAJCSAKCUhpZGVUb1BhcmVudCA9IDI3LAkgICAgICAgCQkgCglTaG93TWF4aW1pemVkID0g MjgsCQkgICAgICAgCSAKCVNob3dGdWxsU2NyZWVuID0gMjksCQkJIAoJQWNjZWwgPSAzMCwJCQkJ IAoJV2hlZWwgPSAzMSwJCQkJIAoJQWNjZWxBdmFpbGFibGUgPSAzMiwJCQkgCglDYXB0aW9uQ2hh bmdlID0gMzMsCQkJIAoJSWNvbkNoYW5nZSA9IDM0LAkJCSAKCVBhcmVudEZvbnRDaGFuZ2UgPSAz NSwJCQkgCglBcHBsaWNhdGlvbkZvbnRDaGFuZ2UgPSAzNiwJCSAKCVBhcmVudFBhbGV0dGVDaGFu Z2UgPSAzNywJCSAKCUFwcGxpY2F0aW9uUGFsZXR0ZUNoYW5nZSA9IDM4LAkJIAoJUGFsZXR0ZUNo YW5nZSA9IDM5LAkJCSAKCUNsaXBib2FyZCA9IDQwLAkJCQkgCglTcGVlY2ggPSA0MiwJCQkJIAoJ U29ja0FjdCA9IDUwLAkJCQkgCglBY2NlbE92ZXJyaWRlID0gNTEsCQkJIAoJRGVmZXJyZWREZWxl dGUgPSA1MiwJCQkgCglEcmFnRW50ZXIgPSA2MCwJCQkJIAoJRHJhZ01vdmUgPSA2MSwJCQkJIAoJ RHJhZ0xlYXZlID0gNjIsCQkJCSAKCURyb3AgPSA2MywJCQkJIAoJRHJhZ1Jlc3BvbnNlID0gNjQs CQkJIAoJQ2hpbGRJbnNlcnRlZCA9IDcwLAkJCSAKCUNoaWxkUmVtb3ZlZCA9IDcxLAkJCSAKCUxh eW91dEhpbnQgPSA3MiwJCQkgCglTaG93V2luZG93UmVxdWVzdCA9IDczLAkJCSAKCUFjdGl2YXRl Q29udHJvbCA9IDgwLAkJCSAKCURlYWN0aXZhdGVDb250cm9sID0gODEsCQkJIAoJQ29udGV4dE1l bnUgPSA4MiwgICAgICAgICAgICAgICAgICAgICAgICAKCUlNU3RhcnQgPSA4MywJCQkJIAoJSU1D b21wb3NlID0gODQsCQkJCSAKCUlNRW5kID0gODUsCQkJCSAKCUFjY2Vzc2liaWxpdHkgPSA4NiwJ CQkgCglUYWJsZXQgPSA4NywJCQkJIAoJVXNlciA9IDEwMDAsCQkJCSAKCU1heFVzZXIgID0gNjU1 MzUgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICB9OwoKCiAgICBRRXZlbnQoIFR5cGUgdHlw ZSApIDogdCh0eXBlKSwgcG9zdGVkKEZBTFNFKSwgc3BvbnQoRkFMU0UpIHt9CiAgICB2aXJ0dWFs IH5RRXZlbnQoKTsKICAgIFR5cGUgIHR5cGUoKSBjb25zdAl7IHJldHVybiB0OyB9CiAgICBib29s IHNwb250YW5lb3VzKCkgY29uc3QgCXsgcmV0dXJuIHNwb250OyB9CnByb3RlY3RlZDoKICAgIFR5 cGUgIHQ7CnByaXZhdGU6CiAgICB1aW50IHBvc3RlZCA6IDE7CiAgICB1aW50IHNwb250IDogMTsK CgogICAgZnJpZW5kIGNsYXNzIFFBcHBsaWNhdGlvbjsKICAgIGZyaWVuZCBjbGFzcyBRQmFzZUFw cGxpY2F0aW9uOwogICAgZnJpZW5kIGNsYXNzIFFFVFdpZGdldDsKfTsKCgpjbGFzcyAgIFFUaW1l ckV2ZW50IDogcHVibGljIFFFdmVudAp7CnB1YmxpYzoKICAgIFFUaW1lckV2ZW50KCBpbnQgdGlt ZXJJZCApCgk6IFFFdmVudChUaW1lciksIGlkKHRpbWVySWQpIHt9CiAgICBpbnQJICB0aW1lcklk KCkJY29uc3QJeyByZXR1cm4gaWQ7IH0KcHJvdGVjdGVkOgogICAgaW50CSAgaWQ7Cn07CgoKY2xh c3MgICBRTW91c2VFdmVudCA6IHB1YmxpYyBRRXZlbnQKewpwdWJsaWM6CiAgICBRTW91c2VFdmVu dCggVHlwZSB0eXBlLCBjb25zdCBRUG9pbnQgJnBvcywgaW50IGJ1dHRvbiwgaW50IHN0YXRlICk7 CgogICAgUU1vdXNlRXZlbnQoIFR5cGUgdHlwZSwgY29uc3QgUVBvaW50ICZwb3MsIGNvbnN0IFFQ b2ludCZnbG9iYWxQb3MsCgkJIGludCBidXR0b24sIGludCBzdGF0ZSApCgk6IFFFdmVudCh0eXBl KSwgcChwb3MpLCBnKGdsb2JhbFBvcyksIGIoKHVzaG9ydClidXR0b24pLHMoKHVzaG9ydClzdGF0 ZSksYWNjcHQoVFJVRSkge307CgogICAgY29uc3QgUVBvaW50ICZwb3MoKSBjb25zdAl7IHJldHVy biBwOyB9CiAgICBjb25zdCBRUG9pbnQgJmdsb2JhbFBvcygpIGNvbnN0IHsgcmV0dXJuIGc7IH0K ICAgIGludAkgICB4KCkJCWNvbnN0CXsgcmV0dXJuIHAueCgpOyB9CiAgICBpbnQJICAgeSgpCQlj b25zdAl7IHJldHVybiBwLnkoKTsgfQogICAgaW50CSAgIGdsb2JhbFgoKQljb25zdAl7IHJldHVy biBnLngoKTsgfQogICAgaW50CSAgIGdsb2JhbFkoKQljb25zdAl7IHJldHVybiBnLnkoKTsgfQog ICAgQnV0dG9uU3RhdGUgYnV0dG9uKCkgY29uc3QJeyByZXR1cm4gKEJ1dHRvblN0YXRlKSBiOyB9 CiAgICBCdXR0b25TdGF0ZSBzdGF0ZSgpCWNvbnN0CXsgcmV0dXJuIChCdXR0b25TdGF0ZSkgczsg fQogICAgQnV0dG9uU3RhdGUgc3RhdGVBZnRlcigpIGNvbnN0OwogICAgYm9vbCAgIGlzQWNjZXB0 ZWQoKSBjb25zdAl7IHJldHVybiBhY2NwdDsgfQogICAgdm9pZCAgIGFjY2VwdCgpCQl7IGFjY3B0 ID0gVFJVRTsgfQogICAgdm9pZCAgIGlnbm9yZSgpCQl7IGFjY3B0ID0gRkFMU0U7IH0KcHJvdGVj dGVkOgogICAgUVBvaW50IHA7CiAgICBRUG9pbnQgZzsKICAgIHVzaG9ydCBiOwogICAgdXNob3J0 IHM7CiAgICB1aW50ICAgYWNjcHQ6MTsKfTsKCgoKY2xhc3MgICBRV2hlZWxFdmVudCA6IHB1Ymxp YyBRRXZlbnQKewpwdWJsaWM6CiAgICBRV2hlZWxFdmVudCggY29uc3QgUVBvaW50ICZwb3MsIGlu dCBkZWx0YSwgaW50IHN0YXRlLCBPcmllbnRhdGlvbiBvcmllbnQgPSBWZXJ0aWNhbCApOwogICAg UVdoZWVsRXZlbnQoIGNvbnN0IFFQb2ludCAmcG9zLCBjb25zdCBRUG9pbnQmIGdsb2JhbFBvcywg aW50IGRlbHRhLCBpbnQgc3RhdGUsIE9yaWVudGF0aW9uIG9yaWVudCA9IFZlcnRpY2FsICApCgk6 IFFFdmVudChXaGVlbCksIHAocG9zKSwgZyhnbG9iYWxQb3MpLCBkKGRlbHRhKSwgcygodXNob3J0 KXN0YXRlKSwKCSAgYWNjcHQoVFJVRSksIG8ob3JpZW50KSB7fQogICAgaW50CSAgIGRlbHRhKCkJ Y29uc3QJeyByZXR1cm4gZDsgfQogICAgY29uc3QgUVBvaW50ICZwb3MoKSBjb25zdAl7IHJldHVy biBwOyB9CiAgICBjb25zdCBRUG9pbnQgJmdsb2JhbFBvcygpIGNvbnN0CXsgcmV0dXJuIGc7IH0K ICAgIGludAkgICB4KCkJCWNvbnN0CXsgcmV0dXJuIHAueCgpOyB9CiAgICBpbnQJICAgeSgpCQlj b25zdAl7IHJldHVybiBwLnkoKTsgfQogICAgaW50CSAgIGdsb2JhbFgoKQljb25zdAl7IHJldHVy biBnLngoKTsgfQogICAgaW50CSAgIGdsb2JhbFkoKQljb25zdAl7IHJldHVybiBnLnkoKTsgfQog ICAgQnV0dG9uU3RhdGUgc3RhdGUoKQljb25zdAl7IHJldHVybiBCdXR0b25TdGF0ZShzKTsgfQog ICAgT3JpZW50YXRpb24gb3JpZW50YXRpb24oKSAJY29uc3QgCXsgcmV0dXJuIG87IH0KICAgIGJv b2wgICBpc0FjY2VwdGVkKCkgY29uc3QJeyByZXR1cm4gYWNjcHQ7IH0KICAgIHZvaWQgICBhY2Nl cHQoKQkJeyBhY2NwdCA9IFRSVUU7IH0KICAgIHZvaWQgICBpZ25vcmUoKQkJeyBhY2NwdCA9IEZB TFNFOyB9CnByb3RlY3RlZDoKICAgIFFQb2ludCBwOwogICAgUVBvaW50IGc7CiAgICBpbnQgZDsK ICAgIHVzaG9ydCBzOwogICAgYm9vbCAgIGFjY3B0OwogICAgT3JpZW50YXRpb24gbzsKfTsKCgpj bGFzcyAgIFFUYWJsZXRFdmVudCA6IHB1YmxpYyBRRXZlbnQKewpwdWJsaWM6CiAgICBlbnVtIFRh YmxldERldmljZSB7IE5vRGV2aWNlID0gLTEsIFB1Y2ssIFN0eWx1cywgRXJhc2VyIH07CiAgICBR VGFibGV0RXZlbnQoIGNvbnN0IFFQb2ludCAmcG9zLCBpbnQgZGV2aWNlLCBpbnQgcHJlc3N1cmUs IGludCB4VGlsdCwgCiAgICAgICAgICAgICAgICAgIGludCB5VGlsdCwgY29uc3QgUVBhaXI8aW50 LGludD4gJnVJZCApCgk6IFFFdmVudCggVGFibGV0ICksIG1Qb3MoIHBvcyApLCBtRGV2KCBkZXZp Y2UgKSwgbVByZXNzKCBwcmVzc3VyZSApLAoJICBtWFQoIHhUaWx0ICksIG1ZVCggeVRpbHQgKSwg bVR5cGUoIHVJZC5maXJzdCApLCBtUGh5KCB1SWQuc2Vjb25kICkKICAgIHt9CiAgICBRVGFibGV0 RXZlbnQoIGNvbnN0IFFQb2ludCAmcG9zLCBjb25zdCBRUG9pbnQgJmdsb2JhbFBvcywgaW50IGRl dmljZSwKCQkgIGludCBwcmVzc3VyZSwgaW50IHhUaWx0LCBpbnQgeVRpbHQsIGNvbnN0IFFQYWly PGludCxpbnQ+ICZ1SWQgKQoJOiBRRXZlbnQoIFRhYmxldCApLCBtUG9zKCBwb3MgKSwgbUdQb3Mo IGdsb2JhbFBvcyApLCBtRGV2KCBkZXZpY2UgKSwKCSAgbVByZXNzKCBwcmVzc3VyZSApLCBtWFQo IHhUaWx0ICksIG1ZVCggeVRpbHQgKSwgbVR5cGUoIHVJZC5maXJzdCApLAoJICBtUGh5KCB1SWQu c2Vjb25kICkKICAgIHt9CiAgICBpbnQgcHJlc3N1cmUoKQljb25zdCB7IHJldHVybiBtUHJlc3M7 IH0KICAgIGludCB4VGlsdCgpCQljb25zdCB7IHJldHVybiBtWFQ7IH0KICAgIGludCB5VGlsdCgp CQljb25zdCB7IHJldHVybiBtWVQ7IH0KICAgIGNvbnN0IFFQb2ludCAmcG9zKCkJY29uc3QgeyBy ZXR1cm4gbVBvczsgfQogICAgY29uc3QgUVBvaW50ICZnbG9iYWxQb3MoKSBjb25zdCB7IHJldHVy biBtR1BvczsgfQogICAgaW50IHgoKQkJY29uc3QgeyByZXR1cm4gbVBvcy54KCk7IH0KICAgIGlu dCB5KCkJCWNvbnN0IHsgcmV0dXJuIG1Qb3MueSgpOyB9CiAgICBpbnQgZ2xvYmFsWCgpCWNvbnN0 IHsgcmV0dXJuIG1HUG9zLngoKTsgfQogICAgaW50IGdsb2JhbFkoKQljb25zdCB7IHJldHVybiBt R1Bvcy55KCk7IH0KICAgIFRhYmxldERldmljZSBkZXZpY2UoKSAJY29uc3QgeyByZXR1cm4gVGFi bGV0RGV2aWNlKG1EZXYpOyB9CiAgICBpbnQgaXNBY2NlcHRlZCgpIGNvbnN0IHsgcmV0dXJuIG1i QWNjOyB9CiAgICB2b2lkIGFjY2VwdCgpIHsgbWJBY2MgPSBUUlVFOyB9CiAgICB2b2lkIGlnbm9y ZSgpIHsgbWJBY2MgPSBGQUxTRTsgfQogICAgUVBhaXI8aW50LGludD4gdW5pcXVlSWQoKSB7IHJl dHVybiBRUGFpcjxpbnQsaW50PiggbVR5cGUsIG1QaHkpOyB9CnByb3RlY3RlZDoKICAgIFFQb2lu dCBtUG9zOwogICAgUVBvaW50IG1HUG9zOwogICAgaW50IG1EZXYsCiAgICAgICAgbVByZXNzLAog ICAgICAgIG1YVCwKICAgICAgICBtWVQsCiAgICAgICAgbVR5cGUsCgltUGh5OwogICAgYm9vbCBt YkFjYzsKICAgIAp9OwoKY2xhc3MgICBRS2V5RXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVibGlj OgogICAgUUtleUV2ZW50KCBUeXBlIHR5cGUsIGludCBrZXksIGludCBhc2NpaSwgaW50IHN0YXRl LAoJCWNvbnN0IFFTdHJpbmcmIHRleHQ9UVN0cmluZzo6bnVsbCwgYm9vbCBhdXRvcmVwPUZBTFNF LCB1c2hvcnQgY291bnQ9MSApCgk6IFFFdmVudCh0eXBlKSwgdHh0KHRleHQpLCBrKCh1c2hvcnQp a2V5KSwgcygodXNob3J0KXN0YXRlKSwKCSAgICBhKCh1Y2hhcilhc2NpaSksIGFjY3B0KFRSVUUp LCBhdXRvcihhdXRvcmVwKSwgYyhjb3VudCkge30KICAgIGludAkgICBrZXkoKQljb25zdAl7IHJl dHVybiBrOyB9CiAgICBpbnQJICAgYXNjaWkoKQljb25zdAl7IHJldHVybiBhOyB9CiAgICBCdXR0 b25TdGF0ZSBzdGF0ZSgpCWNvbnN0CXsgcmV0dXJuIEJ1dHRvblN0YXRlKHMpOyB9CiAgICBCdXR0 b25TdGF0ZSBzdGF0ZUFmdGVyKCkgY29uc3Q7CiAgICBib29sICAgaXNBY2NlcHRlZCgpIGNvbnN0 CXsgcmV0dXJuIGFjY3B0OyB9CiAgICBRU3RyaW5nIHRleHQoKSAgICAgIGNvbnN0ICAgeyByZXR1 cm4gdHh0OyB9CiAgICBib29sICAgaXNBdXRvUmVwZWF0KCkgY29uc3QJeyByZXR1cm4gYXV0b3I7 IH0KICAgIGludCAgIGNvdW50KCkgY29uc3QJeyByZXR1cm4gaW50KGMpOyB9CiAgICB2b2lkICAg YWNjZXB0KCkJCXsgYWNjcHQgPSBUUlVFOyB9CiAgICB2b2lkICAgaWdub3JlKCkJCXsgYWNjcHQg PSBGQUxTRTsgfQoKcHJvdGVjdGVkOgogICAgUVN0cmluZyB0eHQ7CiAgICB1c2hvcnQgaywgczsK ICAgIHVjaGFyICBhOwogICAgdWludCAgIGFjY3B0OjE7CiAgICB1aW50ICAgYXV0b3I6MTsKICAg IHVzaG9ydCBjOwp9OwoKCmNsYXNzICAgUUZvY3VzRXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVi bGljOgoKICAgIFFGb2N1c0V2ZW50KCBUeXBlIHR5cGUgKQoJOiBRRXZlbnQodHlwZSkge30KCiAg ICBib29sICAgZ290Rm9jdXMoKQljb25zdCB7IHJldHVybiB0eXBlKCkgPT0gRm9jdXNJbjsgfQog ICAgYm9vbCAgIGxvc3RGb2N1cygpCWNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBGb2N1c091dDsg fQoKICAgIGVudW0gUmVhc29uIHsgTW91c2UsIFRhYiwgQmFja3RhYiwgQWN0aXZlV2luZG93LCBQ b3B1cCwgU2hvcnRjdXQsIE90aGVyIH07CiAgICBzdGF0aWMgUmVhc29uIHJlYXNvbigpOwogICAg c3RhdGljIHZvaWQgc2V0UmVhc29uKCBSZWFzb24gcmVhc29uICk7CiAgICBzdGF0aWMgdm9pZCBy ZXNldFJlYXNvbigpOwoKcHJpdmF0ZToKICAgIHN0YXRpYyBSZWFzb24gbV9yZWFzb247CiAgICBz dGF0aWMgUmVhc29uIHByZXZfcmVhc29uOwp9OwoKCmNsYXNzICAgUVBhaW50RXZlbnQgOiBwdWJs aWMgUUV2ZW50CnsKcHVibGljOgogICAgUVBhaW50RXZlbnQoIGNvbnN0IFFSZWdpb24mIHBhaW50 UmVnaW9uLCBib29sIGVyYXNlZCA9IFRSVUUpCgk6IFFFdmVudChQYWludCksCgkgIHJlYyhwYWlu dFJlZ2lvbi5ib3VuZGluZ1JlY3QoKSksCgkgIHJlZyhwYWludFJlZ2lvbiksCgkgIGVyYXNlKGVy YXNlZCl7fQogICAgUVBhaW50RXZlbnQoIGNvbnN0IFFSZWN0ICZwYWludFJlY3QsIGJvb2wgZXJh c2VkID0gVFJVRSApCgk6IFFFdmVudChQYWludCksCgkgIHJlYyhwYWludFJlY3QpLAoJICByZWco cGFpbnRSZWN0KSwKCSAgZXJhc2UoZXJhc2VkKXt9CiAgICBjb25zdCBRUmVjdCAmcmVjdCgpIGNv bnN0CSAgeyByZXR1cm4gcmVjOyB9CiAgICBjb25zdCBRUmVnaW9uICZyZWdpb24oKSBjb25zdCB7 IHJldHVybiByZWc7IH0KICAgIGJvb2wgZXJhc2VkKCkgY29uc3QgeyByZXR1cm4gZXJhc2U7IH0K cHJvdGVjdGVkOgogICAgZnJpZW5kIGNsYXNzIFFBcHBsaWNhdGlvbjsKICAgIGZyaWVuZCBjbGFz cyBRQmFzZUFwcGxpY2F0aW9uOwogICAgUVJlY3QgcmVjOwogICAgUVJlZ2lvbiByZWc7CiAgICBi b29sIGVyYXNlOwp9OwoKCmNsYXNzICAgUU1vdmVFdmVudCA6IHB1YmxpYyBRRXZlbnQKewpwdWJs aWM6CiAgICBRTW92ZUV2ZW50KCBjb25zdCBRUG9pbnQgJnBvcywgY29uc3QgUVBvaW50ICZvbGRQ b3MgKQoJOiBRRXZlbnQoTW92ZSksIHAocG9zKSwgb2xkcChvbGRQb3MpIHt9CiAgICBjb25zdCBR UG9pbnQgJnBvcygpCSAgY29uc3QgeyByZXR1cm4gcDsgfQogICAgY29uc3QgUVBvaW50ICZvbGRQ b3MoKWNvbnN0IHsgcmV0dXJuIG9sZHA7fQpwcm90ZWN0ZWQ6CiAgICBRUG9pbnQgcCwgb2xkcDsK ICAgIGZyaWVuZCBjbGFzcyBRQXBwbGljYXRpb247CiAgICBmcmllbmQgY2xhc3MgUUJhc2VBcHBs aWNhdGlvbjsKfTsKCgpjbGFzcyAgIFFSZXNpemVFdmVudCA6IHB1YmxpYyBRRXZlbnQKewpwdWJs aWM6CiAgICBRUmVzaXplRXZlbnQoIGNvbnN0IFFTaXplICZzaXplLCBjb25zdCBRU2l6ZSAmb2xk U2l6ZSApCgk6IFFFdmVudChSZXNpemUpLCBzKHNpemUpLCBvbGRzKG9sZFNpemUpIHt9CiAgICBj b25zdCBRU2l6ZSAmc2l6ZSgpCSAgY29uc3QgeyByZXR1cm4gczsgfQogICAgY29uc3QgUVNpemUg Jm9sZFNpemUoKWNvbnN0IHsgcmV0dXJuIG9sZHM7fQpwcm90ZWN0ZWQ6CiAgICBRU2l6ZSBzLCBv bGRzOwogICAgZnJpZW5kIGNsYXNzIFFBcHBsaWNhdGlvbjsKICAgIGZyaWVuZCBjbGFzcyBRQmFz ZUFwcGxpY2F0aW9uOwp9OwoKCmNsYXNzICAgUUNsb3NlRXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsK cHVibGljOgogICAgUUNsb3NlRXZlbnQoKQoJOiBRRXZlbnQoQ2xvc2UpLCBhY2NwdChGQUxTRSkg e30KICAgIGJvb2wgICBpc0FjY2VwdGVkKCkgY29uc3QJeyByZXR1cm4gYWNjcHQ7IH0KICAgIHZv aWQgICBhY2NlcHQoKQkJeyBhY2NwdCA9IFRSVUU7IH0KICAgIHZvaWQgICBpZ25vcmUoKQkJeyBh Y2NwdCA9IEZBTFNFOyB9CnByb3RlY3RlZDoKICAgIGJvb2wgICBhY2NwdDsKfTsKCgpjbGFzcyAg IFFTaG93RXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVibGljOgogICAgUVNob3dFdmVudCgpCgk6 IFFFdmVudChTaG93KSB7fQp9OwoKCmNsYXNzICAgUUhpZGVFdmVudCA6IHB1YmxpYyBRRXZlbnQK ewpwdWJsaWM6CiAgICBRSGlkZUV2ZW50KCkKCTogUUV2ZW50KEhpZGUpIHt9Cn07CgpjbGFzcyAg IFFDb250ZXh0TWVudUV2ZW50IDogcHVibGljIFFFdmVudAp7CnB1YmxpYzoKICAgIGVudW0gUmVh c29uIHsgTW91c2UsIEtleWJvYXJkLCBPdGhlciB9OwogICAgUUNvbnRleHRNZW51RXZlbnQoIFJl YXNvbiByZWFzb24sIGNvbnN0IFFQb2ludCAmcG9zLCBjb25zdCBRUG9pbnQgJmdsb2JhbFBvcywg aW50IHN0YXRlICkKCTogUUV2ZW50KCBDb250ZXh0TWVudSApLCBwKCBwb3MgKSwgZ3AoIGdsb2Jh bFBvcyApLCBhY2NwdCggRkFMU0UgKSwgY29uc3VtKEZBTFNFKSwKCXJlYXMoIHJlYXNvbiApLCBz KCh1c2hvcnQpc3RhdGUpIHt9CiAgICBRQ29udGV4dE1lbnVFdmVudCggUmVhc29uIHJlYXNvbiwg Y29uc3QgUVBvaW50ICZwb3MsIGludCBzdGF0ZSApOwoKICAgIGludAkgICAgeCgpIGNvbnN0IHsg cmV0dXJuIHAueCgpOyB9CiAgICBpbnQJICAgIHkoKSBjb25zdCB7IHJldHVybiBwLnkoKTsgfQog ICAgaW50CSAgICBnbG9iYWxYKCkgY29uc3QgeyByZXR1cm4gZ3AueCgpOyB9CiAgICBpbnQJICAg IGdsb2JhbFkoKSBjb25zdCB7IHJldHVybiBncC55KCk7IH0KCiAgICBjb25zdCBRUG9pbnQmICAg cG9zKCkgY29uc3QgeyByZXR1cm4gcDsgfQogICAgY29uc3QgUVBvaW50JiAgIGdsb2JhbFBvcygp IGNvbnN0IHsgcmV0dXJuIGdwOyB9CgogICAgQnV0dG9uU3RhdGUgc3RhdGUoKQljb25zdAl7IHJl dHVybiAoQnV0dG9uU3RhdGUpIHM7IH0KICAgIGJvb2wgICAgaXNBY2NlcHRlZCgpIGNvbnN0CXsg cmV0dXJuIGFjY3B0OyB9CiAgICBib29sICAgIGlzQ29uc3VtZWQoKSBjb25zdCAgeyByZXR1cm4g Y29uc3VtOyB9CiAgICB2b2lkICAgIGNvbnN1bWUoKSAgICAgICAgICAgeyBjb25zdW0gPSBUUlVF OyB9CiAgICB2b2lkICAgIGFjY2VwdCgpCQl7IGFjY3B0ID0gVFJVRTsgY29uc3VtID0gVFJVRTsg fQogICAgdm9pZCAgICBpZ25vcmUoKQkJeyBhY2NwdCA9IEZBTFNFOyBjb25zdW0gPSBGQUxTRTsg fQoKICAgIFJlYXNvbiAgcmVhc29uKCkgY29uc3QgeyByZXR1cm4gUmVhc29uKCByZWFzICk7IH0K CnByb3RlY3RlZDoKICAgIFFQb2ludCAgcDsKICAgIFFQb2ludCAgZ3A7CiAgICBib29sICAgIGFj Y3B0OwogICAgYm9vbCAgICBjb25zdW07CiAgICB1aW50ICAgIHJlYXM6ODsKICAgIHVzaG9ydCBz Owp9OwoKCmNsYXNzICAgUUlNRXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVibGljOgogICAgUUlN RXZlbnQoIFR5cGUgdHlwZSwgY29uc3QgUVN0cmluZyAmdGV4dCwgaW50IGN1cnNvclBvc2l0aW9u ICkKCTogUUV2ZW50KHR5cGUpLCB0eHQodGV4dCksIGNwb3MoY3Vyc29yUG9zaXRpb24pLCBhKEZB TFNFKSB7fQogICAgY29uc3QgUVN0cmluZyAmdGV4dCgpIGNvbnN0IHsgcmV0dXJuIHR4dDsgfQog ICAgaW50IGN1cnNvclBvcygpIGNvbnN0IHsgcmV0dXJuIGNwb3M7IH0KICAgIGJvb2wgaXNBY2Nl cHRlZCgpIGNvbnN0IHsgcmV0dXJuIGE7IH0KICAgIHZvaWQgYWNjZXB0KCkgeyBhID0gVFJVRTsg fQogICAgdm9pZCBpZ25vcmUoKSB7IGEgPSBGQUxTRTsgfQpwcml2YXRlOgogICAgUVN0cmluZyB0 eHQ7CiAgICBpbnQgY3BvczsKICAgIGJvb2wgYTsKfTsKCgoKCiAKIAogCgpjbGFzcyAgIFFEcm9w RXZlbnQgOiBwdWJsaWMgUUV2ZW50LCBwdWJsaWMgUU1pbWVTb3VyY2UKewpwdWJsaWM6CiAgICBR RHJvcEV2ZW50KCBjb25zdCBRUG9pbnQmIHBvcywgVHlwZSB0eXA9RHJvcCApCgk6IFFFdmVudCh0 eXApLCBwKHBvcyksCgkgIGFjdCgwKSwgYWNjcHQoMCksIGFjY3B0YWN0KDApLCByZXN2KDApLAoJ ICBkKDApCgl7fQogICAgY29uc3QgUVBvaW50ICZwb3MoKSBjb25zdAl7IHJldHVybiBwOyB9CiAg ICBib29sIGlzQWNjZXB0ZWQoKSBjb25zdAl7IHJldHVybiBhY2NwdCB8fCBhY2NwdGFjdDsgfQog ICAgdm9pZCBhY2NlcHQoYm9vbCB5PVRSVUUpCXsgYWNjcHQgPSB5OyB9CiAgICB2b2lkIGlnbm9y ZSgpCQl7IGFjY3B0ID0gRkFMU0U7IH0KCiAgICBib29sIGlzQWN0aW9uQWNjZXB0ZWQoKSBjb25z dCB7IHJldHVybiBhY2NwdGFjdDsgfQogICAgdm9pZCBhY2NlcHRBY3Rpb24oYm9vbCB5PVRSVUUp IHsgYWNjcHRhY3QgPSB5OyB9CiAgICBlbnVtIEFjdGlvbiB7IENvcHksIExpbmssIE1vdmUsIFBy aXZhdGUsIFVzZXJBY3Rpb249MTAwIH07CiAgICB2b2lkIHNldEFjdGlvbiggQWN0aW9uIGEgKSB7 IGFjdCA9ICh1aW50KWE7IH0KICAgIEFjdGlvbiBhY3Rpb24oKSBjb25zdCB7IHJldHVybiBBY3Rp b24oYWN0KTsgfQoKICAgIFFXaWRnZXQqIHNvdXJjZSgpIGNvbnN0OwogICAgY29uc3QgY2hhciog Zm9ybWF0KCBpbnQgbiA9IDAgKSBjb25zdDsKICAgIFFCeXRlQXJyYXkgZW5jb2RlZERhdGEoIGNv bnN0IGNoYXIqICkgY29uc3Q7CiAgICBib29sIHByb3ZpZGVzKCBjb25zdCBjaGFyKiApIGNvbnN0 OwoKICAgIFFCeXRlQXJyYXkgZGF0YShjb25zdCBjaGFyKiBmKSBjb25zdCB7IHJldHVybiBlbmNv ZGVkRGF0YShmKTsgfQoKICAgIHZvaWQgc2V0UG9pbnQoIGNvbnN0IFFQb2ludCYgbnAgKSB7IHAg PSBucDsgfQoKcHJvdGVjdGVkOgogICAgUVBvaW50IHA7CiAgICB1aW50IGFjdDo4OwogICAgdWlu dCBhY2NwdDoxOwogICAgdWludCBhY2NwdGFjdDoxOwogICAgdWludCByZXN2OjU7CiAgICB2b2lk ICogZDsKfTsKCgoKY2xhc3MgICBRRHJhZ01vdmVFdmVudCA6IHB1YmxpYyBRRHJvcEV2ZW50CnsK cHVibGljOgogICAgUURyYWdNb3ZlRXZlbnQoIGNvbnN0IFFQb2ludCYgcG9zLCBUeXBlIHR5cD1E cmFnTW92ZSApCgk6IFFEcm9wRXZlbnQocG9zLHR5cCksCgkgIHJlY3QoIHBvcywgUVNpemUoIDEs IDEgKSApIHt9CiAgICBRUmVjdCBhbnN3ZXJSZWN0KCkgY29uc3QgeyByZXR1cm4gcmVjdDsgfQog ICAgdm9pZCBhY2NlcHQoIGJvb2wgeT1UUlVFICkgeyBRRHJvcEV2ZW50OjphY2NlcHQoeSk7IH0K ICAgIHZvaWQgYWNjZXB0KCBjb25zdCBRUmVjdCAmIHIpIHsgYWNjcHQgPSBUUlVFOyByZWN0ID0g cjsgfQogICAgdm9pZCBpZ25vcmUoIGNvbnN0IFFSZWN0ICYgcikgeyBhY2NwdCA9RkFMU0U7IHJl Y3QgPSByOyB9CiAgICB2b2lkIGlnbm9yZSgpCQl7IFFEcm9wRXZlbnQ6Omlnbm9yZSgpOyB9Cgpw cm90ZWN0ZWQ6CiAgICBRUmVjdCByZWN0Owp9OwoKCmNsYXNzICAgUURyYWdFbnRlckV2ZW50IDog cHVibGljIFFEcmFnTW92ZUV2ZW50CnsKcHVibGljOgogICAgUURyYWdFbnRlckV2ZW50KCBjb25z dCBRUG9pbnQmIHBvcyApIDoKCVFEcmFnTW92ZUV2ZW50KHBvcywgRHJhZ0VudGVyKSB7IH0KfTsK CgogCmNsYXNzICAgUURyYWdSZXNwb25zZUV2ZW50IDogcHVibGljIFFFdmVudAp7CnB1YmxpYzoK ICAgIFFEcmFnUmVzcG9uc2VFdmVudCggYm9vbCBhY2NlcHRlZCApCgk6IFFFdmVudChEcmFnUmVz cG9uc2UpLCBhKGFjY2VwdGVkKSB7fQogICAgYm9vbCAgIGRyYWdBY2NlcHRlZCgpIGNvbnN0CXsg cmV0dXJuIGE7IH0KcHJvdGVjdGVkOgogICAgYm9vbCBhOwp9OwoKCmNsYXNzICAgUURyYWdMZWF2 ZUV2ZW50IDogcHVibGljIFFFdmVudAp7CnB1YmxpYzoKICAgIFFEcmFnTGVhdmVFdmVudCgpCgk6 IFFFdmVudChEcmFnTGVhdmUpIHt9Cn07CgoKCmNsYXNzICAgUUNoaWxkRXZlbnQgOiBwdWJsaWMg UUV2ZW50CnsKcHVibGljOgogICAgUUNoaWxkRXZlbnQoIFR5cGUgdHlwZSwgUU9iamVjdCAqY2hp bGQgKQoJOiBRRXZlbnQodHlwZSksIGMoY2hpbGQpIHt9CiAgICBRT2JqZWN0ICpjaGlsZCgpIGNv bnN0CXsgcmV0dXJuIGM7IH0KICAgIGJvb2wgaW5zZXJ0ZWQoKSBjb25zdCB7IHJldHVybiB0ID09 IENoaWxkSW5zZXJ0ZWQ7IH0KICAgIGJvb2wgcmVtb3ZlZCgpIGNvbnN0IHsgcmV0dXJuIHQgPT0g Q2hpbGRSZW1vdmVkOyB9CnByb3RlY3RlZDoKICAgIFFPYmplY3QgKmM7Cn07CgoKY2xhc3MgICBR Q3VzdG9tRXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVibGljOgogICAgUUN1c3RvbUV2ZW50KCBp bnQgdHlwZSApOwogICAgUUN1c3RvbUV2ZW50KCBUeXBlIHR5cGUsIHZvaWQgKmRhdGEgKQoJOiBR RXZlbnQodHlwZSksIGQoZGF0YSkge307CiAgICB2b2lkICAgICAgICpkYXRhKCkJY29uc3QJeyBy ZXR1cm4gZDsgfQogICAgdm9pZAlzZXREYXRhKCB2b2lkKiBkYXRhICkJeyBkID0gZGF0YTsgfQpw cml2YXRlOgogICAgdm9pZCAgICAgICAqZDsKfTsKCgojIDQ1ICIvdXNyL2xvY2FsL3F0L2luY2x1 ZGUvcW9iamVjdC5oIiAyCgoKCgoKCgpjbGFzcyBRTWV0YU9iamVjdDsKY2xhc3MgUVZhcmlhbnQ7 CmNsYXNzIFFNZXRhUHJvcGVydHk7CmNsYXNzIFFQb3N0RXZlbnRMaXN0OwpjbGFzcyBRT2JqZWN0 UHJpdmF0ZTsKc3RydWN0IFFVT2JqZWN0OwoKY2xhc3MgICBRT2JqZWN0OiBwdWJsaWMgUXQKewog ICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1 cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkg Y29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29s IHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwg UVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50 KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFP YmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29u c3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29u c3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmpl Y3QgKm1ldGFPYmo7IAogICAgIAoKcHVibGljOgogICAgUU9iamVjdCggUU9iamVjdCAqcGFyZW50 PTAsIGNvbnN0IGNoYXIgKm5hbWU9MCApOwogICAgdmlydHVhbCB+UU9iamVjdCgpOwoKCgoKCgoK CiAgICB2aXJ0dWFsIGJvb2wgZXZlbnQoIFFFdmVudCAqICk7CiAgICB2aXJ0dWFsIGJvb2wgZXZl bnRGaWx0ZXIoIFFPYmplY3QgKiwgUUV2ZW50ICogKTsKCiAgICBib29sCSBpc0EoIGNvbnN0IGNo YXIgKiApCSBjb25zdDsKICAgIGJvb2wJIGluaGVyaXRzKCBjb25zdCBjaGFyICogKSBjb25zdDsK CiAgICBjb25zdCBjaGFyICAqbmFtZSgpIGNvbnN0OwogICAgY29uc3QgY2hhciAgKm5hbWUoIGNv bnN0IGNoYXIgKiBkZWZhdWx0TmFtZSApIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBzZXROYW1l KCBjb25zdCBjaGFyICpuYW1lICk7CiAgICBib29sCSBpc1dpZGdldFR5cGUoKQkgIGNvbnN0IHsg cmV0dXJuIGlzV2lkZ2V0OyB9CiAgICBib29sCSBoaWdoUHJpb3JpdHkoKQkgIGNvbnN0IHsgcmV0 dXJuIEZBTFNFOyB9CgogICAgYm9vbAkgc2lnbmFsc0Jsb2NrZWQoKSAgY29uc3QgeyByZXR1cm4g YmxvY2tTaWc7IH0KICAgIHZvaWQJIGJsb2NrU2lnbmFscyggYm9vbCBiICk7CgogICAgaW50CQkg c3RhcnRUaW1lciggaW50IGludGVydmFsICk7CiAgICB2b2lkCSBraWxsVGltZXIoIGludCBpZCAp OwogICAgdm9pZAkga2lsbFRpbWVycygpOwoKICAgIFFPYmplY3QgICAgICAgICAgICpjaGlsZCgg Y29uc3QgY2hhciAqb2JqTmFtZSwgY29uc3QgY2hhciAqaW5oZXJpdHNDbGFzcyA9IDAsIGJvb2wg cmVjdXJzaXZlU2VhcmNoID0gVFJVRSApOyAgCiAgICBjb25zdCBRT2JqZWN0TGlzdCAqY2hpbGRy ZW4oKSBjb25zdCB7IHJldHVybiBjaGlsZE9iamVjdHM7IH0KCiAgICBzdGF0aWMgY29uc3QgUU9i amVjdExpc3QgKm9iamVjdFRyZWVzKCk7CgogICAgUU9iamVjdExpc3QJICAgICAgKnF1ZXJ5TGlz dCggY29uc3QgY2hhciAqaW5oZXJpdHNDbGFzcyA9IDAsCgkJCQkgIGNvbnN0IGNoYXIgKm9iak5h bWUgPSAwLAoJCQkJICBib29sIHJlZ2V4cE1hdGNoID0gVFJVRSwKCQkJCSAgYm9vbCByZWN1cnNp dmVTZWFyY2ggPSBUUlVFICkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIGluc2VydENoaWxkKCBR T2JqZWN0ICogKTsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVDaGlsZCggUU9iamVjdCAqICk7Cgog ICAgdm9pZAkgaW5zdGFsbEV2ZW50RmlsdGVyKCBjb25zdCBRT2JqZWN0ICogKTsKICAgIHZvaWQJ IHJlbW92ZUV2ZW50RmlsdGVyKCBjb25zdCBRT2JqZWN0ICogKTsKCiAgICBzdGF0aWMgYm9vbCAg Y29ubmVjdCggY29uc3QgUU9iamVjdCAqc2VuZGVyLCBjb25zdCBjaGFyICpzaWduYWwsCgkJCSAg Y29uc3QgUU9iamVjdCAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKm1lbWJlciApOwogICAgYm9vbAkg Y29ubmVjdCggY29uc3QgUU9iamVjdCAqc2VuZGVyLCBjb25zdCBjaGFyICpzaWduYWwsCgkJCSAg Y29uc3QgY2hhciAqbWVtYmVyICkgY29uc3Q7CiAgICBzdGF0aWMgYm9vbCAgZGlzY29ubmVjdCgg Y29uc3QgUU9iamVjdCAqc2VuZGVyLCBjb25zdCBjaGFyICpzaWduYWwsCgkJCSAgICAgY29uc3Qg UU9iamVjdCAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKm1lbWJlciApOwogICAgYm9vbAkgZGlzY29u bmVjdCggY29uc3QgY2hhciAqc2lnbmFsPTAsCgkJCSAgICAgY29uc3QgUU9iamVjdCAqcmVjZWl2 ZXI9MCwgY29uc3QgY2hhciAqbWVtYmVyPTAgKTsKICAgIGJvb2wJIGRpc2Nvbm5lY3QoIGNvbnN0 IFFPYmplY3QgKnJlY2VpdmVyLCBjb25zdCBjaGFyICptZW1iZXI9MCApOwogICAgc3RhdGljIHZv aWQgCSBjb25uZWN0SW50ZXJuYWwoIGNvbnN0IFFPYmplY3QgKnNlbmRlciwgaW50IHNpZ25hbF9p bmRleCwgY29uc3QgUU9iamVjdCAqcmVjZWl2ZXIsCgkJCQkgIGludCBtZW1iY29kZSwgaW50IG1l bWJlcl9pbmRleCApOwoKICAgIHZvaWQJIGR1bXBPYmplY3RUcmVlKCk7CiAgICB2b2lkCSBkdW1w T2JqZWN0SW5mbygpOwoKCiAgICB2aXJ0dWFsIGJvb2wgc2V0UHJvcGVydHkoIGNvbnN0IGNoYXIg Km5hbWUsIGNvbnN0IFFWYXJpYW50JiB2YWx1ZSApOwogICAgdmlydHVhbCBRVmFyaWFudCBwcm9w ZXJ0eSggY29uc3QgY2hhciAqbmFtZSApIGNvbnN0OwoKCgoKCgoKCnByb3RlY3RlZCA6CiAgICB2 b2lkCSBkZXN0cm95ZWQoKTsKICAgIHZvaWQJIGRlc3Ryb3llZCggUU9iamVjdCogb2JqICk7Cgpw dWJsaWM6CiAgICBRT2JqZWN0CSpwYXJlbnQoKSBjb25zdCB7IHJldHVybiBwYXJlbnRPYmo7IH0K CnB1YmxpYyAgOgogICAgdm9pZAlkZWxldGVMYXRlcigpOwoKcHJpdmF0ZSAgOgogICAgdm9pZAkg Y2xlYW51cEV2ZW50RmlsdGVyKCBRT2JqZWN0KiApOwoKcHJvdGVjdGVkOgogICAgYm9vbAlhY3Rp dmF0ZV9maWx0ZXJzKCBRRXZlbnQgKiApOwogICAgUUNvbm5lY3Rpb25MaXN0ICpyZWNlaXZlcnMo IGNvbnN0IGNoYXIqIHNpZ25hbCApIGNvbnN0OwogICAgUUNvbm5lY3Rpb25MaXN0ICpyZWNlaXZl cnMoIGludCBzaWduYWwgKSBjb25zdDsKICAgIHZvaWQJYWN0aXZhdGVfc2lnbmFsKCBpbnQgc2ln bmFsICk7CiAgICB2b2lkCWFjdGl2YXRlX3NpZ25hbCggaW50IHNpZ25hbCwgaW50ICk7CiAgICB2 b2lkCWFjdGl2YXRlX3NpZ25hbCggaW50IHNpZ25hbCwgZG91YmxlICk7CiAgICB2b2lkCWFjdGl2 YXRlX3NpZ25hbCggaW50IHNpZ25hbCwgUVN0cmluZyApOwogICAgdm9pZAlhY3RpdmF0ZV9zaWdu YWxfYm9vbCggaW50IHNpZ25hbCwgYm9vbCApOwogICAgdm9pZCAJYWN0aXZhdGVfc2lnbmFsKCBR Q29ubmVjdGlvbkxpc3QgKmNsaXN0LCBRVU9iamVjdCAqbyApOwoKICAgIGNvbnN0IFFPYmplY3Qg KnNlbmRlcigpOwoKICAgIHZpcnR1YWwgdm9pZCB0aW1lckV2ZW50KCBRVGltZXJFdmVudCAqICk7 CiAgICB2aXJ0dWFsIHZvaWQgY2hpbGRFdmVudCggUUNoaWxkRXZlbnQgKiApOwogICAgdmlydHVh bCB2b2lkIGN1c3RvbUV2ZW50KCBRQ3VzdG9tRXZlbnQgKiApOwoKICAgIHZpcnR1YWwgdm9pZCBj b25uZWN0Tm90aWZ5KCBjb25zdCBjaGFyICpzaWduYWwgKTsKICAgIHZpcnR1YWwgdm9pZCBkaXNj b25uZWN0Tm90aWZ5KCBjb25zdCBjaGFyICpzaWduYWwgKTsKICAgIHZpcnR1YWwgYm9vbCBjaGVj a0Nvbm5lY3RBcmdzKCBjb25zdCBjaGFyICpzaWduYWwsIGNvbnN0IFFPYmplY3QgKnJlY2VpdmVy LAoJCQkJICAgY29uc3QgY2hhciAqbWVtYmVyICk7CiAgICBzdGF0aWMgUUNTdHJpbmcgbm9ybWFs aXplU2lnbmFsU2xvdCggY29uc3QgY2hhciAqc2lnbmFsU2xvdCApOwoKcHJpdmF0ZToKICAgIHVp bnQJaXNTaWduYWwgICA6IDE7CiAgICB1aW50CWlzV2lkZ2V0ICAgOiAxOwogICAgdWludAlwZW5k VGltZXIgIDogMTsKICAgIHVpbnQJYmxvY2tTaWcgICA6IDE7CiAgICB1aW50CXdhc0RlbGV0ZWQg OiAxOwogICAgdWludAlpc1RyZWUgOiAxOwoKICAgIGNvbnN0IGNoYXIJKm9iam5hbWU7CiAgICBR T2JqZWN0CSpwYXJlbnRPYmo7CiAgICBRT2JqZWN0TGlzdCAqY2hpbGRPYmplY3RzOwogICAgUVNp Z25hbFZlYyAqY29ubmVjdGlvbnM7CiAgICBRT2JqZWN0TGlzdCAqc2VuZGVyT2JqZWN0czsKICAg IFFPYmplY3RMaXN0ICpldmVudEZpbHRlcnM7CiAgICBRUG9zdEV2ZW50TGlzdCAqcG9zdGVkRXZl bnRzOwogICAgUU9iamVjdFByaXZhdGUqIGQ7CgogICAgc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0 aWNRdE1ldGFPYmplY3QoKTsKCiAgICBmcmllbmQgY2xhc3MgUUFwcGxpY2F0aW9uOwogICAgZnJp ZW5kIGNsYXNzIFFCYXNlQXBwbGljYXRpb247CiAgICBmcmllbmQgY2xhc3MgUVdpZGdldDsKICAg IGZyaWVuZCBjbGFzcyBRU2lnbmFsOwogICAgZnJpZW5kIGNsYXNzIFFTZW5kZXJPYmplY3Q7Cgpw cml2YXRlOgkgCgogICAgUU9iamVjdCggY29uc3QgUU9iamVjdCAmICk7CiAgICBRT2JqZWN0ICZv cGVyYXRvcj0oIGNvbnN0IFFPYmplY3QgJiApOwoKfTsKCgppbmxpbmUgYm9vbCBRT2JqZWN0Ojpj b25uZWN0KCBjb25zdCBRT2JqZWN0ICpzZW5kZXIsIGNvbnN0IGNoYXIgKnNpZ25hbCwKCQkJICAg ICAgY29uc3QgY2hhciAqbWVtYmVyICkgY29uc3QKewogICAgcmV0dXJuIGNvbm5lY3QoIHNlbmRl ciwgc2lnbmFsLCB0aGlzLCBtZW1iZXIgKTsKfQoKCmlubGluZSBib29sIFFPYmplY3Q6OmRpc2Nv bm5lY3QoIGNvbnN0IGNoYXIgKnNpZ25hbCwKCQkJCSBjb25zdCBRT2JqZWN0ICpyZWNlaXZlciwg Y29uc3QgY2hhciAqbWVtYmVyICkKewogICAgcmV0dXJuIGRpc2Nvbm5lY3QoIHRoaXMsIHNpZ25h bCwgcmVjZWl2ZXIsIG1lbWJlciApOwp9CgoKaW5saW5lIGJvb2wgUU9iamVjdDo6ZGlzY29ubmVj dCggY29uc3QgUU9iamVjdCAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKm1lbWJlciApCnsKICAgIHJl dHVybiBkaXNjb25uZWN0KCB0aGlzLCAwLCByZWNlaXZlciwgbWVtYmVyICk7Cn0KCgpjbGFzcyAg IFFTZW5kZXJPYmplY3QgOiBwdWJsaWMgUU9iamVjdAkJIAp7CnB1YmxpYzoKICAgIHZvaWQgc2V0 U2VuZGVyKCBRT2JqZWN0ICpzICk7Cn07CgojIDI0MSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fv YmplY3QuaCIKCgoKCgojIDQzICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXdpZGdldC5oIiAyCgoj IDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcGFpbnRkZXZpY2UuaCIgMQogCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBRSU9EZXZpY2U7CmNs YXNzIFFTdHJpbmc7CgoKCnN0cnVjdCBRUGFpbnREZXZpY2VYMTFEYXRhOwoKCnVuaW9uIFFQRGV2 Q21kUGFyYW0gewogICAgaW50CQkJIGl2YWw7CiAgICBpbnQJCQkqaXZlYzsKICAgIFFTdHJpbmcJ ICAgICAgICAqc3RyOwogICAgY29uc3QgUVBvaW50CSpwb2ludDsKICAgIGNvbnN0IFFSZWN0CQkq cmVjdDsKICAgIGNvbnN0IFFQb2ludEFycmF5CSpwdGFycjsKICAgIGNvbnN0IFFQaXhtYXAJKnBp eG1hcDsKICAgIGNvbnN0IFFJbWFnZQkqaW1hZ2U7CiAgICBjb25zdCBRQ29sb3IJKmNvbG9yOwog ICAgY29uc3QgUUZvbnQJCSpmb250OwogICAgY29uc3QgUVBlbgkJKnBlbjsKICAgIGNvbnN0IFFC cnVzaAkqYnJ1c2g7CiAgICBjb25zdCBRUmVnaW9uCSpyZ247CiAgICBjb25zdCBRV01hdHJpeAkq bWF0cml4OwogICAgUUlPRGV2aWNlCQkqZGV2aWNlOwp9OwoKCgpjbGFzcyAgIFFQYWludERldmlj ZQkJCQkgCnsKcHVibGljOgogICAgdmlydHVhbCB+UVBhaW50RGV2aWNlKCk7CgogICAgaW50CQlk ZXZUeXBlKCkgY29uc3Q7CiAgICBib29sCWlzRXh0RGV2KCkgY29uc3Q7CiAgICBib29sCXBhaW50 aW5nQWN0aXZlKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFJlc29sdXRpb24oIGludCAp OwogICAgdmlydHVhbCBpbnQgcmVzb2x1dGlvbigpIGNvbnN0OwoKICAgICAKICAgICAKCgoKICAg IHZpcnR1YWwgUXQ6OkhBTkRMRQloYW5kbGUoKSBjb25zdDsKICAgIHZpcnR1YWwgUXQ6OkhBTkRM RSAgeDExUmVuZGVySGFuZGxlKCkgY29uc3Q7CgoKCgoKCgogICAgRGlzcGxheSAJICAgKngxMURp c3BsYXkoKSBjb25zdDsKICAgIGludAkJICAgIHgxMVNjcmVlbigpIGNvbnN0OwogICAgaW50CQkg ICAgeDExRGVwdGgoKSBjb25zdDsKICAgIGludAkJICAgIHgxMUNlbGxzKCkgY29uc3Q7CiAgICBR dDo6SEFORExFCSAgICB4MTFDb2xvcm1hcCgpIGNvbnN0OwogICAgYm9vbAkgICAgeDExRGVmYXVs dENvbG9ybWFwKCkgY29uc3Q7CiAgICB2b2lkCSAgICp4MTFWaXN1YWwoKSBjb25zdDsKICAgIGJv b2wJICAgIHgxMURlZmF1bHRWaXN1YWwoKSBjb25zdDsKCiAgICBzdGF0aWMgRGlzcGxheSAqeDEx QXBwRGlzcGxheSgpOwogICAgc3RhdGljIGludAkgICAgeDExQXBwU2NyZWVuKCk7CiAgICBzdGF0 aWMgaW50CSAgICB4MTFBcHBEZXB0aCgpOwogICAgc3RhdGljIGludAkgICAgeDExQXBwQ2VsbHMo KTsKICAgIHN0YXRpYyBpbnQJICAgIHgxMUFwcERwaVgoKTsKICAgIHN0YXRpYyBpbnQJICAgIHgx MUFwcERwaVkoKTsKICAgIHN0YXRpYyBRdDo6SEFORExFICAgeDExQXBwQ29sb3JtYXAoKTsKICAg IHN0YXRpYyBib29sICAgICB4MTFBcHBEZWZhdWx0Q29sb3JtYXAoKTsKICAgIHN0YXRpYyB2b2lk ICAgICp4MTFBcHBWaXN1YWwoKTsKICAgIHN0YXRpYyBib29sCSAgICB4MTFBcHBEZWZhdWx0Vmlz dWFsKCk7CiAgICBzdGF0aWMgdm9pZAkgICAgeDExU2V0QXBwRHBpWChpbnQpOwogICAgc3RhdGlj IHZvaWQJICAgIHgxMVNldEFwcERwaVkoaW50KTsKCgoKCgoKCgoKICAgIGVudW0gUERldkNtZCB7 CglQZGNOT1AgPSAwLCAgCglQZGNEcmF3UG9pbnQgPSAxLCAgCglQZGNEcmF3Rmlyc3QgPSBQZGNE cmF3UG9pbnQsCglQZGNNb3ZlVG8gPSAyLCAgCglQZGNMaW5lVG8gPSAzLCAgCglQZGNEcmF3TGlu ZSA9IDQsICAKCVBkY0RyYXdSZWN0ID0gNSwgIAoJUGRjRHJhd1JvdW5kUmVjdCA9IDYsICAKCVBk Y0RyYXdFbGxpcHNlID0gNywgIAoJUGRjRHJhd0FyYyA9IDgsICAKCVBkY0RyYXdQaWUgPSA5LCAg CglQZGNEcmF3Q2hvcmQgPSAxMCwgIAoJUGRjRHJhd0xpbmVTZWdtZW50cyA9IDExLCAgCglQZGNE cmF3UG9seWxpbmUgPSAxMiwgIAoJUGRjRHJhd1BvbHlnb24gPSAxMywgIAoJUGRjRHJhd0N1Ymlj QmV6aWVyID0gMTQsICAKCVBkY0RyYXdUZXh0ID0gMTUsICAKCVBkY0RyYXdUZXh0Rm9ybWF0dGVk ID0gMTYsICAKCVBkY0RyYXdQaXhtYXAgPSAxNywgIAoJUGRjRHJhd0ltYWdlID0gMTgsICAKCVBk Y0RyYXdUZXh0MiA9IDE5LCAgCglQZGNEcmF3VGV4dDJGb3JtYXR0ZWQgPSAyMCwgIAoJUGRjRHJh d0xhc3QgPSBQZGNEcmF3VGV4dDJGb3JtYXR0ZWQsCgoJIAoKCVBkY0JlZ2luID0gMzAsICAKCVBk Y0VuZCA9IDMxLCAgCglQZGNTYXZlID0gMzIsICAKCVBkY1Jlc3RvcmUgPSAzMywgIAoJUGRjU2V0 ZGV2ID0gMzQsICAKCVBkY1NldEJrQ29sb3IgPSA0MCwgIAoJUGRjU2V0QmtNb2RlID0gNDEsICAK CVBkY1NldFJPUCA9IDQyLCAgCglQZGNTZXRCcnVzaE9yaWdpbiA9IDQzLCAgCglQZGNTZXRGb250 ID0gNDUsICAKCVBkY1NldFBlbiA9IDQ2LCAgCglQZGNTZXRCcnVzaCA9IDQ3LCAgCglQZGNTZXRU YWJTdG9wcyA9IDQ4LCAgCglQZGNTZXRUYWJBcnJheSA9IDQ5LCAgCglQZGNTZXRVbml0ID0gNTAs ICAKCVBkY1NldFZYZm9ybSA9IDUxLCAgCglQZGNTZXRXaW5kb3cgPSA1MiwgIAoJUGRjU2V0Vmll d3BvcnQgPSA1MywgIAoJUGRjU2V0V1hmb3JtID0gNTQsICAKCVBkY1NldFdNYXRyaXggPSA1NSwg IAoJUGRjU2F2ZVdNYXRyaXggPSA1NiwKCVBkY1Jlc3RvcmVXTWF0cml4ID0gNTcsCglQZGNTZXRD bGlwID0gNjAsICAKCVBkY1NldENsaXBSZWdpb24gPSA2MSwgIAoKCVBkY1Jlc2VydmVkU3RhcnQg PSAwLCAgCglQZGNSZXNlcnZlZFN0b3AgPSAxOTkgIAogICAgfTsKCnByb3RlY3RlZDoKICAgIFFQ YWludERldmljZSggdWludCBkZXZmbGFncyApOwoKCgoKICAgIFF0OjpIQU5ETEUJaGQ7CQkJCSAK ICAgIFF0OjpIQU5ETEUgIHJlbmRoZDsgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgIHZv aWQJCSBjb3B5WDExRGF0YSggY29uc3QgUVBhaW50RGV2aWNlICogKTsKICAgIHZvaWQJCSBjbG9u ZVgxMURhdGEoIGNvbnN0IFFQYWludERldmljZSAqICk7CiAgICB2aXJ0dWFsIHZvaWQJIHNldFgx MURhdGEoIGNvbnN0IFFQYWludERldmljZVgxMURhdGEqICk7CiAgICBRUGFpbnREZXZpY2VYMTFE YXRhKiBnZXRYMTFEYXRhKCBib29sIGRlZj1GQUxTRSApIGNvbnN0OwoKCgoKCgoKCgogICAgdmly dHVhbCBib29sIGNtZCggaW50LCBRUGFpbnRlciAqLCBRUERldkNtZFBhcmFtICogKTsKICAgIHZp cnR1YWwgaW50CSBtZXRyaWMoIGludCApIGNvbnN0OwogICAgdmlydHVhbCBpbnQJIGZvbnRNZXQo IFFGb250ICosIGludCwgY29uc3QgY2hhciAqID0gMCwgaW50ID0gMCApIGNvbnN0OwogICAgdmly dHVhbCBpbnQJIGZvbnRJbmYoIFFGb250ICosIGludCApIGNvbnN0OwoKICAgIHVzaG9ydAlkZXZG bGFnczsJCQkgCiAgICB1c2hvcnQJcGFpbnRlcnM7CQkJIAoKICAgIGZyaWVuZCBjbGFzcyBRUGFp bnRlcjsKICAgIGZyaWVuZCBjbGFzcyBRUGFpbnREZXZpY2VNZXRyaWNzOwoKCgoKCgoKICAgIGZy aWVuZCAgIHZvaWQgYml0Qmx0KCBRUGFpbnREZXZpY2UgKiwgaW50LCBpbnQsCgkJCQkgY29uc3Qg UVBhaW50RGV2aWNlICosCgkJCQkgaW50LCBpbnQsIGludCwgaW50LCBRdDo6UmFzdGVyT3AsIGJv b2wgKTsKCgogICAgZnJpZW5kIHZvaWQgcXRfaW5pdF9pbnRlcm5hbCggaW50ICosIGNoYXIgKios IERpc3BsYXkgKiwgUXQ6OkhBTkRMRSwgUXQ6OkhBTkRMRSApOwoKCnByaXZhdGU6CgogICAgc3Rh dGljIERpc3BsYXkgKnhfYXBwZGlzcGxheTsKICAgIHN0YXRpYyBpbnQJICAgIHhfYXBwc2NyZWVu OwogICAgc3RhdGljIGludAkgICAgeF9hcHBkZXB0aDsKICAgIHN0YXRpYyBpbnQJICAgIHhfYXBw Y2VsbHM7CiAgICBzdGF0aWMgUXQ6OkhBTkRMRSAgIHhfYXBwY29sb3JtYXA7CiAgICBzdGF0aWMg Ym9vbAkgICAgeF9hcHBkZWZjb2xvcm1hcDsKICAgIHN0YXRpYyB2b2lkCSAgICp4X2FwcHZpc3Vh bDsKICAgIHN0YXRpYyBib29sICAgICB4X2FwcGRlZnZpc3VhbDsKCiAgICBRUGFpbnREZXZpY2VY MTFEYXRhKiB4MTFEYXRhOwoKCnByaXZhdGU6CSAKCiAgICBRUGFpbnREZXZpY2UoIGNvbnN0IFFQ YWludERldmljZSAmICk7CiAgICBRUGFpbnREZXZpY2UgJm9wZXJhdG9yPSggY29uc3QgUVBhaW50 RGV2aWNlICYgKTsKCn07CgoKIAp2b2lkIGJpdEJsdCggUVBhaW50RGV2aWNlICpkc3QsIGludCBk eCwgaW50IGR5LAoJICAgICBjb25zdCBRUGFpbnREZXZpY2UgKnNyYywgaW50IHN4PTAsIGludCBz eT0wLCBpbnQgc3c9LTEsIGludCBzaD0tMSwKCSAgICAgUXQ6OlJhc3Rlck9wID0gUXQ6OkNvcHlS T1AsIGJvb2wgaWdub3JlTWFzaz1GQUxTRSApOwoKIAp2b2lkIGJpdEJsdCggUVBhaW50RGV2aWNl ICpkc3QsIGludCBkeCwgaW50IGR5LAoJICAgICBjb25zdCBRSW1hZ2UgKnNyYywgaW50IHN4PTAs IGludCBzeT0wLCBpbnQgc3c9LTEsIGludCBzaD0tMSwKCSAgICAgaW50IGNvbnZlcnNpb25fZmxh Z3M9MCApOwoKCgoKc3RydWN0ICAgUVBhaW50RGV2aWNlWDExRGF0YSA6IHB1YmxpYyBRU2hhcmVk IHsKICAgIERpc3BsYXkqCXhfZGlzcGxheTsKICAgIGludAkJeF9zY3JlZW47CiAgICBpbnQJCXhf ZGVwdGg7CiAgICBpbnQJCXhfY2VsbHM7CiAgICBRdDo6SEFORExFCXhfY29sb3JtYXA7CiAgICBi b29sCXhfZGVmY29sb3JtYXA7CiAgICB2b2lkKgl4X3Zpc3VhbDsKICAgIGJvb2wJeF9kZWZ2aXN1 YWw7Cn07CgoKCiAKCgoKaW5saW5lIGludCBRUGFpbnREZXZpY2U6OmRldlR5cGUoKSBjb25zdAp7 IHJldHVybiBkZXZGbGFncyAmIFFJbnRlcm5hbDo6RGV2aWNlVHlwZU1hc2s7IH0KCmlubGluZSBi b29sIFFQYWludERldmljZTo6aXNFeHREZXYoKSBjb25zdAp7IHJldHVybiAoZGV2RmxhZ3MgJiBR SW50ZXJuYWw6OkV4dGVybmFsRGV2aWNlKSAhPSAwOyB9CgppbmxpbmUgYm9vbCBRUGFpbnREZXZp Y2U6OnBhaW50aW5nQWN0aXZlKCkgY29uc3QKeyByZXR1cm4gcGFpbnRlcnMgIT0gMDsgfQoKCmlu bGluZSBEaXNwbGF5ICpRUGFpbnREZXZpY2U6OngxMURpc3BsYXkoKSBjb25zdAp7IHJldHVybiB4 MTFEYXRhID8geDExRGF0YS0+eF9kaXNwbGF5IDogeF9hcHBkaXNwbGF5OyB9CgppbmxpbmUgaW50 IFFQYWludERldmljZTo6eDExU2NyZWVuKCkgY29uc3QKeyByZXR1cm4geDExRGF0YSA/IHgxMURh dGEtPnhfc2NyZWVuIDogeF9hcHBzY3JlZW47IH0KCmlubGluZSBpbnQgUVBhaW50RGV2aWNlOjp4 MTFEZXB0aCgpIGNvbnN0CnsgcmV0dXJuIHgxMURhdGEgPyB4MTFEYXRhLT54X2RlcHRoIDogeF9h cHBkZXB0aDsgfQoKaW5saW5lIGludCBRUGFpbnREZXZpY2U6OngxMUNlbGxzKCkgY29uc3QKeyBy ZXR1cm4geDExRGF0YSA/IHgxMURhdGEtPnhfY2VsbHMgOiB4X2FwcGNlbGxzOyB9CgppbmxpbmUg UXQ6OkhBTkRMRSBRUGFpbnREZXZpY2U6OngxMUNvbG9ybWFwKCkgY29uc3QKeyByZXR1cm4geDEx RGF0YSA/IHgxMURhdGEtPnhfY29sb3JtYXAgOiB4X2FwcGNvbG9ybWFwOyB9CgppbmxpbmUgYm9v bCBRUGFpbnREZXZpY2U6OngxMURlZmF1bHRDb2xvcm1hcCgpIGNvbnN0CnsgcmV0dXJuIHgxMURh dGEgPyB4MTFEYXRhLT54X2RlZmNvbG9ybWFwIDogeF9hcHBkZWZjb2xvcm1hcDsgfQoKaW5saW5l IHZvaWQgKlFQYWludERldmljZTo6eDExVmlzdWFsKCkgY29uc3QKeyByZXR1cm4geDExRGF0YSA/ IHgxMURhdGEtPnhfdmlzdWFsIDogeF9hcHB2aXN1YWw7IH0KCmlubGluZSBib29sIFFQYWludERl dmljZTo6eDExRGVmYXVsdFZpc3VhbCgpIGNvbnN0CnsgcmV0dXJuIHgxMURhdGEgPyB4MTFEYXRh LT54X2RlZnZpc3VhbCA6IHhfYXBwZGVmdmlzdWFsOyB9CgppbmxpbmUgRGlzcGxheSAqUVBhaW50 RGV2aWNlOjp4MTFBcHBEaXNwbGF5KCkKeyByZXR1cm4geF9hcHBkaXNwbGF5OyB9CgppbmxpbmUg aW50IFFQYWludERldmljZTo6eDExQXBwU2NyZWVuKCkKeyByZXR1cm4geF9hcHBzY3JlZW47IH0K CmlubGluZSBpbnQgUVBhaW50RGV2aWNlOjp4MTFBcHBEZXB0aCgpCnsgcmV0dXJuIHhfYXBwZGVw dGg7IH0KCmlubGluZSBpbnQgUVBhaW50RGV2aWNlOjp4MTFBcHBDZWxscygpCnsgcmV0dXJuIHhf YXBwY2VsbHM7IH0KCmlubGluZSBRdDo6SEFORExFIFFQYWludERldmljZTo6eDExQXBwQ29sb3Jt YXAoKQp7IHJldHVybiB4X2FwcGNvbG9ybWFwOyB9CgppbmxpbmUgYm9vbCBRUGFpbnREZXZpY2U6 OngxMUFwcERlZmF1bHRDb2xvcm1hcCgpCnsgcmV0dXJuIHhfYXBwZGVmY29sb3JtYXA7IH0KCmlu bGluZSB2b2lkICpRUGFpbnREZXZpY2U6OngxMUFwcFZpc3VhbCgpCnsgcmV0dXJuIHhfYXBwdmlz dWFsOyB9CgppbmxpbmUgYm9vbCBRUGFpbnREZXZpY2U6OngxMUFwcERlZmF1bHRWaXN1YWwoKQp7 IHJldHVybiB4X2FwcGRlZnZpc3VhbDsgfQoKCgoKIAppbmxpbmUgdm9pZCBiaXRCbHQoIFFQYWlu dERldmljZSAqZHN0LCBjb25zdCBRUG9pbnQgJmRwLAoJCSAgICBjb25zdCBRUGFpbnREZXZpY2Ug KnNyYywgY29uc3QgUVJlY3QgJnNyID1RUmVjdCgwLDAsLTEsLTEpLAoJCSAgICBRdDo6UmFzdGVy T3Agcm9wPVF0OjpDb3B5Uk9QLCBib29sIGlnbm9yZU1hc2s9RkFMU0UgKQp7CiAgICBiaXRCbHQo IGRzdCwgZHAueCgpLCBkcC55KCksIHNyYywgc3IueCgpLCBzci55KCksIHNyLndpZHRoKCksIHNy LmhlaWdodCgpLAoJICAgIHJvcCwgaWdub3JlTWFzayApOwp9CgoKCgoKIyA0NCAiL3Vzci9sb2Nh bC9xdC9pbmNsdWRlL3F3aWRnZXQuaCIgMgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXBh bGV0dGUuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoj IDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xYnJ1c2guaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzICAgUUJydXNoOiBwdWJsaWMgUXQKewpm cmllbmQgY2xhc3MgUVBhaW50ZXI7CnB1YmxpYzoKICAgIFFCcnVzaCgpOwogICAgUUJydXNoKCBC cnVzaFN0eWxlICk7CiAgICBRQnJ1c2goIGNvbnN0IFFDb2xvciAmLCBCcnVzaFN0eWxlPVNvbGlk UGF0dGVybiApOwogICAgUUJydXNoKCBjb25zdCBRQ29sb3IgJiwgY29uc3QgUVBpeG1hcCAmICk7 CiAgICBRQnJ1c2goIGNvbnN0IFFCcnVzaCAmICk7CiAgIH5RQnJ1c2goKTsKICAgIFFCcnVzaCAm b3BlcmF0b3I9KCBjb25zdCBRQnJ1c2ggJiApOwoKICAgIEJydXNoU3R5bGUJc3R5bGUoKQkgY29u c3QJCXsgcmV0dXJuIGRhdGEtPnN0eWxlOyB9CiAgICB2b2lkCXNldFN0eWxlKCBCcnVzaFN0eWxl ICk7CiAgICBjb25zdCBRQ29sb3IgJmNvbG9yKCljb25zdAkJeyByZXR1cm4gZGF0YS0+Y29sb3I7 IH0KICAgIHZvaWQJc2V0Q29sb3IoIGNvbnN0IFFDb2xvciAmICk7CiAgICBRUGl4bWFwICAgICpw aXhtYXAoKSBjb25zdAkJeyByZXR1cm4gZGF0YS0+cGl4bWFwOyB9CiAgICB2b2lkCXNldFBpeG1h cCggY29uc3QgUVBpeG1hcCAmICk7CgogICAgYm9vbAlvcGVyYXRvcj09KCBjb25zdCBRQnJ1c2gg JnAgKSBjb25zdDsKICAgIGJvb2wJb3BlcmF0b3IhPSggY29uc3QgUUJydXNoICZiICkgY29uc3QK CQkJCQl7IHJldHVybiAhKG9wZXJhdG9yPT0oYikpOyB9Cgpwcml2YXRlOgogICAgUUJydXNoCWNv cHkoKQljb25zdDsKICAgIHZvaWQJZGV0YWNoKCk7CiAgICB2b2lkCWluaXQoIGNvbnN0IFFDb2xv ciAmLCBCcnVzaFN0eWxlICk7CiAgICBzdHJ1Y3QgUUJydXNoRGF0YSA6IHB1YmxpYyBRU2hhcmVk IHsJIAoJQnJ1c2hTdHlsZSBzdHlsZTsKCVFDb2xvcgkgIGNvbG9yOwoJUVBpeG1hcAkgKnBpeG1h cDsKICAgIH0gKmRhdGE7Cn07CgoKIAoKCgoKICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUURh dGFTdHJlYW0gJiwgY29uc3QgUUJydXNoICYgKTsKICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I+Pigg UURhdGFTdHJlYW0gJiwgUUJydXNoICYgKTsKCgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3FwYWxldHRlLmgiIDIKCgoKCgpjbGFzcyBRQ29sb3JHcm91cFByaXZhdGU7CgpjbGFzcyAgIFFD b2xvckdyb3VwCnsKcHVibGljOgogICAgUUNvbG9yR3JvdXAoKTsKICAgIFFDb2xvckdyb3VwKCBj b25zdCBRQ29sb3IgJmZvcmVncm91bmQsIGNvbnN0IFFDb2xvciAmYnV0dG9uLAoJCSBjb25zdCBR Q29sb3IgJmxpZ2h0LCBjb25zdCBRQ29sb3IgJmRhcmssIGNvbnN0IFFDb2xvciAmbWlkLAoJCSBj b25zdCBRQ29sb3IgJnRleHQsIGNvbnN0IFFDb2xvciAmYmFzZSApOwogICAgUUNvbG9yR3JvdXAo IGNvbnN0IFFCcnVzaCAmZm9yZWdyb3VuZCwgY29uc3QgUUJydXNoICZidXR0b24sCgkJIGNvbnN0 IFFCcnVzaCAmbGlnaHQsIGNvbnN0IFFCcnVzaCAmZGFyaywgY29uc3QgUUJydXNoICZtaWQsCgkJ IGNvbnN0IFFCcnVzaCAmdGV4dCwgY29uc3QgUUJydXNoICZicmlnaHRfdGV4dCwKCQkgY29uc3Qg UUJydXNoICZiYXNlLCBjb25zdCBRQnJ1c2ggJmJhY2tncm91bmQpOwogICAgUUNvbG9yR3JvdXAo IGNvbnN0IFFDb2xvckdyb3VwICYgKTsKCiAgIH5RQ29sb3JHcm91cCgpOwoKICAgIFFDb2xvckdy b3VwJiBvcGVyYXRvciA9KGNvbnN0IFFDb2xvckdyb3VwJik7CgogICAgIAogICAgZW51bSBDb2xv clJvbGUgeyBGb3JlZ3JvdW5kLCBCdXR0b24sIExpZ2h0LCBNaWRsaWdodCwgRGFyaywgTWlkLAoJ CSAgICAgVGV4dCwgQnJpZ2h0VGV4dCwgQnV0dG9uVGV4dCwgQmFzZSwgQmFja2dyb3VuZCwgU2hh ZG93LAoJCSAgICAgSGlnaGxpZ2h0LCBIaWdobGlnaHRlZFRleHQsIExpbmssIExpbmtWaXNpdGVk LAoJCSAgICAgTkNvbG9yUm9sZXMgfTsKCiAgICBjb25zdCBRQ29sb3IgJmNvbG9yKCBDb2xvclJv bGUgKSBjb25zdDsKICAgIGNvbnN0IFFCcnVzaCAmYnJ1c2goIENvbG9yUm9sZSApIGNvbnN0Owog ICAgdm9pZCBzZXRDb2xvciggQ29sb3JSb2xlLCBjb25zdCBRQ29sb3IgJiApOwogICAgdm9pZCBz ZXRCcnVzaCggQ29sb3JSb2xlLCBjb25zdCBRQnJ1c2ggJiApOwoKICAgIGNvbnN0IFFDb2xvciAm Zm9yZWdyb3VuZCgpCWNvbnN0CXsgcmV0dXJuIGJyW0ZvcmVncm91bmRdLmNvbG9yKCk7IH0KICAg IGNvbnN0IFFDb2xvciAmYnV0dG9uKCkJY29uc3QJeyByZXR1cm4gYnJbQnV0dG9uXS5jb2xvcigp OyB9CiAgICBjb25zdCBRQ29sb3IgJmxpZ2h0KCkJY29uc3QJeyByZXR1cm4gYnJbTGlnaHRdLmNv bG9yKCk7IH0KICAgIGNvbnN0IFFDb2xvciAmZGFyaygpCWNvbnN0CXsgcmV0dXJuIGJyW0Rhcmtd LmNvbG9yKCk7IH0KICAgIGNvbnN0IFFDb2xvciAmbWlkKCkJCWNvbnN0CXsgcmV0dXJuIGJyW01p ZF0uY29sb3IoKTsgfQogICAgY29uc3QgUUNvbG9yICZ0ZXh0KCkJY29uc3QJeyByZXR1cm4gYnJb VGV4dF0uY29sb3IoKTsgfQogICAgY29uc3QgUUNvbG9yICZiYXNlKCkJY29uc3QJeyByZXR1cm4g YnJbQmFzZV0uY29sb3IoKTsgfQogICAgY29uc3QgUUNvbG9yICZiYWNrZ3JvdW5kKCkJY29uc3QJ eyByZXR1cm4gYnJbQmFja2dyb3VuZF0uY29sb3IoKTsgfQoKICAgIGNvbnN0IFFDb2xvciAmbWlk bGlnaHQoKQljb25zdAl7IHJldHVybiBicltNaWRsaWdodF0uY29sb3IoKTsgfQogICAgY29uc3Qg UUNvbG9yICZicmlnaHRUZXh0KCkJY29uc3QJeyByZXR1cm4gYnJbQnJpZ2h0VGV4dF0uY29sb3Io KTsgfQogICAgY29uc3QgUUNvbG9yICZidXR0b25UZXh0KCkJY29uc3QJeyByZXR1cm4gYnJbQnV0 dG9uVGV4dF0uY29sb3IoKTsgfQogICAgY29uc3QgUUNvbG9yICZzaGFkb3coKQljb25zdAl7IHJl dHVybiBicltTaGFkb3ddLmNvbG9yKCk7IH0KICAgIGNvbnN0IFFDb2xvciAmaGlnaGxpZ2h0KCkJ Y29uc3QJeyByZXR1cm4gYnJbSGlnaGxpZ2h0XS5jb2xvcigpOyB9CiAgICBjb25zdCBRQ29sb3Ig JmhpZ2hsaWdodGVkVGV4dCgpIGNvbnN0e3JldHVybiBicltIaWdobGlnaHRlZFRleHRdLmNvbG9y KCk7IH0KICAgIGNvbnN0IFFDb2xvciAmbGluaygpICAgICAgICBjb25zdCAgIHsgcmV0dXJuIGJy W0xpbmtdLmNvbG9yKCk7IH0KICAgIGNvbnN0IFFDb2xvciAmbGlua1Zpc2l0ZWQoKSBjb25zdCAg IHsgcmV0dXJuIGJyW0xpbmtWaXNpdGVkXS5jb2xvcigpOyB9CgogICAgYm9vbAlvcGVyYXRvcj09 KCBjb25zdCBRQ29sb3JHcm91cCAmZyApIGNvbnN0OwogICAgYm9vbAlvcGVyYXRvciE9KCBjb25z dCBRQ29sb3JHcm91cCAmZyApIGNvbnN0Cgl7IHJldHVybiAhKG9wZXJhdG9yPT0oZykpOyB9Cgpw cml2YXRlOgogICAgUUJydXNoICpicjsKICAgIFFDb2xvckdyb3VwUHJpdmF0ZSAqIGQ7CgogICAg ZnJpZW5kIGNsYXNzIFFQYWxldHRlOwp9OwoKCmNsYXNzICAgUVBhbGV0dGUKewpwdWJsaWM6CiAg ICBRUGFsZXR0ZSgpOwogICAgUVBhbGV0dGUoIGNvbnN0IFFDb2xvciAmYnV0dG9uICk7CiAgICBR UGFsZXR0ZSggY29uc3QgUUNvbG9yICZidXR0b24sIGNvbnN0IFFDb2xvciAmYmFja2dyb3VuZCAp OwogICAgUVBhbGV0dGUoIGNvbnN0IFFDb2xvckdyb3VwICZhY3RpdmUsIGNvbnN0IFFDb2xvckdy b3VwICZkaXNhYmxlZCwKCSAgICAgIGNvbnN0IFFDb2xvckdyb3VwICZpbmFjdGl2ZSApOwogICAg UVBhbGV0dGUoIGNvbnN0IFFQYWxldHRlICYgKTsKICAgIH5RUGFsZXR0ZSgpOwogICAgUVBhbGV0 dGUgJm9wZXJhdG9yPSggY29uc3QgUVBhbGV0dGUgJiApOwoKICAgIGVudW0gQ29sb3JHcm91cCB7 IERpc2FibGVkLCBBY3RpdmUsIEluYWN0aXZlLCBOQ29sb3JHcm91cHMsIE5vcm1hbD1BY3RpdmUg fTsKCiAgICBjb25zdCBRQ29sb3IgJmNvbG9yKCBDb2xvckdyb3VwLCBRQ29sb3JHcm91cDo6Q29s b3JSb2xlICkgY29uc3Q7CiAgICBjb25zdCBRQnJ1c2ggJmJydXNoKCBDb2xvckdyb3VwLCBRQ29s b3JHcm91cDo6Q29sb3JSb2xlICkgY29uc3Q7CiAgICB2b2lkIHNldENvbG9yKCBDb2xvckdyb3Vw LCBRQ29sb3JHcm91cDo6Q29sb3JSb2xlLCBjb25zdCBRQ29sb3IgJiApOwogICAgdm9pZCBzZXRC cnVzaCggQ29sb3JHcm91cCwgUUNvbG9yR3JvdXA6OkNvbG9yUm9sZSwgY29uc3QgUUJydXNoICYg KTsKCiAgICB2b2lkIHNldENvbG9yKCBRQ29sb3JHcm91cDo6Q29sb3JSb2xlLCBjb25zdCBRQ29s b3IgJiApOwogICAgdm9pZCBzZXRCcnVzaCggUUNvbG9yR3JvdXA6OkNvbG9yUm9sZSwgY29uc3Qg UUJydXNoICYgKTsKCiAgICBRUGFsZXR0ZQljb3B5KCkgY29uc3Q7CgogICAgY29uc3QgUUNvbG9y R3JvdXAgJmFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGRhdGEtPmFjdGl2ZTsgfQogICAgY29uc3Qg UUNvbG9yR3JvdXAgJmRpc2FibGVkKCkgY29uc3QgeyByZXR1cm4gZGF0YS0+ZGlzYWJsZWQ7IH0K ICAgIGNvbnN0IFFDb2xvckdyb3VwICZpbmFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGRhdGEtPmlu YWN0aXZlOyB9CgogICAgY29uc3QgUUNvbG9yR3JvdXAgJm5vcm1hbCgpIGNvbnN0IHsgcmV0dXJu IGFjdGl2ZSgpOyB9CgoKICAgIHZvaWQJc2V0QWN0aXZlKCBjb25zdCBRQ29sb3JHcm91cCAmICk7 CiAgICB2b2lkCXNldERpc2FibGVkKCBjb25zdCBRQ29sb3JHcm91cCAmICk7CiAgICB2b2lkCXNl dEluYWN0aXZlKCBjb25zdCBRQ29sb3JHcm91cCAmICk7CgogICAgdm9pZAlzZXROb3JtYWwoIGNv bnN0IFFDb2xvckdyb3VwICYgY2cgKSB7IHNldEFjdGl2ZShjZyk7IH0KCgogICAgYm9vbAlvcGVy YXRvcj09KCBjb25zdCBRUGFsZXR0ZSAmcCApIGNvbnN0OwogICAgYm9vbAlvcGVyYXRvciE9KCBj b25zdCBRUGFsZXR0ZSAmcCApIGNvbnN0CiAgICAgICAgICAgICAgeyByZXR1cm4gIShvcGVyYXRv cj09KHApKTsgfQogICAgYm9vbAlpc0NvcHlPZiggY29uc3QgUVBhbGV0dGUgJiApOwoKICAgIGlu dAkJc2VyaWFsTnVtYmVyKCkgY29uc3QJeyByZXR1cm4gZGF0YS0+c2VyX25vOyB9CiAgICAKICAg IAogICAgc3RhdGljIFFDb2xvckdyb3VwOjpDb2xvclJvbGUgZm9yZWdyb3VuZFJvbGVGcm9tTW9k ZSggUXQ6OkJhY2tncm91bmRNb2RlIG1vZGUgKTsKICAgIHN0YXRpYyBRQ29sb3JHcm91cDo6Q29s b3JSb2xlIGJhY2tncm91bmRSb2xlRnJvbU1vZGUoIFF0OjpCYWNrZ3JvdW5kTW9kZSBtb2RlKTsK CnByaXZhdGU6CiAgICB2b2lkCWRldGFjaCgpOwogICAgY29uc3QgUUJydXNoICZkaXJlY3RCcnVz aCggQ29sb3JHcm91cCwgUUNvbG9yR3JvdXA6OkNvbG9yUm9sZSApIGNvbnN0OwogICAgdm9pZCBk aXJlY3RTZXRCcnVzaCggQ29sb3JHcm91cCwgUUNvbG9yR3JvdXA6OkNvbG9yUm9sZSwgY29uc3Qg UUJydXNoJiApOwoKICAgIHN0cnVjdCBRUGFsRGF0YSA6IHB1YmxpYyBRU2hhcmVkIHsKCVFDb2xv ckdyb3VwIGRpc2FibGVkOwoJUUNvbG9yR3JvdXAgYWN0aXZlOwoJaW50CSAgICBzZXJfbm87CglR Q29sb3JHcm91cCBpbmFjdGl2ZTsKICAgIH0gKmRhdGE7Cn07CgoKIAoKCgoKICBRRGF0YVN0cmVh bSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUUNvbG9yR3JvdXAgJiApOwogIFFE YXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRQ29sb3JHcm91cCAmICk7Cgog IFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmLCBjb25zdCBRUGFsZXR0ZSAm ICk7CiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFQYWxldHRlICYg KTsKCgoKCiMgNDUgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2lkZ2V0LmgiIDIKCiMgMSAiL3Vz ci9sb2NhbC9xdC9pbmNsdWRlL3Fmb250LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBRRm9udFByaXZhdGU7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKY2xhc3MgUVN0cmluZ0xpc3Q7CgpjbGFzcyAgIFFGb250CnsK cHVibGljOgogICAgZW51bSBTdHlsZUhpbnQgewoJSGVsdmV0aWNhLCAgU2Fuc1NlcmlmID0gSGVs dmV0aWNhLAoJVGltZXMsICAgICAgU2VyaWYgPSBUaW1lcywKCUNvdXJpZXIsICAgIFR5cGVXcml0 ZXIgPSBDb3VyaWVyLAoJT2xkRW5nbGlzaCwgRGVjb3JhdGl2ZSA9IE9sZEVuZ2xpc2gsCglTeXN0 ZW0sCglBbnlTdHlsZQogICAgfTsKCiAgICBlbnVtIFN0eWxlU3RyYXRlZ3kgewoJUHJlZmVyRGVm YXVsdCA9IDB4MDAwMSwKCVByZWZlckJpdG1hcCAgPSAweDAwMDIsCglQcmVmZXJEZXZpY2UgID0g MHgwMDA0LAoJUHJlZmVyT3V0bGluZSA9IDB4MDAwOCwKCUZvcmNlT3V0bGluZSAgPSAweDAwMTAs CglQcmVmZXJNYXRjaCAgID0gMHgwMDIwLAoJUHJlZmVyUXVhbGl0eSA9IDB4MDA0MCwKCVByZWZl ckFudGlhbGlhcyA9IDB4MDA4MCwKCU5vQW50aWFsaWFzID0gMHgwMTAwCiAgICB9OwoKICAgIGVu dW0gV2VpZ2h0IHsKCUxpZ2h0ICAgID0gMjUsCglOb3JtYWwgICA9IDUwLAoJRGVtaUJvbGQgPSA2 MywKCUJvbGQgICAgID0gNzUsCglCbGFjawkgPSA4NwogICAgfTsKCiAgICAgCiAgICBRRm9udCgp OwogICAgIAogICAgUUZvbnQoIGNvbnN0IFFTdHJpbmcgJmZhbWlseSwgaW50IHBvaW50U2l6ZSA9 IDEyLCBpbnQgd2VpZ2h0ID0gTm9ybWFsLAoJICAgYm9vbCBpdGFsaWMgPSBGQUxTRSApOwogICAg IAogICAgUUZvbnQoIGNvbnN0IFFGb250ICYgKTsKCiAgICB+UUZvbnQoKTsKCiAgICBRU3RyaW5n IGZhbWlseSgpIGNvbnN0OwogICAgdm9pZCBzZXRGYW1pbHkoIGNvbnN0IFFTdHJpbmcgJik7Cgog ICAgaW50IHBvaW50U2l6ZSgpIGNvbnN0OwogICAgZmxvYXQgcG9pbnRTaXplRmxvYXQoKSBjb25z dDsKICAgIHZvaWQgc2V0UG9pbnRTaXplKCBpbnQgKTsKICAgIHZvaWQgc2V0UG9pbnRTaXplRmxv YXQoIGZsb2F0ICk7CgogICAgaW50IHBpeGVsU2l6ZSgpIGNvbnN0OwogICAgdm9pZCBzZXRQaXhl bFNpemUoIGludCApOwogICAgdm9pZCBzZXRQaXhlbFNpemVGbG9hdCggZmxvYXQgKTsKCiAgICBp bnQgd2VpZ2h0KCkgY29uc3Q7CiAgICB2b2lkIHNldFdlaWdodCggaW50ICk7CgogICAgYm9vbCBi b2xkKCkgY29uc3Q7CiAgICB2b2lkIHNldEJvbGQoIGJvb2wgKTsKCiAgICBib29sIGl0YWxpYygp IGNvbnN0OwogICAgdm9pZCBzZXRJdGFsaWMoIGJvb2wgKTsKCiAgICBib29sIHVuZGVybGluZSgp IGNvbnN0OwogICAgdm9pZCBzZXRVbmRlcmxpbmUoIGJvb2wgKTsKCiAgICBib29sIHN0cmlrZU91 dCgpIGNvbnN0OwogICAgdm9pZCBzZXRTdHJpa2VPdXQoIGJvb2wgKTsKCiAgICBib29sIGZpeGVk UGl0Y2goKSBjb25zdDsKICAgIHZvaWQgc2V0Rml4ZWRQaXRjaCggYm9vbCApOwoKICAgIFN0eWxl SGludCBzdHlsZUhpbnQoKSBjb25zdDsKICAgIFN0eWxlU3RyYXRlZ3kgc3R5bGVTdHJhdGVneSgp IGNvbnN0OwogICAgdm9pZCBzZXRTdHlsZUhpbnQoIFN0eWxlSGludCwgU3R5bGVTdHJhdGVneSA9 IFByZWZlckRlZmF1bHQgKTsKICAgIHZvaWQgc2V0U3R5bGVTdHJhdGVneSggU3R5bGVTdHJhdGVn eSBzICk7CgogICAgIAogICAgYm9vbCByYXdNb2RlKCkgY29uc3Q7CiAgICB2b2lkIHNldFJhd01v ZGUoIGJvb2wgKTsKCiAgICAgCiAgICBib29sIGV4YWN0TWF0Y2goKSBjb25zdDsKCiAgICBRRm9u dCAmb3BlcmF0b3I9KCBjb25zdCBRRm9udCAmICk7CiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0 IFFGb250ICYgKSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3IhPSggY29uc3QgUUZvbnQgJiApIGNv bnN0OwogICAgYm9vbCBpc0NvcHlPZiggY29uc3QgUUZvbnQgJiApIGNvbnN0OwoKCgoKCiAgICBR dDo6SEFORExFIGhhbmRsZSgpIGNvbnN0OwoKCgogICAgIAogICAgdm9pZCBzZXRSYXdOYW1lKCBj b25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgcmF3TmFtZSgpIGNvbnN0OwoKICAgIFFTdHJp bmcga2V5KCkgY29uc3Q7CgoKICAgIFFTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKICAgIGJvb2wg ZnJvbVN0cmluZyhjb25zdCBRU3RyaW5nICYpOwoKICAgIHN0YXRpYyBRU3RyaW5nIHN1YnN0aXR1 dGUoY29uc3QgUVN0cmluZyAmKTsKICAgIHN0YXRpYyBRU3RyaW5nTGlzdCBzdWJzdGl0dXRlcyhj b25zdCBRU3RyaW5nICYpOwogICAgc3RhdGljIFFTdHJpbmdMaXN0IHN1YnN0aXR1dGlvbnMoKTsK ICAgIHN0YXRpYyB2b2lkIGluc2VydFN1YnN0aXR1dGlvbihjb25zdCBRU3RyaW5nJiwgY29uc3Qg UVN0cmluZyAmKTsKICAgIHN0YXRpYyB2b2lkIGluc2VydFN1YnN0aXR1dGlvbnMoY29uc3QgUVN0 cmluZyYsIGNvbnN0IFFTdHJpbmdMaXN0ICYpOwogICAgc3RhdGljIHZvaWQgcmVtb3ZlU3Vic3Rp dHV0aW9uKGNvbnN0IFFTdHJpbmcgJik7CgogICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpOwog ICAgc3RhdGljIHZvaWQgY2xlYW51cCgpOwogICAgc3RhdGljIHZvaWQgY2FjaGVTdGF0aXN0aWNz KCk7CgoKCgoKCgogICAgZW51bSBTY3JpcHQgewoJIAoJTGF0aW4sCglHcmVlaywKCUN5cmlsbGlj LAoJQXJtZW5pYW4sCglHZW9yZ2lhbiwKCVJ1bmljLAoJT2doYW0sCglTcGFjaW5nTW9kaWZpZXJz LAoJQ29tYmluaW5nTWFya3MsCgoJIAoJSGVicmV3LAoJQXJhYmljLAoJU3lyaWFjLAoJVGhhYW5h LAoKCSAKCURldmFuYWdhcmksCglCZW5nYWxpLAoJR3VybXVraGksCglHdWphcmF0aSwKCU9yaXlh LAoJVGFtaWwsCglUZWx1Z3UsCglLYW5uYWRhLAoJTWFsYXlhbGFtLAoJU2luaGFsYSwKCVRoYWks CglMYW8sCglUaWJldGFuLAoJTXlhbm1hciwKCUtobWVyLAoKCSAKCUhhbiwKCUhpcmFnYW5hLAoJ S2F0YWthbmEsCglIYW5ndWwsCglCb3BvbW9mbywKCVlpLAoKCSAKCUV0aGlvcGljLAoJQ2hlcm9r ZWUsCglDYW5hZGlhbkFib3JpZ2luYWwsCglNb25nb2xpYW4sCgoJIAoJQ3VycmVuY3lTeW1ib2xz LAoJTGV0dGVybGlrZVN5bWJvbHMsCglOdW1iZXJGb3JtcywKCU1hdGhlbWF0aWNhbE9wZXJhdG9y cywKCVRlY2huaWNhbFN5bWJvbHMsCglHZW9tZXRyaWNTeW1ib2xzLAoJTWlzY2VsbGFuZW91c1N5 bWJvbHMsCglFbmNsb3NlZEFuZFNxdWFyZSwKCUJyYWlsbGUsCgoJVW5pY29kZSwKCgkgCglOU2Ny aXB0cywKCVVua25vd25TY3JpcHQgPSBOU2NyaXB0cywKCglOb1NjcmlwdCwKCgkgCgkgCgkgCgog ICAgICAgCSAKCUhhblgxMSwKCglMYXRpbkJhc2ljID0gTGF0aW4sICAgICAgICAgICAgICAKCUxh dGluRXh0ZW5kZWRBXzIgPSBIYW5YMTEgKyAxLCAgIAoJTGF0aW5FeHRlbmRlZEFfMywgICAgICAg ICAgICAgICAgCglMYXRpbkV4dGVuZGVkQV80LCAgICAgICAgICAgICAgICAKCUxhdGluRXh0ZW5k ZWRBXzE0LCAgICAgICAgICAgICAgIAoJTGF0aW5FeHRlbmRlZEFfMTUsICAgICAgICAgICAgICAg CglLYXRha2FuYUhhbGZXaWR0aCwJCSAKCglMYXN0UHJpdmF0ZVNjcmlwdAogICAgfTsKCiAgICBR U3RyaW5nIGRlZmF1bHRGYW1pbHkoKSBjb25zdDsKICAgIFFTdHJpbmcgbGFzdFJlc29ydEZhbWls eSgpIGNvbnN0OwogICAgUVN0cmluZyBsYXN0UmVzb3J0Rm9udCgpIGNvbnN0OwoKCgogICAgc3Rh dGljIFFGb250IGRlZmF1bHRGb250KCk7CiAgICBzdGF0aWMgdm9pZCBzZXREZWZhdWx0Rm9udCgg Y29uc3QgUUZvbnQgJiApOwoKCgoKcHJvdGVjdGVkOgogICAgIAogICAgYm9vbCBkaXJ0eSgpIGNv bnN0OwogICAgaW50IGRlY2lQb2ludFNpemUoKSBjb25zdDsKCgpwcml2YXRlOgogICAgUUZvbnQo IFFGb250UHJpdmF0ZSAqLCBib29sIGRlZXAgPSBUUlVFICk7CiAgICBRRm9udCggUUZvbnRQcml2 YXRlICosIFFQYWludERldmljZSAqcGQgKTsKCiAgICB2b2lkIGRldGFjaCgpOwoKCgoKCgoKCgoK CiAgICBmcmllbmQgY2xhc3MgUUZvbnRNZXRyaWNzOwogICAgZnJpZW5kIGNsYXNzIFFGb250SW5m bzsKICAgIGZyaWVuZCBjbGFzcyBRUGFpbnRlcjsKICAgIGZyaWVuZCBjbGFzcyBRUFNQcmludGVy Rm9udDsKCgogICAgZnJpZW5kICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFt ICYsIGNvbnN0IFFGb250ICYgKTsKICAgIGZyaWVuZCAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBRRGF0YVN0cmVhbSAmLCBRRm9udCAmICk7CgoKICAgIFFGb250UHJpdmF0ZSAqZDsKfTsKCgpp bmxpbmUgYm9vbCBRRm9udDo6Ym9sZCgpIGNvbnN0CnsgcmV0dXJuIHdlaWdodCgpID4gTm9ybWFs OyB9CgoKaW5saW5lIHZvaWQgUUZvbnQ6OnNldEJvbGQoIGJvb2wgZW5hYmxlICkKeyBzZXRXZWln aHQoIGVuYWJsZSA/IEJvbGQgOiBOb3JtYWwgKTsgfQoKCgoKIAoKCgoKICBRRGF0YVN0cmVhbSAm b3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUUZvbnQgJiApOwogIFFEYXRhU3RyZWFt ICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRRm9udCAmICk7CgoKCgojIDQ2ICIvdXNyL2xv Y2FsL3F0L2luY2x1ZGUvcXdpZGdldC5oIiAyCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9x Zm9udG1ldHJpY3MuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKY2xhc3MgUUZvbnRTdHJ1Y3Q7CmNsYXNzIFFUZXh0Q29kZWM7CmNsYXNzIFFUZXh0UGFy YWc7CgpjbGFzcyAgIFFGb250TWV0cmljcwp7CnB1YmxpYzoKICAgIFFGb250TWV0cmljcyggY29u c3QgUUZvbnQgJiApOwogICAgUUZvbnRNZXRyaWNzKCBjb25zdCBRRm9udE1ldHJpY3MgJiApOwog ICAgflFGb250TWV0cmljcygpOwoKICAgIFFGb250TWV0cmljcyAmb3BlcmF0b3I9KCBjb25zdCBR Rm9udE1ldHJpY3MgJiApOwoKICAgIGludAkJYXNjZW50KCkJY29uc3Q7CiAgICBpbnQJCWRlc2Nl bnQoKQljb25zdDsKICAgIGludAkJaGVpZ2h0KCkJY29uc3Q7CiAgICBpbnQJCWxlYWRpbmcoKQlj b25zdDsKICAgIGludAkJbGluZVNwYWNpbmcoKQljb25zdDsKICAgIGludAkJbWluTGVmdEJlYXJp bmcoKSBjb25zdDsKICAgIGludAkJbWluUmlnaHRCZWFyaW5nKCkgY29uc3Q7CiAgICBpbnQJCW1h eFdpZHRoKCkJY29uc3Q7CgogICAgYm9vbAlpbkZvbnQoUUNoYXIpCWNvbnN0OwoKICAgIGludAkJ bGVmdEJlYXJpbmcoUUNoYXIpIGNvbnN0OwogICAgaW50CQlyaWdodEJlYXJpbmcoUUNoYXIpIGNv bnN0OwogICAgaW50CQl3aWR0aCggY29uc3QgUVN0cmluZyAmLCBpbnQgbGVuID0gLTEgKSBjb25z dDsKICAgIAogICAgaW50CQl3aWR0aCggUUNoYXIgKSBjb25zdDsKCiAgICBpbnQJCXdpZHRoKCBj aGFyIGMgKSBjb25zdCB7IHJldHVybiB3aWR0aCggKFFDaGFyKSBjICk7IH0KCiAgICAKICAgIGlu dCAJCWNoYXJXaWR0aCggY29uc3QgUVN0cmluZyAmc3RyLCBpbnQgcG9zICkgY29uc3Q7CiAgICBR UmVjdAlib3VuZGluZ1JlY3QoIGNvbnN0IFFTdHJpbmcgJiwgaW50IGxlbiA9IC0xICkgY29uc3Q7 CiAgICBRUmVjdAlib3VuZGluZ1JlY3QoIFFDaGFyICkgY29uc3Q7CiAgICBRUmVjdAlib3VuZGlu Z1JlY3QoIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgZmxhZ3MsCgkJCSAgICAgIGNv bnN0IFFTdHJpbmcmIHN0ciwgaW50IGxlbj0tMSwgaW50IHRhYnN0b3BzPTAsCgkJCSAgICAgIGlu dCAqdGFiYXJyYXk9MCwgUVRleHRQYXJhZyAqKmludGVybj0wICkgY29uc3Q7CiAgICBRU2l6ZQlz aXplKCBpbnQgZmxhZ3MsCgkJICAgICAgY29uc3QgUVN0cmluZyYgc3RyLCBpbnQgbGVuPS0xLCBp bnQgdGFic3RvcHM9MCwKCQkgICAgICBpbnQgKnRhYmFycmF5PTAsIFFUZXh0UGFyYWcgKippbnRl cm49MCApIGNvbnN0OwoKICAgIGludAkJdW5kZXJsaW5lUG9zKCkJY29uc3Q7CiAgICBpbnQJCXN0 cmlrZU91dFBvcygpCWNvbnN0OwogICAgaW50CQlsaW5lV2lkdGgoKQljb25zdDsKCnByaXZhdGU6 CiAgICBRRm9udE1ldHJpY3MoIGNvbnN0IFFQYWludGVyICogKTsKICAgIHN0YXRpYyB2b2lkIHJl c2V0KCBjb25zdCBRUGFpbnRlciAqICk7CgoKCgoKCgoKICAgIGZyaWVuZCBjbGFzcyBRV2lkZ2V0 OwogICAgZnJpZW5kIGNsYXNzIFFQYWludGVyOwogICAgZnJpZW5kIGNsYXNzIFFUZXh0Rm9ybWF0 OwoKCgoKICAgIFFGb250UHJpdmF0ZSAgKmQ7CiAgICBRUGFpbnRlciAgICAgICpwYWludGVyOwog ICAgaW50CQkgICBmbGFnczsKCiAgICBib29sICAgIHVuZGVybGluZUZsYWcoKSAgY29uc3QgeyBy ZXR1cm4gKGZsYWdzICYgMHgxKSAhPSAwOyB9CiAgICBib29sICAgIHN0cmlrZU91dEZsYWcoKSAg Y29uc3QgeyByZXR1cm4gKGZsYWdzICYgMHgyKSAhPSAwOyB9CiAgICB2b2lkICAgIHNldFVuZGVy bGluZUZsYWcoKQkgICB7IGZsYWdzIHw9IDB4MTsgfQogICAgdm9pZCAgICBzZXRTdHJpa2VPdXRG bGFnKCkJICAgeyBmbGFncyB8PSAweDI7IH0KfTsKCgoKIyA0NyAiL3Vzci9sb2NhbC9xdC9pbmNs dWRlL3F3aWRnZXQuaCIgMgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWZvbnRpbmZvLmgi IDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzICAg UUZvbnRJbmZvCnsKcHVibGljOgogICAgUUZvbnRJbmZvKCBjb25zdCBRRm9udCAmICk7CiAgICBR Rm9udEluZm8oIGNvbnN0IFFGb250SW5mbyAmICk7CiAgICB+UUZvbnRJbmZvKCk7CgogICAgUUZv bnRJbmZvCSAgICAgICAmb3BlcmF0b3I9KCBjb25zdCBRRm9udEluZm8gJiApOwoKICAgIFFTdHJp bmcgICAJICAgICAgICBmYW1pbHkoKQljb25zdDsKICAgIGludAkJCXBpeGVsU2l6ZSgpCWNvbnN0 OwogICAgaW50CQkJcG9pbnRTaXplKCkJY29uc3Q7CiAgICBib29sCQlpdGFsaWMoKQljb25zdDsK ICAgIGludAkJCXdlaWdodCgpCWNvbnN0OwogICAgYm9vbAkJYm9sZCgpCQljb25zdDsKICAgIGJv b2wJCXVuZGVybGluZSgpCWNvbnN0OwogICAgYm9vbAkJc3RyaWtlT3V0KCkJY29uc3Q7CiAgICBi b29sCQlmaXhlZFBpdGNoKCkJY29uc3Q7CiAgICBRRm9udDo6U3R5bGVIaW50CXN0eWxlSGludCgp CWNvbnN0OwogICAgYm9vbAkJcmF3TW9kZSgpCWNvbnN0OwoKICAgIGJvb2wJCWV4YWN0TWF0Y2go KQljb25zdDsKCgpwcml2YXRlOgogICAgUUZvbnRJbmZvKCBjb25zdCBRUGFpbnRlciAqICk7CiAg ICBzdGF0aWMgdm9pZCByZXNldCggY29uc3QgUVBhaW50ZXIgKiApOwoKICAgIFFGb250UHJpdmF0 ZSAqZDsKICAgIFFQYWludGVyICpwYWludGVyOwogICAgaW50IGZsYWdzOwoKICAgIGJvb2wgICAg dW5kZXJsaW5lRmxhZygpICBjb25zdCB7IHJldHVybiAoZmxhZ3MgJiAweDEpICE9IDA7IH0KICAg IGJvb2wgICAgc3RyaWtlT3V0RmxhZygpICBjb25zdCB7IHJldHVybiAoZmxhZ3MgJiAweDIpICE9 IDA7IH0KICAgIGJvb2wgICAgZXhhY3RNYXRjaEZsYWcoKSBjb25zdCB7IHJldHVybiAoZmxhZ3Mg JiAweDQpICE9IDA7IH0KICAgIHZvaWQgICAgc2V0VW5kZXJsaW5lRmxhZygpCSAgIHsgZmxhZ3Mg fD0gMHgxOyB9CiAgICB2b2lkICAgIHNldFN0cmlrZU91dEZsYWcoKQkgICB7IGZsYWdzIHw9IDB4 MjsgfQogICAgdm9pZCAgICBzZXRFeGFjdE1hdGNoRmxhZygpCSAgIHsgZmxhZ3MgfD0gMHg0OyB9 CgogICAgZnJpZW5kIGNsYXNzIFFXaWRnZXQ7CiAgICBmcmllbmQgY2xhc3MgUVBhaW50ZXI7Cn07 CgoKaW5saW5lIGJvb2wgUUZvbnRJbmZvOjpib2xkKCkgY29uc3QKeyByZXR1cm4gd2VpZ2h0KCkg PiBRRm9udDo6Tm9ybWFsOyB9CgoKCiMgNDggIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2lkZ2V0 LmgiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzaXplcG9saWN5LmgiIDEKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgICBRU2l6ZVBvbGlj eQp7CnByaXZhdGU6CiAgICBlbnVtIHsgSFNpemUgPSA2LCBITWFzayA9IDB4M2YsIFZNYXNrID0g SE1hc2sgPDwgSFNpemUsCgkgICBNYXlHcm93ID0gMSwgRXhwTWFzayA9IDIsIE1heVNocmluayA9 IDQgfTsKcHVibGljOgogICAgZW51bSBTaXplVHlwZSB7IEZpeGVkID0gMCwKCQkgICAgTWluaW11 bSA9IE1heUdyb3csCgkJICAgIE1heGltdW0gPSBNYXlTaHJpbmssCgkJICAgIFByZWZlcnJlZCA9 IE1heUdyb3d8TWF5U2hyaW5rICwKCQkgICAgTWluaW11bUV4cGFuZGluZyA9IE1heUdyb3d8RXhw TWFzaywKCQkgICAgRXhwYW5kaW5nID0gTWF5R3Jvd3xNYXlTaHJpbmt8RXhwTWFzaywKCQkgICAg SWdub3JlZCA9IEV4cE1hc2sgIAogICAgfTsKCiAgICBlbnVtIEV4cGFuZERhdGEgeyBOb0RpcmVj dGlvbiA9IDAsCgkJICAgICAgSG9yaXpvbnRhbGx5ID0gMSwKCQkgICAgICBWZXJ0aWNhbGx5ID0g MiwKCQkgICAgICBCb3RoRGlyZWN0aW9ucyA9IEhvcml6b250YWxseSB8IFZlcnRpY2FsbHkKCgkJ ICAgICAgLEhvcml6b250YWwgPSBIb3Jpem9udGFsbHksCgkJICAgICAgVmVydGljYWwgPSBWZXJ0 aWNhbGx5CgogICAgfTsKCiAgICBRU2l6ZVBvbGljeSgpIDogZGF0YSggMCApIHt9CgogICAgUVNp emVQb2xpY3koIFNpemVUeXBlIGhvciwgU2l6ZVR5cGUgdmVyLCBib29sIGhmdyA9IEZBTFNFICkK CTogZGF0YSggaG9yIHwgKHZlcjw8SFNpemUpIHwgKGhmdyA/IChRX1VJTlQzMikoMTw8MipIU2l6 ZSkgOiAwKSApIHt9CiAgICBRU2l6ZVBvbGljeSggU2l6ZVR5cGUgaG9yLCBTaXplVHlwZSB2ZXIs IHVjaGFyIGhvcnMsIHVjaGFyIHZlcnMsIGJvb2wgaGZ3ID0gRkFMU0UgKTsKCiAgICBTaXplVHlw ZSBob3JEYXRhKCkgY29uc3QgeyByZXR1cm4gKFNpemVUeXBlKSggZGF0YSAmIEhNYXNrICk7IH0K ICAgIFNpemVUeXBlIHZlckRhdGEoKSBjb25zdCB7IHJldHVybiAoU2l6ZVR5cGUpKCggZGF0YSAm IFZNYXNrICkgPj4gSFNpemUpOyB9CgogICAgYm9vbCBtYXlTaHJpbmtIb3Jpem9udGFsbHkoKSBj b25zdCB7IHJldHVybiBob3JEYXRhKCkgJiBNYXlTaHJpbmsgfHwgaG9yRGF0YSgpID09IElnbm9y ZWQ7IH0KICAgIGJvb2wgbWF5U2hyaW5rVmVydGljYWxseSgpIGNvbnN0IHsgcmV0dXJuIHZlckRh dGEoKSAmIE1heVNocmluayB8fCB2ZXJEYXRhKCkgPT0gSWdub3JlZDsgfQogICAgYm9vbCBtYXlH cm93SG9yaXpvbnRhbGx5KCkgY29uc3QgeyByZXR1cm4gaG9yRGF0YSgpICYgTWF5R3JvdyB8fCBo b3JEYXRhKCkgPT0gSWdub3JlZDsgfQogICAgYm9vbCBtYXlHcm93VmVydGljYWxseSgpIGNvbnN0 IHsgcmV0dXJuIHZlckRhdGEoKSAmIE1heUdyb3cgfHwgdmVyRGF0YSgpID09IElnbm9yZWQ7IH0K CiAgICBFeHBhbmREYXRhIGV4cGFuZGluZygpIGNvbnN0CiAgICB7CglyZXR1cm4gKEV4cGFuZERh dGEpKCAoaW50KSh2ZXJEYXRhKCkmRXhwTWFzayA/IFZlcnRpY2FsbHkgOiAwKSsKCQkJICAgICAo aW50KShob3JEYXRhKCkmRXhwTWFzayA/IEhvcml6b250YWxseSA6IDApICk7CiAgICB9CgogICAg dm9pZCBzZXRIb3JEYXRhKCBTaXplVHlwZSBkICkgeyBkYXRhID0gKFFfVUlOVDMyKShkYXRhICYg fkhNYXNrKSB8IGQ7IH0KICAgIHZvaWQgc2V0VmVyRGF0YSggU2l6ZVR5cGUgZCApIHsgZGF0YSA9 IChRX1VJTlQzMikoZGF0YSAmIH4oSE1hc2s8PEhTaXplKSkgfAoJCQkJCSAgIChkPDxIU2l6ZSk7 IH0KCQkKICAgIHZvaWQgc2V0SGVpZ2h0Rm9yV2lkdGgoIGJvb2wgYiApIHsgZGF0YSA9IGIgPyAo UV9VSU5UMzIpKCBkYXRhIHwgKCAxIDw8IDIqSFNpemUgKSApCgkJCQkJICAgICAgOiAoUV9VSU5U MzIpKCBkYXRhICYgfiggMSA8PCAyKkhTaXplICkgKTsgIH0KICAgIGJvb2wgaGFzSGVpZ2h0Rm9y V2lkdGgoKSBjb25zdCB7IHJldHVybiBkYXRhICYgKCAxIDw8IDIqSFNpemUgKTsgfQoKICAgIGJv b2wgb3BlcmF0b3I9PSggY29uc3QgUVNpemVQb2xpY3kmIHMgKSBjb25zdCB7IHJldHVybiBkYXRh ID09IHMuZGF0YTsgfQogICAgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRU2l6ZVBvbGljeSYgcyAp IGNvbnN0IHsgcmV0dXJuIGRhdGEgIT0gcy5kYXRhOyB9CgoKICAgIHVpbnQgaG9yU3RyZXRjaCgp IGNvbnN0IHsgcmV0dXJuIGRhdGEgPj4gMjQ7IH0KICAgIHVpbnQgdmVyU3RyZXRjaCgpIGNvbnN0 IHsgcmV0dXJuIChkYXRhID4+IDE2KSAmIDB4ZmY7IH0KICAgIHZvaWQgc2V0SG9yU3RyZXRjaCgg dWNoYXIgc2YgKSB7IGRhdGEgPSAoZGF0YSYweDAwZmZmZmZmKSB8ICh1aW50KHNmKTw8MjQpOyB9 CiAgICB2b2lkIHNldFZlclN0cmV0Y2goIHVjaGFyIHNmICkgeyBkYXRhID0gKGRhdGEmMHhmZjAw ZmZmZikgfCAodWludChzZik8PDE2KTsgfQoKcHJpdmF0ZToKICAgIFFTaXplUG9saWN5KCBpbnQg aSApOiBkYXRhKCAoUV9VSU5UMzIpaSApIHt9CgogICAgUV9VSU5UMzIgZGF0YTsKfTsKCmlubGlu ZSBRU2l6ZVBvbGljeTo6UVNpemVQb2xpY3koIFNpemVUeXBlIGhvciwgU2l6ZVR5cGUgdmVyLCB1 Y2hhciBob3JzLCB1Y2hhciB2ZXJzLCBib29sIGhmdyApCiAgICA6IGRhdGEoIGhvciB8ICh2ZXI8 PEhTaXplKSB8IChoZncgPyAoUV9VSU5UMzIpKDE8PDIqSFNpemUpIDogMCkgKSB7CglzZXRIb3JT dHJldGNoKCBob3JzICk7CglzZXRWZXJTdHJldGNoKCB2ZXJzICk7Cn0KCgoKIyA0OSAiL3Vzci9s b2NhbC9xdC9pbmNsdWRlL3F3aWRnZXQuaCIgMgoKCgpjbGFzcyBRTGF5b3V0OwpzdHJ1Y3QgUVdF eHRyYTsKc3RydWN0IFFUTFdFeHRyYTsKY2xhc3MgUUZvY3VzRGF0YTsKY2xhc3MgUUN1cnNvcjsK Y2xhc3MgUVdTUmVnaW9uTWFuYWdlcjsKY2xhc3MgUVN0eWxlOwoKY2xhc3MgICBRV2lkZ2V0IDog cHVibGljIFFPYmplY3QsIHB1YmxpYyBRUGFpbnREZXZpY2UKewogICAgcHVibGljOgl2aXJ0dWFs IFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVj dCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9p ZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBR VU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1 YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRh T2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAo UU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAog ICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAog ICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAg IAoKICAgICAKICAgICAKCgogICAgIAogICAgIAogICAgIAoKICAgICAKICAgICAKICAgICAKICAg ICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAK ICAgICAKICAgICAKICAgICAKICAgICAKCnB1YmxpYzoKICAgIFFXaWRnZXQoIFFXaWRnZXQqIHBh cmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAsIFdGbGFncyBmPTAgKTsKICAgIH5RV2lkZ2V0KCk7 CgogICAgV0lkCQkgd2luSWQoKSBjb25zdDsKICAgIHZvaWQJIHNldE5hbWUoIGNvbnN0IGNoYXIg Km5hbWUgKTsKCiAgICAgCgogICAgUVN0eWxlICAgICAmc3R5bGUoKSBjb25zdDsKICAgIHZvaWQg ICAgICAgIHNldFN0eWxlKCBRU3R5bGUgKiApOwogICAgUVN0eWxlKglzZXRTdHlsZSggY29uc3Qg UVN0cmluZyYgKTsKCiAgICAgCgogICAgYm9vbAkgaXNUb3BMZXZlbCgpCWNvbnN0OwogICAgYm9v bAkgaXNEaWFsb2coKQljb25zdDsKICAgIGJvb2wJIGlzUG9wdXAoKQljb25zdDsKICAgIGJvb2wJ IGlzRGVza3RvcCgpCWNvbnN0OwogICAgYm9vbAkgaXNNb2RhbCgpCWNvbnN0OwoKICAgIGJvb2wJ IGlzRW5hYmxlZCgpCWNvbnN0OwogICAgYm9vbAkgaXNFbmFibGVkVG8oUVdpZGdldCopIGNvbnN0 OwogICAgYm9vbAkgaXNFbmFibGVkVG9UTFcoKSBjb25zdDsKCnB1YmxpYyAgOgogICAgdmlydHVh bCB2b2lkIHNldEVuYWJsZWQoIGJvb2wgKTsKICAgIHZvaWQgc2V0RGlzYWJsZWQoIGJvb2wgKTsK CiAgICAgCgpwdWJsaWM6CiAgICBRUmVjdAkgZnJhbWVHZW9tZXRyeSgpIGNvbnN0OwogICAgY29u c3QgUVJlY3QgJmdlb21ldHJ5KCkJY29uc3Q7CiAgICBpbnQJCSB4KCkJCWNvbnN0OwogICAgaW50 CQkgeSgpCQljb25zdDsKICAgIFFQb2ludAkgcG9zKCkJCWNvbnN0OwogICAgUVNpemUJIGZyYW1l U2l6ZSgpICAgIGNvbnN0OwogICAgUVNpemUJIHNpemUoKQkJY29uc3Q7CiAgICBpbnQJCSB3aWR0 aCgpCWNvbnN0OwogICAgaW50CQkgaGVpZ2h0KCkJY29uc3Q7CiAgICBRUmVjdAkgcmVjdCgpCQlj b25zdDsKICAgIFFSZWN0CSBjaGlsZHJlblJlY3QoKSBjb25zdDsKICAgIFFSZWdpb24JIGNoaWxk cmVuUmVnaW9uKCkgY29uc3Q7CgogICAgUVNpemUJIG1pbmltdW1TaXplKCkJIGNvbnN0OwogICAg UVNpemUJIG1heGltdW1TaXplKCkJIGNvbnN0OwogICAgaW50CQkgbWluaW11bVdpZHRoKCkJIGNv bnN0OwogICAgaW50CQkgbWluaW11bUhlaWdodCgpIGNvbnN0OwogICAgaW50CQkgbWF4aW11bVdp ZHRoKCkJIGNvbnN0OwogICAgaW50CQkgbWF4aW11bUhlaWdodCgpIGNvbnN0OwogICAgdm9pZAkg c2V0TWluaW11bVNpemUoIGNvbnN0IFFTaXplICYgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRNaW5p bXVtU2l6ZSggaW50IG1pbncsIGludCBtaW5oICk7CiAgICB2b2lkCSBzZXRNYXhpbXVtU2l6ZSgg Y29uc3QgUVNpemUgJiApOwogICAgdmlydHVhbCB2b2lkIHNldE1heGltdW1TaXplKCBpbnQgbWF4 dywgaW50IG1heGggKTsKICAgIHZvaWQJIHNldE1pbmltdW1XaWR0aCggaW50IG1pbncgKTsKICAg IHZvaWQJIHNldE1pbmltdW1IZWlnaHQoIGludCBtaW5oICk7CiAgICB2b2lkCSBzZXRNYXhpbXVt V2lkdGgoIGludCBtYXh3ICk7CiAgICB2b2lkCSBzZXRNYXhpbXVtSGVpZ2h0KCBpbnQgbWF4aCAp OwoKICAgIFFTaXplCSBzaXplSW5jcmVtZW50KCkgY29uc3Q7CiAgICB2b2lkCSBzZXRTaXplSW5j cmVtZW50KCBjb25zdCBRU2l6ZSAmICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZUluY3JlbWVu dCggaW50IHcsIGludCBoICk7CiAgICBRU2l6ZQkgYmFzZVNpemUoKSBjb25zdDsKICAgIHZvaWQJ IHNldEJhc2VTaXplKCBjb25zdCBRU2l6ZSAmICk7CiAgICB2b2lkCSBzZXRCYXNlU2l6ZSggaW50 IGJhc2V3LCBpbnQgYmFzZWggKTsKCiAgICB2b2lkCXNldEZpeGVkU2l6ZSggY29uc3QgUVNpemUg JiApOwogICAgdm9pZAlzZXRGaXhlZFNpemUoIGludCB3LCBpbnQgaCApOwogICAgdm9pZAlzZXRG aXhlZFdpZHRoKCBpbnQgdyApOwogICAgdm9pZAlzZXRGaXhlZEhlaWdodCggaW50IGggKTsKCiAg ICAgCgogICAgUVBvaW50CSBtYXBUb0dsb2JhbCggY29uc3QgUVBvaW50ICYgKQkgY29uc3Q7CiAg ICBRUG9pbnQJIG1hcEZyb21HbG9iYWwoIGNvbnN0IFFQb2ludCAmICkgY29uc3Q7CiAgICBRUG9p bnQJIG1hcFRvUGFyZW50KCBjb25zdCBRUG9pbnQgJiApCSBjb25zdDsKICAgIFFQb2ludAkgbWFw RnJvbVBhcmVudCggY29uc3QgUVBvaW50ICYgKSBjb25zdDsKICAgIFFQb2ludAkgbWFwVG8oIFFX aWRnZXQgKiwgY29uc3QgUVBvaW50ICYgKSBjb25zdDsKICAgIFFQb2ludAkgbWFwRnJvbSggUVdp ZGdldCAqLCBjb25zdCBRUG9pbnQgJiApIGNvbnN0OwoKICAgIFFXaWRnZXQJKnRvcExldmVsV2lk Z2V0KCkgICBjb25zdDsKCiAgICAgCgogICAgQmFja2dyb3VuZE1vZGUJYmFja2dyb3VuZE1vZGUo KSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZAlzZXRCYWNrZ3JvdW5kTW9kZSggQmFja2dyb3VuZE1v ZGUgKTsKICAgIHZvaWQgCQlzZXRCYWNrZ3JvdW5kTW9kZSggQmFja2dyb3VuZE1vZGUsIEJhY2tn cm91bmRNb2RlICk7CgogICAgY29uc3QgUUNvbG9yICYJZm9yZWdyb3VuZENvbG9yKCkgY29uc3Q7 CgogICAgY29uc3QgUUNvbG9yICYJZXJhc2VDb2xvcigpIGNvbnN0OwogICAgdmlydHVhbCB2b2lk CXNldEVyYXNlQ29sb3IoIGNvbnN0IFFDb2xvciAmICk7CgogICAgY29uc3QgUVBpeG1hcCAqCWVy YXNlUGl4bWFwKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0RXJhc2VQaXhtYXAoIGNvbnN0 IFFQaXhtYXAgJiApOwoKCiAgICBjb25zdCBRQ29sb3JHcm91cCAmIGNvbG9yR3JvdXAoKSBjb25z dDsKICAgIGNvbnN0IFFQYWxldHRlICYJcGFsZXR0ZSgpICAgIGNvbnN0OwogICAgYm9vbAkJb3du UGFsZXR0ZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldFBhbGV0dGUoIGNvbnN0IFFQYWxl dHRlICYgKTsKICAgIHZvaWQJCXVuc2V0UGFsZXR0ZSgpOwoKCiAgICBjb25zdCBRQ29sb3IgJglw YWxldHRlRm9yZWdyb3VuZENvbG9yKCkgY29uc3Q7CiAgICB2b2lkCQlzZXRQYWxldHRlRm9yZWdy b3VuZENvbG9yKCBjb25zdCBRQ29sb3IgJiApOwoKICAgIGNvbnN0IFFDb2xvciAmCXBhbGV0dGVC YWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZAlzZXRQYWxldHRlQmFja2dy b3VuZENvbG9yKCBjb25zdCBRQ29sb3IgJiApOwoKICAgIGNvbnN0IFFQaXhtYXAgKglwYWxldHRl QmFja2dyb3VuZFBpeG1hcCgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIAlzZXRQYWxldHRlQmFj a2dyb3VuZFBpeG1hcCggY29uc3QgUVBpeG1hcCAmICk7CgogICAgY29uc3QgUUJydXNoJgliYWNr Z3JvdW5kQnJ1c2goKSBjb25zdDsKCiAgICBRRm9udAkJZm9udCgpIGNvbnN0OwogICAgYm9vbAkJ b3duRm9udCgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldEZvbnQoIGNvbnN0IFFGb250ICYg KTsKICAgIHZvaWQJCXVuc2V0Rm9udCgpOwogICAgUUZvbnRNZXRyaWNzCWZvbnRNZXRyaWNzKCkg Y29uc3Q7CiAgICBRRm9udEluZm8JIAlmb250SW5mbygpIGNvbnN0OwoKCiAgICBjb25zdCBRQ3Vy c29yICAgICAgJmN1cnNvcigpIGNvbnN0OwogICAgYm9vbAkJb3duQ3Vyc29yKCkgY29uc3Q7CiAg ICB2aXJ0dWFsIHZvaWQJc2V0Q3Vyc29yKCBjb25zdCBRQ3Vyc29yICYgKTsKICAgIHZpcnR1YWwg dm9pZAl1bnNldEN1cnNvcigpOwoKCiAgICBRU3RyaW5nCQljYXB0aW9uKCkgY29uc3Q7CiAgICBj b25zdCBRUGl4bWFwICAgICAgKmljb24oKSBjb25zdDsKICAgIFFTdHJpbmcJCWljb25UZXh0KCkg Y29uc3Q7CgogICAgYm9vbAkJaGFzTW91c2VUcmFja2luZygpIGNvbnN0OwogICAgYm9vbAkJaGFz TW91c2UoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQJc2V0TWFzayggY29uc3QgUUJpdG1hcCAm ICk7CiAgICB2aXJ0dWFsIHZvaWQJc2V0TWFzayggY29uc3QgUVJlZ2lvbiAmICk7CiAgICB2b2lk CQljbGVhck1hc2soKTsKCiAgICBjb25zdCBRQ29sb3IgJgliYWNrZ3JvdW5kQ29sb3IoKSBjb25z dDsgIAogICAgdmlydHVhbCB2b2lkCXNldEJhY2tncm91bmRDb2xvciggY29uc3QgUUNvbG9yICYg KTsgIAogICAgY29uc3QgUVBpeG1hcCAqCWJhY2tncm91bmRQaXhtYXAoKSBjb25zdDsgIAogICAg dmlydHVhbCB2b2lkCXNldEJhY2tncm91bmRQaXhtYXAoIGNvbnN0IFFQaXhtYXAgJiApOyAgCgpw dWJsaWMgIDoKCiAgICB2aXJ0dWFsIHZvaWQJc2V0Q2FwdGlvbiggY29uc3QgUVN0cmluZyAmKTsK ICAgIHZpcnR1YWwgdm9pZAlzZXRJY29uKCBjb25zdCBRUGl4bWFwICYgKTsKICAgIHZpcnR1YWwg dm9pZAlzZXRJY29uVGV4dCggY29uc3QgUVN0cmluZyAmKTsKCiAgICB2aXJ0dWFsIHZvaWQJc2V0 TW91c2VUcmFja2luZyggYm9vbCBlbmFibGUgKTsKCiAgICAgCgogICAgdmlydHVhbCB2b2lkCXNl dEZvY3VzKCk7CiAgICB2b2lkCQljbGVhckZvY3VzKCk7CgpwdWJsaWM6CiAgICBlbnVtIEZvY3Vz UG9saWN5IHsKCU5vRm9jdXMgPSAwLAoJVGFiRm9jdXMgPSAweDEsCglDbGlja0ZvY3VzID0gMHgy LAoJU3Ryb25nRm9jdXMgPSAweDMsCglXaGVlbEZvY3VzID0gMHg3CiAgICB9OwoKICAgIGJvb2wJ CWlzQWN0aXZlV2luZG93KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0QWN0aXZlV2luZG93 KCk7CiAgICBib29sCQlpc0ZvY3VzRW5hYmxlZCgpIGNvbnN0OwoKICAgIEZvY3VzUG9saWN5CQlm b2N1c1BvbGljeSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldEZvY3VzUG9saWN5KCBGb2N1 c1BvbGljeSApOwogICAgYm9vbAkJaGFzRm9jdXMoKSBjb25zdDsKICAgIHN0YXRpYyB2b2lkCQlz ZXRUYWJPcmRlciggUVdpZGdldCAqLCBRV2lkZ2V0ICogKTsKICAgIHZpcnR1YWwgdm9pZAlzZXRG b2N1c1Byb3h5KCBRV2lkZ2V0ICogKTsKICAgIFFXaWRnZXQgKgkJZm9jdXNQcm94eSgpIGNvbnN0 OwoKICAgICAKCiAgICB2b2lkCQlncmFiTW91c2UoKTsKCiAgICB2b2lkCQlncmFiTW91c2UoIGNv bnN0IFFDdXJzb3IgJiApOwoKICAgIHZvaWQJCXJlbGVhc2VNb3VzZSgpOwogICAgdm9pZAkJZ3Jh YktleWJvYXJkKCk7CiAgICB2b2lkCQlyZWxlYXNlS2V5Ym9hcmQoKTsKICAgIHN0YXRpYyBRV2lk Z2V0ICoJbW91c2VHcmFiYmVyKCk7CiAgICBzdGF0aWMgUVdpZGdldCAqCWtleWJvYXJkR3JhYmJl cigpOwoKICAgICAKCiAgICBib29sCSAJaXNVcGRhdGVzRW5hYmxlZCgpIGNvbnN0OwoKCgoKcHVi bGljICA6CiAgICB2aXJ0dWFsIHZvaWQJc2V0VXBkYXRlc0VuYWJsZWQoIGJvb2wgZW5hYmxlICk7 CiAgICB2b2lkCQl1cGRhdGUoKTsKICAgIHZvaWQJCXVwZGF0ZSggaW50IHgsIGludCB5LCBpbnQg dywgaW50IGggKTsKICAgIHZvaWQJCXVwZGF0ZSggY29uc3QgUVJlY3QmICk7CiAgICB2b2lkCQly ZXBhaW50KCk7CiAgICB2b2lkCQlyZXBhaW50KCBib29sIGVyYXNlICk7CiAgICB2b2lkCQlyZXBh aW50KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgYm9vbCBlcmFzZT1UUlVFICk7CiAgICB2 b2lkCQlyZXBhaW50KCBjb25zdCBRUmVjdCAmLCBib29sIGVyYXNlID0gVFJVRSApOwogICAgdm9p ZAkJcmVwYWludCggY29uc3QgUVJlZ2lvbiAmLCBib29sIGVyYXNlID0gVFJVRSApOwoKICAgICAK CiAgICB2aXJ0dWFsIHZvaWQJc2hvdygpOwogICAgdmlydHVhbCB2b2lkCWhpZGUoKTsKCiAgICB2 b2lkCQlpY29uaWZ5KCkgeyBzaG93TWluaW1pemVkKCk7IH0KCiAgICB2aXJ0dWFsIHZvaWQJc2hv d01pbmltaXplZCgpOwogICAgdmlydHVhbCB2b2lkCXNob3dNYXhpbWl6ZWQoKTsKICAgIHZvaWQJ CXNob3dGdWxsU2NyZWVuKCk7CiAgICB2aXJ0dWFsIHZvaWQJc2hvd05vcm1hbCgpOwogICAgdmly dHVhbCB2b2lkCXBvbGlzaCgpOwogICAgdm9pZCAJCWNvbnN0UG9saXNoKCkgY29uc3Q7CiAgICBi b29sCQljbG9zZSgpOwoKICAgIHZvaWQJCXJhaXNlKCk7CiAgICB2b2lkCQlsb3dlcigpOwogICAg dm9pZAkJc3RhY2tVbmRlciggUVdpZGdldCogKTsKICAgIHZpcnR1YWwgdm9pZAltb3ZlKCBpbnQg eCwgaW50IHkgKTsKICAgIHZvaWQJCW1vdmUoIGNvbnN0IFFQb2ludCAmICk7CiAgICB2aXJ0dWFs IHZvaWQJcmVzaXplKCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJCXJlc2l6ZSggY29uc3QgUVNp emUgJiApOwogICAgdmlydHVhbCB2b2lkCXNldEdlb21ldHJ5KCBpbnQgeCwgaW50IHksIGludCB3 LCBpbnQgaCApOwogICAgdmlydHVhbCB2b2lkCXNldEdlb21ldHJ5KCBjb25zdCBRUmVjdCAmICk7 CgpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wJY2xvc2UoIGJvb2wgYWxzb0RlbGV0ZSApOwogICAg Ym9vbAkJaXNWaXNpYmxlKCkJY29uc3Q7CiAgICBib29sCQlpc1Zpc2libGVUbyhRV2lkZ2V0Kikg Y29uc3Q7CiAgICBib29sCQlpc1Zpc2libGVUb1RMVygpIGNvbnN0OyAgCiAgICBRUmVjdAkJdmlz aWJsZVJlY3QoKSBjb25zdDsKICAgIGJvb2wgCQlpc0hpZGRlbigpIGNvbnN0OwogICAgYm9vbAkJ aXNNaW5pbWl6ZWQoKSBjb25zdDsKICAgIGJvb2wJCWlzTWF4aW1pemVkKCkgY29uc3Q7CgogICAg dmlydHVhbCBRU2l6ZQlzaXplSGludCgpIGNvbnN0OwogICAgdmlydHVhbCBRU2l6ZQltaW5pbXVt U2l6ZUhpbnQoKSBjb25zdDsKICAgIHZpcnR1YWwgUVNpemVQb2xpY3kJc2l6ZVBvbGljeSgpIGNv bnN0OwogICAgdmlydHVhbCB2b2lkCQlzZXRTaXplUG9saWN5KCBRU2l6ZVBvbGljeSApOwogICAg dmlydHVhbCBpbnQgaGVpZ2h0Rm9yV2lkdGgoaW50KSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQg IAlhZGp1c3RTaXplKCk7CgogICAgUUxheW91dCAqCQlsYXlvdXQoKSBjb25zdCB7IHJldHVybiBs YXlfb3V0OyB9CgogICAgdm9pZAkJdXBkYXRlR2VvbWV0cnkoKTsKICAgIHZpcnR1YWwgdm9pZCAJ cmVwYXJlbnQoIFFXaWRnZXQgKnBhcmVudCwgV0ZsYWdzLCBjb25zdCBRUG9pbnQgJiwKCQkJCSAg Ym9vbCBzaG93SXQ9RkFMU0UgKTsKICAgIHZvaWQJCXJlcGFyZW50KCBRV2lkZ2V0ICpwYXJlbnQs IGNvbnN0IFFQb2ludCAmLAoJCQkJICBib29sIHNob3dJdD1GQUxTRSApOwoKICAgIHZvaWQJCXJl Y3JlYXRlKCBRV2lkZ2V0ICpwYXJlbnQsIFdGbGFncyBmLCBjb25zdCBRUG9pbnQgJiBwLAoJCQkJ ICBib29sIHNob3dJdD1GQUxTRSApIHsgcmVwYXJlbnQocGFyZW50LGYscCxzaG93SXQpOyB9CgoK ICAgIHZvaWQJCWVyYXNlKCk7CiAgICB2b2lkCQllcmFzZSggaW50IHgsIGludCB5LCBpbnQgdywg aW50IGggKTsKICAgIHZvaWQJCWVyYXNlKCBjb25zdCBRUmVjdCAmICk7CiAgICB2b2lkCQllcmFz ZSggY29uc3QgUVJlZ2lvbiAmICk7CiAgICB2b2lkCQlzY3JvbGwoIGludCBkeCwgaW50IGR5ICk7 CiAgICB2b2lkCQlzY3JvbGwoIGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYgKTsKCiAgICB2 b2lkCQlkcmF3VGV4dCggaW50IHgsIGludCB5LCBjb25zdCBRU3RyaW5nICYpOwogICAgdm9pZAkJ ZHJhd1RleHQoIGNvbnN0IFFQb2ludCAmLCBjb25zdCBRU3RyaW5nICYpOwoKICAgICAKCiAgICBR V2lkZ2V0ICoJCWZvY3VzV2lkZ2V0KCkgY29uc3Q7CiAgICBRUmVjdCAgICAgICAgICAgICAgIG1p Y3JvRm9jdXNIaW50KCkgY29uc3Q7CgogICAgIAoKICAgIGJvb2wJCWFjY2VwdERyb3BzKCkgY29u c3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0QWNjZXB0RHJvcHMoIGJvb2wgb24gKTsKCiAgICAgCgog ICAgdmlydHVhbCB2b2lkCXNldEF1dG9NYXNrKGJvb2wpOwogICAgYm9vbAkJYXV0b01hc2soKSBj b25zdDsKCiAgICBlbnVtIEJhY2tncm91bmRPcmlnaW4geyBXaWRnZXRPcmlnaW4sIFBhcmVudE9y aWdpbiwgV2luZG93T3JpZ2luIH07CgogICAgdmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRPcmln aW4oIEJhY2tncm91bmRPcmlnaW4gKTsKICAgIEJhY2tncm91bmRPcmlnaW4gYmFja2dyb3VuZE9y aWdpbigpIGNvbnN0OwoKCiAgICAgCiAgICB2aXJ0dWFsIGJvb2wgY3VzdG9tV2hhdHNUaGlzKCkg Y29uc3Q7CgogICAgUVdpZGdldCAqCQlwYXJlbnRXaWRnZXQoIGJvb2wgc2FtZVdpbmRvdyA9IEZB TFNFICkgY29uc3Q7CiAgICBXU3RhdGUJCXRlc3RXU3RhdGUoIFdTdGF0ZSBzICkgY29uc3Q7CiAg ICBXRmxhZ3MJCXRlc3RXRmxhZ3MoIFdGbGFncyBmICkgY29uc3Q7CiAgICBzdGF0aWMgUVdpZGdl dCAqCWZpbmQoIFdJZCApOwogICAgc3RhdGljIFFXaWRnZXRNYXBwZXIgKndtYXBwZXIoKTsKCiAg ICBRV2lkZ2V0ICAqY2hpbGRBdCggaW50IHgsIGludCB5LCBib29sIGluY2x1ZGVUaGlzID0gRkFM U0UgKSBjb25zdDsKICAgIFFXaWRnZXQgICpjaGlsZEF0KCBjb25zdCBRUG9pbnQgJiwgYm9vbCBp bmNsdWRlVGhpcyA9IEZBTFNFICkgY29uc3Q7CgoKCgoKCgoKCgoKCnByb3RlY3RlZDoKICAgICAK ICAgIGJvb2wJIGV2ZW50KCBRRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIG1vdXNlUHJlc3NF dmVudCggUU1vdXNlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50 KCBRTW91c2VFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgbW91c2VEb3VibGVDbGlja0V2ZW50 KCBRTW91c2VFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgbW91c2VNb3ZlRXZlbnQoIFFNb3Vz ZUV2ZW50ICogKTsKCiAgICB2aXJ0dWFsIHZvaWQgd2hlZWxFdmVudCggUVdoZWVsRXZlbnQgKiAp OwoKICAgIHZpcnR1YWwgdm9pZCBrZXlQcmVzc0V2ZW50KCBRS2V5RXZlbnQgKiApOwogICAgdmly dHVhbCB2b2lkIGtleVJlbGVhc2VFdmVudCggUUtleUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9p ZCBmb2N1c0luRXZlbnQoIFFGb2N1c0V2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBmb2N1c091 dEV2ZW50KCBRRm9jdXNFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgZW50ZXJFdmVudCggUUV2 ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBsZWF2ZUV2ZW50KCBRRXZlbnQgKiApOwogICAgdmly dHVhbCB2b2lkIHBhaW50RXZlbnQoIFFQYWludEV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBt b3ZlRXZlbnQoIFFNb3ZlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIHJlc2l6ZUV2ZW50KCBR UmVzaXplRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIGNsb3NlRXZlbnQoIFFDbG9zZUV2ZW50 ICogKTsKICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUV2ZW50KCBRQ29udGV4dE1lbnVFdmVu dCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgaW1TdGFydEV2ZW50KCBRSU1FdmVudCAqICk7CiAgICB2 aXJ0dWFsIHZvaWQgaW1Db21wb3NlRXZlbnQoIFFJTUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9p ZCBpbUVuZEV2ZW50KCBRSU1FdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgdGFibGV0RXZlbnQo IFFUYWJsZXRFdmVudCAqICk7CgoKICAgIHZpcnR1YWwgdm9pZCBkcmFnRW50ZXJFdmVudCggUURy YWdFbnRlckV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBkcmFnTW92ZUV2ZW50KCBRRHJhZ01v dmVFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgZHJhZ0xlYXZlRXZlbnQoIFFEcmFnTGVhdmVF dmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgZHJvcEV2ZW50KCBRRHJvcEV2ZW50ICogKTsKCgog ICAgdmlydHVhbCB2b2lkIHNob3dFdmVudCggUVNob3dFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZv aWQgaGlkZUV2ZW50KCBRSGlkZUV2ZW50ICogKTsKCgoKCgoKCgogICAgdmlydHVhbCBib29sIHgx MUV2ZW50KCBYRXZlbnQgKiApOwoKCgoKCgoKICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVNYXNrKCk7 CgogICAgIAoKCiAgICB2aXJ0dWFsIHZvaWQgc3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKCiAgICB2 aXJ0dWFsIHZvaWQgZW5hYmxlZENoYW5nZSggYm9vbCBvbGRFbmFibGVkICk7CgogICAgdmlydHVh bCB2b2lkIHBhbGV0dGVDaGFuZ2UoIGNvbnN0IFFQYWxldHRlICYgKTsKCiAgICB2aXJ0dWFsIHZv aWQgZm9udENoYW5nZSggY29uc3QgUUZvbnQgJiApOwogICAgdmlydHVhbCB2b2lkIHdpbmRvd0Fj dGl2YXRpb25DaGFuZ2UoIGJvb2wgb2xkQWN0aXZlICk7CgogICAgaW50CQkgbWV0cmljKCBpbnQg KQljb25zdDsKCiAgICB2b2lkCSByZXNldElucHV0Q29udGV4dCgpOwoKICAgIHZpcnR1YWwgdm9p ZCBjcmVhdGUoIFdJZCA9IDAsIGJvb2wgaW5pdGlhbGl6ZVdpbmRvdyA9IFRSVUUsCgkJCSBib29s IGRlc3Ryb3lPbGRXaW5kb3cgPSBUUlVFICk7CiAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSggYm9v bCBkZXN0cm95V2luZG93ID0gVFJVRSwKCQkJICBib29sIGRlc3Ryb3lTdWJXaW5kb3dzID0gVFJV RSApOwogICAgdWludAkgZ2V0V1N0YXRlKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0V1N0 YXRlKCB1aW50ICk7CiAgICB2b2lkCSBjbGVhcldTdGF0ZSggdWludCBuICk7CiAgICBXRmxhZ3MJ IGdldFdGbGFncygpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFdGbGFncyggV0ZsYWdzICk7 CiAgICB2b2lkCSBjbGVhcldGbGFncyggV0ZsYWdzIG4gKTsKCiAgICB2aXJ0dWFsIGJvb2wgZm9j dXNOZXh0UHJldkNoaWxkKCBib29sIG5leHQgKTsKCiAgICBRV0V4dHJhCSpleHRyYURhdGEoKTsK ICAgIFFUTFdFeHRyYQkqdG9wRGF0YSgpOwogICAgUUZvY3VzRGF0YQkqZm9jdXNEYXRhKCk7Cgog ICAgdmlydHVhbCB2b2lkIHNldEtleUNvbXByZXNzaW9uKGJvb2wpOwogICAgdmlydHVhbCB2b2lk IHNldE1pY3JvRm9jdXNIaW50KGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBib29sIHRleHQ9 VFJVRSwgUUZvbnQgKmYgPSAwKTsKCgoKCgoKcHJpdmF0ZSAgOgogICAgdm9pZAkgZm9jdXNQcm94 eURlc3Ryb3llZCgpOwoKcHJpdmF0ZToKICAgIHZvaWQJIHNldEZvbnRTeXMoIFFGb250ICpmID0g MCApOwoKICAgIHZvaWQJIGNyZWF0ZUlucHV0Q29udGV4dCgpOwogICAgdm9pZAkgZGVzdHJveUlu cHV0Q29udGV4dCgpOwogICAgdm9pZAkgZm9jdXNJbnB1dENvbnRleHQoKTsKICAgIHZvaWQJIGNo ZWNrQ2hpbGRyZW5EbmQoKTsKIyA1NjYgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2lkZ2V0Lmgi CgoKCiAgICB2b2lkIAkgc2V0TGF5b3V0KCBRTGF5b3V0ICpsICk7CgogICAgdm9pZAkgc2V0V2lu SWQoIFdJZCApOwogICAgdm9pZAkgc2hvd1dpbmRvdygpOwogICAgdm9pZAkgaGlkZVdpbmRvdygp OwogICAgdm9pZAkgc2VuZFNob3dFdmVudHNUb0NoaWxkcmVuKCBib29sIHNwb250YW5lb3VzICk7 CiAgICB2b2lkCSBzZW5kSGlkZUV2ZW50c1RvQ2hpbGRyZW4oIGJvb2wgc3BvbnRhbmVvdXMgKTsK ICAgIHZvaWQJIHJlcGFyZW50U3lzKCBRV2lkZ2V0ICpwYXJlbnQsIFdGbGFncywgY29uc3QgUVBv aW50ICYsICBib29sIHNob3dJdCk7CiAgICB2b2lkCSBjcmVhdGVUTEV4dHJhKCk7CiAgICB2b2lk CSBjcmVhdGVFeHRyYSgpOwogICAgdm9pZAkgZGVsZXRlRXh0cmEoKTsKICAgIHZvaWQJIGNyZWF0 ZVN5c0V4dHJhKCk7CiAgICB2b2lkCSBkZWxldGVTeXNFeHRyYSgpOwogICAgdm9pZAkgY3JlYXRl VExTeXNFeHRyYSgpOwogICAgdm9pZAkgZGVsZXRlVExTeXNFeHRyYSgpOwogICAgdm9pZAkgZGVh Y3RpdmF0ZVdpZGdldENsZWFudXAoKTsKICAgIHZvaWQJIGludGVybmFsU2V0R2VvbWV0cnkoIGlu dCwgaW50LCBpbnQsIGludCwgYm9vbCApOwogICAgdm9pZAkgcmVwYXJlbnRGb2N1c1dpZGdldHMo IFFXaWRnZXQgKiApOwogICAgUUZvY3VzRGF0YQkqZm9jdXNEYXRhKCBib29sIGNyZWF0ZSApOwog ICAgdm9pZCAgICAgICAgIHNldEJhY2tncm91bmRGcm9tTW9kZSgpOwogICAgdm9pZCAgICAgICAg IHNldEJhY2tncm91bmRDb2xvckRpcmVjdCggY29uc3QgUUNvbG9yICYgKTsKICAgIHZvaWQgICAJ IHNldEJhY2tncm91bmRQaXhtYXBEaXJlY3QoIGNvbnN0IFFQaXhtYXAgJiApOwogICAgdm9pZCAg ICAgICAgIHNldEJhY2tncm91bmRNb2RlRGlyZWN0KCBCYWNrZ3JvdW5kTW9kZSApOwogICAgdm9p ZCAgICAgICAgIHNldEJhY2tncm91bmRFbXB0eSgpOwogICAgdm9pZAkgdXBkYXRlRnJhbWVTdHJ1 dCgpIGNvbnN0OwoKICAgIHZvaWQgICAgICAgICBzZXRCYWNrZ3JvdW5kWDExUmVsYXRpdmUoKTsK CgogICAgV0lkCQkgd2luaWQ7CiAgICB1aW50CSB3aWRnZXRfc3RhdGU7CiAgICB1aW50CSB3aWRn ZXRfZmxhZ3M7CiAgICB1aW50CSBmb2N1c19wb2xpY3kgOiA0OwogICAgdWludCAJIG93bl9mb250 IDoxOwogICAgdWludCAJIG93bl9wYWxldHRlIDoxOwogICAgdWludCAJIHNpemVoaW50X2ZvcmNl ZCA6MTsKICAgIHVpbnQgCSBpc19jbG9zaW5nIDoxOwogICAgdWludCAJIGluX3Nob3cgOiAxOwog ICAgdWludCAJIGluX3Nob3dfbWF4aW1pemVkIDogMTsKICAgIHVpbnQJIGZzdHJ1dF9kaXJ0eSA6 IDE7CiAgICBRUmVjdAkgY3JlY3Q7CiAgICBRQ29sb3IJIGJnX2NvbDsKCiAgICBRUGFsZXR0ZQkg cGFsOwoKICAgIFFGb250CSBmbnQ7CgogICAgUUxheW91dCAJKmxheV9vdXQ7CgogICAgUVdFeHRy YQkqZXh0cmE7CiMgNjQxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXdpZGdldC5oIgoKCiAgICBz dGF0aWMgdm9pZAkgY3JlYXRlTWFwcGVyKCk7CiAgICBzdGF0aWMgdm9pZAkgZGVzdHJveU1hcHBl cigpOwogICAgc3RhdGljIFFXaWRnZXRMaXN0CSAqd0xpc3QoKTsKICAgIHN0YXRpYyBRV2lkZ2V0 TGlzdAkgKnRsd0xpc3QoKTsKICAgIHN0YXRpYyBRV2lkZ2V0TWFwcGVyICptYXBwZXI7CiAgICBm cmllbmQgY2xhc3MgUUFwcGxpY2F0aW9uOwogICAgZnJpZW5kIGNsYXNzIFFCYXNlQXBwbGljYXRp b247CiAgICBmcmllbmQgY2xhc3MgUVBhaW50ZXI7CiAgICBmcmllbmQgY2xhc3MgUUZvbnRNZXRy aWNzOwogICAgZnJpZW5kIGNsYXNzIFFGb250SW5mbzsKICAgIGZyaWVuZCBjbGFzcyBRRVRXaWRn ZXQ7CiAgICBmcmllbmQgY2xhc3MgUUxheW91dDsKCnByaXZhdGU6CSAKCiAgICBRV2lkZ2V0KCBj b25zdCBRV2lkZ2V0ICYgKTsKICAgIFFXaWRnZXQgJm9wZXJhdG9yPSggY29uc3QgUVdpZGdldCAm ICk7CgoKcHVibGljOiAgCgogICAgdm9pZCBzZXRQYWxldHRlKCBjb25zdCBRUGFsZXR0ZSAmcCwg Ym9vbCApIHsgc2V0UGFsZXR0ZSggcCApOyB9CgogICAgdm9pZCBzZXRGb250KCBjb25zdCBRRm9u dCAmZiwgYm9vbCApIHsgc2V0Rm9udCggZiApOyB9Cn07CgoKaW5saW5lIFF0OjpXU3RhdGUgUVdp ZGdldDo6dGVzdFdTdGF0ZSggV1N0YXRlIHMgKSBjb25zdAp7IHJldHVybiAod2lkZ2V0X3N0YXRl ICYgcyk7IH0KCmlubGluZSBRdDo6V0ZsYWdzIFFXaWRnZXQ6OnRlc3RXRmxhZ3MoIFdGbGFncyBm ICkgY29uc3QKeyByZXR1cm4gKHdpZGdldF9mbGFncyAmIGYpOyB9CgoKaW5saW5lIFdJZCBRV2lk Z2V0Ojp3aW5JZCgpIGNvbnN0CnsgcmV0dXJuIHdpbmlkOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0 Ojppc1RvcExldmVsKCkgY29uc3QKeyByZXR1cm4gdGVzdFdGbGFncyhXVHlwZV9Ub3BMZXZlbCk7 IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzRGlhbG9nKCkgY29uc3QKeyByZXR1cm4gdGVzdFdG bGFncyhXVHlwZV9EaWFsb2cpOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0Ojppc1BvcHVwKCkgY29u c3QKeyByZXR1cm4gdGVzdFdGbGFncyhXVHlwZV9Qb3B1cCk7IH0KCmlubGluZSBib29sIFFXaWRn ZXQ6OmlzRGVza3RvcCgpIGNvbnN0CnsgcmV0dXJuIHRlc3RXRmxhZ3MoV1R5cGVfRGVza3RvcCk7 IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzRW5hYmxlZCgpIGNvbnN0CnsgcmV0dXJuICF0ZXN0 V1N0YXRlKFdTdGF0ZV9EaXNhYmxlZCk7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzTW9kYWwo KSBjb25zdAp7IHJldHVybiB0ZXN0V0ZsYWdzKFdTaG93TW9kYWwpOyB9CgppbmxpbmUgYm9vbCBR V2lkZ2V0Ojppc0VuYWJsZWRUb1RMVygpIGNvbnN0CnsgcmV0dXJuIGlzRW5hYmxlZCgpOyB9Cgpp bmxpbmUgY29uc3QgUVJlY3QgJlFXaWRnZXQ6Omdlb21ldHJ5KCkgY29uc3QKeyByZXR1cm4gY3Jl Y3Q7IH0KCmlubGluZSBRU2l6ZSBRV2lkZ2V0OjpzaXplKCkgY29uc3QKeyByZXR1cm4gY3JlY3Qu c2l6ZSgpOyB9CgppbmxpbmUgaW50IFFXaWRnZXQ6OndpZHRoKCkgY29uc3QKeyByZXR1cm4gY3Jl Y3Qud2lkdGgoKTsgfQoKaW5saW5lIGludCBRV2lkZ2V0OjpoZWlnaHQoKSBjb25zdAp7IHJldHVy biBjcmVjdC5oZWlnaHQoKTsgfQoKaW5saW5lIFFSZWN0IFFXaWRnZXQ6OnJlY3QoKSBjb25zdAp7 IHJldHVybiBRUmVjdCgwLDAsY3JlY3Qud2lkdGgoKSxjcmVjdC5oZWlnaHQoKSk7IH0KCmlubGlu ZSBpbnQgUVdpZGdldDo6bWluaW11bVdpZHRoKCkgY29uc3QKeyByZXR1cm4gbWluaW11bVNpemUo KS53aWR0aCgpOyB9CgppbmxpbmUgaW50IFFXaWRnZXQ6Om1pbmltdW1IZWlnaHQoKSBjb25zdAp7 IHJldHVybiBtaW5pbXVtU2l6ZSgpLmhlaWdodCgpOyB9CgppbmxpbmUgaW50IFFXaWRnZXQ6Om1h eGltdW1XaWR0aCgpIGNvbnN0CnsgcmV0dXJuIG1heGltdW1TaXplKCkud2lkdGgoKTsgfQoKaW5s aW5lIGludCBRV2lkZ2V0OjptYXhpbXVtSGVpZ2h0KCkgY29uc3QKeyByZXR1cm4gbWF4aW11bVNp emUoKS5oZWlnaHQoKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6c2V0TWluaW11bVNpemUoIGNv bnN0IFFTaXplICZzICkKeyBzZXRNaW5pbXVtU2l6ZShzLndpZHRoKCkscy5oZWlnaHQoKSk7IH0K CmlubGluZSB2b2lkIFFXaWRnZXQ6OnNldE1heGltdW1TaXplKCBjb25zdCBRU2l6ZSAmcyApCnsg c2V0TWF4aW11bVNpemUocy53aWR0aCgpLHMuaGVpZ2h0KCkpOyB9CgppbmxpbmUgdm9pZCBRV2lk Z2V0OjpzZXRTaXplSW5jcmVtZW50KCBjb25zdCBRU2l6ZSAmcyApCnsgc2V0U2l6ZUluY3JlbWVu dChzLndpZHRoKCkscy5oZWlnaHQoKSk7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OnNldEJhc2VT aXplKCBjb25zdCBRU2l6ZSAmcyApCnsgc2V0QmFzZVNpemUocy53aWR0aCgpLHMuaGVpZ2h0KCkp OyB9CgppbmxpbmUgY29uc3QgUUNvbG9yICZRV2lkZ2V0OjplcmFzZUNvbG9yKCkgY29uc3QKeyBy ZXR1cm4gYmdfY29sOyB9CgoKaW5saW5lIGNvbnN0IFFQYWxldHRlICZRV2lkZ2V0OjpwYWxldHRl KCkgY29uc3QKeyByZXR1cm4gcGFsOyB9CgoKaW5saW5lIFFGb250IFFXaWRnZXQ6OmZvbnQoKSBj b25zdAp7IHJldHVybiBmbnQ7IH0KCmlubGluZSBRRm9udE1ldHJpY3MgUVdpZGdldDo6Zm9udE1l dHJpY3MoKSBjb25zdAp7IHJldHVybiBRRm9udE1ldHJpY3MoZm9udCgpKTsgfQoKaW5saW5lIFFG b250SW5mbyBRV2lkZ2V0Ojpmb250SW5mbygpIGNvbnN0CnsgcmV0dXJuIFFGb250SW5mbyhmb250 KCkpOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0OjpoYXNNb3VzZVRyYWNraW5nKCkgY29uc3QKeyBy ZXR1cm4gdGVzdFdTdGF0ZShXU3RhdGVfTW91c2VUcmFja2luZyk7IH0KCmlubGluZSBib29sIFFX aWRnZXQ6Omhhc01vdXNlKCkgY29uc3QKeyByZXR1cm4gdGVzdFdTdGF0ZShXU3RhdGVfSGFzTW91 c2UpOyB9CgppbmxpbmUgYm9vbCAgUVdpZGdldDo6aXNGb2N1c0VuYWJsZWQoKSBjb25zdAp7IHJl dHVybiAoRm9jdXNQb2xpY3kpZm9jdXNfcG9saWN5ICE9IE5vRm9jdXM7IH0KCmlubGluZSBRV2lk Z2V0OjpGb2N1c1BvbGljeSBRV2lkZ2V0Ojpmb2N1c1BvbGljeSgpIGNvbnN0CnsgcmV0dXJuIChG b2N1c1BvbGljeSlmb2N1c19wb2xpY3k7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzVXBkYXRl c0VuYWJsZWQoKSBjb25zdAp7IHJldHVybiAhdGVzdFdTdGF0ZShXU3RhdGVfQmxvY2tVcGRhdGVz KTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6dXBkYXRlKCBjb25zdCBRUmVjdCAmciApCnsgdXBk YXRlKCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSApOyB9CgppbmxpbmUgdm9p ZCBRV2lkZ2V0OjpyZXBhaW50KCkKeyByZXBhaW50KCAwLCAwLCBjcmVjdC53aWR0aCgpLCBjcmVj dC5oZWlnaHQoKSwgVFJVRSApOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpyZXBhaW50KCBib29s IGVyYXNlICkKeyByZXBhaW50KCAwLCAwLCBjcmVjdC53aWR0aCgpLCBjcmVjdC5oZWlnaHQoKSwg ZXJhc2UgKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6cmVwYWludCggY29uc3QgUVJlY3QgJnIs IGJvb2wgZXJhc2UgKQp7IHJlcGFpbnQoIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhlaWdo dCgpLCBlcmFzZSApOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjplcmFzZSgpCnsgZXJhc2UoIDAs IDAsIGNyZWN0LndpZHRoKCksIGNyZWN0LmhlaWdodCgpICk7IH0KCmlubGluZSB2b2lkIFFXaWRn ZXQ6OmVyYXNlKCBjb25zdCBRUmVjdCAmciApCnsgZXJhc2UoIHIueCgpLCByLnkoKSwgci53aWR0 aCgpLCByLmhlaWdodCgpICk7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmNsb3NlKCkKeyByZXR1 cm4gY2xvc2UoIEZBTFNFICk7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzVmlzaWJsZSgpIGNv bnN0CnsgcmV0dXJuIHRlc3RXU3RhdGUoV1N0YXRlX1Zpc2libGUpOyB9CgppbmxpbmUgYm9vbCBR V2lkZ2V0Ojppc1Zpc2libGVUb1RMVygpIGNvbnN0ICAKeyByZXR1cm4gaXNWaXNpYmxlKCk7IH0K CmlubGluZSBib29sIFFXaWRnZXQ6OmlzSGlkZGVuKCkgY29uc3QKeyByZXR1cm4gdGVzdFdTdGF0 ZShXU3RhdGVfRm9yY2VIaWRlKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6bW92ZSggY29uc3Qg UVBvaW50ICZwICkKeyBtb3ZlKCBwLngoKSwgcC55KCkgKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdl dDo6cmVzaXplKCBjb25zdCBRU2l6ZSAmcyApCnsgcmVzaXplKCBzLndpZHRoKCksIHMuaGVpZ2h0 KCkpOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpzZXRHZW9tZXRyeSggY29uc3QgUVJlY3QgJnIg KQp7IHNldEdlb21ldHJ5KCByLmxlZnQoKSwgci50b3AoKSwgci53aWR0aCgpLCByLmhlaWdodCgp ICk7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OmRyYXdUZXh0KCBjb25zdCBRUG9pbnQgJnAsIGNv bnN0IFFTdHJpbmcgJnMgKQp7IGRyYXdUZXh0KCBwLngoKSwgcC55KCksIHMgKTsgfQoKaW5saW5l IFFXaWRnZXQgKlFXaWRnZXQ6OnBhcmVudFdpZGdldCggYm9vbCBzYW1lV2luZG93ICkgY29uc3QK ewogICAgaWYgKCBzYW1lV2luZG93ICkKCXJldHVybiBpc1RvcExldmVsKCkgPyAwIDogKFFXaWRn ZXQgKilRT2JqZWN0OjpwYXJlbnQoKTsKICAgIHJldHVybiAoUVdpZGdldCAqKVFPYmplY3Q6OnBh cmVudCgpOwp9CgppbmxpbmUgUVdpZGdldE1hcHBlciAqUVdpZGdldDo6d21hcHBlcigpCnsgcmV0 dXJuIG1hcHBlcjsgfQoKaW5saW5lIHVpbnQgUVdpZGdldDo6Z2V0V1N0YXRlKCkgY29uc3QKeyBy ZXR1cm4gd2lkZ2V0X3N0YXRlOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpzZXRXU3RhdGUoIHVp bnQgZiApCnsgd2lkZ2V0X3N0YXRlIHw9IGY7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OmNsZWFy V1N0YXRlKCB1aW50IGYgKQp7IHdpZGdldF9zdGF0ZSAmPSB+ZjsgfQoKaW5saW5lIFF0OjpXRmxh Z3MgUVdpZGdldDo6Z2V0V0ZsYWdzKCkgY29uc3QKeyByZXR1cm4gd2lkZ2V0X2ZsYWdzOyB9Cgpp bmxpbmUgdm9pZCBRV2lkZ2V0OjpzZXRXRmxhZ3MoIFdGbGFncyBmICkKeyB3aWRnZXRfZmxhZ3Mg fD0gZjsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6Y2xlYXJXRmxhZ3MoIFdGbGFncyBmICkKeyB3 aWRnZXRfZmxhZ3MgJj0gfmY7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OmNvbnN0UG9saXNoKCkg Y29uc3QKewogICAgaWYgKCAhdGVzdFdTdGF0ZShXU3RhdGVfUG9saXNoZWQpICkgewoJUVdpZGdl dCogdGhhdCA9IChRV2lkZ2V0KikgdGhpczsKCXRoYXQtPnBvbGlzaCgpOwogICAgICAgIHRoYXQt PnNldFdTdGF0ZShXU3RhdGVfUG9saXNoZWQpOyAgCiAgICB9Cn0KCmlubGluZSBib29sIFFXaWRn ZXQ6Om93bkN1cnNvcigpIGNvbnN0CnsKICAgIHJldHVybiB0ZXN0V1N0YXRlKCBXU3RhdGVfT3du Q3Vyc29yICk7Cn0KCmlubGluZSBib29sIFFXaWRnZXQ6Om93bkZvbnQoKSBjb25zdAp7CiAgICBy ZXR1cm4gb3duX2ZvbnQ7Cn0KCmlubGluZSBib29sIFFXaWRnZXQ6Om93blBhbGV0dGUoKSBjb25z dAp7CiAgICByZXR1cm4gb3duX3BhbGV0dGU7Cn0KCgogCiAKIAoKY2xhc3MgUUZvY3VzRGF0YTsK Y2xhc3MgUVdTTWFuYWdlcjsKCgoKCgoKCnN0cnVjdCAgIFFUTFdFeHRyYSB7CgogICAgUVN0cmlu ZyAgY2FwdGlvbjsJCQkJIAogICAgUVN0cmluZyAgaWNvblRleHQ7CQkJCSAKICAgIFFQaXhtYXAg Kmljb247CQkJCSAKCiAgICBRRm9jdXNEYXRhICpmb2N1c0RhdGE7CQkJIAogICAgc2hvcnQgICAg aW5jdywgaW5jaDsJCQkgCiAgICAgCiAgICB1bG9uZyAgICBmbGVmdCwgZnJpZ2h0LCBmdG9wLCBm Ym90dG9tOwogICAgdWludCAgICAgaWNvbmljOiAxOwkJCQkgCiAgICB1aW50ICAgICBmdWxsc2Ny ZWVuIDogMTsJCQkgCiAgICB1aW50ICAgICBzaG93TW9kZTogMjsJCQkgCiAgICB1aW50ICAgICBz YXZlZEZsYWdzOwkJCSAKICAgIHNob3J0ICAgIGJhc2V3LCBiYXNlaDsJCQkgCgogICAgV0lkICBw YXJlbnRXaW5JZDsJCQkJIAogICAgdWludCAgICAgZW1iZWRkZWQgOiAxOwkJCSAKICAgIHVpbnQg ICAgIHJlc2VydmVkOiAyOwkJCSAKICAgIHVpbnQgICAgIGRuZCA6IDE7CQkJCSAKICAgIHVpbnQg ICAgIHVzcG9zIDogMTsJCQkJIAogICAgdWludCAgICAgdXNzaXplIDogMTsJCQkgCiAgICB2b2lk ICAgICp4aWM7CQkJCSAKCgoKCgoKCgoKCgogICAgUVJlY3QgICAgbm9ybWFsR2VvbWV0cnk7CQkJ IAp9OwoKCgoKIAoKc3RydWN0ICAgUVdFeHRyYSB7CiAgICBRX0lOVDE2ICBtaW53LCBtaW5oOwkJ CSAKICAgIFFfSU5UMTYgIG1heHcsIG1heGg7CQkJIAogICAgUVBpeG1hcCAqYmdfcGl4OwkJCQkg CiAgICBRV2lkZ2V0ICpmb2N1c19wcm94eTsKCiAgICBRQ3Vyc29yICpjdXJzOwoKICAgIFFUTFdF eHRyYSAqdG9wZXh0cmE7CQkJIAoKCgoKICAgIFdJZCB4RG5kUHJveHk7CQkJCSAKCiMgOTQ3ICIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcXdpZGdldC5oIgoKICAgIHVpbnQgYmdfb3JpZ2luIDogMjsK CiAgICB1aW50IGNoaWxkcmVuX3VzZV9kbmQgOiAxOwoKCgoKICAgIGNoYXIgICAgIGJnX21vZGU7 CQkJCSAKICAgIGNoYXIgICAgIGJnX21vZGVfdmlzdWFsOwkJCSAKCiAgICBRU3R5bGUqIHN0eWxl OwoKICAgIFFSZWN0IG1pY3JvX2ZvY3VzX2hpbnQ7CQkJIAogICAgUVNpemVQb2xpY3kgc2l6ZV9w b2xpY3k7Cn07CgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZnJhbWUuaCIgMgoKCgoK CmNsYXNzICAgUUZyYW1lIDogcHVibGljIFFXaWRnZXQKewogICAgcHVibGljOgl2aXJ0dWFsIFFN ZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgp Owl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCog cXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9i amVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwg Ym9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2Jq ZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9i amVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFy ICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFy ICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAgIAog ICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAoKcHVibGljOgog ICAgUUZyYW1lKCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wLCBXRmxhZ3Mg Zj0wICk7CgogICAgaW50ICAgICAgICAgZnJhbWVTdHlsZSgpICAgIGNvbnN0OwogICAgdmlydHVh bCB2b2lkIHNldEZyYW1lU3R5bGUoIGludCApOwoKICAgIGludCAgICAgICAgIGZyYW1lV2lkdGgo KSAgICBjb25zdDsKICAgIFFSZWN0ICAgICAgIGNvbnRlbnRzUmVjdCgpICBjb25zdDsKCgogICAg Ym9vbCAgICAgICAgbGluZVNoYXBlc09rKCkgIGNvbnN0IHsgcmV0dXJuIFRSVUU7IH0KCgogICAg UVNpemUgICAgICAgc2l6ZUhpbnQoKSBjb25zdDsKCiAgICBlbnVtIFNoYXBlIHsgTm9GcmFtZSAg PSAwLCAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBCb3ggICAgICA9IDB4MDAw MSwgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFBhbmVsICAgID0gMHgwMDAyLCAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICAgV2luUGFuZWwgPSAweDAwMDMsICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICBITGluZSAgICA9IDB4MDAwNCwgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgIFZMaW5lICAgID0gMHgwMDA1LCAgICAgICAgICAgICAgCiAgICAgICAgICAg ICAgICAgU3R5bGVkUGFuZWwgPSAweDAwMDYsICAgICAgICAgICAKICAgICAgICAgICAgICAgICBQ b3B1cFBhbmVsID0gMHgwMDA3LCAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIE1lbnVCYXJQ YW5lbCA9IDB4MDAwOCwKICAgICAgICAgICAgICAgICBUb29sQmFyUGFuZWwgPSAweDAwMDksCgkJ IExpbmVFZGl0UGFuZWwgPSAweDAwMGEsCgkJIFRhYldpZGdldFBhbmVsID0gMHgwMDBiLAogICAg ICAgICAgICAgICAgIE1TaGFwZSAgID0gMHgwMDBmICAgICAgICAgICAgICAgCiAgICB9OwogICAg ZW51bSBTaGFkb3cgeyBQbGFpbiAgICA9IDB4MDAxMCwgICAgICAgICAgICAgCiAgICAgICAgICAg ICAgICAgIFJhaXNlZCAgID0gMHgwMDIwLCAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg U3Vua2VuICAgPSAweDAwMzAsICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBNU2hhZG93 ICA9IDB4MDBmMCB9OyAgICAgICAgICAgCgogICAgU2hhcGUgICAgICAgZnJhbWVTaGFwZSgpICAg IGNvbnN0OwogICAgdm9pZCAgICAgICAgc2V0RnJhbWVTaGFwZSggU2hhcGUgKTsKICAgIFNoYWRv dyAgICAgIGZyYW1lU2hhZG93KCkgICBjb25zdDsKICAgIHZvaWQgICAgICAgIHNldEZyYW1lU2hh ZG93KCBTaGFkb3cgKTsKCiAgICBpbnQgICAgICAgICBsaW5lV2lkdGgoKSAgICAgY29uc3Q7CiAg ICB2aXJ0dWFsIHZvaWQgc2V0TGluZVdpZHRoKCBpbnQgKTsKCiAgICBpbnQgICAgICAgICBtYXJn aW4oKSAgICAgICAgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0TWFyZ2luKCBpbnQgKTsKCiAg ICBpbnQgICAgICAgICBtaWRMaW5lV2lkdGgoKSAgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0 TWlkTGluZVdpZHRoKCBpbnQgKTsKCiAgICBRUmVjdCAgICAgICBmcmFtZVJlY3QoKSAgICAgY29u c3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVSZWN0KCBjb25zdCBRUmVjdCAmICk7Cgpwcm90 ZWN0ZWQ6CiAgICB2b2lkICAgICAgICBwYWludEV2ZW50KCBRUGFpbnRFdmVudCAqICk7CiAgICB2 b2lkICAgICAgICByZXNpemVFdmVudCggUVJlc2l6ZUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9p ZCBkcmF3RnJhbWUoIFFQYWludGVyICogKTsKICAgIHZpcnR1YWwgdm9pZCBkcmF3Q29udGVudHMo IFFQYWludGVyICogKTsKICAgIHZpcnR1YWwgdm9pZCBmcmFtZUNoYW5nZWQoKTsKCnByaXZhdGU6 CiAgICB2b2lkICAgICAgICB1cGRhdGVGcmFtZVdpZHRoKCk7CiAgICBRUmVjdCAgICAgICBmcmVj dDsKICAgIGludCAgICAgICAgIGZzdHlsZTsKICAgIHNob3J0ICAgICAgIGx3aWR0aDsKICAgIHNo b3J0ICAgICAgIG13aWR0aDsKICAgIHNob3J0ICAgICAgIG1sd2lkdGg7CiAgICBzaG9ydCAgICAg ICBmd2lkdGg7CgogICAgdm9pZCAqIGQ7CnByaXZhdGU6ICAgICAgICAgCgogICAgUUZyYW1lKCBj b25zdCBRRnJhbWUgJiApOwogICAgUUZyYW1lICZvcGVyYXRvcj0oIGNvbnN0IFFGcmFtZSAmICk7 Cgp9OwoKCmlubGluZSBpbnQgUUZyYW1lOjpmcmFtZVN0eWxlKCkgY29uc3QKeyByZXR1cm4gZnN0 eWxlOyB9CgppbmxpbmUgUUZyYW1lOjpTaGFwZSBRRnJhbWU6OmZyYW1lU2hhcGUoKSBjb25zdAp7 IHJldHVybiAoU2hhcGUpICggZnN0eWxlICYgTVNoYXBlICk7IH0KCmlubGluZSBRRnJhbWU6OlNo YWRvdyBRRnJhbWU6OmZyYW1lU2hhZG93KCkgY29uc3QKeyByZXR1cm4gKFNoYWRvdykgKCBmc3R5 bGUgJiBNU2hhZG93ICk7IH0KCmlubGluZSB2b2lkIFFGcmFtZTo6c2V0RnJhbWVTaGFwZSggUUZy YW1lOjpTaGFwZSBzICkKeyBzZXRGcmFtZVN0eWxlKCAoIGZzdHlsZSAmIE1TaGFkb3cgKSB8IHMg KTsgfQoKaW5saW5lIHZvaWQgUUZyYW1lOjpzZXRGcmFtZVNoYWRvdyggUUZyYW1lOjpTaGFkb3cg cyApCnsgc2V0RnJhbWVTdHlsZSggKCBmc3R5bGUgJiBNU2hhcGUgKSB8IHMgKTsgfQoKaW5saW5l IGludCBRRnJhbWU6OmxpbmVXaWR0aCgpIGNvbnN0CnsgcmV0dXJuIGx3aWR0aDsgfQoKaW5saW5l IGludCBRRnJhbWU6Om1pZExpbmVXaWR0aCgpIGNvbnN0CnsgcmV0dXJuIG1sd2lkdGg7IH0KCmlu bGluZSBpbnQgUUZyYW1lOjptYXJnaW4oKSBjb25zdAp7IHJldHVybiBtd2lkdGg7IH0KCmlubGlu ZSBpbnQgUUZyYW1lOjpmcmFtZVdpZHRoKCkgY29uc3QKeyByZXR1cm4gZndpZHRoOyB9CgoKCgoK IyA0MSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzY3JvbGx2aWV3LmgiIDIKCiMgMSAiL3Vzci9s b2NhbC9xdC9pbmNsdWRlL3FzY3JvbGxiYXIuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFUaW1lcjsKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1 ZGUvcXJhbmdlY29udHJvbC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgpjbGFzcyBRUmFuZ2VDb250cm9sUHJpdmF0ZTsKCgpjbGFzcyAgIFFSYW5n ZUNvbnRyb2wKewpwdWJsaWM6CiAgICBRUmFuZ2VDb250cm9sKCk7CiAgICBRUmFuZ2VDb250cm9s KCBpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwKCQkgICBpbnQgbGluZVN0ZXAsIGludCBwYWdl U3RlcCwgaW50IHZhbHVlICk7CiAgICB2aXJ0dWFsIH5RUmFuZ2VDb250cm9sKCk7CiAgICBpbnQJ CXZhbHVlKCkJCWNvbnN0OwogICAgdm9pZAlzZXRWYWx1ZSggaW50ICk7CiAgICB2b2lkCWFkZFBh Z2UoKTsKICAgIHZvaWQJc3VidHJhY3RQYWdlKCk7CiAgICB2b2lkCWFkZExpbmUoKTsKICAgIHZv aWQJc3VidHJhY3RMaW5lKCk7CgogICAgaW50CQltaW5WYWx1ZSgpCWNvbnN0OwogICAgaW50CQlt YXhWYWx1ZSgpCWNvbnN0OwogICAgdm9pZAlzZXRSYW5nZSggaW50IG1pblZhbHVlLCBpbnQgbWF4 VmFsdWUgKTsKICAgIHZvaWQJc2V0TWluVmFsdWUoIGludCBtaW5WYWwgKTsKICAgIHZvaWQJc2V0 TWF4VmFsdWUoIGludCBtaW5WYWwgKTsKCiAgICBpbnQJCWxpbmVTdGVwKCkJY29uc3Q7CiAgICBp bnQJCXBhZ2VTdGVwKCkJY29uc3Q7CiAgICB2b2lkCXNldFN0ZXBzKCBpbnQgbGluZSwgaW50IHBh Z2UgKTsKCiAgICBpbnQJCWJvdW5kKCBpbnQgKSBjb25zdDsKCnByb3RlY3RlZDoKICAgIGludAkJ cG9zaXRpb25Gcm9tVmFsdWUoIGludCB2YWwsIGludCBzcGFjZSApIGNvbnN0OwogICAgaW50CQl2 YWx1ZUZyb21Qb3NpdGlvbiggaW50IHBvcywgaW50IHNwYWNlICkgY29uc3Q7CiAgICB2b2lkCWRp cmVjdFNldFZhbHVlKCBpbnQgdmFsICk7CiAgICBpbnQJCXByZXZWYWx1ZSgpCWNvbnN0OwoKICAg IHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZSgpOwogICAgdmlydHVhbCB2b2lkIHJhbmdlQ2hhbmdl KCk7CiAgICB2aXJ0dWFsIHZvaWQgc3RlcENoYW5nZSgpOwoKcHJpdmF0ZToKICAgIGludAkJbWlu VmFsLCBtYXhWYWw7CiAgICBpbnQJCWxpbmUsIHBhZ2U7CiAgICBpbnQJCXZhbCwgcHJldlZhbDsK CiAgICBRUmFuZ2VDb250cm9sUHJpdmF0ZSAqIGQ7Cgpwcml2YXRlOgkgCgogICAgUVJhbmdlQ29u dHJvbCggY29uc3QgUVJhbmdlQ29udHJvbCAmICk7CiAgICBRUmFuZ2VDb250cm9sICZvcGVyYXRv cj0oIGNvbnN0IFFSYW5nZUNvbnRyb2wgJiApOwoKfTsKCgppbmxpbmUgaW50IFFSYW5nZUNvbnRy b2w6OnZhbHVlKCkgY29uc3QKeyByZXR1cm4gdmFsOyB9CgppbmxpbmUgaW50IFFSYW5nZUNvbnRy b2w6OnByZXZWYWx1ZSgpIGNvbnN0CnsgcmV0dXJuIHByZXZWYWw7IH0KCmlubGluZSBpbnQgUVJh bmdlQ29udHJvbDo6bWluVmFsdWUoKSBjb25zdAp7IHJldHVybiBtaW5WYWw7IH0KCmlubGluZSBp bnQgUVJhbmdlQ29udHJvbDo6bWF4VmFsdWUoKSBjb25zdAp7IHJldHVybiBtYXhWYWw7IH0KCmlu bGluZSBpbnQgUVJhbmdlQ29udHJvbDo6bGluZVN0ZXAoKSBjb25zdAp7IHJldHVybiBsaW5lOyB9 CgppbmxpbmUgaW50IFFSYW5nZUNvbnRyb2w6OnBhZ2VTdGVwKCkgY29uc3QKeyByZXR1cm4gcGFn ZTsgfQoKCgoKCgpjbGFzcyBRU3BpbldpZGdldFByaXZhdGU7CmNsYXNzICAgUVNwaW5XaWRnZXQg OiBwdWJsaWMgUVdpZGdldAp7CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFP YmplY3QoKSBjb25zdCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25z dCBjaGFyICpjbGFzc05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBj aGFyKiApOyB2aXJ0dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFs IGJvb2wgcXRfZW1pdCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5 KCBpbnQsIGludCwgUVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFP YmplY3QoKTsJUU9iamVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0 YXRpYyBRU3RyaW5nIHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGlj IFFTdHJpbmcgdHJVdGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZh dGU6CXN0YXRpYyBRTWV0YU9iamVjdCAqbWV0YU9iajsgCnB1YmxpYzoKICAgIFFTcGluV2lkZ2V0 KCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICB+UVNwaW5XaWRn ZXQoKTsKCiAgICB2b2lkIAlzZXRFZGl0V2lkZ2V0KCBRV2lkZ2V0ICogd2lkZ2V0ICk7CiAgICBR V2lkZ2V0ICogCWVkaXRXaWRnZXQoKTsKCiAgICBRUmVjdCB1cFJlY3QoKSBjb25zdDsKICAgIFFS ZWN0IGRvd25SZWN0KCkgY29uc3Q7CgogICAgdm9pZCBzZXRVcEVuYWJsZWQoIGJvb2wgb24gKTsK ICAgIHZvaWQgc2V0RG93bkVuYWJsZWQoIGJvb2wgb24gKTsKCiAgICBib29sIGlzVXBFbmFibGVk KCkgY29uc3Q7CiAgICBib29sIGlzRG93bkVuYWJsZWQoKSBjb25zdDsKCiAgICBlbnVtIEJ1dHRv blN5bWJvbHMgeyBVcERvd25BcnJvd3MsIFBsdXNNaW51cyB9OwogICAgdmlydHVhbCB2b2lkCXNl dEJ1dHRvblN5bWJvbHMoIEJ1dHRvblN5bWJvbHMgYnMgKTsKICAgIEJ1dHRvblN5bWJvbHMJYnV0 dG9uU3ltYm9scygpIGNvbnN0OwoKICAgIHZvaWQgYXJyYW5nZSgpOwoKcHJvdGVjdGVkIDoKICAg IHZvaWQgc3RlcFVwUHJlc3NlZCgpOwogICAgdm9pZCBzdGVwRG93blByZXNzZWQoKTsKCnB1Ymxp YyAgOgogICAgdm9pZCBzdGVwVXAoKTsKICAgIHZvaWQgc3RlcERvd24oKTsKICAgIApwcm90ZWN0 ZWQ6CiAgICB2b2lkIG1vdXNlUHJlc3NFdmVudCggUU1vdXNlRXZlbnQgKmUgKTsKICAgIHZvaWQg cmVzaXplRXZlbnQoIFFSZXNpemVFdmVudCogZXYgKTsKICAgIHZvaWQgbW91c2VSZWxlYXNlRXZl bnQoIFFNb3VzZUV2ZW50ICplICk7CiAgICB2b2lkIG1vdXNlTW92ZUV2ZW50KCBRTW91c2VFdmVu dCAqZSApOwoKICAgIHZvaWQgd2hlZWxFdmVudCggUVdoZWVsRXZlbnQgKiApOwoKICAgIHZvaWQg c3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKICAgIHZvaWQgcGFpbnRFdmVudCggUVBhaW50RXZlbnQg KiApOwogICAgdm9pZCBlbmFibGVDaGFuZ2VkKCBib29sIG9sZCApOwogICAgdm9pZCB3aW5kb3dB Y3RpdmF0aW9uQ2hhbmdlKCBib29sICk7Cgpwcml2YXRlICA6CiAgICB2b2lkIHRpbWVyRG9uZSgp OwogICAgdm9pZCB0aW1lckRvbmVFeCgpOwoKcHJpdmF0ZToKICAgIFFTcGluV2lkZ2V0UHJpdmF0 ZSAqIGQ7CgogICAgdm9pZCB1cGRhdGVEaXNwbGF5KCk7Cgpwcml2YXRlOgkgCgogICAgUVNwaW5X aWRnZXQoIGNvbnN0IFFTcGluV2lkZ2V0JiApOwogICAgUVNwaW5XaWRnZXQmIG9wZXJhdG9yPSgg Y29uc3QgUVNwaW5XaWRnZXQmICk7Cgp9OwoKCgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3FzY3JvbGxiYXIuaCIgMgoKCgoKCgpjbGFzcyAgIFFTY3JvbGxCYXIgOiBwdWJsaWMgUVdpZGdl dCwgcHVibGljIFFSYW5nZUNvbnRyb2wKewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0 ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1 YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCgg Y29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsg dmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9w cm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0 aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhp czsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7 IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7 IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAoKcHVibGljOgogICAgUVNjcm9sbEJhcigg UVdpZGdldCAqcGFyZW50LCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKICAgIFFTY3JvbGxCYXIoIE9y aWVudGF0aW9uLCBRV2lkZ2V0ICpwYXJlbnQsIGNvbnN0IGNoYXIqIG5hbWU9MCApOwogICAgUVNj cm9sbEJhciggaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsIGludCBMaW5lU3RlcCwgaW50IFBh Z2VTdGVwLAoJCWludCB2YWx1ZSwgT3JpZW50YXRpb24sCgkJUVdpZGdldCAqcGFyZW50LCBjb25z dCBjaGFyKiBuYW1lPTAgKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0T3JpZW50YXRpb24oIE9yaWVu dGF0aW9uICk7CiAgICBPcmllbnRhdGlvbiBvcmllbnRhdGlvbigpIGNvbnN0OwogICAgdmlydHVh bCB2b2lkIHNldFRyYWNraW5nKCBib29sIGVuYWJsZSApOwogICAgYm9vbAl0cmFja2luZygpIGNv bnN0OwogICAgYm9vbAlkcmFnZ2luZ1NsaWRlcigpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBz ZXRQYWxldHRlKCBjb25zdCBRUGFsZXR0ZSAmICk7CiAgICBRU2l6ZQlzaXplSGludCgpIGNvbnN0 OwoKICAgIGludAkgbWluVmFsdWUoKSBjb25zdDsKICAgIGludAkgbWF4VmFsdWUoKSBjb25zdDsK ICAgIHZvaWQgc2V0TWluVmFsdWUoIGludCApOwogICAgdm9pZCBzZXRNYXhWYWx1ZSggaW50ICk7 CiAgICBpbnQJIGxpbmVTdGVwKCkgY29uc3Q7CiAgICBpbnQJIHBhZ2VTdGVwKCkgY29uc3Q7CiAg ICB2b2lkIHNldExpbmVTdGVwKCBpbnQgKTsKICAgIHZvaWQgc2V0UGFnZVN0ZXAoIGludCApOwog ICAgaW50ICB2YWx1ZSgpIGNvbnN0OwoKICAgIGludAkJc2xpZGVyU3RhcnQoKSBjb25zdDsKICAg IFFSZWN0CXNsaWRlclJlY3QoKSBjb25zdDsKCnB1YmxpYyAgOgogICAgdm9pZCBzZXRWYWx1ZSgg aW50ICk7Cgpwcm90ZWN0ZWQgOgogICAgdm9pZAl2YWx1ZUNoYW5nZWQoIGludCB2YWx1ZSApOwog ICAgdm9pZAlzbGlkZXJQcmVzc2VkKCk7CiAgICB2b2lkCXNsaWRlck1vdmVkKCBpbnQgdmFsdWUg KTsKICAgIHZvaWQJc2xpZGVyUmVsZWFzZWQoKTsKICAgIHZvaWQJbmV4dExpbmUoKTsKICAgIHZv aWQJcHJldkxpbmUoKTsKICAgIHZvaWQJbmV4dFBhZ2UoKTsKICAgIHZvaWQJcHJldlBhZ2UoKTsK CnByb3RlY3RlZDoKCiAgICB2b2lkIAl3aGVlbEV2ZW50KCBRV2hlZWxFdmVudCAqICk7CgogICAg dm9pZAlrZXlQcmVzc0V2ZW50KCBRS2V5RXZlbnQgKiApOwogICAgdm9pZAlyZXNpemVFdmVudCgg UVJlc2l6ZUV2ZW50ICogKTsKICAgIHZvaWQJcGFpbnRFdmVudCggUVBhaW50RXZlbnQgKiApOwoK ICAgIHZvaWQJbW91c2VQcmVzc0V2ZW50KCBRTW91c2VFdmVudCAqICk7CiAgICB2b2lkCW1vdXNl UmVsZWFzZUV2ZW50KCBRTW91c2VFdmVudCAqICk7CiAgICB2b2lkCW1vdXNlTW92ZUV2ZW50KCBR TW91c2VFdmVudCAqICk7CiAgICB2b2lkCWNvbnRleHRNZW51RXZlbnQoIFFDb250ZXh0TWVudUV2 ZW50ICogKTsKICAgIHZvaWQJaGlkZUV2ZW50KCBRSGlkZUV2ZW50KiApOwoKICAgIHZvaWQJdmFs dWVDaGFuZ2UoKTsKICAgIHZvaWQJc3RlcENoYW5nZSgpOwogICAgdm9pZAlyYW5nZUNoYW5nZSgp OwoKICAgIHZvaWQJc3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKCnByaXZhdGUgIDoKICAgIHZvaWQg ZG9BdXRvUmVwZWF0KCk7Cgpwcml2YXRlOgogICAgdm9pZCBpbml0KCk7CiAgICB2b2lkIHBvc2l0 aW9uU2xpZGVyRnJvbVZhbHVlKCk7CiAgICBpbnQgY2FsY3VsYXRlVmFsdWVGcm9tU2xpZGVyKCkg Y29uc3Q7CgogICAgdm9pZCBzdGFydEF1dG9SZXBlYXQoKTsKICAgIHZvaWQgc3RvcEF1dG9SZXBl YXQoKTsKCiAgICBpbnQgcmFuZ2VWYWx1ZVRvU2xpZGVyUG9zKCBpbnQgdmFsICkgY29uc3Q7CiAg ICBpbnQgc2xpZGVyUG9zVG9SYW5nZVZhbHVlKCBpbnQgIHZhbCApIGNvbnN0OwoKICAgIHZvaWQg YWN0aW9uKCBpbnQgY29udHJvbCApOwoKICAgIHZvaWQgZHJhd0NvbnRyb2xzKCB1aW50IGNvbnRy b2xzLCB1aW50IGFjdGl2ZUNvbnRyb2wgKSBjb25zdDsKICAgIHZvaWQgZHJhd0NvbnRyb2xzKCB1 aW50IGNvbnRyb2xzLCB1aW50IGFjdGl2ZUNvbnRyb2wsCgkJCQlRUGFpbnRlciAqcCApIGNvbnN0 OwoKICAgIHVpbnQgcHJlc3NlZENvbnRyb2w7CiAgICBib29sIHRyYWNrOwogICAgYm9vbCBjbGlj a2VkQXQ7CiAgICBPcmllbnRhdGlvbiBvcmllbnQ7CgogICAgaW50IHNsaWRlUHJldlZhbDsKICAg IFFDT09SRCBzbGlkZXJQb3M7CiAgICBRQ09PUkQgY2xpY2tPZmZzZXQ7CgogICAgUVRpbWVyICog cmVwZWF0ZXI7CiAgICB2b2lkICogZDsKCnByaXZhdGU6CSAKCiAgICBRU2Nyb2xsQmFyKCBjb25z dCBRU2Nyb2xsQmFyICYgKTsKICAgIFFTY3JvbGxCYXIgJm9wZXJhdG9yPSggY29uc3QgUVNjcm9s bEJhciAmICk7Cgp9OwoKCmlubGluZSB2b2lkIFFTY3JvbGxCYXI6OnNldFRyYWNraW5nKCBib29s IHQgKQp7CiAgICB0cmFjayA9IHQ7Cn0KCmlubGluZSBib29sIFFTY3JvbGxCYXI6OnRyYWNraW5n KCkgY29uc3QKewogICAgcmV0dXJuIHRyYWNrOwp9CgppbmxpbmUgUVNjcm9sbEJhcjo6T3JpZW50 YXRpb24gUVNjcm9sbEJhcjo6b3JpZW50YXRpb24oKSBjb25zdAp7CiAgICByZXR1cm4gb3JpZW50 Owp9CgppbmxpbmUgaW50IFFTY3JvbGxCYXI6OnNsaWRlclN0YXJ0KCkgY29uc3QKewogICAgcmV0 dXJuIHNsaWRlclBvczsKfQoKCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xc2Nyb2xs dmlldy5oIiAyCgoKCgoKY2xhc3MgUVNjcm9sbFZpZXdEYXRhOwoKY2xhc3MgICBRU2Nyb2xsVmll dyA6IHB1YmxpYyBRRnJhbWUKewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0ICptZXRh T2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1YWwgY29u c3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCggY29uc3Qg Y2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsgdmlydHVh bCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9wcm9wZXJ0 eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0aWNNZXRh T2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhpczsgfSBz dGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IHN0YXRp YyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IAlwcml2 YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAgIAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAoKICAgICAKCgpwdWJsaWM6CiAg ICBRU2Nyb2xsVmlldyhRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wLCBXRmxh Z3MgZj0wKTsKICAgIH5RU2Nyb2xsVmlldygpOwoKICAgIGVudW0gUmVzaXplUG9saWN5IHsgRGVm YXVsdCwgTWFudWFsLCBBdXRvT25lLCBBdXRvT25lRml0IH07CiAgICB2aXJ0dWFsIHZvaWQgc2V0 UmVzaXplUG9saWN5KCBSZXNpemVQb2xpY3kgKTsKICAgIFJlc2l6ZVBvbGljeSByZXNpemVQb2xp Y3koKSBjb25zdDsKCiAgICB2b2lkIHN0eWxlQ2hhbmdlKFFTdHlsZSYpOwogICAgdm9pZCByZW1v dmVDaGlsZChRV2lkZ2V0KiBjaGlsZCk7CiAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoIFFXaWRn ZXQqIGNoaWxkLCBpbnQgeD0wLCBpbnQgeT0wICk7CiAgICB2aXJ0dWFsIHZvaWQgbW92ZUNoaWxk KCBRV2lkZ2V0KiBjaGlsZCwgaW50IHgsIGludCB5ICk7CiAgICBpbnQgY2hpbGRYKFFXaWRnZXQq IGNoaWxkKTsKICAgIGludCBjaGlsZFkoUVdpZGdldCogY2hpbGQpOwogICAgYm9vbCBjaGlsZElz VmlzaWJsZShRV2lkZ2V0KiBjaGlsZCkgeyByZXR1cm4gY2hpbGQtPmlzVmlzaWJsZSgpOyB9ICAK ICAgIHZvaWQgc2hvd0NoaWxkKFFXaWRnZXQqIGNoaWxkLCBib29sIHllcz1UUlVFKSB7CglpZiAo IHllcyApCgkgICAgY2hpbGQtPnNob3coKTsKCWVsc2UKCSAgICBjaGlsZC0+aGlkZSgpOwogICAg fQoKICAgIGVudW0gU2Nyb2xsQmFyTW9kZSB7IEF1dG8sIEFsd2F5c09mZiwgQWx3YXlzT24gfTsK CiAgICBTY3JvbGxCYXJNb2RlIHZTY3JvbGxCYXJNb2RlKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZv aWQgIHNldFZTY3JvbGxCYXJNb2RlKCBTY3JvbGxCYXJNb2RlICk7CgogICAgU2Nyb2xsQmFyTW9k ZSBoU2Nyb2xsQmFyTW9kZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkICBzZXRIU2Nyb2xsQmFy TW9kZSggU2Nyb2xsQmFyTW9kZSApOwoKICAgIFFXaWRnZXQqICAgICBjb3JuZXJXaWRnZXQoKSBj b25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRDb3JuZXJXaWRnZXQoUVdpZGdldCopOwoKICAgIFFT Y3JvbGxCYXIqICBob3Jpem9udGFsU2Nyb2xsQmFyKCkgY29uc3Q7CiAgICBRU2Nyb2xsQmFyKiAg dmVydGljYWxTY3JvbGxCYXIoKSBjb25zdDsKICAgIFFXaWRnZXQqCSB2aWV3cG9ydCgpIGNvbnN0 OwogICAgUVdpZGdldCoJIGNsaXBwZXIoKSBjb25zdDsKCiAgICBpbnQJCXZpc2libGVXaWR0aCgp IGNvbnN0OwogICAgaW50CQl2aXNpYmxlSGVpZ2h0KCkgY29uc3Q7CgogICAgaW50CQljb250ZW50 c1dpZHRoKCkgY29uc3Q7CiAgICBpbnQJCWNvbnRlbnRzSGVpZ2h0KCkgY29uc3Q7CiAgICBpbnQJ CWNvbnRlbnRzWCgpIGNvbnN0OwogICAgaW50CQljb250ZW50c1koKSBjb25zdDsKCiAgICB2b2lk CXJlc2l6ZSggaW50IHcsIGludCBoICk7CiAgICB2b2lkCXJlc2l6ZSggY29uc3QgUVNpemUmICk7 CiAgICB2b2lkCXNob3coKTsKCiAgICB2b2lkCXVwZGF0ZUNvbnRlbnRzKCBpbnQgeCwgaW50IHks IGludCB3LCBpbnQgaCApOwogICAgdm9pZAl1cGRhdGVDb250ZW50cyggY29uc3QgUVJlY3QmIHIg KTsKICAgIHZvaWQgCXVwZGF0ZUNvbnRlbnRzKCk7CiAgICB2b2lkCXJlcGFpbnRDb250ZW50cygg aW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGJvb2wgZXJhc2U9VFJVRSApOwogICAgdm9pZAly ZXBhaW50Q29udGVudHMoIGNvbnN0IFFSZWN0JiByLCBib29sIGVyYXNlPVRSVUUgKTsKICAgIHZv aWQgCXJlcGFpbnRDb250ZW50cyggYm9vbCBlcmFzZT1UUlVFICk7CiAgICB2b2lkCWNvbnRlbnRz VG9WaWV3cG9ydCggaW50IHgsIGludCB5LCBpbnQmIHZ4LCBpbnQmIHZ5ICkgY29uc3Q7CiAgICB2 b2lkCXZpZXdwb3J0VG9Db250ZW50cyggaW50IHZ4LCBpbnQgdnksIGludCYgeCwgaW50JiB5ICkg Y29uc3Q7CiAgICBRUG9pbnQJY29udGVudHNUb1ZpZXdwb3J0KCBjb25zdCBRUG9pbnQmICkgY29u c3Q7CiAgICBRUG9pbnQJdmlld3BvcnRUb0NvbnRlbnRzKCBjb25zdCBRUG9pbnQmICkgY29uc3Q7 CiAgICB2b2lkCWVuYWJsZUNsaXBwZXIoIGJvb2wgeSApOwoKICAgIHZvaWQJc2V0U3RhdGljQmFj a2dyb3VuZCggYm9vbCB5ICk7CiAgICBib29sCWhhc1N0YXRpY0JhY2tncm91bmQoKSBjb25zdDsK CiAgICBRU2l6ZQl2aWV3cG9ydFNpemUoIGludCwgaW50ICkgY29uc3Q7CiAgICBRU2l6ZQlzaXpl SGludCgpIGNvbnN0OwogICAgUVNpemUJbWluaW11bVNpemVIaW50KCkgY29uc3Q7CgogICAgdm9p ZAlyZW1vdmVDaGlsZChRT2JqZWN0KiBjaGlsZCk7CgoKICAgIHZpcnR1YWwgdm9pZCBzZXREcmFn QXV0b1Njcm9sbCggYm9vbCBiICk7CiAgICBib29sCSBkcmFnQXV0b1Njcm9sbCgpIGNvbnN0OwoK CnByb3RlY3RlZCA6CiAgICB2b2lkCWNvbnRlbnRzTW92aW5nKGludCB4LCBpbnQgeSk7CgpwdWJs aWMgIDoKICAgIHZpcnR1YWwgdm9pZCByZXNpemVDb250ZW50cyggaW50IHcsIGludCBoICk7CiAg ICB2b2lkCXNjcm9sbEJ5KCBpbnQgZHgsIGludCBkeSApOwogICAgdmlydHVhbCB2b2lkIHNldENv bnRlbnRzUG9zKCBpbnQgeCwgaW50IHkgKTsKICAgIHZvaWQJZW5zdXJlVmlzaWJsZShpbnQgeCwg aW50IHkpOwogICAgdm9pZAllbnN1cmVWaXNpYmxlKGludCB4LCBpbnQgeSwgaW50IHhtYXJnaW4s IGludCB5bWFyZ2luKTsKICAgIHZvaWQJY2VudGVyKGludCB4LCBpbnQgeSk7CiAgICB2b2lkCWNl bnRlcihpbnQgeCwgaW50IHksIGZsb2F0IHhtYXJnaW4sIGZsb2F0IHltYXJnaW4pOwoKICAgIHZv aWQJdXBkYXRlU2Nyb2xsQmFycygpOwogICAgdm9pZAlzZXRFbmFibGVkKCBib29sIGVuYWJsZSAp OwoKcHJvdGVjdGVkOgogICAgdmlydHVhbCB2b2lkIGRyYXdDb250ZW50cyhRUGFpbnRlciosIGlu dCBjeCwgaW50IGN5LCBpbnQgY3csIGludCBjaCk7CiAgICB2aXJ0dWFsIHZvaWQgZHJhd0NvbnRl bnRzT2Zmc2V0KFFQYWludGVyKiwgaW50IG94LCBpbnQgb3ksCgkJICAgIGludCBjeCwgaW50IGN5 LCBpbnQgY3csIGludCBjaCk7CgoKICAgIHZpcnR1YWwgdm9pZCBjb250ZW50c01vdXNlUHJlc3NF dmVudCggUU1vdXNlRXZlbnQqICk7CiAgICB2aXJ0dWFsIHZvaWQgY29udGVudHNNb3VzZVJlbGVh c2VFdmVudCggUU1vdXNlRXZlbnQqICk7CiAgICB2aXJ0dWFsIHZvaWQgY29udGVudHNNb3VzZURv dWJsZUNsaWNrRXZlbnQoIFFNb3VzZUV2ZW50KiApOwogICAgdmlydHVhbCB2b2lkIGNvbnRlbnRz TW91c2VNb3ZlRXZlbnQoIFFNb3VzZUV2ZW50KiApOwoKICAgIHZpcnR1YWwgdm9pZCBjb250ZW50 c0RyYWdFbnRlckV2ZW50KCBRRHJhZ0VudGVyRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIGNv bnRlbnRzRHJhZ01vdmVFdmVudCggUURyYWdNb3ZlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lk IGNvbnRlbnRzRHJhZ0xlYXZlRXZlbnQoIFFEcmFnTGVhdmVFdmVudCAqICk7CiAgICB2aXJ0dWFs IHZvaWQgY29udGVudHNEcm9wRXZlbnQoIFFEcm9wRXZlbnQgKiApOwoKCiAgICB2aXJ0dWFsIHZv aWQgY29udGVudHNXaGVlbEV2ZW50KCBRV2hlZWxFdmVudCAqICk7CgogICAgdmlydHVhbCB2b2lk IGNvbnRlbnRzQ29udGV4dE1lbnVFdmVudCggUUNvbnRleHRNZW51RXZlbnQgKiApOwoKCiAgICB2 aXJ0dWFsIHZvaWQgdmlld3BvcnRQYWludEV2ZW50KCBRUGFpbnRFdmVudCogKTsKICAgIHZpcnR1 YWwgdm9pZCB2aWV3cG9ydFJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQqICk7CiAgICB2aXJ0dWFs IHZvaWQgdmlld3BvcnRNb3VzZVByZXNzRXZlbnQoIFFNb3VzZUV2ZW50KiApOwogICAgdmlydHVh bCB2b2lkIHZpZXdwb3J0TW91c2VSZWxlYXNlRXZlbnQoIFFNb3VzZUV2ZW50KiApOwogICAgdmly dHVhbCB2b2lkIHZpZXdwb3J0TW91c2VEb3VibGVDbGlja0V2ZW50KCBRTW91c2VFdmVudCogKTsK ICAgIHZpcnR1YWwgdm9pZCB2aWV3cG9ydE1vdXNlTW92ZUV2ZW50KCBRTW91c2VFdmVudCogKTsK CiAgICB2aXJ0dWFsIHZvaWQgdmlld3BvcnREcmFnRW50ZXJFdmVudCggUURyYWdFbnRlckV2ZW50 ICogKTsKICAgIHZpcnR1YWwgdm9pZCB2aWV3cG9ydERyYWdNb3ZlRXZlbnQoIFFEcmFnTW92ZUV2 ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCB2aWV3cG9ydERyYWdMZWF2ZUV2ZW50KCBRRHJhZ0xl YXZlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIHZpZXdwb3J0RHJvcEV2ZW50KCBRRHJvcEV2 ZW50ICogKTsKCgogICAgdmlydHVhbCB2b2lkIHZpZXdwb3J0V2hlZWxFdmVudCggUVdoZWVsRXZl bnQgKiApOwoKICAgIHZpcnR1YWwgdm9pZCB2aWV3cG9ydENvbnRleHRNZW51RXZlbnQoIFFDb250 ZXh0TWVudUV2ZW50ICogKTsKCiAgICB2b2lkCWZyYW1lQ2hhbmdlZCgpOwoKICAgIHZpcnR1YWwg dm9pZCBzZXRNYXJnaW5zKGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20p OwogICAgaW50IGxlZnRNYXJnaW4oKSBjb25zdDsKICAgIGludCB0b3BNYXJnaW4oKSBjb25zdDsK ICAgIGludCByaWdodE1hcmdpbigpIGNvbnN0OwogICAgaW50IGJvdHRvbU1hcmdpbigpIGNvbnN0 OwoKICAgIGJvb2wgZm9jdXNOZXh0UHJldkNoaWxkKCBib29sIG5leHQgKTsKCiAgICB2aXJ0dWFs IHZvaWQgc2V0SEJhckdlb21ldHJ5KFFTY3JvbGxCYXImIGhiYXIsIGludCB4LCBpbnQgeSwgaW50 IHcsIGludCBoKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRWQmFyR2VvbWV0cnkoUVNjcm9sbEJhciYg dmJhciwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwoKICAgIHZvaWQJcmVzaXplRXZlbnQo UVJlc2l6ZUV2ZW50Kik7CiAgICB2b2lkIAltb3VzZVByZXNzRXZlbnQoIFFNb3VzZUV2ZW50ICog KTsKICAgIHZvaWQgCW1vdXNlUmVsZWFzZUV2ZW50KCBRTW91c2VFdmVudCAqICk7CiAgICB2b2lk IAltb3VzZURvdWJsZUNsaWNrRXZlbnQoIFFNb3VzZUV2ZW50ICogKTsKICAgIHZvaWQgCW1vdXNl TW92ZUV2ZW50KCBRTW91c2VFdmVudCAqICk7CgogICAgdm9pZCAJd2hlZWxFdmVudCggUVdoZWVs RXZlbnQgKiApOwoKICAgIHZvaWQJY29udGV4dE1lbnVFdmVudCggUUNvbnRleHRNZW51RXZlbnQg KiApOwogICAgYm9vbAlldmVudEZpbHRlciggUU9iamVjdCAqLCBRRXZlbnQgKmUgKTsKCgpwcml2 YXRlOgogICAgdm9pZCBkcmF3Q29udGVudHMoIFFQYWludGVyKiApOwogICAgdm9pZCBtb3ZlQ29u dGVudHMoaW50IHgsIGludCB5KTsKCiAgICBRU2Nyb2xsVmlld0RhdGEqIGQ7Cgpwcml2YXRlICA6 CiAgICB2b2lkIGhzbGlkZShpbnQpOwogICAgdm9pZCB2c2xpZGUoaW50KTsKCiAgICB2b2lkIGRv RHJhZ0F1dG9TY3JvbGwoKTsKICAgIHZvaWQgc3RhcnREcmFnQXV0b1Njcm9sbCgpOwogICAgdm9p ZCBzdG9wRHJhZ0F1dG9TY3JvbGwoKTsKCgpwcml2YXRlOgkgCgogICAgUVNjcm9sbFZpZXcoIGNv bnN0IFFTY3JvbGxWaWV3ICYgKTsKICAgIFFTY3JvbGxWaWV3ICZvcGVyYXRvcj0oIGNvbnN0IFFT Y3JvbGxWaWV3ICYgKTsKCiAgICB2b2lkIGNoYW5nZUZyYW1lUmVjdChjb25zdCBRUmVjdCYpOwp9 OwoKCgoKIyA0MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FjYW52YXMuaCIgMgoKIyAxICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcXBpeG1hcC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFHZng7CmNsYXNzIFFQaXhtYXBQcml2YXRlOwoK CgoKCgoKY2xhc3MgICBRUGl4bWFwIDogcHVibGljIFFQYWludERldmljZSwgcHVibGljIFF0CnsK cHVibGljOgogICAgZW51bSBDb2xvck1vZGUgeyBBdXRvLCBDb2xvciwgTW9ubyB9OwogICAgZW51 bSBPcHRpbWl6YXRpb24geyBEZWZhdWx0T3B0aW0sIE5vT3B0aW0sIE1lbW9yeU9wdGltPU5vT3B0 aW0sCgkJCU5vcm1hbE9wdGltLCBCZXN0T3B0aW0gfTsKCiAgICBRUGl4bWFwKCk7CiAgICBRUGl4 bWFwKCBjb25zdCBRSW1hZ2UmIGltYWdlICk7CiAgICBRUGl4bWFwKCBpbnQgdywgaW50IGgsICBp bnQgZGVwdGggPSAtMSwgT3B0aW1pemF0aW9uID0gRGVmYXVsdE9wdGltICk7CiAgICBRUGl4bWFw KCBjb25zdCBRU2l6ZSAmLCBpbnQgZGVwdGggPSAtMSwgT3B0aW1pemF0aW9uID0gRGVmYXVsdE9w dGltICk7CgogICAgUVBpeG1hcCggY29uc3QgUVN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IGNoYXIg KmZvcm1hdD0wLAoJICAgICBDb2xvck1vZGUgbW9kZT1BdXRvICk7CiAgICBRUGl4bWFwKCBjb25z dCBRU3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgY2hhciAqZm9ybWF0LAoJICAgICBpbnQgY29udmVy c2lvbl9mbGFncyApOwogICAgUVBpeG1hcCggY29uc3QgY2hhciAqeHBtW10gKTsgIAogICAgUVBp eG1hcCggY29uc3QgUUJ5dGVBcnJheSAmZGF0YSApOwoKICAgIFFQaXhtYXAoIGNvbnN0IFFQaXht YXAgJiApOwogICB+UVBpeG1hcCgpOwoKICAgIFFQaXhtYXAgICAgJm9wZXJhdG9yPSggY29uc3Qg UVBpeG1hcCAmICk7CiAgICBRUGl4bWFwICAgICZvcGVyYXRvcj0oIGNvbnN0IFFJbWFnZQkgJiAp OwoKICAgIGJvb2wJaXNOdWxsKCkJY29uc3Q7CgogICAgaW50CQl3aWR0aCgpCQljb25zdCB7IHJl dHVybiBkYXRhLT53OyB9CiAgICBpbnQJCWhlaWdodCgpCWNvbnN0IHsgcmV0dXJuIGRhdGEtPmg7 IH0KICAgIFFTaXplCXNpemUoKQkJY29uc3QgeyByZXR1cm4gUVNpemUoZGF0YS0+dyxkYXRhLT5o KTsgfQogICAgUVJlY3QJcmVjdCgpCQljb25zdCB7IHJldHVybiBRUmVjdCgwLDAsZGF0YS0+dyxk YXRhLT5oKTsgfQogICAgaW50CQlkZXB0aCgpCQljb25zdCB7IHJldHVybiBkYXRhLT5kOyB9CiAg ICBzdGF0aWMgaW50CWRlZmF1bHREZXB0aCgpOwoKICAgIHZvaWQJZmlsbCggY29uc3QgUUNvbG9y ICZmaWxsQ29sb3IgPSBRdDo6d2hpdGUgKTsKICAgIHZvaWQJZmlsbCggY29uc3QgUVdpZGdldCAq LCBpbnQgeG9mcywgaW50IHlvZnMgKTsKICAgIHZvaWQJZmlsbCggY29uc3QgUVdpZGdldCAqLCBj b25zdCBRUG9pbnQgJm9mcyApOwogICAgdm9pZAlyZXNpemUoIGludCB3aWR0aCwgaW50IGhlaWdo dCApOwogICAgdm9pZAlyZXNpemUoIGNvbnN0IFFTaXplICYgKTsKCiAgICBjb25zdCBRQml0bWFw ICptYXNrKCkgY29uc3Q7CiAgICB2b2lkCXNldE1hc2soIGNvbnN0IFFCaXRtYXAgJiApOwogICAg Ym9vbAlzZWxmTWFzaygpIGNvbnN0OwoKICAgIFFCaXRtYXAJY3JlYXRlSGV1cmlzdGljTWFzaygg Ym9vbCBjbGlwVGlnaHQgPSBUUlVFICkgY29uc3Q7CgogICAgc3RhdGljICBRUGl4bWFwIGdyYWJX aW5kb3coIFdJZCwgaW50IHg9MCwgaW50IHk9MCwgaW50IHc9LTEsIGludCBoPS0xICk7CiAgICBz dGF0aWMgIFFQaXhtYXAgZ3JhYldpZGdldCggUVdpZGdldCAqIHdpZGdldCwKCQkJCWludCB4PTAs IGludCB5PTAsIGludCB3PS0xLCBpbnQgaD0tMSApOwoKCiAgICBRUGl4bWFwCSAgICB4Rm9ybSgg Y29uc3QgUVdNYXRyaXggJiApIGNvbnN0OwogICAgc3RhdGljIFFXTWF0cml4IHRydWVNYXRyaXgo IGNvbnN0IFFXTWF0cml4ICYsIGludCB3LCBpbnQgaCApOwoKCiAgICBRSW1hZ2UJY29udmVydFRv SW1hZ2UoKSBjb25zdDsKICAgIGJvb2wJY29udmVydEZyb21JbWFnZSggY29uc3QgUUltYWdlICYs IENvbG9yTW9kZSBtb2RlPUF1dG8gKTsKICAgIGJvb2wJY29udmVydEZyb21JbWFnZSggY29uc3Qg UUltYWdlICYsIGludCBjb252ZXJzaW9uX2ZsYWdzICk7CgogICAgc3RhdGljIGNvbnN0IGNoYXIq IGltYWdlRm9ybWF0KCBjb25zdCBRU3RyaW5nICZmaWxlTmFtZSApOwogICAgYm9vbAlsb2FkKCBj b25zdCBRU3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgY2hhciAqZm9ybWF0PTAsCgkJICAgICAgQ29s b3JNb2RlIG1vZGU9QXV0byApOwogICAgYm9vbAlsb2FkKCBjb25zdCBRU3RyaW5nJiBmaWxlTmFt ZSwgY29uc3QgY2hhciAqZm9ybWF0LAoJCSAgICAgIGludCBjb252ZXJzaW9uX2ZsYWdzICk7CiAg ICBib29sCWxvYWRGcm9tRGF0YSggY29uc3QgdWNoYXIgKmJ1ZiwgdWludCBsZW4sCgkJCSAgICAg IGNvbnN0IGNoYXIqIGZvcm1hdD0wLAoJCQkgICAgICBDb2xvck1vZGUgbW9kZT1BdXRvICk7CiAg ICBib29sCWxvYWRGcm9tRGF0YSggY29uc3QgdWNoYXIgKmJ1ZiwgdWludCBsZW4sCgkJCSAgICAg IGNvbnN0IGNoYXIqIGZvcm1hdCwKCQkJICAgICAgaW50IGNvbnZlcnNpb25fZmxhZ3MgKTsKICAg IGJvb2wJbG9hZEZyb21EYXRhKCBjb25zdCBRQnl0ZUFycmF5ICZkYXRhLAoJCQkgICAgICBjb25z dCBjaGFyKiBmb3JtYXQ9MCwKCQkJICAgICAgaW50IGNvbnZlcnNpb25fZmxhZ3M9MCApOwogICAg Ym9vbAlzYXZlKCBjb25zdCBRU3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgY2hhciogZm9ybWF0LCBp bnQgcXVhbGl0eSA9IC0xICkgY29uc3Q7CgoKCgoKCiAgICBpbnQJCXNlcmlhbE51bWJlcigpCWNv bnN0OwoKICAgIE9wdGltaXphdGlvbglvcHRpbWl6YXRpb24oKSBjb25zdDsKICAgIHZvaWQJCXNl dE9wdGltaXphdGlvbiggT3B0aW1pemF0aW9uICk7CiAgICBzdGF0aWMgT3B0aW1pemF0aW9uIGRl ZmF1bHRPcHRpbWl6YXRpb24oKTsKICAgIHN0YXRpYyB2b2lkCQlzZXREZWZhdWx0T3B0aW1pemF0 aW9uKCBPcHRpbWl6YXRpb24gKTsKCiAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CgogICAgYm9v bAlpc1FCaXRtYXAoKSBjb25zdDsKCiMgMTU2ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXBpeG1h cC5oIgoKCgoKCgoKCgogICAgc3RhdGljIGludCB4MTFTZXREZWZhdWx0U2NyZWVuKCBpbnQgc2Ny ZWVuICk7CiAgICB2b2lkIHgxMVNldFNjcmVlbiggaW50IHNjcmVlbiApOwoKCgoKCgpwcm90ZWN0 ZWQ6CiAgICBRUGl4bWFwKCBpbnQgdywgaW50IGgsIGNvbnN0IHVjaGFyICpkYXRhLCBib29sIGlz WGJpdG1hcCApOwogICAgaW50IG1ldHJpYyggaW50ICkgY29uc3Q7CgoKCgoKCgoKICAgIHN0cnVj dCBRUGl4bWFwRGF0YSA6IHB1YmxpYyBRU2hhcmVkIHsJIAoJUUNPT1JECXcsIGg7CglzaG9ydAlk OwoJdWludAl1bmluaXQJIDogMTsKCXVpbnQJYml0bWFwCSA6IDE7Cgl1aW50CXNlbGZtYXNrIDog MTsKCgoKCWludAlzZXJfbm87CglRQml0bWFwICptYXNrOwojIDIwMyAiL3Vzci9sb2NhbC9xdC9p bmNsdWRlL3FwaXhtYXAuaCIKCgl2b2lkICAgKnhpbWFnZTsKCXZvaWQgICAqbWFza2djOwoJUVBp eG1hcCAqYWxwaGFwbTsKIyAyMTYgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcGl4bWFwLmgiCgoJ T3B0aW1pemF0aW9uIG9wdGltOwogICAgfSAqZGF0YTsKcHJpdmF0ZToKICAgIFFQaXhtYXAoIGlu dCB3LCBpbnQgaCwgaW50IGRlcHRoLCBib29sLCBPcHRpbWl6YXRpb24gKTsKICAgIHZvaWQJaW5p dCggaW50LCBpbnQsIGludCwgYm9vbCwgT3B0aW1pemF0aW9uICk7CiAgICB2b2lkCWRlcmVmKCk7 CiAgICBRUGl4bWFwCWNvcHkoIGJvb2wgaWdub3JlTWFzayA9IEZBTFNFICkgY29uc3Q7CiAgICBz dGF0aWMgT3B0aW1pemF0aW9uIGRlZk9wdGltOwogICAgZnJpZW5kICAgdm9pZCBiaXRCbHQoIFFQ YWludERldmljZSAqLCBpbnQsIGludCwKCQkJCSBjb25zdCBRUGFpbnREZXZpY2UgKiwKCQkJCSBp bnQsIGludCwgaW50LCBpbnQsIFJhc3Rlck9wLCBib29sICk7CiAgICBmcmllbmQgICB2b2lkIGJp dEJsdCggUVBhaW50RGV2aWNlICosIGludCwgaW50LAoJCQkJIGNvbnN0IFFJbWFnZSogc3JjLAoJ CQkJIGludCwgaW50LCBpbnQsIGludCwgaW50IGNvbnZlcnNpb25fZmxhZ3MgKTsKCgogICAgZnJp ZW5kIHZvaWQgcXRfeDExX2NvcHlfYWxwaGFfcGl4bWFwKFFQaXhtYXAgKmRzdCwgY29uc3QgUVBp eG1hcCAqc3JjKTsKICAgIGZyaWVuZCB2b2lkIHF0X3gxMV9ibGl0X2FscGhhX3BpeG1hcChRUGl4 bWFwICpkc3QsIGludCBkeCwgaW50IGR5LAoJCQkJCSBjb25zdCBRUGl4bWFwICpzcmMsIGludCBz eCA9IDAsIGludCBzeSA9IDAsCgkJCQkJIGludCBzdyA9IC0xLCBpbnQgc2ggPSAtMSk7CgoKICAg IGZyaWVuZCBjbGFzcyBRQml0bWFwOwogICAgZnJpZW5kIGNsYXNzIFFQYWludERldmljZTsKICAg IGZyaWVuZCBjbGFzcyBRUGFpbnRlcjsKfTsKCgppbmxpbmUgYm9vbCBRUGl4bWFwOjppc051bGwo KSBjb25zdAp7CiAgICByZXR1cm4gZGF0YS0+dyA9PSAwOwp9CgppbmxpbmUgdm9pZCBRUGl4bWFw OjpmaWxsKCBjb25zdCBRV2lkZ2V0ICp3LCBjb25zdCBRUG9pbnQgJm9mcyApCnsKICAgIGZpbGwo IHcsIG9mcy54KCksIG9mcy55KCkgKTsKfQoKaW5saW5lIHZvaWQgUVBpeG1hcDo6cmVzaXplKCBj b25zdCBRU2l6ZSAmcyApCnsKICAgIHJlc2l6ZSggcy53aWR0aCgpLCBzLmhlaWdodCgpICk7Cn0K CmlubGluZSBjb25zdCBRQml0bWFwICpRUGl4bWFwOjptYXNrKCkgY29uc3QKewogICAgcmV0dXJu IGRhdGEtPm1hc2s7Cn0KCmlubGluZSBib29sIFFQaXhtYXA6OnNlbGZNYXNrKCkgY29uc3QKewog ICAgcmV0dXJuIGRhdGEtPnNlbGZtYXNrOwp9CgoKCgoKCgoKaW5saW5lIGludCBRUGl4bWFwOjpz ZXJpYWxOdW1iZXIoKSBjb25zdAp7CiAgICByZXR1cm4gZGF0YS0+c2VyX25vOwp9CgppbmxpbmUg UVBpeG1hcDo6T3B0aW1pemF0aW9uIFFQaXhtYXA6Om9wdGltaXphdGlvbigpIGNvbnN0CnsKICAg IHJldHVybiBkYXRhLT5vcHRpbTsKfQoKaW5saW5lIGJvb2wgUVBpeG1hcDo6aXNRQml0bWFwKCkg Y29uc3QKewogICAgcmV0dXJuIGRhdGEtPmJpdG1hcDsKfQoKCgoKCgoKCgogCgoKCgogIFFEYXRh U3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmLCBjb25zdCBRUGl4bWFwICYgKTsKICBR RGF0YVN0cmVhbSAmb3BlcmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUVBpeG1hcCAmICk7CgoKIAoK CgoKCgoKCgpib29sIHF0X3hGb3JtX2hlbHBlciggY29uc3QgUVdNYXRyaXgmLCBpbnQsIGludCwg aW50LCB1Y2hhciosIGludCwgaW50LCBpbnQsIHVjaGFyKiwgaW50LCBpbnQsIGludCApOwoKCgoj IDQzICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWNhbnZhcy5oIiAyCgojIDEgIi91c3IvbG9jYWwv cXQvaW5jbHVkZS9xcHRybGlzdC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FnbGlzdC5oIiAxCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNs dWRlL3FwdHJjb2xsZWN0aW9uLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgpjbGFzcyBRR1ZlY3RvcjsKY2xhc3MgUUdMaXN0OwpjbGFzcyBRR0RpY3Q7CgoK Y2xhc3MgICBRUHRyQ29sbGVjdGlvbgkJCSAKewpwdWJsaWM6CiAgICBib29sIGF1dG9EZWxldGUo KQljb25zdAkgICAgICAgeyByZXR1cm4gZGVsX2l0ZW07IH0KICAgIHZvaWQgc2V0QXV0b0RlbGV0 ZSggYm9vbCBlbmFibGUgKSAgeyBkZWxfaXRlbSA9IGVuYWJsZTsgfQoKICAgIHZpcnR1YWwgdWlu dCAgY291bnQoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgIGNsZWFyKCkgPSAwOwkJCSAK CiAgICB0eXBlZGVmIHZvaWQgKkl0ZW07CQkJCSAKCnByb3RlY3RlZDoKICAgIFFQdHJDb2xsZWN0 aW9uKCkgeyBkZWxfaXRlbSA9IEZBTFNFOyB9CQkgCiAgICBRUHRyQ29sbGVjdGlvbihjb25zdCBR UHRyQ29sbGVjdGlvbiAmKSB7IGRlbF9pdGVtID0gRkFMU0U7IH0KICAgIHZpcnR1YWwgflFQdHJD b2xsZWN0aW9uKCkge30KCiAgICBib29sIGRlbF9pdGVtOwkJCQkgCgogICAgdmlydHVhbCBJdGVt ICAgICBuZXdJdGVtKCBJdGVtICk7CQkgCiAgICB2aXJ0dWFsIHZvaWQgICAgIGRlbGV0ZUl0ZW0o IEl0ZW0gKSA9IDA7CSAKfTsKCgoKCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZ2xp c3QuaCIgMgoKCgpjbGFzcyAgIFFMTm9kZQp7CmZyaWVuZCBjbGFzcyBRR0xpc3Q7CmZyaWVuZCBj bGFzcyBRR0xpc3RJdGVyYXRvcjsKcHVibGljOgogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZ2V0 RGF0YSgpCXsgcmV0dXJuIGRhdGE7IH0KcHJpdmF0ZToKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVt IGRhdGE7CiAgICBRTE5vZGUgKnByZXY7CiAgICBRTE5vZGUgKm5leHQ7CiAgICBRTE5vZGUoIFFQ dHJDb2xsZWN0aW9uOjpJdGVtIGQgKSB7IGRhdGEgPSBkOyB9Cn07CgpjbGFzcyBRR0xpc3RJdGVy YXRvckxpc3Q7ICAKCmNsYXNzICAgUUdMaXN0IDogcHVibGljIFFQdHJDb2xsZWN0aW9uCSAKewpm cmllbmQgY2xhc3MgUUdMaXN0SXRlcmF0b3I7CmZyaWVuZCBjbGFzcyBRR0xpc3RJdGVyYXRvckxp c3Q7CmZyaWVuZCBjbGFzcyBRR1ZlY3RvcjsJCQkJIApwdWJsaWM6CiAgICB1aW50ICBjb3VudCgp IGNvbnN0OwkJCSAKCgogICAgUURhdGFTdHJlYW0gJnJlYWQoIFFEYXRhU3RyZWFtICYgKTsJCSAK ICAgIFFEYXRhU3RyZWFtICZ3cml0ZSggUURhdGFTdHJlYW0gJiApIGNvbnN0OwkgCgpwcm90ZWN0 ZWQ6CiAgICBRR0xpc3QoKTsJCQkJCSAKICAgIFFHTGlzdCggY29uc3QgUUdMaXN0ICYgKTsJCQkg CiAgICB2aXJ0dWFsIH5RR0xpc3QoKTsKCiAgICBRR0xpc3QgJm9wZXJhdG9yPSggY29uc3QgUUdM aXN0ICYgKTsJIAogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRR0xpc3QmICkgY29uc3Q7Cgog ICAgdm9pZCBpblNvcnQoIFFQdHJDb2xsZWN0aW9uOjpJdGVtICk7CQkgCiAgICB2b2lkIGFwcGVu ZCggUVB0ckNvbGxlY3Rpb246Okl0ZW0gKTsJCSAKICAgIGJvb2wgaW5zZXJ0QXQoIHVpbnQgaW5k ZXgsIFFQdHJDb2xsZWN0aW9uOjpJdGVtICk7ICAKICAgIHZvaWQgcmVsaW5rTm9kZSggUUxOb2Rl ICogKTsJCSAKICAgIGJvb2wgcmVtb3ZlTm9kZSggUUxOb2RlICogKTsJCSAKICAgIGJvb2wgcmVt b3ZlKCBRUHRyQ29sbGVjdGlvbjo6SXRlbSA9IDAgKTsJIAogICAgYm9vbCByZW1vdmVSZWYoIFFQ dHJDb2xsZWN0aW9uOjpJdGVtID0gMCApOwkgCiAgICBib29sIHJlbW92ZUZpcnN0KCk7CQkJCSAK ICAgIGJvb2wgcmVtb3ZlTGFzdCgpOwkJCQkgCiAgICBib29sIHJlbW92ZUF0KCB1aW50IGluZGV4 ICk7CQkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSB0YWtlTm9kZSggUUxOb2RlICogKTsJIAog ICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gdGFrZSgpOwkJCSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJ dGVtIHRha2VBdCggdWludCBpbmRleCApOwkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSB0YWtl Rmlyc3QoKTsJCSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtIHRha2VMYXN0KCk7CQkgCgogICAg dm9pZCBzb3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgdm9pZCBjbGVhcigpOwkJ CSAKCiAgICBpbnQJIGZpbmRSZWYoIFFQdHJDb2xsZWN0aW9uOjpJdGVtLCBib29sID0gVFJVRSAp OyAgCiAgICBpbnQJIGZpbmQoIFFQdHJDb2xsZWN0aW9uOjpJdGVtLCBib29sID0gVFJVRSApOyAg CgogICAgdWludCBjb250YWluc1JlZiggUVB0ckNvbGxlY3Rpb246Okl0ZW0gKSBjb25zdDsgIAog ICAgdWludCBjb250YWlucyggUVB0ckNvbGxlY3Rpb246Okl0ZW0gKQljb25zdDsJIAoKICAgIFFQ dHJDb2xsZWN0aW9uOjpJdGVtIGF0KCB1aW50IGluZGV4ICk7CQkgCiAgICBpbnQJICBhdCgpIGNv bnN0OwkJCQkgCiAgICBRTE5vZGUgKmN1cnJlbnROb2RlKCkgY29uc3Q7CQkgCgogICAgUVB0ckNv bGxlY3Rpb246Okl0ZW0gZ2V0KCkgY29uc3Q7CQkgCgogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0g Y2ZpcnN0KCkgY29uc3Q7CSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGNsYXN0KCkgIGNvbnN0 OwkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSBmaXJzdCgpOwkJIAogICAgUVB0ckNvbGxlY3Rp b246Okl0ZW0gbGFzdCgpOwkJIAogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gbmV4dCgpOwkJIAog ICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gcHJldigpOwkJIAoKICAgIHZvaWQgIHRvVmVjdG9yKCBR R1ZlY3RvciAqICkgY29uc3Q7CQkgCgogICAgdmlydHVhbCBpbnQgY29tcGFyZUl0ZW1zKCBRUHRy Q29sbGVjdGlvbjo6SXRlbSwgUVB0ckNvbGxlY3Rpb246Okl0ZW0gKTsKCgogICAgdmlydHVhbCBR RGF0YVN0cmVhbSAmcmVhZCggUURhdGFTdHJlYW0gJiwgUVB0ckNvbGxlY3Rpb246Okl0ZW0gJiAp OwogICAgdmlydHVhbCBRRGF0YVN0cmVhbSAmd3JpdGUoIFFEYXRhU3RyZWFtICYsIFFQdHJDb2xs ZWN0aW9uOjpJdGVtICkgY29uc3Q7Cgpwcml2YXRlOgogICAgdm9pZCAgcHJlcGVuZCggUVB0ckNv bGxlY3Rpb246Okl0ZW0gKTsgIAoKICAgIHZvaWQgaGVhcFNvcnRQdXNoRG93biggUVB0ckNvbGxl Y3Rpb246Okl0ZW0qIGhlYXAsIGludCBmaXJzdCwgaW50IGxhc3QgKTsKCiAgICBRTE5vZGUgKmZp cnN0Tm9kZTsJCQkJIAogICAgUUxOb2RlICpsYXN0Tm9kZTsJCQkJIAogICAgUUxOb2RlICpjdXJO b2RlOwkJCQkgCiAgICBpbnQgY3VySW5kZXg7CQkJCSAKICAgIHVpbnQgbnVtTm9kZXM7CQkJCSAK ICAgIFFHTGlzdEl0ZXJhdG9yTGlzdCAqaXRlcmF0b3JzOyAJCQkgCgogICAgUUxOb2RlICpsb2Nh dGUoIHVpbnQgKTsJCQkgCiAgICBRTE5vZGUgKnVubGluaygpOwkJCQkgCn07CgoKaW5saW5lIHVp bnQgUUdMaXN0Ojpjb3VudCgpIGNvbnN0CnsKICAgIHJldHVybiBudW1Ob2RlczsKfQoKaW5saW5l IGJvb2wgUUdMaXN0OjpyZW1vdmVGaXJzdCgpCnsKICAgIGZpcnN0KCk7CiAgICByZXR1cm4gcmVt b3ZlKCk7Cn0KCmlubGluZSBib29sIFFHTGlzdDo6cmVtb3ZlTGFzdCgpCnsKICAgIGxhc3QoKTsK ICAgIHJldHVybiByZW1vdmUoKTsKfQoKaW5saW5lIGludCBRR0xpc3Q6OmF0KCkgY29uc3QKewog ICAgcmV0dXJuIGN1ckluZGV4Owp9CgppbmxpbmUgUVB0ckNvbGxlY3Rpb246Okl0ZW0gUUdMaXN0 OjphdCggdWludCBpbmRleCApCnsKICAgIFFMTm9kZSAqbiA9IGxvY2F0ZSggaW5kZXggKTsKICAg IHJldHVybiBuID8gbi0+ZGF0YSA6IDA7Cn0KCmlubGluZSBRTE5vZGUgKlFHTGlzdDo6Y3VycmVu dE5vZGUoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZTsKfQoKaW5saW5lIFFQdHJDb2xsZWN0 aW9uOjpJdGVtIFFHTGlzdDo6Z2V0KCkgY29uc3QKewogICAgcmV0dXJuIGN1ck5vZGUgPyBjdXJO b2RlLT5kYXRhIDogMDsKfQoKaW5saW5lIFFQdHJDb2xsZWN0aW9uOjpJdGVtIFFHTGlzdDo6Y2Zp cnN0KCkgY29uc3QKewogICAgcmV0dXJuIGZpcnN0Tm9kZSA/IGZpcnN0Tm9kZS0+ZGF0YSA6IDA7 Cn0KCmlubGluZSBRUHRyQ29sbGVjdGlvbjo6SXRlbSBRR0xpc3Q6OmNsYXN0KCkgY29uc3QKewog ICAgcmV0dXJuIGxhc3ROb2RlID8gbGFzdE5vZGUtPmRhdGEgOiAwOwp9CgoKIAoKCgoKICBRRGF0 YVN0cmVhbSAmb3BlcmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUUdMaXN0ICYgKTsKICBRRGF0YVN0 cmVhbSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUUdMaXN0ICYgKTsKCgogCgoK CmNsYXNzICAgUUdMaXN0SXRlcmF0b3IJCQkgCnsKZnJpZW5kIGNsYXNzIFFHTGlzdDsKZnJpZW5k IGNsYXNzIFFHTGlzdEl0ZXJhdG9yTGlzdDsKcHJvdGVjdGVkOgogICAgUUdMaXN0SXRlcmF0b3Io IGNvbnN0IFFHTGlzdCAmICk7CiAgICBRR0xpc3RJdGVyYXRvciggY29uc3QgUUdMaXN0SXRlcmF0 b3IgJiApOwogICAgUUdMaXN0SXRlcmF0b3IgJm9wZXJhdG9yPSggY29uc3QgUUdMaXN0SXRlcmF0 b3IgJiApOwogICB+UUdMaXN0SXRlcmF0b3IoKTsKCiAgICBib29sICBhdEZpcnN0KCkgY29uc3Q7 CQkJIAogICAgYm9vbCAgYXRMYXN0KCkgIGNvbnN0OwkJCSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJ dGVtCSAgdG9GaXJzdCgpOwkJCQkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbQkgIHRvTGFzdCgp OwkJCQkgCgogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0JICBnZXQoKSBjb25zdDsJCQkJIAogICAg UVB0ckNvbGxlY3Rpb246Okl0ZW0JICBvcGVyYXRvcigpKCk7CQkJCSAKICAgIFFQdHJDb2xsZWN0 aW9uOjpJdGVtCSAgb3BlcmF0b3IrKygpOwkJCQkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbQkg IG9wZXJhdG9yKz0odWludCk7CQkJIAogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0JICBvcGVyYXRv ci0tKCk7CQkJCSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtCSAgb3BlcmF0b3ItPSh1aW50KTsJ CQkgCgpwcm90ZWN0ZWQ6CiAgICBRR0xpc3QgKmxpc3Q7CQkJCSAKCnByaXZhdGU6CiAgICBRTE5v ZGUgICpjdXJOb2RlOwkJCQkgCn07CgoKaW5saW5lIGJvb2wgUUdMaXN0SXRlcmF0b3I6OmF0Rmly c3QoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZSA9PSBsaXN0LT5maXJzdE5vZGU7Cn0KCmlu bGluZSBib29sIFFHTGlzdEl0ZXJhdG9yOjphdExhc3QoKSBjb25zdAp7CiAgICByZXR1cm4gY3Vy Tm9kZSA9PSBsaXN0LT5sYXN0Tm9kZTsKfQoKaW5saW5lIFFQdHJDb2xsZWN0aW9uOjpJdGVtIFFH TGlzdEl0ZXJhdG9yOjpnZXQoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZSA/IGN1ck5vZGUt PmRhdGEgOiAwOwp9CgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcHRybGlzdC5oIiAy CgoKCgp0ZW1wbGF0ZTxjbGFzcyB0eXBlPiAKY2xhc3MgUVB0ckxpc3QKCgoKCTogcHVibGljIFFH TGlzdAoKewpwdWJsaWM6CiAgICBRUHRyTGlzdCgpCQkJCXt9CiAgICBRUHRyTGlzdCggY29uc3Qg UVB0ckxpc3Q8dHlwZT4gJmwgKSA6IFFHTGlzdChsKSB7fQogICAgflFQdHJMaXN0KCkJCQkJeyBj bGVhcigpOyB9CiAgICBRUHRyTGlzdDx0eXBlPiAmb3BlcmF0b3I9KGNvbnN0IFFQdHJMaXN0PHR5 cGU+ICZsKQoJCQl7IHJldHVybiAoUVB0ckxpc3Q8dHlwZT4mKVFHTGlzdDo6b3BlcmF0b3I9KGwp OyB9CiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFQdHJMaXN0PHR5cGU+ICZsaXN0ICkgY29u c3QKICAgIHsgcmV0dXJuIFFHTGlzdDo6b3BlcmF0b3I9PSggbGlzdCApOyB9CiAgICB1aW50ICBj b3VudCgpICAgY29uc3QJCXsgcmV0dXJuIFFHTGlzdDo6Y291bnQoKTsgfQogICAgYm9vbCAgaXNF bXB0eSgpIGNvbnN0CQl7IHJldHVybiBRR0xpc3Q6OmNvdW50KCkgPT0gMDsgfQogICAgYm9vbCAg aW5zZXJ0KCB1aW50IGksIGNvbnN0IHR5cGUgKmQpeyByZXR1cm4gUUdMaXN0OjppbnNlcnRBdChp LChRUHRyQ29sbGVjdGlvbjo6SXRlbSlkKTsgfQogICAgdm9pZCAgaW5Tb3J0KCBjb25zdCB0eXBl ICpkICkJeyBRR0xpc3Q6OmluU29ydCgoUVB0ckNvbGxlY3Rpb246Okl0ZW0pZCk7IH0KICAgIHZv aWQgIHByZXBlbmQoIGNvbnN0IHR5cGUgKmQgKQl7IFFHTGlzdDo6aW5zZXJ0QXQoMCwoUVB0ckNv bGxlY3Rpb246Okl0ZW0pZCk7IH0KICAgIHZvaWQgIGFwcGVuZCggY29uc3QgdHlwZSAqZCApCXsg UUdMaXN0OjphcHBlbmQoKFFQdHJDb2xsZWN0aW9uOjpJdGVtKWQpOyB9CiAgICBib29sICByZW1v dmUoIHVpbnQgaSApCQl7IHJldHVybiBRR0xpc3Q6OnJlbW92ZUF0KGkpOyB9CiAgICBib29sICBy ZW1vdmUoKQkJCXsgcmV0dXJuIFFHTGlzdDo6cmVtb3ZlKChRUHRyQ29sbGVjdGlvbjo6SXRlbSkw KTsgfQogICAgYm9vbCAgcmVtb3ZlKCBjb25zdCB0eXBlICpkICkJeyByZXR1cm4gUUdMaXN0Ojpy ZW1vdmUoKFFQdHJDb2xsZWN0aW9uOjpJdGVtKWQpOyB9CiAgICBib29sICByZW1vdmVSZWYoIGNv bnN0IHR5cGUgKmQgKQl7IHJldHVybiBRR0xpc3Q6OnJlbW92ZVJlZigoUVB0ckNvbGxlY3Rpb246 Okl0ZW0pZCk7IH0KICAgIHZvaWQgIHJlbW92ZU5vZGUoIFFMTm9kZSAqbiApCXsgUUdMaXN0Ojpy ZW1vdmVOb2RlKG4pOyB9CiAgICBib29sICByZW1vdmVGaXJzdCgpCQkJeyByZXR1cm4gUUdMaXN0 OjpyZW1vdmVGaXJzdCgpOyB9CiAgICBib29sICByZW1vdmVMYXN0KCkJCQl7IHJldHVybiBRR0xp c3Q6OnJlbW92ZUxhc3QoKTsgfQogICAgdHlwZSAqdGFrZSggdWludCBpICkJCXsgcmV0dXJuICh0 eXBlICopUUdMaXN0Ojp0YWtlQXQoaSk7IH0KICAgIHR5cGUgKnRha2UoKQkJCXsgcmV0dXJuICh0 eXBlICopUUdMaXN0Ojp0YWtlKCk7IH0KICAgIHR5cGUgKnRha2VOb2RlKCBRTE5vZGUgKm4gKQkJ eyByZXR1cm4gKHR5cGUgKilRR0xpc3Q6OnRha2VOb2RlKG4pOyB9CiAgICB2b2lkICBjbGVhcigp CQkJeyBRR0xpc3Q6OmNsZWFyKCk7IH0KICAgIHZvaWQgIHNvcnQoKQkJCXsgUUdMaXN0Ojpzb3J0 KCk7IH0KICAgIGludAkgIGZpbmQoIGNvbnN0IHR5cGUgKmQgKQkJeyByZXR1cm4gUUdMaXN0Ojpm aW5kKChRUHRyQ29sbGVjdGlvbjo6SXRlbSlkKTsgfQogICAgaW50CSAgZmluZE5leHQoIGNvbnN0 IHR5cGUgKmQgKQl7IHJldHVybiBRR0xpc3Q6OmZpbmQoKFFQdHJDb2xsZWN0aW9uOjpJdGVtKWQs RkFMU0UpOyB9CiAgICBpbnQJICBmaW5kUmVmKCBjb25zdCB0eXBlICpkICkJeyByZXR1cm4gUUdM aXN0OjpmaW5kUmVmKChRUHRyQ29sbGVjdGlvbjo6SXRlbSlkKTsgfQogICAgaW50CSAgZmluZE5l eHRSZWYoIGNvbnN0IHR5cGUgKmQgKXsgcmV0dXJuIFFHTGlzdDo6ZmluZFJlZigoUVB0ckNvbGxl Y3Rpb246Okl0ZW0pZCxGQUxTRSk7fQogICAgdWludCAgY29udGFpbnMoIGNvbnN0IHR5cGUgKmQg KSBjb25zdCB7IHJldHVybiBRR0xpc3Q6OmNvbnRhaW5zKChRUHRyQ29sbGVjdGlvbjo6SXRlbSlk KTsgfQogICAgdWludCAgY29udGFpbnNSZWYoIGNvbnN0IHR5cGUgKmQgKSBjb25zdAoJCQkJCXsg cmV0dXJuIFFHTGlzdDo6Y29udGFpbnNSZWYoKFFQdHJDb2xsZWN0aW9uOjpJdGVtKWQpOyB9CiAg ICB0eXBlICphdCggdWludCBpICkJCQl7IHJldHVybiAodHlwZSAqKVFHTGlzdDo6YXQoaSk7IH0K ICAgIGludAkgIGF0KCkgY29uc3QJCQl7IHJldHVybiBRR0xpc3Q6OmF0KCk7IH0KICAgIHR5cGUg KmN1cnJlbnQoKSAgY29uc3QJCXsgcmV0dXJuICh0eXBlICopUUdMaXN0OjpnZXQoKTsgfQogICAg UUxOb2RlICpjdXJyZW50Tm9kZSgpICBjb25zdAl7IHJldHVybiBRR0xpc3Q6OmN1cnJlbnROb2Rl KCk7IH0KICAgIHR5cGUgKmdldEZpcnN0KCkgY29uc3QJCXsgcmV0dXJuICh0eXBlICopUUdMaXN0 OjpjZmlyc3QoKTsgfQogICAgdHlwZSAqZ2V0TGFzdCgpICBjb25zdAkJeyByZXR1cm4gKHR5cGUg KilRR0xpc3Q6OmNsYXN0KCk7IH0KICAgIHR5cGUgKmZpcnN0KCkJCQl7IHJldHVybiAodHlwZSAq KVFHTGlzdDo6Zmlyc3QoKTsgfQogICAgdHlwZSAqbGFzdCgpCQkJeyByZXR1cm4gKHR5cGUgKilR R0xpc3Q6Omxhc3QoKTsgfQogICAgdHlwZSAqbmV4dCgpCQkJeyByZXR1cm4gKHR5cGUgKilRR0xp c3Q6Om5leHQoKTsgfQogICAgdHlwZSAqcHJldigpCQkJeyByZXR1cm4gKHR5cGUgKilRR0xpc3Q6 OnByZXYoKTsgfQogICAgdm9pZCAgdG9WZWN0b3IoIFFHVmVjdG9yICp2ZWMgKWNvbnN0eyBRR0xp c3Q6OnRvVmVjdG9yKHZlYyk7IH0KCgoKCgoKCgpwcml2YXRlOgogICAgdm9pZCAgZGVsZXRlSXRl bSggSXRlbSBkICk7Cn07CgoKdGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBRUHRyTGlzdDx2b2lkPjo6 ZGVsZXRlSXRlbSggUVB0ckNvbGxlY3Rpb246Okl0ZW0gKQp7Cn0KCgp0ZW1wbGF0ZTxjbGFzcyB0 eXBlPiBpbmxpbmUgdm9pZCBRUHRyTGlzdDx0eXBlPjo6ZGVsZXRlSXRlbSggUVB0ckNvbGxlY3Rp b246Okl0ZW0gZCApCnsKICAgIGlmICggZGVsX2l0ZW0gKSBkZWxldGUgKHR5cGUgKilkOwp9Cgp0 ZW1wbGF0ZTxjbGFzcyB0eXBlPiAKY2xhc3MgUVB0ckxpc3RJdGVyYXRvcgo6IHB1YmxpYyBRR0xp c3RJdGVyYXRvcgp7CnB1YmxpYzoKICAgIFFQdHJMaXN0SXRlcmF0b3IoY29uc3QgUVB0ckxpc3Q8 dHlwZT4gJmwpIDpRR0xpc3RJdGVyYXRvcigoUUdMaXN0ICYpbCkge30KICAgflFQdHJMaXN0SXRl cmF0b3IoKQkgICAgICB7fQogICAgdWludCAgY291bnQoKSAgIGNvbnN0ICAgICB7IHJldHVybiBs aXN0LT5jb3VudCgpOyB9CiAgICBib29sICBpc0VtcHR5KCkgY29uc3QgICAgIHsgcmV0dXJuIGxp c3QtPmNvdW50KCkgPT0gMDsgfQogICAgYm9vbCAgYXRGaXJzdCgpIGNvbnN0ICAgICB7IHJldHVy biBRR0xpc3RJdGVyYXRvcjo6YXRGaXJzdCgpOyB9CiAgICBib29sICBhdExhc3QoKSAgY29uc3Qg ICAgIHsgcmV0dXJuIFFHTGlzdEl0ZXJhdG9yOjphdExhc3QoKTsgfQogICAgdHlwZSAqdG9GaXJz dCgpCSAgICAgIHsgcmV0dXJuICh0eXBlICopUUdMaXN0SXRlcmF0b3I6OnRvRmlyc3QoKTsgfQog ICAgdHlwZSAqdG9MYXN0KCkJICAgICAgeyByZXR1cm4gKHR5cGUgKilRR0xpc3RJdGVyYXRvcjo6 dG9MYXN0KCk7IH0KICAgIG9wZXJhdG9yIHR5cGUgKigpIGNvbnN0ICAgeyByZXR1cm4gKHR5cGUg KilRR0xpc3RJdGVyYXRvcjo6Z2V0KCk7IH0KICAgIHR5cGUgKm9wZXJhdG9yKigpICAgICAgICAg eyByZXR1cm4gKHR5cGUgKilRR0xpc3RJdGVyYXRvcjo6Z2V0KCk7IH0KCiAgICAgCiAgICAgCiAg ICAgCiAgICAgCiAgICAgCgogICAgdHlwZSAqY3VycmVudCgpICAgY29uc3QgICB7IHJldHVybiAo dHlwZSAqKVFHTGlzdEl0ZXJhdG9yOjpnZXQoKTsgfQogICAgdHlwZSAqb3BlcmF0b3IoKSgpCSAg ICAgIHsgcmV0dXJuICh0eXBlICopUUdMaXN0SXRlcmF0b3I6Om9wZXJhdG9yKCkoKTt9CiAgICB0 eXBlICpvcGVyYXRvcisrKCkJICAgICAgeyByZXR1cm4gKHR5cGUgKilRR0xpc3RJdGVyYXRvcjo6 b3BlcmF0b3IrKygpOyB9CiAgICB0eXBlICpvcGVyYXRvcis9KHVpbnQgaikgIHsgcmV0dXJuICh0 eXBlICopUUdMaXN0SXRlcmF0b3I6Om9wZXJhdG9yKz0oaik7fQogICAgdHlwZSAqb3BlcmF0b3It LSgpCSAgICAgIHsgcmV0dXJuICh0eXBlICopUUdMaXN0SXRlcmF0b3I6Om9wZXJhdG9yLS0oKTsg fQogICAgdHlwZSAqb3BlcmF0b3ItPSh1aW50IGopICB7IHJldHVybiAodHlwZSAqKVFHTGlzdEl0 ZXJhdG9yOjpvcGVyYXRvci09KGopO30KICAgIFFQdHJMaXN0SXRlcmF0b3I8dHlwZT4mIG9wZXJh dG9yPShjb25zdCBRUHRyTGlzdEl0ZXJhdG9yPHR5cGU+Jml0KQoJCQkgICAgICB7IFFHTGlzdEl0 ZXJhdG9yOjpvcGVyYXRvcj0oaXQpOyByZXR1cm4gKnRoaXM7IH0KfTsKCgoKCgoKCiMgNDQgIi91 c3IvbG9jYWwvcXQvaW5jbHVkZS9xY2FudmFzLmgiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNs dWRlL3FwdHJkaWN0LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdkaWN0LmgiIDEKIAoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFHRGljdEl0ZXJhdG9yOwpjbGFz cyBRR0RJdExpc3Q7CgoKY2xhc3MgUUJhc2VCdWNrZXQJCQkJIAp7CnB1YmxpYzoKICAgIFFQdHJD b2xsZWN0aW9uOjpJdGVtCSBnZXREYXRhKCkJCQl7IHJldHVybiBkYXRhOyB9CiAgICBRUHRyQ29s bGVjdGlvbjo6SXRlbQkgc2V0RGF0YSggUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCApIHsgcmV0dXJu IGRhdGEgPSBkOyB9CiAgICBRQmFzZUJ1Y2tldAkJKmdldE5leHQoKQkJCXsgcmV0dXJuIG5leHQ7 IH0KICAgIHZvaWQJCSBzZXROZXh0KCBRQmFzZUJ1Y2tldCAqbikJeyBuZXh0ID0gbjsgfQpwcm90 ZWN0ZWQ6CiAgICBRQmFzZUJ1Y2tldCggUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCwgUUJhc2VCdWNr ZXQgKm4gKSA6IGRhdGEoZCksIG5leHQobikge30KICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtCSBk YXRhOwogICAgUUJhc2VCdWNrZXQJCSpuZXh0Owp9OwoKY2xhc3MgUVN0cmluZ0J1Y2tldCA6IHB1 YmxpYyBRQmFzZUJ1Y2tldAp7CnB1YmxpYzoKICAgIFFTdHJpbmdCdWNrZXQoIGNvbnN0IFFTdHJp bmcgJmssIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGQsIFFCYXNlQnVja2V0ICpuICkKCTogUUJhc2VC dWNrZXQoZCxuKSwga2V5KGspCQl7fQogICAgY29uc3QgUVN0cmluZyAgJmdldEtleSgpIGNvbnN0 CQl7IHJldHVybiBrZXk7IH0KcHJpdmF0ZToKICAgIFFTdHJpbmcJICAgIGtleTsKfTsKCmNsYXNz IFFBc2NpaUJ1Y2tldCA6IHB1YmxpYyBRQmFzZUJ1Y2tldAp7CnB1YmxpYzoKICAgIFFBc2NpaUJ1 Y2tldCggY29uc3QgY2hhciAqaywgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCwgUUJhc2VCdWNrZXQg Km4gKQoJOiBRQmFzZUJ1Y2tldChkLG4pLCBrZXkoaykge30KICAgIGNvbnN0IGNoYXIgKmdldEtl eSgpIGNvbnN0IHsgcmV0dXJuIGtleTsgfQpwcml2YXRlOgogICAgY29uc3QgY2hhciAqa2V5Owp9 OwoKY2xhc3MgUUludEJ1Y2tldCA6IHB1YmxpYyBRQmFzZUJ1Y2tldAp7CnB1YmxpYzoKICAgIFFJ bnRCdWNrZXQoIGxvbmcgaywgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCwgUUJhc2VCdWNrZXQgKm4g KQoJOiBRQmFzZUJ1Y2tldChkLG4pLCBrZXkoaykge30KICAgIGxvbmcgIGdldEtleSgpIGNvbnN0 IHsgcmV0dXJuIGtleTsgfQpwcml2YXRlOgogICAgbG9uZyAga2V5Owp9OwoKY2xhc3MgUVB0ckJ1 Y2tldCA6IHB1YmxpYyBRQmFzZUJ1Y2tldAp7CnB1YmxpYzoKICAgIFFQdHJCdWNrZXQoIHZvaWQg KmssIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGQsIFFCYXNlQnVja2V0ICpuICkKCTogUUJhc2VCdWNr ZXQoZCxuKSwga2V5KGspIHt9CiAgICB2b2lkICpnZXRLZXkoKSBjb25zdCB7IHJldHVybiBrZXk7 IH0KcHJpdmF0ZToKICAgIHZvaWQgKmtleTsKfTsKCgpjbGFzcyAgIFFHRGljdCA6IHB1YmxpYyBR UHRyQ29sbGVjdGlvbgkgCnsKcHVibGljOgogICAgdWludAljb3VudCgpIGNvbnN0CXsgcmV0dXJu IG51bUl0ZW1zOyB9CiAgICB1aW50CXNpemUoKQljb25zdAl7IHJldHVybiB2bGVuOyB9CiAgICBR UHRyQ29sbGVjdGlvbjo6SXRlbSBsb29rX3N0cmluZyggY29uc3QgUVN0cmluZyYga2V5LCBRUHRy Q29sbGVjdGlvbjo6SXRlbSwKCQkJCSAgIGludCApOwogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0g bG9va19hc2NpaSggY29uc3QgY2hhciAqa2V5LCBRUHRyQ29sbGVjdGlvbjo6SXRlbSwgaW50ICk7 CiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSBsb29rX2ludCggbG9uZyBrZXksIFFQdHJDb2xsZWN0 aW9uOjpJdGVtLCBpbnQgKTsKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGxvb2tfcHRyKCB2b2lk ICprZXksIFFQdHJDb2xsZWN0aW9uOjpJdGVtLCBpbnQgKTsKCiAgICBRRGF0YVN0cmVhbSAmcmVh ZCggUURhdGFTdHJlYW0gJiApOwogICAgUURhdGFTdHJlYW0gJndyaXRlKCBRRGF0YVN0cmVhbSAm ICkgY29uc3Q7Cgpwcm90ZWN0ZWQ6CiAgICBlbnVtIEtleVR5cGUgeyBTdHJpbmdLZXksIEFzY2lp S2V5LCBJbnRLZXksIFB0cktleSB9OwoKICAgIFFHRGljdCggdWludCBsZW4sIEtleVR5cGUga3Qs IGJvb2wgY3MsIGJvb2wgY2sgKTsKICAgIFFHRGljdCggY29uc3QgUUdEaWN0ICYgKTsKICAgflFH RGljdCgpOwoKICAgIFFHRGljdCAgICAgJm9wZXJhdG9yPSggY29uc3QgUUdEaWN0ICYgKTsKCiAg ICBib29sCXJlbW92ZV9zdHJpbmcoIGNvbnN0IFFTdHJpbmcgJmtleSwgUVB0ckNvbGxlY3Rpb246 Okl0ZW0gaXRlbT0wICk7CiAgICBib29sCXJlbW92ZV9hc2NpaSggY29uc3QgY2hhciAqa2V5LCBR UHRyQ29sbGVjdGlvbjo6SXRlbSBpdGVtPTAgKTsKICAgIGJvb2wJcmVtb3ZlX2ludCggbG9uZyBr ZXksIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGl0ZW09MCApOwogICAgYm9vbAlyZW1vdmVfcHRyKCB2 b2lkICprZXksIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGl0ZW09MCApOwogICAgUVB0ckNvbGxlY3Rp b246Okl0ZW0gdGFrZV9zdHJpbmcoIGNvbnN0IFFTdHJpbmcgJmtleSApOwogICAgUVB0ckNvbGxl Y3Rpb246Okl0ZW0gdGFrZV9hc2NpaSggY29uc3QgY2hhciAqa2V5ICk7CiAgICBRUHRyQ29sbGVj dGlvbjo6SXRlbSB0YWtlX2ludCggbG9uZyBrZXkgKTsKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVt IHRha2VfcHRyKCB2b2lkICprZXkgKTsKCiAgICB2b2lkCWNsZWFyKCk7CiAgICB2b2lkCXJlc2l6 ZSggdWludCApOwoKICAgIGludAkJaGFzaEtleVN0cmluZyggY29uc3QgUVN0cmluZyAmICk7CiAg ICBpbnQJCWhhc2hLZXlBc2NpaSggY29uc3QgY2hhciAqICk7CgogICAgdm9pZAlzdGF0aXN0aWNz KCkgY29uc3Q7CgoKICAgIHZpcnR1YWwgUURhdGFTdHJlYW0gJnJlYWQoIFFEYXRhU3RyZWFtICYs IFFQdHJDb2xsZWN0aW9uOjpJdGVtICYgKTsKICAgIHZpcnR1YWwgUURhdGFTdHJlYW0gJndyaXRl KCBRRGF0YVN0cmVhbSAmLCBRUHRyQ29sbGVjdGlvbjo6SXRlbSApIGNvbnN0OwoKcHJpdmF0ZToK ICAgIFFCYXNlQnVja2V0ICoqdmVjOwogICAgdWludAl2bGVuOwogICAgdWludAludW1JdGVtczsK ICAgIHVpbnQJa2V5dHlwZQk6IDI7CiAgICB1aW50CWNhc2VzCTogMTsKICAgIHVpbnQJY29weWsJ OiAxOwogICAgUUdESXRMaXN0ICAqaXRlcmF0b3JzOwogICAgdm9pZAkgICB1bmxpbmtfY29tbW9u KCBpbnQsIFFCYXNlQnVja2V0ICosIFFCYXNlQnVja2V0ICogKTsKICAgIFFTdHJpbmdCdWNrZXQg KnVubGlua19zdHJpbmcoIGNvbnN0IFFTdHJpbmcgJiwKCQkJCSAgUVB0ckNvbGxlY3Rpb246Okl0 ZW0gaXRlbSA9IDAgKTsKICAgIFFBc2NpaUJ1Y2tldCAgKnVubGlua19hc2NpaSggY29uc3QgY2hh ciAqLCBRUHRyQ29sbGVjdGlvbjo6SXRlbSBpdGVtID0gMCApOwogICAgUUludEJ1Y2tldCAgICAq dW5saW5rX2ludCggbG9uZywgUVB0ckNvbGxlY3Rpb246Okl0ZW0gaXRlbSA9IDAgKTsKICAgIFFQ dHJCdWNrZXQgICAgKnVubGlua19wdHIoIHZvaWQgKiwgUVB0ckNvbGxlY3Rpb246Okl0ZW0gaXRl bSA9IDAgKTsKICAgIHZvaWQJaW5pdCggdWludCwgS2V5VHlwZSwgYm9vbCwgYm9vbCApOwogICAg ZnJpZW5kIGNsYXNzIFFHRGljdEl0ZXJhdG9yOwp9OwoKCmNsYXNzICAgUUdEaWN0SXRlcmF0b3IJ CQkgCnsKZnJpZW5kIGNsYXNzIFFHRGljdDsKcHVibGljOgogICAgUUdEaWN0SXRlcmF0b3IoIGNv bnN0IFFHRGljdCAmICk7CiAgICBRR0RpY3RJdGVyYXRvciggY29uc3QgUUdEaWN0SXRlcmF0b3Ig JiApOwogICAgUUdEaWN0SXRlcmF0b3IgJm9wZXJhdG9yPSggY29uc3QgUUdEaWN0SXRlcmF0b3Ig JiApOwogICB+UUdEaWN0SXRlcmF0b3IoKTsKCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSB0b0Zp cnN0KCk7CgogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZ2V0KCkJICAgICBjb25zdDsKICAgIFFT dHJpbmcJICAgICAgZ2V0S2V5U3RyaW5nKCkgY29uc3Q7CiAgICBjb25zdCBjaGFyCSAgICAgKmdl dEtleUFzY2lpKCkgIGNvbnN0OwogICAgbG9uZwkgICAgICBnZXRLZXlJbnQoKSAgICBjb25zdDsK ICAgIHZvaWQJICAgICAqZ2V0S2V5UHRyKCkgICAgY29uc3Q7CgogICAgUVB0ckNvbGxlY3Rpb246 Okl0ZW0gb3BlcmF0b3IoKSgpOwogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gb3BlcmF0b3IrKygp OwogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gb3BlcmF0b3IrPSh1aW50KTsKCnByb3RlY3RlZDoK ICAgIFFHRGljdAkgICAgICpkaWN0OwoKcHJpdmF0ZToKICAgIFFCYXNlQnVja2V0ICAgICAgKmN1 ck5vZGU7CiAgICB1aW50CSAgICAgIGN1ckluZGV4Owp9OwoKaW5saW5lIFFQdHJDb2xsZWN0aW9u OjpJdGVtIFFHRGljdEl0ZXJhdG9yOjpnZXQoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZSA/ IGN1ck5vZGUtPmdldERhdGEoKSA6IDA7Cn0KCmlubGluZSBRU3RyaW5nIFFHRGljdEl0ZXJhdG9y OjpnZXRLZXlTdHJpbmcoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZSA/ICgoUVN0cmluZ0J1 Y2tldCopY3VyTm9kZSktPmdldEtleSgpIDogUVN0cmluZzo6bnVsbDsKfQoKaW5saW5lIGNvbnN0 IGNoYXIgKlFHRGljdEl0ZXJhdG9yOjpnZXRLZXlBc2NpaSgpIGNvbnN0CnsKICAgIHJldHVybiBj dXJOb2RlID8gKChRQXNjaWlCdWNrZXQqKWN1ck5vZGUpLT5nZXRLZXkoKSA6IDA7Cn0KCmlubGlu ZSBsb25nIFFHRGljdEl0ZXJhdG9yOjpnZXRLZXlJbnQoKSBjb25zdAp7CiAgICByZXR1cm4gY3Vy Tm9kZSA/ICgoUUludEJ1Y2tldCopY3VyTm9kZSktPmdldEtleSgpIDogMDsKfQoKaW5saW5lIHZv aWQgKlFHRGljdEl0ZXJhdG9yOjpnZXRLZXlQdHIoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9k ZSA/ICgoUVB0ckJ1Y2tldCopY3VyTm9kZSktPmdldEtleSgpIDogMDsKfQoKCgojIDQyICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcXB0cmRpY3QuaCIgMgoKCgp0ZW1wbGF0ZTxjbGFzcyB0eXBlPgpj bGFzcyBRUHRyRGljdAoKCgoJOiBwdWJsaWMgUUdEaWN0Cgp7CnB1YmxpYzoKICAgIFFQdHJEaWN0 KGludCBzaXplPTE3KSA6IFFHRGljdChzaXplLFB0cktleSwwLDApIHt9CiAgICBRUHRyRGljdCgg Y29uc3QgUVB0ckRpY3Q8dHlwZT4gJmQgKSA6IFFHRGljdChkKSB7fQogICB+UVB0ckRpY3QoKQkJ CQl7IGNsZWFyKCk7IH0KICAgIFFQdHJEaWN0PHR5cGU+ICZvcGVyYXRvcj0oY29uc3QgUVB0ckRp Y3Q8dHlwZT4gJmQpCgkJCXsgcmV0dXJuIChRUHRyRGljdDx0eXBlPiYpUUdEaWN0OjpvcGVyYXRv cj0oZCk7IH0KICAgIHVpbnQgIGNvdW50KCkgICBjb25zdAkJeyByZXR1cm4gUUdEaWN0Ojpjb3Vu dCgpOyB9CiAgICB1aW50ICBzaXplKCkgICAgY29uc3QJCXsgcmV0dXJuIFFHRGljdDo6c2l6ZSgp OyB9CiAgICBib29sICBpc0VtcHR5KCkgY29uc3QJCXsgcmV0dXJuIFFHRGljdDo6Y291bnQoKSA9 PSAwOyB9CiAgICB2b2lkICBpbnNlcnQoIHZvaWQgKmssIGNvbnN0IHR5cGUgKmQgKQoJCQkJCXsg UUdEaWN0Ojpsb29rX3B0cihrLChJdGVtKWQsMSk7IH0KICAgIHZvaWQgIHJlcGxhY2UoIHZvaWQg KmssIGNvbnN0IHR5cGUgKmQgKQoJCQkJCXsgUUdEaWN0Ojpsb29rX3B0cihrLChJdGVtKWQsMik7 IH0KICAgIGJvb2wgIHJlbW92ZSggdm9pZCAqayApCQl7IHJldHVybiBRR0RpY3Q6OnJlbW92ZV9w dHIoayk7IH0KICAgIHR5cGUgKnRha2UoIHZvaWQgKmsgKQkJeyByZXR1cm4gKHR5cGUqKVFHRGlj dDo6dGFrZV9wdHIoayk7IH0KICAgIHR5cGUgKmZpbmQoIHZvaWQgKmsgKSBjb25zdAoJCXsgcmV0 dXJuICh0eXBlICopKChRR0RpY3QqKXRoaXMpLT5RR0RpY3Q6Omxvb2tfcHRyKGssMCwwKTsgfQog ICAgdHlwZSAqb3BlcmF0b3JbXSggdm9pZCAqayApIGNvbnN0CgkJeyByZXR1cm4gKHR5cGUgKiko KFFHRGljdCopdGhpcyktPlFHRGljdDo6bG9va19wdHIoaywwLDApOyB9CiAgICB2b2lkICBjbGVh cigpCQkJeyBRR0RpY3Q6OmNsZWFyKCk7IH0KICAgIHZvaWQgIHJlc2l6ZSggdWludCBuICkJCXsg UUdEaWN0OjpyZXNpemUobik7IH0KICAgIHZvaWQgIHN0YXRpc3RpY3MoKSBjb25zdAkJeyBRR0Rp Y3Q6OnN0YXRpc3RpY3MoKTsgfQoKCgoKCgoKcHJpdmF0ZToKICAgIHZvaWQgIGRlbGV0ZUl0ZW0o IEl0ZW0gZCApOwp9OwoKCnRlbXBsYXRlPD4gaW5saW5lIHZvaWQgUVB0ckRpY3Q8dm9pZD46OmRl bGV0ZUl0ZW0oIFFQdHJDb2xsZWN0aW9uOjpJdGVtICkKewp9CgoKdGVtcGxhdGU8Y2xhc3MgdHlw ZT4KaW5saW5lIHZvaWQgUVB0ckRpY3Q8dHlwZT46OmRlbGV0ZUl0ZW0oIFFQdHJDb2xsZWN0aW9u OjpJdGVtIGQgKQp7CiAgICBpZiAoIGRlbF9pdGVtICkgZGVsZXRlICh0eXBlICopZDsKfQoKdGVt cGxhdGU8Y2xhc3MgdHlwZT4KY2xhc3MgUVB0ckRpY3RJdGVyYXRvcgo6IHB1YmxpYyBRR0RpY3RJ dGVyYXRvcgp7CnB1YmxpYzoKICAgIFFQdHJEaWN0SXRlcmF0b3IoY29uc3QgUVB0ckRpY3Q8dHlw ZT4gJmQpIDpRR0RpY3RJdGVyYXRvcigoUUdEaWN0ICYpZCkge30KICAgflFQdHJEaWN0SXRlcmF0 b3IoKQkgICAgICB7fQogICAgdWludCAgY291bnQoKSAgIGNvbnN0ICAgICB7IHJldHVybiBkaWN0 LT5jb3VudCgpOyB9CiAgICBib29sICBpc0VtcHR5KCkgY29uc3QgICAgIHsgcmV0dXJuIGRpY3Qt PmNvdW50KCkgPT0gMDsgfQogICAgdHlwZSAqdG9GaXJzdCgpCSAgICAgIHsgcmV0dXJuICh0eXBl ICopUUdEaWN0SXRlcmF0b3I6OnRvRmlyc3QoKTsgfQogICAgb3BlcmF0b3IgdHlwZSAqKCkgIGNv bnN0ICB7IHJldHVybiAodHlwZSAqKVFHRGljdEl0ZXJhdG9yOjpnZXQoKTsgfQogICAgdHlwZSAq Y3VycmVudCgpICAgIGNvbnN0ICB7IHJldHVybiAodHlwZSAqKVFHRGljdEl0ZXJhdG9yOjpnZXQo KTsgfQogICAgdm9pZCAqY3VycmVudEtleSgpIGNvbnN0ICB7IHJldHVybiBRR0RpY3RJdGVyYXRv cjo6Z2V0S2V5UHRyKCk7IH0KICAgIHR5cGUgKm9wZXJhdG9yKCkoKQkgICAgICB7IHJldHVybiAo dHlwZSAqKVFHRGljdEl0ZXJhdG9yOjpvcGVyYXRvcigpKCk7IH0KICAgIHR5cGUgKm9wZXJhdG9y KysoKQkgICAgICB7IHJldHVybiAodHlwZSAqKVFHRGljdEl0ZXJhdG9yOjpvcGVyYXRvcisrKCk7 IH0KICAgIHR5cGUgKm9wZXJhdG9yKz0odWludCBqKSAgeyByZXR1cm4gKHR5cGUgKilRR0RpY3RJ dGVyYXRvcjo6b3BlcmF0b3IrPShqKTt9Cn07CgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3FjYW52YXMuaCIgMgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FwZW4uaCIgMQogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzICAgUVBlbjog cHVibGljIFF0CnsKZnJpZW5kIGNsYXNzIFFQYWludGVyOwpwdWJsaWM6CiAgICBRUGVuKCk7CiAg ICBRUGVuKCBQZW5TdHlsZSApOwogICAgUVBlbiggY29uc3QgUUNvbG9yICZjb2xvciwgdWludCB3 aWR0aD0wLCBQZW5TdHlsZSBzdHlsZT1Tb2xpZExpbmUgKTsKICAgIFFQZW4oIGNvbnN0IFFDb2xv ciAmY2wsIHVpbnQgdywgUGVuU3R5bGUgcywgUGVuQ2FwU3R5bGUgYywgUGVuSm9pblN0eWxlIGop OwogICAgUVBlbiggY29uc3QgUVBlbiAmICk7CiAgIH5RUGVuKCk7CiAgICBRUGVuICZvcGVyYXRv cj0oIGNvbnN0IFFQZW4gJiApOwoKICAgIFBlblN0eWxlCXN0eWxlKCkgY29uc3QJCXsgcmV0dXJu IGRhdGEtPnN0eWxlOyB9CiAgICB2b2lkCXNldFN0eWxlKCBQZW5TdHlsZSApOwogICAgdWludAl3 aWR0aCgpIGNvbnN0CQl7IHJldHVybiBkYXRhLT53aWR0aDsgfQogICAgdm9pZAlzZXRXaWR0aCgg dWludCApOwogICAgY29uc3QgUUNvbG9yICZjb2xvcigpIGNvbnN0CQl7IHJldHVybiBkYXRhLT5j b2xvcjsgfQogICAgdm9pZAlzZXRDb2xvciggY29uc3QgUUNvbG9yICYgKTsKICAgIFBlbkNhcFN0 eWxlCWNhcFN0eWxlKCkgY29uc3Q7CiAgICB2b2lkCXNldENhcFN0eWxlKCBQZW5DYXBTdHlsZSAp OwogICAgUGVuSm9pblN0eWxlIGpvaW5TdHlsZSgpIGNvbnN0OwogICAgdm9pZAlzZXRKb2luU3R5 bGUoIFBlbkpvaW5TdHlsZSApOwoKICAgIGJvb2wJb3BlcmF0b3I9PSggY29uc3QgUVBlbiAmcCAp IGNvbnN0OwogICAgYm9vbAlvcGVyYXRvciE9KCBjb25zdCBRUGVuICZwICkgY29uc3QKCQkJCQl7 IHJldHVybiAhKG9wZXJhdG9yPT0ocCkpOyB9Cgpwcml2YXRlOgogICAgUVBlbgljb3B5KCkJY29u c3Q7CiAgICB2b2lkCWRldGFjaCgpOwogICAgdm9pZAlpbml0KCBjb25zdCBRQ29sb3IgJiwgdWlu dCwgdWludCApOwogICAgc3RydWN0IFFQZW5EYXRhIDogcHVibGljIFFTaGFyZWQgewkJIAoJUGVu U3R5bGUgIHN0eWxlOwoJdWludAkgIHdpZHRoOwoJUUNvbG9yCSAgY29sb3I7CglRX1VJTlQxNiAg bGluZXN0OwogICAgfSAqZGF0YTsKfTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwo IFFEYXRhU3RyZWFtICYsIGNvbnN0IFFQZW4gJiApOwogIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBRRGF0YVN0cmVhbSAmLCBRUGVuICYgKTsKCgoKIyA0NyAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3FjYW52YXMuaCIgMgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fwb2ludGFycmF5Lmgi IDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xh c3MgICBRUG9pbnRBcnJheSA6IHB1YmxpYyBRTWVtQXJyYXk8UVBvaW50Pgp7CnB1YmxpYzoKICAg IFFQb2ludEFycmF5KCkge30KICAgIH5RUG9pbnRBcnJheSgpIHt9CiAgICBRUG9pbnRBcnJheSgg aW50IHNpemUgKSA6IFFNZW1BcnJheTxRUG9pbnQ+KCBzaXplICkge30KICAgIFFQb2ludEFycmF5 KCBjb25zdCBRUG9pbnRBcnJheSAmYSApIDogUU1lbUFycmF5PFFQb2ludD4oIGEgKSB7fQogICAg UVBvaW50QXJyYXkoIGNvbnN0IFFSZWN0ICZyLCBib29sIGNsb3NlZD1GQUxTRSApOwogICAgUVBv aW50QXJyYXkoIGludCBuUG9pbnRzLCBjb25zdCBRQ09PUkQgKnBvaW50cyApOwoKICAgIFFQb2lu dEFycmF5CSAmb3BlcmF0b3I9KCBjb25zdCBRUG9pbnRBcnJheSAmYSApCgl7IHJldHVybiAoUVBv aW50QXJyYXkmKWFzc2lnbiggYSApOyB9CgogICAgUVBvaW50QXJyYXkgY29weSgpIGNvbnN0Cgl7 IFFQb2ludEFycmF5IHRtcDsgcmV0dXJuICooKFFQb2ludEFycmF5KikmdG1wLmR1cGxpY2F0ZSgq dGhpcykpOyB9CgogICAgdm9pZCAgICB0cmFuc2xhdGUoIGludCBkeCwgaW50IGR5ICk7CiAgICBR UmVjdCAgIGJvdW5kaW5nUmVjdCgpIGNvbnN0OwoKICAgIHZvaWQgICAgcG9pbnQoIHVpbnQgaSwg aW50ICp4LCBpbnQgKnkgKSBjb25zdDsKICAgIFFQb2ludCAgcG9pbnQoIHVpbnQgaSApIGNvbnN0 OwogICAgdm9pZCAgICBzZXRQb2ludCggdWludCBpLCBpbnQgeCwgaW50IHkgKTsKICAgIHZvaWQg ICAgc2V0UG9pbnQoIHVpbnQgaSwgY29uc3QgUVBvaW50ICZwICk7CiAgICBib29sICAgIHNldFBv aW50cyggaW50IG5Qb2ludHMsIGNvbnN0IFFDT09SRCAqcG9pbnRzICk7CiAgICBib29sICAgIHNl dFBvaW50cyggaW50IG5Qb2ludHMsIGludCBmaXJzdHgsIGludCBmaXJzdHksIC4uLiApOwogICAg Ym9vbCAgICBwdXRQb2ludHMoIGludCBpbmRleCwgaW50IG5Qb2ludHMsIGNvbnN0IFFDT09SRCAq cG9pbnRzICk7CiAgICBib29sICAgIHB1dFBvaW50cyggaW50IGluZGV4LCBpbnQgblBvaW50cywg aW50IGZpcnN0eCwgaW50IGZpcnN0eSwgLi4uICk7CiAgICBib29sICAgIHB1dFBvaW50cyggaW50 IGluZGV4LCBpbnQgblBvaW50cywKCQkgICAgICAgY29uc3QgUVBvaW50QXJyYXkgJiBmcm9tLCBp bnQgZnJvbUluZGV4PTAgKTsKCiAgICB2b2lkICAgIG1ha2VBcmMoIGludCB4LCBpbnQgeSwgaW50 IHcsIGludCBoLCBpbnQgYTEsIGludCBhMiApOwogICAgdm9pZCAgICBtYWtlRWxsaXBzZSggaW50 IHgsIGludCB5LCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQgICAgbWFrZUFyYyggaW50IHgsIGlu dCB5LCBpbnQgdywgaW50IGgsIGludCBhMSwgaW50IGEyLAoJCSAgICAgY29uc3QgUVdNYXRyaXgm ICk7CiAgICBRUG9pbnRBcnJheSBjdWJpY0JlemllcigpIGNvbnN0OwoKICAgIHZvaWQqICBzaG9y dFBvaW50cyggaW50IGluZGV4ID0gMCwgaW50IG5Qb2ludHMgPSAtMSApIGNvbnN0OwogICAgc3Rh dGljIHZvaWQgY2xlYW5CdWZmZXJzKCk7Cgpwcm90ZWN0ZWQ6CiAgICBzdGF0aWMgdWludCBzcGxl bjsKICAgIHN0YXRpYyB2b2lkKiBzcDsKfTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9y PDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFQb2ludEFycmF5ICYgKTsKICBRRGF0YVN0cmVhbSAm b3BlcmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUVBvaW50QXJyYXkgJiApOwoKCiAKCgoKaW5saW5l IHZvaWQgUVBvaW50QXJyYXk6OnNldFBvaW50KCB1aW50IGksIGNvbnN0IFFQb2ludCAmcCApCnsK ICAgIHNldFBvaW50KCBpLCBwLngoKSwgcC55KCkgKTsKfQoKCgojIDQ5ICIvdXNyL2xvY2FsL3F0 L2luY2x1ZGUvcWNhbnZhcy5oIiAyCgoKCgoKCgoKCgoKCmNsYXNzIFFDYW52YXNTcHJpdGU7CmNs YXNzIFFDYW52YXNQb2x5Z29uYWxJdGVtOwpjbGFzcyBRQ2FudmFzUmVjdGFuZ2xlOwpjbGFzcyBR Q2FudmFzUG9seWdvbjsKY2xhc3MgUUNhbnZhc0VsbGlwc2U7CmNsYXNzIFFDYW52YXNUZXh0Owpj bGFzcyBRQ2FudmFzTGluZTsKY2xhc3MgUUNhbnZhc0NodW5rOwpjbGFzcyBRQ2FudmFzOwpjbGFz cyBRQ2FudmFzSXRlbTsKY2xhc3MgUUNhbnZhc1ZpZXc7CmNsYXNzIFFDYW52YXNQaXhtYXA7CgoK CgoKCgoKCgoKY2xhc3MgICAgUUNhbnZhc0l0ZW1MaXN0IDogcHVibGljIFFWYWx1ZUxpc3Q8UUNh bnZhc0l0ZW0qPiB7CnB1YmxpYzoKICAgIHZvaWQgc29ydCgpOwogICAgdm9pZCBkcmF3VW5pcXVl KCBRUGFpbnRlciYgcGFpbnRlciApOwp9OwoKCmNsYXNzIFFDYW52YXNJdGVtRXh0cmE7CgpjbGFz cyAgICBRQ2FudmFzSXRlbSA6IHB1YmxpYyBRdAp7CnB1YmxpYzoKICAgIFFDYW52YXNJdGVtKFFD YW52YXMqIGNhbnZhcyk7CiAgICB2aXJ0dWFsIH5RQ2FudmFzSXRlbSgpOwoKICAgIGRvdWJsZSB4 KCkgY29uc3QKCXsgcmV0dXJuIG15eDsgfQogICAgZG91YmxlIHkoKSBjb25zdAoJeyByZXR1cm4g bXl5OyB9CiAgICBkb3VibGUgeigpIGNvbnN0Cgl7IHJldHVybiBteXo7IH0gIAoKICAgIHZpcnR1 YWwgdm9pZCBtb3ZlQnkoZG91YmxlIGR4LCBkb3VibGUgZHkpOwogICAgdm9pZCBtb3ZlKGRvdWJs ZSB4LCBkb3VibGUgeSk7CiAgICB2b2lkIHNldFgoZG91YmxlIGEpIHsgbW92ZShhLHkoKSk7IH0K ICAgIHZvaWQgc2V0WShkb3VibGUgYSkgeyBtb3ZlKHgoKSxhKTsgfQogICAgdm9pZCBzZXRaKGRv dWJsZSBhKSB7IG15ej1hOyBjaGFuZ2VDaHVua3MoKTsgfQoKICAgIGJvb2wgYW5pbWF0ZWQoKSBj b25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRBbmltYXRlZChib29sIHkpOwogICAgdmlydHVhbCB2 b2lkIHNldFZlbG9jaXR5KCBkb3VibGUgdngsIGRvdWJsZSB2eSk7CiAgICB2b2lkIHNldFhWZWxv Y2l0eSggZG91YmxlIHZ4ICkgeyBzZXRWZWxvY2l0eSh2eCx5VmVsb2NpdHkoKSk7IH0KICAgIHZv aWQgc2V0WVZlbG9jaXR5KCBkb3VibGUgdnkgKSB7IHNldFZlbG9jaXR5KHhWZWxvY2l0eSgpLHZ5 KTsgfQogICAgZG91YmxlIHhWZWxvY2l0eSgpIGNvbnN0OwogICAgZG91YmxlIHlWZWxvY2l0eSgp IGNvbnN0OwogICAgdmlydHVhbCB2b2lkIGFkdmFuY2UoaW50IHN0YWdlKTsKCiAgICB2aXJ0dWFs IGJvb2wgY29sbGlkZXNXaXRoKCBjb25zdCBRQ2FudmFzSXRlbSogKSBjb25zdD0wOwoKICAgIFFD YW52YXNJdGVtTGlzdCBjb2xsaXNpb25zKGJvb2wgZXhhY3QgICApIGNvbnN0OwoKICAgIHZpcnR1 YWwgdm9pZCBzZXRDYW52YXMoUUNhbnZhcyopOwoKICAgIHZpcnR1YWwgdm9pZCBkcmF3KFFQYWlu dGVyJik9MDsKCiAgICB2b2lkIHNob3coKTsKICAgIHZvaWQgaGlkZSgpOwoKICAgIHZpcnR1YWwg dm9pZCBzZXRWaXNpYmxlKGJvb2wgeWVzKTsKICAgIGJvb2wgaXNWaXNpYmxlKCkgY29uc3QKCXsg cmV0dXJuIChib29sKXZpczsgfQogICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkKGJvb2wgeWVz KTsKICAgIGJvb2wgaXNTZWxlY3RlZCgpIGNvbnN0Cgl7IHJldHVybiAoYm9vbClzZWw7IH0KICAg IHZpcnR1YWwgdm9pZCBzZXRFbmFibGVkKGJvb2wgeWVzKTsKICAgIGJvb2wgaXNFbmFibGVkKCkg Y29uc3QKCXsgcmV0dXJuIChib29sKWVuYTsgfQogICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZShi b29sIHllcyk7CiAgICBib29sIGlzQWN0aXZlKCkgY29uc3QKCXsgcmV0dXJuIChib29sKWFjdDsg fQoKICAgIGJvb2wgdmlzaWJsZSgpIGNvbnN0Cgl7IHJldHVybiAoYm9vbCl2aXM7IH0KICAgIGJv b2wgc2VsZWN0ZWQoKSBjb25zdAoJeyByZXR1cm4gKGJvb2wpc2VsOyB9CiAgICBib29sIGVuYWJs ZWQoKSBjb25zdAoJeyByZXR1cm4gKGJvb2wpZW5hOyB9CiAgICBib29sIGFjdGl2ZSgpIGNvbnN0 Cgl7IHJldHVybiAoYm9vbClhY3Q7IH0KCgogICAgZW51bSBSdHRpVmFsdWVzIHsKCVJ0dGlfSXRl bSA9IDAsCglSdHRpX1Nwcml0ZSA9IDEsCglSdHRpX1BvbHlnb25hbEl0ZW0gPSAyLAoJUnR0aV9U ZXh0ID0gMywKCVJ0dGlfUG9seWdvbiA9IDQsCglSdHRpX1JlY3RhbmdsZSA9IDUsCglSdHRpX0Vs bGlwc2UgPSA2LAoJUnR0aV9MaW5lID0gNywKCVJ0dGlfU3BsaW5lID0gOAogICAgfTsKCiAgICB2 aXJ0dWFsIGludCBydHRpKCkgY29uc3Q7CiAgICBzdGF0aWMgaW50IFJUVEk7CgogICAgdmlydHVh bCBRUmVjdCBib3VuZGluZ1JlY3QoKSBjb25zdD0wOwogICAgdmlydHVhbCBRUmVjdCBib3VuZGlu Z1JlY3RBZHZhbmNlZCgpIGNvbnN0OwoKICAgIFFDYW52YXMqIGNhbnZhcygpIGNvbnN0Cgl7IHJl dHVybiBjbnY7IH0KCnByb3RlY3RlZDoKICAgIHZvaWQgdXBkYXRlKCkgeyBjaGFuZ2VDaHVua3Mo KTsgfQoKcHJpdmF0ZToKICAgICAKCiAgICBmcmllbmQgY2xhc3MgUUNhbnZhc1BvbHlnb25hbEl0 ZW07CiAgICBmcmllbmQgY2xhc3MgUUNhbnZhc1Nwcml0ZTsKICAgIGZyaWVuZCBjbGFzcyBRQ2Fu dmFzUmVjdGFuZ2xlOwogICAgZnJpZW5kIGNsYXNzIFFDYW52YXNQb2x5Z29uOwogICAgZnJpZW5k IGNsYXNzIFFDYW52YXNFbGxpcHNlOwogICAgZnJpZW5kIGNsYXNzIFFDYW52YXNUZXh0OwogICAg ZnJpZW5kIGNsYXNzIFFDYW52YXNMaW5lOwoKICAgIHZpcnR1YWwgUVBvaW50QXJyYXkgY2h1bmtz KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgYWRkVG9DaHVua3MoKTsKICAgIHZpcnR1YWwgdm9p ZCByZW1vdmVGcm9tQ2h1bmtzKCk7CiAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlQ2h1bmtzKCk7CiAg ICB2aXJ0dWFsIGJvb2wgY29sbGlkZXNXaXRoKCBjb25zdCBRQ2FudmFzU3ByaXRlKiwKCQkJICAg ICAgIGNvbnN0IFFDYW52YXNQb2x5Z29uYWxJdGVtKiwKCQkJICAgICAgIGNvbnN0IFFDYW52YXNS ZWN0YW5nbGUqLAoJCQkgICAgICAgY29uc3QgUUNhbnZhc0VsbGlwc2UqLAoJCQkgICAgICAgY29u c3QgUUNhbnZhc1RleHQqICkgY29uc3QgPSAwOwogICAgIAoKICAgIFFDYW52YXMqIGNudjsKICAg IHN0YXRpYyBRQ2FudmFzKiBjdXJyZW50X2NhbnZhczsKICAgIGRvdWJsZSBteXgsbXl5LG15ejsK ICAgIFFDYW52YXNJdGVtRXh0cmEgKmV4dDsKICAgIFFDYW52YXNJdGVtRXh0cmEmIGV4dHJhKCk7 CiAgICB1aW50IGFuaToxOwogICAgdWludCB2aXM6MTsKICAgIHVpbnQgc2VsOjE7CiAgICB1aW50 IGVuYToxOwogICAgdWludCBhY3Q6MTsKfTsKCgpjbGFzcyBRQ2FudmFzRGF0YTsKCmNsYXNzICAg IFFDYW52YXMgOiBwdWJsaWMgUU9iamVjdAp7CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmpl Y3QgKm1ldGFPYmplY3QoKSBjb25zdCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0Jdmly dHVhbCBjb25zdCBjaGFyICpjbGFzc05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0 KCBjb25zdCBjaGFyKiApOyB2aXJ0dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiAp OyB2aXJ0dWFsIGJvb2wgcXRfZW1pdCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0 X3Byb3BlcnR5KCBpbnQsIGludCwgUVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0 YXRpY01ldGFPYmplY3QoKTsJUU9iamVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0 aGlzOyB9IHN0YXRpYyBRU3RyaW5nIHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAg KTsgc3RhdGljIFFTdHJpbmcgdHJVdGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAg KTsgCXByaXZhdGU6CXN0YXRpYyBRTWV0YU9iamVjdCAqbWV0YU9iajsgCnB1YmxpYzoKICAgIFFD YW52YXMoIFFPYmplY3QqIHBhcmVudCA9IDAsIGNvbnN0IGNoYXIqIG5hbWUgPSAwICk7CiAgICBR Q2FudmFzKGludCB3LCBpbnQgaCk7CiAgICBRQ2FudmFzKCBRUGl4bWFwIHAsIGludCBoLCBpbnQg diwgaW50IHRpbGV3aWR0aCwgaW50IHRpbGVoZWlnaHQgKTsKCiAgICB2aXJ0dWFsIH5RQ2FudmFz KCk7CgogICAgdmlydHVhbCB2b2lkIHNldFRpbGVzKCBRUGl4bWFwIHRpbGVzLCBpbnQgaCwgaW50 IHYsCgkJCSAgIGludCB0aWxld2lkdGgsIGludCB0aWxlaGVpZ2h0ICk7CiAgICB2aXJ0dWFsIHZv aWQgc2V0QmFja2dyb3VuZFBpeG1hcCggY29uc3QgUVBpeG1hcCYgcCApOwogICAgUVBpeG1hcCBi YWNrZ3JvdW5kUGl4bWFwKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRD b2xvciggY29uc3QgUUNvbG9yJiBjICk7CiAgICBRQ29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29u c3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFRpbGUoIGludCB4LCBpbnQgeSwgaW50IHRpbGVudW0g KTsKICAgIGludCB0aWxlKCBpbnQgeCwgaW50IHkgKSBjb25zdAoJeyByZXR1cm4gZ3JpZFt4K3kq aHRpbGVzXTsgfQoKICAgIGludCB0aWxlc0hvcml6b250YWxseSgpIGNvbnN0Cgl7IHJldHVybiBo dGlsZXM7IH0KICAgIGludCB0aWxlc1ZlcnRpY2FsbHkoKSBjb25zdAoJeyByZXR1cm4gdnRpbGVz OyB9CgogICAgaW50IHRpbGVXaWR0aCgpIGNvbnN0Cgl7IHJldHVybiB0aWxldzsgfQogICAgaW50 IHRpbGVIZWlnaHQoKSBjb25zdAoJeyByZXR1cm4gdGlsZWg7IH0KCiAgICB2aXJ0dWFsIHZvaWQg cmVzaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICBpbnQgd2lkdGgoKSBjb25zdAoJeyBy ZXR1cm4gYXdpZHRoOyB9CiAgICBpbnQgaGVpZ2h0KCkgY29uc3QKCXsgcmV0dXJuIGFoZWlnaHQ7 IH0KICAgIFFTaXplIHNpemUoKSBjb25zdAoJeyByZXR1cm4gUVNpemUoYXdpZHRoLGFoZWlnaHQp OyB9CiAgICBRUmVjdCByZWN0KCkgY29uc3QKCXsgcmV0dXJuIFFSZWN0KCAwLCAwLCBhd2lkdGgs IGFoZWlnaHQgKTsgfQogICAgYm9vbCBvbkNhbnZhcyggaW50IHgsIGludCB5ICkgY29uc3QKCXsg cmV0dXJuIHg+PTAgJiYgeT49MCAmJiB4PGF3aWR0aCAmJiB5PGFoZWlnaHQ7IH0KICAgIGJvb2wg b25DYW52YXMoIGNvbnN0IFFQb2ludCYgcCApIGNvbnN0Cgl7IHJldHVybiBvbkNhbnZhcyhwLngo KSxwLnkoKSk7IH0KICAgIGJvb2wgdmFsaWRDaHVuayggaW50IHgsIGludCB5ICkgY29uc3QKCXsg cmV0dXJuIHg+PTAgJiYgeT49MCAmJiB4PGNod2lkdGggJiYgeTxjaGhlaWdodDsgfQogICAgYm9v bCB2YWxpZENodW5rKCBjb25zdCBRUG9pbnQmIHAgKSBjb25zdAoJeyByZXR1cm4gdmFsaWRDaHVu ayhwLngoKSxwLnkoKSk7IH0KCiAgICBpbnQgY2h1bmtTaXplKCkgY29uc3QKCXsgcmV0dXJuIGNo dW5rc2l6ZTsgfQogICAgdmlydHVhbCB2b2lkIHJldHVuZShpbnQgY2h1bmtzaXplLCBpbnQgbWF4 Y2x1c3RlcnM9MTAwKTsKCiAgICBib29sIHNhbWVDaHVuayhpbnQgeDEsIGludCB5MSwgaW50IHgy LCBpbnQgeTIpIGNvbnN0Cgl7IHJldHVybiB4MS9jaHVua3NpemU9PXgyL2NodW5rc2l6ZSAmJiB5 MS9jaHVua3NpemU9PXkyL2NodW5rc2l6ZTsgfQogICAgdmlydHVhbCB2b2lkIHNldENoYW5nZWRD aHVuayhpbnQgaSwgaW50IGopOwogICAgdmlydHVhbCB2b2lkIHNldENoYW5nZWRDaHVua0NvbnRh aW5pbmcoaW50IHgsIGludCB5KTsKICAgIHZpcnR1YWwgdm9pZCBzZXRBbGxDaGFuZ2VkKCk7CiAg ICB2aXJ0dWFsIHZvaWQgc2V0Q2hhbmdlZChjb25zdCBRUmVjdCYgYXJlYSk7CiAgICB2aXJ0dWFs IHZvaWQgc2V0VW5jaGFuZ2VkKGNvbnN0IFFSZWN0JiBhcmVhKTsKCiAgICAgCiAgICB2b2lkIGFk ZEl0ZW1Ub0NodW5rKFFDYW52YXNJdGVtKiwgaW50IGksIGludCBqKTsKICAgIHZvaWQgcmVtb3Zl SXRlbUZyb21DaHVuayhRQ2FudmFzSXRlbSosIGludCBpLCBpbnQgaik7CiAgICB2b2lkIGFkZEl0 ZW1Ub0NodW5rQ29udGFpbmluZyhRQ2FudmFzSXRlbSosIGludCB4LCBpbnQgeSk7CiAgICB2b2lk IHJlbW92ZUl0ZW1Gcm9tQ2h1bmtDb250YWluaW5nKFFDYW52YXNJdGVtKiwgaW50IHgsIGludCB5 KTsKCiAgICBRQ2FudmFzSXRlbUxpc3QgYWxsSXRlbXMoKTsKICAgIFFDYW52YXNJdGVtTGlzdCBj b2xsaXNpb25zKCBjb25zdCBRUG9pbnQmKSBjb25zdDsKICAgIFFDYW52YXNJdGVtTGlzdCBjb2xs aXNpb25zKCBjb25zdCBRUmVjdCYpIGNvbnN0OwogICAgUUNhbnZhc0l0ZW1MaXN0IGNvbGxpc2lv bnMoIGNvbnN0IFFQb2ludEFycmF5JiBwYSwgY29uc3QgUUNhbnZhc0l0ZW0qIGl0ZW0sCgkJCQli b29sIGV4YWN0KSBjb25zdDsKCiAgICB2b2lkIGRyYXdBcmVhKGNvbnN0IFFSZWN0JiwgUVBhaW50 ZXIqIHAsIGJvb2wgZG91YmxlX2J1ZmZlcj1GQUxTRSk7CgogICAgIAogICAgdmlydHVhbCB2b2lk IGFkZFZpZXcoUUNhbnZhc1ZpZXcqKTsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVWaWV3KFFDYW52 YXNWaWV3Kik7CiAgICB2b2lkIGRyYXdDYW52YXNBcmVhKGNvbnN0IFFSZWN0JiwgUVBhaW50ZXIq IHA9MCwgYm9vbCBkb3VibGVfYnVmZmVyPVRSVUUpOwoKICAgIHZvaWQgZHJhd1ZpZXdBcmVhKCBR Q2FudmFzVmlldyogdmlldywgUVBhaW50ZXIqIHAsIGNvbnN0IFFSZWN0JiByLCBib29sIGRidWYg KTsKCgogICAgIAogICAgdmlydHVhbCB2b2lkIGFkZEl0ZW0oUUNhbnZhc0l0ZW0qKTsKICAgIHZp cnR1YWwgdm9pZCBhZGRBbmltYXRpb24oUUNhbnZhc0l0ZW0qKTsKICAgIHZpcnR1YWwgdm9pZCBy ZW1vdmVJdGVtKFFDYW52YXNJdGVtKik7CiAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlQW5pbWF0aW9u KFFDYW52YXNJdGVtKik7CgogICAgdmlydHVhbCB2b2lkIHNldEFkdmFuY2VQZXJpb2QoaW50IG1z KTsKICAgIHZpcnR1YWwgdm9pZCBzZXRVcGRhdGVQZXJpb2QoaW50IG1zKTsKCiAgICB2aXJ0dWFs IHZvaWQgc2V0RG91YmxlQnVmZmVyaW5nKGJvb2wgeSk7Cgpwcm90ZWN0ZWQgOgogICAgdm9pZCBy ZXNpemVkKCk7CgpwdWJsaWMgIDoKICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlKCk7CiAgICB2aXJ0 dWFsIHZvaWQgdXBkYXRlKCk7Cgpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIHZvaWQgZHJhd0JhY2tn cm91bmQoUVBhaW50ZXImLCBjb25zdCBRUmVjdCYgYXJlYSk7CiAgICB2aXJ0dWFsIHZvaWQgZHJh d0ZvcmVncm91bmQoUVBhaW50ZXImLCBjb25zdCBRUmVjdCYgYXJlYSk7Cgpwcml2YXRlOgogICAg dm9pZCBpbml0KGludCB3LCBpbnQgaCwgaW50IGNodW5rc3plPTE2LCBpbnQgbWF4Y2x1c3Q9MTAw KTsKCiAgICBRQ2FudmFzQ2h1bmsmIGNodW5rKGludCBpLCBpbnQgaikgY29uc3Q7CiAgICBRQ2Fu dmFzQ2h1bmsmIGNodW5rQ29udGFpbmluZyhpbnQgeCwgaW50IHkpIGNvbnN0OwoKICAgIFFSZWN0 IGNoYW5nZUJvdW5kcyhjb25zdCBRUmVjdCYgaW5hcmVhKTsKICAgIHZvaWQgZHJhd0NoYW5nZXMo Y29uc3QgUVJlY3QmIGluYXJlYSk7CgogICAgdm9pZCBlbnN1cmVPZmZTY3JTaXplKCBpbnQgb3N3 LCBpbnQgb3NoICk7CiAgICBRUGl4bWFwIG9mZnNjcjsKICAgIGludCBhd2lkdGgsYWhlaWdodDsK ICAgIGludCBjaHVua3NpemU7CiAgICBpbnQgbWF4Y2x1c3RlcnM7CiAgICBpbnQgY2h3aWR0aCxj aGhlaWdodDsKICAgIFFDYW52YXNDaHVuayogY2h1bmtzOwoKICAgIFFDYW52YXNEYXRhKiBkOwoK ICAgIHZvaWQgaW5pdFRpbGVzKFFQaXhtYXAgcCwgaW50IGgsIGludCB2LCBpbnQgdGlsZXdpZHRo LCBpbnQgdGlsZWhlaWdodCk7CiAgICB1c2hvcnQgKmdyaWQ7CiAgICB1c2hvcnQgaHRpbGVzOwog ICAgdXNob3J0IHZ0aWxlczsKICAgIHVzaG9ydCB0aWxldzsKICAgIHVzaG9ydCB0aWxlaDsKICAg IGJvb2wgb25lb25lOwogICAgUVBpeG1hcCBwbTsKICAgIFFUaW1lciogdXBkYXRlX3RpbWVyOwog ICAgUUNvbG9yIGJnY29sb3I7CiAgICBib29sIGRlYnVnX3JlZHJhd19hcmVhczsKICAgIGJvb2wg ZGJsYnVmOwoKICAgIGZyaWVuZCB2b2lkIHF0X3VudmlldyhRQ2FudmFzKiBjKTsKfTsKCmNsYXNz IFFDYW52YXNWaWV3RGF0YTsKCmNsYXNzICAgIFFDYW52YXNWaWV3IDogcHVibGljIFFTY3JvbGxW aWV3CnsKICAgIHB1YmxpYzoJdmlydHVhbCBRTWV0YU9iamVjdCAqbWV0YU9iamVjdCgpIGNvbnN0 IHsgcmV0dXJuIHN0YXRpY01ldGFPYmplY3QoKTsJfQl2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNz TmFtZSgpIGNvbnN0Owl2aXJ0dWFsIHZvaWQqIHF0X2Nhc3QoIGNvbnN0IGNoYXIqICk7IHZpcnR1 YWwgYm9vbCBxdF9pbnZva2UoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9lbWl0 KCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wgcXRfcHJvcGVydHkoIGludCwgaW50LCBR VmFyaWFudCogKTsgCXN0YXRpYyBRTWV0YU9iamVjdCogc3RhdGljTWV0YU9iamVjdCgpOwlRT2Jq ZWN0KiBxT2JqZWN0KCkgeyByZXR1cm4gKFFPYmplY3QqKXRoaXM7IH0gc3RhdGljIFFTdHJpbmcg dHIoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqID0gMCApOyBzdGF0aWMgUVN0cmluZyB0clV0 ZjgoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqID0gMCApOyAJcHJpdmF0ZToJc3RhdGljIFFN ZXRhT2JqZWN0ICptZXRhT2JqOyAKcHVibGljOgoKICAgIFFDYW52YXNWaWV3KFFXaWRnZXQqIHBh cmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAsIFdGbGFncyBmPTApOwogICAgUUNhbnZhc1ZpZXco UUNhbnZhcyogdmlld2luZywgUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIqIG5hbWU9MCwg V0ZsYWdzIGY9MCk7CiAgICB+UUNhbnZhc1ZpZXcoKTsKCiAgICBRQ2FudmFzKiBjYW52YXMoKSBj b25zdAoJeyByZXR1cm4gdmlld2luZzsgfQogICAgdm9pZCBzZXRDYW52YXMoUUNhbnZhcyogdik7 CgogICAgY29uc3QgUVdNYXRyaXggJndvcmxkTWF0cml4KCkgY29uc3Q7CiAgICBjb25zdCBRV01h dHJpeCAmaW52ZXJzZVdvcmxkTWF0cml4KCkgY29uc3Q7CiAgICBib29sIHNldFdvcmxkTWF0cml4 KCBjb25zdCBRV01hdHJpeCAmICk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIGRyYXdDb250ZW50cygg UVBhaW50ZXIqLCBpbnQgY3gsIGludCBjeSwgaW50IGN3LCBpbnQgY2ggKTsKICAgIFFTaXplIHNp emVIaW50KCkgY29uc3Q7Cgpwcml2YXRlOgogICAgdm9pZCBkcmF3Q29udGVudHMoIFFQYWludGVy KiApOwogICAgUUNhbnZhcyogdmlld2luZzsKICAgIFFDYW52YXNWaWV3RGF0YSogZDsKICAgIGZy aWVuZCB2b2lkIHF0X3VudmlldyhRQ2FudmFzKiBjKTsKCnByaXZhdGUgIDoKICAgIHZvaWQgY01v dmluZyhpbnQsaW50KTsKICAgIHZvaWQgdXBkYXRlQ29udGVudHNTaXplKCk7Cn07CgoKY2xhc3Mg ICAgUUNhbnZhc1BpeG1hcCA6IHB1YmxpYyBRUGl4bWFwCnsKcHVibGljOgoKICAgIFFDYW52YXNQ aXhtYXAoY29uc3QgUVN0cmluZyYgZGF0YWZpbGVuYW1lKTsKCiAgICBRQ2FudmFzUGl4bWFwKGNv bnN0IFFJbWFnZSYgaW1hZ2UpOwogICAgUUNhbnZhc1BpeG1hcChjb25zdCBRUGl4bWFwJiwgY29u c3QgUVBvaW50JiBob3RzcG90KTsKICAgIH5RQ2FudmFzUGl4bWFwKCk7CgogICAgaW50IG9mZnNl dFgoKSBjb25zdAoJeyByZXR1cm4gaG90eDsgfQogICAgaW50IG9mZnNldFkoKSBjb25zdAoJeyBy ZXR1cm4gaG90eTsgfQogICAgdm9pZCBzZXRPZmZzZXQoaW50IHgsIGludCB5KSB7IGhvdHggPSB4 OyBob3R5ID0geTsgfQoKcHJpdmF0ZToKICAgIHZvaWQgaW5pdChjb25zdCBRSW1hZ2UmKTsKICAg IHZvaWQgaW5pdChjb25zdCBRUGl4bWFwJiBwaXhtYXAsIGludCBoeCwgaW50IGh5KTsKCiAgICBm cmllbmQgY2xhc3MgUUNhbnZhc1Nwcml0ZTsKICAgIGZyaWVuZCBjbGFzcyBRQ2FudmFzUGl4bWFw QXJyYXk7CiAgICBmcmllbmQgYm9vbCBxdF90ZXN0Q29sbGlzaW9uKGNvbnN0IFFDYW52YXNTcHJp dGUqIHMxLCBjb25zdCBRQ2FudmFzU3ByaXRlKiBzMik7CgogICAgaW50IGhvdHgsaG90eTsKCiAg ICBRSW1hZ2UqIGNvbGxpc2lvbl9tYXNrOwp9OwoKCmNsYXNzICAgIFFDYW52YXNQaXhtYXBBcnJh eQp7CnB1YmxpYzoKICAgIFFDYW52YXNQaXhtYXBBcnJheSgpOwoKICAgIFFDYW52YXNQaXhtYXBB cnJheShjb25zdCBRU3RyaW5nJiBkYXRhZmlsZW5hbWVwYXR0ZXJuLCBpbnQgZnJhbWVjb3VudD0w KTsKCiAgICAgCiAgICBRQ2FudmFzUGl4bWFwQXJyYXkoUVB0ckxpc3Q8UVBpeG1hcD4sIFFQdHJM aXN0PFFQb2ludD4gaG90c3BvdHMpOwoKICAgIFFDYW52YXNQaXhtYXBBcnJheShRVmFsdWVMaXN0 PFFQaXhtYXA+LCBRUG9pbnRBcnJheSBob3RzcG90cyA9IFFQb2ludEFycmF5KCkgKTsKICAgIH5R Q2FudmFzUGl4bWFwQXJyYXkoKTsKCgogICAgYm9vbCByZWFkUGl4bWFwcyhjb25zdCBRU3RyaW5n JiBkYXRhZmlsZW5hbWVwYXR0ZXJuLCBpbnQgZnJhbWVjb3VudD0wKTsKICAgIGJvb2wgcmVhZENv bGxpc2lvbk1hc2tzKGNvbnN0IFFTdHJpbmcmIGZpbGVuYW1lcGF0dGVybik7CgoKICAgICAKICAg IGJvb2wgb3BlcmF0b3IhKCk7ICAKICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwoKICAgIFFDYW52 YXNQaXhtYXAqIGltYWdlKGludCBpKSBjb25zdAoJeyByZXR1cm4gaW1nID8gaW1nW2ldIDogMDsg fQogICAgdm9pZCBzZXRJbWFnZShpbnQgaSwgUUNhbnZhc1BpeG1hcCogcCk7CiAgICB1aW50IGNv dW50KCkgY29uc3QKCXsgcmV0dXJuICh1aW50KWZyYW1lY291bnQ7IH0KCnByaXZhdGU6CgogICAg Ym9vbCByZWFkUGl4bWFwcyhjb25zdCBRU3RyaW5nJiBkYXRhZmlsZW5hbWVwYXR0ZXJuLCBpbnQg ZnJhbWVjb3VudCwgYm9vbCBtYXNrb25seSk7CgoKICAgIHZvaWQgcmVzZXQoKTsKICAgIGludCBm cmFtZWNvdW50OwogICAgUUNhbnZhc1BpeG1hcCoqIGltZzsKfTsKCgpjbGFzcyAgICBRQ2FudmFz U3ByaXRlIDogcHVibGljIFFDYW52YXNJdGVtCnsKcHVibGljOgogICAgUUNhbnZhc1Nwcml0ZShR Q2FudmFzUGl4bWFwQXJyYXkqIGFycmF5LCBRQ2FudmFzKiBjYW52YXMpOwoKICAgIHZvaWQgc2V0 U2VxdWVuY2UoUUNhbnZhc1BpeG1hcEFycmF5KiBzZXEpOwoKICAgIHZpcnR1YWwgflFDYW52YXNT cHJpdGUoKTsKCiAgICB2b2lkIG1vdmUoZG91YmxlIHgsIGRvdWJsZSB5KTsKICAgIHZpcnR1YWwg dm9pZCBtb3ZlKGRvdWJsZSB4LCBkb3VibGUgeSwgaW50IGZyYW1lKTsKICAgIHZvaWQgc2V0RnJh bWUoaW50KTsKICAgIGVudW0gRnJhbWVBbmltYXRpb25UeXBlIHsgQ3ljbGUsIE9zY2lsbGF0ZSB9 OwogICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQW5pbWF0aW9uKEZyYW1lQW5pbWF0aW9uVHlwZT1D eWNsZSwgaW50IHN0ZXA9MSwgaW50IHN0YXRlPTApOwogICAgaW50IGZyYW1lKCkgY29uc3QKCXsg cmV0dXJuIGZybTsgfQogICAgaW50IGZyYW1lQ291bnQoKSBjb25zdAoJeyByZXR1cm4gaW1hZ2Vz LT5jb3VudCgpOyB9CgogICAgaW50IHJ0dGkoKSBjb25zdDsKICAgIHN0YXRpYyBpbnQgUlRUSTsK CiAgICBib29sIGNvbGxpZGVzV2l0aCggY29uc3QgUUNhbnZhc0l0ZW0qICkgY29uc3Q7CgogICAg UVJlY3QgYm91bmRpbmdSZWN0KCkgY29uc3Q7CgogICAgIAogCgogICAgaW50IHdpZHRoKCkgY29u c3Q7CiAgICBpbnQgaGVpZ2h0KCkgY29uc3Q7CgogICAgaW50IGxlZnRFZGdlKCkgY29uc3Q7CiAg ICBpbnQgdG9wRWRnZSgpIGNvbnN0OwogICAgaW50IHJpZ2h0RWRnZSgpIGNvbnN0OwogICAgaW50 IGJvdHRvbUVkZ2UoKSBjb25zdDsKCiAgICBpbnQgbGVmdEVkZ2UoaW50IG54KSBjb25zdDsKICAg IGludCB0b3BFZGdlKGludCBueSkgY29uc3Q7CiAgICBpbnQgcmlnaHRFZGdlKGludCBueCkgY29u c3Q7CiAgICBpbnQgYm90dG9tRWRnZShpbnQgbnkpIGNvbnN0OwogICAgUUNhbnZhc1BpeG1hcCog aW1hZ2UoKSBjb25zdAoJeyByZXR1cm4gaW1hZ2VzLT5pbWFnZShmcm0pOyB9CiAgICB2aXJ0dWFs IFFDYW52YXNQaXhtYXAqIGltYWdlQWR2YW5jZWQoKSBjb25zdDsKICAgIFFDYW52YXNQaXhtYXAq IGltYWdlKGludCBmKSBjb25zdAoJeyByZXR1cm4gaW1hZ2VzLT5pbWFnZShmKTsgfQogICAgdmly dHVhbCB2b2lkIGFkdmFuY2UoaW50IHN0YWdlKTsKCnB1YmxpYzoKICAgIHZvaWQgZHJhdyhRUGFp bnRlciYgcGFpbnRlcik7Cgpwcml2YXRlOgogICAgdm9pZCBhZGRUb0NodW5rcygpOwogICAgdm9p ZCByZW1vdmVGcm9tQ2h1bmtzKCk7CiAgICB2b2lkIGNoYW5nZUNodW5rcygpOwoKICAgIGludCBm cm07CiAgICB1c2hvcnQgYW5pbV92YWw7CiAgICB1aW50IGFuaW1fc3RhdGU6MjsKICAgIHVpbnQg YW5pbV90eXBlOjE0OwogICAgYm9vbCBjb2xsaWRlc1dpdGgoIGNvbnN0IFFDYW52YXNTcHJpdGUq LAoJCSAgICAgICBjb25zdCBRQ2FudmFzUG9seWdvbmFsSXRlbSosCgkJICAgICAgIGNvbnN0IFFD YW52YXNSZWN0YW5nbGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFzRWxsaXBzZSosCgkJICAgICAg IGNvbnN0IFFDYW52YXNUZXh0KiApIGNvbnN0OwoKICAgIGZyaWVuZCBib29sIHF0X3Rlc3RDb2xs aXNpb24oIGNvbnN0IFFDYW52YXNTcHJpdGUqIHMxLAoJCQkJICBjb25zdCBRQ2FudmFzU3ByaXRl KiBzMiApOwoKICAgIFFDYW52YXNQaXhtYXBBcnJheSogaW1hZ2VzOwp9OwoKY2xhc3MgUVBvbHln b25hbFByb2Nlc3NvcjsKCmNsYXNzICAgIFFDYW52YXNQb2x5Z29uYWxJdGVtIDogcHVibGljIFFD YW52YXNJdGVtCnsKcHVibGljOgogICAgUUNhbnZhc1BvbHlnb25hbEl0ZW0oUUNhbnZhcyogY2Fu dmFzKTsKICAgIHZpcnR1YWwgflFDYW52YXNQb2x5Z29uYWxJdGVtKCk7CgogICAgYm9vbCBjb2xs aWRlc1dpdGgoIGNvbnN0IFFDYW52YXNJdGVtKiApIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBz ZXRQZW4oUVBlbiBwKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRCcnVzaChRQnJ1c2ggYik7CgogICAg UVBlbiBwZW4oKSBjb25zdAoJeyByZXR1cm4gcG47IH0KICAgIFFCcnVzaCBicnVzaCgpIGNvbnN0 Cgl7IHJldHVybiBicjsgfQoKICAgIHZpcnR1YWwgUVBvaW50QXJyYXkgYXJlYVBvaW50cygpIGNv bnN0PTA7CiAgICB2aXJ0dWFsIFFQb2ludEFycmF5IGFyZWFQb2ludHNBZHZhbmNlZCgpIGNvbnN0 OwogICAgUVJlY3QgYm91bmRpbmdSZWN0KCkgY29uc3Q7CgogICAgaW50IHJ0dGkoKSBjb25zdDsK ICAgIHN0YXRpYyBpbnQgUlRUSTsKCnByb3RlY3RlZDoKICAgIHZvaWQgZHJhdyhRUGFpbnRlciAm KTsKICAgIHZpcnR1YWwgdm9pZCBkcmF3U2hhcGUoUVBhaW50ZXIgJikgPSAwOwoKICAgIGJvb2wg d2luZGluZygpIGNvbnN0OwogICAgdm9pZCBzZXRXaW5kaW5nKGJvb2wpOwoKcHJpdmF0ZToKICAg IHZvaWQgc2NhblBvbHlnb24oIGNvbnN0IFFQb2ludEFycmF5JiBwYSwgaW50IHdpbmRpbmcsCgkJ ICAgICAgUVBvbHlnb25hbFByb2Nlc3NvciYgcHJvY2VzcyApIGNvbnN0OwogICAgUVBvaW50QXJy YXkgY2h1bmtzKCkgY29uc3Q7CgogICAgYm9vbCBjb2xsaWRlc1dpdGgoIGNvbnN0IFFDYW52YXNT cHJpdGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFzUG9seWdvbmFsSXRlbSosCgkJICAgICAgIGNv bnN0IFFDYW52YXNSZWN0YW5nbGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFzRWxsaXBzZSosCgkJ ICAgICAgIGNvbnN0IFFDYW52YXNUZXh0KiApIGNvbnN0OwoKICAgIFFCcnVzaCBicjsKICAgIFFQ ZW4gcG47CiAgICB1aW50IHdpbmQ6MTsKfTsKCgpjbGFzcyAgICBRQ2FudmFzUmVjdGFuZ2xlIDog cHVibGljIFFDYW52YXNQb2x5Z29uYWxJdGVtCnsKcHVibGljOgogICAgUUNhbnZhc1JlY3Rhbmds ZShRQ2FudmFzKiBjYW52YXMpOwogICAgUUNhbnZhc1JlY3RhbmdsZShjb25zdCBRUmVjdCYsIFFD YW52YXMqIGNhbnZhcyk7CiAgICBRQ2FudmFzUmVjdGFuZ2xlKGludCB4LCBpbnQgeSwgaW50IHdp ZHRoLCBpbnQgaGVpZ2h0LCBRQ2FudmFzKiBjYW52YXMpOwoKICAgIH5RQ2FudmFzUmVjdGFuZ2xl KCk7CgogICAgaW50IHdpZHRoKCkgY29uc3Q7CiAgICBpbnQgaGVpZ2h0KCkgY29uc3Q7CiAgICB2 b2lkIHNldFNpemUoaW50IHcsIGludCBoKTsKICAgIFFTaXplIHNpemUoKSBjb25zdAoJeyByZXR1 cm4gUVNpemUodyxoKTsgfQogICAgUVBvaW50QXJyYXkgYXJlYVBvaW50cygpIGNvbnN0OwogICAg UVJlY3QgcmVjdCgpIGNvbnN0Cgl7IHJldHVybiBRUmVjdChpbnQoeCgpKSxpbnQoeSgpKSx3LGgp OyB9CgogICAgYm9vbCBjb2xsaWRlc1dpdGgoIGNvbnN0IFFDYW52YXNJdGVtKiApIGNvbnN0OwoK ICAgIGludCBydHRpKCkgY29uc3Q7CiAgICBzdGF0aWMgaW50IFJUVEk7Cgpwcm90ZWN0ZWQ6CiAg ICB2b2lkIGRyYXdTaGFwZShRUGFpbnRlciAmKTsKICAgIFFQb2ludEFycmF5IGNodW5rcygpIGNv bnN0OwoKcHJpdmF0ZToKICAgIGJvb2wgY29sbGlkZXNXaXRoKCAgIGNvbnN0IFFDYW52YXNTcHJp dGUqLAoJCQkgY29uc3QgUUNhbnZhc1BvbHlnb25hbEl0ZW0qLAoJCQkgY29uc3QgUUNhbnZhc1Jl Y3RhbmdsZSosCgkJCSBjb25zdCBRQ2FudmFzRWxsaXBzZSosCgkJCSBjb25zdCBRQ2FudmFzVGV4 dCogKSBjb25zdDsKCiAgICBpbnQgdywgaDsKfTsKCgpjbGFzcyAgICBRQ2FudmFzUG9seWdvbiA6 IHB1YmxpYyBRQ2FudmFzUG9seWdvbmFsSXRlbQp7CnB1YmxpYzoKICAgIFFDYW52YXNQb2x5Z29u KFFDYW52YXMqIGNhbnZhcyk7CiAgICB+UUNhbnZhc1BvbHlnb24oKTsKICAgIHZvaWQgc2V0UG9p bnRzKFFQb2ludEFycmF5KTsKICAgIFFQb2ludEFycmF5IHBvaW50cygpIGNvbnN0OwogICAgdm9p ZCBtb3ZlQnkoZG91YmxlIGR4LCBkb3VibGUgZHkpOwoKICAgIFFQb2ludEFycmF5IGFyZWFQb2lu dHMoKSBjb25zdDsKCiAgICBpbnQgcnR0aSgpIGNvbnN0OwogICAgc3RhdGljIGludCBSVFRJOwoK cHJvdGVjdGVkOgogICAgdm9pZCBkcmF3U2hhcGUoUVBhaW50ZXIgJik7CiAgICBRUG9pbnRBcnJh eSBwb2x5Owp9OwoKCmNsYXNzICAgIFFDYW52YXNTcGxpbmUgOiBwdWJsaWMgUUNhbnZhc1BvbHln b24KewpwdWJsaWM6CiAgICBRQ2FudmFzU3BsaW5lKFFDYW52YXMqIGNhbnZhcyk7CiAgICB+UUNh bnZhc1NwbGluZSgpOwoKICAgIHZvaWQgc2V0Q29udHJvbFBvaW50cyhRUG9pbnRBcnJheSwgYm9v bCBjbG9zZWQ9VFJVRSk7CiAgICBRUG9pbnRBcnJheSBjb250cm9sUG9pbnRzKCkgY29uc3Q7CiAg ICBib29sIGNsb3NlZCgpIGNvbnN0OwoKICAgIGludCBydHRpKCkgY29uc3Q7CiAgICBzdGF0aWMg aW50IFJUVEk7Cgpwcml2YXRlOgogICAgdm9pZCByZWNhbGNQb2x5KCk7CiAgICBRUG9pbnRBcnJh eSBiZXo7CiAgICBib29sIGNsOwp9OwoKCmNsYXNzICAgIFFDYW52YXNMaW5lIDogcHVibGljIFFD YW52YXNQb2x5Z29uYWxJdGVtCnsKcHVibGljOgogICAgUUNhbnZhc0xpbmUoUUNhbnZhcyogY2Fu dmFzKTsKICAgIH5RQ2FudmFzTGluZSgpOwogICAgdm9pZCBzZXRQb2ludHMoaW50IHgxLCBpbnQg eTEsIGludCB4MiwgaW50IHkyKTsKCiAgICBRUG9pbnQgc3RhcnRQb2ludCgpIGNvbnN0Cgl7IHJl dHVybiBRUG9pbnQoeDEseTEpOyB9CiAgICBRUG9pbnQgZW5kUG9pbnQoKSBjb25zdAoJeyByZXR1 cm4gUVBvaW50KHgyLHkyKTsgfQoKICAgIGludCBydHRpKCkgY29uc3Q7CiAgICBzdGF0aWMgaW50 IFJUVEk7CgogICAgdm9pZCBzZXRQZW4oUVBlbiBwKTsKCnByb3RlY3RlZDoKICAgIHZvaWQgZHJh d1NoYXBlKFFQYWludGVyICYpOwogICAgUVBvaW50QXJyYXkgYXJlYVBvaW50cygpIGNvbnN0OwoK cHJpdmF0ZToKICAgIGludCB4MSx5MSx4Mix5MjsKfTsKCgpjbGFzcyAgICBRQ2FudmFzRWxsaXBz ZSA6IHB1YmxpYyBRQ2FudmFzUG9seWdvbmFsSXRlbQp7CgpwdWJsaWM6CiAgICBRQ2FudmFzRWxs aXBzZSggUUNhbnZhcyogY2FudmFzICk7CiAgICBRQ2FudmFzRWxsaXBzZSggaW50IHdpZHRoLCBp bnQgaGVpZ2h0LCBRQ2FudmFzKiBjYW52YXMgKTsKICAgIFFDYW52YXNFbGxpcHNlKCBpbnQgd2lk dGgsIGludCBoZWlnaHQsIGludCBzdGFydGFuZ2xlLCBpbnQgYW5nbGUsCgkJICAgIFFDYW52YXMq IGNhbnZhcyApOwoKICAgIH5RQ2FudmFzRWxsaXBzZSgpOwoKICAgIGludCB3aWR0aCgpIGNvbnN0 OwogICAgaW50IGhlaWdodCgpIGNvbnN0OwogICAgdm9pZCBzZXRTaXplKGludCB3LCBpbnQgaCk7 CiAgICB2b2lkIHNldEFuZ2xlcyhpbnQgc3RhcnQsIGludCBsZW5ndGgpOwogICAgaW50IGFuZ2xl U3RhcnQoKSBjb25zdAoJeyByZXR1cm4gYTE7IH0KICAgIGludCBhbmdsZUxlbmd0aCgpIGNvbnN0 Cgl7IHJldHVybiBhMjsgfQogICAgUVBvaW50QXJyYXkgYXJlYVBvaW50cygpIGNvbnN0OwoKICAg IGJvb2wgY29sbGlkZXNXaXRoKCBjb25zdCBRQ2FudmFzSXRlbSogKSBjb25zdDsKCiAgICBpbnQg cnR0aSgpIGNvbnN0OwogICAgc3RhdGljIGludCBSVFRJOwoKcHJvdGVjdGVkOgogICAgdm9pZCBk cmF3U2hhcGUoUVBhaW50ZXIgJik7Cgpwcml2YXRlOgogICAgYm9vbCBjb2xsaWRlc1dpdGgoIGNv bnN0IFFDYW52YXNTcHJpdGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFzUG9seWdvbmFsSXRlbSos CgkJICAgICAgIGNvbnN0IFFDYW52YXNSZWN0YW5nbGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFz RWxsaXBzZSosCgkJICAgICAgIGNvbnN0IFFDYW52YXNUZXh0KiApIGNvbnN0OwogICAgaW50IHcs IGg7CiAgICBpbnQgYTEsIGEyOwp9OwoKCmNsYXNzIFFDYW52YXNUZXh0RXh0cmE7CgpjbGFzcyAg ICBRQ2FudmFzVGV4dCA6IHB1YmxpYyBRQ2FudmFzSXRlbQp7CnB1YmxpYzoKICAgIFFDYW52YXNU ZXh0KFFDYW52YXMqIGNhbnZhcyk7CiAgICBRQ2FudmFzVGV4dChjb25zdCBRU3RyaW5nJiwgUUNh bnZhcyogY2FudmFzKTsKICAgIFFDYW52YXNUZXh0KGNvbnN0IFFTdHJpbmcmLCBRRm9udCwgUUNh bnZhcyogY2FudmFzKTsKCiAgICB2aXJ0dWFsIH5RQ2FudmFzVGV4dCgpOwoKICAgIHZvaWQgc2V0 VGV4dCggY29uc3QgUVN0cmluZyYgKTsKICAgIHZvaWQgc2V0Rm9udCggY29uc3QgUUZvbnQmICk7 CiAgICB2b2lkIHNldENvbG9yKCBjb25zdCBRQ29sb3ImICk7CiAgICBRU3RyaW5nIHRleHQoKSBj b25zdDsKICAgIFFGb250IGZvbnQoKSBjb25zdDsKICAgIFFDb2xvciBjb2xvcigpIGNvbnN0OwoK ICAgIHZvaWQgbW92ZUJ5KGRvdWJsZSBkeCwgZG91YmxlIGR5KTsKCiAgICBpbnQgdGV4dEZsYWdz KCkgY29uc3QKCXsgcmV0dXJuIGZsYWdzOyB9CiAgICB2b2lkIHNldFRleHRGbGFncyhpbnQpOwoK ICAgIFFSZWN0IGJvdW5kaW5nUmVjdCgpIGNvbnN0OwoKICAgIGJvb2wgY29sbGlkZXNXaXRoKCBj b25zdCBRQ2FudmFzSXRlbSogKSBjb25zdDsKCiAgICBpbnQgcnR0aSgpIGNvbnN0OwogICAgc3Rh dGljIGludCBSVFRJOwoKcHJvdGVjdGVkOgogICAgdmlydHVhbCB2b2lkIGRyYXcoUVBhaW50ZXIm KTsKCnByaXZhdGU6CiAgICB2b2lkIGFkZFRvQ2h1bmtzKCk7CiAgICB2b2lkIHJlbW92ZUZyb21D aHVua3MoKTsKICAgIHZvaWQgY2hhbmdlQ2h1bmtzKCk7CgogICAgdm9pZCBzZXRSZWN0KCk7CiAg ICBRUmVjdCBicmVjdDsKICAgIFFTdHJpbmcgdHh0OwogICAgaW50IGZsYWdzOwogICAgUUZvbnQg Zm50OwogICAgUUNvbG9yIGNvbDsKICAgIFFDYW52YXNUZXh0RXh0cmEqIGV4dHJhOwoKICAgIGJv b2wgY29sbGlkZXNXaXRoKCAgIGNvbnN0IFFDYW52YXNTcHJpdGUqLAoJCQkgY29uc3QgUUNhbnZh c1BvbHlnb25hbEl0ZW0qLAoJCQkgY29uc3QgUUNhbnZhc1JlY3RhbmdsZSosCgkJCSBjb25zdCBR Q2FudmFzRWxsaXBzZSosCgkJCSBjb25zdCBRQ2FudmFzVGV4dCogKSBjb25zdDsKfTsKCgoKCgoj IDQgImNhbnZhc3RleHQuaCIgMgoKCmNsYXNzIFFGb250OwoKCmNsYXNzIENhbnZhc1RleHQgOiBw dWJsaWMgUUNhbnZhc1RleHQKewpwdWJsaWM6CiAgICBlbnVtIHsgQ0FOVkFTX1RFWFQgPSAxMTAw IH07CgogICAgQ2FudmFzVGV4dCggaW50IGluZGV4LCBRQ2FudmFzICpjYW52YXMgKQoJOiBRQ2Fu dmFzVGV4dCggY2FudmFzICksIG1faW5kZXgoIGluZGV4ICkge30KICAgIENhbnZhc1RleHQoIGlu dCBpbmRleCwgY29uc3QgUVN0cmluZyYgdGV4dCwgUUNhbnZhcyAqY2FudmFzICkKCTogUUNhbnZh c1RleHQoIHRleHQsIGNhbnZhcyApLCBtX2luZGV4KCBpbmRleCApIHt9CiAgICBDYW52YXNUZXh0 KCBpbnQgaW5kZXgsIGNvbnN0IFFTdHJpbmcmIHRleHQsIFFGb250IGZvbnQsIFFDYW52YXMgKmNh bnZhcyApCgk6IFFDYW52YXNUZXh0KCB0ZXh0LCBmb250LCBjYW52YXMgKSwgbV9pbmRleCggaW5k ZXggKSB7fQoKICAgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KICAgIHZv aWQgc2V0SW5kZXgoIGludCBpbmRleCApIHsgbV9pbmRleCA9IGluZGV4OyB9CgogICAgaW50IHJ0 dGkoKSBjb25zdCB7IHJldHVybiBDQU5WQVNfVEVYVDsgfQoKcHJpdmF0ZToKICAgIGludCBtX2lu ZGV4Owp9OwoKCgojIDUgImNhbnZhc3ZpZXcuaCIgMgoKCgoKCmNsYXNzIFFQb2ludDsKCgpjbGFz cyBDYW52YXNWaWV3IDogcHVibGljIFFDYW52YXNWaWV3CnsKICAgIHB1YmxpYzoJdmlydHVhbCBR TWV0YU9iamVjdCAqbWV0YU9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY01ldGFPYmplY3Qo KTsJfQl2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzTmFtZSgpIGNvbnN0Owl2aXJ0dWFsIHZvaWQq IHF0X2Nhc3QoIGNvbnN0IGNoYXIqICk7IHZpcnR1YWwgYm9vbCBxdF9pbnZva2UoIGludCwgUVVP YmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9lbWl0KCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFs IGJvb2wgcXRfcHJvcGVydHkoIGludCwgaW50LCBRVmFyaWFudCogKTsgCXN0YXRpYyBRTWV0YU9i amVjdCogc3RhdGljTWV0YU9iamVjdCgpOwlRT2JqZWN0KiBxT2JqZWN0KCkgeyByZXR1cm4gKFFP YmplY3QqKXRoaXM7IH0gc3RhdGljIFFTdHJpbmcgdHIoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hh ciAqID0gMCApOyBzdGF0aWMgUVN0cmluZyB0clV0ZjgoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hh ciAqID0gMCApOyAJcHJpdmF0ZToJc3RhdGljIFFNZXRhT2JqZWN0ICptZXRhT2JqOyAKcHVibGlj OgogICAgQ2FudmFzVmlldyggUUNhbnZhcyAqY2FudmFzLCBFbGVtZW50VmVjdG9yICplbGVtZW50 cywKCQlRV2lkZ2V0KiBwYXJlbnQgPSAwLCBjb25zdCBjaGFyKiBuYW1lID0gImNhbnZhcyB2aWV3 IiwKCQlXRmxhZ3MgZiA9IDAgKQoJOiBRQ2FudmFzVmlldyggY2FudmFzLCBwYXJlbnQsIG5hbWUs IGYgKSwKCSAgbV9lbGVtZW50cyggZWxlbWVudHMgKSB7fQoKcHJvdGVjdGVkOgogICAgdm9pZCB2 aWV3cG9ydFJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQgKmUgKTsKICAgIHZvaWQgY29udGVudHNN b3VzZVByZXNzRXZlbnQoIFFNb3VzZUV2ZW50ICplICk7CiAgICB2b2lkIGNvbnRlbnRzTW91c2VN b3ZlRXZlbnQoIFFNb3VzZUV2ZW50ICplICk7CiAgICB2b2lkIGNvbnRlbnRzQ29udGV4dE1lbnVF dmVudCggUUNvbnRleHRNZW51RXZlbnQgKmUgKTsKCnByaXZhdGU6CiAgICBRQ2FudmFzSXRlbSAq bV9tb3ZpbmdJdGVtOwogICAgUVBvaW50IG1fcG9zOwogICAgRWxlbWVudFZlY3RvciAqbV9lbGVt ZW50czsKfTsKCgoKIyAxICJjaGFydGZvcm1fZmlsZXMuY3BwIiAyCgojIDEgImNoYXJ0Zm9ybS5o IiAxCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW1haW53aW5kb3cuaCIgMQogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0 L2luY2x1ZGUvcXRvb2xiYXIuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZG9ja3dpbmRvdy5oIiAxCiAKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgUURvY2tXaW5k b3dIYW5kbGU7CmNsYXNzIFFEb2NrV2luZG93VGl0bGVCYXI7CmNsYXNzIFFQYWludGVyOwpjbGFz cyBRRG9ja1dpbmRvd1Jlc2l6ZUhhbmRsZTsKY2xhc3MgUUJveExheW91dDsKY2xhc3MgUUhCb3hM YXlvdXQ7CmNsYXNzIFFWQm94TGF5b3V0OwpjbGFzcyBRRG9ja0FyZWE7CmNsYXNzIFFXaWRnZXRS ZXNpemVIYW5kbGVyOwpjbGFzcyBRTWFpbldpbmRvdzsKY2xhc3MgUURvY2tBcmVhTGF5b3V0Owpj bGFzcyBRRG9ja1dpbmRvd1ByaXZhdGU7CgpjbGFzcyAgIFFEb2NrV2luZG93IDogcHVibGljIFFG cmFtZQp7CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFPYmplY3QoKSBjb25z dCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25zdCBjaGFyICpjbGFz c05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBjaGFyKiApOyB2aXJ0 dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wgcXRfZW1p dCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5KCBpbnQsIGludCwg UVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFPYmplY3QoKTsJUU9i amVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0YXRpYyBRU3RyaW5n IHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGljIFFTdHJpbmcgdHJV dGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZhdGU6CXN0YXRpYyBR TWV0YU9iamVjdCAqbWV0YU9iajsgCiAgICAgCiAgICAgICAKICAgICAKICAgICAKICAgICAKICAg ICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKCiAgICBmcmllbmQgY2xhc3MgUURvY2tX aW5kb3dIYW5kbGU7CiAgICBmcmllbmQgY2xhc3MgUURvY2tXaW5kb3dUaXRsZUJhcjsKICAgIGZy aWVuZCBjbGFzcyBRRG9ja0FyZWE7CiAgICBmcmllbmQgY2xhc3MgUURvY2tBcmVhTGF5b3V0Owog ICAgZnJpZW5kIGNsYXNzIFFNYWluV2luZG93OwoKcHVibGljOgogICAgZW51bSBQbGFjZSB7IElu RG9jaywgT3V0c2lkZURvY2sgfTsKICAgIGVudW0gQ2xvc2VNb2RlIHsgTmV2ZXIgPSAwLCBEb2Nr ZWQgPSAxLCBVbmRvY2tlZCA9IDIsIEFsd2F5cyA9IERvY2tlZCB8IFVuZG9ja2VkIH07CgogICAg UURvY2tXaW5kb3coIFBsYWNlIHAgPSBJbkRvY2ssIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBj aGFyKiBuYW1lPTAsIFdGbGFncyBmID0gMCApOwogICAgflFEb2NrV2luZG93KCk7CgogICAgdmly dHVhbCB2b2lkIHNldFdpZGdldCggUVdpZGdldCAqdyApOwogICAgUVdpZGdldCAqd2lkZ2V0KCkg Y29uc3Q7CgogICAgUGxhY2UgcGxhY2UoKSBjb25zdCB7IHJldHVybiBjdXJQbGFjZTsgfQoKICAg IFFEb2NrQXJlYSAqYXJlYSgpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBzZXRDbG9zZU1vZGUo IGludCBtICk7CiAgICBib29sIGlzQ2xvc2VFbmFibGVkKCkgY29uc3Q7CiAgICBpbnQgY2xvc2VN b2RlKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFJlc2l6ZUVuYWJsZWQoIGJvb2wgYiAp OwogICAgdmlydHVhbCB2b2lkIHNldE1vdmluZ0VuYWJsZWQoIGJvb2wgYiApOwogICAgYm9vbCBp c1Jlc2l6ZUVuYWJsZWQoKSBjb25zdDsKICAgIGJvb2wgaXNNb3ZpbmdFbmFibGVkKCkgY29uc3Q7 CgogICAgdmlydHVhbCB2b2lkIHNldEhvcml6b250YWxseVN0cmV0Y2hhYmxlKCBib29sIGIgKTsK ICAgIHZpcnR1YWwgdm9pZCBzZXRWZXJ0aWNhbGx5U3RyZXRjaGFibGUoIGJvb2wgYiApOwogICAg Ym9vbCBpc0hvcml6b250YWxseVN0cmV0Y2hhYmxlKCkgY29uc3Q7CiAgICBib29sIGlzVmVydGlj YWxseVN0cmV0Y2hhYmxlKCkgY29uc3Q7CiAgICB2b2lkIHNldEhvcml6b250YWxTdHJldGNoYWJs ZSggYm9vbCBiICkgeyBzZXRIb3Jpem9udGFsbHlTdHJldGNoYWJsZSggYiApOyB9CiAgICB2b2lk IHNldFZlcnRpY2FsU3RyZXRjaGFibGUoIGJvb2wgYiApIHsgc2V0VmVydGljYWxseVN0cmV0Y2hh YmxlKCBiICk7IH0KICAgIGJvb2wgaXNIb3Jpem9udGFsU3RyZXRjaGFibGUoKSBjb25zdCB7IHJl dHVybiBpc0hvcml6b250YWxseVN0cmV0Y2hhYmxlKCk7IH0KICAgIGJvb2wgaXNWZXJ0aWNhbFN0 cmV0Y2hhYmxlKCkgY29uc3QgeyByZXR1cm4gaXNWZXJ0aWNhbGx5U3RyZXRjaGFibGUoKTsgfQog ICAgYm9vbCBpc1N0cmV0Y2hhYmxlKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldE9mZnNl dCggaW50IG8gKTsKICAgIGludCBvZmZzZXQoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0 Rml4ZWRFeHRlbnRXaWR0aCggaW50IHcgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRGaXhlZEV4dGVu dEhlaWdodCggaW50IGggKTsKICAgIFFTaXplIGZpeGVkRXh0ZW50KCkgY29uc3Q7CgogICAgdmly dHVhbCB2b2lkIHNldE5ld0xpbmUoIGJvb2wgYiApOwogICAgYm9vbCBuZXdMaW5lKCkgY29uc3Q7 CgogICAgUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKCkgY29uc3Q7CgogICAgUVNpemUgc2l6 ZUhpbnQoKSBjb25zdDsKICAgIFFTaXplIG1pbmltdW1TaXplKCkgY29uc3Q7CiAgICBRU2l6ZSBt aW5pbXVtU2l6ZUhpbnQoKSBjb25zdDsKCiAgICBRQm94TGF5b3V0ICpib3hMYXlvdXQoKTsKCiAg ICB2aXJ0dWFsIHZvaWQgc2V0T3BhcXVlTW92aW5nKCBib29sIGIgKTsKICAgIGJvb2wgb3BhcXVl TW92aW5nKCkgY29uc3Q7CgogICAgYm9vbCBldmVudEZpbHRlciggUU9iamVjdCAqbywgUUV2ZW50 ICplICk7CgoKCgoKcHJvdGVjdGVkIDoKICAgIHZvaWQgb3JpZW50YXRpb25DaGFuZ2VkKCBPcmll bnRhdGlvbiBvICk7CiAgICB2b2lkIHBsYWNlQ2hhbmdlZCggUURvY2tXaW5kb3c6OlBsYWNlIHAg KTsKICAgIHZvaWQgdmlzaWJpbGl0eUNoYW5nZWQoIGJvb2wgKTsKCnB1YmxpYyAgOgogICAgdmly dHVhbCB2b2lkIHVuZG9jayggUVdpZGdldCAqdyApOwogICAgdmlydHVhbCB2b2lkIHVuZG9jaygp IHsgdW5kb2NrKCAwICk7IH0KICAgIHZpcnR1YWwgdm9pZCBkb2NrKCk7CiAgICB2aXJ0dWFsIHZv aWQgc2V0T3JpZW50YXRpb24oIE9yaWVudGF0aW9uIG8gKTsKICAgIHZvaWQgc2V0Q2FwdGlvbigg Y29uc3QgUVN0cmluZyAmcyApOwoKcHJvdGVjdGVkOgogICAgdm9pZCByZXNpemVFdmVudCggUVJl c2l6ZUV2ZW50ICplICk7CiAgICB2b2lkIHNob3dFdmVudCggUVNob3dFdmVudCAqZSApOwogICAg dm9pZCBoaWRlRXZlbnQoIFFIaWRlRXZlbnQgKmUgKTsKICAgIHZvaWQgY29udGV4dE1lbnVFdmVu dCggUUNvbnRleHRNZW51RXZlbnQgKmUgKTsKCiAgICB2b2lkIGRyYXdGcmFtZSggUVBhaW50ZXIg KiApOwoKICAgIGJvb2wgZXZlbnQoIFFFdmVudCAqZSApOwoKcHJpdmF0ZSAgOgogICAgdm9pZCB0 b2dnbGVWaXNpYmxlKCkgeyBpZiAoICFpc1Zpc2libGUoKSApIHNob3coKTsgZWxzZSBoaWRlKCk7 IH0KCnByaXZhdGU6CiAgICB2b2lkIGhhbmRsZU1vdmUoIGNvbnN0IFFQb2ludCAmcG9zLCBjb25z dCBRUG9pbnQgJmdwLCBib29sIGRyYXdSZWN0ICk7CiAgICB2b2lkIHVwZGF0ZUd1aSgpOwogICAg dm9pZCB1cGRhdGVTcGxpdHRlclZpc2liaWxpdHkoIGJvb2wgdmlzaWJsZSApOwoKICAgIHZvaWQg c3RhcnRSZWN0RHJhdyggY29uc3QgUVBvaW50ICZzbywgYm9vbCBkcmF3UmVjdCApOwogICAgdm9p ZCBlbmRSZWN0RHJhdyggYm9vbCBkcmF3UmVjdCApOwogICAgdm9pZCB1cGRhdGVQb3NpdGlvbigg Y29uc3QgUVBvaW50ICZnbG9iYWxQb3MgICk7CiAgICBRV2lkZ2V0ICphcmVhQXQoIGNvbnN0IFFQ b2ludCAmZ3AgKTsKICAgIHZvaWQgcmVtb3ZlRnJvbURvY2soIGJvb2wgZml4TmV3TGluZXMgPSBU UlVFICk7CiAgICB2b2lkIHN3YXBSZWN0KCBRUmVjdCAmciwgUXQ6Ok9yaWVudGF0aW9uIG8sIGNv bnN0IFFQb2ludCAmb2Zmc2V0LCBRRG9ja0FyZWEgKmFyZWEgKTsKCnByaXZhdGU6CiAgICBRRG9j a1dpbmRvd0hhbmRsZSAqaG9ySGFuZGxlLCAqdmVySGFuZGxlOwogICAgUURvY2tXaW5kb3dUaXRs ZUJhciAqdGl0bGVCYXI7CiAgICBRV2lkZ2V0ICp3aWQ7CiAgICBRUGFpbnRlciAqdW5jbGlwcGVk UGFpbnRlcjsKICAgIFFEb2NrQXJlYSAqZG9ja0FyZWEsICp0bXBEb2NrQXJlYTsKICAgIFFSZWN0 IGN1cnJSZWN0OwogICAgUGxhY2UgY3VyUGxhY2U7CiAgICBQbGFjZSBzdGF0ZTsKICAgIGJvb2wg cmVzaXplRW5hYmxlZCA6IDE7CiAgICBib29sIG1vdmVFbmFibGVkIDogMTsKICAgIGJvb2wgbmwg OiAxOwogICAgYm9vbCBvcGFxdWUgOiAxOwogICAgYm9vbCBzdHJldGNoYWJsZVsgMyBdOwogICAg T3JpZW50YXRpb24gc3RhcnRPcmllbnRhdGlvbjsKICAgIGludCBjTW9kZTsKICAgIFFQb2ludCBz dGFydE9mZnNldDsKICAgIGludCBvZmZzOwogICAgUVNpemUgZkV4dGVudDsKICAgIFFEb2NrV2lu ZG93UmVzaXplSGFuZGxlICpoSGFuZGxlVG9wLCAqaEhhbmRsZUJvdHRvbSwgKnZIYW5kbGVMZWZ0 LCAqdkhhbmRsZVJpZ2h0OwogICAgUVZCb3hMYXlvdXQgKmhib3g7CiAgICBRSEJveExheW91dCAq dmJveDsKICAgIFFCb3hMYXlvdXQgKmxheW91dDsKICAgIHZvaWQgKmRvY2tXaW5kb3dEYXRhOwog ICAgUVBvaW50IGxhc3RQb3M7CiAgICBRU2l6ZSBsYXN0U2l6ZTsKICAgIFFXaWRnZXRSZXNpemVI YW5kbGVyICp3aWRnZXRSZXNpemVIYW5kbGVyOwogICAgUURvY2tXaW5kb3dQcml2YXRlICpkOwoK cHJpdmF0ZToJIAoKICAgIFFEb2NrV2luZG93KCBjb25zdCBRRG9ja1dpbmRvdyAmICk7CiAgICBR RG9ja1dpbmRvdyYgb3BlcmF0b3I9KCBjb25zdCBRRG9ja1dpbmRvdyAmICk7Cgp9OwoKaW5saW5l IFFEb2NrQXJlYSAqUURvY2tXaW5kb3c6OmFyZWEoKSBjb25zdAp7CiAgICByZXR1cm4gZG9ja0Fy ZWE7Cn0KCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdG9vbGJhci5oIiAyCgoKCgoK Y2xhc3MgUU1haW5XaW5kb3c7CmNsYXNzIFFCdXR0b247CmNsYXNzIFFCb3hMYXlvdXQ7CmNsYXNz IFFUb29sQmFyUHJpdmF0ZTsKCmNsYXNzICAgUVRvb2xCYXI6IHB1YmxpYyBRRG9ja1dpbmRvdwp7 CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFPYmplY3QoKSBjb25zdCB7IHJl dHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25zdCBjaGFyICpjbGFzc05hbWUo KSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBjaGFyKiApOyB2aXJ0dWFsIGJv b2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wgcXRfZW1pdCggaW50 LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5KCBpbnQsIGludCwgUVZhcmlh bnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFPYmplY3QoKTsJUU9iamVjdCog cU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0YXRpYyBRU3RyaW5nIHRyKCBj b25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGljIFFTdHJpbmcgdHJVdGY4KCBj b25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZhdGU6CXN0YXRpYyBRTWV0YU9i amVjdCAqbWV0YU9iajsgCiAgICAgCgpwdWJsaWM6CiAgICBRVG9vbEJhciggY29uc3QgUVN0cmlu ZyAmbGFiZWwsCgkgICAgICBRTWFpbldpbmRvdyAqLCBUb29sQmFyRG9jayA9IERvY2tUb3AsCgkg ICAgICBib29sIG5ld0xpbmUgPSBGQUxTRSwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICBRVG9v bEJhciggY29uc3QgUVN0cmluZyAmbGFiZWwsIFFNYWluV2luZG93ICosIFFXaWRnZXQgKiwKCSAg ICAgIGJvb2wgbmV3TGluZSA9IEZBTFNFLCBjb25zdCBjaGFyKiBuYW1lPTAsIFdGbGFncyBmID0g MCApOwogICAgUVRvb2xCYXIoIFFNYWluV2luZG93KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFt ZT0wICk7CiAgICB+UVRvb2xCYXIoKTsKCiAgICB2b2lkIGFkZFNlcGFyYXRvcigpOwoKICAgIHZv aWQgc2hvdygpOwogICAgdm9pZCBoaWRlKCk7CgogICAgUU1haW5XaW5kb3cgKiBtYWluV2luZG93 KCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFN0cmV0Y2hhYmxlV2lkZ2V0KCBRV2lkZ2V0 ICogKTsKCiAgICBib29sIGV2ZW50KCBRRXZlbnQgKiBlICk7CgogICAgdmlydHVhbCB2b2lkIHNl dExhYmVsKCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgbGFiZWwoKSBjb25zdDsKCiAg ICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKCiAgICBRU2l6ZSBtaW5pbXVtU2l6ZSgpIGNvbnN0Owog ICAgUVNpemUgbWluaW11bVNpemVIaW50KCkgY29uc3Q7CgogICAgdm9pZCBzZXRPcmllbnRhdGlv biggT3JpZW50YXRpb24gbyApOwogICAgdm9pZCBzZXRNaW5pbXVtU2l6ZSggaW50IG1pbncsIGlu dCBtaW5oICk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIHJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQg KmUgKTsKICAgIHZvaWQgc3R5bGVDaGFuZ2UoIFFTdHlsZSAmICk7Cgpwcml2YXRlICA6CiAgICB2 b2lkIHBvcHVwU2VsZWN0ZWQoIGludCBpZCApOwogICAgdm9pZCBlbXVsYXRlQnV0dG9uQ2xpY2tl ZCgpOwogICAgdm9pZCBzZXR1cEFycm93TWVudSgpOwoKcHJpdmF0ZToKICAgIHZvaWQgaW5pdCgp OwoKICAgIFFUb29sQmFyUHJpdmF0ZSAqIGQ7CiAgICBRTWFpbldpbmRvdyAqIG13OwogICAgUVdp ZGdldCAqIHN3OwogICAgUVN0cmluZyBsOwoKICAgIGZyaWVuZCBjbGFzcyBRTWFpbldpbmRvdzsK CnByaXZhdGU6CSAKCiAgICBRVG9vbEJhciggY29uc3QgUVRvb2xCYXIgJiApOwogICAgUVRvb2xC YXImIG9wZXJhdG9yPSggY29uc3QgUVRvb2xCYXIgJiApOwoKfTsKCgoKCiMgNDMgIi91c3IvbG9j YWwvcXQvaW5jbHVkZS9xbWFpbndpbmRvdy5oIiAyCgoKCgoKCgpjbGFzcyBRTWVudUJhcjsKY2xh c3MgUVN0YXR1c0JhcjsKY2xhc3MgUVRvb2xUaXBHcm91cDsKY2xhc3MgUU1haW5XaW5kb3dQcml2 YXRlOwpjbGFzcyBRTWFpbldpbmRvd0xheW91dDsKY2xhc3MgUVBvcHVwTWVudTsKCmNsYXNzICAg UU1haW5XaW5kb3c6IHB1YmxpYyBRV2lkZ2V0CnsKICAgIHB1YmxpYzoJdmlydHVhbCBRTWV0YU9i amVjdCAqbWV0YU9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY01ldGFPYmplY3QoKTsJfQl2 aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzTmFtZSgpIGNvbnN0Owl2aXJ0dWFsIHZvaWQqIHF0X2Nh c3QoIGNvbnN0IGNoYXIqICk7IHZpcnR1YWwgYm9vbCBxdF9pbnZva2UoIGludCwgUVVPYmplY3Qq ICk7IHZpcnR1YWwgYm9vbCBxdF9lbWl0KCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wg cXRfcHJvcGVydHkoIGludCwgaW50LCBRVmFyaWFudCogKTsgCXN0YXRpYyBRTWV0YU9iamVjdCog c3RhdGljTWV0YU9iamVjdCgpOwlRT2JqZWN0KiBxT2JqZWN0KCkgeyByZXR1cm4gKFFPYmplY3Qq KXRoaXM7IH0gc3RhdGljIFFTdHJpbmcgdHIoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqID0g MCApOyBzdGF0aWMgUVN0cmluZyB0clV0ZjgoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqID0g MCApOyAJcHJpdmF0ZToJc3RhdGljIFFNZXRhT2JqZWN0ICptZXRhT2JqOyAKICAgICAKICAgICAK ICAgICAKICAgICAKICAgICAKCnB1YmxpYzoKICAgIFFNYWluV2luZG93KCBRV2lkZ2V0KiBwYXJl bnQ9MCwgY29uc3QgY2hhciogbmFtZT0wLCBXRmxhZ3MgZiA9IFdUeXBlX1RvcExldmVsICk7CiAg ICB+UU1haW5XaW5kb3coKTsKCgogICAgUU1lbnVCYXIgKiBtZW51QmFyKCkgY29uc3Q7CgogICAg UVN0YXR1c0JhciAqIHN0YXR1c0JhcigpIGNvbnN0OwoKICAgIFFUb29sVGlwR3JvdXAgKiB0b29s VGlwR3JvdXAoKSBjb25zdDsKCgogICAgdmlydHVhbCB2b2lkIHNldENlbnRyYWxXaWRnZXQoIFFX aWRnZXQgKiApOwogICAgUVdpZGdldCAqIGNlbnRyYWxXaWRnZXQoKSBjb25zdDsKCiAgICB2aXJ0 dWFsIHZvaWQgc2V0RG9ja0VuYWJsZWQoIERvY2sgZG9jaywgYm9vbCBlbmFibGUgKTsKICAgIGJv b2wgaXNEb2NrRW5hYmxlZCggRG9jayBkb2NrICkgY29uc3Q7CiAgICBib29sIGlzRG9ja0VuYWJs ZWQoIFFEb2NrQXJlYSAqYXJlYSApIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldERvY2tFbmFi bGVkKCBRRG9ja1dpbmRvdyAqdGIsIERvY2sgZG9jaywgYm9vbCBlbmFibGUgKTsKICAgIGJvb2wg aXNEb2NrRW5hYmxlZCggUURvY2tXaW5kb3cgKnRiLCBEb2NrIGRvY2sgKSBjb25zdDsKICAgIGJv b2wgaXNEb2NrRW5hYmxlZCggUURvY2tXaW5kb3cgKnRiLCBRRG9ja0FyZWEgKmFyZWEgKSBjb25z dDsKCiAgICB2aXJ0dWFsIHZvaWQgYWRkRG9ja1dpbmRvdyggUURvY2tXaW5kb3cgKiwgRG9jayA9 IERvY2tUb3AsIGJvb2wgbmV3TGluZSA9IEZBTFNFICk7CiAgICB2aXJ0dWFsIHZvaWQgYWRkRG9j a1dpbmRvdyggUURvY2tXaW5kb3cgKiwgY29uc3QgUVN0cmluZyAmbGFiZWwsCgkJCQlEb2NrID0g RG9ja1RvcCwgYm9vbCBuZXdMaW5lID0gRkFMU0UgKTsKICAgIHZpcnR1YWwgdm9pZCBtb3ZlRG9j a1dpbmRvdyggUURvY2tXaW5kb3cgKiwgRG9jayA9IERvY2tUb3AgKTsKICAgIHZpcnR1YWwgdm9p ZCBtb3ZlRG9ja1dpbmRvdyggUURvY2tXaW5kb3cgKiwgRG9jaywgYm9vbCBubCwgaW50IGluZGV4 LCBpbnQgZXh0cmFPZmZzZXQgPSAtMSApOwogICAgdmlydHVhbCB2b2lkIHJlbW92ZURvY2tXaW5k b3coIFFEb2NrV2luZG93ICogKTsKCiAgICB2b2lkIHNob3coKTsKICAgIFFTaXplIHNpemVIaW50 KCkgY29uc3Q7CiAgICBRU2l6ZSBtaW5pbXVtU2l6ZUhpbnQoKSBjb25zdDsKCiAgICBib29sIHJp Z2h0SnVzdGlmaWNhdGlvbigpIGNvbnN0OwogICAgYm9vbCB1c2VzQmlnUGl4bWFwcygpIGNvbnN0 OwogICAgYm9vbCB1c2VzVGV4dExhYmVsKCkgY29uc3Q7CiAgICBib29sIGRvY2tXaW5kb3dzTW92 YWJsZSgpIGNvbnN0OwogICAgYm9vbCBvcGFxdWVNb3ZpbmcoKSBjb25zdDsKCiAgICBib29sIGV2 ZW50RmlsdGVyKCBRT2JqZWN0KiwgUUV2ZW50KiApOwoKICAgIGJvb2wgZ2V0TG9jYXRpb24oIFFE b2NrV2luZG93ICp0YiwgRG9jayAmZG9jaywgaW50ICZpbmRleCwgYm9vbCAmbmwsIGludCAmZXh0 cmFPZmZzZXQgKSBjb25zdDsKCiAgICBRUHRyTGlzdDxRRG9ja1dpbmRvdz4gZG9ja1dpbmRvd3Mo IERvY2sgZG9jayApIGNvbnN0OwogICAgUVB0ckxpc3Q8UURvY2tXaW5kb3c+IGRvY2tXaW5kb3dz KCkgY29uc3Q7CiAgICB2b2lkIGxpbmVVcERvY2tXaW5kb3dzKCBib29sIGtlZXBOZXdMaW5lcyA9 IEZBTFNFICk7CgogICAgYm9vbCBpc0RvY2tNZW51RW5hYmxlZCgpIGNvbnN0OwoKICAgICAKICAg IGJvb2wgaGFzRG9ja1dpbmRvdyggUURvY2tXaW5kb3cgKmR3ICk7CgogICAgdm9pZCBhZGRUb29s QmFyKCBRRG9ja1dpbmRvdyAqLCBEb2NrID0gRG9ja1RvcCwgYm9vbCBuZXdMaW5lID0gRkFMU0Ug KTsKICAgIHZvaWQgYWRkVG9vbEJhciggUURvY2tXaW5kb3cgKiwgY29uc3QgUVN0cmluZyAmbGFi ZWwsCgkJICAgICBEb2NrID0gRG9ja1RvcCwgYm9vbCBuZXdMaW5lID0gRkFMU0UgKTsKICAgIHZv aWQgbW92ZVRvb2xCYXIoIFFEb2NrV2luZG93ICosIERvY2sgPSBEb2NrVG9wICk7CiAgICB2b2lk IG1vdmVUb29sQmFyKCBRRG9ja1dpbmRvdyAqLCBEb2NrLCBib29sIG5sLCBpbnQgaW5kZXgsIGlu dCBleHRyYU9mZnNldCA9IC0xICk7CiAgICB2b2lkIHJlbW92ZVRvb2xCYXIoIFFEb2NrV2luZG93 ICogKTsKCiAgICBib29sIHRvb2xCYXJzTW92YWJsZSgpIGNvbnN0OwogICAgUVB0ckxpc3Q8UVRv b2xCYXI+IHRvb2xCYXJzKCBEb2NrIGRvY2sgKSBjb25zdDsKICAgIHZvaWQgbGluZVVwVG9vbEJh cnMoIGJvb2wga2VlcE5ld0xpbmVzID0gRkFMU0UgKTsKCgogICAgdmlydHVhbCBRRG9ja0FyZWEg KmRvY2tpbmdBcmVhKCBjb25zdCBRUG9pbnQgJnAgKTsKICAgIFFEb2NrQXJlYSAqbGVmdERvY2so KSBjb25zdDsKICAgIFFEb2NrQXJlYSAqcmlnaHREb2NrKCkgY29uc3Q7CiAgICBRRG9ja0FyZWEg KnRvcERvY2soKSBjb25zdDsKICAgIFFEb2NrQXJlYSAqYm90dG9tRG9jaygpIGNvbnN0OwoKICAg IHZpcnR1YWwgYm9vbCBpc0N1c3RvbWl6YWJsZSgpIGNvbnN0OwoKICAgIGJvb2wgYXBwcm9wcmlh dGUoIFFEb2NrV2luZG93ICpkdyApIGNvbnN0OwoKICAgIGVudW0gRG9ja1dpbmRvd3MgeyBPbmx5 VG9vbEJhcnMsIE5vVG9vbEJhcnMsIEFsbERvY2tXaW5kb3dzIH07CiAgICBRUG9wdXBNZW51ICpj cmVhdGVEb2NrV2luZG93TWVudSggRG9ja1dpbmRvd3MgZG9ja1dpbmRvd3MgPSBBbGxEb2NrV2lu ZG93cyApIGNvbnN0OwoKcHVibGljICA6CiAgICB2aXJ0dWFsIHZvaWQgc2V0UmlnaHRKdXN0aWZp Y2F0aW9uKCBib29sICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0VXNlc0JpZ1BpeG1hcHMoIGJvb2wg KTsKICAgIHZpcnR1YWwgdm9pZCBzZXRVc2VzVGV4dExhYmVsKCBib29sICk7CiAgICB2aXJ0dWFs IHZvaWQgc2V0RG9ja1dpbmRvd3NNb3ZhYmxlKCBib29sICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0 T3BhcXVlTW92aW5nKCBib29sICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RG9ja01lbnVFbmFibGVk KCBib29sICk7CiAgICB2aXJ0dWFsIHZvaWQgd2hhdHNUaGlzKCk7CiAgICB2aXJ0dWFsIHZvaWQg c2V0QXBwcm9wcmlhdGUoIFFEb2NrV2luZG93ICpkdywgYm9vbCBhICk7CiAgICB2aXJ0dWFsIHZv aWQgY3VzdG9taXplKCk7CgogICAgIAogICAgdm9pZCBzZXRUb29sQmFyc01vdmFibGUoIGJvb2wg KTsKCnByb3RlY3RlZCA6CiAgICB2b2lkIHBpeG1hcFNpemVDaGFuZ2VkKCBib29sICk7CiAgICB2 b2lkIHVzZXNUZXh0TGFiZWxDaGFuZ2VkKCBib29sICk7CiAgICB2b2lkIGRvY2tXaW5kb3dQb3Np dGlvbkNoYW5nZWQoIFFEb2NrV2luZG93ICogKTsKCgogICAgIAogICAgdm9pZCB0b29sQmFyUG9z aXRpb25DaGFuZ2VkKCBRVG9vbEJhciAqICk7CgoKcHJvdGVjdGVkICA6CiAgICB2aXJ0dWFsIHZv aWQgc2V0VXBMYXlvdXQoKTsKICAgIHZpcnR1YWwgYm9vbCBzaG93RG9ja01lbnUoIGNvbnN0IFFQ b2ludCAmZ2xvYmFsUG9zICk7CiAgICB2b2lkIG1lbnVBYm91dFRvU2hvdygpOwoKcHJvdGVjdGVk OgogICAgdm9pZCBwYWludEV2ZW50KCBRUGFpbnRFdmVudCAqICk7CiAgICB2b2lkIGNoaWxkRXZl bnQoIFFDaGlsZEV2ZW50ICogKTsKICAgIGJvb2wgZXZlbnQoIFFFdmVudCAqICk7CiAgICB2b2lk IHN0eWxlQ2hhbmdlKCBRU3R5bGUmICk7Cgpwcml2YXRlICA6CiAgICB2b2lkIHNsb3RQbGFjZUNo YW5nZWQoKTsKICAgIHZvaWQgZG9MaW5lVXAoKSB7IGxpbmVVcERvY2tXaW5kb3dzKCBUUlVFICk7 IH0KCnByaXZhdGU6CiAgICBRTWFpbldpbmRvd1ByaXZhdGUgKiBkOwogICAgdm9pZCB0cmlnZ2Vy TGF5b3V0KCBib29sIGRlbGV0ZUxheW91dCA9IFRSVUUpOwogICAgYm9vbCBkb2NrTWFpbldpbmRv dyggUU9iamVjdCAqZG9jayApOwoKCiAgICB2aXJ0dWFsIHZvaWQgc2V0TWVudUJhciggUU1lbnVC YXIgKiApOwoKICAgIHZpcnR1YWwgdm9pZCBzZXRTdGF0dXNCYXIoIFFTdGF0dXNCYXIgKiApOwoK ICAgIHZpcnR1YWwgdm9pZCBzZXRUb29sVGlwR3JvdXAoIFFUb29sVGlwR3JvdXAgKiApOwoKCiAg ICBmcmllbmQgY2xhc3MgUURvY2tXaW5kb3c7CiAgICBmcmllbmQgY2xhc3MgUU1lbnVCYXI7CiAg ICBmcmllbmQgY2xhc3MgUUhpZGVEb2NrOwogICAgZnJpZW5kIGNsYXNzIFFUb29sQmFyOwogICAg ZnJpZW5kIGNsYXNzIFFNYWluV2luZG93TGF5b3V0Owpwcml2YXRlOgkgCgogICAgUU1haW5XaW5k b3coIGNvbnN0IFFNYWluV2luZG93ICYgKTsKICAgIFFNYWluV2luZG93JiBvcGVyYXRvcj0oIGNv bnN0IFFNYWluV2luZG93ICYgKTsKCn07CgoKaW5saW5lIHZvaWQgUU1haW5XaW5kb3c6OmFkZFRv b2xCYXIoIFFEb2NrV2luZG93ICp3LCBUb29sQmFyRG9jayBkb2NrLCBib29sIG5ld0xpbmUgKQp7 CiAgICBhZGREb2NrV2luZG93KCB3LCBkb2NrLCBuZXdMaW5lICk7Cn0KCmlubGluZSB2b2lkIFFN YWluV2luZG93OjphZGRUb29sQmFyKCBRRG9ja1dpbmRvdyAqdywgY29uc3QgUVN0cmluZyAmbGFi ZWwsCgkJCSAgICAgIFRvb2xCYXJEb2NrIGRvY2ssIGJvb2wgbmV3TGluZSApCnsKICAgIGFkZERv Y2tXaW5kb3coIHcsIGxhYmVsLCBkb2NrLCBuZXdMaW5lICk7Cn0KCmlubGluZSB2b2lkIFFNYWlu V2luZG93Ojptb3ZlVG9vbEJhciggUURvY2tXaW5kb3cgKncsIFRvb2xCYXJEb2NrIGRvY2sgKQp7 CiAgICBtb3ZlRG9ja1dpbmRvdyggdywgZG9jayApOwp9CgppbmxpbmUgdm9pZCBRTWFpbldpbmRv dzo6bW92ZVRvb2xCYXIoIFFEb2NrV2luZG93ICp3LCBUb29sQmFyRG9jayBkb2NrLCBib29sIG5s LCBpbnQgaW5kZXgsIGludCBleHRyYU9mZnNldCApCnsKICAgIG1vdmVEb2NrV2luZG93KCB3LCBk b2NrLCBubCwgaW5kZXgsIGV4dHJhT2Zmc2V0ICk7Cn0KCmlubGluZSB2b2lkIFFNYWluV2luZG93 OjpyZW1vdmVUb29sQmFyKCBRRG9ja1dpbmRvdyAqdyApCnsKICAgIHJlbW92ZURvY2tXaW5kb3co IHcgKTsKfQoKaW5saW5lIGJvb2wgUU1haW5XaW5kb3c6OnRvb2xCYXJzTW92YWJsZSgpIGNvbnN0 CnsKICAgIHJldHVybiBkb2NrV2luZG93c01vdmFibGUoKTsKfQoKaW5saW5lIHZvaWQgUU1haW5X aW5kb3c6OmxpbmVVcFRvb2xCYXJzKCBib29sIGtlZXBOZXdMaW5lcyApCnsKICAgIGxpbmVVcERv Y2tXaW5kb3dzKCBrZWVwTmV3TGluZXMgKTsKfQoKaW5saW5lIHZvaWQgUU1haW5XaW5kb3c6OnNl dFRvb2xCYXJzTW92YWJsZSggYm9vbCBiICkKewogICAgc2V0RG9ja1dpbmRvd3NNb3ZhYmxlKCBi ICk7Cn0KCgoKICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggUVRleHRTdHJlYW0gJiwgY29uc3Qg UU1haW5XaW5kb3cgJiApOwogIFFUZXh0U3RyZWFtICZvcGVyYXRvcj4+KCBRVGV4dFN0cmVhbSAm LCBRTWFpbldpbmRvdyAmICk7CgoKCgoKIyA2ICJjaGFydGZvcm0uaCIgMgoKIyAxICIvdXNyL2xv Y2FsL3F0L2luY2x1ZGUvcXN0cmluZ2xpc3QuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzdHJsaXN0Lmgi IDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCnR5cGVkZWYgUVB0ckxpc3RJdGVyYXRvcjxjaGFyPiBRU3RyTGlzdEl0ZXJhdG9yOwoKCmNs YXNzICAgUVN0ckxpc3QgOiBwdWJsaWMgUVB0ckxpc3Q8Y2hhcj4KewpwdWJsaWM6CiAgICBRU3Ry TGlzdCggYm9vbCBkZWVwQ29waWVzPVRSVUUgKSB7IGRjID0gZGVlcENvcGllczsgZGVsX2l0ZW0g PSBkZWVwQ29waWVzOyB9CiAgICBRU3RyTGlzdCggY29uc3QgUVN0ckxpc3QgJiApOwogICAgflFT dHJMaXN0KCkJCQl7IGNsZWFyKCk7IH0KICAgIFFTdHJMaXN0JiBvcGVyYXRvcj0oIGNvbnN0IFFT dHJMaXN0ICYgKTsKCnByaXZhdGU6CiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSBuZXdJdGVtKCBR UHRyQ29sbGVjdGlvbjo6SXRlbSBkICkgeyByZXR1cm4gZGMgPyBxc3RyZHVwKCAoY29uc3QgY2hh ciopZCApIDogZDsgfQogICAgdm9pZCBkZWxldGVJdGVtKCBRUHRyQ29sbGVjdGlvbjo6SXRlbSBk ICkgeyBpZiAoIGRlbF9pdGVtICkgZGVsZXRlW10gKGNoYXIqKWQ7IH0KICAgIGludCBjb21wYXJl SXRlbXMoIFFQdHJDb2xsZWN0aW9uOjpJdGVtIHMxLCBRUHRyQ29sbGVjdGlvbjo6SXRlbSBzMiAp IHsgcmV0dXJuIHFzdHJjbXAoKGNvbnN0IGNoYXIqKXMxLAoJCQkJCQkJIChjb25zdCBjaGFyKilz Mik7IH0KCiAgICBRRGF0YVN0cmVhbSAmcmVhZCggUURhdGFTdHJlYW0gJnMsIFFQdHJDb2xsZWN0 aW9uOjpJdGVtICZkICkKCQkJCXsgcyA+PiAoY2hhciAqJilkOyByZXR1cm4gczsgfQogICAgUURh dGFTdHJlYW0gJndyaXRlKCBRRGF0YVN0cmVhbSAmcywgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCAp IGNvbnN0CgkJCQl7IHJldHVybiBzIDw8IChjb25zdCBjaGFyICopZDsgfQoKICAgIGJvb2wgIGRj Owp9OwoKCmNsYXNzICAgUVN0cklMaXN0IDogcHVibGljIFFTdHJMaXN0CSAKewpwdWJsaWM6CiAg ICBRU3RySUxpc3QoIGJvb2wgZGVlcENvcGllcz1UUlVFICkgOiBRU3RyTGlzdCggZGVlcENvcGll cyApIHt9CiAgICB+UVN0cklMaXN0KCkJCQl7IGNsZWFyKCk7IH0KcHJpdmF0ZToKICAgIGludAkg IGNvbXBhcmVJdGVtcyggUVB0ckNvbGxlY3Rpb246Okl0ZW0gczEsIFFQdHJDb2xsZWN0aW9uOjpJ dGVtIHMyICkKCQkJCXsgcmV0dXJuIHFzdHJpY21wKChjb25zdCBjaGFyKilzMSwKCQkJCQkJICAg IChjb25zdCBjaGFyKilzMik7IH0KfTsKCgppbmxpbmUgUVN0ckxpc3QgJiBRU3RyTGlzdDo6b3Bl cmF0b3I9KCBjb25zdCBRU3RyTGlzdCAmc3RyTGlzdCApCnsKICAgIGNsZWFyKCk7CiAgICBkYyA9 IHN0ckxpc3QuZGM7CiAgICBkZWxfaXRlbSA9IGRjOwogICAgUVB0ckxpc3Q8Y2hhcj46Om9wZXJh dG9yPSggc3RyTGlzdCApOwogICAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgUVN0ckxpc3Q6OlFT dHJMaXN0KCBjb25zdCBRU3RyTGlzdCAmc3RyTGlzdCApCiAgICA6IFFQdHJMaXN0PGNoYXI+KCBz dHJMaXN0ICkKewogICAgZGMgPSBGQUxTRTsKICAgIG9wZXJhdG9yPSggc3RyTGlzdCApOwp9CgoK IyA0NCAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzdHJpbmdsaXN0LmgiIDIKCgoKCgpjbGFzcyBR UmVnRXhwOwoKY2xhc3MgICBRU3RyaW5nTGlzdCA6IHB1YmxpYyBRVmFsdWVMaXN0PFFTdHJpbmc+ CnsKcHVibGljOgogICAgUVN0cmluZ0xpc3QoKSB7IH0KICAgIFFTdHJpbmdMaXN0KCBjb25zdCBR U3RyaW5nTGlzdCYgbCApIDogUVZhbHVlTGlzdDxRU3RyaW5nPihsKSB7IH0KICAgIFFTdHJpbmdM aXN0KCBjb25zdCBRVmFsdWVMaXN0PFFTdHJpbmc+JiBsICkgOiBRVmFsdWVMaXN0PFFTdHJpbmc+ KGwpIHsgfQogICAgUVN0cmluZ0xpc3QoIGNvbnN0IFFTdHJpbmcmIGkgKSB7IGFwcGVuZChpKTsg fQoKICAgIFFTdHJpbmdMaXN0KCBjb25zdCBjaGFyKiBpICkgeyBhcHBlbmQoaSk7IH0KCgogICAg c3RhdGljIFFTdHJpbmdMaXN0IGZyb21TdHJMaXN0KGNvbnN0IFFTdHJMaXN0Jik7CgogICAgdm9p ZCBzb3J0KCk7CgogICAgc3RhdGljIFFTdHJpbmdMaXN0IHNwbGl0KCBjb25zdCBRU3RyaW5nICZz ZXAsIGNvbnN0IFFTdHJpbmcgJnN0ciwgYm9vbCBhbGxvd0VtcHR5RW50cmllcyA9IEZBTFNFICk7 CiAgICBzdGF0aWMgUVN0cmluZ0xpc3Qgc3BsaXQoIGNvbnN0IFFDaGFyICZzZXAsIGNvbnN0IFFT dHJpbmcgJnN0ciwgYm9vbCBhbGxvd0VtcHR5RW50cmllcyA9IEZBTFNFICk7CgogICAgc3RhdGlj IFFTdHJpbmdMaXN0IHNwbGl0KCBjb25zdCBRUmVnRXhwICZzZXAsIGNvbnN0IFFTdHJpbmcgJnN0 ciwgYm9vbCBhbGxvd0VtcHR5RW50cmllcyA9IEZBTFNFICk7CgogICAgUVN0cmluZyBqb2luKCBj b25zdCBRU3RyaW5nICZzZXAgKSBjb25zdDsKCiAgICBRU3RyaW5nTGlzdCBncmVwKCBjb25zdCBR U3RyaW5nICZzdHIsIGJvb2wgY3MgPSBUUlVFICkgY29uc3Q7CgogICAgUVN0cmluZ0xpc3QgZ3Jl cCggY29uc3QgUVJlZ0V4cCAmZXhwciApIGNvbnN0OwoKfTsKCgpjbGFzcyBRRGF0YVN0cmVhbTsK ZXh0ZXJuICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFTdHJpbmdM aXN0JiApOwpleHRlcm4gICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwg Y29uc3QgUVN0cmluZ0xpc3QmICk7CgoKCgojIDcgImNoYXJ0Zm9ybS5oIiAyCgoKCmNsYXNzIENh bnZhc1ZpZXc7CgpjbGFzcyBRQWN0aW9uOwpjbGFzcyBRQ2FudmFzOwpjbGFzcyBRRm9udDsKY2xh c3MgUVByaW50ZXI7CmNsYXNzIFFTdHJpbmc7CgoKY2xhc3MgQ2hhcnRGb3JtOiBwdWJsaWMgUU1h aW5XaW5kb3cKewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkg Y29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAq Y2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsg dmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0 X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBp bnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7 CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0 cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5n IHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0 aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IApwdWJsaWM6CiAgICBlbnVtIHsgTUFYX0VMRU1FTlRT ID0gMTAwIH07CiAgICBlbnVtIHsgTUFYX1JFQ0VOVEZJTEVTID0gOSB9OyAgCiAgICBlbnVtIENo YXJ0VHlwZSB7IFBJRSwgVkVSVElDQUxfQkFSLCBIT1JJWk9OVEFMX0JBUiB9OwogICAgZW51bSBB ZGRWYWx1ZXNUeXBlIHsgTk8sIFlFUywgQVNfUEVSQ0VOVEFHRSB9OwoKICAgIENoYXJ0Rm9ybSgg Y29uc3QgUVN0cmluZyYgZmlsZW5hbWUgKTsKICAgIH5DaGFydEZvcm0oKTsKCiAgICBpbnQgY2hh cnRUeXBlKCkgeyByZXR1cm4gbV9jaGFydFR5cGU7IH0KICAgIHZvaWQgc2V0Q2hhbmdlZCggYm9v bCBjaGFuZ2VkID0gVFJVRSApIHsgbV9jaGFuZ2VkID0gY2hhbmdlZDsgfQogICAgdm9pZCBkcmF3 RWxlbWVudHMoKTsKCiAgICBRUG9wdXBNZW51ICpvcHRpb25zTWVudTsgIAoKcHJpdmF0ZSAgOgog ICAgdm9pZCBmaWxlTmV3KCk7CiAgICB2b2lkIGZpbGVPcGVuKCk7CiAgICB2b2lkIGZpbGVPcGVu UmVjZW50KCBpbnQgaW5kZXggKTsKICAgIHZvaWQgZmlsZVNhdmUoKTsKICAgIHZvaWQgZmlsZVNh dmVBcygpOwogICAgdm9pZCBmaWxlU2F2ZUFzUGl4bWFwKCk7CiAgICB2b2lkIGZpbGVQcmludCgp OwogICAgdm9pZCBmaWxlUXVpdCgpOwogICAgdm9pZCBvcHRpb25zU2V0RGF0YSgpOwogICAgdm9p ZCB1cGRhdGVDaGFydFR5cGUoIFFBY3Rpb24gKmFjdGlvbiApOwogICAgdm9pZCBvcHRpb25zU2V0 Rm9udCgpOwogICAgdm9pZCBvcHRpb25zU2V0T3B0aW9ucygpOwogICAgdm9pZCBoZWxwSGVscCgp OwogICAgdm9pZCBoZWxwQWJvdXQoKTsKICAgIHZvaWQgaGVscEFib3V0UXQoKTsKICAgIHZvaWQg c2F2ZU9wdGlvbnMoKTsKCnByaXZhdGU6CiAgICB2b2lkIGluaXQoKTsKICAgIHZvaWQgbG9hZCgg Y29uc3QgUVN0cmluZyYgZmlsZW5hbWUgKTsKICAgIGJvb2wgb2tUb0NsZWFyKCk7CiAgICB2b2lk IGRyYXdQaWVDaGFydCggY29uc3QgZG91YmxlIHNjYWxlc1tdLCBkb3VibGUgdG90YWwsIGludCBj b3VudCApOwogICAgdm9pZCBkcmF3VmVydGljYWxCYXJDaGFydCggY29uc3QgZG91YmxlIHNjYWxl c1tdLCBkb3VibGUgdG90YWwsIGludCBjb3VudCApOwogICAgdm9pZCBkcmF3SG9yaXpvbnRhbEJh ckNoYXJ0KCBjb25zdCBkb3VibGUgc2NhbGVzW10sIGRvdWJsZSB0b3RhbCwgaW50IGNvdW50ICk7 CgogICAgUVN0cmluZyB2YWx1ZUxhYmVsKCBjb25zdCBRU3RyaW5nJiBsYWJlbCwgZG91YmxlIHZh bHVlLCBkb3VibGUgdG90YWwgKTsKICAgIHZvaWQgdXBkYXRlUmVjZW50RmlsZXMoIGNvbnN0IFFT dHJpbmcmIGZpbGVuYW1lICk7CiAgICB2b2lkIHVwZGF0ZVJlY2VudEZpbGVzTWVudSgpOwogICAg dm9pZCBzZXRDaGFydFR5cGUoIENoYXJ0VHlwZSBjaGFydFR5cGUgKTsKCiAgICBRUG9wdXBNZW51 ICpmaWxlTWVudTsKICAgIFFBY3Rpb24gKm9wdGlvbnNQaWVDaGFydEFjdGlvbjsKICAgIFFBY3Rp b24gKm9wdGlvbnNIb3Jpem9udGFsQmFyQ2hhcnRBY3Rpb247CiAgICBRQWN0aW9uICpvcHRpb25z VmVydGljYWxCYXJDaGFydEFjdGlvbjsKCgogICAgUVN0cmluZyBtX2ZpbGVuYW1lOwogICAgUVN0 cmluZ0xpc3QgbV9yZWNlbnRGaWxlczsKICAgIFFDYW52YXMgKm1fY2FudmFzOwogICAgQ2FudmFz VmlldyAqbV9jYW52YXNWaWV3OwogICAgYm9vbCBtX2NoYW5nZWQ7CiAgICBFbGVtZW50VmVjdG9y IG1fZWxlbWVudHM7CiAgICBRUHJpbnRlciAqbV9wcmludGVyOwogICAgQ2hhcnRUeXBlIG1fY2hh cnRUeXBlOwogICAgQWRkVmFsdWVzVHlwZSBtX2FkZFZhbHVlczsKICAgIGludCBtX2RlY2ltYWxQ bGFjZXM7CiAgICBRRm9udCBtX2ZvbnQ7Cn07CgoKIyAyICJjaGFydGZvcm1fZmlsZXMuY3BwIiAy CgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWZpbGUuaCIgMQogCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFEaXI7CgoKY2xhc3MgICBRRmls ZSA6IHB1YmxpYyBRSU9EZXZpY2UJCQkgCnsKcHVibGljOgogICAgUUZpbGUoKTsKICAgIFFGaWxl KCBjb25zdCBRU3RyaW5nICZuYW1lICk7CiAgIH5RRmlsZSgpOwoKICAgIFFTdHJpbmcJbmFtZSgp CWNvbnN0OwogICAgdm9pZAlzZXROYW1lKCBjb25zdCBRU3RyaW5nICZuYW1lICk7CgogICAgdHlw ZWRlZiBRQ1N0cmluZyAoKkVuY29kZXJGbikoIGNvbnN0IFFTdHJpbmcgJmZpbGVOYW1lICk7CiAg ICB0eXBlZGVmIFFTdHJpbmcgKCpEZWNvZGVyRm4pKCBjb25zdCBRQ1N0cmluZyAmbG9jYWxmaWxl TmFtZSApOwogICAgc3RhdGljIFFDU3RyaW5nIGVuY29kZU5hbWUoIGNvbnN0IFFTdHJpbmcgJmZp bGVOYW1lICk7CiAgICBzdGF0aWMgUVN0cmluZyBkZWNvZGVOYW1lKCBjb25zdCBRQ1N0cmluZyAm bG9jYWxGaWxlTmFtZSApOwogICAgc3RhdGljIHZvaWQgc2V0RW5jb2RpbmdGdW5jdGlvbiggRW5j b2RlckZuICk7CiAgICBzdGF0aWMgdm9pZCBzZXREZWNvZGluZ0Z1bmN0aW9uKCBEZWNvZGVyRm4g KTsKCiAgICBib29sCWV4aXN0cygpICAgY29uc3Q7CiAgICBzdGF0aWMgYm9vbCBleGlzdHMoIGNv bnN0IFFTdHJpbmcgJmZpbGVOYW1lICk7CgogICAgYm9vbAlyZW1vdmUoKTsKICAgIHN0YXRpYyBi b29sIHJlbW92ZSggY29uc3QgUVN0cmluZyAmZmlsZU5hbWUgKTsKCiAgICBib29sCW9wZW4oIGlu dCApOwogICAgYm9vbAlvcGVuKCBpbnQsIEZJTEUgKiApOwogICAgYm9vbAlvcGVuKCBpbnQsIGlu dCApOwogICAgdm9pZAljbG9zZSgpOwogICAgdm9pZAlmbHVzaCgpOwoKICAgIE9mZnNldAlzaXpl KCkgY29uc3Q7CiAgICBPZmZzZXQJYXQoKSBjb25zdDsKICAgIGJvb2wJYXQoIE9mZnNldCApOwog ICAgYm9vbAlhdEVuZCgpIGNvbnN0OwoKICAgIFFfTE9ORwlyZWFkQmxvY2soIGNoYXIgKmRhdGEs IFFfVUxPTkcgbGVuICk7CiAgICBRX0xPTkcJd3JpdGVCbG9jayggY29uc3QgY2hhciAqZGF0YSwg UV9VTE9ORyBsZW4gKTsKICAgIFFfTE9ORwl3cml0ZUJsb2NrKCBjb25zdCBRQnl0ZUFycmF5JiBk YXRhICkKCQkgICAgICB7IHJldHVybiBRSU9EZXZpY2U6OndyaXRlQmxvY2soZGF0YSk7IH0KICAg IFFfTE9ORwlyZWFkTGluZSggY2hhciAqZGF0YSwgUV9VTE9ORyBtYXhsZW4gKTsKICAgIFFfTE9O RwlyZWFkTGluZSggUVN0cmluZyAmLCBRX1VMT05HIG1heGxlbiApOwoKICAgIGludAkJZ2V0Y2go KTsKICAgIGludAkJcHV0Y2goIGludCApOwogICAgaW50CQl1bmdldGNoKCBpbnQgKTsKCiAgICBp bnQJCWhhbmRsZSgpIGNvbnN0OwoKcHJvdGVjdGVkOgogICAgUVN0cmluZwlmbjsKICAgIEZJTEUg ICAgICAgKmZoOwogICAgaW50CQlmZDsKICAgIE9mZnNldAlsZW5ndGg7CiAgICBib29sCWV4dF9m OwogICAgdm9pZCAqIAlkOwoKcHJpdmF0ZToKICAgIHZvaWQJaW5pdCgpOwogICAgUUNTdHJpbmcJ dW5nZXRjaEJ1ZmZlcjsKCnByaXZhdGU6CSAKCiAgICBRRmlsZSggY29uc3QgUUZpbGUgJiApOwog ICAgUUZpbGUgJm9wZXJhdG9yPSggY29uc3QgUUZpbGUgJiApOwoKfTsKCgppbmxpbmUgUVN0cmlu ZyBRRmlsZTo6bmFtZSgpIGNvbnN0CnsgcmV0dXJuIGZuOyB9CgppbmxpbmUgUUlPRGV2aWNlOjpP ZmZzZXQgUUZpbGU6OmF0KCkgY29uc3QKeyByZXR1cm4gaW9JbmRleDsgfQoKCgojIDQgImNoYXJ0 Zm9ybV9maWxlcy5jcHAiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FmaWxlZGlhbG9n LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBRUHVz aEJ1dHRvbjsKY2xhc3MgUUJ1dHRvbjsKY2xhc3MgUUxhYmVsOwpjbGFzcyBRV2lkZ2V0OwpjbGFz cyBRRmlsZURpYWxvZzsKY2xhc3MgUVRpbWVyOwpjbGFzcyBRTmV0d29ya09wZXJhdGlvbjsKY2xh c3MgUUxpbmVFZGl0OwpjbGFzcyBRTGlzdFZpZXdJdGVtOwpjbGFzcyBRTGlzdEJveEl0ZW07CmNs YXNzIFFGaWxlRGlhbG9nUHJpdmF0ZTsKY2xhc3MgUUZpbGVEaWFsb2dRRmlsZUxpc3RWaWV3OwoK CiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FkaXIuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWZpbGVp bmZvLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAi L3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FkYXRldGltZS5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgpjbGFzcyAgIFFEYXRlCnsKcHVibGljOgog ICAgUURhdGUoKSAgeyBqZD0wOyB9CQkJCSAKICAgIFFEYXRlKCBpbnQgeSwgaW50IG0sIGludCBk ICk7CQkgCgogICAgYm9vbCAgIGlzTnVsbCgpCSBjb25zdCB7IHJldHVybiBqZCA9PSAwOyB9CiAg ICBib29sICAgaXNWYWxpZCgpCSBjb25zdDsJCQkgCgogICAgaW50CSAgIHllYXIoKQkgY29uc3Q7 CQkJIAogICAgaW50CSAgIG1vbnRoKCkJIGNvbnN0OwkJCSAKICAgIGludAkgICBkYXkoKQkgY29u c3Q7CQkJIAogICAgaW50CSAgIGRheU9mV2VlaygpCSBjb25zdDsJCQkgCiAgICBpbnQJICAgZGF5 T2ZZZWFyKCkJIGNvbnN0OwkJCSAKICAgIGludAkgICBkYXlzSW5Nb250aCgpIGNvbnN0OwkJCSAK ICAgIGludAkgICBkYXlzSW5ZZWFyKCkJIGNvbnN0OwkJCSAKCgoKICAgIHN0YXRpYyBRU3RyaW5n IG1vbnRoTmFtZSggaW50IG1vbnRoICkgeyByZXR1cm4gc2hvcnRNb250aE5hbWUoIG1vbnRoICk7 IH0KICAgIHN0YXRpYyBRU3RyaW5nIGRheU5hbWUoIGludCB3ZWVrZGF5ICkgeyByZXR1cm4gc2hv cnREYXlOYW1lKCB3ZWVrZGF5ICk7IH0KCiAgICBzdGF0aWMgUVN0cmluZyBzaG9ydE1vbnRoTmFt ZSggaW50IG1vbnRoICk7CiAgICBzdGF0aWMgUVN0cmluZyBzaG9ydERheU5hbWUoIGludCB3ZWVr ZGF5ICk7CiAgICBzdGF0aWMgUVN0cmluZyBsb25nTW9udGhOYW1lKCBpbnQgbW9udGggKTsKICAg IHN0YXRpYyBRU3RyaW5nIGxvbmdEYXlOYW1lKCBpbnQgd2Vla2RheSApOwoKCiAgICBRU3RyaW5n IHRvU3RyaW5nKCBRdDo6RGF0ZUZvcm1hdCBmID0gUXQ6OlRleHREYXRlICkJIGNvbnN0OwoKICAg IFFTdHJpbmcgdG9TdHJpbmcoIGNvbnN0IFFTdHJpbmcmIGZvcm1hdCApIGNvbnN0OwogICAgYm9v bCAgIHNldFlNRCggaW50IHksIGludCBtLCBpbnQgZCApOwoKICAgIFFEYXRlICBhZGREYXlzKCBp bnQgZGF5cyApCQljb25zdDsKICAgIFFEYXRlICBhZGRNb250aHMoIGludCBtb250aHMgKSAgICAg IGNvbnN0OwogICAgUURhdGUgIGFkZFllYXJzKCBpbnQgeWVhcnMgKSAgICAgICAgY29uc3Q7CiAg ICBpbnQJICAgZGF5c1RvKCBjb25zdCBRRGF0ZSAmICkJY29uc3Q7CgogICAgYm9vbCAgIG9wZXJh dG9yPT0oIGNvbnN0IFFEYXRlICZkICkgY29uc3QgeyByZXR1cm4gamQgPT0gZC5qZDsgfQogICAg Ym9vbCAgIG9wZXJhdG9yIT0oIGNvbnN0IFFEYXRlICZkICkgY29uc3QgeyByZXR1cm4gamQgIT0g ZC5qZDsgfQogICAgYm9vbCAgIG9wZXJhdG9yPCggY29uc3QgUURhdGUgJmQgKQljb25zdCB7IHJl dHVybiBqZCA8IGQuamQ7IH0KICAgIGJvb2wgICBvcGVyYXRvcjw9KCBjb25zdCBRRGF0ZSAmZCAp IGNvbnN0IHsgcmV0dXJuIGpkIDw9IGQuamQ7IH0KICAgIGJvb2wgICBvcGVyYXRvcj4oIGNvbnN0 IFFEYXRlICZkICkJY29uc3QgeyByZXR1cm4gamQgPiBkLmpkOyB9CiAgICBib29sICAgb3BlcmF0 b3I+PSggY29uc3QgUURhdGUgJmQgKSBjb25zdCB7IHJldHVybiBqZCA+PSBkLmpkOyB9CgogICAg c3RhdGljIFFEYXRlIGN1cnJlbnREYXRlKCk7CiAgICBzdGF0aWMgUURhdGUgZnJvbVN0cmluZygg Y29uc3QgUVN0cmluZyYgcywgUXQ6OkRhdGVGb3JtYXQgZiA9IFF0OjpUZXh0RGF0ZSApOwoKICAg IHN0YXRpYyBib29sCSBpc1ZhbGlkKCBpbnQgeSwgaW50IG0sIGludCBkICk7CiAgICBzdGF0aWMg Ym9vbAkgbGVhcFllYXIoIGludCB5ZWFyICk7CgogICAgc3RhdGljIHVpbnQJIGdyZWdvcmlhblRv SnVsaWFuKCBpbnQgeSwgaW50IG0sIGludCBkICk7CiAgICBzdGF0aWMgdm9pZAkganVsaWFuVG9H cmVnb3JpYW4oIHVpbnQgamQsIGludCAmeSwgaW50ICZtLCBpbnQgJmQgKTsKcHJpdmF0ZToKICAg IHVpbnQJIGpkOwogICAgZnJpZW5kIGNsYXNzIFFEYXRlVGltZTsKCiAgICBmcmllbmQgICBRRGF0 YVN0cmVhbSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUURhdGUgJiApOwogICAg ZnJpZW5kICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFEYXRlICYg KTsKCn07CgoKIAoKCgpjbGFzcyAgIFFUaW1lCnsKcHVibGljOgogICAgUVRpbWUoKSB7IGRzPTA7 IH0JCQkJIAogICAgUVRpbWUoIGludCBoLCBpbnQgbSwgaW50IHM9MCwgaW50IG1zPTAgKTsJIAoK ICAgIGJvb2wgICBpc051bGwoKQkgY29uc3QgeyByZXR1cm4gZHMgPT0gMDsgfQogICAgYm9vbCAg IGlzVmFsaWQoKQkgY29uc3Q7CQkJIAoKICAgIGludAkgICBob3VyKCkJIGNvbnN0OwkJCSAKICAg IGludAkgICBtaW51dGUoKQkgY29uc3Q7CQkJIAogICAgaW50CSAgIHNlY29uZCgpCSBjb25zdDsJ CQkgCiAgICBpbnQJICAgbXNlYygpCSBjb25zdDsJCQkgCgoKICAgIFFTdHJpbmcgdG9TdHJpbmco IFF0OjpEYXRlRm9ybWF0IGYgPSBRdDo6VGV4dERhdGUgKQkgY29uc3Q7CgogICAgUVN0cmluZyB0 b1N0cmluZyggY29uc3QgUVN0cmluZyYgZm9ybWF0ICkgY29uc3Q7CgogICAgYm9vbCAgIHNldEhN UyggaW50IGgsIGludCBtLCBpbnQgcywgaW50IG1zPTAgKTsKCiAgICBRVGltZSAgYWRkU2Vjcygg aW50IHNlY3MgKQkJY29uc3Q7CiAgICBpbnQJICAgc2Vjc1RvKCBjb25zdCBRVGltZSAmICkJY29u c3Q7CiAgICBRVGltZSAgYWRkTVNlY3MoIGludCBtcyApCQljb25zdDsKICAgIGludAkgICBtc2Vj c1RvKCBjb25zdCBRVGltZSAmICkJY29uc3Q7CgogICAgYm9vbCAgIG9wZXJhdG9yPT0oIGNvbnN0 IFFUaW1lICZkICkgY29uc3QgeyByZXR1cm4gZHMgPT0gZC5kczsgfQogICAgYm9vbCAgIG9wZXJh dG9yIT0oIGNvbnN0IFFUaW1lICZkICkgY29uc3QgeyByZXR1cm4gZHMgIT0gZC5kczsgfQogICAg Ym9vbCAgIG9wZXJhdG9yPCggY29uc3QgUVRpbWUgJmQgKQljb25zdCB7IHJldHVybiBkcyA8IGQu ZHM7IH0KICAgIGJvb2wgICBvcGVyYXRvcjw9KCBjb25zdCBRVGltZSAmZCApIGNvbnN0IHsgcmV0 dXJuIGRzIDw9IGQuZHM7IH0KICAgIGJvb2wgICBvcGVyYXRvcj4oIGNvbnN0IFFUaW1lICZkICkJ Y29uc3QgeyByZXR1cm4gZHMgPiBkLmRzOyB9CiAgICBib29sICAgb3BlcmF0b3I+PSggY29uc3Qg UVRpbWUgJmQgKSBjb25zdCB7IHJldHVybiBkcyA+PSBkLmRzOyB9CgogICAgc3RhdGljIFFUaW1l IGN1cnJlbnRUaW1lKCk7CiAgICBzdGF0aWMgUVRpbWUgZnJvbVN0cmluZyggY29uc3QgUVN0cmlu ZyYgcywgUXQ6OkRhdGVGb3JtYXQgZiA9IFF0OjpUZXh0RGF0ZSApOwogICAgc3RhdGljIGJvb2wJ IGlzVmFsaWQoIGludCBoLCBpbnQgbSwgaW50IHMsIGludCBtcz0wICk7CgogICAgdm9pZCAgIHN0 YXJ0KCk7CiAgICBpbnQJICAgcmVzdGFydCgpOwogICAgaW50CSAgIGVsYXBzZWQoKSBjb25zdDsK CnByaXZhdGU6CiAgICBzdGF0aWMgYm9vbCBjdXJyZW50VGltZSggUVRpbWUgKiApOwoKICAgIHVp bnQgICBkczsKICAgIGZyaWVuZCBjbGFzcyBRRGF0ZVRpbWU7CgogICAgZnJpZW5kICAgUURhdGFT dHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFUaW1lICYgKTsKICAgIGZy aWVuZCAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRVGltZSAmICk7 Cgp9OwoKCiAKCgoKY2xhc3MgICBRRGF0ZVRpbWUKewpwdWJsaWM6CiAgICBRRGF0ZVRpbWUoKSB7 fQkJCQkgCiAgICBRRGF0ZVRpbWUoIGNvbnN0IFFEYXRlICYgKTsKICAgIFFEYXRlVGltZSggY29u c3QgUURhdGUgJiwgY29uc3QgUVRpbWUgJiApOwoKICAgIGJvb2wgICBpc051bGwoKQljb25zdAkJ eyByZXR1cm4gZC5pc051bGwoKSAmJiB0LmlzTnVsbCgpOyB9CiAgICBib29sICAgaXNWYWxpZCgp CWNvbnN0CQl7IHJldHVybiBkLmlzVmFsaWQoKSAmJiB0LmlzVmFsaWQoKTsgfQoKICAgIFFEYXRl ICBkYXRlKCkJY29uc3QJCXsgcmV0dXJuIGQ7IH0KICAgIFFUaW1lICB0aW1lKCkJY29uc3QJCXsg cmV0dXJuIHQ7IH0KICAgIHZvaWQgICBzZXREYXRlKCBjb25zdCBRRGF0ZSAmZGF0ZSApIHsgZD1k YXRlOyB9CiAgICB2b2lkICAgc2V0VGltZSggY29uc3QgUVRpbWUgJnRpbWUgKSB7IHQ9dGltZTsg fQogICAgdm9pZCAgIHNldFRpbWVfdCggdWludCBzZWNzU2luY2UxSmFuMTk3MFVUQyApOwoKCiAg ICBRU3RyaW5nIHRvU3RyaW5nKCBRdDo6RGF0ZUZvcm1hdCBmID0gUXQ6OlRleHREYXRlICkJY29u c3Q7CgogICAgUVN0cmluZyB0b1N0cmluZyggY29uc3QgUVN0cmluZyYgZm9ybWF0ICkgY29uc3Q7 CgogICAgUURhdGVUaW1lIGFkZERheXMoIGludCBkYXlzICkJY29uc3Q7CiAgICBRRGF0ZVRpbWUg YWRkTW9udGhzKCBpbnQgbW9udGhzICkgICBjb25zdDsKICAgIFFEYXRlVGltZSBhZGRZZWFycygg aW50IHllYXJzICkgICAgIGNvbnN0OwogICAgUURhdGVUaW1lIGFkZFNlY3MoIGludCBzZWNzICkJ Y29uc3Q7CiAgICBpbnQJICAgZGF5c1RvKCBjb25zdCBRRGF0ZVRpbWUgJiApCWNvbnN0OwogICAg aW50CSAgIHNlY3NUbyggY29uc3QgUURhdGVUaW1lICYgKQljb25zdDsKCiAgICBib29sICAgb3Bl cmF0b3I9PSggY29uc3QgUURhdGVUaW1lICZkdCApIGNvbnN0OwogICAgYm9vbCAgIG9wZXJhdG9y IT0oIGNvbnN0IFFEYXRlVGltZSAmZHQgKSBjb25zdDsKICAgIGJvb2wgICBvcGVyYXRvcjwoIGNv bnN0IFFEYXRlVGltZSAmZHQgKSAgY29uc3Q7CiAgICBib29sICAgb3BlcmF0b3I8PSggY29uc3Qg UURhdGVUaW1lICZkdCApIGNvbnN0OwogICAgYm9vbCAgIG9wZXJhdG9yPiggY29uc3QgUURhdGVU aW1lICZkdCApICBjb25zdDsKICAgIGJvb2wgICBvcGVyYXRvcj49KCBjb25zdCBRRGF0ZVRpbWUg JmR0ICkgY29uc3Q7CgogICAgc3RhdGljIFFEYXRlVGltZSBjdXJyZW50RGF0ZVRpbWUoKTsKICAg IHN0YXRpYyBRRGF0ZVRpbWUgZnJvbVN0cmluZyggY29uc3QgUVN0cmluZyYgcywgUXQ6OkRhdGVG b3JtYXQgZiA9IFF0OjpUZXh0RGF0ZSApOwoKcHJpdmF0ZToKICAgIFFEYXRlICBkOwogICAgUVRp bWUgIHQ7CgogICAgZnJpZW5kICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFt ICYsIGNvbnN0IFFEYXRlVGltZSAmKTsKICAgIGZyaWVuZCAgIFFEYXRhU3RyZWFtICZvcGVyYXRv cj4+KCBRRGF0YVN0cmVhbSAmLCBRRGF0ZVRpbWUgJiApOwoKfTsKCgogCgoKCgogIFFEYXRhU3Ry ZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmLCBjb25zdCBRRGF0ZSAmICk7CiAgUURhdGFT dHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFEYXRlICYgKTsKICBRRGF0YVN0cmVh bSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUVRpbWUgJiApOwogIFFEYXRhU3Ry ZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRVGltZSAmICk7CiAgUURhdGFTdHJlYW0g Jm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFEYXRlVGltZSAmICk7CiAgUURhdGFT dHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFEYXRlVGltZSAmICk7CgoKCgojIDQz ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWZpbGVpbmZvLmgiIDIKCgoKCmNsYXNzIFFEaXI7CnN0 cnVjdCBRRmlsZUluZm9DYWNoZTsKCgpjbGFzcyAgIFFGaWxlSW5mbwkJCQkgICAgCnsKcHVibGlj OgogICAgZW51bSBQZXJtaXNzaW9uU3BlYyB7CglSZWFkVXNlciAgPSAwNDAwLCBXcml0ZVVzZXIg ID0gMDIwMCwgRXhlVXNlciAgPSAwMTAwLAoJUmVhZEdyb3VwID0gMDA0MCwgV3JpdGVHcm91cCA9 IDAwMjAsIEV4ZUdyb3VwID0gMDAxMCwKCVJlYWRPdGhlciA9IDAwMDQsIFdyaXRlT3RoZXIgPSAw MDAyLCBFeGVPdGhlciA9IDAwMDEgfTsKCiAgICBRRmlsZUluZm8oKTsKICAgIFFGaWxlSW5mbygg Y29uc3QgUVN0cmluZyAmZmlsZSApOwogICAgUUZpbGVJbmZvKCBjb25zdCBRRmlsZSAmICk7Cgog ICAgUUZpbGVJbmZvKCBjb25zdCBRRGlyICYsIGNvbnN0IFFTdHJpbmcgJmZpbGVOYW1lICk7Cgog ICAgUUZpbGVJbmZvKCBjb25zdCBRRmlsZUluZm8gJiApOwogICB+UUZpbGVJbmZvKCk7CgogICAg UUZpbGVJbmZvICAmb3BlcmF0b3I9KCBjb25zdCBRRmlsZUluZm8gJiApOwoKICAgIHZvaWQJc2V0 RmlsZSggY29uc3QgUVN0cmluZyAmZmlsZSApOwogICAgdm9pZAlzZXRGaWxlKCBjb25zdCBRRmls ZSAmICk7CgogICAgdm9pZAlzZXRGaWxlKCBjb25zdCBRRGlyICYsIGNvbnN0IFFTdHJpbmcgJmZp bGVOYW1lICk7CgogICAgYm9vbAlleGlzdHMoKQljb25zdDsKICAgIHZvaWQJcmVmcmVzaCgpCWNv bnN0OwogICAgYm9vbAljYWNoaW5nKCkJY29uc3Q7CiAgICB2b2lkCXNldENhY2hpbmcoIGJvb2wg KTsKCiAgICBRU3RyaW5nCWZpbGVQYXRoKCkJY29uc3Q7CiAgICBRU3RyaW5nCWZpbGVOYW1lKCkJ Y29uc3Q7CgogICAgUVN0cmluZwlhYnNGaWxlUGF0aCgpCWNvbnN0OwoKICAgIFFTdHJpbmcJYmFz ZU5hbWUoIGJvb2wgY29tcGxldGUgPSBGQUxTRSApIGNvbnN0OwogICAgUVN0cmluZwlleHRlbnNp b24oIGJvb2wgY29tcGxldGUgPSBUUlVFICkgY29uc3Q7CgoKICAgIFFTdHJpbmcJZGlyUGF0aCgg Ym9vbCBhYnNQYXRoID0gRkFMU0UgKSBjb25zdDsKCgogICAgUURpcglkaXIoIGJvb2wgYWJzUGF0 aCA9IEZBTFNFICkJY29uc3Q7CgogICAgYm9vbAlpc1JlYWRhYmxlKCkJY29uc3Q7CiAgICBib29s CWlzV3JpdGFibGUoKQljb25zdDsKICAgIGJvb2wJaXNFeGVjdXRhYmxlKCkJY29uc3Q7CgoKICAg IGJvb2wJaXNSZWxhdGl2ZSgpCWNvbnN0OwogICAgYm9vbAljb252ZXJ0VG9BYnMoKTsKCgogICAg Ym9vbAlpc0ZpbGUoKQljb25zdDsKICAgIGJvb2wJaXNEaXIoKQkJY29uc3Q7CiAgICBib29sCWlz U3ltTGluaygpCWNvbnN0OwoKICAgIFFTdHJpbmcJcmVhZExpbmsoKQljb25zdDsKCiAgICBRU3Ry aW5nCW93bmVyKCkJCWNvbnN0OwogICAgdWludAlvd25lcklkKCkJY29uc3Q7CiAgICBRU3RyaW5n CWdyb3VwKCkJCWNvbnN0OwogICAgdWludAlncm91cElkKCkJY29uc3Q7CgogICAgYm9vbAlwZXJt aXNzaW9uKCBpbnQgcGVybWlzc2lvblNwZWMgKSBjb25zdDsKCiAgICB1aW50CXNpemUoKQkJY29u c3Q7CgogICAgUURhdGVUaW1lCWNyZWF0ZWQoKQljb25zdDsKICAgIFFEYXRlVGltZQlsYXN0TW9k aWZpZWQoKQljb25zdDsKICAgIFFEYXRlVGltZQlsYXN0UmVhZCgpCWNvbnN0OwoKcHJpdmF0ZToK ICAgIHZvaWQJZG9TdGF0KCkgY29uc3Q7CiAgICBzdGF0aWMgdm9pZCBzbGFzaGlmeSggUVN0cmlu ZyAmICk7CiAgICBzdGF0aWMgdm9pZCBtYWtlQWJzKCBRU3RyaW5nICYgKTsKICAgIAogICAgUVN0 cmluZwlmbjsKICAgIFFGaWxlSW5mb0NhY2hlICpmaWM7CiAgICBib29sCWNhY2hlOwoKICAgIGJv b2wgICAgICAgIHN5bUxpbms7CgoKfTsKCgppbmxpbmUgYm9vbCBRRmlsZUluZm86OmNhY2hpbmco KSBjb25zdAp7CiAgICByZXR1cm4gY2FjaGU7Cn0KCgoKIyA0MyAiL3Vzci9sb2NhbC9xdC9pbmNs dWRlL3FkaXIuaCIgMgoKCgoKCgoKdHlwZWRlZiBRUHRyTGlzdDxRRmlsZUluZm8+IFFGaWxlSW5m b0xpc3Q7CnR5cGVkZWYgUVB0ckxpc3RJdGVyYXRvcjxRRmlsZUluZm8+IFFGaWxlSW5mb0xpc3RJ dGVyYXRvcjsKY2xhc3MgUVN0cmluZ0xpc3Q7CgoKY2xhc3MgICBRRGlyCnsKcHVibGljOgogICAg ZW51bSBGaWx0ZXJTcGVjIHsgRGlycwkgICAgPSAweDAwMSwKCQkgICAgICBGaWxlcwkgICAgPSAw eDAwMiwKCQkgICAgICBEcml2ZXMJICAgID0gMHgwMDQsCgkJICAgICAgTm9TeW1MaW5rcyAgICA9 IDB4MDA4LAoJCSAgICAgIEFsbAkgICAgPSAweDAwNywKCQkgICAgICAgVHlwZU1hc2sJICAgID0g MHgwMEYsCgoJCSAgICAgIFJlYWRhYmxlCSAgICA9IDB4MDEwLAoJCSAgICAgIFdyaXRhYmxlCSAg ICA9IDB4MDIwLAoJCSAgICAgIEV4ZWN1dGFibGUgICAgPSAweDA0MCwKCQkgICAgICAgUldFTWFz awkgICAgPSAweDA3MCwKCgkJICAgICAgTW9kaWZpZWQJICAgID0gMHgwODAsCgkJICAgICAgSGlk ZGVuCSAgICA9IDB4MTAwLAoJCSAgICAgIFN5c3RlbQkgICAgPSAweDIwMCwKCQkgICAgICAgQWNj ZXNzTWFzayAgICA9IDB4M0YwLAoKCQkgICAgICBEZWZhdWx0RmlsdGVyID0gLTEgfTsKCiAgICBl bnVtIFNvcnRTcGVjICAgeyBOYW1lCSAgICA9IDB4MDAsCgkJICAgICAgVGltZQkgICAgPSAweDAx LAoJCSAgICAgIFNpemUJICAgID0gMHgwMiwKCQkgICAgICBVbnNvcnRlZAkgICAgPSAweDAzLAoJ CSAgICAgICBTb3J0QnlNYXNrICAgID0gMHgwMywKCgkJICAgICAgRGlyc0ZpcnN0CSAgICA9IDB4 MDQsCgkJICAgICAgUmV2ZXJzZWQJICAgID0gMHgwOCwKCQkgICAgICBJZ25vcmVDYXNlICAgID0g MHgxMCwKCQkgICAgICBEZWZhdWx0U29ydCAgID0gLTEgfTsKCiAgICBRRGlyKCk7CiAgICBRRGly KCBjb25zdCBRU3RyaW5nICZwYXRoLCBjb25zdCBRU3RyaW5nICZuYW1lRmlsdGVyID0gUVN0cmlu Zzo6bnVsbCwKCSAgaW50IHNvcnRTcGVjID0gTmFtZSB8IElnbm9yZUNhc2UsIGludCBmaWx0ZXJT cGVjID0gQWxsICk7CiAgICBRRGlyKCBjb25zdCBRRGlyICYgKTsKCiAgICB2aXJ0dWFsIH5RRGly KCk7CgogICAgUURpciAgICAgICAmb3BlcmF0b3I9KCBjb25zdCBRRGlyICYgKTsKICAgIFFEaXIg ICAgICAgJm9wZXJhdG9yPSggY29uc3QgUVN0cmluZyAmcGF0aCApOwoKICAgIHZpcnR1YWwgdm9p ZCBzZXRQYXRoKCBjb25zdCBRU3RyaW5nICZwYXRoICk7CiAgICB2aXJ0dWFsIFFTdHJpbmcgcGF0 aCgpCQljb25zdDsKICAgIHZpcnR1YWwgUVN0cmluZyBhYnNQYXRoKCkJY29uc3Q7CiAgICB2aXJ0 dWFsIFFTdHJpbmcgY2Fub25pY2FsUGF0aCgpCWNvbnN0OwoKICAgIHZpcnR1YWwgUVN0cmluZyBk aXJOYW1lKCkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJpbmcgZmlsZVBhdGgoIGNvbnN0IFFTdHJp bmcgJmZpbGVOYW1lLAoJCQkgICAgICBib29sIGFjY2VwdEFic1BhdGggPSBUUlVFICkgY29uc3Q7 CiAgICB2aXJ0dWFsIFFTdHJpbmcgYWJzRmlsZVBhdGgoIGNvbnN0IFFTdHJpbmcgJmZpbGVOYW1l LAoJCQkJIGJvb2wgYWNjZXB0QWJzUGF0aCA9IFRSVUUgKSBjb25zdDsKCiAgICBzdGF0aWMgUVN0 cmluZyBjb252ZXJ0U2VwYXJhdG9ycyggY29uc3QgUVN0cmluZyAmcGF0aE5hbWUgKTsKCiAgICB2 aXJ0dWFsIGJvb2wgY2QoIGNvbnN0IFFTdHJpbmcgJmRpck5hbWUsIGJvb2wgYWNjZXB0QWJzUGF0 aCA9IFRSVUUgKTsKICAgIHZpcnR1YWwgYm9vbCBjZFVwKCk7CgogICAgUVN0cmluZwluYW1lRmls dGVyKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZUZpbHRlciggY29uc3QgUVN0cmlu ZyAmbmFtZUZpbHRlciApOwogICAgRmlsdGVyU3BlYyBmaWx0ZXIoKSBjb25zdDsKICAgIHZpcnR1 YWwgdm9pZCBzZXRGaWx0ZXIoIGludCBmaWx0ZXJTcGVjICk7CiAgICBTb3J0U3BlYyBzb3J0aW5n KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U29ydGluZyggaW50IHNvcnRTcGVjICk7Cgog ICAgYm9vbAltYXRjaEFsbERpcnMoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRNYXRjaEFs bERpcnMoIGJvb2wgKTsKCiAgICB1aW50IGNvdW50KCkgY29uc3Q7CiAgICBRU3RyaW5nCW9wZXJh dG9yW10oIGludCApIGNvbnN0OwoKICAgIHZpcnR1YWwgUVN0ckxpc3QgZW5jb2RlZEVudHJ5TGlz dCggaW50IGZpbHRlclNwZWMgPSBEZWZhdWx0RmlsdGVyLAoJCQkJICAgICAgIGludCBzb3J0U3Bl YyAgID0gRGVmYXVsdFNvcnQgICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJMaXN0IGVuY29kZWRF bnRyeUxpc3QoIGNvbnN0IFFTdHJpbmcgJm5hbWVGaWx0ZXIsCgkJCQkgICAgICAgaW50IGZpbHRl clNwZWMgPSBEZWZhdWx0RmlsdGVyLAoJCQkJICAgICAgIGludCBzb3J0U3BlYyAgID0gRGVmYXVs dFNvcnQgICApIGNvbnN0OwogICAgdmlydHVhbCBRU3RyaW5nTGlzdCBlbnRyeUxpc3QoIGludCBm aWx0ZXJTcGVjID0gRGVmYXVsdEZpbHRlciwKCQkJCSAgIGludCBzb3J0U3BlYyAgID0gRGVmYXVs dFNvcnQgICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJpbmdMaXN0IGVudHJ5TGlzdCggY29uc3Qg UVN0cmluZyAmbmFtZUZpbHRlciwKCQkJCSAgIGludCBmaWx0ZXJTcGVjID0gRGVmYXVsdEZpbHRl ciwKCQkJCSAgIGludCBzb3J0U3BlYyAgID0gRGVmYXVsdFNvcnQgICApIGNvbnN0OwoKICAgIHZp cnR1YWwgY29uc3QgUUZpbGVJbmZvTGlzdCAqZW50cnlJbmZvTGlzdCggaW50IGZpbHRlclNwZWMg PSBEZWZhdWx0RmlsdGVyLAoJCQkJCQlpbnQgc29ydFNwZWMgPSBEZWZhdWx0U29ydCApIGNvbnN0 OwogICAgdmlydHVhbCBjb25zdCBRRmlsZUluZm9MaXN0ICplbnRyeUluZm9MaXN0KCBjb25zdCBR U3RyaW5nICZuYW1lRmlsdGVyLAoJCQkJCQlpbnQgZmlsdGVyU3BlYyA9IERlZmF1bHRGaWx0ZXIs CgkJCQkJCWludCBzb3J0U3BlYyA9IERlZmF1bHRTb3J0ICkgY29uc3Q7CgogICAgc3RhdGljIGNv bnN0IFFGaWxlSW5mb0xpc3QgKmRyaXZlcygpOwoKICAgIHZpcnR1YWwgYm9vbCBta2RpciggY29u c3QgUVN0cmluZyAmZGlyTmFtZSwKCQkJYm9vbCBhY2NlcHRBYnNQYXRoID0gVFJVRSApIGNvbnN0 OwogICAgdmlydHVhbCBib29sIHJtZGlyKCBjb25zdCBRU3RyaW5nICZkaXJOYW1lLAoJCQlib29s IGFjY2VwdEFic1BhdGggPSBUUlVFICkgY29uc3Q7CgogICAgdmlydHVhbCBib29sIGlzUmVhZGFi bGUoKSBjb25zdDsKICAgIHZpcnR1YWwgYm9vbCBleGlzdHMoKSAgIGNvbnN0OwogICAgdmlydHVh bCBib29sIGlzUm9vdCgpICAgY29uc3Q7CgogICAgdmlydHVhbCBib29sIGlzUmVsYXRpdmUoKSBj b25zdDsKICAgIHZpcnR1YWwgdm9pZCBjb252ZXJ0VG9BYnMoKTsKCiAgICB2aXJ0dWFsIGJvb2wg b3BlcmF0b3I9PSggY29uc3QgUURpciAmICkgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0 b3IhPSggY29uc3QgUURpciAmICkgY29uc3Q7CgogICAgdmlydHVhbCBib29sIHJlbW92ZSggY29u c3QgUVN0cmluZyAmZmlsZU5hbWUsCgkJCSBib29sIGFjY2VwdEFic1BhdGggPSBUUlVFICk7CiAg ICB2aXJ0dWFsIGJvb2wgcmVuYW1lKCBjb25zdCBRU3RyaW5nICZuYW1lLCBjb25zdCBRU3RyaW5n ICZuZXdOYW1lLAoJCQkgYm9vbCBhY2NlcHRBYnNQYXRocyA9IFRSVUUgICk7CiAgICB2aXJ0dWFs IGJvb2wgZXhpc3RzKCBjb25zdCBRU3RyaW5nICZuYW1lLAoJCQkgYm9vbCBhY2NlcHRBYnNQYXRo ID0gVFJVRSApOwoKICAgIHN0YXRpYyBjaGFyIHNlcGFyYXRvcigpOwoKICAgIHN0YXRpYyBib29s IHNldEN1cnJlbnQoIGNvbnN0IFFTdHJpbmcgJnBhdGggKTsKICAgIHN0YXRpYyBRRGlyIGN1cnJl bnQoKTsKICAgIHN0YXRpYyBRRGlyIGhvbWUoKTsKICAgIHN0YXRpYyBRRGlyIHJvb3QoKTsKICAg IHN0YXRpYyBRU3RyaW5nIGN1cnJlbnREaXJQYXRoKCk7CiAgICBzdGF0aWMgUVN0cmluZyBob21l RGlyUGF0aCgpOwogICAgc3RhdGljIFFTdHJpbmcgcm9vdERpclBhdGgoKTsKCiAgICBzdGF0aWMg Ym9vbCBtYXRjaCggY29uc3QgUVN0cmluZ0xpc3QgJmZpbHRlcnMsIGNvbnN0IFFTdHJpbmcgJmZp bGVOYW1lICk7CiAgICBzdGF0aWMgYm9vbCBtYXRjaCggY29uc3QgUVN0cmluZyAmZmlsdGVyLCBj b25zdCBRU3RyaW5nICZmaWxlTmFtZSApOwogICAgc3RhdGljIFFTdHJpbmcgY2xlYW5EaXJQYXRo KCBjb25zdCBRU3RyaW5nICZkaXJQYXRoICk7CiAgICBzdGF0aWMgYm9vbCBpc1JlbGF0aXZlUGF0 aCggY29uc3QgUVN0cmluZyAmcGF0aCApOwoKcHJpdmF0ZToKCgoKICAgIHZvaWQgaW5pdCgpOwog ICAgdmlydHVhbCBib29sIHJlYWREaXJFbnRyaWVzKCBjb25zdCBRU3RyaW5nICZuYW1lRmlsdGVy LAoJCQkJIGludCBGaWx0ZXJTcGVjLCBpbnQgU29ydFNwZWMgICk7CgogICAgc3RhdGljIHZvaWQg c2xhc2hpZnkgKCBRU3RyaW5nICYpOwoKICAgIFFTdHJpbmcJZFBhdGg7CiAgICBRU3RyaW5nTGlz dCAgICpmTGlzdDsKICAgIFFGaWxlSW5mb0xpc3QgKmZpTGlzdDsKICAgIFFTdHJpbmcJbmFtZUZp bHQ7CiAgICBGaWx0ZXJTcGVjCWZpbHRTOwogICAgU29ydFNwZWMJc29ydFM7CiAgICB1aW50CWRp cnR5CTogMTsKICAgIHVpbnQJYWxsRGlycyA6IDE7Cn07CgoKaW5saW5lIFFTdHJpbmcgUURpcjo6 cGF0aCgpIGNvbnN0CnsKICAgIHJldHVybiBkUGF0aDsKfQoKaW5saW5lIFFTdHJpbmcgUURpcjo6 bmFtZUZpbHRlcigpIGNvbnN0CnsKICAgIHJldHVybiBuYW1lRmlsdDsKfQoKaW5saW5lIFFEaXI6 OkZpbHRlclNwZWMgUURpcjo6ZmlsdGVyKCkgY29uc3QKewogICAgcmV0dXJuIGZpbHRTOwp9Cgpp bmxpbmUgUURpcjo6U29ydFNwZWMgUURpcjo6c29ydGluZygpIGNvbnN0CnsKICAgIHJldHVybiBz b3J0UzsKfQoKaW5saW5lIGJvb2wgUURpcjo6bWF0Y2hBbGxEaXJzKCkgY29uc3QKewogICAgcmV0 dXJuIGFsbERpcnM7Cn0KCmlubGluZSBib29sIFFEaXI6Om9wZXJhdG9yIT0oIGNvbnN0IFFEaXIg JmQgKSBjb25zdAp7CiAgICByZXR1cm4gISgqdGhpcyA9PSBkKTsKfQoKCnN0cnVjdCBRRGlyU29y dEl0ZW0gewogICAgUVN0cmluZyBmaWxlbmFtZV9jYWNoZTsKICAgIFFGaWxlSW5mbyogaXRlbTsK fTsKCgoKIyA1NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FmaWxlZGlhbG9nLmgiIDIKCiMgMSAi L3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FkaWFsb2cuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgUVB1c2hCdXR0b247CmNsYXNzIFFEaWFs b2dQcml2YXRlOwoKY2xhc3MgICBRRGlhbG9nIDogcHVibGljIFFXaWRnZXQKewpmcmllbmQgY2xh c3MgUVB1c2hCdXR0b247CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFPYmpl Y3QoKSBjb25zdCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25zdCBj aGFyICpjbGFzc05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBjaGFy KiApOyB2aXJ0dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJv b2wgcXRfZW1pdCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5KCBp bnQsIGludCwgUVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFPYmpl Y3QoKTsJUU9iamVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0YXRp YyBRU3RyaW5nIHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGljIFFT dHJpbmcgdHJVdGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZhdGU6 CXN0YXRpYyBRTWV0YU9iamVjdCAqbWV0YU9iajsgCiAgICAgCgpwdWJsaWM6CiAgICBRRGlhbG9n KCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wLCBib29sIG1vZGFsPUZBTFNF LAoJICAgICBXRmxhZ3MgZj0wICk7CiAgICB+UURpYWxvZygpOwoKICAgIGVudW0gRGlhbG9nQ29k ZSB7IFJlamVjdGVkLCBBY2NlcHRlZCB9OwoKICAgIGludAkJcmVzdWx0KCkgY29uc3QgeyByZXR1 cm4gcmVzY29kZTsgfQoKICAgIHZvaWQJc2hvdygpOwogICAgdm9pZAloaWRlKCk7CiAgICB2b2lk CW1vdmUoIGludCB4LCBpbnQgeSApOwogICAgdm9pZAltb3ZlKCBjb25zdCBRUG9pbnQgJnAgKTsK ICAgIHZvaWQJcmVzaXplKCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJcmVzaXplKCBjb25zdCBR U2l6ZSAmICk7CiAgICB2b2lkCXNldEdlb21ldHJ5KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQg aCApOwogICAgdm9pZAlzZXRHZW9tZXRyeSggY29uc3QgUVJlY3QgJiApOwoKICAgIHZvaWQJc2V0 T3JpZW50YXRpb24oIE9yaWVudGF0aW9uIG9yaWVudGF0aW9uICk7CiAgICBPcmllbnRhdGlvbglv cmllbnRhdGlvbigpIGNvbnN0OwoKICAgIHZvaWQJc2V0RXh0ZW5zaW9uKCBRV2lkZ2V0KiBleHRl bnNpb24gKTsKICAgIFFXaWRnZXQqCWV4dGVuc2lvbigpIGNvbnN0OwoKICAgIFFTaXplCXNpemVI aW50KCkgY29uc3Q7CiAgICBRU2l6ZQltaW5pbXVtU2l6ZUhpbnQoKSBjb25zdDsKCiAgICB2b2lk IHNldFNpemVHcmlwRW5hYmxlZCggYm9vbCApOwogICAgYm9vbCBpc1NpemVHcmlwRW5hYmxlZCgp IGNvbnN0OwoKcHVibGljICA6CiAgICBpbnQgZXhlYygpOwoKcHJvdGVjdGVkICA6CiAgICB2aXJ0 dWFsIHZvaWQgZG9uZSggaW50ICk7CiAgICB2aXJ0dWFsIHZvaWQgYWNjZXB0KCk7CiAgICB2aXJ0 dWFsIHZvaWQgcmVqZWN0KCk7CgogICAgdm9pZAlzaG93RXh0ZW5zaW9uKCBib29sICk7Cgpwcm90 ZWN0ZWQ6CiAgICB2b2lkCXNldFJlc3VsdCggaW50IHIgKQl7IHJlc2NvZGUgPSByOyB9CiAgICB2 b2lkCWtleVByZXNzRXZlbnQoIFFLZXlFdmVudCAqICk7CiAgICB2b2lkCWNsb3NlRXZlbnQoIFFD bG9zZUV2ZW50ICogKTsKICAgIHZvaWQJcmVzaXplRXZlbnQoIFFSZXNpemVFdmVudCAqICk7CiAg ICB2b2lkCWNvbnRleHRNZW51RXZlbnQoIFFDb250ZXh0TWVudUV2ZW50ICogKTsKICAgIGJvb2wJ ZXZlbnRGaWx0ZXIoIFFPYmplY3QgKiwgUUV2ZW50ICogKTsKICAgIHZvaWQJYWRqdXN0UG9zaXRp b24oIFFXaWRnZXQqKTsKCnByaXZhdGU6CiAgICB2b2lkCXNldERlZmF1bHQoIFFQdXNoQnV0dG9u ICogKTsKICAgIHZvaWQJCWhpZGVEZWZhdWx0KCk7CiAgICBpbnQJCXJlc2NvZGU7CiAgICB1aW50 CWRpZF9tb3ZlICAgOiAxOwogICAgdWludAloYXNfcmVscG9zIDogMTsKICAgIHVpbnQJZGlkX3Jl c2l6ZSA6IDE7CiAgICB1aW50CWluX2xvb3A6IDE7CiAgICB2b2lkIGFkanVzdFBvc2l0aW9uSW50 ZXJuYWwoIFFXaWRnZXQqLCBib29sIHVzZVJlbFBvcyA9IEZBTFNFICk7CiAgICBRRGlhbG9nUHJp dmF0ZSogZDsKCnByaXZhdGU6CSAKCiAgICBRRGlhbG9nKCBjb25zdCBRRGlhbG9nICYgKTsKICAg IFFEaWFsb2cgJm9wZXJhdG9yPSggY29uc3QgUURpYWxvZyAmICk7Cgp9OwoKCgojIDU2ICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcWZpbGVkaWFsb2cuaCIgMgoKIyAxICIvdXNyL2xvY2FsL3F0L2lu Y2x1ZGUvcXVybG9wZXJhdG9yLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F1cmwuaCIgMQogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFVcmxQcml2YXRlOwoK Y2xhc3MgICBRVXJsCnsKcHVibGljOgogICAgUVVybCgpOwogICAgUVVybCggY29uc3QgUVN0cmlu ZyYgdXJsICk7CiAgICBRVXJsKCBjb25zdCBRVXJsJiB1cmwgKTsKICAgIFFVcmwoIGNvbnN0IFFV cmwmIHVybCwgY29uc3QgUVN0cmluZyYgcmVsVXJsLCBib29sIGNoZWNrU2xhc2ggPSBGQUxTRSAp OwogICAgdmlydHVhbCB+UVVybCgpOwoKICAgIFFTdHJpbmcgcHJvdG9jb2woKSBjb25zdDsKICAg IHZpcnR1YWwgdm9pZCBzZXRQcm90b2NvbCggY29uc3QgUVN0cmluZyYgcHJvdG9jb2wgKTsKCiAg ICBRU3RyaW5nIHVzZXIoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRVc2VyKCBjb25zdCBR U3RyaW5nJiB1c2VyICk7CiAgICBib29sIGhhc1VzZXIoKSBjb25zdDsKCiAgICBRU3RyaW5nIHBh c3N3b3JkKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0UGFzc3dvcmQoIGNvbnN0IFFTdHJp bmcmIHBhc3MgKTsKICAgIGJvb2wgaGFzUGFzc3dvcmQoKSBjb25zdDsKCiAgICBRU3RyaW5nIGhv c3QoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRIb3N0KCBjb25zdCBRU3RyaW5nJiB1c2Vy ICk7CiAgICBib29sIGhhc0hvc3QoKSBjb25zdDsKCiAgICBpbnQgcG9ydCgpIGNvbnN0OwogICAg dmlydHVhbCB2b2lkIHNldFBvcnQoIGludCBwb3J0ICk7CiAgICBib29sIGhhc1BvcnQoKSBjb25z dDsKCiAgICBRU3RyaW5nIHBhdGgoIGJvb2wgY29ycmVjdCA9IFRSVUUgKSBjb25zdDsKICAgIHZp cnR1YWwgdm9pZCBzZXRQYXRoKCBjb25zdCBRU3RyaW5nJiBwYXRoICk7CiAgICBib29sIGhhc1Bh dGgoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0RW5jb2RlZFBhdGhBbmRRdWVyeSggY29u c3QgUVN0cmluZyYgZW5jICk7CiAgICBRU3RyaW5nIGVuY29kZWRQYXRoQW5kUXVlcnkoKTsKCiAg ICB2aXJ0dWFsIHZvaWQgc2V0UXVlcnkoIGNvbnN0IFFTdHJpbmcmIHR4dCApOwogICAgUVN0cmlu ZyBxdWVyeSgpIGNvbnN0OwoKICAgIFFTdHJpbmcgcmVmKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZv aWQgc2V0UmVmKCBjb25zdCBRU3RyaW5nJiB0eHQgKTsKICAgIGJvb2wgaGFzUmVmKCkgY29uc3Q7 CgogICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CiAgICBib29sIGlzTG9jYWxGaWxlKCkgY29uc3Q7 CgogICAgdmlydHVhbCB2b2lkIGFkZFBhdGgoIGNvbnN0IFFTdHJpbmcmIHBhdGggKTsKICAgIHZp cnR1YWwgdm9pZCBzZXRGaWxlTmFtZSggY29uc3QgUVN0cmluZyYgdHh0ICk7CgogICAgUVN0cmlu ZyBmaWxlTmFtZSgpIGNvbnN0OwogICAgUVN0cmluZyBkaXJQYXRoKCkgY29uc3Q7CgogICAgUVVy bCYgb3BlcmF0b3I9KCBjb25zdCBRVXJsJiB1cmwgKTsKICAgIFFVcmwmIG9wZXJhdG9yPSggY29u c3QgUVN0cmluZyYgdXJsICk7CgogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRVXJsJiB1cmwg KSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVN0cmluZyYgdXJsICkgY29uc3Q7 CgogICAgc3RhdGljIHZvaWQgZGVjb2RlKCBRU3RyaW5nJiB1cmwgKTsKICAgIHN0YXRpYyB2b2lk IGVuY29kZSggUVN0cmluZyYgdXJsICk7CgogICAgb3BlcmF0b3IgUVN0cmluZygpIGNvbnN0Owog ICAgdmlydHVhbCBRU3RyaW5nIHRvU3RyaW5nKCBib29sIGVuY29kZWRQYXRoID0gRkFMU0UsIGJv b2wgZm9yY2VQcmVwZW5kUHJvdG9jb2wgPSBUUlVFICkgY29uc3Q7CgogICAgdmlydHVhbCBib29s IGNkVXAoKTsKCiAgICBzdGF0aWMgYm9vbCBpc1JlbGF0aXZlVXJsKCBjb25zdCBRU3RyaW5nICZ1 cmwgKTsKCnByb3RlY3RlZDoKICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwogICAgdmlydHVhbCBi b29sIHBhcnNlKCBjb25zdCBRU3RyaW5nJiB1cmwgKTsKCnByaXZhdGU6CiAgICBRVXJsUHJpdmF0 ZSAqZDsKCn07CgoKCgojIDQzICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXVybG9wZXJhdG9yLmgi IDIKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbmV0d29ya3Byb3RvY29sLmgiIDEKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0 L2luY2x1ZGUvcXVybGluZm8uaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKY2xhc3MgUVVybE9wZXJhdG9yOwpjbGFzcyBRVXJsOwpjbGFzcyBRVXJsSW5m b1ByaXZhdGU7CgpjbGFzcyAgIFFVcmxJbmZvCnsKcHVibGljOgogICAgUVVybEluZm8oKTsKICAg IFFVcmxJbmZvKCBjb25zdCBRVXJsT3BlcmF0b3IgJnBhdGgsIGNvbnN0IFFTdHJpbmcgJmZpbGUg KTsKICAgIFFVcmxJbmZvKCBjb25zdCBRVXJsSW5mbyAmdWkgKTsKICAgIFFVcmxJbmZvKCBjb25z dCBRU3RyaW5nICZuYW1lLCBpbnQgcGVybWlzc2lvbnMsIGNvbnN0IFFTdHJpbmcgJm93bmVyLAoJ ICAgICAgY29uc3QgUVN0cmluZyAmZ3JvdXAsIHVpbnQgc2l6ZSwgY29uc3QgUURhdGVUaW1lICZs YXN0TW9kaWZpZWQsCgkgICAgICBjb25zdCBRRGF0ZVRpbWUgJmxhc3RSZWFkLCBib29sIGlzRGly LCBib29sIGlzRmlsZSwgYm9vbCBpc1N5bUxpbmssCgkgICAgICBib29sIGlzV3JpdGFibGUsIGJv b2wgaXNSZWFkYWJsZSwgYm9vbCBpc0V4ZWN1dGFibGUgKTsKICAgIFFVcmxJbmZvKCBjb25zdCBR VXJsICZ1cmwsIGludCBwZXJtaXNzaW9ucywgY29uc3QgUVN0cmluZyAmb3duZXIsCgkgICAgICBj b25zdCBRU3RyaW5nICZncm91cCwgdWludCBzaXplLCBjb25zdCBRRGF0ZVRpbWUgJmxhc3RNb2Rp ZmllZCwKCSAgICAgIGNvbnN0IFFEYXRlVGltZSAmbGFzdFJlYWQsIGJvb2wgaXNEaXIsIGJvb2wg aXNGaWxlLCBib29sIGlzU3ltTGluaywKCSAgICAgIGJvb2wgaXNXcml0YWJsZSwgYm9vbCBpc1Jl YWRhYmxlLCBib29sIGlzRXhlY3V0YWJsZSApOwogICAgUVVybEluZm8gJm9wZXJhdG9yPSggY29u c3QgUVVybEluZm8gJnVpICk7CiAgICB2aXJ0dWFsIH5RVXJsSW5mbygpOwoKICAgIHZpcnR1YWwg dm9pZCBzZXROYW1lKCBjb25zdCBRU3RyaW5nICZuYW1lICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0 RGlyKCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRGaWxlKCBib29sIGIgKTsKICAgIHZp cnR1YWwgdm9pZCBzZXRTeW1MaW5rKCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRPd25l ciggY29uc3QgUVN0cmluZyAmcyApOwogICAgdmlydHVhbCB2b2lkIHNldEdyb3VwKCBjb25zdCBR U3RyaW5nICZzICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZSggdWludCBzICk7CiAgICB2aXJ0 dWFsIHZvaWQgc2V0V3JpdGFibGUoIGJvb2wgYiApOwogICAgdmlydHVhbCB2b2lkIHNldFJlYWRh YmxlKCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRQZXJtaXNzaW9ucyggaW50IHAgKTsK ICAgIHZpcnR1YWwgdm9pZCBzZXRMYXN0TW9kaWZpZWQoIGNvbnN0IFFEYXRlVGltZSAmZHQgKTsK CiAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKCiAgICBRU3RyaW5nIG5hbWUoKSBjb25zdDsKICAg IGludCBwZXJtaXNzaW9ucygpIGNvbnN0OwogICAgUVN0cmluZyBvd25lcigpIGNvbnN0OwogICAg UVN0cmluZyBncm91cCgpIGNvbnN0OwogICAgdWludCBzaXplKCkgY29uc3Q7CiAgICBRRGF0ZVRp bWUgbGFzdE1vZGlmaWVkKCkgY29uc3Q7CiAgICBRRGF0ZVRpbWUgbGFzdFJlYWQoKSBjb25zdDsK ICAgIGJvb2wgaXNEaXIoKSBjb25zdDsKICAgIGJvb2wgaXNGaWxlKCkgY29uc3Q7CiAgICBib29s IGlzU3ltTGluaygpIGNvbnN0OwogICAgYm9vbCBpc1dyaXRhYmxlKCkgY29uc3Q7CiAgICBib29s IGlzUmVhZGFibGUoKSBjb25zdDsKICAgIGJvb2wgaXNFeGVjdXRhYmxlKCkgY29uc3Q7CgogICAg c3RhdGljIGJvb2wgZ3JlYXRlclRoYW4oIGNvbnN0IFFVcmxJbmZvICZpMSwgY29uc3QgUVVybElu Zm8gJmkyLAoJCQkgICAgIGludCBzb3J0QnkgKTsKICAgIHN0YXRpYyBib29sIGxlc3NUaGFuKCBj b25zdCBRVXJsSW5mbyAmaTEsIGNvbnN0IFFVcmxJbmZvICZpMiwKCQkJICBpbnQgc29ydEJ5ICk7 CiAgICBzdGF0aWMgYm9vbCBlcXVhbCggY29uc3QgUVVybEluZm8gJmkxLCBjb25zdCBRVXJsSW5m byAmaTIsCgkJICAgICAgIGludCBzb3J0QnkgKTsKCiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0 IFFVcmxJbmZvICZpICkgY29uc3Q7CnByaXZhdGU6CiAgICBRVXJsSW5mb1ByaXZhdGUgKmQ7Cgp9 OwoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbmV0d29ya3Byb3RvY29sLmgiIDIKCgoj IDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZGljdC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnRlbXBsYXRlPGNsYXNzIHR5cGU+CmNsYXNzIFFEaWN0 CgoKCgk6IHB1YmxpYyBRR0RpY3QKCnsKcHVibGljOgogICAgUURpY3QoIGludCBzaXplID0gMTcs IGJvb2wgY2FzZVNlbnNpdGl2ZSA9IFRSVUUgKQoJOiBRR0RpY3QoIHNpemUsIFN0cmluZ0tleSwg Y2FzZVNlbnNpdGl2ZSwgRkFMU0UgKSB7IH0KICAgIFFEaWN0KCBjb25zdCBRRGljdDx0eXBlPiAm ZCApIDogUUdEaWN0KCBkICkgeyB9CiAgICB+UURpY3QoKQkJCQl7IGNsZWFyKCk7IH0KICAgIFFE aWN0PHR5cGU+ICZvcGVyYXRvcj0oY29uc3QgUURpY3Q8dHlwZT4gJmQpCgkJCXsgcmV0dXJuIChR RGljdDx0eXBlPiYpUUdEaWN0OjpvcGVyYXRvcj0oZCk7IH0KICAgIHVpbnQgIGNvdW50KCkgICBj b25zdAkJeyByZXR1cm4gUUdEaWN0Ojpjb3VudCgpOyB9CiAgICB1aW50ICBzaXplKCkgICAgY29u c3QJCXsgcmV0dXJuIFFHRGljdDo6c2l6ZSgpOyB9CiAgICBib29sICBpc0VtcHR5KCkgY29uc3QJ CXsgcmV0dXJuIFFHRGljdDo6Y291bnQoKSA9PSAwOyB9CgogICAgdm9pZCAgaW5zZXJ0KCBjb25z dCBRU3RyaW5nICZrLCBjb25zdCB0eXBlICpkICkKCQkJCQl7IFFHRGljdDo6bG9va19zdHJpbmco aywoSXRlbSlkLDEpOyB9CiAgICB2b2lkICByZXBsYWNlKCBjb25zdCBRU3RyaW5nICZrLCBjb25z dCB0eXBlICpkICkKCQkJCQl7IFFHRGljdDo6bG9va19zdHJpbmcoaywoSXRlbSlkLDIpOyB9CiAg ICBib29sICByZW1vdmUoIGNvbnN0IFFTdHJpbmcgJmsgKQl7IHJldHVybiBRR0RpY3Q6OnJlbW92 ZV9zdHJpbmcoayk7IH0KICAgIHR5cGUgKnRha2UoIGNvbnN0IFFTdHJpbmcgJmsgKQl7IHJldHVy biAodHlwZSAqKVFHRGljdDo6dGFrZV9zdHJpbmcoayk7IH0KICAgIHR5cGUgKmZpbmQoIGNvbnN0 IFFTdHJpbmcgJmsgKSBjb25zdAoJCXsgcmV0dXJuICh0eXBlICopKChRR0RpY3QqKXRoaXMpLT5R R0RpY3Q6Omxvb2tfc3RyaW5nKGssMCwwKTsgfQogICAgdHlwZSAqb3BlcmF0b3JbXSggY29uc3Qg UVN0cmluZyAmayApIGNvbnN0CgkJeyByZXR1cm4gKHR5cGUgKikoKFFHRGljdCopdGhpcyktPlFH RGljdDo6bG9va19zdHJpbmcoaywwLDApOyB9CgogICAgdm9pZCAgY2xlYXIoKQkJCXsgUUdEaWN0 OjpjbGVhcigpOyB9CiAgICB2b2lkICByZXNpemUoIHVpbnQgbiApCQl7IFFHRGljdDo6cmVzaXpl KG4pOyB9CiAgICB2b2lkICBzdGF0aXN0aWNzKCkgY29uc3QJCXsgUUdEaWN0OjpzdGF0aXN0aWNz KCk7IH0KCgoKCgoKCnByaXZhdGU6Cgl2b2lkICBkZWxldGVJdGVtKCBJdGVtIGQgKTsKfTsKCgp0 ZW1wbGF0ZTw+IGlubGluZSB2b2lkIFFEaWN0PHZvaWQ+OjpkZWxldGVJdGVtKCBJdGVtICkKewp9 CgoKdGVtcGxhdGU8Y2xhc3MgdHlwZT4gaW5saW5lIHZvaWQgUURpY3Q8dHlwZT46OmRlbGV0ZUl0 ZW0oIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGQgKQp7CiAgICBpZiAoIGRlbF9pdGVtICkgZGVsZXRl ICh0eXBlICopZDsKfQoKdGVtcGxhdGU8Y2xhc3MgdHlwZT4KY2xhc3MgUURpY3RJdGVyYXRvcgog OiBwdWJsaWMgUUdEaWN0SXRlcmF0b3IKewpwdWJsaWM6CiAgICBRRGljdEl0ZXJhdG9yKGNvbnN0 IFFEaWN0PHR5cGU+ICZkKSA6IFFHRGljdEl0ZXJhdG9yKChRR0RpY3QgJilkKSB7IH0KICAgIH5R RGljdEl0ZXJhdG9yKCkJICAgICAge30KICAgIHVpbnQgIGNvdW50KCkgICBjb25zdCAgICAgeyBy ZXR1cm4gZGljdC0+Y291bnQoKTsgfQogICAgYm9vbCAgaXNFbXB0eSgpIGNvbnN0ICAgICB7IHJl dHVybiBkaWN0LT5jb3VudCgpID09IDA7IH0KICAgIHR5cGUgKnRvRmlyc3QoKQkgICAgICB7IHJl dHVybiAodHlwZSAqKVFHRGljdEl0ZXJhdG9yOjp0b0ZpcnN0KCk7IH0KICAgIG9wZXJhdG9yIHR5 cGUgKigpIGNvbnN0ICAgeyByZXR1cm4gKHR5cGUgKilRR0RpY3RJdGVyYXRvcjo6Z2V0KCk7IH0K ICAgIHR5cGUgKm9wZXJhdG9yKigpICAgICAgICAgeyByZXR1cm4gKHR5cGUgKilRR0RpY3RJdGVy YXRvcjo6Z2V0KCk7IH0KICAgIHR5cGUgICAqY3VycmVudCgpIGNvbnN0ICAgeyByZXR1cm4gKHR5 cGUgKilRR0RpY3RJdGVyYXRvcjo6Z2V0KCk7IH0KICAgIFFTdHJpbmcgY3VycmVudEtleSgpIGNv bnN0eyByZXR1cm4gUUdEaWN0SXRlcmF0b3I6OmdldEtleVN0cmluZygpOyB9CiAgICB0eXBlICpv cGVyYXRvcigpKCkJICAgICAgeyByZXR1cm4gKHR5cGUgKilRR0RpY3RJdGVyYXRvcjo6b3BlcmF0 b3IoKSgpOyB9CiAgICB0eXBlICpvcGVyYXRvcisrKCkJICAgICAgeyByZXR1cm4gKHR5cGUgKilR R0RpY3RJdGVyYXRvcjo6b3BlcmF0b3IrKygpOyB9CiAgICB0eXBlICpvcGVyYXRvcis9KHVpbnQg aikgIHsgcmV0dXJuICh0eXBlICopUUdEaWN0SXRlcmF0b3I6Om9wZXJhdG9yKz0oaik7IH0KfTsK CgojIDQ0ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW5ldHdvcmtwcm90b2NvbC5oIiAyCgoKCgoK CmNsYXNzIFFOZXR3b3JrUHJvdG9jb2w7CmNsYXNzIFFOZXR3b3JrT3BlcmF0aW9uOwpjbGFzcyBR VGltZXI7CmNsYXNzIFFVcmxPcGVyYXRvcjsKY2xhc3MgUU5ldHdvcmtQcm90b2NvbFByaXZhdGU7 CnRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBRVmFsdWVMaXN0OwoKY2xhc3MgICBRTmV0d29ya1By b3RvY29sRmFjdG9yeUJhc2UKewpwdWJsaWM6CiAgIHZpcnR1YWwgUU5ldHdvcmtQcm90b2NvbCAq Y3JlYXRlT2JqZWN0KCkgPSAwOwoKfTsKCnRlbXBsYXRlPCBjbGFzcyBQcm90b2NvbCA+CmNsYXNz IFFOZXR3b3JrUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFFOZXR3b3JrUHJvdG9jb2xGYWN0b3J5 QmFzZQp7CnB1YmxpYzoKICAgIFFOZXR3b3JrUHJvdG9jb2wgKmNyZWF0ZU9iamVjdCgpIHsKCXJl dHVybiBuZXcgUHJvdG9jb2w7CiAgICB9Cgp9OwoKdHlwZWRlZiBRRGljdDwgUU5ldHdvcmtQcm90 b2NvbEZhY3RvcnlCYXNlID4gUU5ldHdvcmtQcm90b2NvbERpY3Q7CgpjbGFzcyAgIFFOZXR3b3Jr UHJvdG9jb2wgOiBwdWJsaWMgUU9iamVjdAp7CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmpl Y3QgKm1ldGFPYmplY3QoKSBjb25zdCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0Jdmly dHVhbCBjb25zdCBjaGFyICpjbGFzc05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0 KCBjb25zdCBjaGFyKiApOyB2aXJ0dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiAp OyB2aXJ0dWFsIGJvb2wgcXRfZW1pdCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0 X3Byb3BlcnR5KCBpbnQsIGludCwgUVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0 YXRpY01ldGFPYmplY3QoKTsJUU9iamVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0 aGlzOyB9IHN0YXRpYyBRU3RyaW5nIHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAg KTsgc3RhdGljIFFTdHJpbmcgdHJVdGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAg KTsgCXByaXZhdGU6CXN0YXRpYyBRTWV0YU9iamVjdCAqbWV0YU9iajsgCgpwdWJsaWM6CiAgICBl bnVtIFN0YXRlIHsKCVN0V2FpdGluZyA9IDAsCglTdEluUHJvZ3Jlc3MsCglTdERvbmUsCglTdEZh aWxlZCwKCVN0U3RvcHBlZAogICAgfTsKCiAgICBlbnVtIE9wZXJhdGlvbiB7CglPcExpc3RDaGls ZHJlbiA9IDEsCglPcE1rRGlyID0gMiwKCU9wTWtkaXIgPSBPcE1rRGlyLCAgCglPcFJlbW92ZSA9 IDQsCglPcFJlbmFtZSA9IDgsCglPcEdldCA9IDMyLAoJT3BQdXQgPSA2NAogICAgfTsKCiAgICBl bnVtIENvbm5lY3Rpb25TdGF0ZSB7CglDb25Ib3N0Rm91bmQsCglDb25Db25uZWN0ZWQsCglDb25D bG9zZWQKICAgIH07CgogICAgZW51bSBFcnJvciB7CgkgCglOb0Vycm9yID0gMCwKCSAKCUVyclZh bGlkLAoJRXJyVW5rbm93blByb3RvY29sLAoJRXJyVW5zdXBwb3J0ZWQsCglFcnJQYXJzZSwKCSAK CUVyckxvZ2luSW5jb3JyZWN0LAoJRXJySG9zdE5vdEZvdW5kLAoJIAoJRXJyTGlzdENoaWxkcmVu LAoJRXJyTGlzdENobGlkcmVuID0gRXJyTGlzdENoaWxkcmVuLCAgCglFcnJNa0RpciwKCUVyck1r ZGlyID0gRXJyTWtEaXIsICAKCUVyclJlbW92ZSwKCUVyclJlbmFtZSwKCUVyckdldCwKCUVyclB1 dCwKCUVyckZpbGVOb3RFeGlzdGluZywKCUVyclBlcm1pc3Npb25EZW5pZWQKICAgIH07CgogICAg UU5ldHdvcmtQcm90b2NvbCgpOwogICAgdmlydHVhbCB+UU5ldHdvcmtQcm90b2NvbCgpOwoKICAg IHZpcnR1YWwgdm9pZCBzZXRVcmwoIFFVcmxPcGVyYXRvciAqdSApOwoKICAgIHZpcnR1YWwgdm9p ZCBzZXRBdXRvRGVsZXRlKCBib29sIGIsIGludCBpID0gMTAwMDAgKTsKICAgIGJvb2wgYXV0b0Rl bGV0ZSgpIGNvbnN0OwoKICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTmV0d29ya1Byb3RvY29sKCBj b25zdCBRU3RyaW5nICZwcm90b2NvbCwKCQkJCQkgUU5ldHdvcmtQcm90b2NvbEZhY3RvcnlCYXNl ICpwcm90b2NvbEZhY3RvcnkgKTsKICAgIHN0YXRpYyBRTmV0d29ya1Byb3RvY29sICpnZXROZXR3 b3JrUHJvdG9jb2woIGNvbnN0IFFTdHJpbmcgJnByb3RvY29sICk7CiAgICBzdGF0aWMgYm9vbCBo YXNPbmx5TG9jYWxGaWxlU3lzdGVtKCk7CgogICAgdmlydHVhbCBpbnQgc3VwcG9ydGVkT3BlcmF0 aW9ucygpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIGFkZE9wZXJhdGlvbiggUU5ldHdvcmtPcGVy YXRpb24gKm9wICk7CgogICAgUVVybE9wZXJhdG9yICp1cmwoKSBjb25zdDsKICAgIFFOZXR3b3Jr T3BlcmF0aW9uICpvcGVyYXRpb25JblByb2dyZXNzKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQg Y2xlYXJPcGVyYXRpb25RdWV1ZSgpOwogICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKCnByb3RlY3Rl ZCA6CiAgICB2b2lkIGRhdGEoIGNvbnN0IFFCeXRlQXJyYXkgJiwgUU5ldHdvcmtPcGVyYXRpb24g KnJlcyApOwogICAgdm9pZCBjb25uZWN0aW9uU3RhdGVDaGFuZ2VkKCBpbnQgc3RhdGUsIGNvbnN0 IFFTdHJpbmcgJmRhdGEgKTsKICAgIHZvaWQgZmluaXNoZWQoIFFOZXR3b3JrT3BlcmF0aW9uICpy ZXMgKTsKICAgIHZvaWQgc3RhcnQoIFFOZXR3b3JrT3BlcmF0aW9uICpyZXMgKTsKICAgIHZvaWQg bmV3Q2hpbGRyZW4oIGNvbnN0IFFWYWx1ZUxpc3Q8UVVybEluZm8+ICYsIFFOZXR3b3JrT3BlcmF0 aW9uICpyZXMgKTsKICAgIHZvaWQgbmV3Q2hpbGQoIGNvbnN0IFFVcmxJbmZvICYsIFFOZXR3b3Jr T3BlcmF0aW9uICpyZXMgKTsKICAgIHZvaWQgY3JlYXRlZERpcmVjdG9yeSggY29uc3QgUVVybElu Zm8gJiwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCByZW1vdmVkKCBRTmV0d29y a09wZXJhdGlvbiAqcmVzICk7CiAgICB2b2lkIGl0ZW1DaGFuZ2VkKCBRTmV0d29ya09wZXJhdGlv biAqcmVzICk7CiAgICB2b2lkIGRhdGFUcmFuc2ZlclByb2dyZXNzKCBpbnQgYnl0ZXNEb25lLCBp bnQgYnl0ZXNUb3RhbCwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwoKcHJvdGVjdGVkOgogICAg dmlydHVhbCB2b2lkIHByb2Nlc3NPcGVyYXRpb24oIFFOZXR3b3JrT3BlcmF0aW9uICpvcCApOwog ICAgdmlydHVhbCB2b2lkIG9wZXJhdGlvbkxpc3RDaGlsZHJlbiggUU5ldHdvcmtPcGVyYXRpb24g Km9wICk7CiAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0aW9uTWtEaXIoIFFOZXR3b3JrT3BlcmF0aW9u ICpvcCApOwogICAgdmlydHVhbCB2b2lkIG9wZXJhdGlvblJlbW92ZSggUU5ldHdvcmtPcGVyYXRp b24gKm9wICk7CiAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0aW9uUmVuYW1lKCBRTmV0d29ya09wZXJh dGlvbiAqb3AgKTsKICAgIHZpcnR1YWwgdm9pZCBvcGVyYXRpb25HZXQoIFFOZXR3b3JrT3BlcmF0 aW9uICpvcCApOwogICAgdmlydHVhbCB2b2lkIG9wZXJhdGlvblB1dCggUU5ldHdvcmtPcGVyYXRp b24gKm9wICk7CiAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0aW9uUHV0Q2h1bmsoIFFOZXR3b3JrT3Bl cmF0aW9uICpvcCApOwogICAgdmlydHVhbCBib29sIGNoZWNrQ29ubmVjdGlvbiggUU5ldHdvcmtP cGVyYXRpb24gKm9wICk7Cgpwcml2YXRlOgogICAgUU5ldHdvcmtQcm90b2NvbFByaXZhdGUgKmQ7 Cgpwcml2YXRlICA6CiAgICB2b2lkIHByb2Nlc3NOZXh0T3BlcmF0aW9uKCBRTmV0d29ya09wZXJh dGlvbiAqb2xkICk7CiAgICB2b2lkIHN0YXJ0T3BzKCk7CiAgICB2b2lkIGVtaXROZXdDaGlsZHJl biggY29uc3QgUVVybEluZm8gJmksIFFOZXR3b3JrT3BlcmF0aW9uICpvcCApOwoKICAgIHZvaWQg cmVtb3ZlTWUoKTsKCn07CgpjbGFzcyBRTmV0d29ya09wZXJhdGlvblByaXZhdGU7CgpjbGFzcyAg IFFOZXR3b3JrT3BlcmF0aW9uIDogcHVibGljIFFPYmplY3QKewogICAgcHVibGljOgl2aXJ0dWFs IFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVj dCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9p ZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBR VU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1 YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRh T2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAo UU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAg ZnJpZW5kIGNsYXNzIFFVcmxPcGVyYXRvcjsKCnB1YmxpYzoKICAgIFFOZXR3b3JrT3BlcmF0aW9u KCBRTmV0d29ya1Byb3RvY29sOjpPcGVyYXRpb24gb3BlcmF0aW9uLAoJCSAgICBjb25zdCBRU3Ry aW5nICZhcmcwLCBjb25zdCBRU3RyaW5nICZhcmcxLAoJCSAgICBjb25zdCBRU3RyaW5nICZhcmcy ICk7CiAgICBRTmV0d29ya09wZXJhdGlvbiggUU5ldHdvcmtQcm90b2NvbDo6T3BlcmF0aW9uIG9w ZXJhdGlvbiwKCQkgICAgY29uc3QgUUJ5dGVBcnJheSAmYXJnMCwgY29uc3QgUUJ5dGVBcnJheSAm YXJnMSwKCQkgICAgY29uc3QgUUJ5dGVBcnJheSAmYXJnMiApOwogICAgflFOZXR3b3JrT3BlcmF0 aW9uKCk7CgogICAgdm9pZCBzZXRTdGF0ZSggUU5ldHdvcmtQcm90b2NvbDo6U3RhdGUgc3RhdGUg KTsKICAgIHZvaWQgc2V0UHJvdG9jb2xEZXRhaWwoIGNvbnN0IFFTdHJpbmcgJmRldGFpbCApOwog ICAgdm9pZCBzZXRFcnJvckNvZGUoIGludCBlYyApOwogICAgdm9pZCBzZXRBcmcoIGludCBudW0s IGNvbnN0IFFTdHJpbmcgJmFyZyApOwogICAgdm9pZCBzZXRSYXdBcmcoIGludCBudW0sIGNvbnN0 IFFCeXRlQXJyYXkgJmFyZyApOwoKICAgIFFOZXR3b3JrUHJvdG9jb2w6Ok9wZXJhdGlvbiBvcGVy YXRpb24oKSBjb25zdDsKICAgIFFOZXR3b3JrUHJvdG9jb2w6OlN0YXRlIHN0YXRlKCkgY29uc3Q7 CiAgICBRU3RyaW5nIGFyZyggaW50IG51bSApIGNvbnN0OwogICAgUUJ5dGVBcnJheSByYXdBcmco IGludCBudW0gKSBjb25zdDsKICAgIFFTdHJpbmcgcHJvdG9jb2xEZXRhaWwoKSBjb25zdDsKICAg IGludCBlcnJvckNvZGUoKSBjb25zdDsKCiAgICB2b2lkIGZyZWUoKTsKCnByaXZhdGUgIDoKICAg IHZvaWQgZGVsZXRlTWUoKTsKCnByaXZhdGU6CiAgICBRQnl0ZUFycmF5ICZyYXcoIGludCBudW0g KSBjb25zdDsKICAgIFFOZXR3b3JrT3BlcmF0aW9uUHJpdmF0ZSAqZDsKCn07CgoKCgojIDQ1ICIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcXVybG9wZXJhdG9yLmgiIDIKCgoKCgoKY2xhc3MgUVVybElu Zm87CmNsYXNzIFFVcmxPcGVyYXRvclByaXZhdGU7CgpjbGFzcyAgIFFVcmxPcGVyYXRvciA6IHB1 YmxpYyBRT2JqZWN0LCBwdWJsaWMgUVVybAp7CiAgICBmcmllbmQgY2xhc3MgUU5ldHdvcmtQcm90 b2NvbDsKCiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFPYmplY3QoKSBjb25z dCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25zdCBjaGFyICpjbGFz c05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBjaGFyKiApOyB2aXJ0 dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wgcXRfZW1p dCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5KCBpbnQsIGludCwg UVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFPYmplY3QoKTsJUU9i amVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0YXRpYyBRU3RyaW5n IHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGljIFFTdHJpbmcgdHJV dGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZhdGU6CXN0YXRpYyBR TWV0YU9iamVjdCAqbWV0YU9iajsgCgpwdWJsaWM6CiAgICBRVXJsT3BlcmF0b3IoKTsKICAgIFFV cmxPcGVyYXRvciggY29uc3QgUVN0cmluZyAmdXJMICk7CiAgICBRVXJsT3BlcmF0b3IoIGNvbnN0 IFFVcmxPcGVyYXRvciYgdXJsICk7CiAgICBRVXJsT3BlcmF0b3IoIGNvbnN0IFFVcmxPcGVyYXRv ciYgdXJsLCBjb25zdCBRU3RyaW5nJiByZWxVcmwsIGJvb2wgY2hlY2tTbGFzaCA9IEZBTFNFICk7 CiAgICB2aXJ0dWFsIH5RVXJsT3BlcmF0b3IoKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0UGF0aCgg Y29uc3QgUVN0cmluZyYgcGF0aCApOwogICAgdmlydHVhbCBib29sIGNkVXAoKTsKCiAgICB2aXJ0 dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpsaXN0Q2hpbGRyZW4oKTsKICAgIHZpcnR1YWwg Y29uc3QgUU5ldHdvcmtPcGVyYXRpb24gKm1rZGlyKCBjb25zdCBRU3RyaW5nICZkaXJuYW1lICk7 CiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpyZW1vdmUoIGNvbnN0IFFTdHJp bmcgJmZpbGVuYW1lICk7CiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpyZW5h bWUoIGNvbnN0IFFTdHJpbmcgJm9sZG5hbWUsIGNvbnN0IFFTdHJpbmcgJm5ld25hbWUgKTsKICAg IHZpcnR1YWwgY29uc3QgUU5ldHdvcmtPcGVyYXRpb24gKmdldCggY29uc3QgUVN0cmluZyAmbG9j YXRpb24gPSBRU3RyaW5nOjpudWxsICk7CiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0 aW9uICpwdXQoIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsIGNvbnN0IFFTdHJpbmcgJmxvY2F0aW9u ID0gUVN0cmluZzo6bnVsbCAgKTsKICAgIHZpcnR1YWwgUVB0ckxpc3Q8UU5ldHdvcmtPcGVyYXRp b24+IGNvcHkoIGNvbnN0IFFTdHJpbmcgJmZyb20sIGNvbnN0IFFTdHJpbmcgJnRvLCBib29sIG1v dmUgPSBGQUxTRSwgYm9vbCB0b1BhdGggPSBUUlVFICk7CiAgICB2aXJ0dWFsIHZvaWQgY29weSgg Y29uc3QgUVN0cmluZ0xpc3QgJmZpbGVzLCBjb25zdCBRU3RyaW5nICZkZXN0LCBib29sIG1vdmUg PSBGQUxTRSApOwogICAgdmlydHVhbCBib29sIGlzRGlyKCBib29sICpvayA9IDAgKTsKCiAgICB2 aXJ0dWFsIHZvaWQgc2V0TmFtZUZpbHRlciggY29uc3QgUVN0cmluZyAmbmFtZUZpbHRlciApOwog ICAgUVN0cmluZyBuYW1lRmlsdGVyKCkgY29uc3Q7CgogICAgdmlydHVhbCBRVXJsSW5mbyBpbmZv KCBjb25zdCBRU3RyaW5nICZlbnRyeSApIGNvbnN0OwoKICAgIFFVcmxPcGVyYXRvciYgb3BlcmF0 b3I9KCBjb25zdCBRVXJsT3BlcmF0b3IgJnVybCApOwogICAgUVVybE9wZXJhdG9yJiBvcGVyYXRv cj0oIGNvbnN0IFFTdHJpbmcgJnVybCApOwoKICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7Cgpwcm90 ZWN0ZWQgOgogICAgdm9pZCBuZXdDaGlsZHJlbiggY29uc3QgUVZhbHVlTGlzdDxRVXJsSW5mbz4g JiwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBmaW5pc2hlZCggUU5ldHdvcmtP cGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBzdGFydCggUU5ldHdvcmtPcGVyYXRpb24gKnJlcyAp OwogICAgdm9pZCBjcmVhdGVkRGlyZWN0b3J5KCBjb25zdCBRVXJsSW5mbyAmLCBRTmV0d29ya09w ZXJhdGlvbiAqcmVzICk7CiAgICB2b2lkIHJlbW92ZWQoIFFOZXR3b3JrT3BlcmF0aW9uICpyZXMg KTsKICAgIHZvaWQgaXRlbUNoYW5nZWQoIFFOZXR3b3JrT3BlcmF0aW9uICpyZXMgKTsKICAgIHZv aWQgZGF0YSggY29uc3QgUUJ5dGVBcnJheSAmLCBRTmV0d29ya09wZXJhdGlvbiAqcmVzICk7CiAg ICB2b2lkIGRhdGFUcmFuc2ZlclByb2dyZXNzKCBpbnQgYnl0ZXNEb25lLCBpbnQgYnl0ZXNUb3Rh bCwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBzdGFydGVkTmV4dENvcHkoIGNv bnN0IFFQdHJMaXN0PFFOZXR3b3JrT3BlcmF0aW9uPiAmbHN0ICk7CiAgICB2b2lkIGNvbm5lY3Rp b25TdGF0ZUNoYW5nZWQoIGludCBzdGF0ZSwgY29uc3QgUVN0cmluZyAmZGF0YSApOwoKcHJvdGVj dGVkOgogICAgdm9pZCByZXNldCgpOwogICAgYm9vbCBwYXJzZSggY29uc3QgUVN0cmluZyYgdXJs ICk7CiAgICB2aXJ0dWFsIGJvb2wgY2hlY2tWYWxpZCgpOwogICAgdmlydHVhbCB2b2lkIGNsZWFy RW50cmllcygpOwogICAgdm9pZCBnZXROZXR3b3JrUHJvdG9jb2woKTsKICAgIHZvaWQgZGVsZXRl TmV0d29ya1Byb3RvY29sKCk7Cgpwcml2YXRlICA6CiAgICBjb25zdCBRTmV0d29ya09wZXJhdGlv biAqc3RhcnRPcGVyYXRpb24oIFFOZXR3b3JrT3BlcmF0aW9uICpvcCApOwogICAgdm9pZCBjb3B5 R290RGF0YSggY29uc3QgUUJ5dGVBcnJheSAmZGF0YSwgUU5ldHdvcmtPcGVyYXRpb24gKm9wICk7 CiAgICB2b2lkIGNvbnRpbnVlQ29weSggUU5ldHdvcmtPcGVyYXRpb24gKm9wICk7CiAgICB2b2lk IGZpbmlzaGVkQ29weSgpOwogICAgdm9pZCBhZGRFbnRyeSggY29uc3QgUVZhbHVlTGlzdDxRVXJs SW5mbz4gJmkgKTsKICAgIHZvaWQgc2xvdEl0ZW1DaGFuZ2VkKCBRTmV0d29ya09wZXJhdGlvbiAq b3AgKTsKCnByaXZhdGU6CiAgICB2b2lkIGRlbGV0ZU9wZXJhdGlvbiggUU5ldHdvcmtPcGVyYXRp b24gKm9wICk7CgogICAgUVVybE9wZXJhdG9yUHJpdmF0ZSAqZDsKCn07CgoKCgojIDU3ICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcWZpbGVkaWFsb2cuaCIgMgoKCgoKCgpjbGFzcyAgIFFGaWxlSWNv blByb3ZpZGVyIDogcHVibGljIFFPYmplY3QKewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2Jq ZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZp cnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2Fz dCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCog KTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBx dF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBz dGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCop dGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAw ICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAw ICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IApwdWJsaWM6CiAgICBR RmlsZUljb25Qcm92aWRlciggUU9iamVjdCAqIHBhcmVudCA9IDAsIGNvbnN0IGNoYXIqIG5hbWUg PSAwICk7CiAgICB2aXJ0dWFsIGNvbnN0IFFQaXhtYXAgKiBwaXhtYXAoIGNvbnN0IFFGaWxlSW5m byAmICk7Cgpwcml2YXRlOgkgCgogICAgUUZpbGVJY29uUHJvdmlkZXIoIGNvbnN0IFFGaWxlSWNv blByb3ZpZGVyICYgKTsKICAgIFFGaWxlSWNvblByb3ZpZGVyJiBvcGVyYXRvcj0oIGNvbnN0IFFG aWxlSWNvblByb3ZpZGVyICYgKTsKCn07CgpjbGFzcyAgIFFGaWxlUHJldmlldwp7CnB1YmxpYzoK ICAgIFFGaWxlUHJldmlldygpOwogICAgdmlydHVhbCB2b2lkIHByZXZpZXdVcmwoIGNvbnN0IFFV cmwgJnVybCApID0gMDsKCn07CgpjbGFzcyAgIFFGaWxlRGlhbG9nIDogcHVibGljIFFEaWFsb2cK ewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyBy ZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1l KCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBi b29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGlu dCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJp YW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3Qq IHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0cigg Y29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCgg Y29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFP YmplY3QgKm1ldGFPYmo7IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAoKcHVibGljOgogICAgUUZpbGVE aWFsb2coIGNvbnN0IFFTdHJpbmcmIGRpck5hbWUsIGNvbnN0IFFTdHJpbmcmIGZpbHRlciA9IFFT dHJpbmc6Om51bGwsCgkJIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAsIGJv b2wgbW9kYWwgPSBGQUxTRSApOwogICAgUUZpbGVEaWFsb2coIFFXaWRnZXQqIHBhcmVudD0wLCBj b25zdCBjaGFyKiBuYW1lPTAsIGJvb2wgbW9kYWwgPSBGQUxTRSApOwogICAgflFGaWxlRGlhbG9n KCk7CgogICAgIAoKICAgIHN0YXRpYyBRU3RyaW5nIGdldE9wZW5GaWxlTmFtZSggY29uc3QgUVN0 cmluZyAmaW5pdGlhbGx5ID0gUVN0cmluZzo6bnVsbCwKCQkJCSAgICBjb25zdCBRU3RyaW5nICZm aWx0ZXIgPSBRU3RyaW5nOjpudWxsLAoJCQkJICAgIFFXaWRnZXQgKnBhcmVudCA9IDAsIGNvbnN0 IGNoYXIqIG5hbWUgPSAwLAoJCQkJICAgIGNvbnN0IFFTdHJpbmcgJmNhcHRpb24gPSBRU3RyaW5n OjpudWxsLAoJCQkJICAgIFFTdHJpbmcgKnNlbGVjdGVkRmlsdGVyID0gMCwKCQkJCSAgICBib29s IHJlc29sdmVTeW1saW5rcyA9IFRSVUUpOwogICAgc3RhdGljIFFTdHJpbmcgZ2V0U2F2ZUZpbGVO YW1lKCBjb25zdCBRU3RyaW5nICZpbml0aWFsbHkgPSBRU3RyaW5nOjpudWxsLAoJCQkJICAgIGNv bnN0IFFTdHJpbmcgJmZpbHRlciA9IFFTdHJpbmc6Om51bGwsCgkJCQkgICAgUVdpZGdldCAqcGFy ZW50ID0gMCwgY29uc3QgY2hhciogbmFtZSA9IDAsCgkJCQkgICAgY29uc3QgUVN0cmluZyAmY2Fw dGlvbiA9IFFTdHJpbmc6Om51bGwsCgkJCQkgICAgUVN0cmluZyAqc2VsZWN0ZWRGaWx0ZXIgPSAw LAoJCQkJICAgIGJvb2wgcmVzb2x2ZVN5bWxpbmtzID0gVFJVRSk7CiAgICBzdGF0aWMgUVN0cmlu ZyBnZXRFeGlzdGluZ0RpcmVjdG9yeSggY29uc3QgUVN0cmluZyAmZGlyID0gUVN0cmluZzo6bnVs bCwKCQkJCQkgUVdpZGdldCAqcGFyZW50ID0gMCwKCQkJCQkgY29uc3QgY2hhciogbmFtZSA9IDAs CgkJCQkJIGNvbnN0IFFTdHJpbmcgJmNhcHRpb24gPSBRU3RyaW5nOjpudWxsLAoJCQkJCSBib29s IGRpck9ubHkgPSBUUlVFLAoJCQkJCSBib29sIHJlc29sdmVTeW1saW5rcyA9IFRSVUUpOwogICAg c3RhdGljIFFTdHJpbmdMaXN0IGdldE9wZW5GaWxlTmFtZXMoIGNvbnN0IFFTdHJpbmcgJmZpbHRl cj0gUVN0cmluZzo6bnVsbCwKCQkJCQkgY29uc3QgUVN0cmluZyAmZGlyID0gUVN0cmluZzo6bnVs bCwKCQkJCQkgUVdpZGdldCAqcGFyZW50ID0gMCwKCQkJCQkgY29uc3QgY2hhciogbmFtZSA9IDAs CgkJCQkJIGNvbnN0IFFTdHJpbmcgJmNhcHRpb24gPSBRU3RyaW5nOjpudWxsLAoJCQkJCSBRU3Ry aW5nICpzZWxlY3RlZEZpbHRlciA9IDAsCgkJCQkJIGJvb2wgcmVzb2x2ZVN5bWxpbmtzID0gVFJV RSk7CgogICAgIAoKICAgIHN0YXRpYyB2b2lkIHNldEljb25Qcm92aWRlciggUUZpbGVJY29uUHJv dmlkZXIgKiApOwogICAgc3RhdGljIFFGaWxlSWNvblByb3ZpZGVyICogaWNvblByb3ZpZGVyKCk7 CgogICAgIAoKICAgIFFTdHJpbmcgc2VsZWN0ZWRGaWxlKCkgY29uc3Q7CiAgICBRU3RyaW5nIHNl bGVjdGVkRmlsdGVyKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2VsZWN0ZWRGaWx0ZXIo IGNvbnN0IFFTdHJpbmcmICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2VsZWN0ZWRGaWx0ZXIoIGlu dCApOwoKICAgIHZvaWQgc2V0U2VsZWN0aW9uKCBjb25zdCBRU3RyaW5nICYpOwoKICAgIHZvaWQg c2VsZWN0QWxsKCBib29sIGIgKTsKCiAgICBRU3RyaW5nTGlzdCBzZWxlY3RlZEZpbGVzKCkgY29u c3Q7CgogICAgUVN0cmluZyBkaXJQYXRoKCkgY29uc3Q7CgogICAgdm9pZCBzZXREaXIoIGNvbnN0 IFFEaXIgJiApOwogICAgY29uc3QgUURpciAqZGlyKCkgY29uc3Q7CgogICAgdm9pZCBzZXRTaG93 SGlkZGVuRmlsZXMoIGJvb2wgcyApOwogICAgYm9vbCBzaG93SGlkZGVuRmlsZXMoKSBjb25zdDsK CiAgICB2b2lkIHJlcmVhZERpcigpOwogICAgdm9pZCByZXNvcnREaXIoKTsKCiAgICBlbnVtIE1v ZGUgeyBBbnlGaWxlLCBFeGlzdGluZ0ZpbGUsIERpcmVjdG9yeSwgRXhpc3RpbmdGaWxlcywgRGly ZWN0b3J5T25seSB9OwogICAgdm9pZCBzZXRNb2RlKCBNb2RlICk7CiAgICBNb2RlIG1vZGUoKSBj b25zdDsKCiAgICBlbnVtIFZpZXdNb2RlIHsgRGV0YWlsLCBMaXN0IH07CiAgICBlbnVtIFByZXZp ZXdNb2RlIHsgTm9QcmV2aWV3LCBDb250ZW50cywgSW5mbyB9OwogICAgdm9pZCBzZXRWaWV3TW9k ZSggVmlld01vZGUgbSApOwogICAgVmlld01vZGUgdmlld01vZGUoKSBjb25zdDsKICAgIHZvaWQg c2V0UHJldmlld01vZGUoIFByZXZpZXdNb2RlIG0gKTsKICAgIFByZXZpZXdNb2RlIHByZXZpZXdN b2RlKCkgY29uc3Q7CgogICAgYm9vbCBldmVudEZpbHRlciggUU9iamVjdCAqLCBRRXZlbnQgKiAp OwoKICAgIGJvb2wgaXNJbmZvUHJldmlld0VuYWJsZWQoKSBjb25zdDsKICAgIGJvb2wgaXNDb250 ZW50c1ByZXZpZXdFbmFibGVkKCkgY29uc3Q7CiAgICB2b2lkIHNldEluZm9QcmV2aWV3RW5hYmxl ZCggYm9vbCApOwogICAgdm9pZCBzZXRDb250ZW50c1ByZXZpZXdFbmFibGVkKCBib29sICk7Cgog ICAgdm9pZCBzZXRJbmZvUHJldmlldyggUVdpZGdldCAqdywgUUZpbGVQcmV2aWV3ICpwcmV2aWV3 ICk7CiAgICB2b2lkIHNldENvbnRlbnRzUHJldmlldyggUVdpZGdldCAqdywgUUZpbGVQcmV2aWV3 ICpwcmV2aWV3ICk7CgogICAgUVVybCB1cmwoKSBjb25zdDsKCiAgICB2b2lkIGFkZEZpbHRlcigg Y29uc3QgUVN0cmluZyAmZmlsdGVyICk7CgpwdWJsaWMgIDoKICAgIHZvaWQgZG9uZSggaW50ICk7 CiAgICB2b2lkIHNldERpciggY29uc3QgUVN0cmluZyYgKTsKICAgIHZvaWQgc2V0VXJsKCBjb25z dCBRVXJsT3BlcmF0b3IgJnVybCApOwogICAgdm9pZCBzZXRGaWx0ZXIoIGNvbnN0IFFTdHJpbmcm ICk7CiAgICB2b2lkIHNldEZpbHRlcnMoIGNvbnN0IFFTdHJpbmcmICk7CiAgICB2b2lkIHNldEZp bHRlcnMoIGNvbnN0IGNoYXIgKiogKTsKICAgIHZvaWQgc2V0RmlsdGVycyggY29uc3QgUVN0cmlu Z0xpc3QmICk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIHJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQg KiApOwogICAgdm9pZCBrZXlQcmVzc0V2ZW50KCBRS2V5RXZlbnQgKiApOwoKICAgIHZvaWQgYWRk V2lkZ2V0cyggUUxhYmVsICosIFFXaWRnZXQgKiwgUVB1c2hCdXR0b24gKiApOwogICAgdm9pZCBh ZGRUb29sQnV0dG9uKCBRQnV0dG9uICpiLCBib29sIHNlcGFyYXRvciA9IEZBTFNFICk7CiAgICB2 b2lkIGFkZExlZnRXaWRnZXQoIFFXaWRnZXQgKncgKTsKICAgIHZvaWQgYWRkUmlnaHRXaWRnZXQo IFFXaWRnZXQgKncgKTsKCnByb3RlY3RlZCA6CiAgICB2b2lkIGZpbGVIaWdobGlnaHRlZCggY29u c3QgUVN0cmluZyYgKTsKICAgIHZvaWQgZmlsZVNlbGVjdGVkKCBjb25zdCBRU3RyaW5nJiApOwog ICAgdm9pZCBmaWxlc1NlbGVjdGVkKCBjb25zdCBRU3RyaW5nTGlzdCYgKTsKICAgIHZvaWQgZGly RW50ZXJlZCggY29uc3QgUVN0cmluZyYgKTsKICAgIHZvaWQgZmlsdGVyU2VsZWN0ZWQoIGNvbnN0 IFFTdHJpbmcmICk7Cgpwcml2YXRlICA6CiAgICB2b2lkIGRldGFpbFZpZXdTZWxlY3Rpb25DaGFu Z2VkKCk7CiAgICB2b2lkIGxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKCk7CiAgICB2b2lkIGNoYW5n ZU1vZGUoIGludCApOwogICAgdm9pZCBmaWxlTmFtZUVkaXRSZXR1cm5QcmVzc2VkKCk7CiAgICB2 b2lkIHN0b3BDb3B5KCk7CiAgICB2b2lkIHJlbW92ZVByb2dyZXNzRGlhKCk7CgogICAgdm9pZCBm aWxlU2VsZWN0ZWQoIGludCApOwogICAgdm9pZCBmaWxlSGlnaGxpZ2h0ZWQoIGludCApOwogICAg dm9pZCBkaXJTZWxlY3RlZCggaW50ICk7CiAgICB2b2lkIHBhdGhTZWxlY3RlZCggaW50ICk7Cgog ICAgdm9pZCB1cGRhdGVGaWxlTmFtZUVkaXQoIFFMaXN0Vmlld0l0ZW0gKik7CiAgICB2b2lkIHNl bGVjdERpcmVjdG9yeU9yRmlsZSggUUxpc3RWaWV3SXRlbSAqICk7CiAgICB2b2lkIHBvcHVwQ29u dGV4dE1lbnUoIFFMaXN0Vmlld0l0ZW0gKiwgY29uc3QgUVBvaW50ICYsIGludCApOwogICAgdm9p ZCBwb3B1cENvbnRleHRNZW51KCBRTGlzdEJveEl0ZW0gKiwgY29uc3QgUVBvaW50ICYgKTsKICAg IHZvaWQgdXBkYXRlRmlsZU5hbWVFZGl0KCBRTGlzdEJveEl0ZW0gKik7CiAgICB2b2lkIHNlbGVj dERpcmVjdG9yeU9yRmlsZSggUUxpc3RCb3hJdGVtICogKTsKICAgIHZvaWQgZmlsZU5hbWVFZGl0 RG9uZSgpOwoKICAgIHZvaWQgb2tDbGlja2VkKCk7CiAgICB2b2lkIGZpbHRlckNsaWNrZWQoKTsg IAogICAgdm9pZCBjYW5jZWxDbGlja2VkKCk7CgogICAgdm9pZCBjZFVwQ2xpY2tlZCgpOwogICAg dm9pZCBuZXdGb2xkZXJDbGlja2VkKCk7CgogICAgdm9pZCBmaXh1cE5hbWVFZGl0KCk7CgogICAg dm9pZCBkb01pbWVUeXBlTG9va3VwKCk7CgogICAgdm9pZCB1cGRhdGVHZW9tZXRyaWVzKCk7CiAg ICB2b2lkIG1vZGVCdXR0b25zRGVzdHJveWVkKCk7CiAgICB2b2lkIHVybFN0YXJ0KCBRTmV0d29y a09wZXJhdGlvbiAqb3AgKTsKICAgIHZvaWQgdXJsRmluaXNoZWQoIFFOZXR3b3JrT3BlcmF0aW9u ICpvcCApOwogICAgdm9pZCBkYXRhVHJhbnNmZXJQcm9ncmVzcyggaW50IGJ5dGVzRG9uZSwgaW50 IGJ5dGVzVG90YWwsIFFOZXR3b3JrT3BlcmF0aW9uICogKTsKICAgIHZvaWQgaW5zZXJ0RW50cnko IGNvbnN0IFFWYWx1ZUxpc3Q8UVVybEluZm8+ICZmaSwgUU5ldHdvcmtPcGVyYXRpb24gKm9wICk7 CiAgICB2b2lkIHJlbW92ZUVudHJ5KCBRTmV0d29ya09wZXJhdGlvbiAqICk7CiAgICB2b2lkIGNy ZWF0ZWREaXJlY3RvcnkoIGNvbnN0IFFVcmxJbmZvICZpbmZvLCBRTmV0d29ya09wZXJhdGlvbiAq ICk7CiAgICB2b2lkIGl0ZW1DaGFuZ2VkKCBRTmV0d29ya09wZXJhdGlvbiAqICk7CiAgICB2b2lk IGdvQmFjaygpOwoKcHJpdmF0ZToKICAgIGVudW0gUG9wdXBBY3Rpb24gewoJUEFfT3BlbiA9IDAs CglQQV9EZWxldGUsCglQQV9SZW5hbWUsCglQQV9Tb3J0TmFtZSwKCVBBX1NvcnRTaXplLAoJUEFf U29ydFR5cGUsCglQQV9Tb3J0RGF0ZSwKCVBBX1NvcnRVbnNvcnRlZCwKCVBBX0NhbmNlbCwKCVBB X1JlbG9hZCwKCVBBX0hpZGRlbgogICAgfTsKCiAgICB2b2lkIGluaXQoKTsKICAgIGJvb2wgdHJ5 U2V0U2VsZWN0aW9uKCBib29sIGlzRGlyLCBjb25zdCBRVXJsT3BlcmF0b3IgJiwgYm9vbCApOwog ICAgdm9pZCBkZWxldGVGaWxlKCBjb25zdCBRU3RyaW5nICZmaWxlbmFtZSApOwogICAgdm9pZCBw b3B1cENvbnRleHRNZW51KCBjb25zdCBRU3RyaW5nICZmaWxlbmFtZSwgYm9vbCB3aXRoU29ydCwK CQkJICAgUG9wdXBBY3Rpb24gJmFjdGlvbiwgY29uc3QgUVBvaW50ICZwICk7CgogICAgUURpciBy ZXNlcnZlZDsgIAogICAgUVN0cmluZyBmaWxlTmFtZTsKCiAgICBmcmllbmQgY2xhc3MgUUZpbGVE aWFsb2dRRmlsZUxpc3RWaWV3OwogICAgZnJpZW5kIGNsYXNzIFFGaWxlTGlzdEJveDsKCiAgICBR RmlsZURpYWxvZ1ByaXZhdGUgKmQ7CiAgICBRRmlsZURpYWxvZ1FGaWxlTGlzdFZpZXcgICpmaWxl czsKCiAgICBRTGluZUVkaXQgICpuYW1lRWRpdDsgIAogICAgUVB1c2hCdXR0b24gKm9rQjsKICAg IFFQdXNoQnV0dG9uICpjYW5jZWxCOwoKIyAzMTggIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZmls ZWRpYWxvZy5oIgoKIyAzMjcgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZmlsZWRpYWxvZy5oIgoK Cgpwcml2YXRlOgkgCgogICAgUUZpbGVEaWFsb2coIGNvbnN0IFFGaWxlRGlhbG9nICYgKTsKICAg IFFGaWxlRGlhbG9nICZvcGVyYXRvcj0oIGNvbnN0IFFGaWxlRGlhbG9nICYgKTsKCn07CgoKCgoj IDUgImNoYXJ0Zm9ybV9maWxlcy5jcHAiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fw YWludGVyLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd21hdHJpeC5oIiAxCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgICBRV01hdHJpeAkJ CQkJIAp7CnB1YmxpYzoKICAgIFFXTWF0cml4KCk7CiAgICBRV01hdHJpeCggZG91YmxlIG0xMSwg ZG91YmxlIG0xMiwgZG91YmxlIG0yMSwgZG91YmxlIG0yMiwKCSAgICAgIGRvdWJsZSBkeCwgZG91 YmxlIGR5ICk7CgogICAgdm9pZAlzZXRNYXRyaXgoIGRvdWJsZSBtMTEsIGRvdWJsZSBtMTIsIGRv dWJsZSBtMjEsIGRvdWJsZSBtMjIsCgkJCSAgIGRvdWJsZSBkeCwgIGRvdWJsZSBkeSApOwoKICAg IGRvdWJsZQltMTEoKSBjb25zdCB7IHJldHVybiBfbTExOyB9CiAgICBkb3VibGUJbTEyKCkgY29u c3QgeyByZXR1cm4gX20xMjsgfQogICAgZG91YmxlCW0yMSgpIGNvbnN0IHsgcmV0dXJuIF9tMjE7 IH0KICAgIGRvdWJsZQltMjIoKSBjb25zdCB7IHJldHVybiBfbTIyOyB9CiAgICBkb3VibGUJZHgo KSAgY29uc3QgeyByZXR1cm4gX2R4OyB9CiAgICBkb3VibGUJZHkoKSAgY29uc3QgeyByZXR1cm4g X2R5OyB9CgogICAgdm9pZAltYXAoIGludCB4LCBpbnQgeSwgaW50ICp0eCwgaW50ICp0eSApCSAg ICAgIGNvbnN0OwogICAgdm9pZAltYXAoIGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlICp0eCwg ZG91YmxlICp0eSApIGNvbnN0OwogICAgUVJlY3QJbWFwUmVjdCggY29uc3QgUVJlY3QgJiApCWNv bnN0OwoKICAgIFFQb2ludAltYXAoIGNvbnN0IFFQb2ludCAmcCApCWNvbnN0IHsgcmV0dXJuIG9w ZXJhdG9yICooIHAgKTsgfQogICAgUVJlY3QJbWFwKCBjb25zdCBRUmVjdCAmciApCWNvbnN0IHsg cmV0dXJuIG1hcFJlY3QgKCByICk7IH0KICAgIFFQb2ludEFycmF5IG1hcCggY29uc3QgUVBvaW50 QXJyYXkgJmEgKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciAqICggYSApOyB9CgogICAgdm9pZAly ZXNldCgpOwogICAgYm9vbAlpc0lkZW50aXR5KCkgY29uc3Q7CgogICAgUVdNYXRyaXggICAmdHJh bnNsYXRlKCBkb3VibGUgZHgsIGRvdWJsZSBkeSApOwogICAgUVdNYXRyaXggICAmc2NhbGUoIGRv dWJsZSBzeCwgZG91YmxlIHN5ICk7CiAgICBRV01hdHJpeCAgICZzaGVhciggZG91YmxlIHNoLCBk b3VibGUgc3YgKTsKICAgIFFXTWF0cml4ICAgJnJvdGF0ZSggZG91YmxlIGEgKTsKCiAgICBib29s IGlzSW52ZXJ0aWJsZSgpIGNvbnN0IHsgcmV0dXJuIChfbTExKl9tMjIgLSBfbTEyKl9tMjEpICE9 IDA7IH0KICAgIFFXTWF0cml4CWludmVydCggYm9vbCAqID0gMCApIGNvbnN0OwoKICAgIGJvb2wJ b3BlcmF0b3I9PSggY29uc3QgUVdNYXRyaXggJiApIGNvbnN0OwogICAgYm9vbAlvcGVyYXRvciE9 KCBjb25zdCBRV01hdHJpeCAmICkgY29uc3Q7CiAgICBRV01hdHJpeCAgICZvcGVyYXRvcio9KCBj b25zdCBRV01hdHJpeCAmICk7CgogICAgIAogICAgUVBvaW50IG9wZXJhdG9yICogKGNvbnN0IFFQ b2ludCAmICkgY29uc3Q7CiAgICBRUmVnaW9uIG9wZXJhdG9yICogKGNvbnN0IFFSZWN0ICYgKSBj b25zdDsKICAgIFFSZWdpb24gb3BlcmF0b3IgKiAoY29uc3QgUVJlZ2lvbiAmICkgY29uc3Q7CiAg ICBRUG9pbnRBcnJheSBvcGVyYXRvciAqICAoIGNvbnN0IFFQb2ludEFycmF5ICZhICkgY29uc3Q7 CiAgICAKcHJpdmF0ZToKICAgIFFXTWF0cml4ICAgJmJtdWwoIGNvbnN0IFFXTWF0cml4ICYgKTsK ICAgIGRvdWJsZQlfbTExLCBfbTEyOwogICAgZG91YmxlCV9tMjEsIF9tMjI7CiAgICBkb3VibGUJ X2R4LCAgX2R5Owp9OwoKCiAgUVdNYXRyaXggb3BlcmF0b3IqKCBjb25zdCBRV01hdHJpeCAmLCBj b25zdCBRV01hdHJpeCAmICk7CgoKIAoKCgogIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0 YVN0cmVhbSAmLCBjb25zdCBRV01hdHJpeCAmICk7CiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4o IFFEYXRhU3RyZWFtICYsIFFXTWF0cml4ICYgKTsKCgoKCgojIDUwICIvdXNyL2xvY2FsL3F0L2lu Y2x1ZGUvcXBhaW50ZXIuaCIgMgoKCgpjbGFzcyBRR2Z4OwpjbGFzcyBRVGV4dENvZGVjOwpjbGFz cyBRVGV4dFBhcmFnOwpjbGFzcyBRUGFpbnREZXZpY2U7CgoKCmNsYXNzIFFQYWludGVyUHJpdmF0 ZTsKCmNsYXNzICAgUVBhaW50ZXIgOiBwdWJsaWMgUXQKewpwdWJsaWM6CiAgICBlbnVtIENvb3Jk aW5hdGVNb2RlIHsgQ29vcmREZXZpY2UsIENvb3JkUGFpbnRlciB9OwoKICAgIFFQYWludGVyKCk7 CiAgICBRUGFpbnRlciggY29uc3QgUVBhaW50RGV2aWNlICosIGJvb2wgdW5jbGlwcGVkID0gRkFM U0UgKTsKICAgIFFQYWludGVyKCBjb25zdCBRUGFpbnREZXZpY2UgKiwgY29uc3QgUVdpZGdldCAq LCBib29sIHVuY2xpcHBlZCA9IEZBTFNFICk7CiAgIH5RUGFpbnRlcigpOwoKICAgIGJvb2wJYmVn aW4oIGNvbnN0IFFQYWludERldmljZSAqLCBib29sIHVuY2xpcHBlZCA9IEZBTFNFICk7CiAgICBi b29sCWJlZ2luKCBjb25zdCBRUGFpbnREZXZpY2UgKiwgY29uc3QgUVdpZGdldCAqLCBib29sIHVu Y2xpcHBlZCA9IEZBTFNFICk7CiAgICBib29sCWVuZCgpOwogICAgUVBhaW50RGV2aWNlICpkZXZp Y2UoKSBjb25zdDsKCgoKCgogICAgc3RhdGljIHZvaWQgcmVkaXJlY3QoIFFQYWludERldmljZSAq cGRldiwgUVBhaW50RGV2aWNlICpyZXBsYWNlbWVudCApOwoKICAgIGJvb2wJaXNBY3RpdmUoKSBj b25zdDsKCiAgICB2b2lkCWZsdXNoKCBjb25zdCBRUmVnaW9uICZyZWdpb24sIENvb3JkaW5hdGVN b2RlIGNtID0gQ29vcmREZXZpY2UgKTsKICAgIHZvaWQJZmx1c2goKTsKICAgIHZvaWQJc2F2ZSgp OwogICAgdm9pZAlyZXN0b3JlKCk7CgogICAKCiAgICBRRm9udE1ldHJpY3MgZm9udE1ldHJpY3Mo KQljb25zdDsKICAgIFFGb250SW5mbwkgZm9udEluZm8oKQljb25zdDsKCiAgICBjb25zdCBRRm9u dCAmZm9udCgpCQljb25zdDsKICAgIHZvaWQJc2V0Rm9udCggY29uc3QgUUZvbnQgJiApOwogICAg Y29uc3QgUVBlbiAmcGVuKCkJCWNvbnN0OwogICAgdm9pZAlzZXRQZW4oIGNvbnN0IFFQZW4gJiAp OwogICAgdm9pZAlzZXRQZW4oIFBlblN0eWxlICk7CiAgICB2b2lkCXNldFBlbiggY29uc3QgUUNv bG9yICYgKTsKICAgIGNvbnN0IFFCcnVzaCAmYnJ1c2goKQljb25zdDsKICAgIHZvaWQJc2V0QnJ1 c2goIGNvbnN0IFFCcnVzaCAmICk7CiAgICB2b2lkCXNldEJydXNoKCBCcnVzaFN0eWxlICk7CiAg ICB2b2lkCXNldEJydXNoKCBjb25zdCBRQ29sb3IgJiApOwogICAgUVBvaW50CXBvcygpIGNvbnN0 OwoKICAgCgogICAgY29uc3QgUUNvbG9yICZiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKICAgIHZv aWQJc2V0QmFja2dyb3VuZENvbG9yKCBjb25zdCBRQ29sb3IgJiApOwogICAgQkdNb2RlCWJhY2tn cm91bmRNb2RlKCkgY29uc3Q7CiAgICB2b2lkCXNldEJhY2tncm91bmRNb2RlKCBCR01vZGUgKTsK ICAgIFJhc3Rlck9wCXJhc3Rlck9wKCkJY29uc3Q7CiAgICB2b2lkCXNldFJhc3Rlck9wKCBSYXN0 ZXJPcCApOwogICAgY29uc3QgUVBvaW50ICZicnVzaE9yaWdpbigpIGNvbnN0OwogICAgdm9pZAlz ZXRCcnVzaE9yaWdpbiggaW50IHgsIGludCB5ICk7CiAgICB2b2lkCXNldEJydXNoT3JpZ2luKCBj b25zdCBRUG9pbnQgJiApOwoKICAgCgogCiAKCiAgICBib29sCWhhc1ZpZXdYRm9ybSgpIGNvbnN0 OwogICAgYm9vbAloYXNXb3JsZFhGb3JtKCkgY29uc3Q7CgoKICAgIHZvaWQJc2V0Vmlld1hGb3Jt KCBib29sICk7CQkgCiAgICBRUmVjdAl3aW5kb3coKSAgICAgICBjb25zdDsJCSAKICAgIHZvaWQJ c2V0V2luZG93KCBjb25zdCBRUmVjdCAmICk7CSAKICAgIHZvaWQJc2V0V2luZG93KCBpbnQgeCwg aW50IHksIGludCB3LCBpbnQgaCApOwogICAgUVJlY3QJdmlld3BvcnQoKSAgIGNvbnN0OwkJIAog ICAgdm9pZAlzZXRWaWV3cG9ydCggY29uc3QgUVJlY3QgJiApOwkgCiAgICB2b2lkCXNldFZpZXdw b3J0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCApOwoKICAgIHZvaWQJc2V0V29ybGRYRm9y bSggYm9vbCApOwkJIAogICAgY29uc3QgUVdNYXRyaXggJndvcmxkTWF0cml4KCkgY29uc3Q7CSAK ICAgIHZvaWQJc2V0V29ybGRNYXRyaXgoIGNvbnN0IFFXTWF0cml4ICYsIGJvb2wgY29tYmluZT1G QUxTRSApOwoKICAgIHZvaWQJc2F2ZVdvcmxkTWF0cml4KCk7CiAgICB2b2lkCXJlc3RvcmVXb3Js ZE1hdHJpeCgpOwoKICAgIHZvaWQJc2NhbGUoIGRvdWJsZSBzeCwgZG91YmxlIHN5ICk7CiAgICB2 b2lkCXNoZWFyKCBkb3VibGUgc2gsIGRvdWJsZSBzdiApOwogICAgdm9pZAlyb3RhdGUoIGRvdWJs ZSBhICk7CgogICAgdm9pZAl0cmFuc2xhdGUoIGRvdWJsZSBkeCwgZG91YmxlIGR5ICk7CiAgICB2 b2lkCXJlc2V0WEZvcm0oKTsKICAgIGRvdWJsZQl0cmFuc2xhdGlvblgoKSBjb25zdDsKICAgIGRv dWJsZQl0cmFuc2xhdGlvblkoKSBjb25zdDsKCiAgICBRUG9pbnQJeEZvcm0oIGNvbnN0IFFQb2lu dCAmICkgY29uc3Q7CSAKICAgIFFSZWN0CXhGb3JtKCBjb25zdCBRUmVjdCAmICkJY29uc3Q7CiAg ICBRUG9pbnRBcnJheSB4Rm9ybSggY29uc3QgUVBvaW50QXJyYXkgJiApIGNvbnN0OwogICAgUVBv aW50QXJyYXkgeEZvcm0oIGNvbnN0IFFQb2ludEFycmF5ICYsIGludCBpbmRleCwgaW50IG5wb2lu dHMgKSBjb25zdDsKICAgIFFQb2ludAl4Rm9ybURldiggY29uc3QgUVBvaW50ICYgKSBjb25zdDsg IAogICAgUVJlY3QJeEZvcm1EZXYoIGNvbnN0IFFSZWN0ICYgKSAgY29uc3Q7CiAgICBRUG9pbnRB cnJheSB4Rm9ybURldiggY29uc3QgUVBvaW50QXJyYXkgJiApIGNvbnN0OwogICAgUVBvaW50QXJy YXkgeEZvcm1EZXYoIGNvbnN0IFFQb2ludEFycmF5ICYsIGludCBpbmRleCwgaW50IG5wb2ludHMg KSBjb25zdDsKCiAgIAoKICAgIHZvaWQJc2V0Q2xpcHBpbmcoIGJvb2wgKTsJCSAKICAgIGJvb2wJ aGFzQ2xpcHBpbmcoKSBjb25zdDsKICAgIFFSZWdpb24gY2xpcFJlZ2lvbiggQ29vcmRpbmF0ZU1v ZGUgPSBDb29yZERldmljZSApIGNvbnN0OwogICAgdm9pZAlzZXRDbGlwUmVjdCggY29uc3QgUVJl Y3QgJiwgQ29vcmRpbmF0ZU1vZGUgPSBDb29yZERldmljZSApOwkgCiAgICB2b2lkCXNldENsaXBS ZWN0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29vcmRpbmF0ZU1vZGUgPSBDb29yZERl dmljZSApOwogICAgdm9pZAlzZXRDbGlwUmVnaW9uKCBjb25zdCBRUmVnaW9uICYsIENvb3JkaW5h dGVNb2RlID0gQ29vcmREZXZpY2UgKTsgCgogICAKCiAgICB2b2lkCWRyYXdQb2ludCggaW50IHgs IGludCB5ICk7CiAgICB2b2lkCWRyYXdQb2ludCggY29uc3QgUVBvaW50ICYgKTsKICAgIHZvaWQJ ZHJhd1BvaW50cyggY29uc3QgUVBvaW50QXJyYXkmIGEsCgkJCSAgICBpbnQgaW5kZXg9MCwgaW50 IG5wb2ludHM9LTEgKTsKICAgIHZvaWQJbW92ZVRvKCBpbnQgeCwgaW50IHkgKTsKICAgIHZvaWQJ bW92ZVRvKCBjb25zdCBRUG9pbnQgJiApOwogICAgdm9pZAlsaW5lVG8oIGludCB4LCBpbnQgeSAp OwogICAgdm9pZAlsaW5lVG8oIGNvbnN0IFFQb2ludCAmICk7CiAgICB2b2lkCWRyYXdMaW5lKCBp bnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIgKTsKICAgIHZvaWQJZHJhd0xpbmUoIGNvbnN0 IFFQb2ludCAmLCBjb25zdCBRUG9pbnQgJiApOwogICAgdm9pZAlkcmF3UmVjdCggaW50IHgsIGlu dCB5LCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJZHJhd1JlY3QoIGNvbnN0IFFSZWN0ICYgKTsK ICAgIHZvaWQJZHJhd1dpbkZvY3VzUmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGggKTsK ICAgIHZvaWQJZHJhd1dpbkZvY3VzUmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCgkJ CQkgIGNvbnN0IFFDb2xvciAmYmdDb2xvciApOwogICAgdm9pZAlkcmF3V2luRm9jdXNSZWN0KCBj b25zdCBRUmVjdCAmICk7CiAgICB2b2lkCWRyYXdXaW5Gb2N1c1JlY3QoIGNvbnN0IFFSZWN0ICYs CgkJCQkgIGNvbnN0IFFDb2xvciAmYmdDb2xvciApOwogICAgdm9pZAlkcmF3Um91bmRSZWN0KCBp bnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50ID0gMjUsIGludCA9IDI1ICk7CiAgICB2b2lk CWRyYXdSb3VuZFJlY3QoIGNvbnN0IFFSZWN0ICYsIGludCA9IDI1LCBpbnQgPSAyNSApOwogICAg dm9pZAlkcmF3RWxsaXBzZSggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJ ZHJhd0VsbGlwc2UoIGNvbnN0IFFSZWN0ICYgKTsKICAgIHZvaWQJZHJhd0FyYyggaW50IHgsIGlu dCB5LCBpbnQgdywgaW50IGgsIGludCBhLCBpbnQgYWxlbiApOwogICAgdm9pZAlkcmF3QXJjKCBj b25zdCBRUmVjdCAmLCBpbnQgYSwgaW50IGFsZW4gKTsKICAgIHZvaWQJZHJhd1BpZSggaW50IHgs IGludCB5LCBpbnQgdywgaW50IGgsIGludCBhLCBpbnQgYWxlbiApOwogICAgdm9pZAlkcmF3UGll KCBjb25zdCBRUmVjdCAmLCBpbnQgYSwgaW50IGFsZW4gKTsKICAgIHZvaWQJZHJhd0Nob3JkKCBp bnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGEsIGludCBhbGVuICk7CiAgICB2b2lkCWRy YXdDaG9yZCggY29uc3QgUVJlY3QgJiwgaW50IGEsIGludCBhbGVuICk7CiAgICB2b2lkCWRyYXdM aW5lU2VnbWVudHMoIGNvbnN0IFFQb2ludEFycmF5ICYsCgkJCQkgIGludCBpbmRleD0wLCBpbnQg bmxpbmVzPS0xICk7CiAgICB2b2lkCWRyYXdQb2x5bGluZSggY29uc3QgUVBvaW50QXJyYXkgJiwK CQkJICAgICAgaW50IGluZGV4PTAsIGludCBucG9pbnRzPS0xICk7CiAgICB2b2lkCWRyYXdQb2x5 Z29uKCBjb25zdCBRUG9pbnRBcnJheSAmLCBib29sIHdpbmRpbmc9RkFMU0UsCgkJCSAgICAgaW50 IGluZGV4PTAsIGludCBucG9pbnRzPS0xICk7CiAgICB2b2lkCWRyYXdDb252ZXhQb2x5Z29uKCBj b25zdCBRUG9pbnRBcnJheSAmLAoJCQkgICAgIGludCBpbmRleD0wLCBpbnQgbnBvaW50cz0tMSAp OwoKICAgIHZvaWQJZHJhd0N1YmljQmV6aWVyKCBjb25zdCBRUG9pbnRBcnJheSAmLCBpbnQgaW5k ZXg9MCApOwoKICAgIHZvaWQJZHJhd1BpeG1hcCggaW50IHgsIGludCB5LCBjb25zdCBRUGl4bWFw ICYsCgkJCSAgICBpbnQgc3g9MCwgaW50IHN5PTAsIGludCBzdz0tMSwgaW50IHNoPS0xICk7CiAg ICB2b2lkCWRyYXdQaXhtYXAoIGNvbnN0IFFQb2ludCAmLCBjb25zdCBRUGl4bWFwICYsCgkJCSAg ICBjb25zdCBRUmVjdCAmc3IgKTsKICAgIHZvaWQJZHJhd1BpeG1hcCggY29uc3QgUVBvaW50ICYs IGNvbnN0IFFQaXhtYXAgJiApOwogICAgdm9pZAlkcmF3UGl4bWFwKCBjb25zdCBRUmVjdCAmLCBj b25zdCBRUGl4bWFwICYgKTsKICAgIHZvaWQJZHJhd0ltYWdlKCBpbnQgeCwgaW50IHksIGNvbnN0 IFFJbWFnZSAmLAoJCQkgICBpbnQgc3ggPSAwLCBpbnQgc3kgPSAwLCBpbnQgc3cgPSAtMSwgaW50 IHNoID0gLTEsCgkJCSAgIGludCBjb252ZXJzaW9uRmxhZ3MgPSAwICk7CiAgICB2b2lkCWRyYXdJ bWFnZSggY29uc3QgUVBvaW50ICYsIGNvbnN0IFFJbWFnZSAmLAoJCQkgICBjb25zdCBRUmVjdCAm c3IsIGludCBjb252ZXJzaW9uRmxhZ3MgPSAwICk7CiAgICB2b2lkCWRyYXdJbWFnZSggY29uc3Qg UVBvaW50ICYsIGNvbnN0IFFJbWFnZSAmLAoJCQkgICBpbnQgY29udmVyc2lvbl9mbGFncyA9IDAg KTsKICAgIHZvaWQJZHJhd0ltYWdlKCBjb25zdCBRUmVjdCAmLCBjb25zdCBRSW1hZ2UgJiApOwog ICAgdm9pZAlkcmF3VGlsZWRQaXhtYXAoIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBjb25z dCBRUGl4bWFwICYsCgkJCQkgaW50IHN4PTAsIGludCBzeT0wICk7CiAgICB2b2lkCWRyYXdUaWxl ZFBpeG1hcCggY29uc3QgUVJlY3QgJiwgY29uc3QgUVBpeG1hcCAmLAoJCQkJIGNvbnN0IFFQb2lu dCAmICk7CiAgICB2b2lkCWRyYXdUaWxlZFBpeG1hcCggY29uc3QgUVJlY3QgJiwgY29uc3QgUVBp eG1hcCAmICk7CgogICAgdm9pZAlkcmF3UGljdHVyZSggY29uc3QgUVBpY3R1cmUgJiApOwogICAg dm9pZAlkcmF3UGljdHVyZSggaW50IHgsIGludCB5LCBjb25zdCBRUGljdHVyZSAmICk7CiAgICB2 b2lkCWRyYXdQaWN0dXJlKCBjb25zdCBRUG9pbnQgJiwgY29uc3QgUVBpY3R1cmUgJiApOwoKCiAg ICB2b2lkCWZpbGxSZWN0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgY29uc3QgUUJydXNo ICYgKTsKICAgIHZvaWQJZmlsbFJlY3QoIGNvbnN0IFFSZWN0ICYsIGNvbnN0IFFCcnVzaCAmICk7 CiAgICB2b2lkCWVyYXNlUmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGggKTsKICAgIHZv aWQJZXJhc2VSZWN0KCBjb25zdCBRUmVjdCAmICk7CgogICAKCiAgICBlbnVtIFRleHREaXJlY3Rp b24gewoJQXV0bywKCVJUTCwKCUxUUgogICAgfTsKCiAgICB2b2lkCWRyYXdUZXh0KCBpbnQgeCwg aW50IHksIGNvbnN0IFFTdHJpbmcgJiwgaW50IGxlbiA9IC0xLCBUZXh0RGlyZWN0aW9uIGRpciA9 IEF1dG8gKTsKICAgIHZvaWQJZHJhd1RleHQoIGNvbnN0IFFQb2ludCAmLCBjb25zdCBRU3RyaW5n ICYsIGludCBsZW4gPSAtMSwgVGV4dERpcmVjdGlvbiBkaXIgPSBBdXRvICk7CgogICAgdm9pZCAg ICAgZHJhd1RleHQoIGludCB4LCBpbnQgeSwgY29uc3QgUVN0cmluZyAmLCBpbnQgcG9zLCBpbnQg bGVuLCBUZXh0RGlyZWN0aW9uIGRpciA9IEF1dG8gKTsKICAgIHZvaWQgICAgIGRyYXdUZXh0KCBj b25zdCBRUG9pbnQgJnAsIGNvbnN0IFFTdHJpbmcgJiwgaW50IHBvcywgaW50IGxlbiwgVGV4dERp cmVjdGlvbiBkaXIgPSBBdXRvICk7CgogICAgdm9pZAlkcmF3VGV4dCggaW50IHgsIGludCB5LCBp bnQgdywgaW50IGgsIGludCBmbGFncywKCQkJICBjb25zdCBRU3RyaW5nJiwgaW50IGxlbiA9IC0x LCBRUmVjdCAqYnI9MCwKCQkJICBRVGV4dFBhcmFnICoqaW50ZXJuPTAgKTsKICAgIHZvaWQJZHJh d1RleHQoIGNvbnN0IFFSZWN0ICYsIGludCBmbGFncywKCQkJICBjb25zdCBRU3RyaW5nJiwgaW50 IGxlbiA9IC0xLCBRUmVjdCAqYnI9MCwKCQkJICBRVGV4dFBhcmFnICoqaW50ZXJuPTAgKTsKCiAg ICAgCgogICAKCiAgICBRUmVjdAlib3VuZGluZ1JlY3QoIGludCB4LCBpbnQgeSwgaW50IHcsIGlu dCBoLCBpbnQgZmxhZ3MsCgkJCSAgICAgIGNvbnN0IFFTdHJpbmcmLCBpbnQgbGVuID0gLTEsIFFU ZXh0UGFyYWcgKippbnRlcm49MCApOwogICAgUVJlY3QJYm91bmRpbmdSZWN0KCBjb25zdCBRUmVj dCAmLCBpbnQgZmxhZ3MsCgkJCSAgICAgIGNvbnN0IFFTdHJpbmcmLCBpbnQgbGVuID0gLTEsIFFU ZXh0UGFyYWcgKippbnRlcm49MCApOwoKICAgIGludAkJdGFiU3RvcHMoKSBjb25zdDsKICAgIHZv aWQJc2V0VGFiU3RvcHMoIGludCApOwogICAgaW50CSAgICAgICAqdGFiQXJyYXkoKSBjb25zdDsK ICAgIHZvaWQJc2V0VGFiQXJyYXkoIGludCAqICk7CgogICAgIAoKCgoKICAgIEhBTkRMRQloYW5k bGUoKSBjb25zdDsKCgoKICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKTsKICAgIHN0YXRpYyB2 b2lkIGNsZWFudXAoKTsKCnByaXZhdGU6CiAgICB2b2lkCWluaXQoKTsKICAgIHZvaWQgICAgICAg IGRlc3Ryb3koKTsKICAgIHZvaWQJdXBkYXRlRm9udCgpOwogICAgdm9pZAl1cGRhdGVQZW4oKTsK ICAgIHZvaWQJdXBkYXRlQnJ1c2goKTsKCiAgICB2b2lkCXVwZGF0ZVhGb3JtKCk7CiAgICB2b2lk CXVwZGF0ZUludlhGb3JtKCk7CgogICAgdm9pZAltYXAoIGludCwgaW50LCBpbnQgKnJ4LCBpbnQg KnJ5ICkgY29uc3Q7CiAgICB2b2lkCW1hcCggaW50LCBpbnQsIGludCwgaW50LCBpbnQgKiwgaW50 ICosIGludCAqLCBpbnQgKiApIGNvbnN0OwogICAgdm9pZAltYXBJbnYoIGludCwgaW50LCBpbnQg KiwgaW50ICogKSBjb25zdDsKICAgIHZvaWQJbWFwSW52KCBpbnQsIGludCwgaW50LCBpbnQsIGlu dCAqLCBpbnQgKiwgaW50ICosIGludCAqICkgY29uc3Q7CiAgICB2b2lkCWRyYXdQb2x5SW50ZXJu YWwoIGNvbnN0IFFQb2ludEFycmF5ICYsIGJvb2wgY2xvc2U9VFJVRSApOwogICAgdm9pZAlkcmF3 V2luRm9jdXNSZWN0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgYm9vbCB4b3JQYWludCwK CQkJCSAgY29uc3QgUUNvbG9yICZwZW5Db2xvciApOwoKICAgIGVudW0geyBJc0FjdGl2ZT0weDAx LCBFeHREZXY9MHgwMiwgSXNTdGFydGluZ1VwPTB4MDQsIE5vQ2FjaGU9MHgwOCwKCSAgIFZ4Rj0w eDEwLCBXeEY9MHgyMCwgQ2xpcE9uPTB4NDAsIFNhZmVQb2x5Z29uPTB4ODAsIE1vbm9EZXY9MHgx MDAsCgkgICBEaXJ0eUZvbnQ9MHgyMDAsIERpcnR5UGVuPTB4NDAwLCBEaXJ0eUJydXNoPTB4ODAw LAoJICAgUkdCQ29sb3I9MHgxMDAwLCBGb250TWV0PTB4MjAwMCwgRm9udEluZj0weDQwMDAsIEN0 b3JCZWdpbj0weDgwMDAsCiAgICAgICAgICAgVXNlUHJpdmF0ZUN4ID0gMHgxMDAwMCwgVm9sYXRp bGVEQyA9IDB4MjAwMDAsIFF0MkNvbXBhdCA9IDB4NDAwMDAgfTsKICAgIHVpbnQJZmxhZ3M7CiAg ICBib29sCXRlc3RmKCB1aW50IGIgKSBjb25zdCB7IHJldHVybiAoZmxhZ3MmYikhPTA7IH0KICAg IHZvaWQJc2V0ZiggdWludCBiICkJeyBmbGFncyB8PSBiOyB9CiAgICB2b2lkCXNldGYoIHVpbnQg YiwgYm9vbCB2ICk7CiAgICB2b2lkCWNsZWFyZiggdWludCBiICkJeyBmbGFncyAmPSAodWludCko fmIpOyB9CiAgICB2b2lkCWZpeF9uZWdfcmVjdCggaW50ICp4LCBpbnQgKnksIGludCAqdywgaW50 ICpoICk7CgogICAgUVBhaW50ZXJQcml2YXRlICpkOwogICAgUVBhaW50RGV2aWNlICpwZGV2Owog ICAgUUNvbG9yCWJnX2NvbDsKICAgIHVjaGFyCWJnX21vZGU7CiAgICB1Y2hhcglyb3A7CiAgICB1 Y2hhcglwdTsKICAgIFFQb2ludAlicm87CiAgICBRRm9udAljZm9udDsKICAgIFFGb250ICpwZm9u dDsgCSAKICAgIFFQZW4JY3BlbjsKICAgIFFCcnVzaAljYnJ1c2g7CiAgICBRUmVnaW9uCWNyZ247 CiAgICBpbnQJCXRhYnN0b3BzOwogICAgaW50CSAgICAgICAqdGFiYXJyYXk7CiAgICBpbnQJCXRh YmFycmF5bGVuOwogICAgYm9vbAlibG9ja19leHQ7CSAKCiAgICAgCgogICAgUUNPT1JECXd4LCB3 eSwgd3csIHdoOwogICAgUUNPT1JECXZ4LCB2eSwgdncsIHZoOwogICAgUVdNYXRyaXgJd3htYXQ7 CgogICAgIAogICAgUVdNYXRyaXgJeG1hdDsKICAgIFFXTWF0cml4CWl4bWF0OwoKCgogICAgZG91 YmxlCW0xMSgpIGNvbnN0IHsgcmV0dXJuIHhtYXQubTExKCk7IH0KICAgIGRvdWJsZSAgICAgIG0x MigpIGNvbnN0IHsgcmV0dXJuIHhtYXQubTEyKCk7IH0KICAgIGRvdWJsZSAgICAgIG0yMSgpIGNv bnN0IHsgcmV0dXJuIHhtYXQubTIxKCk7IH0KICAgIGRvdWJsZSAgICAgIG0yMigpIGNvbnN0IHsg cmV0dXJuIHhtYXQubTIyKCk7IH0KICAgIGRvdWJsZSAgICAgIGR4KCkgY29uc3QgeyByZXR1cm4g eG1hdC5keCgpOyB9CiAgICBkb3VibGUgICAgICBkeSgpIGNvbnN0IHsgcmV0dXJuIHhtYXQuZHko KTsgfQogICAgZG91YmxlCWltMTEoKSBjb25zdCB7IHJldHVybiBpeG1hdC5tMTEoKTsgfQogICAg ZG91YmxlICAgICAgaW0xMigpIGNvbnN0IHsgcmV0dXJuIGl4bWF0Lm0xMigpOyB9CiAgICBkb3Vi bGUgICAgICBpbTIxKCkgY29uc3QgeyByZXR1cm4gaXhtYXQubTIxKCk7IH0KICAgIGRvdWJsZSAg ICAgIGltMjIoKSBjb25zdCB7IHJldHVybiBpeG1hdC5tMjIoKTsgfQogICAgZG91YmxlICAgICAg aWR4KCkgY29uc3QgeyByZXR1cm4gaXhtYXQuZHgoKTsgfQogICAgZG91YmxlICAgICAgaWR5KCkg Y29uc3QgeyByZXR1cm4gaXhtYXQuZHkoKTsgfQoKICAgIGludAkJdHhvcDsKICAgIGJvb2wJdHhp bnY7CgoKCgoKCgogICAgdm9pZCAgICAgICAqcGVuUmVmOwkJCQkgCiAgICB2b2lkICAgICAgICpi cnVzaFJlZjsJCQkgCiAgICB2b2lkICAgICAgICpwc19zdGFjazsKICAgIHZvaWQgICAgICAgKndt X3N0YWNrOwogICAgdm9pZAlraWxsUFN0YWNrKCk7Cgpwcm90ZWN0ZWQ6CgoKCgoKCiAgICBEaXNw bGF5ICAgICpkcHk7CQkJCSAKICAgIGludAkJc2NybjsJCQkJIAogICAgUXQ6OkhBTkRMRQloZDsJ CQkJIAogICAgUXQ6OkhBTkRMRSAgcmVuZGhkOwkJCQkgCiAgICBHQwkJZ2M7CQkJCSAKICAgIEdD CQlnY19icnVzaDsJCQkgCiAgICBRUG9pbnQJY3VyUHQ7CQkJCSAKICAgIHVpbnQJY2xpcF9zZXJp YWw7CQkJIAoKCgoKCiAgICBmcmllbmQgY2xhc3MgUUZvbnRNZXRyaWNzOwogICAgZnJpZW5kIGNs YXNzIFFGb250SW5mbzsKICAgIGZyaWVuZCB2b2lkIHF0X2Zvcm1hdF90ZXh0KCBjb25zdCBRRm9u dCAmLCBjb25zdCBRUmVjdCAmciwKCQkgICAgIGludCB0ZiwgY29uc3QgUVN0cmluZyYgc3RyLCBp bnQgbGVuLCBRUmVjdCAqYnJlY3QsCgkJICAgICBpbnQgdGFic3RvcHMsIGludCogdGFiYXJyYXks IGludCB0YWJhcnJheWxlbiwKCQkgICAgIFFUZXh0UGFyYWcgKippbnRlcm5hbCwgUVBhaW50ZXIq IHBhaW50ZXIgKTsKCnByaXZhdGU6CSAKCiAgICBRUGFpbnRlciggY29uc3QgUVBhaW50ZXIgJiAp OwogICAgUVBhaW50ZXIgJm9wZXJhdG9yPSggY29uc3QgUVBhaW50ZXIgJiApOwoKfTsKCgogCgoK CmlubGluZSBRUGFpbnREZXZpY2UgKlFQYWludGVyOjpkZXZpY2UoKSBjb25zdAp7CiAgICByZXR1 cm4gcGRldjsKfQoKaW5saW5lIGJvb2wgUVBhaW50ZXI6OmlzQWN0aXZlKCkgY29uc3QKewogICAg cmV0dXJuIHRlc3RmKElzQWN0aXZlKTsKfQoKaW5saW5lIGNvbnN0IFFGb250ICZRUGFpbnRlcjo6 Zm9udCgpIGNvbnN0CnsKICAgIHJldHVybiBjZm9udDsKfQoKaW5saW5lIGNvbnN0IFFQZW4gJlFQ YWludGVyOjpwZW4oKSBjb25zdAp7CiAgICByZXR1cm4gY3BlbjsKfQoKaW5saW5lIGNvbnN0IFFC cnVzaCAmUVBhaW50ZXI6OmJydXNoKCkgY29uc3QKewogICAgcmV0dXJuIGNicnVzaDsKfQoKIAoK CgoKCgppbmxpbmUgY29uc3QgUUNvbG9yICZRUGFpbnRlcjo6YmFja2dyb3VuZENvbG9yKCkgY29u c3QKewogICAgcmV0dXJuIGJnX2NvbDsKfQoKaW5saW5lIFF0OjpCR01vZGUgUVBhaW50ZXI6OmJh Y2tncm91bmRNb2RlKCkgY29uc3QKewogICAgcmV0dXJuIChCR01vZGUpYmdfbW9kZTsKfQoKaW5s aW5lIFF0OjpSYXN0ZXJPcCBRUGFpbnRlcjo6cmFzdGVyT3AoKSBjb25zdAp7CiAgICByZXR1cm4g KFJhc3Rlck9wKXJvcDsKfQoKaW5saW5lIGNvbnN0IFFQb2ludCAmUVBhaW50ZXI6OmJydXNoT3Jp Z2luKCkgY29uc3QKewogICAgcmV0dXJuIGJybzsKfQoKaW5saW5lIGJvb2wgUVBhaW50ZXI6Omhh c1ZpZXdYRm9ybSgpIGNvbnN0CnsKCiAgICByZXR1cm4gdGVzdGYoVnhGKTsKCgoKfQoKaW5saW5l IGJvb2wgUVBhaW50ZXI6Omhhc1dvcmxkWEZvcm0oKSBjb25zdAp7CgogICAgcmV0dXJuIHRlc3Rm KFd4Rik7CgoKCn0KCmlubGluZSBkb3VibGUgUVBhaW50ZXI6OnRyYW5zbGF0aW9uWCgpIGNvbnN0 CnsKCiAgICByZXR1cm4gd29ybGRNYXRyaXgoKS5keCgpOwoKCgp9CgppbmxpbmUgZG91YmxlIFFQ YWludGVyOjp0cmFuc2xhdGlvblkoKSBjb25zdAp7CgogICAgcmV0dXJuIHdvcmxkTWF0cml4KCku ZHkoKTsKCgoKfQoKCmlubGluZSBib29sIFFQYWludGVyOjpoYXNDbGlwcGluZygpIGNvbnN0CnsK ICAgIHJldHVybiB0ZXN0ZihDbGlwT24pOwp9CgppbmxpbmUgaW50IFFQYWludGVyOjp0YWJTdG9w cygpIGNvbnN0CnsKICAgIHJldHVybiB0YWJzdG9wczsKfQoKaW5saW5lIGludCAqUVBhaW50ZXI6 OnRhYkFycmF5KCkgY29uc3QKewogICAgcmV0dXJuIHRhYmFycmF5Owp9CgoKCgoKCgppbmxpbmUg UXQ6OkhBTkRMRSBRUGFpbnRlcjo6aGFuZGxlKCkgY29uc3QKewogICAgcmV0dXJuIGhkOwp9CgoK aW5saW5lIHZvaWQgUVBhaW50ZXI6OnNldEJydXNoT3JpZ2luKCBjb25zdCBRUG9pbnQgJnAgKQp7 CiAgICBzZXRCcnVzaE9yaWdpbiggcC54KCksIHAueSgpICk7Cn0KCgppbmxpbmUgdm9pZCBRUGFp bnRlcjo6c2V0V2luZG93KCBjb25zdCBRUmVjdCAmciApCnsKICAgIHNldFdpbmRvdyggci54KCks IHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkgKTsKfQoKaW5saW5lIHZvaWQgUVBhaW50ZXI6 OnNldFZpZXdwb3J0KCBjb25zdCBRUmVjdCAmciApCnsKICAgIHNldFZpZXdwb3J0KCByLngoKSwg ci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSApOwp9CgoKaW5saW5lIHZvaWQgUVBhaW50ZXI6 OnNldENsaXBSZWN0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29vcmRpbmF0ZU1vZGUg bSApCnsKICAgIHNldENsaXBSZWN0KCBRUmVjdCh4LHksdyxoKSwgbSApOwp9CgppbmxpbmUgdm9p ZCBRUGFpbnRlcjo6ZHJhd1BvaW50KCBjb25zdCBRUG9pbnQgJnAgKQp7CiAgICBkcmF3UG9pbnQo IHAueCgpLCBwLnkoKSApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6bW92ZVRvKCBjb25zdCBR UG9pbnQgJnAgKQp7CiAgICBtb3ZlVG8oIHAueCgpLCBwLnkoKSApOwp9CgppbmxpbmUgdm9pZCBR UGFpbnRlcjo6bGluZVRvKCBjb25zdCBRUG9pbnQgJnAgKQp7CiAgICBsaW5lVG8oIHAueCgpLCBw LnkoKSApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6ZHJhd0xpbmUoIGNvbnN0IFFQb2ludCAm cDEsIGNvbnN0IFFQb2ludCAmcDIgKQp7CiAgICBkcmF3TGluZSggcDEueCgpLCBwMS55KCksIHAy LngoKSwgcDIueSgpICk7Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjpkcmF3UmVjdCggY29uc3Qg UVJlY3QgJnIgKQp7CiAgICBkcmF3UmVjdCggci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVp Z2h0KCkgKTsKfQoKaW5saW5lIHZvaWQgUVBhaW50ZXI6OmRyYXdXaW5Gb2N1c1JlY3QoIGNvbnN0 IFFSZWN0ICZyICkKewogICAgZHJhd1dpbkZvY3VzUmVjdCggci54KCksIHIueSgpLCByLndpZHRo KCksIHIuaGVpZ2h0KCkgKTsKfQoKaW5saW5lIHZvaWQgUVBhaW50ZXI6OmRyYXdXaW5Gb2N1c1Jl Y3QoIGNvbnN0IFFSZWN0ICZyLGNvbnN0IFFDb2xvciAmcGVuQ29sb3IgKQp7CiAgICBkcmF3V2lu Rm9jdXNSZWN0KCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSwgcGVuQ29sb3Ig KTsKfQoKaW5saW5lIHZvaWQgUVBhaW50ZXI6OmRyYXdSb3VuZFJlY3QoIGNvbnN0IFFSZWN0ICZy LCBpbnQgeFJuZCwgaW50IHlSbmQgKQp7CiAgICBkcmF3Um91bmRSZWN0KCByLngoKSwgci55KCks IHIud2lkdGgoKSwgci5oZWlnaHQoKSwgeFJuZCwgeVJuZCApOwp9CgppbmxpbmUgdm9pZCBRUGFp bnRlcjo6ZHJhd0VsbGlwc2UoIGNvbnN0IFFSZWN0ICZyICkKewogICAgZHJhd0VsbGlwc2UoIHIu eCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhlaWdodCgpICk7Cn0KCmlubGluZSB2b2lkIFFQYWlu dGVyOjpkcmF3QXJjKCBjb25zdCBRUmVjdCAmciwgaW50IGEsIGludCBhbGVuICkKewogICAgZHJh d0FyYyggci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCksIGEsIGFsZW4gKTsKfQoK aW5saW5lIHZvaWQgUVBhaW50ZXI6OmRyYXdQaWUoIGNvbnN0IFFSZWN0ICZyLCBpbnQgYSwgaW50 IGFsZW4gKQp7CiAgICBkcmF3UGllKCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQo KSwgYSwgYWxlbiApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6ZHJhd0Nob3JkKCBjb25zdCBR UmVjdCAmciwgaW50IGEsIGludCBhbGVuICkKewogICAgZHJhd0Nob3JkKCByLngoKSwgci55KCks IHIud2lkdGgoKSwgci5oZWlnaHQoKSwgYSwgYWxlbiApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRl cjo6ZHJhd1BpeG1hcCggY29uc3QgUVBvaW50ICZwLCBjb25zdCBRUGl4bWFwICZwbSwKCQkJCSAg Y29uc3QgUVJlY3QgJnNyICkKewogICAgZHJhd1BpeG1hcCggcC54KCksIHAueSgpLCBwbSwgc3Iu eCgpLCBzci55KCksIHNyLndpZHRoKCksIHNyLmhlaWdodCgpICk7Cn0KCmlubGluZSB2b2lkIFFQ YWludGVyOjpkcmF3SW1hZ2UoIGNvbnN0IFFQb2ludCAmcCwgY29uc3QgUUltYWdlICZwbSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVJlY3QgJnNyLCBpbnQgY29udmVy c2lvbkZsYWdzICkKewogICAgZHJhd0ltYWdlKCBwLngoKSwgcC55KCksIHBtLAoJICAgICAgIHNy LngoKSwgc3IueSgpLCBzci53aWR0aCgpLCBzci5oZWlnaHQoKSwgY29udmVyc2lvbkZsYWdzICk7 Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjpkcmF3VGlsZWRQaXhtYXAoIGNvbnN0IFFSZWN0ICZy LCBjb25zdCBRUGl4bWFwICZwbSwKCQkJCSAgICAgICBjb25zdCBRUG9pbnQgJnNwICkKewogICAg ZHJhd1RpbGVkUGl4bWFwKCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSwgcG0s IHNwLngoKSwgc3AueSgpICk7Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjpkcmF3VGlsZWRQaXht YXAoIGNvbnN0IFFSZWN0ICZyLCBjb25zdCBRUGl4bWFwICZwbSApCnsKICAgIGRyYXdUaWxlZFBp eG1hcCggci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCksIHBtLCAwLCAwICk7Cn0K CmlubGluZSB2b2lkIFFQYWludGVyOjpmaWxsUmVjdCggY29uc3QgUVJlY3QgJnIsIGNvbnN0IFFC cnVzaCAmYnJ1c2ggKQp7CiAgICBmaWxsUmVjdCggci54KCksIHIueSgpLCByLndpZHRoKCksIHIu aGVpZ2h0KCksIGJydXNoICk7Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjplcmFzZVJlY3QoIGlu dCB4LCBpbnQgeSwgaW50IHcsIGludCBoICkKewogICAgZmlsbFJlY3QoIHgsIHksIHcsIGgsIGJh Y2tncm91bmRDb2xvcigpICk7Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjplcmFzZVJlY3QoIGNv bnN0IFFSZWN0ICZyICkKewogICAgZmlsbFJlY3QoIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCBy LmhlaWdodCgpLCBiYWNrZ3JvdW5kQ29sb3IoKSApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6 ZHJhd1RleHQoIGNvbnN0IFFQb2ludCAmcCwgY29uc3QgUVN0cmluZyAmcywgaW50IGxlbiwgVGV4 dERpcmVjdGlvbiBkaXIgKQp7CiAgICBkcmF3VGV4dCggcC54KCksIHAueSgpLCBzLCAwLCBsZW4s IGRpciApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6ZHJhd1RleHQoIGNvbnN0IFFQb2ludCAm cCwgY29uc3QgUVN0cmluZyAmcywgaW50IHBvcywgaW50IGxlbiwgVGV4dERpcmVjdGlvbiBkaXIg KQp7CiAgICBkcmF3VGV4dCggcC54KCksIHAueSgpLCBzLCBwb3MsIGxlbiwgZGlyICk7Cn0KCmlu bGluZSB2b2lkIFFQYWludGVyOjpkcmF3VGV4dCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgs IGludCB0ZiwKCQkJCWNvbnN0IFFTdHJpbmcmIHN0ciwgaW50IGxlbiwgUVJlY3QgKmJyLCBRVGV4 dFBhcmFnICoqaSApCnsKICAgIFFSZWN0IHIoeCwgeSwgdywgaCk7CiAgICBkcmF3VGV4dCggciwg dGYsIHN0ciwgbGVuLCBiciwgaSApOwp9CgppbmxpbmUgUVJlY3QgUVBhaW50ZXI6OmJvdW5kaW5n UmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCB0ZiwKCQkJCSAgICAgY29uc3Qg UVN0cmluZyYgc3RyLCBpbnQgbGVuLCBRVGV4dFBhcmFnICoqaSApCnsKICAgIFFSZWN0IHIoeCwg eSwgdywgaCk7CiAgICByZXR1cm4gYm91bmRpbmdSZWN0KCByLCB0Ziwgc3RyLCBsZW4sIGkgKTsK fQoKCgoKCgoKCgojIDYgImNoYXJ0Zm9ybV9maWxlcy5jcHAiIDIKCiMgMSAiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3FwcmludGVyLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBRUHJpbnRlclByaXZhdGU7CgpjbGFzcyAgIFFQ cmludGVyIDogcHVibGljIFFQYWludERldmljZQp7CnB1YmxpYzoKICAgIGVudW0gUHJpbnRlck1v ZGUgeyBTY3JlZW5SZXNvbHV0aW9uLCBQcmludGVyUmVzb2x1dGlvbiwgSGlnaFJlc29sdXRpb24s IENvbXBhdGlibGUgfTsKCiAgICBRUHJpbnRlciggUHJpbnRlck1vZGUgbW9kZSA9IFNjcmVlblJl c29sdXRpb24gKTsKICAgflFQcmludGVyKCk7CgogICAgZW51bSBPcmllbnRhdGlvbiB7IFBvcnRy YWl0LCBMYW5kc2NhcGUgfTsKCiAgICBlbnVtIFBhZ2VTaXplICAgIHsgQTQsIEI1LCBMZXR0ZXIs IExlZ2FsLCBFeGVjdXRpdmUsCgkJICAgICAgIEEwLCBBMSwgQTIsIEEzLCBBNSwgQTYsIEE3LCBB OCwgQTksIEIwLCBCMSwKCQkgICAgICAgQjEwLCBCMiwgQjMsIEI0LCBCNiwgQjcsIEI4LCBCOSwg QzVFLCBDb21tMTBFLAoJCSAgICAgICBETEUsIEZvbGlvLCBMZWRnZXIsIFRhYmxvaWQsIEN1c3Rv bSwgTlBhZ2VTaXplID0gQ3VzdG9tIH07CgogICAgZW51bSBQYWdlT3JkZXIgICB7IEZpcnN0UGFn ZUZpcnN0LCBMYXN0UGFnZUZpcnN0IH07CgogICAgZW51bSBDb2xvck1vZGUgICB7IEdyYXlTY2Fs ZSwgQ29sb3IgfTsKCiAgICBlbnVtIFBhcGVyU291cmNlIHsgT25seU9uZSwgTG93ZXIsIE1pZGRs ZSwgTWFudWFsLCBFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgICAgICBFbnZlbG9wZU1hbnVh bCwgQXV0bywgVHJhY3RvciwgU21hbGxGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgTGFy Z2VGb3JtYXQsIExhcmdlQ2FwYWNpdHksIENhc3NldHRlLCBGb3JtU291cmNlIH07CgogICAgUVN0 cmluZyBwcmludGVyTmFtZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFByaW50ZXJOYW1l KCBjb25zdCBRU3RyaW5nICYpOwogICAgYm9vbCBvdXRwdXRUb0ZpbGUoKSBjb25zdDsKICAgIHZp cnR1YWwgdm9pZCBzZXRPdXRwdXRUb0ZpbGUoIGJvb2wgKTsKICAgIFFTdHJpbmcgb3V0cHV0Rmls ZU5hbWUoKWNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldE91dHB1dEZpbGVOYW1lKCBjb25zdCBR U3RyaW5nICYpOwoKICAgIFFTdHJpbmcgcHJpbnRQcm9ncmFtKCkgY29uc3Q7CiAgICB2aXJ0dWFs IHZvaWQgc2V0UHJpbnRQcm9ncmFtKCBjb25zdCBRU3RyaW5nICYpOwoKICAgIFFTdHJpbmcgcHJp bnRlclNlbGVjdGlvbk9wdGlvbigpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFByaW50ZXJT ZWxlY3Rpb25PcHRpb24oIGNvbnN0IFFTdHJpbmcgJiApOwoKICAgIFFTdHJpbmcgZG9jTmFtZSgp IGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldERvY05hbWUoIGNvbnN0IFFTdHJpbmcgJik7CiAg ICBRU3RyaW5nIGNyZWF0b3IoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRDcmVhdG9yKCBj b25zdCBRU3RyaW5nICYpOwoKICAgIE9yaWVudGF0aW9uIG9yaWVudGF0aW9uKCkgICBjb25zdDsK ICAgIHZpcnR1YWwgdm9pZCBzZXRPcmllbnRhdGlvbiggT3JpZW50YXRpb24gKTsKICAgIFBhZ2VT aXplICAgIHBhZ2VTaXplKCkgICAgICBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRQYWdlU2l6 ZSggUGFnZVNpemUgKTsKCgoKCiAgICB2aXJ0dWFsIHZvaWQgc2V0UGFnZU9yZGVyKCBQYWdlT3Jk ZXIgKTsKICAgIFBhZ2VPcmRlciAgIHBhZ2VPcmRlcigpIGNvbnN0OwoKICAgIHZvaWQgc2V0UmVz b2x1dGlvbiggaW50ICk7CiAgICBpbnQgcmVzb2x1dGlvbigpIGNvbnN0OwoKICAgIHZpcnR1YWwg dm9pZCBzZXRDb2xvck1vZGUoIENvbG9yTW9kZSApOwogICAgQ29sb3JNb2RlICAgY29sb3JNb2Rl KCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkICAgICAgICBzZXRGdWxsUGFnZSggYm9vbCApOwog ICAgYm9vbCAgICAgICAgICAgICAgICBmdWxsUGFnZSgpIGNvbnN0OwogICAgUVNpemUgICAgICAg bWFyZ2lucygpICAgICAgIGNvbnN0OwoKICAgIGludCAgICAgICAgIGZyb21QYWdlKCkgICAgICBj b25zdDsKICAgIGludCAgICAgICAgIHRvUGFnZSgpICAgICAgICBjb25zdDsKICAgIHZpcnR1YWwg dm9pZCBzZXRGcm9tVG8oIGludCBmcm9tUGFnZSwgaW50IHRvUGFnZSApOwogICAgaW50ICAgICAg ICAgbWluUGFnZSgpICAgICAgIGNvbnN0OwogICAgaW50ICAgICAgICAgbWF4UGFnZSgpICAgICAg IGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldE1pbk1heCggaW50IG1pblBhZ2UsIGludCBtYXhQ YWdlICk7CiAgICBpbnQgICAgICAgICBudW1Db3BpZXMoKSAgICAgY29uc3Q7CiAgICB2aXJ0dWFs IHZvaWQgc2V0TnVtQ29waWVzKCBpbnQgKTsKCiAgICBib29sCWNvbGxhdGVDb3BpZXNFbmFibGVk KCkgY29uc3Q7ICAgIAogICAgdm9pZAlzZXRDb2xsYXRlQ29waWVzRW5hYmxlZChib29sICk7Cgog ICAgYm9vbAljb2xsYXRlQ29waWVzKCkgY29uc3Q7CiAgICB2b2lkCXNldENvbGxhdGVDb3BpZXMo Ym9vbCApOwoKICAgIGJvb2wgICAgICAgIG5ld1BhZ2UoKTsKICAgIGJvb2wgICAgICAgIGFib3J0 KCk7CiAgICBib29sICAgICAgICBhYm9ydGVkKCkgICAgICAgY29uc3Q7CgogICAgYm9vbCAgICAg ICAgc2V0dXAoIFFXaWRnZXQgKnBhcmVudCA9IDAgKTsKCiAgICBQYXBlclNvdXJjZSBwYXBlclNv dXJjZSgpICAgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0UGFwZXJTb3VyY2UoIFBhcGVyU291 cmNlICk7Cgpwcm90ZWN0ZWQ6CiAgICBib29sICAgICAgICBjbWQoIGludCwgUVBhaW50ZXIgKiwg UVBEZXZDbWRQYXJhbSAqICk7CiAgICBpbnQgICAgICAgICBtZXRyaWMoIGludCApIGNvbnN0OwoK CgoKCgpwcml2YXRlOgoKICAgIFFQYWludERldmljZSAqcGRydjsKICAgIGludCAgICAgICAgIHBp ZDsKCgoKCgoKCgojIDE3NiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FwcmludGVyLmgiCgoKICAg IGludCAgICAgICAgIHN0YXRlOwogICAgUVN0cmluZyAgICAgcHJpbnRlcl9uYW1lOwogICAgUVN0 cmluZyAgICAgb3B0aW9uX3N0cmluZzsKICAgIFFTdHJpbmcgICAgIG91dHB1dF9maWxlbmFtZTsK ICAgIGJvb2wgICAgICAgIG91dHB1dF9maWxlOwogICAgUVN0cmluZyAgICAgcHJpbnRfcHJvZzsK ICAgIFFTdHJpbmcgICAgIGRvY19uYW1lOwogICAgUVN0cmluZyAgICAgY3JlYXRvcl9uYW1lOwoK ICAgIFBhZ2VTaXplICAgIHBhZ2Vfc2l6ZTsKICAgIFBhcGVyU291cmNlIHBhcGVyX3NvdXJjZTsK ICAgIFBhZ2VPcmRlciAgIHBhZ2Vfb3JkZXI7CiAgICBDb2xvck1vZGUgICBjb2xvcl9tb2RlOwog ICAgT3JpZW50YXRpb24gb3JpZW50OwogICAgdWludAl0b19lZGdlIDogMTsKICAgIHVpbnQJYXBw Y29sY29waWVzIDogMTsKICAgIHVpbnQJdXNlcmNvbGNvcGllcyA6IDE7CiAgICB1aW50CXJlc19z ZXQgOiAxOwogICAgc2hvcnQgICAgICAgZnJvbV9wZywgdG9fcGc7CiAgICBzaG9ydCAgICAgICBt aW5fcGcsICBtYXhfcGc7CiAgICBzaG9ydCAgICAgICBuY29waWVzOwogICAgaW50ICAgICAgICAg cmVzOwogICAgUVByaW50ZXJQcml2YXRlICpkOwoKcHJpdmF0ZTogICAgICAgICAKCiAgICBRUHJp bnRlciggY29uc3QgUVByaW50ZXIgJiApOwogICAgUVByaW50ZXIgJm9wZXJhdG9yPSggY29uc3Qg UVByaW50ZXIgJiApOwoKfTsKCgppbmxpbmUgUVN0cmluZyBRUHJpbnRlcjo6cHJpbnRlck5hbWUo KSBjb25zdAp7IHJldHVybiBwcmludGVyX25hbWU7IH0KCmlubGluZSBib29sIFFQcmludGVyOjpv dXRwdXRUb0ZpbGUoKSBjb25zdAp7IHJldHVybiBvdXRwdXRfZmlsZTsgfQoKaW5saW5lIFFTdHJp bmcgUVByaW50ZXI6Om91dHB1dEZpbGVOYW1lKCkgY29uc3QKeyByZXR1cm4gb3V0cHV0X2ZpbGVu YW1lOyB9CgppbmxpbmUgUVN0cmluZyBRUHJpbnRlcjo6cHJpbnRQcm9ncmFtKCkgY29uc3QKeyBy ZXR1cm4gcHJpbnRfcHJvZzsgfQoKaW5saW5lIFFTdHJpbmcgUVByaW50ZXI6OmRvY05hbWUoKSBj b25zdAp7IHJldHVybiBkb2NfbmFtZTsgfQoKaW5saW5lIFFTdHJpbmcgUVByaW50ZXI6OmNyZWF0 b3IoKSBjb25zdAp7IHJldHVybiBjcmVhdG9yX25hbWU7IH0KCmlubGluZSBRUHJpbnRlcjo6UGFn ZVNpemUgUVByaW50ZXI6OnBhZ2VTaXplKCkgY29uc3QKeyByZXR1cm4gcGFnZV9zaXplOyB9Cgpp bmxpbmUgUVByaW50ZXI6Ok9yaWVudGF0aW9uIFFQcmludGVyOjpvcmllbnRhdGlvbigpIGNvbnN0 CnsgcmV0dXJuIG9yaWVudDsgfQoKaW5saW5lIGludCBRUHJpbnRlcjo6ZnJvbVBhZ2UoKSBjb25z dAp7IHJldHVybiBmcm9tX3BnOyB9CgppbmxpbmUgaW50IFFQcmludGVyOjp0b1BhZ2UoKSBjb25z dAp7IHJldHVybiB0b19wZzsgfQoKaW5saW5lIGludCBRUHJpbnRlcjo6bWluUGFnZSgpIGNvbnN0 CnsgcmV0dXJuIG1pbl9wZzsgfQoKaW5saW5lIGludCBRUHJpbnRlcjo6bWF4UGFnZSgpIGNvbnN0 CnsgcmV0dXJuIG1heF9wZzsgfQoKaW5saW5lIGludCBRUHJpbnRlcjo6bnVtQ29waWVzKCkgY29u c3QKeyByZXR1cm4gbmNvcGllczsgfQoKaW5saW5lIGJvb2wgUVByaW50ZXI6OmNvbGxhdGVDb3Bp ZXNFbmFibGVkKCkgY29uc3QKeyByZXR1cm4gYXBwY29sY29waWVzOyB9CgppbmxpbmUgdm9pZCBR UHJpbnRlcjo6c2V0Q29sbGF0ZUNvcGllc0VuYWJsZWQoYm9vbCB2KQp7IGFwcGNvbGNvcGllcyA9 IHY7IH0KCmlubGluZSBib29sIFFQcmludGVyOjpjb2xsYXRlQ29waWVzKCkgY29uc3QKeyByZXR1 cm4gdXNlcmNvbGNvcGllczsgfQoKCgoKCiMgNyAiY2hhcnRmb3JtX2ZpbGVzLmNwcCIgMgoKIyAx ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXN0YXR1c2Jhci5oIiAxCiAKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFTdGF0dXNCYXJQcml2YXRlOwoK CmNsYXNzICAgUVN0YXR1c0JhcjogcHVibGljIFFXaWRnZXQKewogICAgcHVibGljOgl2aXJ0dWFs IFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVj dCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9p ZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBR VU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1 YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRh T2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAo UU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAg IAoKcHVibGljOgogICAgUVN0YXR1c0JhciggUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIq IG5hbWU9MCApOwogICAgdmlydHVhbCB+UVN0YXR1c0JhcigpOwoKICAgIHZpcnR1YWwgdm9pZCBh ZGRXaWRnZXQoIFFXaWRnZXQgKiwgaW50IHN0cmV0Y2ggPSAwLCBib29sID0gRkFMU0UgKTsKICAg IHZpcnR1YWwgdm9pZCByZW1vdmVXaWRnZXQoIFFXaWRnZXQgKiApOwoKICAgIHZvaWQgc2V0U2l6 ZUdyaXBFbmFibGVkKGJvb2wpOwogICAgYm9vbCBpc1NpemVHcmlwRW5hYmxlZCgpIGNvbnN0OwoK cHVibGljICA6CiAgICB2b2lkIG1lc3NhZ2UoIGNvbnN0IFFTdHJpbmcgJik7CiAgICB2b2lkIG1l c3NhZ2UoIGNvbnN0IFFTdHJpbmcgJiwgaW50ICk7CiAgICB2b2lkIGNsZWFyKCk7Cgpwcm90ZWN0 ZWQ6CiAgICB2b2lkIHBhaW50RXZlbnQoIFFQYWludEV2ZW50ICogKTsKICAgIHZvaWQgcmVzaXpl RXZlbnQoIFFSZXNpemVFdmVudCAqICk7CgogICAgdm9pZCByZWZvcm1hdCgpOwogICAgdm9pZCBo aWRlT3JTaG93KCk7CiAgICBib29sIGV2ZW50KCBRRXZlbnQgKik7Cgpwcml2YXRlOgogICAgUVN0 YXR1c0JhclByaXZhdGUgKiBkOwpwcml2YXRlOgkgCgogICAgUVN0YXR1c0JhciggY29uc3QgUVN0 YXR1c0JhciAmICk7CiAgICBRU3RhdHVzQmFyJiBvcGVyYXRvcj0oIGNvbnN0IFFTdGF0dXNCYXIg JiApOwoKfTsKCgoKCiMgOCAiY2hhcnRmb3JtX2ZpbGVzLmNwcCIgMgoKCgp2b2lkIENoYXJ0Rm9y bTo6bG9hZCggY29uc3QgUVN0cmluZyYgZmlsZW5hbWUgKQp7CiAgICBRRmlsZSBmaWxlKCBmaWxl bmFtZSApOwogICAgaWYgKCAhZmlsZS5vcGVuKCAweDAwMDEgICkgKSB7CglzdGF0dXNCYXIoKS0+ bWVzc2FnZSggUVN0cmluZyggIkZhaWxlZCB0byBsb2FkIFwnJTFcJyIgKS4KCQkJCWFyZyggZmls ZW5hbWUgKSwgMjAwMCApOwoJcmV0dXJuOwogICAgfQoKICAgIGluaXQoKTsgIAogICAgbV9maWxl bmFtZSA9IGZpbGVuYW1lOwogICAgUVRleHRTdHJlYW0gdHMoICZmaWxlICk7CiAgICBFbGVtZW50 IGVsZW1lbnQ7CiAgICBpbnQgZXJyb3JzID0gMDsKICAgIGludCBpID0gMDsKICAgIHdoaWxlICgg IXRzLmVvZigpICkgewoJdHMgPj4gZWxlbWVudDsKCWlmICggZWxlbWVudC5pc1ZhbGlkKCkgKQoJ ICAgIG1fZWxlbWVudHNbaSsrXSA9IGVsZW1lbnQ7CgllbHNlCgkgICAgZXJyb3JzKys7CglpZiAo IGkgPT0gTUFYX0VMRU1FTlRTICkgewoJICAgIHN0YXR1c0JhcigpLT5tZXNzYWdlKAoJCVFTdHJp bmcoICJSZWFkIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzICglMSkiCgkJICAgICAgICAgIiBk aXNjYXJkaW5nIG90aGVycyIgKS5hcmcoIGkgKSwgMjAwMCApOwoJICAgIGJyZWFrOwoJfQogICAg fQoKICAgIGZpbGUuY2xvc2UoKTsKCiAgICBRU3RyaW5nIGJhZCA9ICIiOwogICAgaWYgKCBlcnJv cnMgKSB7CgliYWQgPSBRU3RyaW5nKCAiOyBza2lwcGVkICIgKSArIFFTdHJpbmc6Om51bWJlcigg ZXJyb3JzICkgKyAiIGJhZCByZWNvcmQiOwoJaWYgKCBlcnJvcnMgPiAxICkKCSAgICBiYWQgKz0g InMiOwogICAgfQogICAgc3RhdHVzQmFyKCktPm1lc3NhZ2UoIFFTdHJpbmcoICJSZWFkICUxIHZh bHVlcyBmcm9tIFwnJTJcJyUzIiApLgoJCQkgIGFyZyggaSApLmFyZyggZmlsZW5hbWUgKS5hcmco IGJhZCApLCAzMDAwICk7CgogICAgc2V0Q2FwdGlvbiggUVN0cmluZyggIkNoYXJ0IC0tICUxIiAp LmFyZyggZmlsZW5hbWUgKSApOwogICAgdXBkYXRlUmVjZW50RmlsZXMoIGZpbGVuYW1lICk7Cgog ICAgZHJhd0VsZW1lbnRzKCk7CiAgICBtX2NoYW5nZWQgPSBGQUxTRTsKfQoKCnZvaWQgQ2hhcnRG b3JtOjpmaWxlU2F2ZSgpCnsKICAgIGlmICggbV9maWxlbmFtZS5pc0VtcHR5KCkgKSB7CglmaWxl U2F2ZUFzKCk7CglyZXR1cm47CiAgICB9CgogICAgUUZpbGUgZmlsZSggbV9maWxlbmFtZSApOwog ICAgaWYgKCAhZmlsZS5vcGVuKCAweDAwMDIgICkgKSB7CglzdGF0dXNCYXIoKS0+bWVzc2FnZSgg UVN0cmluZyggIkZhaWxlZCB0byBzYXZlIFwnJTFcJyIgKS4KCQkJCWFyZyggbV9maWxlbmFtZSAp LCAyMDAwICk7CglyZXR1cm47CiAgICB9CiAgICBRVGV4dFN0cmVhbSB0cyggJmZpbGUgKTsKICAg IGZvciAoIGludCBpID0gMDsgaSA8IE1BWF9FTEVNRU5UUzsgKytpICkKCWlmICggbV9lbGVtZW50 c1tpXS5pc1ZhbGlkKCkgKQoJICAgIHRzIDw8IG1fZWxlbWVudHNbaV07CgogICAgZmlsZS5jbG9z ZSgpOwoKICAgIHNldENhcHRpb24oIFFTdHJpbmcoICJDaGFydCAtLSAlMSIgKS5hcmcoIG1fZmls ZW5hbWUgKSApOwogICAgc3RhdHVzQmFyKCktPm1lc3NhZ2UoIFFTdHJpbmcoICJTYXZlZCBcJyUx XCciICkuYXJnKCBtX2ZpbGVuYW1lICksIDIwMDAgKTsKICAgIG1fY2hhbmdlZCA9IEZBTFNFOwp9 CgoKdm9pZCBDaGFydEZvcm06OmZpbGVTYXZlQXNQaXhtYXAoKQp7CiAgICBRU3RyaW5nIGZpbGVu YW1lID0gUUZpbGVEaWFsb2c6OmdldFNhdmVGaWxlTmFtZSgKCQkJICAgIFFTdHJpbmc6Om51bGws ICJJbWFnZXMgKCoucG5nICoueHBtICouanBnKSIsCgkJCSAgICB0aGlzLCAiZmlsZSBzYXZlIGFz IGJpdG1hcCIsCgkJCSAgICAiQ2hhcnQgLS0gRmlsZSBTYXZlIEFzIEJpdG1hcCIgKTsKICAgIGlm ICggUVBpeG1hcDo6Z3JhYldpZGdldCggbV9jYW52YXNWaWV3ICkuCgkgICAgc2F2ZSggZmlsZW5h bWUsCgkJICBmaWxlbmFtZS5taWQoIGZpbGVuYW1lLmZpbmRSZXYoICcuJyApICsgMSApLnVwcGVy KCkgKSApCglzdGF0dXNCYXIoKS0+bWVzc2FnZSggUVN0cmluZyggIldyb3RlIFwnJTFcJyIgKS5h cmcoIGZpbGVuYW1lICksIDIwMDAgKTsKICAgIGVsc2UKCXN0YXR1c0JhcigpLT5tZXNzYWdlKCBR U3RyaW5nKCAiRmFpbGVkIHRvIHdyaXRlIFwnJTFcJyIgKS4KCQkJCWFyZyggZmlsZW5hbWUgKSwg MjAwMCApOwp9Cgp2b2lkIENoYXJ0Rm9ybTo6ZmlsZVByaW50KCkKewogICAgaWYgKCAhbV9wcmlu dGVyICkKCW1fcHJpbnRlciA9IG5ldyBRUHJpbnRlcjsKICAgIGlmICggbV9wcmludGVyLT5zZXR1 cCgpICkgewoJUVBhaW50ZXIgcGFpbnRlciggbV9wcmludGVyICk7CgltX2NhbnZhcy0+ZHJhd0Fy ZWEoIFFSZWN0KCAwLCAwLCBtX2NhbnZhcy0+d2lkdGgoKSwgbV9jYW52YXMtPmhlaWdodCgpICks CgkJCSAgICAmcGFpbnRlciwgRkFMU0UgKTsKCWlmICggIW1fcHJpbnRlci0+b3V0cHV0RmlsZU5h bWUoKS5pc0VtcHR5KCkgKQoJICAgIHN0YXR1c0JhcigpLT5tZXNzYWdlKCBRU3RyaW5nKCAiUHJp bnRlZCBcJyUxXCciICkuCgkJCQkgIGFyZyggbV9wcmludGVyLT5vdXRwdXRGaWxlTmFtZSgpICks IDIwMDAgKTsKICAgIH0KfQoK From gcc-prs-return-23915-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 18:08:28 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12359 invoked by alias); 3 Nov 2002 18:08:27 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12324 invoked by uid 61); 3 Nov 2002 18:08:26 -0000 Date: 3 Nov 2002 18:08:26 -0000 Message-ID: <20021103180826.12322.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, wje@acm.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, wje@acm.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8431: compile short program to get internal compilation error Synopsis: compile short program to get internal compilation error State-Changed-From-To: feedback->closed State-Changed-By: paolo State-Changed-When: Sun Nov 3 10:08:26 2002 State-Changed-Why: Cannot be reproduced with current 3.2.1 pre and 3.3 exp. Thanks, Paolo. P.S. Please note that 2.95.x is not maintained anymore. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8431 From gcc-prs-return-23916-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 18:13:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 721 invoked by alias); 3 Nov 2002 18:13:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 702 invoked by uid 61); 3 Nov 2002 18:13:02 -0000 Date: 3 Nov 2002 18:13:02 -0000 Message-ID: <20021103181302.701.qmail@sources.redhat.com> To: bkausbk@web.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, bkausbk@web.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c/8436: Internal GCC 3.2 compiler error caused by Asm-Statement Synopsis: Internal GCC 3.2 compiler error caused by Asm-Statement State-Changed-From-To: open->feedback State-Changed-By: paolo State-Changed-When: Sun Nov 3 10:13:01 2002 State-Changed-Why: For some reason the attachment hot lost. Could you possibly provide it again? Thanks, Paolo. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8436 From gcc-prs-return-23917-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 18:26:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25762 invoked by alias); 3 Nov 2002 18:26:00 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 25742 invoked by uid 71); 3 Nov 2002 18:26:00 -0000 Resent-Date: 3 Nov 2002 18:26:00 -0000 Resent-Message-ID: <20021103182600.25741.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, rf13@inf.tu-dresden.de Received: (qmail 30890 invoked by uid 61); 3 Nov 2002 18:19:48 -0000 Message-Id: <20021103181948.30889.qmail@sources.redhat.com> Date: 3 Nov 2002 18:19:48 -0000 From: rf13@inf.tu-dresden.de Reply-To: rf13@inf.tu-dresden.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c/8439: using an empty struct causes Internal compiler error in instantiate_virtual_regs_1, at function.c:4126 >Number: 8439 >Category: c >Synopsis: using an empty struct causes Internal compiler error in instantiate_virtual_regs_1, at function.c:4126 >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sun Nov 03 10:26:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: rf13@inf.tu-dresden.de >Release: gcc-3.2 >Organization: >Environment: Linux 2.4.18-PPP i686,glibc-2.2.4-18.7.0.6 >Description: c.c: In function `foobar': c.c:7: Internal compiler error in instantiate_virtual_regs_1, at function.c:4126 >How-To-Repeat: gcc -c c.c >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="c.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="c.c" c3RydWN0IGVtcHR5IHsKfTsKCnN0YXRpYyB2b2lkIGZvb2Jhcihjb25zdCBzdHJ1Y3QgZW1wdHkg KnApCnsKICBwKys7Cn0K From gcc-prs-return-23918-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 18:31:56 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 15861 invoked by alias); 3 Nov 2002 18:31:56 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 15842 invoked by uid 61); 3 Nov 2002 18:31:56 -0000 Date: 3 Nov 2002 18:31:56 -0000 Message-ID: <20021103183156.15841.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rf13@inf.tu-dresden.de From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rf13@inf.tu-dresden.de, gcc-gnats@gcc.gnu.org Subject: Re: c/8439: using an empty struct causes Internal compiler error in instantiate_virtual_regs_1, at function.c:4126 Synopsis: using an empty struct causes Internal compiler error in instantiate_virtual_regs_1, at function.c:4126 State-Changed-From-To: open->analyzed State-Changed-By: paolo State-Changed-When: Sun Nov 3 10:31:56 2002 State-Changed-Why: Confirmed mainline and 3_2-branch. Regression from 2.95.x and 3.0.x -> high priority. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8439 From gcc-prs-return-23919-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 18:46:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12381 invoked by alias); 3 Nov 2002 18:46:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12348 invoked by uid 71); 3 Nov 2002 18:46:01 -0000 Resent-Date: 3 Nov 2002 18:46:01 -0000 Resent-Message-ID: <20021103184601.12347.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, bkausbk@web.de Received: (qmail 30146 invoked by uid 61); 3 Nov 2002 18:42:37 -0000 Message-Id: <20021103184237.30145.qmail@sources.redhat.com> Date: 3 Nov 2002 18:42:37 -0000 From: bkausbk@web.de Reply-To: bkausbk@web.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c/8440: Internal GCC 3.2 compiler error caused by Asm-Statement >Number: 8440 >Category: c >Synopsis: Internal GCC 3.2 compiler error caused by Asm-Statement >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Sun Nov 03 10:46:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Benjamin Kalytta >Release: GCC 3.2 >Organization: >Environment: x86(AMD XP2200+) cygwin (1.1.8) Windows 2000 Prof. >Description: asm-statement (see attachement test.c [preprocessing is not needed]) caused an internal compiler error, only if optimization level is 0 (default) test.c: In function `KmAtomicCompareExchange': test.c:10: Internal compiler error in instantiate_virtual_regs_1, at function.c: 3972 >How-To-Repeat: execute "gcc -c test.c" >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: text/plain; name="test.c" Content-Disposition: inline; filename="test.c" inline int KmAtomicCompareExchange(int *Destination, int ExchangeWith, int CompareWith){ int ret=0; asm( " cmpxchg [%[Destination]],%[ExchangeWith]\n" : [CompareWith] "=eax" (ret) : [Destination] "r" (Destination), [ExchangeWith] "r"(ExchangeWith), "0" (CompareWith) : "cc", "memory" ); return ret; } int main() { } From gcc-prs-return-23920-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 18:48:41 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24434 invoked by alias); 3 Nov 2002 18:48:39 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24383 invoked by uid 61); 3 Nov 2002 18:48:39 -0000 Date: 3 Nov 2002 18:48:39 -0000 Message-ID: <20021103184839.24382.qmail@sources.redhat.com> To: bkausbk@web.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, bkausbk@web.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c/8436: Internal GCC 3.2 compiler error caused by Asm-Statement Synopsis: Internal GCC 3.2 compiler error caused by Asm-Statement State-Changed-From-To: feedback->closed State-Changed-By: paolo State-Changed-When: Sun Nov 3 10:48:38 2002 State-Changed-Why: Duplicate, without the attachment, of c/8440. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8436 From gcc-prs-return-23921-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Sun Nov 03 18:52:24 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 9192 invoked by alias); 3 Nov 2002 18:52:24 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 9166 invoked by uid 61); 3 Nov 2002 18:52:23 -0000 Date: 3 Nov 2002 18:52:23 -0000 Message-ID: <20021103185223.9165.qmail@sources.redhat.com> To: bkausbk@web.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, bkausbk@web.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c/8440: Internal GCC 3.2 compiler error caused by Asm-Statement Synopsis: Internal GCC 3.2 compiler error caused by Asm-Statement State-Changed-From-To: open->analyzed State-Changed-By: paolo State-Changed-When: Sun Nov 3 10:52:23 2002 State-Changed-Why: Confirmed mainline and 3_2-branch. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8440 From gcc-prs-return-23922-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 00:09:16 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 13733 invoked by alias); 4 Nov 2002 00:09:14 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 13682 invoked by uid 61); 4 Nov 2002 00:09:14 -0000 Date: 4 Nov 2002 00:09:14 -0000 Message-ID: <20021104000914.13679.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, marc-oliver.gewaltig@hre-ftr.f.rd.honda.co.jp, nobody@gcc.gnu.org, paolo@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, marc-oliver.gewaltig@hre-ftr.f.rd.honda.co.jp, nobody@gcc.gnu.org, paolo@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8399: sync_with_stdio(false) breaks unformatted input Synopsis: sync_with_stdio(false) breaks unformatted input Responsible-Changed-From-To: unassigned->paolo Responsible-Changed-By: paolo Responsible-Changed-When: Sun Nov 3 16:09:14 2002 Responsible-Changed-Why: Analyzed. State-Changed-From-To: open->feedback State-Changed-By: paolo State-Changed-When: Sun Nov 3 16:09:14 2002 State-Changed-Why: On i686-pc-linux-gnu I cannot reproduce the problem with current 3.2.1 pre and 3.3 exp. Both with and without 'sync' I get: --- paolo:~/Gcc/PRs/v3/Analyzed> a.out c= a a c= c= b b c= c= q q --- Could you possibly check-out via CVS a 3.2.1 snapshot? Otherwise wait just a few days for the upcoming 3.2.1 release. Please let us know your findings. Thanks, Paolo. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8399 From gcc-prs-return-23923-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 00:26:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 8243 invoked by alias); 4 Nov 2002 00:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 8228 invoked by uid 71); 4 Nov 2002 00:26:01 -0000 Date: 4 Nov 2002 00:26:01 -0000 Message-ID: <20021104002601.8227.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: sayle@gcc.gnu.org Subject: c/7128 Reply-To: sayle@gcc.gnu.org The following reply was made to PR c/7128; it has been noted by GNATS. From: sayle@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: c/7128 Date: 4 Nov 2002 00:22:57 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: sayle@gcc.gnu.org 2002-11-03 16:22:57 Modified files: gcc : ChangeLog c-typeck.c Log message: PR c/7128 * c-typeck.c (c_expand_asm_operands): Defend against error_mark_nodes in the output argument to avoid ICE. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=1.15845&r2=1.15846 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-typeck.c.diff?cvsroot=gcc&r1=1.211&r2=1.212 From gcc-prs-return-23924-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 00:42:51 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 11517 invoked by alias); 4 Nov 2002 00:42:49 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 11469 invoked by uid 61); 4 Nov 2002 00:42:48 -0000 Date: 4 Nov 2002 00:42:48 -0000 Message-ID: <20021104004248.11468.qmail@sources.redhat.com> To: ebb9@email.byu.edu, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, java-prs@gcc.gnu.org, nobody@gcc.gnu.org, tromey@gcc.gnu.org From: tromey@gcc.gnu.org Reply-To: tromey@gcc.gnu.org, ebb9@email.byu.edu, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, java-prs@gcc.gnu.org, nobody@gcc.gnu.org, tromey@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: java/7912: invalid verification error for arrays Synopsis: invalid verification error for arrays Responsible-Changed-From-To: unassigned->tromey Responsible-Changed-By: tromey Responsible-Changed-When: Sun Nov 3 16:42:48 2002 Responsible-Changed-Why: I'm handling this State-Changed-From-To: open->analyzed State-Changed-By: tromey State-Changed-When: Sun Nov 3 16:42:48 2002 State-Changed-Why: I have a patch I'm testing. It turns out that the bytecode front end doesn't know that arrays implement Cloneable and Serializable. An even simpler test will cause an erroneous error. I'll check in a test case shortly. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7912 From gcc-prs-return-23925-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 01:06:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 6453 invoked by alias); 4 Nov 2002 01:06:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 6416 invoked by uid 71); 4 Nov 2002 01:06:01 -0000 Resent-Date: 4 Nov 2002 01:06:01 -0000 Resent-Message-ID: <20021104010601.6415.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, evanlanglois@yahoo.com Received: (qmail 16035 invoked by uid 61); 4 Nov 2002 01:00:16 -0000 Message-Id: <20021104010016.16034.qmail@sources.redhat.com> Date: 4 Nov 2002 01:00:16 -0000 From: evanlanglois@yahoo.com Reply-To: evanlanglois@yahoo.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: target/8441: GCC 3.2 fails in building of H8300 target >Number: 8441 >Category: target >Synopsis: GCC 3.2 fails in building of H8300 target >Confidential: no >Severity: critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sun Nov 03 17:06:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: Evan Langlois >Release: unknown-1.0 >Organization: >Environment: Linux 2.4.18-3custom i586 unknown >Description: When building a cross compiler, the make barfs with some odd errors in the assembler. I didn't use any special options other than specifying the target as h8300-elf. I'm attempting to build a cross compiler for building Linux kernel for the h8300 series. >How-To-Repeat: here's where it barfs ... make[2]: Entering directory `/usr/src/linux/gcc-3.2/gcc' for d in libgcc h8300h libgcc/h8300h h8300s libgcc/h8300s h8300h/int32 libgcc/h8300h/int32 h8300s/int32 libgcc/h8300s/int32; do \ if [ -d $d ]; then true; else /bin/sh ./mkinstalldirs $d; fi; \ done if [ -f stmp-dirs ]; then true; else touch stmp-dirs; fi /usr/src/linux/gcc-3.2/gcc/xgcc -B/usr/src/linux/gcc-3.2/gcc/ -B/usr/h8300-linux-elf/bin/ -B/usr/h8300-linux-elf/lib/ -isystem /usr/h8300-linux-elf/include -O2 -DIN_GCC -DCROSS_COMPILE -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -isystem ./include -DDF=SF -DDI=SI -g -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -Dinhibit_libc -I. -I. -I. -I./. -I./config -I./../include -DL_cmpsi2 -xassembler-with-cpp -c ./config/h8300/lib1funcs.asm -o libgcc/./_cmpsi2.o /tmp/ccVrVm9y.s: Assembler messages: /tmp/ccVrVm9y.s:5: Error: no such instruction: `libgcc routines for the Hitachi H8/300 CPU.' /tmp/ccVrVm9y.s:6: Error: no such instruction: `contributed by Steve Chamberlain' /tmp/ccVrVm9y.s:12: Error: invalid character '.' in mnemonic /tmp/ccVrVm9y.s:13: Error: no such instruction: `bne .L2' /tmp/ccVrVm9y.s:14: Error: invalid character '.' in mnemonic /tmp/ccVrVm9y.s:15: Error: no such instruction: `bne .L2' /tmp/ccVrVm9y.s:16: Error: invalid character '.' in mnemonic /tmp/ccVrVm9y.s:17: Error: no such instruction: `rts' /tmp/ccVrVm9y.s:19: Error: invalid character '.' in mnemonic /tmp/ccVrVm9y.s:20: Error: no such instruction: `bgt .L4' /tmp/ccVrVm9y.s:21: Error: no such instruction: `bne .L3' /tmp/ccVrVm9y.s:22: Error: invalid character '.' in mnemonic /tmp/ccVrVm9y.s:23: Error: no such instruction: `bls .L3' /tmp/ccVrVm9y.s:25: Error: invalid character '.' in mnemonic /tmp/ccVrVm9y.s:26: Error: no such instruction: `rts' /tmp/ccVrVm9y.s:28: Error: invalid character '.' in mnemonic /tmp/ccVrVm9y.s:30: Error: no such instruction: `rts' make[2]: *** [libgcc/./_cmpsi2.o] Error 1 make[2]: Leaving directory `/usr/src/linux/gcc-3.2/gcc' make[1]: *** [stmp-multilib] Error 2 make[1]: Leaving directory `/usr/src/linux/gcc-3.2/gcc' make: *** [install-gcc] Error 2 >Fix: I don't know, but if you know what I should do, I'd appreciate an email at evanlanglois@yahoo.com. How come I can't set the priority to high? I've got a dead compiler :( >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23926-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 01:56:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 30854 invoked by alias); 4 Nov 2002 01:56:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 30826 invoked by uid 71); 4 Nov 2002 01:56:01 -0000 Resent-Date: 4 Nov 2002 01:56:01 -0000 Resent-Message-ID: <20021104015601.30824.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, jcab@JCABs-Rumblings.com Received: (qmail 15166 invoked by uid 61); 4 Nov 2002 01:52:01 -0000 Message-Id: <20021104015201.15165.qmail@sources.redhat.com> Date: 4 Nov 2002 01:52:01 -0000 From: jcab@JCABs-Rumblings.com Reply-To: jcab@JCABs-Rumblings.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8442: Wrongful compiler error - file available >Number: 8442 >Category: c++ >Synopsis: Wrongful compiler error - file available >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: rejects-legal >Submitter-Id: net >Arrival-Date: Sun Nov 03 17:56:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: jcab@JCABs-Rumblings.com >Release: MinGW 2.0.0-3 (GCC 3.2) >Organization: >Environment: Windows 2000, MinGW 2.0.0-3, Spirit 1.5.1 (latest CVS) >Description: You can download the file from here: http://home.JCABs-Rumblings.com/ftp/cpp_grammar_error.zip It's a ZIP archive including the preprocessed .ii file, the original C++ source file, and the error spew. You can read the tracking of the bug so far on the MinGW pages in SourceForge: https://sourceforge.net/tracker/?func=detail&atid=102435&aid=632454&group_id=2435 Basically, when compiling the file, using this command: c:\mingw\bin\g++ -O2 -ftemplate-depth-500 -o cpp_grammar.o -c cpp_grammar.ii I get an error in a piece of code that looks like this: --- struct cpp_grammar: grammar { ... template struct definition: cpp_expressions { ... template < typename ParserT > struct brace_block_functor { ... }; template < typename ParserT > static functor_parser > // line 2306 brace_block(ParserT const& parser) { return brace_block_functor(parser); }; ... }; ... }; --- The error (sans the "instantiated from" super-spew) says this: --- cpp_grammar.cpp:2306: type/value mismatch at argument 1 in template parameter list for `template struct spirit::functor_parser' cpp_grammar.cpp:2306: expected a type, got `brace_block_functor' cpp_grammar.cpp:2306: confused by earlier errors, bailing out --- This is patently wrong. In fact, I have a CygWin with GCC 3.0.3 that compiles this program perfectly. In tracking this with the MinGW people, they've tried this file with the newest 3.3 compiler, and gotten other errors. >How-To-Repeat: Compile the cpp_grammar.ii file from the ZIP file above, using the following command line: c:\mingw\bin\g++ -O2 -ftemplate-depth-500 -o cpp_grammar.o -c cpp_grammar.ii >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23927-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 04:26:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 28117 invoked by alias); 4 Nov 2002 04:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 28087 invoked by uid 71); 4 Nov 2002 04:26:01 -0000 Date: 4 Nov 2002 04:26:01 -0000 Message-ID: <20021104042601.28086.qmail@sources.redhat.com> To: jason@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Ben Hines Subject: Re: c++/7327: -isystem and template linkage Reply-To: Ben Hines The following reply was made to PR c++/7327; it has been noted by GNATS. From: Ben Hines To: gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, hoel@germanlloyd.org, gcc-bugs@gcc.gnu.org, jason@gcc.gnu.org Cc: Subject: Re: c++/7327: -isystem and template linkage Date: Sun, 3 Nov 2002 20:21:19 -0800 This bug# 7327 also affects Apple's GCC on Mac OS X. Also, "idirafter" is also affected in addition to "isystem". To reproduce on mac os x: in conftest.cpp: #include int main () { return 0; } in conftest.h in pwd: #include Compile with: g++ -idirafter `pwd` conftest.cpp -save-temps OR g++ -isystem `pwd` conftest.cpp -save-temps RESULT: % g++ -idirafter `pwd` conftest.cpp -save-temps In file included from /usr/include/gcc/darwin/3.1/g++-v3/iosfwd:45, from /Users/ben/tempbug/conftest.h:1, from conftest.cpp:2: /usr/include/gcc/darwin/3.1/g++-v3/bits/stringfwd.h:49: template with C linkage /usr/include/gcc/darwin/3.1/g++-v3/bits/stringfwd.h:57: template with C linkage /usr/include/gcc/darwin/3.1/g++-v3/bits/stringfwd.h:61: template with C linkage -snip more- REGRESSION: If i include directly in conftest.cpp, i don't get the problem. It has to be in a header found by isystem. % gcc -v Reading specs from /usr/libexec/gcc/darwin/ppc/3.1/specs Thread model: posix Apple Computer, Inc. GCC version 1161, based on gcc version 3.1 20020420 (prerelease) % uname -a Darwin lsanca1-ar8-4-60-073-020.lsanca1.dsl-verizon.net 6.1 Darwin Kernel Version 6.1: Fri Sep 6 23:24:34 PDT 2002; root:xnu/xnu-344.2.obj~2/RELEASE_PPC Power Macintosh powerpc -Ben From gcc-prs-return-23928-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 04:36:00 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 7596 invoked by alias); 4 Nov 2002 04:36:00 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 7564 invoked by uid 71); 4 Nov 2002 04:36:00 -0000 Resent-Date: 4 Nov 2002 04:36:00 -0000 Resent-Message-ID: <20021104043600.7562.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, java-prs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, brian_252@yahoo.com Received: (qmail 25279 invoked by uid 61); 4 Nov 2002 04:32:41 -0000 Message-Id: <20021104043241.25277.qmail@sources.redhat.com> Date: 4 Nov 2002 04:32:41 -0000 From: brian_252@yahoo.com Reply-To: brian_252@yahoo.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: libgcj/8443: StringTokenizer does not return delimeters >Number: 8443 >Category: libgcj >Synopsis: StringTokenizer does not return delimeters >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sun Nov 03 20:36:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: Brian >Release: libgcj3 1:3.2.1-0pre3 >Organization: >Environment: Debian Sarge on i386 >Description: Although i specify in the StringTokenizer constructor that i want the delimiters returned as token, the nextToken() function does not do so. It does return the correct number of tokens. But for the tokens which are also delimiters, instead of returning the single character string -- one of the delimiters -- it returns an empty string. >How-To-Repeat: Compile the code with gcj-3.2, run it with gij-3.2. Compare the output with the output from using J2SDK1.4. >Fix: Let me know if you want me to work on a fix. >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23929-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 04:48:09 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 27182 invoked by alias); 4 Nov 2002 04:48:07 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 27130 invoked by uid 61); 4 Nov 2002 04:48:06 -0000 Date: 4 Nov 2002 04:48:06 -0000 Message-ID: <20021104044806.27128.qmail@sources.redhat.com> To: brian_252@yahoo.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, green@gcc.gnu.org, java-prs@gcc.gnu.org, nobody@gcc.gnu.org From: green@gcc.gnu.org Reply-To: green@gcc.gnu.org, brian_252@yahoo.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, green@gcc.gnu.org, java-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libgcj/8443: StringTokenizer does not return delimeters Synopsis: StringTokenizer does not return delimeters Responsible-Changed-From-To: unassigned->green Responsible-Changed-By: green Responsible-Changed-When: Sun Nov 3 20:48:06 2002 Responsible-Changed-Why: I know this bug. State-Changed-From-To: open->feedback State-Changed-By: green State-Changed-When: Sun Nov 3 20:48:06 2002 State-Changed-Why: This is a well known bug and will be fixed in 3.3. http://gcc.gnu.org/ml/gcc-patches/2002-10/msg00980.html http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8443 From gcc-prs-return-23930-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 06:36:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12258 invoked by alias); 4 Nov 2002 06:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12224 invoked by uid 71); 4 Nov 2002 06:36:00 -0000 Resent-Date: 4 Nov 2002 06:36:00 -0000 Resent-Message-ID: <20021104063600.12222.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, rbrown64@csc.com.au Received: (qmail 5705 invoked by uid 61); 4 Nov 2002 06:34:34 -0000 Message-Id: <20021104063434.5704.qmail@sources.redhat.com> Date: 4 Nov 2002 06:34:34 -0000 From: rbrown64@csc.com.au Reply-To: rbrown64@csc.com.au To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: other/8444: fastjar needs an ANSI compiler to build >Number: 8444 >Category: other >Synopsis: fastjar needs an ANSI compiler to build >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sun Nov 03 22:36:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: rbrown64@csc.com.au >Release: 3.2 >Organization: >Environment: hppa1.1-hp-hpux10.20 --with-gnu-as >Description: Build gcc-3.2 on hpux10.20 using the unbundled HP compiler failed compiling fastjar because the compiler was left in K&R mode. If fastjar requires an ANSI compiler shouldn't it be built with the target compiler when host == target? make[2]: Entering directory `/devel/src/gcc-3.2.obj/fastjar' cc -DHAVE_CONFIG_H -I. -I..../gcc-3.2/fastjar -I. -I. -I..../gcc-3.2/fastjar \ -I..../gcc-3.2/fa stjar/../zlib -I..../gcc-3.2/fastjar/../include -g -c \ ..../gcc-3.2/fastjar/jartool.c cc: "..../gcc-3.2/fastjar/dostime.h", line 22: error 1000: \ Unexpected symbol: "*". cc: "..../gcc-3.2/fastjar/pushback.h", line 22: error 1000: \ Unexpected symbol: "ub1". cc: "..../gcc-3.2/fastjar/pushback.h", line 30,31,32,83,85: error 1000: \ Unexpected symbol: "*". cc: "..../gcc-3.2/fastjar/compress.h", line 85: error 1000: \ Unexpected symbol: "ub4". cc: "..../gcc-3.2/fastjar/jartool.c", line 267: error 1000: \ Unexpected symbol: "*". cc: "..../gcc-3.2/fastjar/dostime.h", line 20: error 1705: \ Function prototypes are an ANSI feature. cc: "..../gcc-3.2/fastjar/dostime.h", line 21: error 1705: \ Function prototypes are an ANSI feature. cc: "..../gcc-3.2/fastjar/dostime.h", line 22: error 1506: \ Parameters allowed in function definition only. cc: "..../gcc-3.2/fastjar/pushback.h", line 22: error 1573 : \ Type of "pb_buff" is undefined due to an illegal declaration. >How-To-Repeat: >Fix: Workaround: edit the build fastjar/Makefile to set CC to the newly built compiler. >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23931-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 07:46:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 6292 invoked by alias); 4 Nov 2002 07:46:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 6225 invoked by uid 71); 4 Nov 2002 07:46:01 -0000 Resent-Date: 4 Nov 2002 07:46:01 -0000 Resent-Message-ID: <20021104074601.6223.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, eckmann@sources.redhat.com Received: (qmail 24317 invoked by uid 61); 4 Nov 2002 07:42:06 -0000 Message-Id: <20021104074206.24316.qmail@sources.redhat.com> Date: 4 Nov 2002 07:42:06 -0000 From: eckmann@sources.redhat.com Reply-To: eckmann@sources.redhat.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: fortran/8445: optimizer bug? >Number: 8445 >Category: fortran >Synopsis: optimizer bug? >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sun Nov 03 23:46:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: eckmann >Release: unknown-1.0 >Organization: >Environment: >Description: changing optimizations from O0 to O1 changes output from 1 to 2 lines. There is no problem on macs. but it appears on RH with gcc 2.95.2 and 2.95.3 on ix86 >How-To-Repeat: g77 -O0 bug.f -o bug;bug -------------------------------------- g77 version 2.95.2 19991024 (release) (from FSF-g77 version 0.5.25 19991024 (release)) Driving: g77 -ffixed-line-length-none -v bug.f -o bug -lg2c -lm Reading specs from /usr/local/gcc-2.95.2/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/specs gcc version 2.95.2 19991024 (release) /usr/local/gcc-2.95.2/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/f771 bug.f -quiet -dumpbase bug.f -version -fversion -ffixed-line-length-none -o /tmp/cckHiTym.s GNU F77 version 2.95.2 19991024 (release) (i686-pc-linux-gnu) compiled by GNU C version 2.95.2 19991024 (release). GNU Fortran Front End version 0.5.25 19991024 (release) as -V -Qy -o /tmp/ccAPMuUB.o /tmp/cckHiTym.s GNU assembler version 2.9.1 (i386-redhat-linux), using BFD version 2.9.1.0.24 /usr/local/gcc-2.95.2/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o bug /usr/lib/crt1.o /usr/lib/crti.o /usr/local/gcc-2.95.2/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/crtbegin.o -L/usr/local/gcc-2.95.2/lib/gcc-lib/i686-pc-linux-gnu/2.95.2 -L/usr/local/gcc-2.95.2/lib /tmp/ccAPMuUB.o -lg2c -lm -lgcc -lc -lgcc /usr/local/gcc-2.95.2/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/crtend.o /usr/lib/crtn.o ------------------------- similar on RH72, with gcc-2.95.3 >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="bug.f" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bug.f" ICAgICAgaW1wbGljaXQgbm9uZQogICAgICBpbnRlZ2VyKjQgaSxqCiAgICAgIGludGVnZXIqNCBu cyxuc3QsY291bnRlcgogICAgICByZWFsKjggc29ydGVkKDEwKQogICAgICByZWFsKjggcQpjICAg ICAgY29tbW9uIHNvcnRlZCxucyxpLHEKCiAgICAgIGludGVnZXIqNCBudW1iZXJzKDIpCiAgICAg IAogICAgICAKICAgICAgbnVtYmVycygxKT01NDI1CiAgICAgIG51bWJlcnMoMik9bnVtYmVycygx KQogICAgICBzb3J0ZWQoMSk9MAogICAgICBzb3J0ZWQoMik9MS4KICAgICAgbnM9MgoKICAgICAg ZG8gY291bnRlcj0wLDEKICAgICAgICAgcT1udW1iZXJzKGNvdW50ZXIrMSkvMTAwMDAuMEQwMAog ICAgICAgICBuc3Q9bnMKICAgICAgICAgZG8gaT0xLG5zdAogICAgICAgICAgICBpZiAocS5lcS5z b3J0ZWQoaSkpIHRoZW4gCiAgICAgICAgICAgICAgIGdvdG8gMiAKICAgICAgICAgICAgZW5kaWYg CiAgICAgICAgICAgIGlmIChxLmx0LnNvcnRlZChpKS5hbmQuIHEuZ3Quc29ydGVkKGktMSkpIHRo ZW4gCiAgICAgICAgICAgICAgIGRvIGo9bnN0KzEsaSsxLC0xCiAgICAgICAgICAgICAgICAgIHNv cnRlZChqKT1zb3J0ZWQoai0xKQogICAgICAgICAgICAgICBlbmRkbyAKICAgICAgICAgICAgICAg c29ydGVkKGkpPXEKICAgICAgICAgICAgICAgbnM9bnMrMQogICAgICAgICAgICAgICBnb3RvIDIg CiAgICAgICAgICAgIGVuZGlmIAogICAgICAgICBlbmRkbyAKICAgICAgICAgcHJpbnQgKiwnc2hv dWxkIG5vdCBoYXZlIGdvdHRlbiBoZXJlJwogICAgICAgICBzdG9wCiAyICAgICAgIGNvbnRpbnVl IAogICAgICBlbmRkbyAKICAgICAgZG8gaT0yLG5zLTEKICAgICAgICAgcHJpbnQgKiwgaSxzb3J0 ZWQoaSkKICAgICAgZW5kZG8gCgoKICAgICAgZW5kCgogICAgICAK From gcc-prs-return-23932-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 09:26:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 29709 invoked by alias); 4 Nov 2002 09:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 29682 invoked by uid 71); 4 Nov 2002 09:26:01 -0000 Date: 4 Nov 2002 09:26:01 -0000 Message-ID: <20021104092601.29672.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Sebastian Setzer Subject: Re: libstdc++/8319: warnings out of system headers Reply-To: Sebastian Setzer The following reply was made to PR libstdc++/8319; it has been noted by GNATS. From: Sebastian Setzer To: bkoz@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, setzersn@gmx.de, gcc-gnats@gcc.gnu.org Cc: Subject: Re: libstdc++/8319: warnings out of system headers Date: Mon, 4 Nov 2002 10:23:52 +0100 On Fri, Nov 01, 2002 at 04:38:38PM -0000, bkoz@gcc.gnu.org wrote: > Synopsis: warnings out of system headers > > State-Changed-From-To: open->feedback > State-Changed-By: bkoz > State-Changed-When: Fri Nov 1 08:38:37 2002 > State-Changed-Why: > You shouldn't need to set any of these environment variables. > > > But now I get warnings out of system-headers > > (which I shouldn't, should I ?) > > Doing what? You'll need to give a testcase before anybody can really look at this. Just as I wrote in "How-To-Repeat" : Compile a program with #include (On Solaris ?) For example: #include int main(){} and compile it with "g++ -Wall". > > -benjamin > > http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8319 -- Sebastian Setzer (setzersn@studi oder setzersn@gmx.de) ------------------------------------------------------ Murphy's law of computers: If a computer is operating correctly it is probably broke. (http://www.bbc.co.uk/dna/h2g2/F16027?thread=130117) From gcc-prs-return-23933-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 10:36:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 22524 invoked by alias); 4 Nov 2002 10:36:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 22455 invoked by uid 71); 4 Nov 2002 10:36:01 -0000 Resent-Date: 4 Nov 2002 10:36:01 -0000 Resent-Message-ID: <20021104103601.22454.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, hb@gcc.x256.org Received: (qmail 17304 invoked by uid 61); 4 Nov 2002 10:34:38 -0000 Message-Id: <20021104103438.17303.qmail@sources.redhat.com> Date: 4 Nov 2002 10:34:38 -0000 From: hb@gcc.x256.org Reply-To: hb@gcc.x256.org To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: debug/8446: stabs generation crashes when class inherits from typedef struct >Number: 8446 >Category: debug >Synopsis: stabs generation crashes when class inherits from typedef struct >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Mon Nov 04 02:36:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: Nicholas Vinen >Release: 3.2 >Organization: >Environment: i686-pc-linux-gnu (SuSE 7.3) >Description: The small file below causes GCC 3.2 to crash. It is because the STABS debug record generator can't handle classes which derive from typedef'd structs. Most other debug outputs can, and GCC compiles it fine. I am currently downloading the CVS version to see if it happens there too, but it isn't finished yet. >How-To-Repeat: g++ -gstabs test2.cc >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: text/plain; name="test2.cc" Content-Disposition: inline; filename="test2.cc" typedef struct { int a; } foo; class bar : public foo { }; int main(void) { return 0; } From gcc-prs-return-23934-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 11:06:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 5330 invoked by alias); 4 Nov 2002 11:06:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 5294 invoked by uid 71); 4 Nov 2002 11:06:03 -0000 Date: 4 Nov 2002 11:06:03 -0000 Message-ID: <20021104110603.5276.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Bruce Allen Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Reply-To: Bruce Allen The following reply was made to PR c/8395; it has been noted by GNATS. From: Bruce Allen To: Marco Bernardo Cc: Bruce Allen , gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Date: Mon, 4 Nov 2002 04:58:02 -0600 (CST) > 2. I hope we all agree on the fact that the output produced by > a (sequential) C program is the same for a given input, > regardless of the compilation options that are used. Absolutely false! C does not specify the order in which mathematical expressions are evaluated, unless the programmer makes these completely explicity. And indeed compiling with optimizations turned on can eliminate many subexpressions, cause compile-time evaluatiosn, register sorage etc, which can also change results. Bruce Allen From gcc-prs-return-23935-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 12:06:05 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 23288 invoked by alias); 4 Nov 2002 12:06:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 23223 invoked by uid 71); 4 Nov 2002 12:06:02 -0000 Resent-Date: 4 Nov 2002 12:06:02 -0000 Resent-Message-ID: <20021104120602.23222.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, java-prs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, vruiz@ual.es Received: (qmail 22035 invoked by uid 61); 4 Nov 2002 11:56:44 -0000 Message-Id: <20021104115644.22032.qmail@sources.redhat.com> Date: 4 Nov 2002 11:56:44 -0000 From: vruiz@ual.es Reply-To: vruiz@ual.es To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: java/8447: java/lang/Thread.java:0: Internal error: Segmentation fault >Number: 8447 >Category: java >Synopsis: java/lang/Thread.java:0: Internal error: Segmentation fault >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Mon Nov 04 04:06:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: vruiz@ual.es >Release: gcc version 2.95.4 20011002 (Debian prerelease) >Organization: >Environment: Linux version 2.2.20 (herbert@gondolin) (gcc version 2.7.2.3) #1 Sun Nov 4 15:44:23 EST 2001 Debian GNU/Linux testing/unstable gogh.ace.ual.es >Description: I found these error compiling the file: import java.io.InputStream; import java.io.OutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; public class ShortToFloat extends GenericProducerAndConsumer { ShortToFloat(InputStream input, OutputStream output) { super(input,output); } protected void ProduceAndConsume() { int verbosity = 2; DataInputStream dataInput = new DataInputStream(input); DataOutputStream dataOutput = new DataOutputStream(output); try { for(;;) { int x = dataInput.readShort(); float y = x; dataOutput.writeFloat(y); } } catch (IOException e) { if(verbosity > 0) { System.err.println("ShortToFloat: EOF reached"); if(verbosity > 1) { e.printStackTrace(); } } try { dataOutput.flush(); } catch (IOException ee) {} } } public static void main(String[] args) { if(args.length > 0) { System.err.println("ShortToFloat < ShortFile > FloatFile"); } else { DataInputStream input = new DataInputStream(System.in); DataOutputStream output = new DataOutputStream(System.out); ShortToFloat converter = new ShortToFloat(input,output); converter.start(); } } } The father file GenericProducerAndConsumer.java is: import java.io.InputStream; import java.io.OutputStream; public abstract class GenericProducerAndConsumer implements Runnable { InputStream input; OutputStream output; Thread theThread; /* El constructor lanza el thread */ public GenericProducerAndConsumer(InputStream input, OutputStream output) { this.input = input; this.output = output; theThread = new Thread(this); } /* Lanza el hilo productor/consumidor */ public void start() { theThread.start(); } /* Funci'on espec'ifica de producci'on de datos */ protected abstract void ProduceAndConsume(); /* Lanza la producci'on de datos */ public void run() { ProduceAndConsume(); } } The compiling line is: gcj -c ShortToFloat.java And the output is: ShortToFloat.java:0: warning: Source file for class `GenericProducerAndConsumer' is newer than its matching class file. Source file used instead java/lang/Thread.java:0: Internal error: Segmentation fault Please submit a full bug report, with preprocessed source if appropriate. See for instructions. I hope this help. Vicente. >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23936-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 12:07:05 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 27298 invoked by alias); 4 Nov 2002 12:07:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 27259 invoked by uid 61); 4 Nov 2002 12:07:03 -0000 Date: 4 Nov 2002 12:07:03 -0000 Message-ID: <20021104120703.27258.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, pinskia@physics.uc.edu From: rth@gcc.gnu.org Reply-To: rth@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, pinskia@physics.uc.edu, gcc-gnats@gcc.gnu.org Subject: Re: middle-end/8408: [mainline regression] simple legal c program ice in fixup_var_refs_1, at function.c:1938 Synopsis: [mainline regression] simple legal c program ice in fixup_var_refs_1, at function.c:1938 State-Changed-From-To: analyzed->closed State-Changed-By: rth State-Changed-When: Mon Nov 4 04:07:03 2002 State-Changed-Why: http://gcc.gnu.org/ml/gcc-patches/2002-11/msg00129.html http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8408 From gcc-prs-return-23937-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 12:53:16 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 2802 invoked by alias); 4 Nov 2002 12:53:14 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 2757 invoked by uid 61); 4 Nov 2002 12:53:13 -0000 Date: 4 Nov 2002 12:53:13 -0000 Message-ID: <20021104125313.2755.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, marc-oliver.gewaltig@hre-ftr.f.rd.honda.co.jp, paolo@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, marc-oliver.gewaltig@hre-ftr.f.rd.honda.co.jp, paolo@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8399: sync_with_stdio(false) breaks unformatted input Synopsis: sync_with_stdio(false) breaks unformatted input State-Changed-From-To: feedback->analyzed State-Changed-By: paolo State-Changed-When: Mon Nov 4 04:53:11 2002 State-Changed-Why: For some utterly misterious reason, today I can reproduce the problem, both 3.2.1 and 3.3. --- paolo:~/Gcc/PRs/v3/Analyzed> a.out paolo:~/Gcc/PRs/v3/Analyzed> a.out c= a b c a c= c= b c= c= c c= c= --- Sorry, Paolo. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8399 From gcc-prs-return-23938-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 12:59:26 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25772 invoked by alias); 4 Nov 2002 12:59:23 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 25749 invoked by uid 61); 4 Nov 2002 12:59:23 -0000 Date: 4 Nov 2002 12:59:23 -0000 Message-ID: <20021104125923.25748.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, marc-oliver.gewaltig@hre-ftr.f.rd.honda.co.jp, nobody@gcc.gnu.org, paolo@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, marc-oliver.gewaltig@hre-ftr.f.rd.honda.co.jp, nobody@gcc.gnu.org, paolo@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8399: sync_with_stdio(false) breaks unformatted input Synopsis: sync_with_stdio(false) breaks unformatted input Responsible-Changed-From-To: paolo->unassigned Responsible-Changed-By: paolo Responsible-Changed-When: Mon Nov 4 04:59:22 2002 Responsible-Changed-Why: . http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8399 From gcc-prs-return-23939-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 14:56:08 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 2199 invoked by alias); 4 Nov 2002 14:56:05 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 2162 invoked by uid 71); 4 Nov 2002 14:56:04 -0000 Resent-Date: 4 Nov 2002 14:56:03 -0000 Resent-Message-ID: <20021104145603.2161.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, bagnara@cs.unipr.it Received: (qmail 32601 invoked by uid 61); 4 Nov 2002 14:54:53 -0000 Message-Id: <20021104145453.32599.qmail@sources.redhat.com> Date: 4 Nov 2002 14:54:53 -0000 From: bagnara@cs.unipr.it Reply-To: bagnara@cs.unipr.it To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8448: Regression from gcc 2.96 concerning nested namespaces >Number: 8448 >Category: c++ >Synopsis: Regression from gcc 2.96 concerning nested namespaces >Confidential: no >Severity: critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Mon Nov 04 06:56:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Roberto Bagnara >Release: 3.2 >Organization: >Environment: RedHat 8.0 Linux zoltan.unisuv.it 2.4.19 #31 Mon Oct 28 14:17:54 CET 2002 i686 athlon i386 GNU/Linux >Description: The attached program shows a problem with nested namespaces. An output operator is not "seen" if it is within a nested namespace. The attached program compiles fine with gcc 2.96 20000731 (Red Hat Linux 7.2 2.96-108.7.2), with Comeau C/C++ 4.3.0.1, and with Intel's icc 6.0.1. It does not compile, however, with gcc 3.2. (I apologize for referring to gcc 2.96, a non-release, but I do not have any other version of gcc handy.) >How-To-Repeat: $g++ -v Reading specs from /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.2/specs Configured with: ../gcc-3.2/configure --prefix=/usr/local Thread model: posix gcc version 3.2 $ g++ -c -W -Wall gccbug.cc /usr/local/include/c++/3.2/bits/stream_iterator.h: In member function `std::ostream_iterator<_Tp, _CharT, _Traits>& std::ostream_iterator<_Tp, _CharT, _Traits>::operator=(const _Tp&) [with _Tp = Parma_Polyhedra_Library::Constraint, _CharT = char, _Traits = std::char_traits]': /usr/local/include/c++/3.2/bits/stl_algobase.h:228: instantiated from `_OutputIter std::__copy(_InputIter, _InputIter, _OutputIter, std::input_iterator_tag) [with _InputIter = Parma_Polyhedra_Library::ConSys::const_iterator, _OutputIter = std::ostream_iterator >]' /usr/local/include/c++/3.2/bits/stl_algobase.h:260: instantiated from `_OutputIter std::__copy_aux2(_InputIter, _InputIter, _OutputIter, __false_type) [with _InputIter = Parma_Polyhedra_Library::ConSys::const_iterator, _OutputIter = std::ostream_iterator >]' /usr/local/include/c++/3.2/bits/stl_algobase.h:303: instantiated from `_OutputIter std::__copy_ni2(_InputIter, _InputIter, _OutputIter, __false_type) [with _InputIter = Parma_Polyhedra_Library::ConSys::const_iterator, _OutputIter = std::ostream_iterator >]' /usr/local/include/c++/3.2/bits/stl_algobase.h:323: instantiated from `_OutputIter std::__copy_ni1(_InputIter, _InputIter, _OutputIter, __false_type) [with _InputIter = Parma_Polyhedra_Library::ConSys::const_iterator, _OutputIter = std::ostream_iterator >]' /usr/local/include/c++/3.2/bits/stl_algobase.h:349: instantiated from `_OutputIter std::copy(_InputIter, _InputIter, _OutputIter) [with _InputIter = Parma_Polyhedra_Library::ConSys::const_iterator, _OutputIter = std::ostream_iterator >]' gccbug.cc:68: instantiated from here /usr/local/include/c++/3.2/bits/stream_iterator.h:141: no match for ` std::basic_ostream >& << const Parma_Polyhedra_Library::Constraint&' operator /usr/local/include/c++/3.2/bits/ostream.tcc:55: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:77: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:99: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base&(*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:171: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:208: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:146: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:104: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:115: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:119: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:130: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:234: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:272: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:298: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:145: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:323: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:348: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:120: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:211: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:500: std::basic_ostream& std::operator<<(std::basic_ostream&, char) [with _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:222: std::basic_ostream& std::operator<<(std::basic_ostream&, signed char) [with _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:227: std::basic_ostream& std::operator<<(std::basic_ostream&, unsigned char) [with _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:572: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) [with _CharT = char, _Traits = std::char_traits] /usr/local/include/c++/3.2/bits/ostream.tcc:622: std::basic_ostream& std::operator<<(std::basic_ostream&, const char*) [with _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:246: std::basic_ostream& std::operator<<(std::basic_ostream&, const signed char*) [with _Traits = std::char_traits] /usr/local/include/c++/3.2/ostream:251: std::basic_ostream& std::operator<<(std::basic_ostream&, const unsigned char*) [with _Traits = std::char_traits] >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="gccbug.cc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gccbug.cc" Ci8vIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gc2VlIHRoZSBwcm9ibGVtIGdvIGF3 YXkuCi8vI2RlZmluZSBOT19ORVNURURfTkFNRVNQQUNFCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNp bmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCm5hbWVzcGFjZSBQYXJtYV9Q b2x5aGVkcmFfTGlicmFyeSB7CgpjbGFzcyBDb25zdHJhaW50IHsKfTsKCmNsYXNzIENvblN5cyB7 CnB1YmxpYzoKICBDb25TeXMoKTsKICBDb25TeXMoY29uc3QgQ29uU3lzJiBjcyk7CiAgfkNvblN5 cygpOwogIENvblN5cyYgb3BlcmF0b3I9KGNvbnN0IENvblN5cyYgeSk7CgogIGNsYXNzIGNvbnN0 X2l0ZXJhdG9yCiAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRv cl90YWcsCgkJCSAgIENvbnN0cmFpbnQsCgkJCSAgIHZvaWQsCgkJCSAgIGNvbnN0IENvbnN0cmFp bnQqLAoJCQkgICBjb25zdCBDb25zdHJhaW50Jj4gewogIHB1YmxpYzoKICAgIGNvbnN0X2l0ZXJh dG9yKCk7CiAgICBjb25zdF9pdGVyYXRvcihjb25zdCBjb25zdF9pdGVyYXRvciYgeSk7CiAgICB+ Y29uc3RfaXRlcmF0b3IoKTsKICAgIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgY29u c3RfaXRlcmF0b3ImIHkpOwogICAgY29uc3QgQ29uc3RyYWludCYgb3BlcmF0b3IqKCkgY29uc3Q7 CiAgICBjb25zdCBDb25zdHJhaW50KiBvcGVyYXRvci0+KCkgY29uc3Q7CiAgICBjb25zdF9pdGVy YXRvciYgb3BlcmF0b3IrKygpOwogICAgY29uc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpOwog ICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiB5KSBjb25zdDsKICAgIGJv b2wgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciYgeSkgY29uc3Q7CiAgfTsKCiAgY29u c3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdDsK fTsKCiNpZm5kZWYgTk9fTkVTVEVEX05BTUVTUEFDRQpuYW1lc3BhY2UgSU9fT3BlcmF0b3JzIHsK I2VuZGlmCgovLyBnKysgc2VlbXMgbm90IHRvIHNlZSB0aGlzIGRlY2xhcmF0aW9uIGlmIE5PX05F U1RFRF9OQU1FU1BBQ0UgaXMgbm90IGRlZmluZWQuCnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChz dGQ6Om9zdHJlYW0mIHMsIGNvbnN0IENvbnN0cmFpbnQmIGMpOwoKI2lmbmRlZiBOT19ORVNURURf TkFNRVNQQUNFCn0gLy8gbmFtZXNwYWNlIElPX09wZXJhdG9ycwojZW5kaWYKCn0gLy8gbmFtZXNw YWNlIFBhcm1hX1BvbHloZWRyYV9MaWJyYXJ5CgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcg bmFtZXNwYWNlIFBhcm1hX1BvbHloZWRyYV9MaWJyYXJ5OwoKI2lmbmRlZiBOT19ORVNURURfTkFN RVNQQUNFCnVzaW5nIG5hbWVzcGFjZSBQYXJtYV9Qb2x5aGVkcmFfTGlicmFyeTo6SU9fT3BlcmF0 b3JzOwojZW5kaWYKCnZvaWQgZm9vKCkgewogIENvblN5cyBjczsKICBjb3B5KGNzLmJlZ2luKCks IGNzLmVuZCgpLAogICAgICAgb3N0cmVhbV9pdGVyYXRvcjxDb25zdHJhaW50Pihjb3V0LCAiXG4i KSk7Cn0K From gcc-prs-return-23940-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 15:13:33 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 15984 invoked by alias); 4 Nov 2002 15:13:30 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 15918 invoked by uid 61); 4 Nov 2002 15:13:29 -0000 Date: 4 Nov 2002 15:13:29 -0000 Message-ID: <20021104151329.15917.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rl@tempest-sw.com From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rl@tempest-sw.com, gcc-gnats@gcc.gnu.org Subject: Re: c++/8427: internal error on ambiguous function template Synopsis: internal error on ambiguous function template State-Changed-From-To: feedback->open State-Changed-By: bangerth State-Changed-When: Mon Nov 4 07:13:28 2002 State-Changed-Why: Attachment provided: --------------------------- template struct g {}; template void f(g) { } template void f(g) { } int main() { f<4,2>(g<4/2>()); } http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8427 From gcc-prs-return-23941-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 15:17:44 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 26543 invoked by alias); 4 Nov 2002 15:17:44 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 26506 invoked by uid 61); 4 Nov 2002 15:17:43 -0000 Date: 4 Nov 2002 15:17:43 -0000 Message-ID: <20021104151743.26504.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rl@tempest-sw.com From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rl@tempest-sw.com, gcc-gnats@gcc.gnu.org Subject: Re: c++/8427: internal error on ambiguous function template Synopsis: internal error on ambiguous function template State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Mon Nov 4 07:17:42 2002 State-Changed-Why: gcc 3.3 now says ----------------------------- home/bangerth> /home/bangerth/bin/gcc-3.3-pre/bin/c++ -c gcc01.cpp -o /dev/null gcc01.cpp: In function `int main()': gcc01.cpp:8: error: call of overloaded `f(g<2>)' is ambiguous gcc01.cpp:3: error: candidates are: void f(g<(i / j)>) [with int i = 4, int j = 2] gcc01.cpp:4: error: void f(g) [with int i = 4, int j = 2] The message seems correct to me. I think you're just out of luck here, since the language does not provide you with a way to disambiguate which function you wanted to call. Regards W. Original code: template struct g {}; template void f(g) { } template void f(g) { } int main() { f<4,2>(g<4/2>()); } http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8427 From gcc-prs-return-23942-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 15:43:30 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 6345 invoked by alias); 4 Nov 2002 15:43:29 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 6321 invoked by uid 61); 4 Nov 2002 15:43:28 -0000 Date: 4 Nov 2002 15:43:28 -0000 Message-ID: <20021104154328.6320.qmail@sources.redhat.com> To: bagnara@cs.unipr.it, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, paolo@gcc.gnu.org From: paolo@gcc.gnu.org Reply-To: paolo@gcc.gnu.org, bagnara@cs.unipr.it, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, paolo@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8448: Regression from gcc 2.96 concerning nested namespaces Synopsis: Regression from gcc 2.96 concerning nested namespaces Responsible-Changed-From-To: unassigned->paolo Responsible-Changed-By: paolo Responsible-Changed-When: Mon Nov 4 07:43:26 2002 Responsible-Changed-Why: . State-Changed-From-To: open->feedback State-Changed-By: paolo State-Changed-When: Mon Nov 4 07:43:26 2002 State-Changed-Why: Ciao Roberto. It doesn't compile for me with Comeau in *strict* mode (i.e., --strict switch, -Xc for Intel), just tested with the online compiler. First blush, seems to me very similar to c++/8279 (not a bug) ... http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8448 From gcc-prs-return-23943-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 15:46:11 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 15056 invoked by alias); 4 Nov 2002 15:46:10 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14976 invoked by uid 71); 4 Nov 2002 15:46:08 -0000 Date: 4 Nov 2002 15:46:08 -0000 Message-ID: <20021104154608.14939.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Matthias Posseldt Subject: Re: c/4943: pointer address corruption in function call Reply-To: Matthias Posseldt The following reply was made to PR c/4943; it has been noted by GNATS. From: Matthias Posseldt To: gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org, cbenna@iol.it Cc: Subject: Re: c/4943: pointer address corruption in function call Date: Mon, 4 Nov 2002 16:37:10 +0100 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4943 I have found this issue in GCC 3.2 release and have a simple 2kb testcase C file and compile parameter/output analysis. If anyone is interested I would like to share the knowledge I won about this bug. I could reproduce it with two linux (ver 2.4.19) gcc 3.2 (release) machines, one Athlon XP, one Pentium 3. Ciao, Matthias From gcc-prs-return-23944-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 15:46:17 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 15284 invoked by alias); 4 Nov 2002 15:46:16 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 15235 invoked by uid 61); 4 Nov 2002 15:46:15 -0000 Date: 4 Nov 2002 15:46:15 -0000 Message-ID: <20021104154615.15233.qmail@sources.redhat.com> To: bennyb@ntplx.net, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, bennyb@ntplx.net, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8438: Internal compiler error building Trolltech Qt library Synopsis: Internal compiler error building Trolltech Qt library State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Mon Nov 4 07:46:12 2002 State-Changed-Why: You are using a very old compiler (a 2.95.3 prerelease). In any case, I cannot reproduce the error with 2.95.3, 3.2.1pre and present CVS. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8438 From gcc-prs-return-23945-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 15:55:12 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 16027 invoked by alias); 4 Nov 2002 15:55:11 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 16006 invoked by uid 61); 4 Nov 2002 15:55:11 -0000 Date: 4 Nov 2002 15:55:11 -0000 Message-ID: <20021104155511.16003.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, jcab@JCABs-Rumblings.com, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, jcab@JCABs-Rumblings.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8442: Wrongful compiler error - file available Synopsis: Wrongful compiler error - file available State-Changed-From-To: open->analyzed State-Changed-By: bangerth State-Changed-When: Mon Nov 4 07:55:10 2002 State-Changed-Why: I can confirm the messages on Linux from your preprocessed sources, but it is very hard to tell whether they are justfied or not, as the file has some 59,000 lines and invokes all kinds of template stuff (not that I would be unused to that but this seems messy). Could you try to condense the problem into a smaller testcase where it is simpler to see whether the error is justified or not? Thanks Wolfgang http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8442 From gcc-prs-return-23946-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 16:01:38 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 3215 invoked by alias); 4 Nov 2002 16:01:36 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 3173 invoked by uid 61); 4 Nov 2002 16:01:35 -0000 Date: 4 Nov 2002 16:01:35 -0000 Message-ID: <20021104160135.3170.qmail@sources.redhat.com> To: bagnara@cs.unipr.it, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, paolo@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, bagnara@cs.unipr.it, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, paolo@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8448: Regression from gcc 2.96 concerning nested namespaces Synopsis: Regression from gcc 2.96 concerning nested namespaces State-Changed-From-To: feedback->closed State-Changed-By: bangerth State-Changed-When: Mon Nov 4 08:01:33 2002 State-Changed-Why: Paolo is right. Your op<< is in another namespace, and the using directive only makes it visible in the global namespace, but not where it is needed: in std::copy or std::ostream_iterator. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8448 From gcc-prs-return-23947-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 16:15:11 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12190 invoked by alias); 4 Nov 2002 16:15:09 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12133 invoked by uid 61); 4 Nov 2002 16:15:08 -0000 Date: 4 Nov 2002 16:15:08 -0000 Message-ID: <20021104161508.12132.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, zyzstar@ibl.sk From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, zyzstar@ibl.sk, gcc-gnats@gcc.gnu.org Subject: Re: c++/8171: pointers to member functions comparison Synopsis: pointers to member functions comparison State-Changed-From-To: open->analyzed State-Changed-By: bangerth State-Changed-When: Mon Nov 4 08:15:06 2002 State-Changed-Why: I agree. In particular, the referenced part of the standard states: Pointer to member conversions(_conv.mem_) and qualification conversions (_conv.qual_) are performed to bring them to a common type. This does not seem to happen. (Conversion by hand yields the desired result though, so there is a way to work around this problem.) W. PS: As a sidenote (for the curious), the standard also says this on comparing pointers to member functions: if either [operand] is a pointer to a virtual member func- tion, the result is unspecified That seems like a trap you don't want to fall into... (And there isn't even a way for the compiler to warn you about.) http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8171 From gcc-prs-return-23948-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 16:26:03 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 3358 invoked by alias); 4 Nov 2002 16:26:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 3332 invoked by uid 71); 4 Nov 2002 16:26:01 -0000 Resent-Date: 4 Nov 2002 16:26:01 -0000 Resent-Message-ID: <20021104162601.3331.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, ehrhardt@mathematik.uni-ulm.de Received: (qmail 31123 invoked by uid 61); 4 Nov 2002 16:24:25 -0000 Message-Id: <20021104162425.31121.qmail@sources.redhat.com> Date: 4 Nov 2002 16:24:25 -0000 From: ehrhardt@mathematik.uni-ulm.de Reply-To: ehrhardt@mathematik.uni-ulm.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: preprocessor/8449: Ellipsis in 3...5 not recognized properly >Number: 8449 >Category: preprocessor >Synopsis: Ellipsis in 3...5 not recognized properly >Confidential: no >Severity: non-critical >Priority: medium >Responsible: unassigned >State: open >Class: rejects-legal >Submitter-Id: net >Arrival-Date: Mon Nov 04 08:26:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: Christian Ehrhardt >Release: gcc-3.2 >Organization: >Environment: Reading specs from /usr/local/bin/../lib/gcc-lib/sparc-sun-solaris2.9/3.2/specs Configured with: /export/local/manager/playground/ULMgcc32/src/gcc-3.2/configure --with-ld=/usr/local/bin/ld --with-gnu-ld --with-as=/usr/local/bin/as --with-gnu-as --prefix=/usr/local/ Thread model: posix gcc version 3.2 SunOS perseus 5.9 Generic_112233-01 sun4u sparc SUNW,Ultra-5_10 >Description: Compiling this: int a[2] = {[0 ...1]=1}; with gcc -c t.c gives an error: gcc -c t9.c t9.c:1: too many decimal points in floating constant The cause is quite obious: The ellipsis is parsed as part of the number. Something along these lines might fix it (only compile tested as of yet) --- cpplex.c.old Mon Nov 4 17:15:08 2002 +++ cpplex.c Mon Nov 4 17:14:45 2002 @@ -527,6 +527,7 @@ { cpp_buffer *buffer = pfile->buffer; unsigned char *dest, *limit; + int dotdot = 0; dest = BUFF_FRONT (pfile->u_buff); limit = BUFF_LIMIT (pfile->u_buff); @@ -547,6 +548,11 @@ { do { + /* Is this potentially an ellipsis? */ + if (c == '.' && *(buffer->cur+1) == '.') { + dotdot = 1; + break; + } /* Need room for terminating null. */ if ((size_t) (limit - dest) < 2) { @@ -563,6 +569,8 @@ /* Potential escaped newline? */ buffer->backup_to = buffer->cur - 1; + if (dotdot) + break; if (c != '?' && c != '\\') break; c = skip_escaped_newlines (pfile); >How-To-Repeat: See above. >Fix: Add a space before the ellipsis. >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23949-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 16:46:05 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 28041 invoked by alias); 4 Nov 2002 16:46:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 27933 invoked by uid 71); 4 Nov 2002 16:46:02 -0000 Resent-Date: 4 Nov 2002 16:46:02 -0000 Resent-Message-ID: <20021104164602.27932.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, bkausbk@web.de Received: (qmail 2067 invoked by uid 61); 4 Nov 2002 16:38:00 -0000 Message-Id: <20021104163800.2065.qmail@sources.redhat.com> Date: 4 Nov 2002 16:38:00 -0000 From: bkausbk@web.de Reply-To: bkausbk@web.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: target/8450: Command line switch which disables underscoring >Number: 8450 >Category: target >Synopsis: Command line switch which disables underscoring >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: change-request >Submitter-Id: net >Arrival-Date: Mon Nov 04 08:46:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Benjamin Kalytta >Release: not version specifc >Organization: >Environment: x86 Mingw/Cygwin (Win2k Prof.) >Description: [This only concerns cygwin/mingw target] Please could you add a GCC (LD) command line switch which disables symbol underscoring. Symbol "main" for instance will be "_main" on cygwin/mingw target. But since I don't use any cygwin/mingw libraries I want disable this underscoring for my object files to be compatible with linux or other target object files. Benjamin Kalytta >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23950-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 16:56:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 586 invoked by alias); 4 Nov 2002 16:56:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 559 invoked by uid 71); 4 Nov 2002 16:56:02 -0000 Date: 4 Nov 2002 16:56:02 -0000 Message-ID: <20021104165602.556.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Juan Carlos Arevalo-Baeza Subject: Re: c++/8442: Wrongful compiler error - file available Reply-To: Juan Carlos Arevalo-Baeza The following reply was made to PR c++/8442; it has been noted by GNATS. From: Juan Carlos Arevalo-Baeza To: , , , , , , , , Cc: Subject: Re: c++/8442: Wrongful compiler error - file available Date: Mon, 4 Nov 2002 08:48:05 -0800 On 4 Nov 2002 15:55:11 -0000, bangerth@dealii.org wrote: >Synopsis: Wrongful compiler error - file available > >I can confirm the messages on Linux from your preprocessed >sources, but it is very hard to tell whether they are justfied >or not, as the file has some 59,000 lines and invokes all >kinds of template stuff (not that I would be unused to that >but this seems messy). Yes, Spirit is a complex beast. I'm sorry about that. I've= tried extracting the error bits, but I've been uncuccessful so= far. It seems to me that something in the chain of template= instantiations is fooling the compiler into thinking that either= brace_block_functor is not in scope, or something like that. >Could you try to condense the >problem into a smaller testcase where it is simpler to >see whether the error is justified or not? Maybe I can condense the error as I see it here. The code= looks like this: (line 2304.cpp, line 60573.ii) template < typename ParserT > static functor_parser > brace_block(ParserT const& parser) { return brace_block_functor(parser); }; functor_parser is a template class that takes a single type= parameter, and can be implicitly constructed from that type.= Defined in line 50729.ii. brace_block_functor is defined in the same scope as the= brace_block file above, as a template class that takes a single= template parameter. this_t is the current scope (class scope), but it is= inconsequential (it was a test trying to track down this= problem). You get the same error without it. For some reason, according to the error messages, the compiler= thinks that brace_block_functor should be a type, instead of a= template. I tried generating similar situations using simpler code,= without success. The problem is that the call to this function= is generated kind of deep into the template instantiations, and= extracting the call doesn't seem to show the problem. I'll keep trying. Thanx! =A0=A0=A0Salutaciones, =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0JCAB email: jcab@JCABs-Rumblings.com ICQ: 10913692 @WORK: 101728263 WWW: http://www.JCABs-Rumblings.com From gcc-prs-return-23951-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 16:56:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 631 invoked by alias); 4 Nov 2002 16:56:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 588 invoked by uid 71); 4 Nov 2002 16:56:03 -0000 Date: 4 Nov 2002 16:56:03 -0000 Message-ID: <20021104165603.587.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: "Christian Ehrhardt" Subject: Re: preprocessor/8449: Ellipsis in 3...5 not recognized properly Reply-To: "Christian Ehrhardt" The following reply was made to PR preprocessor/8449; it has been noted by GNATS. From: "Christian Ehrhardt" To: gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, ehrhardt@mathematik.uni-ulm.de, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org Cc: Subject: Re: preprocessor/8449: Ellipsis in 3...5 not recognized properly Date: Mon, 4 Nov 2002 17:51:14 +0100 Hi, sorry for the self followup but: gcc version 3.3 20021101 (experimental) gives an ICE after the error (segmentationfault): $ gcc -Wall t.c t9.c:1:14: too many decimal points in number t9.c:1: internal compiler error: Segmentation Fault Please submit a full bug report, with preprocessed source if appropriate. See for instructions. An even worse test case not fixed by the previous patch is with an escaped newline in the middle of the ellipsis: int a[2] = {[0 .\ ..1] = 2}; regards Christian Ehrhardt http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8449 -- THAT'S ALL FOLKS! From gcc-prs-return-23952-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 16:56:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 684 invoked by alias); 4 Nov 2002 16:56:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 635 invoked by uid 71); 4 Nov 2002 16:56:04 -0000 Date: 4 Nov 2002 16:56:04 -0000 Message-ID: <20021104165604.612.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Wolfgang Bangerth Subject: Re: c++/8442: Wrongful compiler error - file available Reply-To: Wolfgang Bangerth The following reply was made to PR c++/8442; it has been noted by GNATS. From: Wolfgang Bangerth To: Juan Carlos Arevalo-Baeza Cc: gcc-bugs@gcc.gnu.org, , , Subject: Re: c++/8442: Wrongful compiler error - file available Date: Mon, 4 Nov 2002 10:58:35 -0600 (CST) > Yes, Spirit is a complex beast. I'm sorry about that. I've tried > extracting the error bits, but I've been uncuccessful so far. It seems Start from the .ii file you have. First delete all the # lines, I use the following perl script for that usually perl -pi -s 's/^#.*\n//g;' your_file.ii (This way, gcc tells you the real location in the file where something is happening, not the location in the file from which you generated the .ii file.) Then start deleting parts of the file that are not necessary to show the problem. (Function bodies, classes that are only referenced in the function bodies you deleted, classes and namespaces that were only used in classes and namespaces you deleted, etc). In the beginning, the pieces you scrap are usually small, but the blocks can become very large at the end, so don't be scared if you don't make much progress in the beginning. This is a tedious task, and may take an hour or two, but in the end you usually end up with something that has 10-50 lines of code and still shows the problem. With such an example, it is also possible for someone who is not used to your code to see whether this is wrong or right. Otherwise, it is very hard to see... Regards Wolfgang ------------------------------------------------------------------------- Wolfgang Bangerth email: bangerth@ticam.utexas.edu www: http://www.ticam.utexas.edu/~bangerth From gcc-prs-return-23953-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 17:06:08 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 23683 invoked by alias); 4 Nov 2002 17:06:07 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 23619 invoked by uid 71); 4 Nov 2002 17:06:07 -0000 Date: 4 Nov 2002 17:06:07 -0000 Message-ID: <20021104170607.23608.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Marco Bernardo Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Reply-To: Marco Bernardo The following reply was made to PR c/8395; it has been noted by GNATS. From: Marco Bernardo To: Bruce Allen Cc: Bruce Allen , , , , Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Date: Mon, 4 Nov 2002 17:56:51 +0100 (CET) Dear Bruce, Tim and Toone, Thanks for your messages and for the useful information you provided me with. >> 2. I hope we all agree on the fact that the output produced by >> a (sequential) C program is the same for a given input, >> regardless of the compilation options that are used. > >Absolutely false! > >C does not specify the order in which mathematical expressions are >evaluated, unless the programmer makes these completely explicity. > >And indeed compiling with optimizations turned on can eliminate many >subexpressions, cause compile-time evaluatiosn, register sorage etc, which >can also change results. I understand that: - C does not specify the order in which mathematical expressions are evaluated (up to operators precedence and associativity, I guess) - this order is important at run time (as you pointed out to me) - the compiler can change the order in which mathematical expressions are evaluated, especially for optimization purposes However, for a person doing research on the formal semantics of programming languages, it is difficult to accept that two differently compiled versions of the same sequential program return two different values for the same input. The compiler should not be free to alter the semantics of a sequential program, i.e. the program output for a given input! Some consistency should be kept. Anyway, thanks again for your messages. Best regards, Marco @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Prof. Marco Bernardo Universita` di Urbino Centro per l'Applicazione delle Scienze e Tecnologie dell'Informazione Piazza della Repubblica 13, 61029 Urbino, Italy Phone: +39-0722-4475 - E-mail: bernardo@sti.uniurb.it Fax: +39-0722-4475 - WWW: http://www.sti.uniurb.it/bernardo/ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ From gcc-prs-return-23954-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 17:06:11 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 23852 invoked by alias); 4 Nov 2002 17:06:10 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 23813 invoked by uid 71); 4 Nov 2002 17:06:10 -0000 Date: 4 Nov 2002 17:06:10 -0000 Message-ID: <20021104170610.23804.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: "Joseph S. Myers" Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Reply-To: "Joseph S. Myers" The following reply was made to PR c/8395; it has been noted by GNATS. From: "Joseph S. Myers" To: Marco Bernardo Cc: Bruce Allen , Bruce Allen , , , Subject: Re: c/8395: gcc 2.95.4 and 3.2 generate wrong code for double on intel Date: Mon, 4 Nov 2002 17:02:43 +0000 (GMT) On Mon, 4 Nov 2002, Marco Bernardo wrote: > However, for a person doing research on the formal semantics of programming > languages, it is difficult to accept that two differently compiled versions > of the same sequential program return two different values for the same input. > The compiler should not be free to alter the semantics of a sequential program, > i.e. the program output for a given input! Some consistency should be kept. You should read Norrish's thesis (link from the GCC readings page) which gives a (imperfect) formal model in HOL of the semantics of a subset of C90. There are many areas where the program output for a given input is only partially constrained. -- Joseph S. Myers jsm28@cam.ac.uk From gcc-prs-return-23955-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 17:46:10 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 27144 invoked by alias); 4 Nov 2002 17:46:07 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 27103 invoked by uid 71); 4 Nov 2002 17:46:05 -0000 Resent-Date: 4 Nov 2002 17:46:05 -0000 Resent-Message-ID: <20021104174605.27102.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, hartwood@crosslink.net Received: (qmail 12390 invoked by uid 61); 4 Nov 2002 17:40:18 -0000 Message-Id: <20021104174018.12389.qmail@sources.redhat.com> Date: 4 Nov 2002 17:40:18 -0000 From: hartwood@crosslink.net Reply-To: hartwood@crosslink.net To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: other/8451: altivec ice in gcc 3.2 >Number: 8451 >Category: other >Synopsis: altivec ice in gcc 3.2 >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Mon Nov 04 09:46:02 PST 2002 >Closed-Date: >Last-Modified: >Originator: Rick Cellucci >Release: gcc version 3.2: Darwin cross powerpc-wrs-vxworks >Organization: >Environment: Configured with: ../gcc-3.2/configure --prefix=/usr/local/vxworks --with-headers=/Tornado/target/h --enable-altivec --enable-languages=c --disable-shared --with-cpu=7400 --disable-multilib --target=powerpc-wrs-vxworks : (reconfigured) ../gcc-3.2/configure --prefix=/usr/local/vxworks --with-headers=/Tornado/target/h --enable-altivec --enable-languages=c --disable-shared --with-cpu=7400 --disable-multilib --with-gnu-as --with-gnu-ld --target=powerpc-wrs-vxworks Thread model: vxworks >Description: /usr/local/vxworks/lib/gcc-lib/powerpc-wrs-vxworks/3.2/cpp0 -lang-c -v -isystem /usr/local/vxworks/lib/gcc-lib/include -D__GNUC__=3 -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=0 -D__GXX_ABI_VERSION=102 -D__vxworks -D__vxworks__ -D__vxworks -D__vxworks__ -Asystem=vxworks -Asystem=embedded -Acpu=powerpc -Amachine=powerpc -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -D_CALL_SYSV -D__BIG_ENDIAN__ -Amachine=bigendian -D_ARCH_PPC -D__ALTIVEC__ -DCPU_FAMILY=PPC -DCPU=PPC603 source/s.c -Wall s.i ignoring nonexistent directory "/usr/local/vxworks/lib/gcc-lib/include" GNU CPP version 3.2 (cpplib) (PowerPC System V.4) ignoring nonexistent directory "/usr/local/vxworks/powerpc-wrs-vxworks/include" #include "..." search starts here: #include <...> search starts here: /usr/local/vxworks/include /usr/local/vxworks/lib/gcc-lib/powerpc-wrs-vxworks/3.2/include /usr/local/vxworks/powerpc-wrs-vxworks/sys-include End of search list. /usr/local/vxworks/lib/gcc-lib/powerpc-wrs-vxworks/3.2/cc1 -fpreprocessed s.i -quiet -dumpbase s.c -maltivec -mabi=altivec -O1 -Wall -version -o s.s GNU CPP version 3.2 (cpplib) (PowerPC System V.4) GNU C version 3.2 (powerpc-wrs-vxworks) compiled by GNU C version 3.1 20020420 (prerelease). source/s.c: In function `gcc3_2_ice': source/s.c:17: Internal compiler error in extract_bit_field, at expmed.c:1147 Please submit a full bug report, >How-To-Repeat: #include void gcc3_2_ice (const float a) { const vector float small = (const vector float) {1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6}; vector float b; register vector float c; register vector bool int d; register vector float e; * (float *) &b = a; c = vec_splat (b, 0); d = vec_cmplt (e, small); e = c; } >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/x-macbinary; name="s.i" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="s.i" AANzLmkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA0AAAAALnqtzy57BooAAAAbUJJTgAAAAAAAAAA AAAAAAAAAACCgRxDAAAjIDEgInNvdXJjZS9zLmMiCiMgMSAiPGJ1aWx0LWluPiIKIyAxICI8Y29t bWFuZCBsaW5lPiIKIyAxICJzb3VyY2Uvcy5jIgojIDEgIi91c3IvbG9jYWwvdnh3b3Jrcy9saWIv Z2NjLWxpYi9wb3dlcnBjLXdycy12eHdvcmtzLzMuMi9pbmNsdWRlL2FsdGl2ZWMuaCIgMSAzIDQK IyA1MiAiL3Vzci9sb2NhbC92eHdvcmtzL2xpYi9nY2MtbGliL3Bvd2VycGMtd3JzLXZ4d29ya3Mv My4yL2luY2x1ZGUvYWx0aXZlYy5oIiAzIDQKZXh0ZXJuIGludCBfX2FsdGl2ZWNfbGlua19lcnJv cl9pbnZhbGlkX2FyZ3VtZW50ICgpOwojIDIgInNvdXJjZS9zLmMiIDIKCgp2b2lkIGdjYzNfMl9p Y2UgKGNvbnN0IGZsb2F0IGEpCnsKICAgICAgICBjb25zdCBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jf c2l6ZSgxNikpKSBmbG9hdCBzbWFsbCA9IChjb25zdCBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6 ZSgxNikpKSBmbG9hdCkgezEuMGUtNiwgMS4wZS02LCAxLjBlLTYsIDEuMGUtNn07CgogICAgICAg IF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIGZsb2F0IGI7CiAgICAgICAgcmVnaXN0 ZXIgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgZmxvYXQgYzsKICAgICAgICByZWdp c3RlciBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgaW50IGQ7CiAgICAg ICAgcmVnaXN0ZXIgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgZmxvYXQgZTsKCiAg ICAgICAgKiAoZmxvYXQgKikgJmIgPSBhOwogICAgICAgIGMgPSBfX2J1aWx0aW5fY2hvb3NlX2V4 cHIgKChfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wIChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jf c2l6ZSgxNikpKSBzaWduZWQgY2hhciwgdHlwZW9mICgoKGIpKSkpICYmIF9fYnVpbHRpbl90eXBl c19jb21wYXRpYmxlX3AgKGludCwgdHlwZW9mICgoKDApKSkpKSwgKChfX2F0dHJpYnV0ZV9fKCh2 ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgY2hhcikgX19idWlsdGluX2FsdGl2ZWNfdnNwbHRiICgo X19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIGNoYXIpICgoYikpLCAoY29u c3QgY2hhcikgKCgwKSkpKSwgX19idWlsdGluX2Nob29zZV9leHByICgoX19idWlsdGluX3R5cGVz X2NvbXBhdGlibGVfcCAoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIGNo YXIsIHR5cGVvZiAoKChiKSkpKSAmJiBfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wICh1bnNp Z25lZCBpbnQsIHR5cGVvZiAoKCgwKSkpKSksICgoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUo MTYpKSkgc2lnbmVkIGNoYXIpIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcGx0YiAoKF9fYXR0cmlidXRl X18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBjaGFyKSAoKGIpKSwgKGNvbnN0IGNoYXIpICgo MCkpKSksIF9fYnVpbHRpbl9jaG9vc2VfZXhwciAoKF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxl X3AgKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHVuc2lnbmVkIGNoYXIsIHR5cGVv ZiAoKChiKSkpKSAmJiBfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wIChpbnQsIHR5cGVvZiAo KCgwKSkpKSksICgoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgdW5zaWduZWQgY2hh cikgX19idWlsdGluX2FsdGl2ZWNfdnNwbHRiICgoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUo MTYpKSkgc2lnbmVkIGNoYXIpICgoYikpLCAoY29uc3QgY2hhcikgKCgwKSkpKSwgX19idWlsdGlu X2Nob29zZV9leHByICgoX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCAoX19hdHRyaWJ1dGVf XygodmVjdG9yX3NpemUoMTYpKSkgdW5zaWduZWQgY2hhciwgdHlwZW9mICgoKGIpKSkpICYmIF9f YnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKHVuc2lnbmVkIGludCwgdHlwZW9mICgoKDApKSkp KSwgKChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSB1bnNpZ25lZCBjaGFyKSBfX2J1 aWx0aW5fYWx0aXZlY192c3BsdGIgKChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBz aWduZWQgY2hhcikgKChiKSksIChjb25zdCBjaGFyKSAoKDApKSkpLCBfX2J1aWx0aW5fY2hvb3Nl X2V4cHIgKChfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wIChfX2F0dHJpYnV0ZV9fKCh2ZWN0 b3Jfc2l6ZSgxNikpKSBzaWduZWQgc2hvcnQsIHR5cGVvZiAoKChiKSkpKSAmJiBfX2J1aWx0aW5f dHlwZXNfY29tcGF0aWJsZV9wIChpbnQsIHR5cGVvZiAoKCgwKSkpKSksICgoX19hdHRyaWJ1dGVf XygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIHNob3J0KSBfX2J1aWx0aW5fYWx0aXZlY192c3Bs dGggKChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgc2hvcnQpICgoYikp LCAoY29uc3QgY2hhcikgKCgwKSkpKSwgX19idWlsdGluX2Nob29zZV9leHByICgoX19idWlsdGlu X3R5cGVzX2NvbXBhdGlibGVfcCAoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2ln bmVkIHNob3J0LCB0eXBlb2YgKCgoYikpKSkgJiYgX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVf cCAodW5zaWduZWQgaW50LCB0eXBlb2YgKCgoMCkpKSkpLCAoKF9fYXR0cmlidXRlX18oKHZlY3Rv cl9zaXplKDE2KSkpIHNpZ25lZCBzaG9ydCkgX19idWlsdGluX2FsdGl2ZWNfdnNwbHRoICgoX19h dHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIHNob3J0KSAoKGIpKSwgKGNvbnN0 IGNoYXIpICgoMCkpKSksIF9fYnVpbHRpbl9jaG9vc2VfZXhwciAoKF9fYnVpbHRpbl90eXBlc19j b21wYXRpYmxlX3AgKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHVuc2lnbmVkIHNo b3J0LCB0eXBlb2YgKCgoYikpKSkgJiYgX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCAoaW50 LCB0eXBlb2YgKCgoMCkpKSkpLCAoKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHVu c2lnbmVkIHNob3J0KSBfX2J1aWx0aW5fYWx0aXZlY192c3BsdGggKChfX2F0dHJpYnV0ZV9fKCh2 ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgc2hvcnQpICgoYikpLCAoY29uc3QgY2hhcikgKCgwKSkp KSwgX19idWlsdGluX2Nob29zZV9leHByICgoX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCAo X19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgdW5zaWduZWQgc2hvcnQsIHR5cGVvZiAo KChiKSkpKSAmJiBfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wICh1bnNpZ25lZCBpbnQsIHR5 cGVvZiAoKCgwKSkpKSksICgoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgdW5zaWdu ZWQgc2hvcnQpIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcGx0aCAoKF9fYXR0cmlidXRlX18oKHZlY3Rv cl9zaXplKDE2KSkpIHNpZ25lZCBzaG9ydCkgKChiKSksIChjb25zdCBjaGFyKSAoKDApKSkpLCBf X2J1aWx0aW5fY2hvb3NlX2V4cHIgKChfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wIChfX2F0 dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBmbG9hdCwgdHlwZW9mICgoKGIpKSkpICYmIF9f YnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKGludCwgdHlwZW9mICgoKDApKSkpKSwgKChfX2F0 dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBmbG9hdCkgX19idWlsdGluX2FsdGl2ZWNfdnNw bHR3ICgoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIGludCkgKChiKSks IChjb25zdCBjaGFyKSAoKDApKSkpLCBfX2J1aWx0aW5fY2hvb3NlX2V4cHIgKChfX2J1aWx0aW5f dHlwZXNfY29tcGF0aWJsZV9wIChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBmbG9h dCwgdHlwZW9mICgoKGIpKSkpICYmIF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKHVuc2ln bmVkIGludCwgdHlwZW9mICgoKDApKSkpKSwgKChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgx NikpKSBmbG9hdCkgX19idWlsdGluX2FsdGl2ZWNfdnNwbHR3ICgoX19hdHRyaWJ1dGVfXygodmVj dG9yX3NpemUoMTYpKSkgc2lnbmVkIGludCkgKChiKSksIChjb25zdCBjaGFyKSAoKDApKSkpLCBf X2J1aWx0aW5fY2hvb3NlX2V4cHIgKChfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wIChfX2F0 dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgaW50LCB0eXBlb2YgKCgoYikpKSkg JiYgX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCAoaW50LCB0eXBlb2YgKCgoMCkpKSkpLCAo KF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBpbnQpIF9fYnVpbHRpbl9h bHRpdmVjX3ZzcGx0dyAoKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBp bnQpICgoYikpLCAoY29uc3QgY2hhcikgKCgwKSkpKSwgX19idWlsdGluX2Nob29zZV9leHByICgo X19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCAoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUo MTYpKSkgc2lnbmVkIGludCwgdHlwZW9mICgoKGIpKSkpICYmIF9fYnVpbHRpbl90eXBlc19jb21w YXRpYmxlX3AgKHVuc2lnbmVkIGludCwgdHlwZW9mICgoKDApKSkpKSwgKChfX2F0dHJpYnV0ZV9f KCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgaW50KSBfX2J1aWx0aW5fYWx0aXZlY192c3BsdHcg KChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgaW50KSAoKGIpKSwgKGNv bnN0IGNoYXIpICgoMCkpKSksIF9fYnVpbHRpbl9jaG9vc2VfZXhwciAoKF9fYnVpbHRpbl90eXBl c19jb21wYXRpYmxlX3AgKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHVuc2lnbmVk IGludCwgdHlwZW9mICgoKGIpKSkpICYmIF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKGlu dCwgdHlwZW9mICgoKDApKSkpKSwgKChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSB1 bnNpZ25lZCBpbnQpIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcGx0dyAoKF9fYXR0cmlidXRlX18oKHZl Y3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBpbnQpIChiKSwgKGNvbnN0IGNoYXIpICgoMCkpKSksIF9f YnVpbHRpbl9jaG9vc2VfZXhwciAoKF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKF9fYXR0 cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHVuc2lnbmVkIGludCwgdHlwZW9mICgoKGIpKSkp ICYmIF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKHVuc2lnbmVkIGludCwgdHlwZW9mICgo KDApKSkpKSwgKChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSB1bnNpZ25lZCBpbnQp IF9fYnVpbHRpbl9hbHRpdmVjX3ZzcGx0dyAoKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2 KSkpIHNpZ25lZCBpbnQpIChiKSwgKGNvbnN0IGNoYXIpICgoMCkpKSksIF9fYWx0aXZlY19saW5r X2Vycm9yX2ludmFsaWRfYXJndW1lbnQgKCkpKSkpKSkpKSkpKSkpKTsKICAgICAgICBkID0gX19i dWlsdGluX2Nob29zZV9leHByICgoX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCAoX19hdHRy aWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgdW5zaWduZWQgY2hhciwgdHlwZW9mICgoZSkpKSAm JiBfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wIChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6 ZSgxNikpKSB1bnNpZ25lZCBjaGFyLCB0eXBlb2YgKChzbWFsbCkpKSksICgoX19hdHRyaWJ1dGVf XygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIGNoYXIpIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBn dHViICgoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIGNoYXIpIChlKSwg KF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBjaGFyKSAoc21hbGwpKSks IF9fYnVpbHRpbl9jaG9vc2VfZXhwciAoKF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKF9f YXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBjaGFyLCB0eXBlb2YgKChlKSkp ICYmIF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9z aXplKDE2KSkpIHNpZ25lZCBjaGFyLCB0eXBlb2YgKChzbWFsbCkpKSksICgoX19hdHRyaWJ1dGVf XygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIGNoYXIpIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBn dHNiICgoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIGNoYXIpIChlKSwg KF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBjaGFyKSAoc21hbGwpKSks IF9fYnVpbHRpbl9jaG9vc2VfZXhwciAoKF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKF9f YXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHVuc2lnbmVkIHNob3J0LCB0eXBlb2YgKChl KSkpICYmIF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKF9fYXR0cmlidXRlX18oKHZlY3Rv cl9zaXplKDE2KSkpIHVuc2lnbmVkIHNob3J0LCB0eXBlb2YgKChzbWFsbCkpKSksICgoX19hdHRy aWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIHNob3J0KSBfX2J1aWx0aW5fYWx0aXZl Y192Y21wZ3R1aCAoKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBzaG9y dCkgKGUpLCAoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIHNob3J0KSAo c21hbGwpKSksIF9fYnVpbHRpbl9jaG9vc2VfZXhwciAoKF9fYnVpbHRpbl90eXBlc19jb21wYXRp YmxlX3AgKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBzaG9ydCwgdHlw ZW9mICgoZSkpKSAmJiBfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wIChfX2F0dHJpYnV0ZV9f KCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgc2hvcnQsIHR5cGVvZiAoKHNtYWxsKSkpKSwgKChf X2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgc2hvcnQpIF9fYnVpbHRpbl9h bHRpdmVjX3ZjbXBndHNoICgoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVk IHNob3J0KSAoZSksIChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgc2hv cnQpIChzbWFsbCkpKSwgX19idWlsdGluX2Nob29zZV9leHByICgoX19idWlsdGluX3R5cGVzX2Nv bXBhdGlibGVfcCAoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgdW5zaWduZWQgaW50 LCB0eXBlb2YgKChlKSkpICYmIF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKF9fYXR0cmli dXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHVuc2lnbmVkIGludCwgdHlwZW9mICgoc21hbGwpKSkp LCAoKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBpbnQpIF9fYnVpbHRp bl9hbHRpdmVjX3ZjbXBndHV3ICgoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2ln bmVkIGludCkgKGUpLCAoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgc2lnbmVkIGlu dCkgKHNtYWxsKSkpLCBfX2J1aWx0aW5fY2hvb3NlX2V4cHIgKChfX2J1aWx0aW5fdHlwZXNfY29t cGF0aWJsZV9wIChfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgaW50LCB0 eXBlb2YgKChlKSkpICYmIF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AgKF9fYXR0cmlidXRl X18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBpbnQsIHR5cGVvZiAoKHNtYWxsKSkpKSwgKChf X2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgaW50KSBfX2J1aWx0aW5fYWx0 aXZlY192Y21wZ3RzdyAoKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBp bnQpIChlKSwgKF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIHNpZ25lZCBpbnQpIChz bWFsbCkpKSwgX19idWlsdGluX2Nob29zZV9leHByICgoX19idWlsdGluX3R5cGVzX2NvbXBhdGli bGVfcCAoX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSkgZmxvYXQsIHR5cGVvZiAoKGUp KSkgJiYgX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCAoX19hdHRyaWJ1dGVfXygodmVjdG9y X3NpemUoMTYpKSkgZmxvYXQsIHR5cGVvZiAoKHNtYWxsKSkpKSwgKChfX2F0dHJpYnV0ZV9fKCh2 ZWN0b3Jfc2l6ZSgxNikpKSBzaWduZWQgaW50KSBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RmcCAo KF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpIGZsb2F0KSAoZSksIChfX2F0dHJpYnV0 ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKSBmbG9hdCkgKHNtYWxsKSkpLCBfX2FsdGl2ZWNfbGlua19l cnJvcl9pbnZhbGlkX2FyZ3VtZW50ICgpKSkpKSkpKTsKICAgICAgICBlID0gYzsKfQoAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA From gcc-prs-return-23956-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 18:52:26 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 19164 invoked by alias); 4 Nov 2002 18:52:25 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 19136 invoked by uid 61); 4 Nov 2002 18:52:24 -0000 Date: 4 Nov 2002 18:52:24 -0000 Message-ID: <20021104185224.19135.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, hartwood@crosslink.net, nobody@gcc.gnu.org From: aldyh@sources.redhat.com Reply-To: aldyh@sources.redhat.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, hartwood@crosslink.net, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: other/8451: altivec ice in gcc 3.2 Synopsis: altivec ice in gcc 3.2 State-Changed-From-To: open->closed State-Changed-By: aldyh State-Changed-When: Mon Nov 4 10:52:24 2002 State-Changed-Why: fixed http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8451 From gcc-prs-return-23957-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 18:54:27 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 29959 invoked by alias); 4 Nov 2002 18:54:27 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 29930 invoked by uid 61); 4 Nov 2002 18:54:26 -0000 Date: 4 Nov 2002 18:54:26 -0000 Message-ID: <20021104185426.29928.qmail@sources.redhat.com> To: adam@varisys.co.uk, adrian@varisys.co.uk, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: aldyh@sources.redhat.com Reply-To: aldyh@sources.redhat.com, adam@varisys.co.uk, adrian@varisys.co.uk, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c/8253: gcc 3.3 snapshot ICE on AltiVec code Synopsis: gcc 3.3 snapshot ICE on AltiVec code State-Changed-From-To: open->closed State-Changed-By: aldyh State-Changed-When: Mon Nov 4 10:54:26 2002 State-Changed-Why: fixed http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8253 From gcc-prs-return-23958-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 18:56:50 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 7615 invoked by alias); 4 Nov 2002 18:56:50 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 7589 invoked by uid 61); 4 Nov 2002 18:56:50 -0000 Date: 4 Nov 2002 18:56:50 -0000 Message-ID: <20021104185650.7587.qmail@sources.redhat.com> To: cbenna@iol.it, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, cbenna@iol.it, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c/4943: pointer address corruption in function call Synopsis: pointer address corruption in function call State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Mon Nov 4 10:56:49 2002 State-Changed-Why: Not a bug. The problem lies here: ushort i = 0, tmp = 0; scanf("%u", &tmp); %u wants an unsigned int, not an unsigned short. With that change, the program does what is expected. Maybe this serves as a good reason for considering C++ over C? http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4943 From gcc-prs-return-23959-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 19:26:01 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 25695 invoked by alias); 4 Nov 2002 19:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 25680 invoked by uid 71); 4 Nov 2002 19:26:00 -0000 Date: 4 Nov 2002 19:26:00 -0000 Message-ID: <20021104192600.25679.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Raimar Falke Subject: Re: c/8439: using an empty struct causes Internal compiler error in instantiate_virtual_regs_1, at function.c:4126 Reply-To: Raimar Falke The following reply was made to PR c/8439; it has been noted by GNATS. From: Raimar Falke To: gcc-gnats@gcc.gnu.org, nobody@gcc.gnu.org Cc: Subject: Re: c/8439: using an empty struct causes Internal compiler error in instantiate_virtual_regs_1, at function.c:4126 Date: Mon, 4 Nov 2002 20:18:07 +0100 On Sun, Nov 03, 2002 at 06:26:00PM -0000, gcc-gnats@gcc.gnu.org wrote: > Thank you very much for your problem report. > It has the internal identification `c/8439'. > The individual assigned to look at your > report is: unassigned. The problem is non-reproducible on a sun: $ uname -a SunOS irz601 5.7 Generic_106541-22 sun4u sparc SUNW,Ultra-2 $ gcc --version gcc (GCC) 3.2 Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ gcc -c c.c $ gcc -c -S c.c $ cat c.s .file "c.c" .section ".text" .align 4 .type foobar,#function .proc 020 foobar: !#PROLOGUE# 0 save %sp, -112, %sp !#PROLOGUE# 1 st %i0, [%fp+68] ld [%fp+68], %i0 add %i0, 0, %i0 st %i0, [%fp+68] nop ret restore .LLfe1: .size foobar,.LLfe1-foobar .ident "GCC: (GNU) 3.2" $ Raimar -- email: rf13@inf.tu-dresden.de "The very concept of PNP is a lovely dream that simply does not translate to reality. The confusion of manually doing stuff is nothing compared to the confusion of computers trying to do stuff and getting it wrong, which they gleefully do with great enthusiasm." -- Jinx Tigr in the SDM From gcc-prs-return-23960-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 19:36:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24493 invoked by alias); 4 Nov 2002 19:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24465 invoked by uid 71); 4 Nov 2002 19:36:01 -0000 Date: 4 Nov 2002 19:36:01 -0000 Message-ID: <20021104193601.24464.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Janis Johnson Subject: Re: c/8407: gcc3.2 ia64 (itanium-2) Internal compiler error in simplify_gen_subreg, at simplify-rtx.c:2711 Reply-To: Janis Johnson The following reply was made to PR c/8407; it has been noted by GNATS. From: Janis Johnson To: harrisonrj@ornl.gov Cc: gcc-gnats@gcc.gnu.org Subject: Re: c/8407: gcc3.2 ia64 (itanium-2) Internal compiler error in simplify_gen_subreg, at simplify-rtx.c:2711 Date: Mon, 4 Nov 2002 11:30:19 -0800 On Wed, Oct 30, 2002 at 09:16:16PM -0000, harrisonrj@ornl.gov wrote: > > >Number: 8407 > >Category: c > >Synopsis: gcc3.2 ia64 (itanium-2) Internal compiler error in simplify_gen_subreg, at simplify-rtx.c:2711 > >Class: ice-on-legal-code > >Arrival-Date: Wed Oct 30 13:26:00 PST 2002 > >Originator: Robert J. Harrison > >Release: gcc version 3.2 Your attachment is empty. If you send it again I can see if the problem still exists with the GCC 3.2 branch (soon to be released as 3.2.1) and the mainline. Janis From gcc-prs-return-23961-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 20:45:12 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 14606 invoked by alias); 4 Nov 2002 20:45:10 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 14584 invoked by uid 61); 4 Nov 2002 20:45:09 -0000 Date: 4 Nov 2002 20:45:09 -0000 Message-ID: <20021104204509.14583.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, jh@suse.cz, nobody@gcc.gnu.org From: reichelt@igpm.rwth-aachen.de Reply-To: reichelt@igpm.rwth-aachen.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, jh@suse.cz, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8186: [mainline regression] ICE in cp_expr_size, at cp/cp-lang.c:304 Synopsis: [mainline regression] ICE in cp_expr_size, at cp/cp-lang.c:304 State-Changed-From-To: analyzed->closed State-Changed-By: reichelt State-Changed-When: Mon Nov 4 12:45:08 2002 State-Changed-Why: Fixed. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8186 From gcc-prs-return-23962-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 20:46:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 15338 invoked by alias); 4 Nov 2002 20:46:00 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 15319 invoked by uid 61); 4 Nov 2002 20:45:59 -0000 Date: 4 Nov 2002 20:45:59 -0000 Message-ID: <20021104204559.15318.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, snyder@fnal.gov From: reichelt@igpm.rwth-aachen.de Reply-To: reichelt@igpm.rwth-aachen.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, snyder@fnal.gov, gcc-gnats@gcc.gnu.org Subject: Re: c++/7959: [mainline regression] g++ 3.3: ICE in cp_expr_size Synopsis: [mainline regression] g++ 3.3: ICE in cp_expr_size State-Changed-From-To: analyzed->closed State-Changed-By: reichelt State-Changed-When: Mon Nov 4 12:45:59 2002 State-Changed-Why: Fixed by http://gcc.gnu.org/ml/gcc-patches/2002-10/msg01950.html http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7959 From gcc-prs-return-23963-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 20:46:44 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 15988 invoked by alias); 4 Nov 2002 20:46:43 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 15969 invoked by uid 61); 4 Nov 2002 20:46:43 -0000 Date: 4 Nov 2002 20:46:43 -0000 Message-ID: <20021104204643.15968.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, krelisnet@softhome.net, nobody@gcc.gnu.org From: reichelt@igpm.rwth-aachen.de Reply-To: reichelt@igpm.rwth-aachen.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, krelisnet@softhome.net, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8244: [mainline regression] ICE of g++ 3.3 using -O Synopsis: [mainline regression] ICE of g++ 3.3 using -O State-Changed-From-To: analyzed->closed State-Changed-By: reichelt State-Changed-When: Mon Nov 4 12:46:41 2002 State-Changed-Why: Fixed by http://gcc.gnu.org/ml/gcc-patches/2002-10/msg01950.html http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8244 From gcc-prs-return-23964-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 20:47:22 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 16584 invoked by alias); 4 Nov 2002 20:47:22 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 16563 invoked by uid 61); 4 Nov 2002 20:47:21 -0000 Date: 4 Nov 2002 20:47:21 -0000 Message-ID: <20021104204721.16562.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, jtc@orac.acorntoolworks.com, nobody@gcc.gnu.org From: reichelt@igpm.rwth-aachen.de Reply-To: reichelt@igpm.rwth-aachen.de, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, jtc@orac.acorntoolworks.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8325: [mainline regression] ICE in cp_expr_size, at cp/cp-lang.c:307 Synopsis: [mainline regression] ICE in cp_expr_size, at cp/cp-lang.c:307 State-Changed-From-To: analyzed->closed State-Changed-By: reichelt State-Changed-When: Mon Nov 4 12:47:21 2002 State-Changed-Why: Fixed by http://gcc.gnu.org/ml/gcc-patches/2002-10/msg01950.html http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8325 From gcc-prs-return-23965-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 21:46:05 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24029 invoked by alias); 4 Nov 2002 21:46:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24002 invoked by uid 71); 4 Nov 2002 21:46:02 -0000 Resent-Date: 4 Nov 2002 21:46:02 -0000 Resent-Message-ID: <20021104214602.24001.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, mlu@cfdrc.com Resent-Reply-To: gcc-gnats@gcc.gnu.org, lwe@cfdrc.com Received: (qmail 17679 invoked by uid 61); 4 Nov 2002 21:39:02 -0000 Message-Id: <20021104213902.17678.qmail@sources.redhat.com> Date: 4 Nov 2002 21:39:02 -0000 From: lwe@cfdrc.com Reply-To: lwe@cfdrc.com To: gcc-gnats@gcc.gnu.org Cc: mlu@cfdrc.com X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) X-GNATS-Notify: mlu@cfdrc.com Subject: bootstrap/8452: Internal Compiler Error building GCC 3.2 on Tru64 5.0A >Number: 8452 >Category: bootstrap >Synopsis: Internal Compiler Error building GCC 3.2 on Tru64 5.0A >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Mon Nov 04 13:46:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: lwe@cfdrc.com >Release: gcc 3.2 >Organization: >Environment: alphaev56-dec-osf5.0 >Description: System type: heaven.cfdrc.com> ../../config.guess alphaev56-dec-osf5.0 GCC Version: heaven.cfdrc.com> stage2/xgcc -v Using built-in specs. Configured with: ../configure --enable-threads=posix --enable-shared Thread model: posix gcc version 3.2 Command line that caused the error: heaven.cfdrc.com> stage2/xgcc -Bstage2/ -B/usr/local/alphaev56-dec-osf5.0/bin/ -c -DIN_GCC -g -O2 -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wtraditional -pedantic -Wno-long-long -save-temps -DHAVE_CONFIG_H -I. -I. -I../../gcc -I../../gcc/. -I../../gcc/config -I../../gcc/../include ../../gcc/predict.c -o predict.o ../../gcc/predict.c: In function `propagate_freq': ../../gcc/predict.c:708: Internal compiler error in @œ @, at F:537426288 Please submit a full bug report, with preprocessed source if appropriate. >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: text/plain; name="predict.i" Content-Disposition: inline; filename="predict.i" # 1 "../../gcc/predict.c" # 1 "" # 1 "" # 1 "../../gcc/predict.c" # 31 "../../gcc/predict.c" # 1 "config.h" 1 # 1 "auto-host.h" 1 # 3 "config.h" 2 struct rtx_def; typedef struct rtx_def *rtx; struct rtvec_def; typedef struct rtvec_def *rtvec; union tree_node; typedef union tree_node *tree; # 1 "../../include/ansidecl.h" 1 # 17 "config.h" 2 # 1 "../../gcc/config/alpha/alpha.h" 1 # 57 "../../gcc/config/alpha/alpha.h" enum processor_type {PROCESSOR_EV4, PROCESSOR_EV5, PROCESSOR_EV6}; extern enum processor_type alpha_cpu; enum alpha_trap_precision { ALPHA_TP_PROG, ALPHA_TP_FUNC, ALPHA_TP_INSN }; enum alpha_fp_rounding_mode { ALPHA_FPRM_NORM, ALPHA_FPRM_MINF, ALPHA_FPRM_CHOP, ALPHA_FPRM_DYN }; enum alpha_fp_trap_mode { ALPHA_FPTM_N, ALPHA_FPTM_U, ALPHA_FPTM_SU, ALPHA_FPTM_SUI }; extern int target_flags; extern enum alpha_trap_precision alpha_tp; extern enum alpha_fp_rounding_mode alpha_fprm; extern enum alpha_fp_trap_mode alpha_fptm; # 265 "../../gcc/config/alpha/alpha.h" extern const char *alpha_cpu_string; extern const char *alpha_tune_string; extern const char *alpha_fprm_string; extern const char *alpha_fptm_string; extern const char *alpha_tp_string; extern const char *alpha_mlat_string; # 721 "../../gcc/config/alpha/alpha.h" enum reg_class { NO_REGS, R24_REG, R25_REG, R27_REG, GENERAL_REGS, FLOAT_REGS, ALL_REGS, LIM_REG_CLASSES }; # 888 "../../gcc/config/alpha/alpha.h" extern int alpha_memory_latency; # 1192 "../../gcc/config/alpha/alpha.h" struct alpha_compare { struct rtx_def *op0, *op1; int fp_p; }; extern struct alpha_compare alpha_compare; # 2086 "../../gcc/config/alpha/alpha.h" extern long alpha_arg_offset; extern long alpha_auto_offset; # 2149 "../../gcc/config/alpha/alpha.h" extern int sdb_label_count; # 18 "config.h" 2 # 1 "../../gcc/config/dbx.h" 1 # 19 "config.h" 2 # 1 "../../gcc/config/alpha/osf.h" 1 # 20 "config.h" 2 # 1 "../../gcc/config/alpha/osf5.h" 1 # 21 "config.h" 2 # 1 "../../gcc/defaults.h" 1 # 22 "config.h" 2 # 30 "config.h" # 1 "insn-constants.h" 1 # 31 "config.h" 2 # 1 "insn-flags.h" 1 # 260 "insn-flags.h" struct rtx_def; extern struct rtx_def *gen_addvsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_addvdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_negsi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_negvsi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_negdi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_negvdi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_subvsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_subdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_subvdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_mulsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_mulvsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_muldi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_mulvdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umuldi3_highpart (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_anddi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_zero_extendsidi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_andnotdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_iordi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_one_cmpldi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_xordi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_ashldi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_lshrdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_ashrdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendqidi2x (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendhidi2x (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendqisi2x (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendhisi2x (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendqihi2x (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extxl_le (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extxl_be (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extqh_le (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extqh_be (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extlh_le (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extlh_be (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extwh_le (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extwh_be (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_insbl_le (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_insbl_be (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_inswl_le (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_inswl_be (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_insll_le (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_insll_be (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_insql_le (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_insql_be (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_insxh (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_mskxl_le (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_mskxl_be (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_mskxh (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_abssf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_absdf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_negsf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_negdf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_addsf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_adddf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_fix_truncdfdi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_fix_truncsfdi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_floatdisf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_floatdidf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_truncdfsf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_divsf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_divdf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_mulsf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_muldf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_subsf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_subdf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_sqrtsf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_sqrtdf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_sminqi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_uminqi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_smaxqi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umaxqi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_sminhi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_uminhi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_smaxhi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umaxhi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_blockage (void); extern struct rtx_def *gen_jump (struct rtx_def *); extern struct rtx_def *gen_indirect_jump (struct rtx_def *); extern struct rtx_def *gen_imb (void); extern struct rtx_def *gen_trap (void); extern struct rtx_def *gen_umk_laum (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umk_lalm (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umk_lal (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movdi_er_high_g (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movdi_er_maybe_g (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_force_movdi (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_reload_inqi_help (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_reload_inhi_help (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_reload_outqi_help (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_reload_outhi_help (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_prologue_stack_probe_loop (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_prologue_mcount (void); extern struct rtx_def *gen_init_fp (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_nt_lda (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_builtin_longjmp_internal (struct rtx_def *); extern struct rtx_def *gen_arg_home (void); extern struct rtx_def *gen_arg_home_umk (void); extern struct rtx_def *gen_prefetch (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_trapb (void); extern struct rtx_def *gen_nop (void); extern struct rtx_def *gen_fnop (void); extern struct rtx_def *gen_unop (void); extern struct rtx_def *gen_realign (struct rtx_def *); extern struct rtx_def *gen_extendsidi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_addsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_adddi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_subsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_divsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_udivsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_modsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umodsi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_divdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_udivdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_moddi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_moddi3_dft (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_moddi3_umk (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umoddi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umoddi3_dft (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umoddi3_umk (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_zero_extendqihi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_zero_extendqisi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_zero_extendqidi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_zero_extendhisi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_zero_extendhidi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_ffsdi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendqihi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendqisi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendqidi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendhisi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendhidi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_extendqidi (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_extendqidi_le (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_extendqidi_be (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_extendhidi (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_extendhidi_le (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_extendhidi_be (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_abstf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_negtf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_addtf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_fix_trunctfdi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_floatditf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_floatunsdisf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_floatunsdidf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_floatunsditf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendsfdf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extendsftf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extenddftf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_trunctfdf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_trunctfsf2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_divtf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_multf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_subtf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_absdi2 (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_absdi2_same (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_absdi2_diff (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_smaxdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_smindi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umaxdi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_umindi3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_maxdf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_mindf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_maxsf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_minsf3 (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_cmpdf (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_cmptf (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_cmpdi (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_beq (struct rtx_def *); extern struct rtx_def *gen_bne (struct rtx_def *); extern struct rtx_def *gen_blt (struct rtx_def *); extern struct rtx_def *gen_ble (struct rtx_def *); extern struct rtx_def *gen_bgt (struct rtx_def *); extern struct rtx_def *gen_bge (struct rtx_def *); extern struct rtx_def *gen_bltu (struct rtx_def *); extern struct rtx_def *gen_bleu (struct rtx_def *); extern struct rtx_def *gen_bgtu (struct rtx_def *); extern struct rtx_def *gen_bgeu (struct rtx_def *); extern struct rtx_def *gen_bunordered (struct rtx_def *); extern struct rtx_def *gen_bordered (struct rtx_def *); extern struct rtx_def *gen_seq (struct rtx_def *); extern struct rtx_def *gen_sne (struct rtx_def *); extern struct rtx_def *gen_slt (struct rtx_def *); extern struct rtx_def *gen_sle (struct rtx_def *); extern struct rtx_def *gen_sgt (struct rtx_def *); extern struct rtx_def *gen_sge (struct rtx_def *); extern struct rtx_def *gen_sltu (struct rtx_def *); extern struct rtx_def *gen_sleu (struct rtx_def *); extern struct rtx_def *gen_sgtu (struct rtx_def *); extern struct rtx_def *gen_sgeu (struct rtx_def *); extern struct rtx_def *gen_sunordered (struct rtx_def *); extern struct rtx_def *gen_sordered (struct rtx_def *); extern struct rtx_def *gen_movsicc (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movdicc (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movsfcc (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movdfcc (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_sibcall (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call_osf (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call_nt (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call_umk (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call_vms (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call_value (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_sibcall_value (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call_value_osf (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call_value_nt (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call_value_vms (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_call_value_umk (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_untyped_call (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_return (void); extern struct rtx_def *gen_tablejump (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movsf (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movdf (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movtf (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movsi (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movdi (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_aligned_loadqi (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_aligned_loadhi (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_loadqi (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_loadqi_le (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_loadqi_be (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_loadhi (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_loadhi_le (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_loadhi_be (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_aligned_store (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_storeqi (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_storeqi_le (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_storeqi_be (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_storehi (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_storehi_le (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_unaligned_storehi_be (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movqi (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movhi (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_reload_inqi (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_reload_inhi (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_reload_outqi (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_reload_outhi (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extv (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_extzv (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_insv (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_movstrqi (struct rtx_def *, struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_clrstrqi (struct rtx_def *, struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_probe_stack (struct rtx_def *); extern struct rtx_def *gen_allocate_stack (struct rtx_def *, struct rtx_def *); extern struct rtx_def *gen_prologue (void); extern struct rtx_def *gen_prologue_ldgp (void); extern struct rtx_def *gen_epilogue (void); extern struct rtx_def *gen_sibcall_epilogue (void); extern struct rtx_def *gen_builtin_longjmp (struct rtx_def *); extern struct rtx_def *gen_builtin_setjmp_receiver_er (struct rtx_def *); extern struct rtx_def *gen_builtin_setjmp_receiver (struct rtx_def *); extern struct rtx_def *gen_exception_receiver_er (void); extern struct rtx_def *gen_exception_receiver (void); extern struct rtx_def *gen_nonlocal_goto_receiver (void); extern struct rtx_def *gen_umk_mismatch_args (struct rtx_def *); # 32 "config.h" 2 # 32 "../../gcc/predict.c" 2 # 1 "../../gcc/system.h" 1 # 33 "../../gcc/system.h" # 1 "include/stdarg.h" 1 3 # 43 "include/stdarg.h" 3 typedef __builtin_va_list __gnuc_va_list; # 110 "include/stdarg.h" 3 typedef __gnuc_va_list va_list; # 34 "../../gcc/system.h" 2 # 47 "../../gcc/system.h" # 1 "include/stddef.h" 1 3 # 147 "include/stddef.h" 3 typedef long int ptrdiff_t; # 201 "include/stddef.h" 3 typedef long unsigned int size_t; # 294 "include/stddef.h" 3 typedef unsigned int wchar_t; # 48 "../../gcc/system.h" 2 # 1 "include/stdio.h" 1 3 # 62 "include/stdio.h" 3 # 1 "/usr/include/standards.h" 1 3 # 63 "include/stdio.h" 2 3 # 106 "include/stdio.h" 3 typedef long fpos_t; # 146 "include/stdio.h" 3 # 1 "/usr/include/sys/seek.h" 1 3 # 147 "include/stdio.h" 2 3 typedef struct { int _cnt; unsigned int _flag2; unsigned char *_ptr; unsigned char *_base; int _bufsiz; short _flag; short _file; char *__newbase; void *_lock; unsigned char *_bufendp; } FILE; extern FILE _iob[]; # 178 "include/stdio.h" 3 extern size_t fread (void *, size_t, size_t, FILE *); extern size_t fwrite (const void *, size_t, size_t, FILE *); extern int _flsbuf (int, FILE *); extern int _filbuf (FILE *); extern int ferror (FILE *); extern int feof (FILE *); extern void clearerr (FILE *); extern int putchar (int); extern int getchar (void); extern int putc (int, FILE *); extern int getc (FILE *); extern int remove (const char *); extern int rename (const char *, const char *); extern FILE *tmpfile (void); extern char *tmpnam (char *); extern int fclose (FILE *); extern int fflush (FILE *); extern FILE *fopen (const char *, const char *); extern FILE *freopen (const char *, const char *, FILE *); extern void setbuf (FILE *, char *); extern int setvbuf (FILE *, char *, int, size_t); extern int fprintf (FILE *, const char *, ...); extern int fscanf (FILE *, const char *, ...); extern int printf (const char *, ...); extern int scanf (const char *, ...); extern int sprintf (char *, const char *, ...); extern int sscanf (const char *, const char *, ...); extern int snprintf (char *, size_t, const char *, ...); # 221 "include/stdio.h" 3 # 1 "include/va_list.h" 1 3 # 222 "include/stdio.h" 2 3 extern int vfprintf (FILE *, const char *, __gnuc_va_list); extern int vprintf (const char *, __gnuc_va_list); extern int vsprintf (char *, const char *, __gnuc_va_list); extern int vsnprintf (char *, size_t, const char*, __gnuc_va_list); # 242 "include/stdio.h" 3 extern int fgetc (FILE *); extern char *fgets (char *, int, FILE *); extern int fputc (int, FILE *); extern int fputs (const char *, FILE *); extern char *gets (char *); extern int puts (const char *); extern int ungetc (int, FILE *); extern int fseek (FILE *, long, int); # 278 "include/stdio.h" 3 extern int fsetpos (FILE *, const fpos_t *); extern int fgetpos (FILE *, fpos_t *); extern long ftell (FILE *); extern void rewind (FILE *); extern void perror (const char *); # 436 "include/stdio.h" 3 # 1 "include/sys/types.h" 1 3 # 126 "include/sys/types.h" 3 typedef unsigned int wctype_t; # 135 "include/sys/types.h" 3 # 1 "/usr/include/time_t.h" 1 3 # 34 "/usr/include/time_t.h" 3 typedef int time_t; # 136 "include/sys/types.h" 2 3 typedef int clock_t; # 157 "include/sys/types.h" 3 typedef long ssize_t; typedef unsigned char uchar_t; typedef unsigned short ushort_t; typedef unsigned int uint_t; typedef unsigned long ulong_t; typedef volatile unsigned char vuchar_t; typedef volatile unsigned short vushort_t; typedef volatile unsigned int vuint_t; typedef volatile unsigned long vulong_t; typedef struct { long r[1]; } *physadr_t; typedef struct label_t { long val[10]; } label_t; # 238 "include/sys/types.h" 3 typedef int level_t; typedef int daddr_t; typedef char * caddr_t; typedef long * qaddr_t; typedef char * addr_t; typedef uint_t ino_t; typedef short cnt_t; typedef int dev_t; typedef int chan_t; typedef long off_t; typedef long t_scalar_t; typedef unsigned long t_uscalar_t; # 270 "include/sys/types.h" 3 typedef unsigned long rlim_t; typedef int paddr_t; typedef ushort_t nlink_t; typedef int key_t; typedef uint_t mode_t; typedef uint_t uid_t; typedef uint_t gid_t; typedef void * mid_t; typedef int pid_t; typedef union cpid { struct { unsigned int pid:19; unsigned int nodeid:8; unsigned int seqnum:4; unsigned int signbit:1; } cluster_fields; pid_t ipid; } cpid_t; typedef char slab_t[12]; typedef ulong_t shmatt_t; typedef ulong_t msgqnum_t; typedef ulong_t msglen_t; typedef unsigned int wint_t; # 339 "include/sys/types.h" 3 typedef unsigned long sigset_t; # 356 "include/sys/types.h" 3 typedef struct __pthread_attr_t { long __valid; char* __name; unsigned long __arg; unsigned long __reserved[19]; } pthread_attr_t; typedef struct __pthread_mutexattr_t { long __valid; unsigned long __reserved[15]; } pthread_mutexattr_t; typedef struct __pthread_condattr_t { long __valid; unsigned long __reserved[13]; } pthread_condattr_t; typedef struct __pthread_rwlockattr_t { long __valid; unsigned long __reserved[15]; } pthread_rwlockattr_t; # 406 "include/sys/types.h" 3 typedef struct __pthread_t { void* __reserved1; void* __reserved2; unsigned short __size; unsigned char __version; unsigned char __reserved3; unsigned char __external; unsigned char __reserved4[2]; unsigned char __creator; unsigned long __sequence; unsigned long __reserved5[2]; void* __per_kt_area; void* __stack_base; void* __stack_reserve; void* __stack_yellow; void* __stack_guard; unsigned long __stack_size; void** __tsd_values; unsigned long __tsd_count; unsigned int __reserved6; unsigned int __reserved7; unsigned int __thread_flags; int __thd_errno; void* __stack_hiwater; } *pthread_t, pthreadTeb_t; typedef struct __pthread_mutex_t { unsigned int __lock; unsigned int __valid; char* __name; unsigned int __arg; unsigned int __depth; unsigned long __sequence; unsigned long __owner; void* __block; } pthread_mutex_t; typedef struct __pthread_cond_t { unsigned int __state; unsigned int __valid; char* __name; unsigned int __arg; unsigned int __reserved1; unsigned long __sequence; void* __block; } pthread_cond_t; typedef struct __pthread_rwlock_t { unsigned int __valid; unsigned int __flags; char* __name; unsigned int __arg; unsigned int __readers; unsigned int __rwaits; unsigned int __wwaits; unsigned long __sequence; unsigned long __wrid; void* __block; unsigned long __reserved1; } pthread_rwlock_t; typedef unsigned int pthread_key_t; typedef struct __pthread_once_t { long __state; long __reserved[10]; } pthread_once_t; # 482 "include/sys/types.h" 3 typedef long timer_t; # 506 "include/sys/types.h" 3 typedef void (*sig_t) (int,void (*)(int)); # 519 "include/sys/types.h" 3 typedef pid_t id_t; typedef unsigned int useconds_t; # 533 "include/sys/types.h" 3 typedef uint_t major_t; typedef uint_t minor_t; typedef uint_t devs_t; typedef uint_t unit_t; # 556 "include/sys/types.h" 3 # 1 "/usr/include/mach/machine/vm_types.h" 1 3 # 67 "/usr/include/mach/machine/vm_types.h" 3 typedef unsigned long vm_offset_t; typedef unsigned long vm_size_t; # 557 "include/sys/types.h" 2 3 typedef uchar_t uchar; typedef ushort_t ushort; typedef uint_t uint; typedef ulong_t ulong; typedef physadr_t physadr; typedef uchar_t u_char; typedef ushort_t u_short; typedef uint_t u_int; typedef ulong_t u_long; typedef vuchar_t vu_char; typedef vushort_t vu_short; typedef vuint_t vu_int; typedef vulong_t vu_long; typedef struct _quad { int val[2]; } quad; typedef long swblk_t; typedef u_long fixpt_t; # 1 "/usr/include/sys/select.h" 1 3 # 50 "/usr/include/sys/select.h" 3 # 1 "include/sys/types.h" 1 3 # 51 "/usr/include/sys/select.h" 2 3 # 166 "/usr/include/sys/select.h" 3 typedef int fd_mask; # 190 "/usr/include/sys/select.h" 3 typedef struct fd_set { fd_mask fds_bits[((((unsigned)4096)+(((sizeof(fd_mask) * 8))-1))/((sizeof(fd_mask) * 8)))]; } fd_set; # 243 "/usr/include/sys/select.h" 3 extern void bzero (void *, size_t); struct timeval; int select (int, fd_set *, fd_set *, fd_set *, struct timeval *); # 590 "include/sys/types.h" 2 3 typedef unsigned char sa_family_t; typedef unsigned int in_addr_t; typedef unsigned short in_port_t; # 1 "/usr/include/sys/common_protos.h" 1 3 # 605 "include/sys/types.h" 2 3 # 437 "include/stdio.h" 2 3 # 454 "include/stdio.h" 3 extern int fileno (FILE *); extern FILE *fdopen (int, const char *); # 474 "include/stdio.h" 3 extern char *cuserid (char *); # 493 "include/stdio.h" 3 # 1 "../../include/getopt.h" 1 3 # 36 "../../include/getopt.h" 3 extern char *optarg; # 50 "../../include/getopt.h" 3 extern int optind; extern int opterr; extern int optopt; # 82 "../../include/getopt.h" 3 struct option { const char *name; int has_arg; int *flag; int val; }; # 118 "../../include/getopt.h" 3 extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); # 494 "include/stdio.h" 2 3 extern char *ctermid (char *); extern int getw (FILE *); extern int pclose (FILE *); extern int putw (int, FILE*); extern FILE *popen (const char *, const char *); extern char *tempnam (const char*, const char*); # 1 "include/sys/limits.h" 1 3 # 86 "include/sys/limits.h" 3 # 1 "/usr/include/machine/machlimits.h" 1 3 # 87 "include/sys/limits.h" 2 3 # 152 "include/sys/limits.h" 3 # 1 "/usr/include/sys/syslimits.h" 1 3 # 153 "include/sys/limits.h" 2 3 # 249 "include/sys/limits.h" 3 # 1 "/usr/include/machine/machtime.h" 1 3 # 250 "include/sys/limits.h" 2 3 # 267 "include/sys/limits.h" 3 # 1 "/usr/include/sys/rt_limits.h" 1 3 # 268 "include/sys/limits.h" 2 3 # 511 "include/stdio.h" 2 3 # 541 "include/stdio.h" 3 extern void setbuffer (FILE *, char*, int); extern void setlinebuf (FILE *); # 51 "../../gcc/system.h" 2 # 110 "../../gcc/system.h" # 1 "../../include/safe-ctype.h" 1 # 44 "../../include/safe-ctype.h" enum { _sch_isblank = 0x0001, _sch_iscntrl = 0x0002, _sch_isdigit = 0x0004, _sch_islower = 0x0008, _sch_isprint = 0x0010, _sch_ispunct = 0x0020, _sch_isspace = 0x0040, _sch_isupper = 0x0080, _sch_isxdigit = 0x0100, _sch_isidst = 0x0200, _sch_isvsp = 0x0400, _sch_isnvsp = 0x0800, _sch_isalpha = _sch_isupper|_sch_islower, _sch_isalnum = _sch_isalpha|_sch_isdigit, _sch_isidnum = _sch_isidst|_sch_isdigit, _sch_isgraph = _sch_isalnum|_sch_ispunct, _sch_iscppsp = _sch_isvsp|_sch_isnvsp, _sch_isbasic = _sch_isprint|_sch_iscppsp }; extern const unsigned short _sch_istable[256]; # 97 "../../include/safe-ctype.h" extern const unsigned char _sch_toupper[256]; extern const unsigned char _sch_tolower[256]; # 111 "../../gcc/system.h" 2 # 1 "/usr/include/errno.h" 1 3 # 77 "/usr/include/errno.h" 3 extern int *_errno (void); extern int _Geterrno (void); extern int _Seterrno (int); extern int __geterrno (void); extern int __seterrno (int); extern int errno; # 293 "/usr/include/errno.h" 3 extern void perror (const char *); extern char *sys_errlist[]; extern int sys_nerr; # 115 "../../gcc/system.h" 2 # 1 "include/string.h" 1 3 # 98 "include/string.h" 3 extern void *memchr (const void *, int , size_t ); extern void *memcpy (void *, const void *, size_t ); extern void *memset (void *, int , size_t ); extern size_t strcspn (const char *, const char *); extern size_t strlen (const char *); extern size_t strspn (const char *, const char *); extern void *memmove (void *, const void *, size_t ); extern char *strcpy (char *, const char *); extern char *strncpy (char *, const char *, size_t ); extern char *strcat (char *, const char *); extern char *strncat (char *, const char *, size_t ); extern int memcmp (const void *, const void *,size_t ); extern int strcmp (const char *, const char *); extern int strcoll (const char *, const char *); extern int strncmp (const char *,const char *,size_t ); extern size_t strxfrm (char *, const char *, size_t ); extern char *strchr (const char *, int ); extern char *strpbrk (const char *, const char *); extern char *strrchr (const char *, int ); extern char *strstr (const char *, const char *); extern char *strtok (char *, const char *); extern char *strerror (int); extern char *strtok_r (char *, const char *, char **); # 139 "include/string.h" 3 extern void *memccpy (void *, const void *, int , size_t ); # 148 "include/string.h" 3 extern void swab (const void *, void *, ssize_t); extern char *strdup (const char *); # 1 "/usr/include/strings.h" 1 3 # 79 "/usr/include/strings.h" 3 extern int bcmp (const void *, const void *, size_t ); extern void bcopy (const void *, void *, size_t); extern void bzero (void *, size_t); extern int ffs (int); extern char *index (const char*, int); extern char *rindex (const char*, int); extern int strcasecmp (const char *, const char *); extern int strncasecmp (const char *, const char *, size_t ); # 1 "include/string.h" 1 3 # 98 "/usr/include/strings.h" 2 3 # 162 "include/string.h" 2 3 # 172 "include/string.h" 3 extern char * basename (char *); extern char * dirname (char *); # 122 "../../gcc/system.h" 2 # 134 "../../gcc/system.h" # 1 "include/stdlib.h" 1 3 # 129 "include/stdlib.h" 3 typedef struct div_t { int quot; int rem; } div_t; typedef struct ldiv_t { long int quot; long int rem; } ldiv_t; # 160 "include/stdlib.h" 3 extern int __getmbcurmax (void); extern int mblen (const char *, size_t); extern size_t mbstowcs (wchar_t *, const char *, size_t); extern int mbtowc (wchar_t *, const char *, size_t); extern size_t wcstombs (char *, const wchar_t *, size_t); extern int wctomb (char *, wchar_t); extern int rpmatch (const char *); extern void *valloc (size_t ); extern double atof (const char *); extern int atoi (const char *); extern long int atol (const char *); extern double strtod (const char *, char **); extern float strtof (const char *, char **); extern long int strtol (const char *, char **, int ); extern long double strtold (const char *, char **); extern unsigned long int strtoul (const char *, char **, int ); extern int rand (void); extern void srand (unsigned int ); extern void *calloc (size_t , size_t ); extern void free (void *); extern void *malloc (size_t ); extern void *realloc (void *, size_t ); # 207 "include/stdlib.h" 3 extern long a64l (const char *); extern char * l64a (long); extern int ttyslot (void); extern char *ptsname (int); # 234 "include/stdlib.h" 3 extern void abort (void); extern int atexit (void (*)(void)); extern void exit (int ); extern char *getenv (const char *); extern int system (const char *); extern void *bsearch (const void *, const void *, size_t , size_t , int(*)(const void *, const void *)); extern void qsort (void *, size_t , size_t ,int(*)(const void *, const void *)); extern int abs (int ); extern div_t div (int , int ); extern long int labs (long int ); extern ldiv_t ldiv (long int , long int ); # 256 "include/stdlib.h" 3 extern int _Prand_r (unsigned int *); # 290 "include/stdlib.h" 3 extern double drand48 (void); extern double erand48 (unsigned short []); extern long jrand48 (unsigned short []); extern void lcong48 (unsigned short []); extern long lrand48 (void); extern long mrand48 (void); extern long nrand48 (unsigned short []); extern unsigned short *seed48 (unsigned short []); extern void srand48 (long); extern int putenv (const char *); extern void setkey (const char *); # 327 "include/stdlib.h" 3 extern char *initstate (unsigned int, char *, size_t); extern char *setstate (const char *); extern int grantpt (int); extern int getsubopt (char **, char *const *, char **); extern int random (void); extern int srandom (unsigned int); extern char *realpath (const char *, char *); extern int unlockpt (int); # 353 "include/stdlib.h" 3 extern int clearenv (void); extern char *getpass (const char *); extern char *mktemp (char *); extern int mkstemp (char *); # 373 "include/stdlib.h" 3 char *ecvt (double, int, int *, int *); char *fcvt (double, int, int *, int *); char *gcvt (double, int, char *); # 135 "../../gcc/system.h" 2 # 157 "../../gcc/system.h" # 1 "include/unistd.h" 1 3 # 74 "include/unistd.h" 3 # 1 "/usr/include/sys/access.h" 1 3 # 75 "include/unistd.h" 2 3 # 91 "include/unistd.h" 3 extern char **environ; struct sockaddr_in; # 102 "include/unistd.h" 3 extern ssize_t pread (int, void *, size_t, off_t); extern ssize_t pwrite (int , const void *, size_t, off_t); extern ssize_t read (int, void *, size_t); extern ssize_t write (int , const void *, size_t); extern int access (const char *, int ); extern unsigned int alarm (unsigned int ); extern int chdir (const char *); extern int chown (const char *, uid_t , gid_t ); extern int chroot (const char *); extern int close (int ); extern size_t confstr (int, char *, size_t); # 134 "include/unistd.h" 3 extern int dup (int ); extern int dup2 (int , int ); extern int execl (const char *, const char *, ...); extern int execv (const char *, char *const[]); extern int execle (const char *, const char *, ...); extern int execve (const char *, char *const[], char *const[]); extern int execlp (const char *, const char *, ...); extern int execvp (const char *, char *const[]); extern void _exit (int ); extern pid_t fork (void); extern long fpathconf (int , int ); extern int fsync (int); extern int fdatasync (int); extern char *getcwd (char *, size_t ); extern gid_t getegid (void); extern uid_t geteuid (void); extern gid_t getgid (void); extern int getgroups (int , gid_t []); extern char *getlogin (void); extern pid_t getpgrp (void); extern pid_t getpid (void); extern pid_t getppid (void); extern uid_t getuid (void); extern int isatty (int ); extern int link (const char *, const char *); extern off_t lseek (int , off_t , int ); extern long pathconf (const char *, int ); extern int pause (void); # 184 "include/unistd.h" 3 extern int pipe (int []); extern int rmdir (const char *); extern int setgid (gid_t ); extern int setpgid (pid_t , pid_t ); extern pid_t setsid (void); extern int setuid (uid_t ); extern unsigned int sleep (unsigned int ); extern int usleep (useconds_t ); # 209 "include/unistd.h" 3 extern long sysconf (int ); extern pid_t tcgetpgrp (int ); extern int tcsetpgrp (int , pid_t ); extern char *ttyname (int ); extern int unlink (const char *); extern void swab (const void *, void *, ssize_t); # 229 "include/unistd.h" 3 extern int _Pgetlogin_r (char *, size_t); extern int _Pttyname_r (int, char *, size_t); extern ssize_t pread (int, void *, size_t, off_t); extern ssize_t pwrite (int, const void *, size_t, off_t); extern int pthread_atfork (void (*)(void), void (*)(void), void (*)(void)); # 569 "include/unistd.h" 3 extern int fchown (int, uid_t, gid_t); extern int ftruncate (int, off_t); extern int readlink (const char *, char *, int); extern int symlink (const char *, const char *); extern int setgroups (int, gid_t []); extern int truncate (const char *, off_t); extern char *crypt (const char *, const char *); extern char *cuserid (char *); extern char *ctermid (char *); extern void encrypt (char [], int); extern char *getpass (const char *); extern int nice (int); # 609 "include/unistd.h" 3 extern int brk (char *); extern int gethostname (char *, int); extern int getpagesize (void); extern pid_t getpgid (pid_t); extern pid_t getsid (pid_t); extern char *getwd (char *); extern int lchown (const char *, uid_t, gid_t); extern int lockf (int, int, off_t); # 630 "include/unistd.h" 3 extern void *sbrk (ssize_t); extern unsigned int ualarm (unsigned int, unsigned int); extern void sync (void); # 653 "include/unistd.h" 3 extern int setpgrp (pid_t, pid_t); extern int setregid (gid_t, gid_t); extern int setreuid (uid_t, uid_t); extern pid_t vfork (void); extern int getdtablesize (void); extern char *gettxt (const char *, const char *); extern char *getenv (const char *); extern int bindresvport (int, struct sockaddr_in *); extern char *crypt16 (const char *, const char *); extern int rcmd (char **, u_short, char *, char *, char *, int *); extern int rcmd2 (char **, u_short, char *, char *, char *, int *, int); extern int rename (const char *, const char *); extern int rexec (char **, int, char *, char *, char *, int *); extern int rresvport (int *); extern int rresvport2 (int *, int); extern int ruserok (char *, int, char *, char *); extern int seteuid (uid_t); extern int setegid (gid_t); extern int setlogin (char *); extern int setrgid (gid_t); extern int setruid (uid_t); extern int syscall (int, ...); # 158 "../../gcc/system.h" 2 # 1 "/usr/include/sys/param.h" 1 3 # 83 "/usr/include/sys/param.h" 3 # 1 "/usr/include/machine/machparam.h" 1 3 # 43 "/usr/include/machine/machparam.h" 3 # 1 "/usr/include/machine/endian.h" 1 3 # 108 "/usr/include/machine/endian.h" 3 extern unsigned short ntohs(unsigned short), htons(unsigned short); extern unsigned int ntohl(unsigned int), htonl(unsigned int); # 44 "/usr/include/machine/machparam.h" 2 3 # 63 "/usr/include/machine/machparam.h" 3 typedef long pt_entry_t; # 76 "/usr/include/machine/machparam.h" 3 struct kernel_parameters { struct vm_parameters { long nbpg; long pgofset; long pgshift; long nvabits; unsigned long seg1_base; unsigned long unity_base; unsigned long address_mask; pt_entry_t *selfmap; pt_entry_t *othermap; } vm; }; # 143 "/usr/include/machine/machparam.h" 3 extern pt_entry_t * pmap_selfmap; # 84 "/usr/include/sys/param.h" 2 3 # 157 "/usr/include/sys/param.h" 3 # 1 "/usr/include/sys/signal.h" 1 3 # 54 "/usr/include/sys/signal.h" 3 # 1 "/usr/include/sys/siginfo.h" 1 3 # 34 "/usr/include/sys/siginfo.h" 3 # 1 "/usr/include/sys/sysmisc.h" 1 3 # 45 "/usr/include/sys/sysmisc.h" 3 typedef struct sigaltstack { caddr_t ss_sp; int ss_flags; size_t ss_size; } stack_t; # 63 "/usr/include/sys/sysmisc.h" 3 typedef union sigval { int sival_int; void *sival_ptr; } sigval_t; # 79 "/usr/include/sys/sysmisc.h" 3 typedef struct sigevent_event { union sigval _sigev_value; int _sigev_signo; int _sigev_notify; } sigevent_event_t; typedef struct sigevent { sigevent_event_t _sigev_sigevent; union { int _sigev[(((64)/sizeof(int)) - 4)]; struct { void (*_sigev_notify_function) (sigval_t); pthread_attr_t *_sigev_notify_attributes; } _sigev_un_s; } _sigev_un; } sigevent_t; # 123 "/usr/include/sys/sysmisc.h" 3 typedef struct timespec { time_t tv_sec; long tv_nsec; } timespec_t; struct uuprof { short *pr_base; unsigned long pr_size; unsigned long pr_off; unsigned long pr_scale; }; # 35 "/usr/include/sys/siginfo.h" 2 3 # 47 "/usr/include/sys/siginfo.h" 3 typedef struct siginfo { int si_signo; int si_errno; int si_code; union { int _sipad[(((128)/sizeof(int)) - 4)]; struct { pid_t _pid; union { struct { uid_t _uid; } _kill; struct { int _status; clock_t _utime; clock_t _stime; } _sigchld; } _pinfo; struct { sigval_t _sigval; } _sigrt; } _sigproc; struct { caddr_t _addr; } _sigfault; struct { long _band; int _fd; } _sigpoll; struct { sigval_t _siganonval; } _siganon; } _sifields; } siginfo_t; # 55 "/usr/include/sys/signal.h" 2 3 # 81 "/usr/include/sys/signal.h" 3 extern void (*signal (int, void (*)(int))) (int); extern int raise (int); # 144 "/usr/include/sys/signal.h" 3 typedef void (*__sigfp)(int); # 206 "/usr/include/sys/signal.h" 3 struct sigaction { union { void (*_handler) (int); void (*_sigaction) (int, siginfo_t *, void *); } _sa_un; # 228 "/usr/include/sys/signal.h" 3 sigset_t sa_mask; int sa_flags; int sa_signo; }; extern int kill (pid_t , int); # 253 "/usr/include/sys/signal.h" 3 extern int sigaction (int, const struct sigaction *, struct sigaction *); # 267 "/usr/include/sys/signal.h" 3 extern int sigprocmask (int, const sigset_t *, sigset_t *); extern int sigsuspend (const sigset_t *); extern int sigemptyset (sigset_t *); extern int sigfillset (sigset_t *); extern int sigaddset (sigset_t *, int); extern int sigdelset (sigset_t *, int); extern int sigismember (const sigset_t *, int); extern int sigpending (sigset_t *); extern int sigwaitinfo (const sigset_t *, siginfo_t *); extern int sigtimedwait (const sigset_t *, siginfo_t *, const struct timespec *); extern int sigqueue (pid_t, int, const union sigval); # 299 "/usr/include/sys/signal.h" 3 extern int pthread_sigmask (int, const sigset_t *, sigset_t *); extern int pthread_kill (pthread_t, int); # 309 "/usr/include/sys/signal.h" 3 # 1 "/usr/include/machine/signal.h" 1 3 # 53 "/usr/include/machine/signal.h" 3 typedef int sig_atomic_t; # 146 "/usr/include/machine/signal.h" 3 # 1 "/usr/include/machine/context.h" 1 3 # 40 "/usr/include/machine/context.h" 3 typedef char * __caddr_t; # 58 "/usr/include/machine/context.h" 3 struct sigcontext { # 67 "/usr/include/machine/context.h" 3 long sc_onstack; long sc_mask; long sc_pc; long sc_ps; long sc_regs[32]; long sc_ownedfp; long sc_fpregs[32]; unsigned long sc_fpcr; unsigned long sc_fp_control; long sc_reserved1; int sc_kreserved1; int sc_kreserved2; size_t sc_ssize; caddr_t sc_sbase; unsigned long sc_traparg_a0; unsigned long sc_traparg_a1; unsigned long sc_traparg_a2; unsigned long sc_fp_trap_pc; unsigned long sc_fp_trigger_sum; unsigned long sc_fp_trigger_inst; }; # 147 "/usr/include/machine/signal.h" 2 3 # 310 "/usr/include/sys/signal.h" 2 3 # 322 "/usr/include/sys/signal.h" 3 extern sigset_t cantmasksigset; # 331 "/usr/include/sys/signal.h" 3 struct sigvec { void (*sv_handler) (int); int sv_mask; int sv_flags; }; # 344 "/usr/include/sys/signal.h" 3 extern int sigvec (int, struct sigvec *, struct sigvec *); extern int killpg (pid_t, int); # 355 "/usr/include/sys/signal.h" 3 struct sigstack { char *ss_sp; int ss_onstack; }; extern char *__sys_siglist[]; extern int __sys_nsig; # 466 "/usr/include/sys/signal.h" 3 extern int sigpause (int); # 475 "/usr/include/sys/signal.h" 3 extern int sigreturn (struct sigcontext *); extern int sigblock (int); extern int sigsetmask (int); extern int sigstack (struct sigstack *, struct sigstack *); extern int siginterrupt (int, int); # 491 "/usr/include/sys/signal.h" 3 extern int _Psigwait (const sigset_t *set, int *sig); # 510 "/usr/include/sys/signal.h" 3 extern void (*sigset (int, void (*)(int))) (int); extern int sighold (int); extern int sigrelse (int); # 529 "/usr/include/sys/signal.h" 3 extern int sigignore (int); # 540 "/usr/include/sys/signal.h" 3 extern int sigaltstack (stack_t *, stack_t *); # 1 "/usr/include/sys/procset.h" 1 3 # 40 "/usr/include/sys/procset.h" 3 typedef enum idop { POP_DIFF, POP_AND, POP_OR, POP_XOR # 67 "/usr/include/sys/procset.h" 3 } idop_t; typedef enum idtype { P_PID, P_PPID, P_PGID, P_SID, P_CID, P_UID, P_GID, P_ALL } idtype_t; typedef struct procset { idop_t p_op; idtype_t p_lidtype; id_t p_lid; idtype_t p_ridtype; id_t p_rid; } procset_t; # 542 "/usr/include/sys/signal.h" 2 3 extern int sigsendset (const procset_t *, int); extern int sigsend (idtype_t, id_t, int); int (*ssignal (int, int (*)(int))) (int); int gsignal (int); # 158 "/usr/include/sys/param.h" 2 3 # 162 "../../gcc/system.h" 2 # 1 "include/limits.h" 1 3 # 11 "include/limits.h" 3 # 1 "include/syslimits.h" 1 3 # 12 "include/limits.h" 2 3 # 168 "../../gcc/system.h" 2 # 1 "../../gcc/hwint.h" 1 # 172 "../../gcc/system.h" 2 # 200 "../../gcc/system.h" # 1 "/usr/include/sys/time.h" 1 3 # 68 "/usr/include/sys/time.h" 3 struct timeval { time_t tv_sec; int tv_usec; }; # 105 "/usr/include/sys/time.h" 3 struct itimerval { struct timeval it_interval; struct timeval it_value; }; # 133 "/usr/include/sys/time.h" 3 # 1 "include/time.h" 1 3 # 100 "include/time.h" 3 struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; long tm_gmtoff; char *tm_zone; }; extern time_t time (time_t *); extern char *ctime (const time_t *); extern struct tm *gmtime (const time_t *); extern struct tm *localtime (const time_t *); extern time_t mktime (struct tm *); extern double difftime (time_t , time_t ); # 139 "include/time.h" 3 extern char *asctime (const struct tm *); extern clock_t clock (void); extern size_t strftime (char *, size_t , const char *,const struct tm *); # 157 "include/time.h" 3 extern char * _Pasctime_r (const struct tm *, char *); extern char * _Pctime_r (const time_t *, char *); extern struct tm * _Pgmtime_r (const time_t *, struct tm *); extern struct tm * _Plocaltime_r (const time_t *, struct tm *); # 212 "include/time.h" 3 # 1 "/usr/include/sys/timers.h" 1 3 # 97 "/usr/include/sys/timers.h" 3 typedef int clockid_t; # 109 "/usr/include/sys/timers.h" 3 struct itimerspec { struct timespec it_interval; struct timespec it_value; }; # 135 "/usr/include/sys/timers.h" 3 int clock_gettime (clockid_t, struct timespec *); int clock_settime (clockid_t, const struct timespec *); int clock_getdrift (int, int *); int clock_setdrift (int, const int, int *); int timer_create (clockid_t, struct sigevent *, timer_t *); int timer_delete (timer_t); int timer_gettime (timer_t, struct itimerspec *); int timer_settime (timer_t, int, const struct itimerspec *, struct itimerspec *); int timer_getoverrun (timer_t); int nanosleep (const struct timespec *, struct timespec *); int clock_getres (clockid_t, struct timespec *); # 213 "include/time.h" 2 3 # 222 "include/time.h" 3 extern char *tzname[]; extern void tzset (void); extern long timezone; extern int daylight; extern char *strptime (const char *, const char *, struct tm *); # 258 "include/time.h" 3 extern struct tm *getdate (char *); extern int getdate_err; # 134 "/usr/include/sys/time.h" 2 3 # 176 "/usr/include/sys/time.h" 3 struct timezone { int tz_minuteswest; int tz_dsttime; }; # 193 "/usr/include/sys/time.h" 3 extern int adjtime (struct timeval *, struct timeval *); extern int settimeofday (struct timeval *, struct timezone *); extern int stime (long *); # 209 "/usr/include/sys/time.h" 3 extern int utimes (const char *, struct timeval *); extern int setitimer (int, struct itimerval *, struct itimerval *); extern int gettimeofday (struct timeval *, struct timezone *); extern int getitimer (int, struct itimerval *); # 201 "../../gcc/system.h" 2 # 213 "../../gcc/system.h" # 1 "/usr/include/fcntl.h" 1 3 # 39 "/usr/include/fcntl.h" 3 # 1 "/usr/include/sys/fcntl.h" 1 3 # 68 "/usr/include/sys/fcntl.h" 3 struct flock { short l_type; short l_whence; off_t l_start; off_t l_len; pid_t l_pid; }; extern int open (const char *, int , ...); extern int creat (const char *, mode_t ); extern int fcntl (int , int ,...); # 162 "/usr/include/sys/fcntl.h" 3 # 1 "/usr/include/sys/mode.h" 1 3 # 163 "/usr/include/sys/fcntl.h" 2 3 # 272 "/usr/include/sys/fcntl.h" 3 struct eflock { short l_type; short l_whence; off_t l_start; off_t l_len; pid_t l_pid; pid_t l_rpid; int l_rsys; short l_xxx; int l_cb; }; # 295 "/usr/include/sys/fcntl.h" 3 typedef struct { ulong version; ulong operation; ulong action; ulong info_buf_size; void *info_buf; ulong spare[2]; } advfs_opT; # 326 "/usr/include/sys/fcntl.h" 3 struct extentmapentry { unsigned long offset; unsigned long size; }; struct extentmap { unsigned long arraysize; unsigned long numextents; unsigned long offset; struct extentmapentry *extent; }; # 40 "/usr/include/fcntl.h" 2 3 # 214 "../../gcc/system.h" 2 # 251 "../../gcc/system.h" # 1 "include/sys/wait.h" 1 3 # 90 "include/sys/wait.h" 3 extern pid_t wait(int *); # 103 "include/sys/wait.h" 3 extern pid_t waitpid(pid_t , int *, int ); # 169 "include/sys/wait.h" 3 # 1 "/usr/include/sys/resource.h" 1 3 # 94 "/usr/include/sys/resource.h" 3 struct rusage { struct timeval ru_utime; struct timeval ru_stime; long ru_maxrss; long ru_ixrss; long ru_idrss; long ru_isrss; long ru_minflt; long ru_majflt; long ru_nswap; long ru_inblock; long ru_oublock; long ru_msgsnd; long ru_msgrcv; long ru_nsignals; long ru_nvcsw; long ru_nivcsw; }; # 152 "/usr/include/sys/resource.h" 3 struct rlimit { rlim_t rlim_cur; rlim_t rlim_max; }; struct rusage_dev { struct rusage ru_rusage; dev_t ru_dev; }; # 181 "/usr/include/sys/resource.h" 3 # 203 "/usr/include/sys/resource.h" 3 extern int getpriority (int, int); extern int setpriority (int, int, int); extern int setrlimit (int, struct rlimit *); extern int getrlimit (int, struct rlimit *); extern int getrusage (int, struct rusage *); # 238 "/usr/include/sys/resource.h" 3 struct profil_args { unsigned int *buffer; void *highpc; void *lowpc; unsigned long scale; }; # 171 "include/sys/wait.h" 2 3 union wait; extern pid_t wait4 (pid_t, union wait *, int, struct rusage *); # 319 "include/sys/wait.h" 3 extern pid_t waitid(idtype_t, id_t, siginfo_t *, int); # 252 "../../gcc/system.h" 2 # 312 "../../gcc/system.h" # 1 "/usr/include/malloc.h" 1 3 # 66 "/usr/include/malloc.h" 3 struct mallinfo { int arena; int ordblks; int smblks; int hblks; int hblkhd; int usmblks; int fsmblks; int uordblks; int fordblks; int keepcost; }; # 109 "/usr/include/malloc.h" 3 extern int mallopt(int, int); extern struct mallinfo mallinfo(void); extern size_t mallocblksize (void*); extern void *acreate(void *, size_t, int, void *, void *(*)(size_t, void *)); extern int adelete(void *); extern void *amalloc(size_t, void *); extern void afree(void *, void *); extern void *arealloc(void *, size_t, void *); extern void *acalloc(size_t, size_t, void *); extern int amallopt(int, int, void *); extern size_t amallocblksize (void *, void *); extern struct mallinfo amallinfo(void *); # 313 "../../gcc/system.h" 2 # 331 "../../gcc/system.h" extern const char *strsignal (int); # 381 "../../gcc/system.h" # 1 "/usr/include/sys/stat.h" 1 3 # 203 "/usr/include/sys/stat.h" 3 struct stat { dev_t st_dev; int st_retired1; mode_t st_mode; nlink_t st_nlink; short st_nlink_reserved; uid_t st_uid; gid_t st_gid; dev_t st_rdev; dev_t st_ldev; off_t st_size; time_t st_retired2; int st_uatime; time_t st_retired3; int st_umtime; time_t st_retired4; int st_uctime; int st_retired5; int st_retired6; uint_t st_flags; uint_t st_gen; long st_spare[4]; ino_t st_ino; int st_ino_reserved; time_t st_atime; int st_atime_reserved; time_t st_mtime; int st_mtime_reserved; time_t st_ctime; int st_ctime_reserved; long st_blksize; long st_blocks; }; # 333 "/usr/include/sys/stat.h" 3 extern int _F64_stat (const char *, struct stat *); #pragma extern_prefix "" extern int _F64_fstat (int , struct stat *); #pragma extern_prefix "" extern int _F64_lstat (const char *, struct stat *); #pragma extern_prefix "" # 371 "/usr/include/sys/stat.h" 3 extern int mkdir (const char *, mode_t ); extern mode_t umask (mode_t ); extern int chmod (const char *, mode_t ); extern int fchmod (int, mode_t ); extern int mknod (const char *, mode_t, ... ); extern int mkfifo (const char *, mode_t ); # 382 "../../gcc/system.h" 2 # 490 "../../gcc/system.h" # 1 "../../include/libiberty.h" 1 # 46 "../../include/libiberty.h" # 1 "include/stddef.h" 1 3 # 47 "../../include/libiberty.h" 2 extern char **buildargv (const char *) __attribute__ ((__malloc__)); extern void freeargv (char **); extern char **dupargv (char **) __attribute__ ((__malloc__)); # 86 "../../include/libiberty.h" extern const char *lbasename (const char *); extern char *concat (const char *, ...) __attribute__ ((__malloc__)); # 101 "../../include/libiberty.h" extern char *reconcat (char *, const char *, ...) __attribute__ ((__malloc__)); extern unsigned long concat_length (const char *, ...); extern char *concat_copy (char *, const char *, ...); extern char *concat_copy2 (const char *, ...); extern char *libiberty_concat_ptr; # 137 "../../include/libiberty.h" extern int fdmatch (int fd1, int fd2); extern char * getpwd (void); extern long get_run_time (void); extern char *choose_temp_base (void) __attribute__ ((__malloc__)); extern char *make_temp_file (const char *) __attribute__ ((__malloc__)); extern const char *spaces (int count); extern int errno_max (void); extern const char *strerrno (int); extern int strtoerrno (const char *); extern char *xstrerror (int); extern int signo_max (void); # 193 "../../include/libiberty.h" extern const char *strsigno (int); extern int strtosigno (const char *); extern int xatexit (void (*fn) (void)); extern void xexit (int status) __attribute__ ((__noreturn__)); extern void xmalloc_set_program_name (const char *); extern void xmalloc_failed (size_t) __attribute__ ((__noreturn__)); extern void * xmalloc (size_t) __attribute__ ((__malloc__)); extern void * xrealloc (void *, size_t); extern void * xcalloc (size_t, size_t) __attribute__ ((__malloc__)); extern char *xstrdup (const char *) __attribute__ ((__malloc__)); extern void * xmemdup (const void *, size_t, size_t) __attribute__ ((__malloc__)); extern const char _hex_value[256]; extern void hex_init (void); # 260 "../../include/libiberty.h" extern int pexecute (const char *, char * const *, const char *, const char *, char **, char **, int); extern int pwait (int, int *, int); extern int asprintf (char **, const char *, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int vasprintf (char **, const char *, va_list) __attribute__ ((__format__ (__printf__, 2, 0))); # 286 "../../include/libiberty.h" extern void * C_alloca (size_t) __attribute__ ((__malloc__)); # 491 "../../gcc/system.h" 2 # 1 "../../include/symcat.h" 1 # 492 "../../gcc/system.h" 2 # 33 "../../gcc/predict.c" 2 # 1 "../../gcc/tree.h" 1 # 22 "../../gcc/tree.h" # 1 "../../gcc/machmode.h" 1 # 29 "../../gcc/machmode.h" enum machine_mode { # 1 "../../gcc/machmode.def" 1 # 74 "../../gcc/machmode.def" VOIDmode, BImode, QImode, HImode, SImode, DImode, TImode, OImode, PQImode, PHImode, PSImode, PDImode, QFmode, HFmode, TQFmode, SFmode, DFmode, XFmode, TFmode, QCmode, HCmode, SCmode, DCmode, XCmode, TCmode, CQImode, CHImode, CSImode, CDImode, CTImode, COImode, V2QImode, V2HImode, V2SImode, V2DImode, V4QImode, V4HImode, V4SImode, V4DImode, V8QImode, V8HImode, V8SImode, V8DImode, V16QImode, V2SFmode, V2DFmode, V4SFmode, V4DFmode, V8SFmode, V8DFmode, V16SFmode, BLKmode, # 159 "../../gcc/machmode.def" CCmode, # 31 "../../gcc/machmode.h" 2 MAX_MACHINE_MODE }; # 41 "../../gcc/machmode.h" extern const char * const mode_name[(int) MAX_MACHINE_MODE]; enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT, MODE_PARTIAL_INT, MODE_CC, MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MODE_VECTOR_INT, MODE_VECTOR_FLOAT, MAX_MODE_CLASS}; extern const enum mode_class mode_class[(int) MAX_MACHINE_MODE]; # 80 "../../gcc/machmode.h" extern const unsigned char mode_size[(int) MAX_MACHINE_MODE]; extern const unsigned char mode_unit_size[(int) MAX_MACHINE_MODE]; # 96 "../../gcc/machmode.h" extern const unsigned short mode_bitsize[(int) MAX_MACHINE_MODE]; # 106 "../../gcc/machmode.h" extern const unsigned long mode_mask_array[(int) MAX_MACHINE_MODE]; extern const enum machine_mode inner_mode_array[(int) MAX_MACHINE_MODE]; # 123 "../../gcc/machmode.h" extern const unsigned char mode_wider_mode[(int) MAX_MACHINE_MODE]; extern enum machine_mode mode_for_size (unsigned int, enum mode_class, int); extern enum machine_mode smallest_mode_for_size (unsigned int, enum mode_class); extern enum machine_mode int_mode_for_mode (enum machine_mode); extern enum machine_mode get_best_mode (int, int, unsigned int, enum machine_mode, int); extern unsigned get_mode_alignment (enum machine_mode); extern const enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS]; extern enum machine_mode byte_mode; extern enum machine_mode word_mode; extern enum machine_mode ptr_mode; # 23 "../../gcc/tree.h" 2 # 1 "../../gcc/version.h" 1 extern const char *const version_string; # 24 "../../gcc/tree.h" 2 enum tree_code { # 1 "../../gcc/tree.def" 1 # 46 "../../gcc/tree.def" ERROR_MARK, IDENTIFIER_NODE, TREE_LIST, TREE_VEC, # 84 "../../gcc/tree.def" BLOCK, # 129 "../../gcc/tree.def" VOID_TYPE, # 139 "../../gcc/tree.def" INTEGER_TYPE, REAL_TYPE, COMPLEX_TYPE, VECTOR_TYPE, # 164 "../../gcc/tree.def" ENUMERAL_TYPE, BOOLEAN_TYPE, CHAR_TYPE, POINTER_TYPE, OFFSET_TYPE, REFERENCE_TYPE, METHOD_TYPE, FILE_TYPE, # 209 "../../gcc/tree.def" ARRAY_TYPE, SET_TYPE, # 225 "../../gcc/tree.def" RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE, FUNCTION_TYPE, LANG_TYPE, # 262 "../../gcc/tree.def" INTEGER_CST, REAL_CST, COMPLEX_CST, VECTOR_CST, STRING_CST, # 336 "../../gcc/tree.def" FUNCTION_DECL, LABEL_DECL, CONST_DECL, TYPE_DECL, VAR_DECL, PARM_DECL, RESULT_DECL, FIELD_DECL, NAMESPACE_DECL, COMPONENT_REF, # 363 "../../gcc/tree.def" BIT_FIELD_REF, INDIRECT_REF, BUFFER_REF, ARRAY_REF, ARRAY_RANGE_REF, VTABLE_REF, # 409 "../../gcc/tree.def" CONSTRUCTOR, # 419 "../../gcc/tree.def" COMPOUND_EXPR, MODIFY_EXPR, INIT_EXPR, TARGET_EXPR, # 443 "../../gcc/tree.def" COND_EXPR, # 466 "../../gcc/tree.def" BIND_EXPR, CALL_EXPR, METHOD_CALL_EXPR, # 490 "../../gcc/tree.def" WITH_CLEANUP_EXPR, # 507 "../../gcc/tree.def" CLEANUP_POINT_EXPR, # 556 "../../gcc/tree.def" PLACEHOLDER_EXPR, WITH_RECORD_EXPR, PLUS_EXPR, MINUS_EXPR, MULT_EXPR, TRUNC_DIV_EXPR, CEIL_DIV_EXPR, FLOOR_DIV_EXPR, ROUND_DIV_EXPR, TRUNC_MOD_EXPR, CEIL_MOD_EXPR, FLOOR_MOD_EXPR, ROUND_MOD_EXPR, RDIV_EXPR, EXACT_DIV_EXPR, FIX_TRUNC_EXPR, FIX_CEIL_EXPR, FIX_FLOOR_EXPR, FIX_ROUND_EXPR, FLOAT_EXPR, NEGATE_EXPR, MIN_EXPR, MAX_EXPR, ABS_EXPR, FFS_EXPR, # 628 "../../gcc/tree.def" LSHIFT_EXPR, RSHIFT_EXPR, LROTATE_EXPR, RROTATE_EXPR, BIT_IOR_EXPR, BIT_XOR_EXPR, BIT_AND_EXPR, BIT_ANDTC_EXPR, BIT_NOT_EXPR, # 649 "../../gcc/tree.def" TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR, TRUTH_AND_EXPR, TRUTH_OR_EXPR, TRUTH_XOR_EXPR, TRUTH_NOT_EXPR, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EQ_EXPR, NE_EXPR, UNORDERED_EXPR, ORDERED_EXPR, UNLT_EXPR, UNLE_EXPR, UNGT_EXPR, UNGE_EXPR, UNEQ_EXPR, IN_EXPR, SET_LE_EXPR, CARD_EXPR, RANGE_EXPR, CONVERT_EXPR, NOP_EXPR, NON_LVALUE_EXPR, # 707 "../../gcc/tree.def" VIEW_CONVERT_EXPR, SAVE_EXPR, # 722 "../../gcc/tree.def" UNSAVE_EXPR, # 731 "../../gcc/tree.def" RTL_EXPR, ADDR_EXPR, REFERENCE_EXPR, ENTRY_VALUE_EXPR, FDESC_EXPR, COMPLEX_EXPR, CONJ_EXPR, REALPART_EXPR, IMAGPART_EXPR, PREDECREMENT_EXPR, PREINCREMENT_EXPR, POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, VA_ARG_EXPR, TRY_CATCH_EXPR, # 790 "../../gcc/tree.def" TRY_FINALLY_EXPR, GOTO_SUBROUTINE_EXPR, LABEL_EXPR, GOTO_EXPR, RETURN_EXPR, EXIT_EXPR, LOOP_EXPR, LABELED_BLOCK_EXPR, EXIT_BLOCK_EXPR, # 844 "../../gcc/tree.def" EXPR_WITH_FILE_LOCATION, SWITCH_EXPR, EXC_PTR_EXPR, # 31 "../../gcc/tree.h" 2 LAST_AND_UNUSED_TREE_CODE }; # 49 "../../gcc/tree.h" extern char tree_code_type[256]; # 60 "../../gcc/tree.h" extern int tree_code_length[256]; extern const char *tree_code_name[256]; enum built_in_class { NOT_BUILT_IN = 0, BUILT_IN_FRONTEND, BUILT_IN_MD, BUILT_IN_NORMAL }; extern const char *const built_in_class_names[4]; enum built_in_function { # 1 "../../gcc/builtins.def" 1 # 145 "../../gcc/builtins.def" BUILT_IN_ALLOCA, BUILT_IN_ABS, BUILT_IN_LABS, BUILT_IN_FABS, BUILT_IN_FABSF, BUILT_IN_FABSL, BUILT_IN_LLABS, BUILT_IN_IMAXABS, BUILT_IN_CONJ, BUILT_IN_CONJF, BUILT_IN_CONJL, BUILT_IN_CREAL, BUILT_IN_CREALF, BUILT_IN_CREALL, BUILT_IN_CIMAG, BUILT_IN_CIMAGF, BUILT_IN_CIMAGL, BUILT_IN_DIV, BUILT_IN_LDIV, BUILT_IN_FFLOOR, BUILT_IN_FCEIL, BUILT_IN_FMOD, BUILT_IN_FREM, BUILT_IN_BZERO, BUILT_IN_BCMP, BUILT_IN_FFS, BUILT_IN_INDEX, BUILT_IN_RINDEX, BUILT_IN_MEMCPY, BUILT_IN_MEMCMP, BUILT_IN_MEMSET, BUILT_IN_STRCAT, BUILT_IN_STRNCAT, BUILT_IN_STRCPY, BUILT_IN_STRNCPY, BUILT_IN_STRCMP, BUILT_IN_STRNCMP, BUILT_IN_STRLEN, BUILT_IN_STRSTR, BUILT_IN_STRPBRK, BUILT_IN_STRSPN, BUILT_IN_STRCSPN, BUILT_IN_STRCHR, BUILT_IN_STRRCHR, BUILT_IN_SQRT, BUILT_IN_SIN, BUILT_IN_COS, BUILT_IN_SQRTF, BUILT_IN_SINF, BUILT_IN_COSF, BUILT_IN_SQRTL, BUILT_IN_SINL, BUILT_IN_COSL, BUILT_IN_GETEXP, BUILT_IN_GETMAN, BUILT_IN_SAVEREGS, BUILT_IN_CLASSIFY_TYPE, BUILT_IN_NEXT_ARG, BUILT_IN_ARGS_INFO, BUILT_IN_CONSTANT_P, BUILT_IN_FRAME_ADDRESS, BUILT_IN_RETURN_ADDRESS, BUILT_IN_AGGREGATE_INCOMING_ADDRESS, BUILT_IN_APPLY_ARGS, BUILT_IN_APPLY, BUILT_IN_RETURN, BUILT_IN_SETJMP, BUILT_IN_LONGJMP, BUILT_IN_TRAP, BUILT_IN_PREFETCH, BUILT_IN_PUTCHAR, BUILT_IN_PUTS, BUILT_IN_PRINTF, BUILT_IN_FPUTC, BUILT_IN_FPUTS, BUILT_IN_FWRITE, BUILT_IN_FPRINTF, BUILT_IN_PUTCHAR_UNLOCKED, BUILT_IN_PUTS_UNLOCKED, BUILT_IN_PRINTF_UNLOCKED, BUILT_IN_FPUTC_UNLOCKED, BUILT_IN_FPUTS_UNLOCKED, BUILT_IN_FWRITE_UNLOCKED, BUILT_IN_FPRINTF_UNLOCKED, BUILT_IN_ISGREATER, BUILT_IN_ISGREATEREQUAL, BUILT_IN_ISLESS, BUILT_IN_ISLESSEQUAL, BUILT_IN_ISLESSGREATER, BUILT_IN_ISUNORDERED, BUILT_IN_UNWIND_INIT, BUILT_IN_DWARF_CFA, BUILT_IN_DWARF_FP_REGNUM, BUILT_IN_INIT_DWARF_REG_SIZES, BUILT_IN_FROB_RETURN_ADDR, BUILT_IN_EXTRACT_RETURN_ADDR, BUILT_IN_EH_RETURN, BUILT_IN_EH_RETURN_DATA_REGNO, BUILT_IN_VARARGS_START, BUILT_IN_STDARG_START, BUILT_IN_VA_END, BUILT_IN_VA_COPY, BUILT_IN_EXPECT, BUILT_IN_NEW, BUILT_IN_VEC_NEW, BUILT_IN_DELETE, BUILT_IN_VEC_DELETE, # 87 "../../gcc/tree.h" 2 END_BUILTINS }; extern const char *const built_in_names[(int) END_BUILTINS]; extern tree built_in_decls[(int) END_BUILTINS]; # 121 "../../gcc/tree.h" struct tree_common { tree chain; tree type; enum tree_code code : 8; unsigned side_effects_flag : 1; unsigned constant_flag : 1; unsigned addressable_flag : 1; unsigned volatile_flag : 1; unsigned readonly_flag : 1; unsigned unsigned_flag : 1; unsigned asm_written_flag: 1; unsigned unused_0 : 1; unsigned used_flag : 1; unsigned nothrow_flag : 1; unsigned static_flag : 1; unsigned public_flag : 1; unsigned private_flag : 1; unsigned protected_flag : 1; unsigned bounded_flag : 1; unsigned deprecated_flag : 1; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; unsigned lang_flag_2 : 1; unsigned lang_flag_3 : 1; unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; unsigned unused_1 : 1; }; # 332 "../../gcc/tree.h" # 1 "tree-check.h" 1 # 333 "../../gcc/tree.h" 2 # 705 "../../gcc/tree.h" struct tree_int_cst { struct tree_common common; rtx rtl; struct { unsigned long low; long high; } int_cst; }; # 732 "../../gcc/tree.h" # 1 "../../gcc/real.h" 1 # 107 "../../gcc/real.h" typedef struct { long r[(19 + sizeof (long))/(sizeof (long))]; } realvaluetype; # 131 "../../gcc/real.h" extern unsigned int significand_size (enum machine_mode); # 144 "../../gcc/real.h" extern void earith (realvaluetype *, int, realvaluetype *, realvaluetype *); extern realvaluetype etrunci (realvaluetype); extern realvaluetype etruncui (realvaluetype); extern realvaluetype ereal_negate (realvaluetype); extern long efixi (realvaluetype); extern unsigned long efixui (realvaluetype); extern void ereal_from_int (realvaluetype *, long, long, enum machine_mode); extern void ereal_from_uint (realvaluetype *, unsigned long, unsigned long, enum machine_mode); extern void ereal_to_int (long *, long *, realvaluetype); extern realvaluetype ereal_ldexp (realvaluetype, int); extern void etartdouble (realvaluetype, long *); extern void etarldouble (realvaluetype, long *); extern void etardouble (realvaluetype, long *); extern long etarsingle (realvaluetype); extern void ereal_to_decimal (realvaluetype, char *); extern int ereal_cmp (realvaluetype, realvaluetype); extern int ereal_isneg (realvaluetype); extern realvaluetype ereal_unto_float (long); extern realvaluetype ereal_unto_double (long *); extern realvaluetype ereal_from_float (long); extern realvaluetype ereal_from_double (long *); # 406 "../../gcc/real.h" extern realvaluetype real_value_truncate (enum machine_mode, realvaluetype); # 437 "../../gcc/real.h" extern realvaluetype dconst0; extern realvaluetype dconst1; extern realvaluetype dconst2; extern realvaluetype dconstm1; union real_extract { realvaluetype d; long i[sizeof (realvaluetype) / sizeof (long)]; }; union tree_node; realvaluetype real_value_from_int_cst (union tree_node *, union tree_node *); # 466 "../../gcc/real.h" extern struct rtx_def *immed_real_const_1 (realvaluetype, enum machine_mode); # 478 "../../gcc/real.h" extern int exact_real_inverse (enum machine_mode, realvaluetype *); extern int target_isnan (realvaluetype); extern int target_isinf (realvaluetype); extern int target_negative (realvaluetype); extern void debug_real (realvaluetype); extern realvaluetype ereal_atof (const char *, enum machine_mode); # 733 "../../gcc/tree.h" 2 struct tree_real_cst { struct tree_common common; rtx rtl; realvaluetype real_cst; }; struct tree_string { struct tree_common common; rtx rtl; int length; const char *pointer; }; struct tree_complex { struct tree_common common; rtx rtl; tree real; tree imag; }; struct tree_vector { struct tree_common common; rtx rtl; tree elements; }; # 1 "../../gcc/hashtable.h" 1 # 21 "../../gcc/hashtable.h" # 1 "../../include/obstack.h" 1 # 161 "../../include/obstack.h" struct _obstack_chunk { char *limit; struct _obstack_chunk *prev; char contents[4]; }; struct obstack { long chunk_size; struct _obstack_chunk *chunk; char *object_base; char *next_free; char *chunk_limit; long int temp; int alignment_mask; struct _obstack_chunk *(*chunkfun) (void *, long); void (*freefun) (void *, struct _obstack_chunk *); void *extra_arg; unsigned use_extra_arg:1; unsigned maybe_empty_object:1; unsigned alloc_failed:1; }; extern void _obstack_newchunk (struct obstack *, int); extern void _obstack_free (struct obstack *, void *); extern int _obstack_begin (struct obstack *, int, int, void *(*) (long), void (*) (void *)); extern int _obstack_begin_1 (struct obstack *, int, int, void *(*) (void *, long), void (*) (void *, void *), void *); extern int _obstack_memory_used (struct obstack *); # 223 "../../include/obstack.h" void obstack_init (struct obstack *obstack); void * obstack_alloc (struct obstack *obstack, int size); void * obstack_copy (struct obstack *obstack, void *address, int size); void * obstack_copy0 (struct obstack *obstack, void *address, int size); void obstack_free (struct obstack *obstack, void *block); void obstack_blank (struct obstack *obstack, int size); void obstack_grow (struct obstack *obstack, void *data, int size); void obstack_grow0 (struct obstack *obstack, void *data, int size); void obstack_1grow (struct obstack *obstack, int data_char); void obstack_ptr_grow (struct obstack *obstack, void *data); void obstack_int_grow (struct obstack *obstack, int data); void * obstack_finish (struct obstack *obstack); int obstack_object_size (struct obstack *obstack); int obstack_room (struct obstack *obstack); void obstack_make_room (struct obstack *obstack, int size); void obstack_1grow_fast (struct obstack *obstack, int data_char); void obstack_ptr_grow_fast (struct obstack *obstack, void *data); void obstack_int_grow_fast (struct obstack *obstack, int data); void obstack_blank_fast (struct obstack *obstack, int size); void * obstack_base (struct obstack *obstack); void * obstack_next_free (struct obstack *obstack); int obstack_alignment_mask (struct obstack *obstack); int obstack_chunk_size (struct obstack *obstack); int obstack_memory_used (struct obstack *obstack); # 267 "../../include/obstack.h" extern void (*obstack_alloc_failed_handler) (void); extern int obstack_exit_failure; # 22 "../../gcc/hashtable.h" 2 typedef struct ht_identifier ht_identifier; struct ht_identifier { unsigned int len; const unsigned char *str; }; # 39 "../../gcc/hashtable.h" struct cpp_reader; typedef struct ht hash_table; typedef struct ht_identifier *hashnode; enum ht_lookup_option {HT_NO_INSERT = 0, HT_ALLOC, HT_ALLOCED}; struct ht { struct obstack stack; hashnode *entries; hashnode (*alloc_node) (hash_table *); unsigned int nslots; unsigned int nelements; struct cpp_reader *pfile; unsigned int searches; unsigned int collisions; }; extern void gcc_obstack_init (struct obstack *); extern hash_table *ht_create (unsigned int order); extern void ht_destroy (hash_table *); extern hashnode ht_lookup (hash_table *, const unsigned char *, unsigned int, enum ht_lookup_option); typedef int (*ht_cb) (struct cpp_reader *, hashnode, const void *); extern void ht_forall (hash_table *, ht_cb, const void *); extern void ht_dump_statistics (hash_table *); extern double approx_sqrt (double); # 776 "../../gcc/tree.h" 2 # 791 "../../gcc/tree.h" struct tree_identifier { struct tree_common common; struct ht_identifier id; }; struct tree_list { struct tree_common common; tree purpose; tree value; }; struct tree_vec { struct tree_common common; int length; tree a[1]; }; # 879 "../../gcc/tree.h" struct tree_exp { struct tree_common common; int complexity; tree operands[1]; }; # 931 "../../gcc/tree.h" struct tree_block { struct tree_common common; unsigned handler_block_flag : 1; unsigned abstract_flag : 1; unsigned block_num : 30; tree vars; tree subblocks; tree supercontext; tree abstract_origin; tree fragment_origin; tree fragment_chain; }; # 1208 "../../gcc/tree.h" struct tree_type { struct tree_common common; tree values; tree size; tree size_unit; tree attributes; unsigned int uid; unsigned int precision : 9; enum machine_mode mode : 7; unsigned string_flag : 1; unsigned no_force_blk_flag : 1; unsigned needs_constructing_flag : 1; unsigned transparent_union_flag : 1; unsigned packed_flag : 1; unsigned restrict_flag : 1; unsigned pointer_depth : 2; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; unsigned lang_flag_2 : 1; unsigned lang_flag_3 : 1; unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; unsigned user_align : 1; unsigned int align; tree pointer_to; tree reference_to; union {int address; char *pointer; } symtab; tree name; tree minval; tree maxval; tree next_variant; tree main_variant; tree binfo; tree context; long alias_set; struct lang_type *lang_specific; }; # 1754 "../../gcc/tree.h" struct function; struct tree_decl { struct tree_common common; const char *filename; int linenum; unsigned int uid; tree size; enum machine_mode mode : 8; unsigned external_flag : 1; unsigned nonlocal_flag : 1; unsigned regdecl_flag : 1; unsigned inline_flag : 1; unsigned bit_field_flag : 1; unsigned virtual_flag : 1; unsigned ignored_flag : 1; unsigned abstract_flag : 1; unsigned in_system_header_flag : 1; unsigned common_flag : 1; unsigned defer_output : 1; unsigned transparent_union : 1; unsigned static_ctor_flag : 1; unsigned static_dtor_flag : 1; unsigned artificial_flag : 1; unsigned weak_flag : 1; unsigned non_addr_const_p : 1; unsigned no_instrument_function_entry_exit : 1; unsigned comdat_flag : 1; unsigned malloc_flag : 1; unsigned no_limit_stack : 1; enum built_in_class built_in_class : 2; unsigned pure_flag : 1; unsigned pointer_depth : 2; unsigned non_addressable : 1; unsigned user_align : 1; unsigned uninlinable : 1; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; unsigned lang_flag_2 : 1; unsigned lang_flag_3 : 1; unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; unsigned lang_flag_7 : 1; union { enum built_in_function f; long i; struct {unsigned int align : 24; unsigned int off_align : 8;} a; } u1; tree size_unit; tree name; tree context; tree arguments; tree result; tree initial; tree abstract_origin; tree assembler_name; tree section_name; tree attributes; rtx rtl; rtx live_range_rtl; union { struct function *f; rtx r; tree t; int i; } u2; tree saved_tree; tree inlined_fns; tree vindex; long pointer_alias_set; struct lang_decl *lang_specific; }; union tree_node { struct tree_common common; struct tree_int_cst int_cst; struct tree_real_cst real_cst; struct tree_vector vector; struct tree_string string; struct tree_complex complex; struct tree_identifier identifier; struct tree_decl decl; struct tree_type type; struct tree_list list; struct tree_vec vec; struct tree_exp exp; struct tree_block block; }; enum tree_index { TI_ERROR_MARK, TI_INTQI_TYPE, TI_INTHI_TYPE, TI_INTSI_TYPE, TI_INTDI_TYPE, TI_INTTI_TYPE, TI_UINTQI_TYPE, TI_UINTHI_TYPE, TI_UINTSI_TYPE, TI_UINTDI_TYPE, TI_UINTTI_TYPE, TI_INTEGER_ZERO, TI_INTEGER_ONE, TI_INTEGER_MINUS_ONE, TI_NULL_POINTER, TI_SIZE_ZERO, TI_SIZE_ONE, TI_BITSIZE_ZERO, TI_BITSIZE_ONE, TI_BITSIZE_UNIT, TI_COMPLEX_INTEGER_TYPE, TI_COMPLEX_FLOAT_TYPE, TI_COMPLEX_DOUBLE_TYPE, TI_COMPLEX_LONG_DOUBLE_TYPE, TI_FLOAT_TYPE, TI_DOUBLE_TYPE, TI_LONG_DOUBLE_TYPE, TI_VOID_TYPE, TI_PTR_TYPE, TI_CONST_PTR_TYPE, TI_PTRDIFF_TYPE, TI_VA_LIST_TYPE, TI_VOID_LIST_NODE, TI_UV4SF_TYPE, TI_UV4SI_TYPE, TI_UV8HI_TYPE, TI_UV8QI_TYPE, TI_UV4HI_TYPE, TI_UV2SI_TYPE, TI_UV2SF_TYPE, TI_UV16QI_TYPE, TI_V4SF_TYPE, TI_V16SF_TYPE, TI_V4SI_TYPE, TI_V8HI_TYPE, TI_V8QI_TYPE, TI_V4HI_TYPE, TI_V2SI_TYPE, TI_V2SF_TYPE, TI_V16QI_TYPE, TI_MAIN_IDENTIFIER, TI_MAX }; extern tree global_trees[TI_MAX]; # 2020 "../../gcc/tree.h" enum integer_type_kind { itk_char, itk_signed_char, itk_unsigned_char, itk_short, itk_unsigned_short, itk_int, itk_unsigned_int, itk_long, itk_unsigned_long, itk_long_long, itk_unsigned_long_long, itk_none }; typedef enum integer_type_kind integer_type_kind; extern tree integer_types[itk_none]; # 2059 "../../gcc/tree.h" extern double approx_sqrt (double); extern char *permalloc (int); extern char *expralloc (int); extern size_t tree_size (tree); extern tree make_node (enum tree_code); extern tree make_lang_type (enum tree_code); extern tree (*make_lang_type_fn) (enum tree_code); extern tree copy_node (tree); extern tree copy_list (tree); extern tree make_tree_vec (int); extern tree get_identifier (const char *); extern tree get_identifier_with_length (const char *, unsigned int); extern tree maybe_get_identifier (const char *); extern tree build (enum tree_code, tree, ...); extern tree build_nt (enum tree_code, ...); extern tree build_int_2_wide (unsigned long, long); extern tree build_vector (tree, tree); extern tree build_real (tree, realvaluetype); extern tree build_real_from_int_cst (tree, tree); extern tree build_complex (tree, tree, tree); extern tree build_string (int, const char *); extern tree build1 (enum tree_code, tree, tree); extern tree build_tree_list (tree, tree); extern tree build_decl (enum tree_code, tree, tree); extern tree build_block (tree, tree, tree, tree, tree); extern tree build_expr_wfl (tree, const char *, int, int); extern tree make_signed_type (int); extern tree make_unsigned_type (int); extern void initialize_sizetypes (void); extern void set_sizetype (tree); extern tree signed_or_unsigned_type (int, tree); extern void fixup_unsigned_type (tree); extern tree build_pointer_type (tree); extern tree build_reference_type (tree); extern tree build_type_no_quals (tree); extern tree build_index_type (tree); extern tree build_index_2_type (tree, tree); extern tree build_array_type (tree, tree); extern tree build_function_type (tree, tree); extern tree build_method_type (tree, tree); extern tree build_offset_type (tree, tree); extern tree build_complex_type (tree); extern tree array_type_nelts (tree); extern tree value_member (tree, tree); extern tree purpose_member (tree, tree); extern tree binfo_member (tree, tree); extern unsigned int attribute_hash_list (tree); extern int attribute_list_equal (tree, tree); extern int attribute_list_contained (tree, tree); extern int tree_int_cst_equal (tree, tree); extern int tree_int_cst_lt (tree, tree); extern int tree_int_cst_compare (tree, tree); extern int host_integerp (tree, int); extern long tree_low_cst (tree, int); extern int tree_int_cst_msb (tree); extern int tree_int_cst_sgn (tree); extern int tree_expr_nonnegative_p (tree); extern int rtl_expr_nonnegative_p (rtx); extern int index_type_equal (tree, tree); extern tree get_inner_array_type (tree); extern tree make_tree (tree, rtx); extern tree build_type_attribute_variant (tree, tree); extern tree build_decl_attribute_variant (tree, tree); struct attribute_spec { const char *const name; const int min_length; const int max_length; const _Bool decl_required; const _Bool type_required; const _Bool function_type_required; # 2221 "../../gcc/tree.h" tree (*const handler) (tree *node, tree name, tree args, int flags, _Bool *no_add_attrs); }; extern const struct attribute_spec default_target_attribute_table[]; enum attribute_flags { ATTR_FLAG_DECL_NEXT = 1, ATTR_FLAG_FUNCTION_NEXT = 2, ATTR_FLAG_ARRAY_NEXT = 4, ATTR_FLAG_TYPE_IN_PLACE = 8, ATTR_FLAG_BUILT_IN = 16 }; extern tree merge_decl_attributes (tree, tree); extern tree merge_type_attributes (tree, tree); extern int default_comp_type_attributes (tree, tree); extern void default_set_default_type_attributes (tree); extern void default_insert_attributes (tree, tree *); extern _Bool default_function_attribute_inlinable_p (tree); extern _Bool default_ms_bitfield_layout_p (tree); extern void split_specs_attrs (tree, tree *, tree *); extern tree strip_attrs (tree); extern int valid_machine_attribute (tree, tree, tree, tree); extern int is_attribute_p (const char *, tree); extern tree lookup_attribute (const char *, tree); extern tree merge_attributes (tree, tree); # 2298 "../../gcc/tree.h" extern tree get_qualified_type (tree, int); extern tree build_qualified_type (tree, int); # 2317 "../../gcc/tree.h" extern tree build_type_copy (tree); extern void layout_type (tree); # 2332 "../../gcc/tree.h" typedef struct record_layout_info_s { tree t; tree offset; unsigned int offset_align; tree bitpos; unsigned int record_align; unsigned int unpacked_align; unsigned int unpadded_align; tree prev_field; tree pending_statics; int packed_maybe_necessary; } *record_layout_info; extern void set_lang_adjust_rli (void (*) (record_layout_info)); extern record_layout_info start_record_layout (tree); extern tree bit_from_pos (tree, tree); extern tree byte_from_pos (tree, tree); extern void pos_from_byte (tree *, tree *, unsigned int, tree); extern void pos_from_bit (tree *, tree *, unsigned int, tree); extern void normalize_offset (tree *, tree *, unsigned int); extern tree rli_size_unit_so_far (record_layout_info); extern tree rli_size_so_far (record_layout_info); extern void normalize_rli (record_layout_info); extern void place_field (record_layout_info, tree); extern void compute_record_mode (tree); extern void finish_record_layout (record_layout_info); extern tree type_hash_canon (unsigned int, tree); # 2391 "../../gcc/tree.h" extern void layout_decl (tree, unsigned); extern enum machine_mode mode_for_size_tree (tree, enum mode_class, int); extern tree non_lvalue (tree); extern tree pedantic_non_lvalue (tree); extern tree convert (tree, tree); extern unsigned int expr_align (tree); extern tree size_in_bytes (tree); extern long int_size_in_bytes (tree); extern tree bit_position (tree); extern long int_bit_position (tree); extern tree byte_position (tree); extern long int_byte_position (tree); enum size_type_kind { SIZETYPE, SSIZETYPE, USIZETYPE, BITSIZETYPE, SBITSIZETYPE, UBITSIZETYPE, TYPE_KIND_LAST}; extern tree sizetype_tab[(int) TYPE_KIND_LAST]; # 2437 "../../gcc/tree.h" extern tree size_binop (enum tree_code, tree, tree); extern tree size_diffop (tree, tree); extern tree size_int_wide (long, enum size_type_kind); extern tree size_int_type_wide (long, tree); extern tree round_up (tree, int); extern tree round_down (tree, int); extern tree get_pending_sizes (void); extern int is_pending_size (tree); extern void put_pending_size (tree); extern void put_pending_sizes (tree); # 2464 "../../gcc/tree.h" extern unsigned int maximum_field_alignment; extern unsigned int set_alignment; extern tree chainon (tree, tree); extern tree tree_cons (tree, tree, tree); extern tree tree_last (tree); extern tree nreverse (tree); extern int list_length (tree); extern int fields_length (tree); extern int integer_zerop (tree); extern int integer_onep (tree); extern int integer_all_onesp (tree); extern int integer_pow2p (tree); extern int staticp (tree); extern int lvalue_or_else (tree, const char *); extern tree save_expr (tree); extern int first_rtl_op (enum tree_code); extern tree unsave_expr (tree); extern void unsave_expr_1 (tree); extern tree unsave_expr_now (tree); extern void (*lang_unsave) (tree *); extern void (*lang_unsave_expr_now) (tree); extern int unsafe_for_reeval (tree); extern int (*lang_unsafe_for_reeval) (tree); extern int contains_placeholder_p (tree); extern int has_cleanups (tree); extern tree substitute_in_expr (tree, tree, tree); extern tree variable_size (tree); extern tree stabilize_reference (tree); extern tree stabilize_reference_1 (tree); extern tree get_unwidened (tree, tree); extern tree get_narrower (tree, int *); extern tree type_for_mode (enum machine_mode, int); extern tree type_for_size (unsigned, int); extern tree unsigned_type (tree); extern tree signed_type (tree); extern tree maybe_build_cleanup (tree); extern tree get_inner_reference (tree, long *, long *, tree *, enum machine_mode *, int *, int *); extern int handled_component_p (tree); extern tree get_containing_scope (tree); extern tree decl_function_context (tree); extern tree decl_type_context (tree); extern const char *function_cannot_inline_p (tree); extern int real_zerop (tree); extern const char *input_filename; extern int lineno; extern int pedantic_lvalues; extern int immediate_size_expand; extern tree current_function_decl; extern tree current_function_func_begin_label; extern int all_types_permanent; # 2729 "../../gcc/tree.h" extern const char *(*decl_printable_name) (tree, int); extern void (*incomplete_decl_finalize_hook) (tree); extern tree builtin_function (const char *, tree, int, enum built_in_class, const char *); extern char *perm_calloc (int, long); extern void clean_symbol_name (char *); extern tree get_file_function_name_long (const char *); extern tree get_set_constructor_bits (tree, char *, int); extern tree get_set_constructor_bytes (tree, unsigned char *, int); extern tree get_callee_fndecl (tree); extern void set_decl_assembler_name (tree); extern int type_num_arguments (tree); extern int in_control_zone_p (void); extern void expand_fixups (rtx); extern tree expand_start_stmt_expr (int); extern tree expand_end_stmt_expr (tree); extern void expand_expr_stmt (tree); extern void expand_expr_stmt_value (tree, int, int); extern int warn_if_unused_value (tree); extern void expand_decl_init (tree); extern void clear_last_expr (void); extern void expand_label (tree); extern void expand_goto (tree); extern void expand_asm (tree); extern void expand_start_cond (tree, int); extern void expand_end_cond (void); extern void expand_start_else (void); extern void expand_start_elseif (tree); extern struct nesting *expand_start_loop (int); extern struct nesting *expand_start_loop_continue_elsewhere (int); extern struct nesting *expand_start_null_loop (void); extern void expand_loop_continue_here (void); extern void expand_end_loop (void); extern void expand_end_null_loop (void); extern int expand_continue_loop (struct nesting *); extern int expand_exit_loop (struct nesting *); extern int expand_exit_loop_if_false (struct nesting *, tree); extern int expand_exit_loop_top_cond (struct nesting *, tree); extern int expand_exit_something (void); extern void expand_return (tree); extern int optimize_tail_recursion (tree, rtx); extern void expand_start_bindings_and_block (int, tree); extern void expand_end_bindings (tree, int, int); extern void warn_about_unused_variables (tree); extern void start_cleanup_deferral (void); extern void end_cleanup_deferral (void); extern int is_body_block (tree); extern int conditional_context (void); extern struct nesting * current_nesting_level (void); extern tree last_cleanup_this_contour (void); extern void expand_start_case (int, tree, tree, const char *); extern void expand_end_case_type (tree, tree); extern int add_case_node (tree, tree, tree, tree *); extern int pushcase (tree, tree (*) (tree, tree), tree, tree *); extern int pushcase_range (tree, tree, tree (*) (tree, tree), tree, tree *); extern void using_eh_for_cleanups (void); extern int stmt_loop_nest_empty (void); # 2822 "../../gcc/tree.h" extern tree fold (tree); extern int force_fit_type (tree, int); extern int add_double (unsigned long, long, unsigned long, long, unsigned long *, long *); extern int neg_double (unsigned long, long, unsigned long *, long *); extern int mul_double (unsigned long, long, unsigned long, long, unsigned long *, long *); extern void lshift_double (unsigned long, long, long, unsigned int, unsigned long *, long *, int); extern void rshift_double (unsigned long, long, long, unsigned int, unsigned long *, long *, int); extern void lrotate_double (unsigned long, long, long, unsigned int, unsigned long *, long *); extern void rrotate_double (unsigned long, long, long, unsigned int, unsigned long *, long *); extern int operand_equal_p (tree, tree, int); extern tree invert_truthvalue (tree); extern tree (*lang_type_promotes_to) (tree); extern tree fold_builtin (tree); extern void copy_lang_decl (tree); extern int yyparse (void); extern void pushlevel (int); extern tree poplevel (int, int, int); extern void set_block (tree); extern tree pushdecl (tree); extern tree getdecls (void); extern tree gettags (void); extern tree build_range_type (tree, tree, tree); extern void record_component_aliases (tree); extern long get_alias_set (tree); extern int alias_sets_conflict_p (long, long); extern int readonly_fields_p (tree); extern int objects_must_conflict_p (tree, tree); extern void (*lang_set_decl_assembler_name) (tree); struct obstack; extern int really_constant_p (tree); extern int int_fits_type_p (tree, tree); extern int tree_log2 (tree); extern int tree_floor_log2 (tree); extern void preserve_data (void); extern int object_permanent_p (tree); extern int type_precision (tree); extern int simple_cst_equal (tree, tree); extern int compare_tree_int (tree, unsigned long); extern int type_list_equal (tree, tree); extern int chain_member (tree, tree); extern int chain_member_purpose (tree, tree); extern int chain_member_value (tree, tree); extern tree listify (tree); extern tree type_hash_lookup (unsigned int, tree); extern void type_hash_add (unsigned int, tree); extern unsigned int type_hash_list (tree); extern int simple_cst_list_equal (tree, tree); extern void dump_tree_statistics (void); extern void print_obstack_statistics (const char *, struct obstack *); extern void print_obstack_name (char *, FILE *, const char *); extern void expand_function_end (const char *, int, int); extern void expand_function_start (tree, int); extern void expand_pending_sizes (tree); extern int real_onep (tree); extern int real_twop (tree); extern void gcc_obstack_init (struct obstack *); extern void init_obstacks (void); extern void build_common_tree_nodes (int); extern void build_common_tree_nodes_2 (int); extern void mark_tree_hashtable (void *); extern void setjmp_protect_args (void); extern void setjmp_protect (tree); extern void expand_main_function (void); extern void mark_varargs (void); extern void init_dummy_function_start (void); extern void expand_dummy_function_end (void); extern void init_function_for_compilation (void); extern void init_function_start (tree, const char *, int); extern void assign_parms (tree); extern void put_var_into_stack (tree); extern void flush_addressof (tree); extern void uninitialized_vars_warning (tree); extern void setjmp_args_warning (void); extern void mark_all_temps_used (void); extern void init_temp_slots (void); extern void combine_temp_slots (void); extern void free_temp_slots (void); extern void pop_temp_slots (void); extern void push_temp_slots (void); extern void preserve_temp_slots (rtx); extern void preserve_rtl_expr_temps (tree); extern int aggregate_value_p (tree); extern void free_temps_for_rtl_expr (tree); extern void instantiate_virtual_regs (tree, rtx); extern void unshare_all_rtl (tree, rtx); extern int max_parm_reg_num (void); extern void push_function_context (void); extern void pop_function_context (void); extern void push_function_context_to (tree); extern void pop_function_context_from (tree); extern void ggc_mark_struct_function (struct function *); extern void print_rtl (FILE *, rtx); extern void debug_tree (tree); extern void print_node (FILE *, const char *, tree, int); extern void print_node_brief (FILE *, const char *, tree, int); extern void indent_to (FILE *, int); extern int apply_args_register_offset (int); extern rtx expand_builtin_return_addr (enum built_in_function, int, rtx); extern void check_max_integer_computation_mode (tree); extern void start_sequence_for_rtl_expr (tree); extern rtx emit_line_note (const char *, int); extern int setjmp_call_p (tree); # 3022 "../../gcc/tree.h" extern tree decl_attributes (tree *, tree, int); extern void insert_default_attributes (tree); extern const struct attribute_spec *format_attribute_table; extern const struct attribute_spec *lang_attribute_table; extern int lang_attribute_common; extern int mark_addressable (tree); extern void incomplete_type_error (tree, tree); extern tree truthvalue_conversion (tree); extern int global_bindings_p (void); extern void insert_block (tree); extern void save_for_inline (tree); extern void set_decl_abstract_flags (tree, int); extern void output_inline_function (tree); extern void set_decl_origin_self (tree); extern void fixup_signed_type (tree); extern void internal_reference_types (void); extern void make_decl_rtl (tree, const char *); extern void make_decl_one_only (tree); extern int supports_one_only (void); extern void variable_section (tree, int); extern int div_and_round_double (enum tree_code, int, unsigned long, long, unsigned long, long, unsigned long *, long *, unsigned long *, long *); # 3076 "../../gcc/tree.h" extern void emit_nop (void); extern void expand_computed_goto (tree); extern _Bool parse_output_constraint (const char **, int, int, int, _Bool *, _Bool *, _Bool *); extern void expand_asm_operands (tree, tree, tree, tree, int, const char *, int); extern int any_pending_cleanups (int); extern void init_stmt (void); extern void init_stmt_for_function (void); extern int drop_through_at_end_p (void); extern void expand_start_target_temps (void); extern void expand_end_target_temps (void); extern void expand_elseif (tree); extern void save_stack_pointer (void); extern void expand_decl (tree); extern int expand_decl_cleanup (tree, tree); extern int expand_decl_cleanup_eh (tree, tree, int); extern void expand_anon_union_decl (tree, tree, tree); extern void move_cleanups_up (void); extern void expand_start_case_dummy (void); extern void expand_end_case_dummy (void); extern tree case_index_expr_type (void); extern long all_cases_count (tree, int *); extern void check_for_full_enumeration_handling (tree); extern void declare_nonlocal_label (tree); extern tree get_file_function_name (int); extern char *dwarf2out_cfi_label (void); extern void dwarf2out_def_cfa (const char *, unsigned, long); extern void dwarf2out_window_save (const char *); extern void dwarf2out_args_size (const char *, long); extern void dwarf2out_reg_save (const char *, unsigned, long); extern void dwarf2out_return_save (const char *, long); extern void dwarf2out_return_reg (const char *, unsigned); typedef tree (*walk_tree_fn) (tree *, int *, void *); enum tree_dump_index { TDI_all, TDI_class, TDI_original, TDI_optimized, TDI_inlined, TDI_end }; typedef struct dump_info *dump_info_p; extern int dump_flag (dump_info_p, int, tree); extern int dump_enabled_p (enum tree_dump_index); extern FILE *dump_begin (enum tree_dump_index, int *); extern void dump_end (enum tree_dump_index, FILE *); extern void dump_node (tree, int, FILE *); extern int dump_switch_p (const char *); extern const char *dump_flag_name (enum tree_dump_index); # 3180 "../../gcc/tree.h" extern void fancy_abort (const char *, int, const char *) __attribute__ ((__noreturn__)); # 34 "../../gcc/predict.c" 2 # 1 "../../gcc/rtl.h" 1 # 25 "../../gcc/rtl.h" struct function; # 1 "../../gcc/machmode.h" 1 # 28 "../../gcc/rtl.h" 2 # 41 "../../gcc/rtl.h" enum rtx_code { # 1 "../../gcc/rtl.def" 1 # 70 "../../gcc/rtl.def" UNKNOWN , NIL , INCLUDE , EXPR_LIST , INSN_LIST , # 129 "../../gcc/rtl.def" MATCH_OPERAND , MATCH_SCRATCH , MATCH_DUP , MATCH_OPERATOR , # 158 "../../gcc/rtl.def" MATCH_PARALLEL , MATCH_OP_DUP , MATCH_PAR_DUP , MATCH_INSN , # 192 "../../gcc/rtl.def" DEFINE_INSN , DEFINE_PEEPHOLE , # 211 "../../gcc/rtl.def" DEFINE_SPLIT , # 239 "../../gcc/rtl.def" DEFINE_INSN_AND_SPLIT , DEFINE_PEEPHOLE2 , DEFINE_COMBINE , # 260 "../../gcc/rtl.def" DEFINE_EXPAND , # 276 "../../gcc/rtl.def" DEFINE_DELAY , # 317 "../../gcc/rtl.def" DEFINE_FUNCTION_UNIT , DEFINE_ASM_ATTRIBUTES , # 333 "../../gcc/rtl.def" DEFINE_COND_EXEC , SEQUENCE , ADDRESS , # 353 "../../gcc/rtl.def" DEFINE_ATTR , ATTR , SET_ATTR , # 379 "../../gcc/rtl.def" SET_ATTR_ALTERNATIVE , EQ_ATTR , # 394 "../../gcc/rtl.def" ATTR_FLAG , # 407 "../../gcc/rtl.def" INSN , JUMP_INSN , CALL_INSN , BARRIER , # 430 "../../gcc/rtl.def" CODE_LABEL , NOTE , # 450 "../../gcc/rtl.def" COND_EXEC , PARALLEL , ASM_INPUT , # 475 "../../gcc/rtl.def" ASM_OPERANDS , # 486 "../../gcc/rtl.def" UNSPEC , UNSPEC_VOLATILE , ADDR_VEC , # 518 "../../gcc/rtl.def" ADDR_DIFF_VEC , # 529 "../../gcc/rtl.def" PREFETCH , # 541 "../../gcc/rtl.def" SET , USE , CLOBBER , CALL , RETURN , TRAP_IF , RESX , CONST_INT , CONST_DOUBLE , CONST_VECTOR , CONST_STRING , CONST , PC , VALUE , # 614 "../../gcc/rtl.def" REG , SCRATCH , # 631 "../../gcc/rtl.def" SUBREG , # 644 "../../gcc/rtl.def" STRICT_LOW_PART , CONCAT , MEM , LABEL_REF , SYMBOL_REF , CC0 , # 683 "../../gcc/rtl.def" ADDRESSOF , # 701 "../../gcc/rtl.def" QUEUED , # 713 "../../gcc/rtl.def" IF_THEN_ELSE , # 722 "../../gcc/rtl.def" COND , COMPARE , PLUS , MINUS , NEG , MULT , DIV , MOD , UDIV , UMOD , AND , IOR , XOR , NOT , ASHIFT , ROTATE , ASHIFTRT , LSHIFTRT , ROTATERT , SMIN , SMAX , UMIN , UMAX , # 781 "../../gcc/rtl.def" PRE_DEC , PRE_INC , POST_DEC , POST_INC , # 798 "../../gcc/rtl.def" PRE_MODIFY , POST_MODIFY , NE , EQ , GE , GT , LE , LT , GEU , GTU , LEU , LTU , UNORDERED , ORDERED , UNEQ , UNGE , UNGT , UNLE , UNLT , LTGT , SIGN_EXTEND , ZERO_EXTEND , TRUNCATE , FLOAT_EXTEND , FLOAT_TRUNCATE , FLOAT , FIX , UNSIGNED_FLOAT , UNSIGNED_FIX , ABS , SQRT , FFS , # 882 "../../gcc/rtl.def" SIGN_EXTRACT , ZERO_EXTRACT , HIGH , LO_SUM , # 907 "../../gcc/rtl.def" RANGE_INFO , # 922 "../../gcc/rtl.def" RANGE_REG , RANGE_VAR , RANGE_LIVE , CONSTANT_P_RTX , # 958 "../../gcc/rtl.def" CALL_PLACEHOLDER , VEC_MERGE , VEC_SELECT , VEC_CONCAT , VEC_DUPLICATE , SS_PLUS , US_PLUS , SS_MINUS , US_MINUS , SS_TRUNCATE , US_TRUNCATE , # 1014 "../../gcc/rtl.def" PHI , # 45 "../../gcc/rtl.h" 2 LAST_AND_UNUSED_RTX_CODE}; extern const unsigned char rtx_length[((int) LAST_AND_UNUSED_RTX_CODE)]; extern const char * const rtx_name[((int) LAST_AND_UNUSED_RTX_CODE)]; extern const char * const rtx_format[((int) LAST_AND_UNUSED_RTX_CODE)]; extern const char rtx_class[((int) LAST_AND_UNUSED_RTX_CODE)]; typedef struct { unsigned min_align: 8; unsigned base_after_vec: 1; unsigned min_after_vec: 1; unsigned max_after_vec: 1; unsigned min_after_base: 1; unsigned max_after_base: 1; unsigned offset_unsigned: 1; unsigned : 2; unsigned scale : 8; } addr_diff_vec_flags; typedef struct { long alias; tree expr; rtx offset; rtx size; unsigned int align; } mem_attrs; typedef union rtunion_def { long rtwint; int rtint; unsigned int rtuint; const char *rtstr; rtx rtx; rtvec rtvec; enum machine_mode rttype; addr_diff_vec_flags rt_addr_diff_vec_flags; struct cselib_val_struct *rt_cselib; struct bitmap_head_def *rtbit; tree rttree; struct basic_block_def *bb; mem_attrs *rtmem; } rtunion; struct rtx_def { enum rtx_code code: 16; enum machine_mode mode : 8; unsigned int jump : 1; unsigned int call : 1; # 149 "../../gcc/rtl.h" unsigned int unchanging : 1; unsigned int volatil : 1; # 175 "../../gcc/rtl.h" unsigned int in_struct : 1; unsigned int used : 1; unsigned integrated : 1; # 196 "../../gcc/rtl.h" unsigned frame_related : 1; rtunion fld[1]; }; # 222 "../../gcc/rtl.h" struct rtvec_def { int num_elem; rtx elem[1]; }; # 451 "../../gcc/rtl.h" enum reg_note { REG_DEAD = 1, REG_INC, # 470 "../../gcc/rtl.h" REG_EQUIV, REG_EQUAL, REG_WAS_0, REG_RETVAL, REG_LIBCALL, REG_NONNEG, REG_NO_CONFLICT, REG_UNUSED, # 515 "../../gcc/rtl.h" REG_CC_SETTER, REG_CC_USER, REG_LABEL, REG_DEP_ANTI, REG_DEP_OUTPUT, REG_BR_PROB, REG_EXEC_COUNT, REG_NOALIAS, REG_SAVE_AREA, REG_BR_PRED, REG_FRAME_RELATED_EXPR, REG_EH_CONTEXT, REG_EH_REGION, REG_SAVE_NOTE, REG_MAYBE_DEAD, REG_NORETURN, REG_NON_LOCAL_GOTO, REG_SETJMP, REG_ALWAYS_RETURN, REG_VTABLE_REF }; # 607 "../../gcc/rtl.h" extern const char * const reg_note_name[]; # 663 "../../gcc/rtl.h" enum insn_note { NOTE_INSN_BIAS = -100, NOTE_INSN_DELETED, NOTE_INSN_BLOCK_BEG, NOTE_INSN_BLOCK_END, NOTE_INSN_LOOP_BEG, NOTE_INSN_LOOP_END, NOTE_INSN_LOOP_CONT, NOTE_INSN_LOOP_VTOP, NOTE_INSN_LOOP_END_TOP_COND, NOTE_INSN_FUNCTION_END, NOTE_INSN_PROLOGUE_END, NOTE_INSN_EPILOGUE_BEG, NOTE_INSN_DELETED_LABEL, NOTE_INSN_FUNCTION_BEG, NOTE_INSN_EH_REGION_BEG, NOTE_INSN_EH_REGION_END, NOTE_INSN_REPEATED_LINE_NUMBER, NOTE_INSN_RANGE_BEG, NOTE_INSN_RANGE_END, NOTE_INSN_LIVE, NOTE_INSN_BASIC_BLOCK, NOTE_INSN_EXPECTED_VALUE, NOTE_INSN_MAX }; extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS]; # 840 "../../gcc/rtl.h" extern unsigned int subreg_lsb (rtx); extern unsigned int subreg_regno_offset (unsigned int, enum machine_mode, unsigned int, enum machine_mode); extern unsigned int subreg_regno (rtx); # 1211 "../../gcc/rtl.h" extern int rtx_equal_function_value_matters; extern int generating_concat_p; extern int ceil_log2 (unsigned long); extern rtx expand_builtin_expect_jump (tree, rtx, rtx); extern void set_stack_check_libfunc (rtx); extern long trunc_int_for_mode (long, enum machine_mode); extern rtx plus_constant_wide (rtx, long); extern rtx plus_constant_for_output_wide (rtx, long); extern void optimize_save_area_alloca (rtx); extern rtx gen_rtx (enum rtx_code, enum machine_mode, ...); extern rtvec gen_rtvec (int, ...); extern rtx copy_insn_1 (rtx); extern rtx copy_insn (rtx); extern rtx gen_int_mode (long, enum machine_mode); extern rtx rtx_alloc (enum rtx_code); extern rtvec rtvec_alloc (int); extern rtx copy_rtx (rtx); extern rtx copy_rtx_if_shared (rtx); extern rtx copy_most_rtx (rtx, rtx); extern rtx shallow_copy_rtx (rtx); extern int rtx_equal_p (rtx, rtx); extern rtvec gen_rtvec_v (int, rtx *); extern rtx gen_reg_rtx (enum machine_mode); extern rtx gen_label_rtx (void); extern int subreg_hard_regno (rtx, int); extern rtx gen_lowpart_common (enum machine_mode, rtx); extern rtx gen_lowpart (enum machine_mode, rtx); extern rtx gen_lowpart_if_possible (enum machine_mode, rtx); extern rtx gen_highpart (enum machine_mode, rtx); extern rtx gen_highpart_mode (enum machine_mode, enum machine_mode, rtx); extern rtx gen_realpart (enum machine_mode, rtx); extern rtx gen_imagpart (enum machine_mode, rtx); extern rtx operand_subword (rtx, unsigned int, int, enum machine_mode); extern rtx constant_subword (rtx, int, enum machine_mode); extern rtx operand_subword_force (rtx, unsigned int, enum machine_mode); extern int subreg_lowpart_p (rtx); extern unsigned int subreg_lowpart_offset (enum machine_mode, enum machine_mode); extern unsigned int subreg_highpart_offset (enum machine_mode, enum machine_mode); extern rtx make_safe_from (rtx, rtx); extern rtx convert_memory_address (enum machine_mode, rtx); extern rtx get_insns (void); extern const char *get_insn_name (int); extern rtx get_last_insn (void); extern rtx get_last_insn_anywhere (void); extern void start_sequence (void); extern void push_to_sequence (rtx); extern void end_sequence (void); extern void push_to_full_sequence (rtx, rtx); extern void end_full_sequence (rtx*, rtx*); extern rtx gen_sequence (void); extern rtx immed_double_const (long, long, enum machine_mode); extern rtx mem_for_const_double (rtx); extern rtx force_const_mem (enum machine_mode, rtx); extern rtx get_pool_constant (rtx); extern rtx get_pool_constant_mark (rtx, _Bool *); extern enum machine_mode get_pool_mode (rtx); extern rtx get_pool_constant_for_function (struct function *, rtx); extern enum machine_mode get_pool_mode_for_function (struct function *, rtx); extern int get_pool_offset (rtx); extern rtx simplify_subtraction (rtx); extern rtx assign_stack_local (enum machine_mode, long, int); extern rtx assign_stack_temp (enum machine_mode, long, int); extern rtx assign_stack_temp_for_type (enum machine_mode, long, int, tree); extern rtx assign_temp (tree, int, int, int); extern rtx emit_insn_before (rtx, rtx); extern rtx emit_jump_insn_before (rtx, rtx); extern rtx emit_call_insn_before (rtx, rtx); extern rtx emit_barrier_before (rtx); extern rtx emit_label_before (rtx, rtx); extern rtx emit_note_before (int, rtx); extern rtx emit_insn_after (rtx, rtx); extern rtx emit_jump_insn_after (rtx, rtx); extern rtx emit_barrier_after (rtx); extern rtx emit_label_after (rtx, rtx); extern rtx emit_note_after (int, rtx); extern rtx emit_line_note_after (const char *, int, rtx); extern rtx emit_insn (rtx); extern rtx emit_insns (rtx); extern rtx emit_insns_before (rtx, rtx); extern rtx emit_insns_after (rtx, rtx); extern rtx emit_jump_insn (rtx); extern rtx emit_call_insn (rtx); extern rtx emit_label (rtx); extern rtx emit_barrier (void); extern rtx emit_line_note (const char *, int); extern rtx emit_note (const char *, int); extern rtx emit_line_note_force (const char *, int); extern rtx make_insn_raw (rtx); extern rtx previous_insn (rtx); extern rtx next_insn (rtx); extern rtx prev_nonnote_insn (rtx); extern rtx next_nonnote_insn (rtx); extern rtx prev_real_insn (rtx); extern rtx next_real_insn (rtx); extern rtx prev_active_insn (rtx); extern rtx next_active_insn (rtx); extern int active_insn_p (rtx); extern rtx prev_label (rtx); extern rtx next_label (rtx); extern rtx next_cc0_user (rtx); extern rtx prev_cc0_setter (rtx); extern rtx next_nondeleted_insn (rtx); extern enum rtx_code reverse_condition (enum rtx_code); extern enum rtx_code reverse_condition_maybe_unordered (enum rtx_code); extern enum rtx_code swap_condition (enum rtx_code); extern enum rtx_code unsigned_condition (enum rtx_code); extern enum rtx_code signed_condition (enum rtx_code); extern void mark_jump_label (rtx, rtx, int); extern void cleanup_barriers (void); extern _Bool squeeze_notes (rtx *, rtx *); extern rtx delete_related_insns (rtx); extern void delete_jump (rtx); extern void delete_barrier (rtx); extern rtx get_label_before (rtx); extern rtx get_label_after (rtx); extern rtx follow_jumps (rtx); extern rtx *find_constant_term_loc (rtx *); extern rtx try_split (rtx, rtx, int); extern int split_branch_probability; extern rtx split_insns (rtx, rtx); extern rtx simplify_unary_operation (enum rtx_code, enum machine_mode, rtx, enum machine_mode); extern rtx simplify_binary_operation (enum rtx_code, enum machine_mode, rtx, rtx); extern rtx simplify_ternary_operation (enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx, rtx); extern rtx simplify_relational_operation (enum rtx_code, enum machine_mode, rtx, rtx); extern rtx simplify_gen_binary (enum rtx_code, enum machine_mode, rtx, rtx); extern rtx simplify_gen_unary (enum rtx_code, enum machine_mode, rtx, enum machine_mode); extern rtx simplify_gen_ternary (enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx, rtx); extern rtx simplify_gen_relational (enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx); extern rtx simplify_subreg (enum machine_mode, rtx, enum machine_mode, unsigned int); extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode, unsigned int); extern rtx simplify_replace_rtx (rtx, rtx, rtx); extern rtx simplify_rtx (rtx); extern rtx avoid_constant_pool_reference (rtx); extern rtx gen_mem_addressof (rtx, tree); extern enum machine_mode choose_hard_reg_mode (unsigned int, unsigned int); extern rtx set_unique_reg_note (rtx, enum reg_note, rtx); # 1448 "../../gcc/rtl.h" extern int rtx_addr_can_trap_p (rtx); extern int rtx_unstable_p (rtx); extern int rtx_varies_p (rtx, int); extern int rtx_addr_varies_p (rtx, int); extern long get_integer_term (rtx); extern rtx get_related_value (rtx); extern rtx get_jump_table_offset (rtx, rtx *); extern int reg_mentioned_p (rtx, rtx); extern int count_occurrences (rtx, rtx, int); extern int reg_referenced_p (rtx, rtx); extern int reg_used_between_p (rtx, rtx, rtx); extern int reg_referenced_between_p (rtx, rtx, rtx); extern int reg_set_between_p (rtx, rtx, rtx); extern int regs_set_between_p (rtx, rtx, rtx); extern int commutative_operand_precedence (rtx); extern int swap_commutative_operands_p (rtx, rtx); extern int modified_between_p (rtx, rtx, rtx); extern int no_labels_between_p (rtx, rtx); extern int no_jumps_between_p (rtx, rtx); extern int modified_in_p (rtx, rtx); extern int insn_dependent_p (rtx, rtx); extern int reg_set_p (rtx, rtx); extern rtx single_set_2 (rtx, rtx); extern int multiple_sets (rtx); extern int set_noop_p (rtx); extern int noop_move_p (rtx); extern rtx find_last_value (rtx, rtx *, rtx, int); extern int refers_to_regno_p (unsigned int, unsigned int, rtx, rtx *); extern int reg_overlap_mentioned_p (rtx, rtx); extern rtx set_of (rtx, rtx); extern void note_stores (rtx, void (*) (rtx, rtx, void *), void *); extern void note_uses (rtx *, void (*) (rtx *, void *), void *); extern rtx reg_set_last (rtx, rtx); extern int dead_or_set_p (rtx, rtx); extern int dead_or_set_regno_p (rtx, unsigned int); extern rtx find_reg_note (rtx, enum reg_note, rtx); extern rtx find_regno_note (rtx, enum reg_note, unsigned int); extern rtx find_reg_equal_equiv_note (rtx); extern int find_reg_fusage (rtx, enum rtx_code, rtx); extern int find_regno_fusage (rtx, enum rtx_code, unsigned int); extern int pure_call_p (rtx); extern void remove_note (rtx, rtx); extern int side_effects_p (rtx); extern int volatile_refs_p (rtx); extern int volatile_insn_p (rtx); extern int may_trap_p (rtx); extern int inequality_comparisons_p (rtx); extern rtx replace_rtx (rtx, rtx, rtx); extern rtx replace_regs (rtx, rtx *, unsigned int, int); extern int computed_jump_p (rtx); typedef int (*rtx_function) (rtx *, void *); extern int for_each_rtx (rtx *, rtx_function, void *); extern rtx regno_use_in (unsigned int, rtx); extern int auto_inc_p (rtx); extern int in_expr_list_p (rtx, rtx); extern void remove_node_from_expr_list (rtx, rtx *); extern int insns_safe_to_move_p (rtx, rtx, rtx *); extern int loc_mentioned_in_p (rtx *, rtx); extern rtx find_first_parameter_load (rtx, rtx); extern rtx find_use_as_address (rtx, rtx, long); void init_EXPR_INSN_LIST_cache (void); void free_EXPR_LIST_list (rtx *); void free_INSN_LIST_list (rtx *); void free_EXPR_LIST_node (rtx); void free_INSN_LIST_node (rtx); rtx alloc_INSN_LIST (rtx, rtx); rtx alloc_EXPR_LIST (int, rtx, rtx); extern int max_parallel; extern void free_reg_info (void); extern int asm_noperands (rtx); extern const char *decode_asm_operands (rtx, rtx *, rtx **, const char **, enum machine_mode *); extern enum reg_class reg_preferred_class (int); extern enum reg_class reg_alternate_class (int); extern rtx get_first_nonparm_insn (void); extern void split_all_insns (int); extern void split_all_insns_noflow (void); extern rtx const_int_rtx[64 * 2 + 1]; extern rtx const_true_rtx; extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE]; # 1584 "../../gcc/rtl.h" enum global_rtl_index { GR_PC, GR_CC0, GR_STACK_POINTER, GR_FRAME_POINTER, # 1599 "../../gcc/rtl.h" GR_HARD_FRAME_POINTER, GR_ARG_POINTER, GR_VIRTUAL_INCOMING_ARGS, GR_VIRTUAL_STACK_ARGS, GR_VIRTUAL_STACK_DYNAMIC, GR_VIRTUAL_OUTGOING_ARGS, GR_VIRTUAL_CFA, GR_MAX }; extern rtx global_rtl[GR_MAX]; # 1632 "../../gcc/rtl.h" extern rtx pic_offset_table_rtx; extern rtx struct_value_rtx; extern rtx struct_value_incoming_rtx; extern rtx static_chain_rtx; extern rtx static_chain_incoming_rtx; extern rtx return_address_pointer_rtx; # 1 "genrtl.h" 1 extern rtx gen_rtx_fmt_s (enum rtx_code, enum machine_mode mode, const char *arg0); extern rtx gen_rtx_fmt_ee (enum rtx_code, enum machine_mode mode, rtx arg0, rtx arg1); extern rtx gen_rtx_fmt_ue (enum rtx_code, enum machine_mode mode, rtx arg0, rtx arg1); extern rtx gen_rtx_fmt_iss (enum rtx_code, enum machine_mode mode, int arg0, const char *arg1, const char *arg2); extern rtx gen_rtx_fmt_is (enum rtx_code, enum machine_mode mode, int arg0, const char *arg1); extern rtx gen_rtx_fmt_i (enum rtx_code, enum machine_mode mode, int arg0); extern rtx gen_rtx_fmt_isE (enum rtx_code, enum machine_mode mode, int arg0, const char *arg1, rtvec arg2); extern rtx gen_rtx_fmt_iE (enum rtx_code, enum machine_mode mode, int arg0, rtvec arg1); extern rtx gen_rtx_fmt_Ess (enum rtx_code, enum machine_mode mode, rtvec arg0, const char *arg1, const char *arg2); extern rtx gen_rtx_fmt_sEss (enum rtx_code, enum machine_mode mode, const char *arg0, rtvec arg1, const char *arg2, const char *arg3); extern rtx gen_rtx_fmt_eE (enum rtx_code, enum machine_mode mode, rtx arg0, rtvec arg1); extern rtx gen_rtx_fmt_E (enum rtx_code, enum machine_mode mode, rtvec arg0); extern rtx gen_rtx_fmt_e (enum rtx_code, enum machine_mode mode, rtx arg0); extern rtx gen_rtx_fmt_sse (enum rtx_code, enum machine_mode mode, const char *arg0, const char *arg1, rtx arg2); extern rtx gen_rtx_fmt_ss (enum rtx_code, enum machine_mode mode, const char *arg0, const char *arg1); extern rtx gen_rtx_fmt_sE (enum rtx_code, enum machine_mode mode, const char *arg0, rtvec arg1); extern rtx gen_rtx_fmt_iuueiee (enum rtx_code, enum machine_mode mode, int arg0, rtx arg1, rtx arg2, rtx arg3, int arg4, rtx arg5, rtx arg6); extern rtx gen_rtx_fmt_iuueiee0 (enum rtx_code, enum machine_mode mode, int arg0, rtx arg1, rtx arg2, rtx arg3, int arg4, rtx arg5, rtx arg6); extern rtx gen_rtx_fmt_iuueieee (enum rtx_code, enum machine_mode mode, int arg0, rtx arg1, rtx arg2, rtx arg3, int arg4, rtx arg5, rtx arg6, rtx arg7); extern rtx gen_rtx_fmt_iuu (enum rtx_code, enum machine_mode mode, int arg0, rtx arg1, rtx arg2); extern rtx gen_rtx_fmt_iuu00iss (enum rtx_code, enum machine_mode mode, int arg0, rtx arg1, rtx arg2, int arg3, const char *arg4, const char *arg5); extern rtx gen_rtx_fmt_ssiEEsi (enum rtx_code, enum machine_mode mode, const char *arg0, const char *arg1, int arg2, rtvec arg3, rtvec arg4, const char *arg5, int arg6); extern rtx gen_rtx_fmt_Ei (enum rtx_code, enum machine_mode mode, rtvec arg0, int arg1); extern rtx gen_rtx_fmt_eEee0 (enum rtx_code, enum machine_mode mode, rtx arg0, rtvec arg1, rtx arg2, rtx arg3); extern rtx gen_rtx_fmt_eee (enum rtx_code, enum machine_mode mode, rtx arg0, rtx arg1, rtx arg2); extern rtx gen_rtx_fmt_ (enum rtx_code, enum machine_mode mode); extern rtx gen_rtx_fmt_w (enum rtx_code, enum machine_mode mode, long arg0); extern rtx gen_rtx_fmt_0www (enum rtx_code, enum machine_mode mode, long arg0, long arg1, long arg2); extern rtx gen_rtx_fmt_0 (enum rtx_code, enum machine_mode mode); extern rtx gen_rtx_fmt_i0 (enum rtx_code, enum machine_mode mode, int arg0); extern rtx gen_rtx_fmt_ei (enum rtx_code, enum machine_mode mode, rtx arg0, int arg1); extern rtx gen_rtx_fmt_e0 (enum rtx_code, enum machine_mode mode, rtx arg0); extern rtx gen_rtx_fmt_u00 (enum rtx_code, enum machine_mode mode, rtx arg0); extern rtx gen_rtx_fmt_eit (enum rtx_code, enum machine_mode mode, rtx arg0, int arg1, union tree_node *arg2); extern rtx gen_rtx_fmt_eeeee (enum rtx_code, enum machine_mode mode, rtx arg0, rtx arg1, rtx arg2, rtx arg3, rtx arg4); extern rtx gen_rtx_fmt_Ee (enum rtx_code, enum machine_mode mode, rtvec arg0, rtx arg1); extern rtx gen_rtx_fmt_uuEiiiiiibbii (enum rtx_code, enum machine_mode mode, rtx arg0, rtx arg1, rtvec arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, struct bitmap_head_def *arg9, struct bitmap_head_def *arg10, int arg11, int arg12); extern rtx gen_rtx_fmt_iiiiiiiitt (enum rtx_code, enum machine_mode mode, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, union tree_node *arg8, union tree_node *arg9); extern rtx gen_rtx_fmt_eti (enum rtx_code, enum machine_mode mode, rtx arg0, union tree_node *arg1, int arg2); extern rtx gen_rtx_fmt_bi (enum rtx_code, enum machine_mode mode, struct bitmap_head_def *arg0, int arg1); extern rtx gen_rtx_fmt_uuuu (enum rtx_code, enum machine_mode mode, rtx arg0, rtx arg1, rtx arg2, rtx arg3); # 1643 "../../gcc/rtl.h" 2 extern rtx gen_rtx_CONST_DOUBLE (enum machine_mode, long, long); extern rtx gen_rtx_CONST_INT (enum machine_mode, long); extern rtx gen_raw_REG (enum machine_mode, int); extern rtx gen_rtx_REG (enum machine_mode, int); extern rtx gen_rtx_SUBREG (enum machine_mode, rtx, int); extern rtx gen_rtx_MEM (enum machine_mode, rtx); extern rtx gen_lowpart_SUBREG (enum machine_mode, rtx); # 1728 "../../gcc/rtl.h" extern rtx find_next_ref (rtx, rtx); extern rtx output_constant_def (tree, int); extern rtx immed_real_const (tree); # 1741 "../../gcc/rtl.h" extern int flow2_completed; extern int reload_completed; extern int reload_in_progress; extern int cse_not_expected; extern int no_new_pseudos; extern int rtx_to_tree_code (enum rtx_code); struct obstack; extern void gcc_obstack_init (struct obstack *); struct cse_basic_block_data; # 1787 "../../gcc/rtl.h" extern int rtx_cost (rtx, enum rtx_code); extern int address_cost (rtx, enum machine_mode); extern void delete_trivially_dead_insns (rtx, int, int); extern int cse_main (rtx, int, int, FILE *); extern void cse_end_of_basic_block (rtx, struct cse_basic_block_data *, int, int, int); extern int comparison_dominates_p (enum rtx_code, enum rtx_code); extern int condjump_p (rtx); extern int any_condjump_p (rtx); extern int any_uncondjump_p (rtx); extern int safe_to_remove_jump_p (rtx); extern rtx pc_set (rtx); extern rtx condjump_label (rtx); extern int simplejump_p (rtx); extern int returnjump_p (rtx); extern int onlyjump_p (rtx); extern int only_sets_cc0_p (rtx); extern int sets_cc0_p (rtx); extern int invert_jump_1 (rtx, rtx); extern int invert_jump (rtx, rtx, int); extern int rtx_renumbered_equal_p (rtx, rtx); extern int true_regnum (rtx); extern int redirect_jump_1 (rtx, rtx); extern int redirect_jump (rtx, rtx, int); extern void rebuild_jump_labels (rtx); extern enum rtx_code reversed_comparison_code (rtx, rtx); extern enum rtx_code reversed_comparison_code_parts (enum rtx_code, rtx, rtx, rtx); extern void delete_for_peephole (rtx, rtx); extern int condjump_in_parallel_p (rtx); extern void never_reached_warning (rtx, rtx); extern void purge_line_number_notes (rtx); extern void copy_loop_headers (rtx); extern int max_reg_num (void); extern int max_label_num (void); extern int get_first_label_num (void); extern void delete_insns_since (rtx); extern void mark_reg_pointer (rtx, int); extern void mark_user_reg (rtx); extern void reset_used_flags (rtx); extern void reorder_insns (rtx, rtx, rtx); extern void reorder_insns_nobb (rtx, rtx, rtx); extern int get_max_uid (void); extern int in_sequence_p (void); extern void force_next_line_note (void); extern void clear_emit_caches (void); extern void init_emit (void); extern void init_emit_once (int); extern void push_topmost_sequence (void); extern void pop_topmost_sequence (void); extern int subreg_realpart_p (rtx); extern void reverse_comparison (rtx); extern void set_new_first_and_last_insn (rtx, rtx); extern void set_new_first_and_last_label_num (int, int); extern void set_new_last_label_num (int); extern void unshare_all_rtl_again (rtx); extern void set_last_insn (rtx); extern void link_cc0_insns (rtx); extern void add_insn (rtx); extern void add_insn_before (rtx, rtx); extern void add_insn_after (rtx, rtx); extern void remove_insn (rtx); extern void reorder_insns_with_line_notes (rtx, rtx, rtx); extern void emit_insn_after_with_line_notes (rtx, rtx, rtx); extern enum rtx_code classify_insn (rtx); extern rtx emit (rtx); int force_line_numbers (void); void restore_line_number_status (int old_value); extern void renumber_insns (FILE *); extern void remove_unnecessary_notes (void); extern rtx delete_insn (rtx); extern void delete_insn_chain (rtx, rtx); extern int combine_instructions (rtx, unsigned int); extern unsigned int extended_count (rtx, enum machine_mode, int); extern rtx remove_death (unsigned int, rtx); extern void dump_combine_stats (FILE *); extern void dump_combine_total_stats (FILE *); extern void schedule_insns (FILE *); extern void schedule_ebbs (FILE *); extern void fix_sched_param (const char *, const char *); extern const char *print_rtx_head; extern void debug_rtx (rtx); extern void debug_rtx_list (rtx, int); extern void debug_rtx_range (rtx, rtx); extern rtx debug_rtx_find (rtx, int); extern void print_mem_expr (FILE *, tree); extern void print_rtl (FILE *, rtx); extern void print_simple_rtl (FILE *, rtx); extern int print_rtl_single (FILE *, rtx); extern void print_inline_rtx (FILE *, rtx, int); extern void init_loop (void); extern rtx libcall_other_reg (rtx, rtx); extern void loop_optimize (rtx, FILE *, int); extern void record_excess_regs (rtx, rtx, rtx *); extern void reposition_prologue_and_epilogue_notes (rtx); extern void thread_prologue_and_epilogue_insns (rtx); extern int prologue_epilogue_contains (rtx); extern int sibcall_epilogue_contains (rtx); extern void preserve_rtl_expr_result (rtx); extern void mark_temp_addr_taken (rtx); extern void update_temp_slot_address (rtx, rtx); extern void purge_addressof (rtx); extern void purge_hard_subreg_sets (rtx); extern void set_file_and_line_for_stmt (const char *, int); extern void expand_null_return (void); extern void emit_jump (rtx); extern int preserve_subexpressions_p (void); extern void move_by_pieces (rtx, rtx, unsigned long, unsigned int); extern void recompute_reg_usage (rtx, int); extern int initialize_uninitialized_subregs (void); extern void print_rtl_with_bb (FILE *, rtx); extern void dump_flow_info (FILE *); extern void init_expmed (void); extern void expand_inc (rtx, rtx); extern void expand_dec (rtx, rtx); extern rtx expand_mult_highpart (enum machine_mode, rtx, unsigned long, rtx, int, int); extern int gcse_main (rtx, FILE *); extern void mark_elimination (int, int); extern int global_alloc (FILE *); extern void dump_global_regs (FILE *); extern void build_insn_chain (rtx); extern int reg_classes_intersect_p (enum reg_class, enum reg_class); extern int reg_class_subset_p (enum reg_class, enum reg_class); extern void globalize_reg (int); extern void init_regs (void); extern void init_reg_sets (void); extern void regset_release_memory (void); extern void regclass_init (void); extern void regclass (rtx, int, FILE *); extern void reg_scan (rtx, unsigned int, int); extern void reg_scan_update (rtx, rtx, unsigned int); extern void fix_register (const char *, int, int); extern void delete_null_pointer_checks (rtx); extern void regmove_optimize (rtx, int, FILE *); extern void combine_stack_adjustments (void); extern void dbr_schedule (rtx, FILE *); extern void dump_local_alloc (FILE *); extern int local_alloc (void); extern int function_invariant_p (rtx); extern void init_branch_prob (const char *); extern void branch_prob (void); extern void end_branch_prob (void); extern void output_func_start_profiler (void); extern void reg_to_stack (rtx, FILE *); extern int add_double (unsigned long, long, unsigned long, long, unsigned long *, long *); extern int neg_double (unsigned long, long, unsigned long *, long *); extern int mul_double (unsigned long, long, unsigned long, long, unsigned long *, long *); extern void lshift_double (unsigned long, long, long, unsigned int, unsigned long *, long *, int); extern void rshift_double (unsigned long, long, long, unsigned int, unsigned long *, long *, int); extern void lrotate_double (unsigned long, long, long, unsigned int, unsigned long *, long *); extern void rrotate_double (unsigned long, long, long, unsigned int, unsigned long *, long *); enum libcall_type { LCT_NORMAL = 0, LCT_CONST = 1, LCT_PURE = 2, LCT_CONST_MAKE_BLOCK = 3, LCT_PURE_MAKE_BLOCK = 4, LCT_NORETURN = 5, LCT_THROW = 6, LCT_ALWAYS_RETURN = 7, LCT_RETURNS_TWICE = 8 }; extern void emit_library_call (rtx, enum libcall_type, enum machine_mode, int, ...); extern rtx emit_library_call_value (rtx, rtx, enum libcall_type, enum machine_mode, int, ...); extern int set_dominates_use (int, int, int, rtx, rtx); extern int in_data_section (void); extern void init_varasm_once (void); extern void init_rtl (void); extern void traverse_md_constants (int (*) (void **, void *), void *); struct md_constant { char *name, *value; }; extern int read_skip_spaces (FILE *); extern rtx read_rtx (FILE *); extern const char *read_rtx_filename; extern int read_rtx_lineno; extern void fancy_abort (const char *, int, const char *) __attribute__ ((__noreturn__)); extern void clear_reg_alias_info (rtx); extern rtx canon_rtx (rtx); extern int true_dependence (rtx, enum machine_mode, rtx, int (*)(rtx, int)); extern rtx get_addr (rtx); extern int canon_true_dependence (rtx, enum machine_mode, rtx, rtx, int (*)(rtx, int)); extern int read_dependence (rtx, rtx); extern int anti_dependence (rtx, rtx); extern int output_dependence (rtx, rtx); extern void mark_constant_function (void); extern void init_alias_once (void); extern void init_alias_analysis (void); extern void end_alias_analysis (void); extern rtx addr_side_effect_eval (rtx, int, int); typedef enum { sibcall_use_normal = 1, sibcall_use_tail_recursion, sibcall_use_sibcall } sibcall_use_t; extern void optimize_sibling_and_tail_recursive_calls (void); extern void replace_call_placeholder (rtx, sibcall_use_t); extern rtx stack_limit_rtx; extern void regrename_optimize (void); extern void copyprop_hardreg_forward (void); extern void if_convert (int); extern void invert_br_probabilities (rtx); extern _Bool expensive_function_p (int); # 35 "../../gcc/predict.c" 2 # 1 "tm_p.h" 1 # 1 "../../gcc/config/alpha/alpha-protos.h" 1 # 21 "../../gcc/config/alpha/alpha-protos.h" extern int alpha_next_sequence_number; extern void literal_section (void); extern void override_options (void); extern int zap_mask (long); extern int direct_return (void); extern int alpha_sa_size (void); extern int alpha_pv_save_size (void); extern int alpha_using_fp (void); extern void alpha_write_verstamp (FILE *); extern void alpha_expand_prologue (void); extern void alpha_expand_epilogue (void); extern void alpha_output_filename (FILE *, const char *); extern void alpha_output_lineno (FILE *, int); extern int reg_or_0_operand (rtx, enum machine_mode); extern int reg_or_6bit_operand (rtx, enum machine_mode); extern int reg_or_8bit_operand (rtx, enum machine_mode); extern int cint8_operand (rtx, enum machine_mode); extern int add_operand (rtx, enum machine_mode); extern int sext_add_operand (rtx, enum machine_mode); extern int const48_operand (rtx, enum machine_mode); extern int and_operand (rtx, enum machine_mode); extern int or_operand (rtx, enum machine_mode); extern int mode_width_operand (rtx, enum machine_mode); extern int mode_mask_operand (rtx, enum machine_mode); extern int mul8_operand (rtx, enum machine_mode); extern int fp0_operand (rtx, enum machine_mode); extern int reg_or_fp0_operand (rtx, enum machine_mode); extern int hard_fp_register_operand (rtx, enum machine_mode); extern int hard_int_register_operand (rtx, enum machine_mode); extern int reg_or_cint_operand (rtx, enum machine_mode); extern int some_operand (rtx, enum machine_mode); extern int some_ni_operand (rtx, enum machine_mode); extern int input_operand (rtx, enum machine_mode); extern int current_file_function_operand (rtx, enum machine_mode); extern int direct_call_operand (rtx, enum machine_mode); extern int local_symbolic_operand (rtx, enum machine_mode); extern int small_symbolic_operand (rtx, enum machine_mode); extern int some_small_symbolic_operand (rtx, enum machine_mode); extern int global_symbolic_operand (rtx, enum machine_mode); extern int call_operand (rtx, enum machine_mode); extern int symbolic_operand (rtx, enum machine_mode); extern int alpha_comparison_operator (rtx, enum machine_mode); extern int alpha_zero_comparison_operator (rtx, enum machine_mode); extern int alpha_swapped_comparison_operator (rtx, enum machine_mode); extern int signed_comparison_operator (rtx, enum machine_mode); extern int alpha_fp_comparison_operator (rtx, enum machine_mode); extern int divmod_operator (rtx, enum machine_mode); extern int aligned_memory_operand (rtx, enum machine_mode); extern int unaligned_memory_operand (rtx, enum machine_mode); extern int reg_or_unaligned_mem_operand (rtx, enum machine_mode); extern int any_memory_operand (rtx, enum machine_mode); extern int reg_not_elim_operand (rtx, enum machine_mode); extern int normal_memory_operand (rtx, enum machine_mode); extern int reg_no_subreg_operand (rtx, enum machine_mode); extern int addition_operation (rtx, enum machine_mode); extern _Bool alpha_const_ok_for_letter_p (long, int); extern _Bool alpha_const_double_ok_for_letter_p (rtx, int); extern _Bool alpha_extra_constraint (rtx, int); extern rtx alpha_tablejump_addr_vec (rtx); extern rtx alpha_tablejump_best_label (rtx); extern _Bool alpha_legitimate_address_p (enum machine_mode, rtx, int); extern rtx alpha_legitimize_address (rtx, rtx, enum machine_mode); extern rtx alpha_legitimize_reload_address (rtx, enum machine_mode, int, int, int); extern rtx split_small_symbolic_operand (rtx); extern void get_aligned_mem (rtx, rtx *, rtx *); extern rtx get_unaligned_address (rtx, int); extern enum reg_class alpha_preferred_reload_class (rtx, enum reg_class); extern enum reg_class secondary_reload_class (enum reg_class, enum machine_mode, rtx, int); extern void alpha_set_memflags (rtx, rtx); extern rtx alpha_emit_set_const (rtx, enum machine_mode, long, int); extern rtx alpha_emit_set_long_const (rtx, long, long); extern _Bool alpha_expand_mov (enum machine_mode, rtx *); extern _Bool alpha_expand_mov_nobwx (enum machine_mode, rtx *); extern void alpha_emit_floatuns (rtx[]); extern rtx alpha_emit_conditional_branch (enum rtx_code); extern rtx alpha_emit_setcc (enum rtx_code); extern rtx alpha_emit_conditional_move (rtx, enum machine_mode); extern int alpha_split_conditional_move (enum rtx_code, rtx, rtx, rtx, rtx); extern void alpha_emit_xfloating_arith (enum rtx_code, rtx[]); extern void alpha_emit_xfloating_cvt (enum rtx_code, rtx[]); extern void alpha_split_tfmode_pair (rtx[]); extern void alpha_split_tfmode_frobsign (rtx[], rtx (*)(rtx, rtx, rtx)); extern void alpha_expand_unaligned_load (rtx, rtx, long, long, int); extern void alpha_expand_unaligned_store (rtx, rtx, long, long); extern int alpha_expand_block_move (rtx []); extern int alpha_expand_block_clear (rtx []); extern rtx alpha_return_addr (int, rtx); extern rtx alpha_gp_save_rtx (void); extern void print_operand (FILE *, rtx, int); extern void print_operand_address (FILE *, rtx); extern void alpha_initialize_trampoline (rtx, rtx, rtx, int, int, int); extern void alpha_reorg (rtx); extern int check_float_value (enum machine_mode, realvaluetype *, int); # 153 "../../gcc/config/alpha/alpha-protos.h" extern rtx alpha_need_linkage (const char *, int); extern tree alpha_build_va_list (void); extern void alpha_va_start (int, tree, rtx); extern rtx alpha_va_arg (tree, tree); extern rtx function_arg (int, enum machine_mode, tree, int); extern void alpha_start_function (FILE *, const char *, tree); extern void alpha_end_function (FILE *, const char *, tree); extern void alpha_output_mi_thunk_osf (FILE *, tree, long, tree); extern void alpha_encode_section_info (tree); extern rtx unicosmk_add_call_info_word (rtx); # 3 "tm_p.h" 2 # 1 "tm-preds.h" 1 extern int reg_or_0_operand (rtx, enum machine_mode); extern int reg_or_6bit_operand (rtx, enum machine_mode); extern int reg_or_8bit_operand (rtx, enum machine_mode); extern int cint8_operand (rtx, enum machine_mode); extern int reg_or_cint_operand (rtx, enum machine_mode); extern int add_operand (rtx, enum machine_mode); extern int sext_add_operand (rtx, enum machine_mode); extern int const48_operand (rtx, enum machine_mode); extern int and_operand (rtx, enum machine_mode); extern int or_operand (rtx, enum machine_mode); extern int mode_mask_operand (rtx, enum machine_mode); extern int mul8_operand (rtx, enum machine_mode); extern int mode_width_operand (rtx, enum machine_mode); extern int reg_or_fp0_operand (rtx, enum machine_mode); extern int alpha_comparison_operator (rtx, enum machine_mode); extern int alpha_zero_comparison_operator (rtx, enum machine_mode); extern int alpha_swapped_comparison_operator (rtx, enum machine_mode); extern int signed_comparison_operator (rtx, enum machine_mode); extern int alpha_fp_comparison_operator (rtx, enum machine_mode); extern int divmod_operator (rtx, enum machine_mode); extern int fp0_operand (rtx, enum machine_mode); extern int current_file_function_operand (rtx, enum machine_mode); extern int direct_call_operand (rtx, enum machine_mode); extern int local_symbolic_operand (rtx, enum machine_mode); extern int small_symbolic_operand (rtx, enum machine_mode); extern int global_symbolic_operand (rtx, enum machine_mode); extern int call_operand (rtx, enum machine_mode); extern int input_operand (rtx, enum machine_mode); extern int some_operand (rtx, enum machine_mode); extern int some_ni_operand (rtx, enum machine_mode); extern int aligned_memory_operand (rtx, enum machine_mode); extern int unaligned_memory_operand (rtx, enum machine_mode); extern int reg_or_unaligned_mem_operand (rtx, enum machine_mode); extern int any_memory_operand (rtx, enum machine_mode); extern int hard_fp_register_operand (rtx, enum machine_mode); extern int hard_int_register_operand (rtx, enum machine_mode); extern int reg_not_elim_operand (rtx, enum machine_mode); extern int reg_no_subreg_operand (rtx, enum machine_mode); extern int addition_operation (rtx, enum machine_mode); extern int symbolic_operand (rtx, enum machine_mode); extern int some_small_symbolic_operand (rtx, enum machine_mode); # 5 "tm_p.h" 2 # 36 "../../gcc/predict.c" 2 # 1 "../../gcc/hard-reg-set.h" 1 # 41 "../../gcc/hard-reg-set.h" typedef unsigned long HARD_REG_ELT_TYPE; # 395 "../../gcc/hard-reg-set.h" extern char fixed_regs[64]; extern HARD_REG_ELT_TYPE fixed_reg_set; extern char call_used_regs[64]; extern HARD_REG_ELT_TYPE call_used_reg_set; extern HARD_REG_ELT_TYPE losing_caller_save_reg_set; extern char call_fixed_regs[64]; extern HARD_REG_ELT_TYPE call_fixed_reg_set; extern char global_regs[64]; # 441 "../../gcc/hard-reg-set.h" extern HARD_REG_ELT_TYPE regs_invalidated_by_call; extern int reg_alloc_order[64]; extern int inv_reg_alloc_order[64]; extern HARD_REG_ELT_TYPE reg_class_contents[(int) LIM_REG_CLASSES]; extern unsigned int reg_class_size[(int) LIM_REG_CLASSES]; extern enum reg_class reg_class_superclasses[(int) LIM_REG_CLASSES][(int) LIM_REG_CLASSES]; extern enum reg_class reg_class_subclasses[(int) LIM_REG_CLASSES][(int) LIM_REG_CLASSES]; extern enum reg_class reg_class_subunion[(int) LIM_REG_CLASSES][(int) LIM_REG_CLASSES]; extern enum reg_class reg_class_superunion[(int) LIM_REG_CLASSES][(int) LIM_REG_CLASSES]; extern int n_non_fixed_regs; extern const char * reg_names[64]; # 37 "../../gcc/predict.c" 2 # 1 "../../gcc/basic-block.h" 1 # 25 "../../gcc/basic-block.h" # 1 "../../gcc/bitmap.h" 1 # 43 "../../gcc/bitmap.h" typedef struct bitmap_element_def { struct bitmap_element_def *next; struct bitmap_element_def *prev; unsigned int indx; unsigned long bits[2]; } bitmap_element; typedef struct bitmap_head_def { bitmap_element *first; bitmap_element *current; unsigned int indx; } bitmap_head, *bitmap; enum bitmap_bits { BITMAP_AND, BITMAP_AND_COMPL, BITMAP_IOR, BITMAP_XOR, BITMAP_IOR_COMPL }; extern bitmap_element bitmap_zero_bits; extern void bitmap_clear (bitmap); extern void bitmap_copy (bitmap, bitmap); extern int bitmap_equal_p (bitmap, bitmap); extern int bitmap_operation (bitmap, bitmap, bitmap, enum bitmap_bits); extern void bitmap_ior_and_compl (bitmap, bitmap, bitmap); extern void bitmap_clear_bit (bitmap, int); extern void bitmap_set_bit (bitmap, int); extern int bitmap_bit_p (bitmap, int); extern void debug_bitmap (bitmap); extern void debug_bitmap_file (FILE *, bitmap); extern void bitmap_print (FILE *, bitmap, const char *, const char *); extern bitmap bitmap_initialize (bitmap); extern void bitmap_release_memory (void); extern int bitmap_union_of_diff (bitmap, bitmap, bitmap, bitmap); extern int bitmap_first_set_bit (bitmap); extern int bitmap_last_set_bit (bitmap); # 26 "../../gcc/basic-block.h" 2 # 1 "../../gcc/sbitmap.h" 1 # 31 "../../gcc/sbitmap.h" typedef struct simple_bitmap_def { unsigned int n_bits; unsigned int size; unsigned int bytes; unsigned long elms[1]; } *sbitmap; typedef unsigned long *sbitmap_ptr; # 91 "../../gcc/sbitmap.h" struct int_list; extern void dump_sbitmap (FILE *, sbitmap); extern void dump_sbitmap_vector (FILE *, const char *, const char *, sbitmap *, int); extern sbitmap sbitmap_alloc (unsigned int); extern sbitmap *sbitmap_vector_alloc (unsigned int, unsigned int); extern void sbitmap_copy (sbitmap, sbitmap); extern int sbitmap_equal (sbitmap, sbitmap); extern void sbitmap_zero (sbitmap); extern void sbitmap_ones (sbitmap); extern void sbitmap_vector_zero (sbitmap *, unsigned int); extern void sbitmap_vector_ones (sbitmap *, unsigned int); extern int sbitmap_union_of_diff (sbitmap, sbitmap, sbitmap, sbitmap); extern void sbitmap_difference (sbitmap, sbitmap, sbitmap); extern void sbitmap_not (sbitmap, sbitmap); extern int sbitmap_a_or_b_and_c (sbitmap, sbitmap, sbitmap, sbitmap); extern int sbitmap_a_and_b_or_c (sbitmap, sbitmap, sbitmap, sbitmap); extern int sbitmap_a_and_b (sbitmap, sbitmap, sbitmap); extern int sbitmap_a_or_b (sbitmap, sbitmap, sbitmap); extern int sbitmap_a_xor_b (sbitmap, sbitmap, sbitmap); extern int sbitmap_a_subset_b_p (sbitmap, sbitmap); extern int sbitmap_first_set_bit (sbitmap); extern int sbitmap_last_set_bit (sbitmap); extern void sbitmap_intersect_of_predsucc (sbitmap, sbitmap *, int, struct int_list **); extern void sbitmap_union_of_predsucc (sbitmap, sbitmap *, int, struct int_list **); extern void sbitmap_intersection_of_succs (sbitmap, sbitmap *, int); extern void sbitmap_intersection_of_preds (sbitmap, sbitmap *, int); extern void sbitmap_union_of_succs (sbitmap, sbitmap *, int); extern void sbitmap_union_of_preds (sbitmap, sbitmap *, int); extern void debug_sbitmap (sbitmap); # 27 "../../gcc/basic-block.h" 2 # 1 "../../gcc/varray.h" 1 # 36 "../../gcc/varray.h" struct const_equiv_data { # 50 "../../gcc/varray.h" struct rtx_def *rtx; unsigned age; }; typedef union varray_data_tag { char c[1]; unsigned char uc[1]; short s[1]; unsigned short us[1]; int i[1]; unsigned int u[1]; long l[1]; unsigned long ul[1]; long hint[1]; unsigned long uhint[1]; void * generic[1]; char *cptr[1]; struct rtx_def *rtx[1]; struct rtvec_def *rtvec[1]; union tree_node *tree[1]; struct bitmap_head_def *bitmap[1]; struct sched_info_tag *sched[1]; struct reg_info_def *reg[1]; struct const_equiv_data const_equiv[1]; struct basic_block_def *bb[1]; struct elt_list *te[1]; } varray_data; typedef struct varray_head_tag { size_t num_elements; size_t elements_used; size_t element_size; const char *name; varray_data data; } *varray_type; extern varray_type varray_init (size_t, size_t, const char *); # 165 "../../gcc/varray.h" extern varray_type varray_grow (varray_type, size_t); # 28 "../../gcc/basic-block.h" 2 # 1 "../../include/partition.h" 1 # 46 "../../include/partition.h" struct partition_elem { int class_element; struct partition_elem* next; unsigned class_count; }; typedef struct partition_def { int num_elements; struct partition_elem elements[1]; } *partition; extern partition partition_new (int); extern void partition_delete (partition); extern int partition_union (partition, int, int); extern void partition_print (partition, FILE*); # 29 "../../gcc/basic-block.h" 2 typedef bitmap_head regset_head; typedef bitmap regset; # 74 "../../gcc/basic-block.h" extern void reg_set_to_hard_reg_set (HARD_REG_ELT_TYPE *, bitmap); # 116 "../../gcc/basic-block.h" typedef long gcov_type; typedef struct edge_def { struct edge_def *pred_next, *succ_next; struct basic_block_def *src, *dest; rtx insns; void *aux; int flags; int probability; gcov_type count; } *edge; # 174 "../../gcc/basic-block.h" typedef struct basic_block_def { rtx head, end; tree head_tree; tree end_tree; edge pred, succ; regset local_set; regset cond_local_set; regset global_live_at_start; regset global_live_at_end; void *aux; int index; int loop_depth; gcov_type count; int frequency; int flags; } *basic_block; # 228 "../../gcc/basic-block.h" extern int n_basic_blocks; extern int n_edges; extern varray_type basic_block_info; extern regset regs_live_at_setjmp; extern rtx label_value_list, tail_recursion_label_list; extern struct obstack flow_obstack; # 278 "../../gcc/basic-block.h" extern struct basic_block_def entry_exit_blocks[2]; extern varray_type basic_block_for_insn; extern void compute_bb_for_insn (int); extern void free_bb_for_insn (void); extern void update_bb_for_insn (basic_block); extern void set_block_for_insn (rtx, basic_block); extern void free_basic_block_vars (int); extern edge split_block (basic_block, rtx); extern basic_block split_edge (edge); extern void insert_insn_on_edge (rtx, edge); extern void commit_edge_insertions (void); extern void remove_fake_edges (void); extern void add_noreturn_fake_exit_edges (void); extern void connect_infinite_loops_to_exit (void); extern int flow_call_edges_add (sbitmap); extern edge cached_make_edge (sbitmap *, basic_block, basic_block, int); extern edge make_edge (basic_block, basic_block, int); extern edge make_single_succ_edge (basic_block, basic_block, int); extern void remove_edge (edge); extern void redirect_edge_succ (edge, basic_block); extern edge redirect_edge_succ_nodup (edge, basic_block); extern void redirect_edge_pred (edge, basic_block); extern basic_block create_basic_block_structure (int, rtx, rtx, rtx); extern basic_block create_basic_block (int, rtx, rtx); extern int flow_delete_block (basic_block); extern int flow_delete_block_noexpunge (basic_block); extern void merge_blocks_nomove (basic_block, basic_block); extern void tidy_fallthru_edge (edge, basic_block, basic_block); extern void tidy_fallthru_edges (void); extern void flow_reverse_top_sort_order_compute (int *); extern int flow_depth_first_order_compute (int *, int *); extern void flow_preorder_transversal_compute (int *); extern void dump_edge_info (FILE *, edge, int); extern void clear_edges (void); extern void mark_critical_edges (void); extern rtx first_insn_after_basic_block_note (basic_block); struct loop { int num; basic_block header; basic_block latch; basic_block pre_header; edge *pre_header_edges; int num_pre_header_edges; basic_block first; basic_block last; sbitmap nodes; int num_nodes; edge *entry_edges; int num_entries; edge *exit_edges; int num_exits; sbitmap exits_doms; int depth; int level; struct loop *outer; struct loop *inner; struct loop *next; int shared; int invalid; void *aux; rtx vtop; rtx cont; rtx cont_dominator; rtx start; rtx end; rtx top; rtx scan_start; rtx sink; # 442 "../../gcc/basic-block.h" rtx exit_labels; int exit_count; }; struct loops { int num; int levels; struct loop *array; struct loop *tree_root; struct cfg { sbitmap *dom; int *dfs_order; int *rc_order; } cfg; sbitmap shared_headers; }; extern int flow_loops_find (struct loops *, int flags); extern int flow_loops_update (struct loops *, int flags); extern void flow_loops_free (struct loops *); extern void flow_loops_dump (const struct loops *, FILE *, void (*)(const struct loop *, FILE *, int), int); extern void flow_loop_dump (const struct loop *, FILE *, void (*)(const struct loop *, FILE *, int), int); extern int flow_loop_scan (struct loops *, struct loop *, int); struct edge_list { int num_blocks; int num_edges; edge *index_to_edge; }; # 539 "../../gcc/basic-block.h" struct edge_list * create_edge_list (void); void free_edge_list (struct edge_list *); void print_edge_list (FILE *, struct edge_list *); void verify_edge_list (FILE *, struct edge_list *); int find_edge_index (struct edge_list *, basic_block, basic_block); enum update_life_extent { UPDATE_LIFE_LOCAL = 0, UPDATE_LIFE_GLOBAL = 1, UPDATE_LIFE_GLOBAL_RM_NOTES = 2 }; # 588 "../../gcc/basic-block.h" extern void life_analysis (rtx, FILE *, int); extern void update_life_info (sbitmap, enum update_life_extent, int); extern int count_or_remove_death_notes (sbitmap, int); extern int propagate_block (basic_block, regset, regset, regset, int); struct propagate_block_info; extern rtx propagate_one_insn (struct propagate_block_info *, rtx); extern struct propagate_block_info *init_propagate_block_info (basic_block, regset, regset, regset, int); extern void free_propagate_block_info (struct propagate_block_info *); extern struct edge_list *pre_edge_lcm (FILE *, int, sbitmap *, sbitmap *, sbitmap *, sbitmap *, sbitmap **, sbitmap **); extern struct edge_list *pre_edge_rev_lcm (FILE *, int, sbitmap *, sbitmap *, sbitmap *, sbitmap *, sbitmap **, sbitmap **); extern void compute_available (sbitmap *, sbitmap *, sbitmap *, sbitmap *); extern int optimize_mode_switching (FILE *); extern rtx emit_block_insn_after (rtx, rtx, basic_block); extern rtx emit_block_insn_before (rtx, rtx, basic_block); extern void estimate_probability (struct loops *); extern void expected_value_to_br_prob (void); extern void init_flow (void); extern void reorder_basic_blocks (void); extern void dump_bb (basic_block, FILE *); extern void debug_bb (basic_block); extern void debug_bb_n (int); extern void dump_regset (regset, FILE *); extern void debug_regset (regset); extern void allocate_reg_life_data (void); extern void allocate_bb_life_data (void); extern void expunge_block (basic_block); extern void expunge_block_nocompact (basic_block); extern basic_block alloc_block (void); extern void find_unreachable_blocks (void); extern void delete_noop_moves (rtx); extern basic_block redirect_edge_and_branch_force (edge, basic_block); extern basic_block force_nonfallthru (edge); extern _Bool redirect_edge_and_branch (edge, basic_block); extern rtx block_label (basic_block); extern _Bool forwarder_block_p (basic_block); extern _Bool purge_all_dead_edges (int); extern _Bool purge_dead_edges (basic_block); extern void find_sub_basic_blocks (basic_block); extern void find_many_sub_basic_blocks (sbitmap); extern _Bool can_fallthru (basic_block, basic_block); extern void flow_nodes_print (const char *, const sbitmap, FILE *); extern void flow_edge_list_print (const char *, const edge *, int, FILE *); extern void alloc_aux_for_block (basic_block, int); extern void alloc_aux_for_blocks (int); extern void clear_aux_for_blocks (void); extern void free_aux_for_blocks (void); extern void alloc_aux_for_edge (edge, int); extern void alloc_aux_for_edges (int); extern void clear_aux_for_edges (void); extern void free_aux_for_edges (void); extern void verify_flow_info (void); extern int flow_loop_outside_edge_p (const struct loop *, edge); typedef struct conflict_graph_def *conflict_graph; typedef int (*conflict_graph_enum_fn) (int, int, void *); extern conflict_graph conflict_graph_new (int); extern void conflict_graph_delete (conflict_graph); extern int conflict_graph_add (conflict_graph, int, int); extern int conflict_graph_conflict_p (conflict_graph, int, int); extern void conflict_graph_enum (conflict_graph, int, conflict_graph_enum_fn, void *); extern void conflict_graph_merge_regs (conflict_graph, int, int); extern void conflict_graph_print (conflict_graph, FILE*); extern conflict_graph conflict_graph_compute (regset, partition); extern _Bool mark_dfs_back_edges (void); extern void update_br_prob_note (basic_block); extern void fixup_abnormal_edges (void); enum cdi_direction { CDI_DOMINATORS, CDI_POST_DOMINATORS }; extern void calculate_dominance_info (int *, sbitmap *, enum cdi_direction); # 38 "../../gcc/predict.c" 2 # 1 "insn-config.h" 1 # 39 "../../gcc/predict.c" 2 # 1 "../../gcc/regs.h" 1 # 42 "../../gcc/regs.h" extern int max_regno; typedef struct reg_info_def { int first_uid; int last_uid; int last_note_uid; int sets; int refs; int freq; int deaths; int live_length; int calls_crossed; int basic_block; char changes_mode; } reg_info; extern varray_type reg_n_info; # 157 "../../gcc/regs.h" extern short *reg_renumber; extern char regs_ever_live[64]; extern const char * reg_names[64]; extern enum machine_mode reg_raw_mode[64]; # 196 "../../gcc/regs.h" extern rtx regs_may_share; extern int caller_save_needed; # 230 "../../gcc/regs.h" extern void allocate_reg_info (size_t, int, int); # 40 "../../gcc/predict.c" 2 # 1 "../../gcc/flags.h" 1 # 26 "../../gcc/flags.h" extern const char *main_input_filename; enum debug_info_type { NO_DEBUG, DBX_DEBUG, SDB_DEBUG, DWARF_DEBUG, DWARF2_DEBUG, XCOFF_DEBUG, VMS_DEBUG, VMS_AND_DWARF2_DEBUG }; extern enum debug_info_type write_symbols; enum debug_info_level { DINFO_LEVEL_NONE, DINFO_LEVEL_TERSE, DINFO_LEVEL_NORMAL, DINFO_LEVEL_VERBOSE }; extern enum debug_info_level debug_info_level; extern int use_gnu_debug_info_extensions; extern int optimize; extern int optimize_size; extern int quiet_flag; extern int time_report; extern int mem_report; extern int inhibit_warnings; extern int warn_system_headers; extern int extra_warnings; extern void set_Wunused (int setting); extern int warn_unused_function; extern int warn_unused_label; extern int warn_unused_parameter; extern int warn_unused_variable; extern int warn_unused_value; extern int warn_notreached; extern int warn_inline; extern int warn_uninitialized; extern int warn_unknown_pragmas; extern int warn_shadow; extern int warn_switch; extern int warn_return_type; extern int warn_missing_noreturn; extern int warn_cast_align; extern int warn_larger_than; extern long larger_than_size; extern int warn_aggregate_return; extern int warn_packed; extern int warn_padded; extern int warn_disabled_optimization; extern int warn_deprecated_decl; extern int profile_flag; extern int profile_arc_flag; extern int flag_test_coverage; extern int flag_branch_probabilities; extern int flag_reorder_blocks; extern int flag_rename_registers; extern int pedantic; extern int in_system_header; extern int flag_print_asm_name; extern int flag_signed_char; extern int flag_short_enums; extern int flag_caller_saves; extern int flag_pcc_struct_return; extern int flag_force_mem; extern int flag_force_addr; extern int flag_defer_pop; extern int flag_float_store; extern int flag_strength_reduce; extern int flag_unroll_loops; extern int flag_unroll_all_loops; extern int flag_move_all_movables; extern int flag_prefetch_loop_arrays; extern int flag_reduce_all_givs; extern int flag_cse_follow_jumps; extern int flag_cse_skip_blocks; extern int flag_expensive_optimizations; extern int flag_writable_strings; extern int flag_no_function_cse; extern int flag_omit_frame_pointer; extern int flag_no_peephole; extern int flag_volatile; extern int flag_volatile_global; extern int flag_volatile_static; extern int flag_optimize_sibling_calls; extern int flag_errno_math; extern int flag_unsafe_math_optimizations; extern int flag_trapping_math; extern int flag_complex_divide_method; extern int flag_rerun_loop_opt; extern int flag_inline_functions; extern int flag_keep_inline_functions; extern int flag_no_inline; extern int flag_really_no_inline; extern int flag_syntax_only; extern int flag_gen_aux_info; extern int flag_shared_data; extern int flag_schedule_insns; extern int flag_schedule_insns_after_reload; # 418 "../../gcc/flags.h" extern int flag_schedule_interblock; extern int flag_schedule_speculative; extern int flag_schedule_speculative_load; extern int flag_schedule_speculative_load_dangerous; extern int flag_branch_on_count_reg; extern int flag_single_precision_constant; extern int flag_delayed_branch; extern int flag_dump_unnumbered; extern int flag_pretend_float; extern int flag_pedantic_errors; extern int flag_pic; extern int flag_exceptions; extern int flag_unwind_tables; extern int flag_asynchronous_unwind_tables; extern int flag_no_common; extern int flag_inhibit_size_directive; extern int flag_function_sections; extern int flag_data_sections; # 498 "../../gcc/flags.h" extern int flag_verbose_asm; # 507 "../../gcc/flags.h" extern int flag_debug_asm; extern int flag_dump_rtl_in_asm; extern int flag_gnu_linker; extern int flag_pack_struct; # 525 "../../gcc/flags.h" extern int flag_argument_noalias; extern int flag_strict_aliasing; extern int flag_stack_check; extern int flag_regmove; extern int flag_instrument_function_entry_exit; extern int flag_peephole2; extern int flag_guess_branch_prob; extern int flag_bounded_pointers; extern int flag_bounds_check; extern int flag_merge_constants; extern int flag_renumber_insns; extern int frame_pointer_needed; extern int flag_trapv; extern int g_switch_value; extern int g_switch_set; extern int align_loops; extern int align_loops_log; extern int align_loops_max_skip; extern int align_jumps; extern int align_jumps_log; extern int align_jumps_max_skip; extern int align_labels; extern int align_labels_log; extern int align_labels_max_skip; extern int align_functions; extern int align_functions_log; extern int dump_for_graph; enum graph_dump_types { no_graph = 0, vcg }; extern enum graph_dump_types graph_dump_format; extern int flag_no_ident; extern int flag_gcse_lm; extern int flag_gcse_sm; extern int flag_eliminate_dwarf2_dups; extern int flag_detailed_statistics; extern int flag_non_call_exceptions; # 41 "../../gcc/predict.c" 2 # 1 "../../gcc/output.h" 1 # 24 "../../gcc/output.h" extern void compute_alignments (void); extern void init_final (const char *); extern void end_final (const char *); extern void app_enable (void); extern void app_disable (void); extern int dbr_sequence_length (void); extern void init_insn_lengths (void); extern int get_attr_length (rtx); extern void shorten_branches (rtx); extern void final_start_function (rtx, FILE *, int); extern void final_end_function (void); extern void final (rtx, FILE *, int, int); extern rtx final_scan_insn (rtx, FILE *, int, int, int); extern rtx alter_subreg (rtx *); extern void output_operand_lossage (const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2))); extern void output_asm_insn (const char *, rtx *); extern int insn_current_reference_address (rtx); extern int label_to_alignment (rtx); extern void output_asm_label (rtx); extern void output_address (rtx); extern void output_addr_const (FILE *, rtx); extern void asm_fprintf (FILE *file, const char *p, ...); extern void split_double (rtx, rtx *, rtx *); extern int leaf_function_p (void); extern int final_forward_branch_p (rtx); extern int only_leaf_regs_used (void); extern void leaf_renumber_regs_insn (rtx); extern const char *get_insn_template (int, rtx); extern int add_weak (const char *, const char *); extern void allocate_for_life_analysis (void); extern int regno_uninitialized (unsigned int); extern int regno_clobbered_at_setjmp (int); extern void find_basic_blocks (rtx, int, FILE *); extern _Bool cleanup_cfg (int); extern void check_function_return_warnings (void); extern void text_section (void); extern void data_section (void); extern void force_data_section (void); extern void readonly_data_section (void); extern int in_text_section (void); # 218 "../../gcc/output.h" extern void named_section (tree, const char *, int); extern void function_section (tree); extern void mergeable_string_section (tree, unsigned long, unsigned int); extern void mergeable_constant_section (enum machine_mode, unsigned long, unsigned int); extern void declare_weak (tree); extern void merge_weak (tree, tree); extern void weak_finish (void); # 248 "../../gcc/output.h" extern int decode_reg_name (const char *); extern void make_var_volatile (tree); extern void assemble_constant_align (tree); extern void assemble_alias (tree, tree); extern void assemble_asm (tree); extern void assemble_start_function (tree, const char *); extern void assemble_end_function (tree, const char *); # 283 "../../gcc/output.h" extern void assemble_variable (tree, int, int, int); extern void assemble_external (tree); extern void assemble_zeros (int); extern void assemble_align (int); extern void assemble_eh_align (int); extern void assemble_string (const char *, int); extern void assemble_external_libcall (rtx); extern void assemble_global (const char *); extern void assemble_label (const char *); extern void assemble_eh_label (const char *); extern void assemble_name (FILE *, const char *); # 327 "../../gcc/output.h" extern const char *integer_asm_op (int, int); extern void assemble_integer_with_op (const char *, rtx); extern _Bool default_assemble_integer (rtx, unsigned int, int); extern _Bool assemble_integer (rtx, unsigned, unsigned, int); # 351 "../../gcc/output.h" extern void assemble_real (realvaluetype, enum machine_mode, unsigned); # 360 "../../gcc/output.h" extern void clear_const_double_mem (void); extern void defer_addressed_constants (void); extern void output_deferred_addressed_constants (void); extern int get_pool_size (void); extern void output_constant_pool (const char *, tree); # 389 "../../gcc/output.h" extern tree initializer_constant_valid_p (tree, tree); # 399 "../../gcc/output.h" extern void output_constant (tree, long, unsigned int); # 410 "../../gcc/output.h" extern rtx final_sequence; extern int sdb_begin_function_line; extern FILE *asm_out_file; extern const char *first_global_object_name; extern const char *weak_global_object_name; extern int current_function_is_leaf; extern int current_function_nothrow; extern int current_function_sp_is_unchanging; extern int current_function_uses_only_leaf_regs; extern FILE *rtl_dump_file; extern struct rtx_def *current_insn_predicate; extern struct rtx_def *current_output_insn; # 480 "../../gcc/output.h" extern const char *user_label_prefix; # 491 "../../gcc/output.h" extern void default_function_pro_epilogue (FILE *, long); extern void default_exception_section (void); extern void default_eh_frame_section (void); extern void no_asm_to_stream (FILE *); # 517 "../../gcc/output.h" extern unsigned int get_named_section_flags (const char *); extern _Bool set_named_section_flags (const char *, unsigned int); extern void named_section_flags (const char *, unsigned int); extern _Bool named_section_first_declaration (const char *); union tree_node; extern unsigned int default_section_type_flags (union tree_node *, const char *, int); extern void default_no_named_section (const char *, unsigned int); extern void default_elf_asm_named_section (const char *, unsigned int); extern void default_coff_asm_named_section (const char *, unsigned int); extern void default_pe_asm_named_section (const char *, unsigned int); extern void default_stabs_asm_out_destructor (struct rtx_def *, int); extern void default_named_section_asm_out_destructor (struct rtx_def *, int); extern void default_dtor_section_asm_out_destructor (struct rtx_def *, int); extern void default_stabs_asm_out_constructor (struct rtx_def *, int); extern void default_named_section_asm_out_constructor (struct rtx_def *, int); extern void default_ctor_section_asm_out_constructor (struct rtx_def *, int); extern void assemble_vtable_entry (struct rtx_def *, long); extern void assemble_vtable_inherit (struct rtx_def *, struct rtx_def *); # 42 "../../gcc/predict.c" 2 # 1 "../../gcc/function.h" 1 # 22 "../../gcc/function.h" struct var_refs_queue { rtx modified; enum machine_mode promoted_mode; int unsignedp; struct var_refs_queue *next; }; struct sequence_stack { rtx first, last; tree sequence_rtl_expr; struct sequence_stack *next; }; extern struct sequence_stack *sequence_stack; struct simple_obstack_stack { struct obstack *obstack; struct simple_obstack_stack *next; }; struct emit_status { int x_reg_rtx_no; int x_first_label_num; rtx x_first_insn; rtx x_last_insn; tree sequence_rtl_expr; struct sequence_stack *sequence_stack; int x_cur_insn_uid; int x_last_linenum; const char *x_last_filename; int regno_pointer_align_length; unsigned char *regno_pointer_align; tree *regno_decl; rtx *x_regno_reg_rtx; }; # 119 "../../gcc/function.h" struct expr_status { int x_pending_stack_adjust; # 140 "../../gcc/function.h" int x_inhibit_defer_pop; int x_stack_pointer_delta; rtx x_saveregs_value; rtx x_apply_args_value; rtx x_forced_labels; rtx x_pending_chain; }; # 174 "../../gcc/function.h" struct function { struct eh_status *eh; struct stmt_status *stmt; struct expr_status *expr; struct emit_status *emit; struct varasm_status *varasm; const char *name; tree decl; struct function *outer; int pops_args; int args_size; int pretend_args_size; int outgoing_args_size; rtx arg_offset_rtx; int args_info; rtx return_rtx; rtx internal_arg_pointer; const char *cannot_inline; struct initial_value_struct *hard_reg_initial_vals; int x_function_call_count; tree x_nonlocal_labels; rtx x_nonlocal_goto_handler_slots; rtx x_nonlocal_goto_handler_labels; rtx x_nonlocal_goto_stack_level; rtx x_cleanup_label; rtx x_return_label; rtx x_save_expr_regs; rtx x_stack_slot_list; tree x_rtl_expr_chain; rtx x_tail_recursion_label; rtx x_tail_recursion_reentry; rtx x_arg_pointer_save_area; rtx x_clobber_return_insn; long x_frame_offset; tree x_context_display; # 317 "../../gcc/function.h" tree x_trampoline_list; rtx x_parm_birth_insn; rtx x_last_parm_insn; unsigned int x_max_parm_reg; rtx *x_parm_reg_stack_loc; struct temp_slot *x_temp_slots; int x_temp_slot_level; int x_var_temp_slot_level; int x_target_temp_slot_level; struct var_refs_queue *fixup_var_refs_queue; int inlinable; int no_debugging_symbols; void *original_arg_vector; tree original_decl_initial; rtx inl_last_parm_insn; int inl_max_label_num; int profile_label_no; struct machine_function *machine; int stack_alignment_needed; int preferred_stack_boundary; struct language_function *language; rtx epilogue_delay_list; unsigned int returns_struct : 1; unsigned int returns_pcc_struct : 1; unsigned int returns_pointer : 1; unsigned int needs_context : 1; unsigned int calls_setjmp : 1; unsigned int calls_longjmp : 1; unsigned int calls_alloca : 1; unsigned int calls_eh_return : 1; unsigned int has_nonlocal_label : 1; unsigned int has_nonlocal_goto : 1; unsigned int contains_functions : 1; unsigned int has_computed_jump : 1; unsigned int is_thunk : 1; unsigned int instrument_entry_exit : 1; unsigned int profile : 1; unsigned int limit_stack : 1; unsigned int varargs : 1; unsigned int stdarg : 1; unsigned int x_whole_function_mode_p : 1; # 468 "../../gcc/function.h" unsigned int x_dont_save_pending_sizes_p : 1; unsigned int uses_const_pool : 1; unsigned int uses_pic_offset_table : 1; unsigned int uses_eh_lsda : 1; unsigned int arg_pointer_save_area_init : 1; }; extern struct function *cfun; extern int virtuals_instantiated; # 549 "../../gcc/function.h" extern tree inline_function_decl; struct function *find_function_data (tree); extern void identify_blocks (void); extern void reorder_blocks (void); extern void number_blocks (tree); extern long get_frame_size (void); extern long get_func_frame_size (struct function *); extern void (*init_machine_status) (struct function *); extern void (*free_machine_status) (struct function *); extern void (*mark_machine_status) (struct function *); extern void (*init_lang_status) (struct function *); extern void (*mark_lang_status) (struct function *); extern void (*save_lang_status) (struct function *); extern void (*restore_lang_status) (struct function *); extern void (*free_lang_status) (struct function *); extern void restore_emit_status (struct function *); extern void free_after_parsing (struct function *); extern void free_after_compilation (struct function *); extern void init_varasm_status (struct function *); extern void free_varasm_status (struct function *); extern void free_emit_status (struct function *); extern void free_stmt_status (struct function *); extern void free_eh_status (struct function *); extern void free_expr_status (struct function *); extern rtx get_first_block_beg (void); extern void diddle_return_value (void (*)(rtx, void*), void*); extern void clobber_return_register (void); extern void use_return_register (void); extern rtx get_arg_pointer_save_area (struct function *); extern void init_virtual_regs (struct emit_status *); extern void init_function_once (void); # 43 "../../gcc/predict.c" 2 # 1 "../../gcc/except.h" 1 # 29 "../../gcc/except.h" struct function; struct inline_remap; struct eh_status; struct eh_region; extern int doing_eh (int); extern void expand_eh_region_start (void); extern void expand_eh_region_end_cleanup (tree); extern void expand_start_all_catch (void); extern void expand_start_catch (tree); extern void expand_end_catch (void); extern void expand_end_all_catch (void); extern void expand_eh_region_end_allowed (tree, tree); extern void expand_eh_region_end_must_not_throw (tree); extern void expand_eh_region_end_throw (tree); extern void expand_eh_region_end_fixup (tree); extern void begin_protect_partials (void); extern void add_partial_entry (tree); extern void end_protect_partials (void); extern void for_each_eh_label (void (*) (rtx)); extern _Bool can_throw_internal (rtx); extern _Bool can_throw_external (rtx); extern _Bool nothrow_function_p (void); extern void finish_eh_generation (void); extern void init_eh (void); extern void init_eh_for_function (void); extern rtx reachable_handlers (rtx); extern void maybe_remove_eh_handler (rtx); extern void convert_from_eh_region_ranges (void); extern void convert_to_eh_region_ranges (void); extern void find_exception_handler_labels (void); extern _Bool current_function_has_exception_handlers (void); extern void output_function_exception_table (void); extern void expand_builtin_unwind_init (void); extern rtx expand_builtin_eh_return_data_regno (tree); extern rtx expand_builtin_extract_return_addr (tree); extern void expand_builtin_init_dwarf_reg_sizes (tree); extern rtx expand_builtin_frob_return_addr (tree); extern rtx expand_builtin_dwarf_fp_regnum (void); extern void expand_builtin_eh_return (tree, tree); extern void expand_eh_return (void); extern rtx get_exception_pointer (struct function *); extern int duplicate_eh_regions (struct function *, struct inline_remap *); extern void sjlj_emit_function_exit_after (rtx); # 147 "../../gcc/except.h" extern tree (*lang_protect_cleanup_actions) (void); extern int (*lang_eh_type_covers) (tree a, tree b); extern tree (*lang_eh_runtime_type) (tree); # 44 "../../gcc/predict.c" 2 # 1 "../../gcc/toplev.h" 1 # 29 "../../gcc/toplev.h" extern int toplev_main (int, char **); extern int read_integral_parameter (const char *, const char *, const int); extern int count_error (int); extern void strip_off_ending (char *, int); extern void print_time (const char *, long); extern const char *trim_filename (const char *); extern void internal_error (const char *, ...) __attribute__ ((__noreturn__)); extern void fatal_io_error (const char *, ...) __attribute__ ((__noreturn__)); extern void _fatal_insn_not_found (struct rtx_def *, const char *, int, const char *) __attribute__ ((__noreturn__)); extern void _fatal_insn (const char *, struct rtx_def *, const char *, int, const char *) __attribute__ ((__noreturn__)); # 58 "../../gcc/toplev.h" extern void warning (const char *, ...); extern void error (const char *, ...); extern void fatal_error (const char *, ...) __attribute__ ((__noreturn__)); extern void pedwarn (const char *, ...); extern void pedwarn_with_file_and_line (const char *, int, const char *, ...); extern void warning_with_file_and_line (const char *, int, const char *, ...); extern void error_with_file_and_line (const char *, int, const char *, ...); extern void sorry (const char *, ...); extern void report_error_function (const char *); extern void rest_of_decl_compilation (union tree_node *, const char *, int, int); extern void rest_of_type_compilation (union tree_node *, int); extern void rest_of_compilation (union tree_node *); extern void pedwarn_with_decl (union tree_node *, const char *, ...); extern void warning_with_decl (union tree_node *, const char *, ...); extern void error_with_decl (union tree_node *, const char *, ...); extern void announce_function (union tree_node *); extern void error_for_asm (struct rtx_def *, const char *, ...); extern void warning_for_asm (struct rtx_def *, const char *, ...); extern void warn_deprecated_use (union tree_node *); extern int do_float_handler (void (*) (void *), void *); extern void output_quoted_string (FILE *, const char *); extern void output_file_directive (FILE *, const char *); extern void do_abort (void) __attribute__ ((__noreturn__)); extern void botch (const char *) __attribute__ ((__noreturn__)); extern void fnotice (FILE *, const char *, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int wrapup_global_declarations (union tree_node **, int); extern void check_global_declarations (union tree_node **, int); extern const char *progname; extern const char *dump_base_name; extern struct ht *ident_hash; extern void set_fast_math_flags (void); extern void set_no_fast_math_flags (void); # 130 "../../gcc/toplev.h" extern int exact_log2_wide (unsigned long); extern int floor_log2_wide (unsigned long); # 45 "../../gcc/predict.c" 2 # 1 "../../gcc/recog.h" 1 # 28 "../../gcc/recog.h" enum op_type { OP_IN, OP_OUT, OP_INOUT }; struct operand_alternative { const char *constraint; enum reg_class class; unsigned int reject; int matches; int matched; unsigned int earlyclobber:1; unsigned int memory_ok:1; unsigned int offmem_ok:1; unsigned int nonoffmem_ok:1; unsigned int decmem_ok:1; unsigned int incmem_ok:1; unsigned int is_address:1; unsigned int anything_ok:1; }; extern void init_recog (void); extern void init_recog_no_volatile (void); extern int recog_memoized_1 (rtx); extern int check_asm_operands (rtx); extern int asm_operand_ok (rtx, const char *); extern int validate_change (rtx, rtx *, rtx, int); extern int insn_invalid_p (rtx); extern int apply_change_group (void); extern int num_validated_changes (void); extern void cancel_changes (int); extern int constrain_operands (int); extern int constrain_operands_cached (int); extern int memory_address_p (enum machine_mode, rtx); extern int strict_memory_address_p (enum machine_mode, rtx); extern int validate_replace_rtx_subexp (rtx, rtx, rtx, rtx *); extern int validate_replace_rtx (rtx, rtx, rtx); extern void validate_replace_rtx_group (rtx, rtx, rtx); extern int validate_replace_src (rtx, rtx, rtx); extern int reg_fits_class_p (rtx, enum reg_class, int, enum machine_mode); extern rtx *find_single_use (rtx, rtx, rtx *); extern int general_operand (rtx, enum machine_mode); extern int address_operand (rtx, enum machine_mode); extern int register_operand (rtx, enum machine_mode); extern int pmode_register_operand (rtx, enum machine_mode); extern int scratch_operand (rtx, enum machine_mode); extern int immediate_operand (rtx, enum machine_mode); extern int const_int_operand (rtx, enum machine_mode); extern int const_double_operand (rtx, enum machine_mode); extern int nonimmediate_operand (rtx, enum machine_mode); extern int nonmemory_operand (rtx, enum machine_mode); extern int push_operand (rtx, enum machine_mode); extern int pop_operand (rtx, enum machine_mode); extern int memory_operand (rtx, enum machine_mode); extern int indirect_operand (rtx, enum machine_mode); extern int mode_independent_operand (rtx, enum machine_mode); extern int comparison_operator (rtx, enum machine_mode); extern int offsettable_memref_p (rtx); extern int offsettable_nonstrict_memref_p (rtx); extern int offsettable_address_p (int, enum machine_mode, rtx); extern int mode_dependent_address_p (rtx); extern int recog (rtx, rtx, int *); extern void add_clobbers (rtx, int); extern int added_clobbers_hard_reg_p (int); extern void insn_extract (rtx); extern void extract_insn (rtx); extern void extract_constrain_insn_cached (rtx); extern void extract_insn_cached (rtx); extern void preprocess_constraints (void); extern rtx peep2_next_insn (int); extern int peep2_regno_dead_p (int, int); extern int peep2_reg_dead_p (int, rtx); extern rtx peep2_find_free_register (int, int, const char *, enum machine_mode, HARD_REG_ELT_TYPE *); extern void peephole2_optimize (FILE *); extern rtx peephole2_insns (rtx, rtx, int *); extern int volatile_ok; extern int which_alternative; struct recog_data { rtx operand[30]; rtx *operand_loc[30]; const char *constraints[30]; enum machine_mode operand_mode[30]; enum op_type operand_type[30]; rtx *dup_loc[4]; char dup_num[4]; # 191 "../../gcc/recog.h" char n_operands; char n_dups; char n_alternatives; rtx insn; }; extern struct recog_data recog_data; extern struct operand_alternative recog_op_alt[30][30]; typedef int (*insn_operand_predicate_fn) (rtx, enum machine_mode); typedef const char * (*insn_output_fn) (rtx *, rtx); typedef rtx (*insn_gen_fn) (rtx, ...); struct insn_operand_data { const insn_operand_predicate_fn predicate; const char *const constraint; const enum machine_mode mode : 16; const char strict_low; const char eliminable; }; # 236 "../../gcc/recog.h" struct insn_data { const char *const name; const void * output; const insn_gen_fn genfun; const struct insn_operand_data *const operand; const char n_operands; const char n_dups; const char n_alternatives; const char output_format; }; extern const struct insn_data insn_data[]; # 46 "../../gcc/predict.c" 2 # 1 "../../gcc/expr.h" 1 # 52 "../../gcc/expr.h" enum expand_modifier {EXPAND_NORMAL, EXPAND_SUM, EXPAND_CONST_ADDRESS, EXPAND_INITIALIZER, EXPAND_WRITE}; # 69 "../../gcc/expr.h" struct args_size { long constant; tree var; }; # 119 "../../gcc/expr.h" enum direction {none, upward, downward}; # 256 "../../gcc/expr.h" enum optab_methods { OPTAB_DIRECT, OPTAB_LIB, OPTAB_WIDEN, OPTAB_LIB_WIDEN, OPTAB_MUST_WIDEN }; extern rtx expand_simple_binop (enum machine_mode, enum rtx_code, rtx, rtx, rtx, int, enum optab_methods); extern rtx expand_simple_unop (enum machine_mode, enum rtx_code, rtx, rtx, int); extern int have_insn_for (enum rtx_code, enum machine_mode); extern void emit_libcall_block (rtx, rtx, rtx, rtx); extern rtx gen_add2_insn (rtx, rtx); extern rtx gen_add3_insn (rtx, rtx, rtx); extern rtx gen_sub2_insn (rtx, rtx); extern rtx gen_sub3_insn (rtx, rtx, rtx); extern rtx gen_move_insn (rtx, rtx); extern int have_add2_insn (rtx, rtx); extern int have_sub2_insn (rtx, rtx); extern void emit_cmp_and_jump_insns (rtx, rtx, enum rtx_code, rtx, enum machine_mode, int, rtx); extern void emit_indirect_jump (rtx); rtx emit_conditional_move (rtx, enum rtx_code, rtx, rtx, enum machine_mode, rtx, rtx, enum machine_mode, int); int can_conditionally_move_p (enum machine_mode mode); # 316 "../../gcc/expr.h" extern rtx negate_rtx (enum machine_mode, rtx); extern rtx expand_and (enum machine_mode, rtx, rtx, rtx); extern rtx emit_store_flag (rtx, enum rtx_code, rtx, rtx, enum machine_mode, int, int); extern rtx emit_store_flag_force (rtx, enum rtx_code, rtx, rtx, enum machine_mode, int, int); extern rtx canonicalize_condition (rtx, rtx, int, rtx *, rtx); extern rtx get_condition (rtx, rtx *); extern rtx gen_cond_trap (enum rtx_code, rtx, rtx, rtx); extern rtx expand_builtin (tree, rtx, rtx, enum machine_mode, int); extern void std_expand_builtin_va_start (int, tree, rtx); extern rtx std_expand_builtin_va_arg (tree, tree); extern rtx expand_builtin_va_arg (tree, tree); extern void default_init_builtins (void); extern rtx default_expand_builtin (tree, rtx, rtx, enum machine_mode, int); extern void expand_builtin_setjmp_setup (rtx, rtx); extern void expand_builtin_setjmp_receiver (rtx); extern void expand_builtin_longjmp (rtx, rtx); extern rtx expand_builtin_saveregs (void); extern void expand_builtin_trap (void); extern long get_varargs_alias_set (void); extern long get_frame_alias_set (void); extern void record_base_value (unsigned int, rtx, int); extern void record_alias_subset (long, long); extern long new_alias_set (void); extern int can_address_p (tree); extern void init_expr_once (void); extern void init_expr (void); extern void init_stor_layout_once (void); extern void finish_expr_for_function (void); extern rtx protect_from_queue (rtx, int); extern void emit_queue (void); extern int queued_subexp_p (rtx); extern void convert_move (rtx, rtx, int); extern rtx convert_to_mode (enum machine_mode, rtx, int); extern rtx convert_modes (enum machine_mode, enum machine_mode, rtx, int); extern rtx emit_block_move (rtx, rtx, rtx); extern void move_block_to_reg (int, rtx, int, enum machine_mode); extern void move_block_from_reg (int, rtx, int, int); extern void emit_group_load (rtx, rtx, int); extern void emit_group_store (rtx, rtx, int); extern rtx copy_blkmode_from_reg (rtx,rtx,tree); extern void use_reg (rtx *, rtx); extern void use_regs (rtx *, int, int); extern void use_group_regs (rtx *, rtx); extern rtx clear_storage (rtx, rtx); extern int can_store_by_pieces (unsigned long, rtx (*) (void *, long, enum machine_mode), void *, unsigned int); # 452 "../../gcc/expr.h" extern void store_by_pieces (rtx, unsigned long, rtx (*) (void *, long, enum machine_mode), void *, unsigned int); extern rtx emit_move_insn (rtx, rtx); extern rtx emit_move_insn_1 (rtx, rtx); extern rtx push_block (rtx, int, int); extern void emit_push_insn (rtx, enum machine_mode, tree, rtx, unsigned int, int, rtx, int, rtx, rtx, int, rtx); extern rtx expand_assignment (tree, tree, int, int); extern rtx store_expr (tree, rtx, int); extern rtx force_operand (rtx, rtx); # 495 "../../gcc/expr.h" extern tree find_placeholder (tree, tree *); extern rtx expand_expr (tree, rtx, enum machine_mode, enum expand_modifier); extern void init_pending_stack_adjust (void); extern void clear_pending_stack_adjust (void); extern void do_pending_stack_adjust (void); extern tree string_constant (tree, tree *); extern void jumpifnot (tree, rtx); extern void jumpif (tree, rtx); extern void do_jump (tree, rtx, rtx); extern rtx compare_from_rtx (rtx, rtx, enum rtx_code, int, enum machine_mode, rtx); extern void do_compare_rtx_and_jump (rtx, rtx, enum rtx_code, int, enum machine_mode, rtx, rtx, rtx); extern int try_casesi (tree, tree, tree, tree, rtx, rtx); extern int try_tablejump (tree, tree, tree, tree, rtx, rtx); extern unsigned int case_values_threshold (void); extern rtx expr_size (tree); extern rtx lookup_static_chain (tree); extern rtx fix_lexical_addr (rtx, tree); extern rtx trampoline_address (tree); extern rtx hard_function_value (tree, tree, int); extern rtx prepare_call_address (rtx, tree, rtx *, int, int); extern rtx expand_call (tree, rtx, int); extern rtx expand_shift (enum tree_code, enum machine_mode, rtx, tree, rtx, int); extern rtx expand_divmod (int, enum tree_code, enum machine_mode, rtx, rtx, rtx, int); extern void locate_and_pad_parm (enum machine_mode, tree, int, tree, struct args_size *, struct args_size *, struct args_size *, struct args_size *); extern rtx expand_inline_function (tree, tree, rtx, int, tree, rtx); extern rtx label_rtx (tree); extern rtx promoted_input_arg (unsigned int, enum machine_mode *, int *); extern rtx eliminate_constant_term (rtx, rtx *); extern rtx memory_address (enum machine_mode, rtx); extern rtx memory_address_noforce (enum machine_mode, rtx); extern void set_mem_alias_set (rtx, long); extern void set_mem_align (rtx, unsigned int); extern void set_mem_expr (rtx, tree); extern void set_mem_offset (rtx, rtx); extern rtx change_address (rtx, enum machine_mode, rtx); # 636 "../../gcc/expr.h" extern rtx adjust_address_1 (rtx, enum machine_mode, long, int, int); extern rtx adjust_automodify_address_1 (rtx, enum machine_mode, rtx, long, int); extern rtx offset_address (rtx, rtx, long); extern rtx replace_equiv_address (rtx, rtx); extern rtx replace_equiv_address_nv (rtx, rtx); extern rtx widen_memory_access (rtx, enum machine_mode, long); extern rtx validize_mem (rtx); extern void maybe_set_unchanging (rtx, tree); extern void set_mem_attributes (rtx, tree, int); extern rtx assemble_trampoline_template (void); extern rtx stabilize (rtx); extern rtx copy_all_regs (rtx); extern rtx copy_to_reg (rtx); extern rtx copy_addr_to_reg (rtx); extern rtx copy_to_mode_reg (enum machine_mode, rtx); extern rtx copy_to_suggested_reg (rtx, rtx, enum machine_mode); extern rtx force_reg (enum machine_mode, rtx); extern rtx force_not_mem (rtx); extern enum machine_mode promote_mode (tree, enum machine_mode, int *, int); extern void adjust_stack (rtx); extern void anti_adjust_stack (rtx); enum save_level {SAVE_BLOCK, SAVE_FUNCTION, SAVE_NONLOCAL}; extern void emit_stack_save (enum save_level, rtx *, rtx); extern void emit_stack_restore (enum save_level, rtx, rtx); extern rtx allocate_dynamic_stack_space (rtx, rtx, int); extern void probe_stack_range (long, rtx); extern rtx hard_libcall_value (enum machine_mode); extern rtx round_push (rtx); enum extraction_pattern { EP_insv, EP_extv, EP_extzv }; extern enum machine_mode mode_for_extraction (enum extraction_pattern, int); extern rtx store_bit_field (rtx, unsigned long, unsigned long, enum machine_mode, rtx, long); extern rtx extract_bit_field (rtx, unsigned long, unsigned long, int, rtx, enum machine_mode, enum machine_mode, long); extern rtx expand_mult (enum machine_mode, rtx, rtx, rtx, int); extern rtx expand_mult_add (rtx, rtx, rtx, rtx,enum machine_mode, int); extern rtx expand_mult_highpart_adjust (enum machine_mode, rtx, rtx, rtx, rtx, int); extern rtx assemble_static_space (int); extern rtx (*lang_expand_expr) (union tree_node *, rtx, enum machine_mode, enum expand_modifier modifier); extern int safe_from_p (rtx, tree, int); extern void init_optabs (void); extern void init_all_optabs (void); extern rtx init_one_libfunc (const char *); extern void do_jump_by_parts_equality_rtx (rtx, rtx, rtx); extern void do_jump_by_parts_greater_rtx (enum machine_mode, int, rtx, rtx, rtx, rtx); extern void mark_seen_cases (tree, unsigned char *, long, int); # 47 "../../gcc/predict.c" 2 # 1 "../../gcc/predict.h" 1 # 23 "../../gcc/predict.h" enum br_predictor { # 1 "../../gcc/predict.def" 1 # 40 "../../gcc/predict.def" PRED_COMBINED, PRED_DS_THEORY, PRED_FIRST_MATCH, PRED_NO_PREDICTION, PRED_UNCONDITIONAL, PRED_LOOP_ITERATIONS, PRED_BUILTIN_EXPECT, PRED_NORETURN, PRED_LOOP_BRANCH, PRED_LOOP_EXIT, PRED_LOOP_CONDITION, PRED_LOOP_PRECONDITIONING, PRED_LOOP_HEADER, PRED_POINTER, PRED_OPCODE_POSITIVE, PRED_OPCODE_NONEQUAL, PRED_FPOPCODE, PRED_CALL, PRED_ERROR_RETURN, # 26 "../../gcc/predict.h" 2 END_PREDICTORS }; enum prediction { NOT_TAKEN, TAKEN }; extern void predict_insn_def (rtx, enum br_predictor, enum prediction); extern void predict_insn (rtx, enum br_predictor, int); extern void predict_edge (edge, enum br_predictor, int); extern void predict_edge_def (edge, enum br_predictor, enum prediction); # 48 "../../gcc/predict.c" 2 # 58 "../../gcc/predict.c" static void combine_predictions_for_insn (rtx, basic_block); static void dump_prediction (enum br_predictor, int, basic_block, int); static void estimate_loops_at_level (struct loop *loop); static void propagate_freq (basic_block); static void estimate_bb_frequencies (struct loops *); static void counts_to_freqs (void); struct predictor_info { const char *const name; const int hitrate; const int flags; }; # 86 "../../gcc/predict.c" static const struct predictor_info predictor_info[]= { # 1 "../../gcc/predict.def" 1 # 40 "../../gcc/predict.def" {"combined", (10000), 0}, {"DS theory", (10000), 0}, {"first match", (10000), 0}, {"no prediction", (10000), 0}, {"unconditional jump", (10000), 1}, {"loop iterations", (10000), 1}, {"__builtin_expect", (10000 - (10000 / 10 - 1)), 1}, {"noreturn call", ((int) ((99) * 10000 + 50) / 100), 1}, {"loop branch", ((int) ((89) * 10000 + 50) / 100), 1}, {"loop exit", ((int) ((90) * 10000 + 50) / 100), 1}, {"loop condition", (10000 - (10000 / 10 - 1)), 0}, {"loop preconditioning", (10000 - (10000 / 10 - 1)), 0}, {"loop header", ((int) ((64) * 10000 + 50) / 100), 0}, {"pointer", ((int) ((81) * 10000 + 50) / 100), 0}, {"opcode values positive", ((int) ((79) * 10000 + 50) / 100), 0}, {"opcode values nonequal", ((int) ((71) * 10000 + 50) / 100), 0}, {"fp_opcode", ((int) ((90) * 10000 + 50) / 100), 0}, {"call", ((int) ((70) * 10000 + 50) / 100), 0}, {"error return", ((int) ((52) * 10000 + 50) / 100), 0}, # 88 "../../gcc/predict.c" 2 {((void *)0), 0, 0} }; void predict_insn (insn, predictor, probability) rtx insn; int probability; enum br_predictor predictor; { if (!any_condjump_p (insn)) fancy_abort ("../../gcc/predict.c", 101, __FUNCTION__); (((insn)->fld[6]).rtx) = gen_rtx_fmt_ee (EXPR_LIST, (REG_BR_PRED), (gen_rtx_fmt_ee (CONCAT, (VOIDmode), (gen_rtx_CONST_INT (VOIDmode, (long) ((int) predictor))), (gen_rtx_CONST_INT (VOIDmode, (long) ((int) probability))))), ((((insn)->fld[6]).rtx))); } void predict_insn_def (insn, predictor, taken) rtx insn; enum br_predictor predictor; enum prediction taken; { int probability = predictor_info[(int) predictor].hitrate; if (taken != TAKEN) probability = 10000 - probability; predict_insn (insn, predictor, probability); } void predict_edge (e, predictor, probability) edge e; int probability; enum br_predictor predictor; { rtx last_insn; last_insn = e->src->end; if (!any_condjump_p (last_insn)) return; if (e->flags & 1) probability = 10000 - probability; predict_insn (last_insn, predictor, probability); } void predict_edge_def (e, predictor, taken) edge e; enum br_predictor predictor; enum prediction taken; { int probability = predictor_info[(int) predictor].hitrate; if (taken != TAKEN) probability = 10000 - probability; predict_edge (e, predictor, probability); } void invert_br_probabilities (insn) rtx insn; { rtx note; for (note = (((insn)->fld[6]).rtx); note; note = (((note)->fld[1]).rtx)) if (((enum reg_note) ((enum machine_mode) (note)->mode)) == REG_BR_PROB) (((note)->fld[0]).rtx) = gen_rtx_CONST_INT (VOIDmode, (long) (10000 - ((((((note)->fld[0]).rtx))->fld[0]).rtwint))); else if (((enum reg_note) ((enum machine_mode) (note)->mode)) == REG_BR_PRED) ((((((note)->fld[0]).rtx))->fld[1]).rtx) = gen_rtx_CONST_INT (VOIDmode, (long) (10000 - (((((((((note)->fld[0]).rtx))->fld[1]).rtx))->fld[0]).rtwint))); } static void dump_prediction (predictor, probability, bb, used) enum br_predictor predictor; int probability; basic_block bb; int used; { edge e = bb->succ; if (!rtl_dump_file) return; while (e->flags & 1) e = e->succ_next; fprintf (rtl_dump_file, " %s heuristics%s: %.1f%%", predictor_info[predictor].name, used ? "" : " (ignored)", probability * 100.0 / 10000); if (bb->count) { fprintf (rtl_dump_file, " exec "); fprintf (rtl_dump_file, "%ld", bb->count); fprintf (rtl_dump_file, " hit "); fprintf (rtl_dump_file, "%ld", e->count); fprintf (rtl_dump_file, " (%.1f%%)", e->count * 100.0 / bb->count); } fprintf (rtl_dump_file, "\n"); } static void combine_predictions_for_insn (insn, bb) rtx insn; basic_block bb; { rtx prob_note = find_reg_note (insn, REG_BR_PROB, 0); rtx *pnote = &(((insn)->fld[6]).rtx); rtx note; int best_probability = (10000 / 2); int best_predictor = END_PREDICTORS; int combined_probability = 10000 / 2; int d; _Bool first_match = 0; _Bool found = 0; if (rtl_dump_file) fprintf (rtl_dump_file, "Predictions for insn %i bb %i\n", (((insn)->fld[0]).rtint), bb->index); for (note = (((insn)->fld[6]).rtx); note; note = (((note)->fld[1]).rtx)) if (((enum reg_note) ((enum machine_mode) (note)->mode)) == REG_BR_PRED) { int predictor = (((((((((note)->fld[0]).rtx))->fld[0]).rtx))->fld[0]).rtwint); int probability = (((((((((note)->fld[0]).rtx))->fld[1]).rtx))->fld[0]).rtwint); found = 1; if (best_predictor > predictor) best_probability = probability, best_predictor = predictor; d = (combined_probability * probability + (10000 - combined_probability) * (10000 - probability)); if (d == 0) combined_probability = 10000 / 2; else combined_probability = (((double) combined_probability) * probability * 10000 / d + 0.5); } if (predictor_info [best_predictor].flags & 1) first_match = 1; if (!found) dump_prediction (PRED_NO_PREDICTION, combined_probability, bb, 1); else { dump_prediction (PRED_DS_THEORY, combined_probability, bb, !first_match); dump_prediction (PRED_FIRST_MATCH, best_probability, bb, first_match); } if (first_match) combined_probability = best_probability; dump_prediction (PRED_COMBINED, combined_probability, bb, 1); while (*pnote) { if (((enum reg_note) ((enum machine_mode) (*pnote)->mode)) == REG_BR_PRED) { int predictor = (((((((((*pnote)->fld[0]).rtx))->fld[0]).rtx))->fld[0]).rtwint); int probability = (((((((((*pnote)->fld[0]).rtx))->fld[1]).rtx))->fld[0]).rtwint); dump_prediction (predictor, probability, bb, !first_match || best_predictor == predictor); *pnote = (((*pnote)->fld[1]).rtx); } else pnote = &(((*pnote)->fld[1]).rtx); } if (!prob_note) { (((insn)->fld[6]).rtx) = gen_rtx_fmt_ee (EXPR_LIST, (REG_BR_PROB), (gen_rtx_CONST_INT (VOIDmode, (long) (combined_probability))), ((((insn)->fld[6]).rtx))); if (bb->succ->succ_next) { ((bb)->succ->flags & 1 ? (bb)->succ->succ_next : (bb)->succ)->probability = combined_probability; ((bb)->succ->flags & 1 ? (bb)->succ : (bb)->succ->succ_next)->probability = 10000 - combined_probability; } } } void estimate_probability (loops_info) struct loops *loops_info; { sbitmap *dominators, *post_dominators; int i; int found_noreturn = 0; dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks); post_dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks); calculate_dominance_info (((void *)0), dominators, CDI_DOMINATORS); calculate_dominance_info (((void *)0), post_dominators, CDI_POST_DOMINATORS); for (i = 0; i < loops_info->num; i++) { int j; int exits; struct loop *loop = &loops_info->array[i]; flow_loop_scan (loops_info, loop, 8); exits = loop->num_exits; for (j = loop->first->index; j <= loop->last->index; ++j) if (((loop->nodes)->elms [(j) / ((unsigned) (8 * 8))] >> (j) % ((unsigned) (8 * 8)) & 1)) { int header_found = 0; edge e; for (e = (((basic_block_info)->data.bb[(j)]))->succ; e; e = e->succ_next) if (e->dest == loop->header && e->src == loop->latch) { header_found = 1; predict_edge_def (e, PRED_LOOP_BRANCH, TAKEN); } if (!header_found) for (e = (((basic_block_info)->data.bb[(j)]))->succ; e; e = e->succ_next) if (e->dest->index < 0 || !((loop->nodes)->elms [(e->dest->index) / ((unsigned) (8 * 8))] >> (e->dest->index) % ((unsigned) (8 * 8)) & 1)) predict_edge (e, PRED_LOOP_EXIT, (10000 - predictor_info [(int) PRED_LOOP_EXIT].hitrate) / exits); } } for (i = 0; i < n_basic_blocks; i++) { basic_block bb = (((basic_block_info)->data.bb[(i)])); rtx last_insn = bb->end; rtx cond, earliest; edge e; if (bb->succ == ((void *)0) && !found_noreturn) { int y; found_noreturn = 1; for (y = 0; y < n_basic_blocks; y++) if (!((post_dominators[y])->elms [(i) / ((unsigned) (8 * 8))] >> (i) % ((unsigned) (8 * 8)) & 1)) for (e = (((basic_block_info)->data.bb[(y)]))->succ; e; e = e->succ_next) if (e->dest->index >= 0 && ((post_dominators[e->dest->index])->elms [(i) / ((unsigned) (8 * 8))] >> (i) % ((unsigned) (8 * 8)) & 1)) predict_edge_def (e, PRED_NORETURN, NOT_TAKEN); } if (((enum rtx_code) (last_insn)->code) != JUMP_INSN || ! any_condjump_p (last_insn)) continue; for (e = bb->succ; e; e = e->succ_next) { if (e->dest == (&entry_exit_blocks[1]) || (e->dest->succ && !e->dest->succ->succ_next && e->dest->succ->dest == (&entry_exit_blocks[1]))) predict_edge_def (e, PRED_ERROR_RETURN, NOT_TAKEN); if (e->dest != (&entry_exit_blocks[1]) && e->dest != bb && ((dominators[e->dest->index])->elms [(e->src->index) / ((unsigned) (8 * 8))] >> (e->src->index) % ((unsigned) (8 * 8)) & 1) && !((post_dominators[e->src->index])->elms [(e->dest->index) / ((unsigned) (8 * 8))] >> (e->dest->index) % ((unsigned) (8 * 8)) & 1)) { rtx insn; for (insn = e->dest->head; insn != (((e->dest->end)->fld[2]).rtx); insn = (((insn)->fld[2]).rtx)) if (((enum rtx_code) (insn)->code) == CALL_INSN && ! ((insn)->unchanging)) { predict_edge_def (e, PRED_CALL, NOT_TAKEN); break; } } } cond = get_condition (last_insn, &earliest); if (! cond) continue; if ((rtx_class[(int) (((enum rtx_code) (cond)->code))]) == '<' && (((((enum rtx_code) ((((cond)->fld[0]).rtx))->code) == REG) && (((((cond)->fld[0]).rtx))->frame_related)) || ((((enum rtx_code) ((((cond)->fld[1]).rtx))->code) == REG) && (((((cond)->fld[1]).rtx))->frame_related)))) { if (((enum rtx_code) (cond)->code) == EQ) predict_insn_def (last_insn, PRED_POINTER, NOT_TAKEN); else if (((enum rtx_code) (cond)->code) == NE) predict_insn_def (last_insn, PRED_POINTER, TAKEN); } else switch (((enum rtx_code) (cond)->code)) { case CONST_INT: predict_insn_def (last_insn, PRED_UNCONDITIONAL, cond == (const_int_rtx[64]) ? NOT_TAKEN : TAKEN); break; case EQ: case UNEQ: if (((mode_class[(int) (((enum machine_mode) ((((cond)->fld[0]).rtx))->mode))]) == MODE_FLOAT || (mode_class[(int) (((enum machine_mode) ((((cond)->fld[0]).rtx))->mode))]) == MODE_COMPLEX_FLOAT || (mode_class[(int) (((enum machine_mode) ((((cond)->fld[0]).rtx))->mode))]) == MODE_VECTOR_FLOAT)) ; else if ((((cond)->fld[1]).rtx) == (const_int_rtx[64]) || (((cond)->fld[0]).rtx) == (const_int_rtx[64])) ; else predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, NOT_TAKEN); break; case NE: case LTGT: if (((mode_class[(int) (((enum machine_mode) ((((cond)->fld[0]).rtx))->mode))]) == MODE_FLOAT || (mode_class[(int) (((enum machine_mode) ((((cond)->fld[0]).rtx))->mode))]) == MODE_COMPLEX_FLOAT || (mode_class[(int) (((enum machine_mode) ((((cond)->fld[0]).rtx))->mode))]) == MODE_VECTOR_FLOAT)) ; else if ((((cond)->fld[1]).rtx) == (const_int_rtx[64]) || (((cond)->fld[0]).rtx) == (const_int_rtx[64])) ; else predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, TAKEN); break; case ORDERED: predict_insn_def (last_insn, PRED_FPOPCODE, TAKEN); break; case UNORDERED: predict_insn_def (last_insn, PRED_FPOPCODE, NOT_TAKEN); break; case LE: case LT: if ((((cond)->fld[1]).rtx) == (const_int_rtx[64]) || (((cond)->fld[1]).rtx) == (const_int_rtx[64 +1]) || (((cond)->fld[1]).rtx) == (const_int_rtx[64 -1])) predict_insn_def (last_insn, PRED_OPCODE_POSITIVE, NOT_TAKEN); break; case GE: case GT: if ((((cond)->fld[1]).rtx) == (const_int_rtx[64]) || (((cond)->fld[1]).rtx) == (const_int_rtx[64 +1]) || (((cond)->fld[1]).rtx) == (const_int_rtx[64 -1])) predict_insn_def (last_insn, PRED_OPCODE_POSITIVE, TAKEN); break; default: break; } } for (i = 0; i < n_basic_blocks; i++) if (((enum rtx_code) (((((basic_block_info)->data.bb[(i)]))->end))->code) == JUMP_INSN && any_condjump_p (((((basic_block_info)->data.bb[(i)]))->end))) combine_predictions_for_insn (((((basic_block_info)->data.bb[(i)]))->end), (((basic_block_info)->data.bb[(i)]))); free(post_dominators); free(dominators); estimate_bb_frequencies (loops_info); } void expected_value_to_br_prob () { rtx insn, cond, ev = (rtx) 0, ev_reg = (rtx) 0; for (insn = get_insns (); insn ; insn = (((insn)->fld[2]).rtx)) { switch (((enum rtx_code) (insn)->code)) { case NOTE: if ((((insn)->fld[4]).rtint) == NOTE_INSN_EXPECTED_VALUE) { ev = (((insn)->fld[3]).rtx); ev_reg = (((ev)->fld[0]).rtx); delete_insn (insn); } continue; case CODE_LABEL: ev = (rtx) 0; continue; case JUMP_INSN: if (((enum rtx_code) (insn)->code) != JUMP_INSN || ev == (rtx) 0 || ! any_condjump_p (insn)) continue; break; default: if (ev && reg_set_p (ev_reg, insn)) ev = (rtx) 0; continue; } # 593 "../../gcc/predict.c" cond = ((((((pc_set (insn))->fld[1]).rtx))->fld[0]).rtx); cond = canonicalize_condition (insn, cond, 0, ((void *)0), ev_reg); if (! cond || (((cond)->fld[0]).rtx) != ev_reg || ((enum rtx_code) ((((cond)->fld[1]).rtx))->code) != CONST_INT) continue; cond = gen_rtx_fmt_ee (((enum rtx_code) (cond)->code), VOIDmode, (((ev)->fld[1]).rtx), (((cond)->fld[1]).rtx)); cond = simplify_rtx (cond); if (cond != const_true_rtx && cond != (const_int_rtx[64])) fancy_abort ("../../gcc/predict.c", 608, __FUNCTION__); predict_insn_def (insn, PRED_BUILTIN_EXPECT, cond == const_true_rtx ? TAKEN : NOT_TAKEN); } } typedef struct block_info_def { volatile double frequency; basic_block next; int tovisit:1; int npredecessors; } *block_info; typedef struct edge_info_def { volatile double back_edge_prob; int back_edge:1; } *edge_info; static void propagate_freq (head) basic_block head; { basic_block bb = head; basic_block last = bb; edge e; basic_block nextbb; int n; for (n = 0; n < n_basic_blocks; n++) { basic_block bb = (((basic_block_info)->data.bb[(n)])); if (((block_info) (bb)->aux)->tovisit) { int count = 0; for (e = bb->pred; e; e = e->pred_next) if (((block_info) (e->src)->aux)->tovisit && !(e->flags & 32)) count++; else if (((block_info) (e->src)->aux)->tovisit && rtl_dump_file && !((edge_info) (e)->aux)->back_edge) fprintf (rtl_dump_file, "Irreducible region hit, ignoring edge to %i->%i\n", e->src->index, bb->index); ((block_info) (bb)->aux)->npredecessors = count; } } ((block_info) (head)->aux)->frequency = 1; for (; bb; bb = nextbb) { double cyclic_probability = 0, frequency = 0; nextbb = ((block_info) (bb)->aux)->next; ((block_info) (bb)->aux)->next = ((void *)0); if (bb != head) { for (e = bb->pred; e; e = e->pred_next) if (((edge_info) (e)->aux)->back_edge) cyclic_probability += ((edge_info) (e)->aux)->back_edge_prob; else if (!(e->flags & 32)) frequency += (e->probability * ((block_info) (e->src)->aux)->frequency / 10000); if (cyclic_probability > 1.0 - 1.0 / 10000) cyclic_probability = 1.0 - 1.0 / 10000; ((block_info) (bb)->aux)->frequency = frequency / (1 - cyclic_probability); } ((block_info) (bb)->aux)->tovisit = 0; for (e = bb->succ; e; e = e->succ_next) if (e->dest == head) ((edge_info) (e)->aux)->back_edge_prob = ((e->probability * ((block_info) (bb)->aux)->frequency) / 10000); for (e = bb->succ; e; e = e->succ_next) if (!(e->flags & 32) && ((block_info) (e->dest)->aux)->npredecessors) { ((block_info) (e->dest)->aux)->npredecessors--; if (!((block_info) (e->dest)->aux)->npredecessors) { if (!nextbb) nextbb = e->dest; else ((block_info) (last)->aux)->next = e->dest; last = e->dest; } } } } static void estimate_loops_at_level (first_loop) struct loop *first_loop; { struct loop *l, *loop = first_loop; for (loop = first_loop; loop; loop = loop->next) { int n; edge e; estimate_loops_at_level (loop->inner); for (e = loop->latch->succ; e->dest != loop->header; e = e->succ_next) ; ((edge_info) (e)->aux)->back_edge = 1; if (loop->shared) { for (l = loop->next; l; l = l->next) if (l->header == loop->header) break; if (l) continue; } for (l = loop->shared ? first_loop : loop; l != loop->next; l = l->next) if (loop->header == l->header) do { unsigned int word_num_; unsigned int bit_num_ = (0) % (unsigned int) ((unsigned) (8 * 8)); unsigned int size_ = (l->nodes)->size; unsigned long *ptr_ = (l->nodes)->elms; for (word_num_ = (0) / (unsigned int) ((unsigned) (8 * 8)); word_num_ < size_; word_num_++, bit_num_ = 0) { unsigned long word_ = ptr_[word_num_]; if (word_ != 0) for (; bit_num_ < ((unsigned) (8 * 8)); bit_num_++) { unsigned long _mask = (unsigned long) 1 << bit_num_; if ((word_ & _mask) != 0) { word_ &= ~ _mask; (n) = word_num_ * ((unsigned) (8 * 8)) + bit_num_; ((block_info) ((((basic_block_info)->data.bb[(n)])))->aux)->tovisit = 1; if (word_ == 0) break; } } } } while (0); propagate_freq (loop->header); } } static void counts_to_freqs () { long count_max = 1; int i; for (i = 0; i < n_basic_blocks; i++) count_max = (((((basic_block_info)->data.bb[(i)]))->count) > (count_max) ? ((((basic_block_info)->data.bb[(i)]))->count) : (count_max)); for (i = -2; i < n_basic_blocks; i++) { basic_block bb; if (i == -2) bb = (&entry_exit_blocks[0]); else if (i == -1) bb = (&entry_exit_blocks[1]); else bb = (((basic_block_info)->data.bb[(i)])); bb->frequency = (bb->count * 10000 + count_max / 2) / count_max; } } _Bool expensive_function_p (threshold) int threshold; { unsigned int sum = 0; int i; unsigned int limit; if (threshold > 10000) fancy_abort ("../../gcc/predict.c", 828, __FUNCTION__); if ((&entry_exit_blocks[0])->frequency == 0) return 1; limit = (&entry_exit_blocks[0])->frequency * threshold; for (i = 0; i < n_basic_blocks; i++) { basic_block bb = (((basic_block_info)->data.bb[(i)])); rtx insn; for (insn = bb->head; insn != (((bb->end)->fld[2]).rtx); insn = (((insn)->fld[2]).rtx)) if (active_insn_p (insn)) { sum += bb->frequency; if (sum > limit) return 1; } } return 0; } static void estimate_bb_frequencies (loops) struct loops *loops; { int i; double freq_max = 0; mark_dfs_back_edges (); if (flag_branch_probabilities) { counts_to_freqs (); return; } for (i = 0; i < n_basic_blocks; i++) { rtx last_insn = ((((basic_block_info)->data.bb[(i)]))->end); int probability; edge fallthru, branch; if (((enum rtx_code) (last_insn)->code) != JUMP_INSN || !any_condjump_p (last_insn) || (((basic_block_info)->data.bb[(i)]))->succ->succ_next == ((void *)0)) { int nedges = 0; edge e; for (e = (((basic_block_info)->data.bb[(i)]))->succ; e; e = e->succ_next) { nedges++; if (e->probability != 0) break; } if (!e) for (e = (((basic_block_info)->data.bb[(i)]))->succ; e; e = e->succ_next) e->probability = (10000 + nedges / 2) / nedges; } else { probability = ((((((find_reg_note (last_insn, REG_BR_PROB, 0))->fld[0]).rtx))->fld[0]).rtwint); fallthru = (((basic_block_info)->data.bb[(i)]))->succ; if (!fallthru->flags & 1) fallthru = fallthru->succ_next; branch = (((basic_block_info)->data.bb[(i)]))->succ; if (branch->flags & 1) branch = branch->succ_next; branch->probability = probability; fallthru->probability = 10000 - probability; } } (&entry_exit_blocks[0])->succ->probability = 10000; alloc_aux_for_blocks (sizeof (struct block_info_def)); alloc_aux_for_edges (sizeof (struct edge_info_def)); for (i = -2; i < n_basic_blocks; i++) { edge e; basic_block bb; if (i == -2) bb = (&entry_exit_blocks[0]); else if (i == -1) bb = (&entry_exit_blocks[1]); else bb = (((basic_block_info)->data.bb[(i)])); ((block_info) (bb)->aux)->tovisit = 0; for (e = bb->succ; e; e = e->succ_next) ((edge_info) (e)->aux)->back_edge_prob = ((double) e->probability / 10000); } estimate_loops_at_level (loops->tree_root); for (i = 0; i < n_basic_blocks; i++) ((block_info) ((((basic_block_info)->data.bb[(i)])))->aux)->tovisit = 1; ((block_info) ((&entry_exit_blocks[0]))->aux)->tovisit = 1; ((block_info) ((&entry_exit_blocks[1]))->aux)->tovisit = 1; propagate_freq ((&entry_exit_blocks[0])); for (i = 0; i < n_basic_blocks; i++) if (((block_info) ((((basic_block_info)->data.bb[(i)])))->aux)->frequency > freq_max) freq_max = ((block_info) ((((basic_block_info)->data.bb[(i)])))->aux)->frequency; for (i = -2; i < n_basic_blocks; i++) { basic_block bb; volatile double tmp; if (i == -2) bb = (&entry_exit_blocks[0]); else if (i == -1) bb = (&entry_exit_blocks[1]); else bb = (((basic_block_info)->data.bb[(i)])); tmp = ((block_info) (bb)->aux)->frequency * 10000; tmp /= freq_max; tmp += 0.5; bb->frequency = tmp; } free_aux_for_blocks (); free_aux_for_edges (); } From gcc-prs-return-23966-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 22:32:25 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 12896 invoked by alias); 4 Nov 2002 22:32:22 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 12854 invoked by uid 61); 4 Nov 2002 22:32:22 -0000 Date: 4 Nov 2002 22:32:22 -0000 Message-ID: <20021104223222.12851.qmail@sources.redhat.com> To: brister@pobox.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, ljrittle@gcc.gnu.org From: ljrittle@gcc.gnu.org Reply-To: ljrittle@gcc.gnu.org, brister@pobox.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, ljrittle@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: libstdc++/8231: iostream header position causes bad code generation Synopsis: iostream header position causes bad code generation State-Changed-From-To: analyzed->closed State-Changed-By: ljrittle State-Changed-When: Mon Nov 4 14:32:21 2002 State-Changed-Why: Paolo, if the include of is not in position #1, then #include must appear there, no? It is not legal to move the include of out of position #1 in any other case. In any event, with your example, it is not OK to move the include of past position #3. Doing so is lying to the compiler. As TC++PL-SE says it, is sufficient to refer to all things declared in but not to apply operations to them. Not a regression but rather a more agressive use of the properties of the standard (in case this worked with libstdc++-v2). http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8231 From gcc-prs-return-23967-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 22:39:39 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 16849 invoked by alias); 4 Nov 2002 22:39:38 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 16830 invoked by uid 61); 4 Nov 2002 22:39:38 -0000 Date: 4 Nov 2002 22:39:38 -0000 Message-ID: <20021104223938.16829.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rmincold@dreamscape.com From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, rmincold@dreamscape.com, gcc-gnats@gcc.gnu.org Subject: Re: c++/8129: Compiler seems unable to process function pointers to member functions. Synopsis: Compiler seems unable to process function pointers to member functions. State-Changed-From-To: open->closed State-Changed-By: bangerth State-Changed-When: Mon Nov 4 14:39:37 2002 State-Changed-Why: You don't say what version of the compiler you use, but since you don't qualify std:: names, I guess it is probably 2.95. In any case, I can reproduce the problem with 2.95, but 3.2.1 and 3.3 compile it without problems. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8129 From gcc-prs-return-23968-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 22:46:04 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 20414 invoked by alias); 4 Nov 2002 22:46:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 20358 invoked by uid 71); 4 Nov 2002 22:46:02 -0000 Resent-Date: 4 Nov 2002 22:46:02 -0000 Resent-Message-ID: <20021104224602.20357.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, sunil.k.davasam@intel.com; Resent-Reply-To: gcc-gnats@gcc.gnu.org, sunil.k.davasam@intel.com Received: (qmail 16230 invoked by uid 61); 4 Nov 2002 22:37:39 -0000 Message-Id: <20021104223739.16229.qmail@sources.redhat.com> Date: 4 Nov 2002 22:37:39 -0000 From: sunil.k.davasam@intel.com Reply-To: sunil.k.davasam@intel.com To: gcc-gnats@gcc.gnu.org Cc: sunil.k.davasam@intel.com; X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) X-GNATS-Notify: sunil.k.davasam@intel.com; Subject: c++/8453: ABI Issue: Destructors for already constructed objects not called when the exception is thrown inside constructor. >Number: 8453 >Category: c++ >Synopsis: ABI Issue: Destructors for already constructed objects not called when the exception is thrown inside constructor. >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Mon Nov 04 14:46:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: sunil.k.davasam@intel.com >Release: gcc - 3.2 >Organization: >Environment: Redhat 8.0 product ( ia32 ), United Linux 1.0 ( ia64 ) >Description: Based on C++ ABI, ( Section 3.3.3: Array Construction and Destruction API ) While creating an array of objects, If the constructor throws an exception, call the destructor for any already-constructed elements, and rethrow the exception. In the following example, The testcase wants to create an array of 4 objects. While creating 3rd object, it throws an exception. So, based on C++ ABI, destructors should be called for already constructed first 2 elements. When I compiled the testcase with gcc 3.2 compiler, I am getting different output. Contents of file : tt.cpp ------------------------- #include static int i = 0; struct C3 { C3() { if ( i == 2 ) throw 1; else i++; printf("%sC%d()\n", "", 3); } ~C3() { printf("%sC%d()\n", "~", 3); } }; C3 o3[4]; int main() { return 0; } [cmd_prompt]$ g++ tt.cpp [cmd_prompt]$ a.out C3() C3() Abort (core dumped) ----------- Expected output: C3() C3() ~C3() ~C3() Abort (core dumped) ----------- gcc compiler version: [cmd]$ g++ -v Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2/specs Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --host=i 386-redhat-linux --with-system-zlib --enable-__cxa_atexit Thread model: posix gcc version 3.2 (Red Hat Linux Rawhide 3.2-1) Actually I tried on both IA32 and IA64 platforms. IA32 - Redhat Linux 8.0 product IA64 - United Linux 1.0 -------- >How-To-Repeat: [cmd_prompt]$ g++ tt.cpp [cmd_prompt]$ a.out C3() C3() Abort (core dumped) >Fix: >Release-Note: >Audit-Trail: >Unformatted: From gcc-prs-return-23969-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 22:46:16 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 21101 invoked by alias); 4 Nov 2002 22:46:16 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 21081 invoked by uid 61); 4 Nov 2002 22:46:16 -0000 Date: 4 Nov 2002 22:46:16 -0000 Message-ID: <20021104224616.21080.qmail@sources.redhat.com> To: chicares@mindspring.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, hou_zhenyu@hotmail.com, nobody@gcc.gnu.org From: bangerth@dealii.org Reply-To: bangerth@dealii.org, chicares@mindspring.com, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, hou_zhenyu@hotmail.com, nobody@gcc.gnu.org, gcc-gnats@gcc.gnu.org Subject: Re: c++/8205: using declaration & mulitiple inheritance Old Synopsis: using declaration doesn't work while mulitiple inheritance was used. New Synopsis: using declaration & mulitiple inheritance State-Changed-From-To: open->analyzed State-Changed-By: bangerth State-Changed-When: Mon Nov 4 14:46:16 2002 State-Changed-Why: Right, this is a regression in 3.2, as it compiled cleanly in 2.95.I thus set the priority to "high" and let others decide what to do with it. However, it turns out that this is fixed on the mainline again (or the problem was never introduced there). For reference, I append the code in question below. Regards Wolfgang ------------------------- class A { public: int i; }; class B {}; class E : A, B { public: using A::i; }; int main() { E e; e.i; // "`A' is an inaccessible base of `E'" } ---------------------------------- tmp/g> /home/bangerth/bin/gcc-3.2.1-pre/bin/c++ -c x.cc x.cc: In function `int main()': x.cc:7: `A' is an inaccessible base of `E' tmp/g> /home/bangerth/bin/gcc-3.3x-pre/bin/c++ -c x.cc http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8205 From gcc-prs-return-23970-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 22:49:41 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 24227 invoked by alias); 4 Nov 2002 22:49:41 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 24208 invoked by uid 61); 4 Nov 2002 22:49:41 -0000 Date: 4 Nov 2002 22:49:41 -0000 Message-ID: <20021104224941.24207.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, olly@survex.com From: bangerth@dealii.org Reply-To: bangerth@dealii.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, olly@survex.com, gcc-gnats@gcc.gnu.org Subject: Re: c++/8211: -Weffc++ warns about copyable classes with func ptr members Synopsis: -Weffc++ warns about copyable classes with func ptr members State-Changed-From-To: open->analyzed State-Changed-By: bangerth State-Changed-When: Mon Nov 4 14:49:39 2002 State-Changed-Why: Yeah, I think the analysis has a valid point. Whether -Weffc++ was a good idea from the beginning might be arguable, but if it is there, it should not warn in cases there is nothing to complain about. W. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8211 From gcc-prs-return-23971-listarch-gcc-prs=gcc.gnu.org@gcc.gnu.org Mon Nov 04 22:56:02 2002 Return-Path: Delivered-To: listarch-gcc-prs@gcc.gnu.org Received: (qmail 31524 invoked by alias); 4 Nov 2002 22:56:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Delivered-To: mailing list gcc-prs@gcc.gnu.org Received: (qmail 31489 invoked by uid 71); 4 Nov 2002 22:56:00 -0000 Resent-Date: 4 Nov 2002 22:56:00 -0000 Resent-Message-ID: <20021104225600.31488.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, jesteves@criticalsoftware.com Received: (qmail 26560 invoked by uid 61); 4 Nov 2002 22:53:20 -0000 Message-Id: <20021104225320.26559.qmail@sources.redhat.com> Date: 4 Nov 2002 22:53:20 -0000 From: jesteves@criticalsoftware.com Reply-To: jesteves@criticalsoftware.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8454: G++ 2.95 gives an ICE while compiling the copy constructor of template class CTTT(see attach) >Number: 8454 >Category: c++ >Synopsis: G++ 2.95 gives an ICE while compiling the copy constructor of template class CTTT(see attach) >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Mon Nov 04 14:56:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: João Esteves >Release: gcc version 2.95.2 19991024 (release) >Organization: >Environment: FreeBSD 4.1-RELEASE on i386 >Description: bash-2.04$ g++ -o t template.cpp template.cpp: In method `CTTT::CTTT(const CTTT &)': template.cpp:31: Internal compiler error. template.cpp:31: Please submit a full bug report. template.cpp:31: See for instructions. >How-To-Repeat: // // A template class with a single template parameter // template class CT { public: CT(void) {} CT(const CT& rc_other) {} virtual ~CT(void) {} }; // // A template class with two template parameters. // The first template parameter is a template class itself with one // template parameter. // template