]> granicus.if.org Git - sudo/commitdiff
Implement #includedir directive. Files in an includedir are not edited
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 18 Apr 2009 23:25:08 +0000 (23:25 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 18 Apr 2009 23:25:08 +0000 (23:25 +0000)
by visudo unless they contain a syntax error.

13 files changed:
gram.c
gram.y
parse.c
parse.h
sudo.c
sudo.h
sudoers.cat
sudoers.man.in
sudoers.pod
testsudoers.c
toke.c
toke.l
visudo.c

diff --git a/gram.c b/gram.c
index 5bc13f5b963226b3ee765ee4a0b30654cbe3a0d2..1f0117e2bea94660c0fff339b1f9ef0cc644d7d5 100644 (file)
--- a/gram.c
+++ b/gram.c
@@ -798,15 +798,18 @@ init_parser(path, quiet)
 
     init_aliases();
 
+    init_lexer();
+
     efree(sudoers);
     sudoers = path ? estrdup(path) : NULL;
 
     parse_error = FALSE;
     errorlineno = -1;
+    errorfile = NULL;
     sudolineno = 1;
     verbose = !quiet;
 }
-#line 758 "y.tab.c"
+#line 761 "y.tab.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -1546,7 +1549,7 @@ case 92:
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
-#line 1498 "y.tab.c"
+#line 1501 "y.tab.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
diff --git a/gram.y b/gram.y
index e045707929e2f2405767c8ec09cfa4c44d8967ab..5315d32596e4cc40e09b6c07a7763018903af884 100644 (file)
--- a/gram.y
+++ b/gram.y
@@ -766,11 +766,14 @@ init_parser(path, quiet)
 
     init_aliases();
 
+    init_lexer();
+
     efree(sudoers);
     sudoers = path ? estrdup(path) : NULL;
 
     parse_error = FALSE;
     errorlineno = -1;
+    errorfile = NULL;
     sudolineno = 1;
     verbose = !quiet;
 }
diff --git a/parse.c b/parse.c
index d0b4cf124ffc82865772aa928a93452f32618b6d..a5d289312ed5184a02b8bee22b1c34bd5790b192 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -89,7 +89,7 @@ sudo_file_open(nss)
 {
     if (def_ignore_local_sudoers)
        return(-1);
-    nss->handle = open_sudoers(_PATH_SUDOERS, NULL);
+    nss->handle = open_sudoers(_PATH_SUDOERS, FALSE, NULL);
     return(nss->handle ? 0 : -1);
 }
 
diff --git a/parse.h b/parse.h
index 98ee2bb348cee4b8cb7542c15ad5c94b626fb5b8..d002f142dc1bb7f53e1aff0de91cde57062c0bae 100644 (file)
--- a/parse.h
+++ b/parse.h
@@ -185,6 +185,7 @@ struct alias *alias_remove __P((char *, int));
 void alias_free                __P((void *));
 void alias_apply       __P((int (*)(void *, void *), void *));
 void init_aliases      __P((void));
+void init_lexer                __P((void));
 void init_parser       __P((char *, int));
 int alias_compare      __P((const void *, const void *));
 
diff --git a/sudo.c b/sudo.c
index 66e5417b0e1db3f2dbb48f3910ee43087aad8220..5a79e8b7baee845c4979d8c35aabca6f34442d81 100644 (file)
--- a/sudo.c
+++ b/sudo.c
@@ -1072,8 +1072,9 @@ parse_args(argc, argv)
  * Returns a handle to the sudoers file or NULL on error.
  */
 FILE *
-open_sudoers(sudoers, keepopen)
+open_sudoers(sudoers, doedit, keepopen)
     const char *sudoers;
+    int doedit;
     int *keepopen;
 {
     struct stat statbuf;
diff --git a/sudo.h b/sudo.h
index 4d3f03cb2673ecb9416ef35326e8fe1577e89883..77ed89eef6560dd391034ee1e0fb88168bbc7d5b 100644 (file)
--- a/sudo.h
+++ b/sudo.h
@@ -298,7 +298,7 @@ char *sudo_getepw   __P((const struct passwd *));
 int pam_prep_user      __P((struct passwd *));
 void zero_bytes                __P((volatile void *, size_t));
 int gettime            __P((struct timespec *));
-FILE *open_sudoers     __P((const char *, int *));
+FILE *open_sudoers     __P((const char *, int, int *));
 void display_privs     __P((struct sudo_nss_list *, struct passwd *));
 int display_cmnd       __P((struct sudo_nss_list *, struct passwd *));
 int get_ttycols                __P((void));
index 542ea37b1887bae410850d3f1080a9b8c06f9639..d46e3bdf319745405823b584f975da0ad60c18fd 100644 (file)
@@ -61,7 +61,7 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
 
 
 
-1.7.1                     March 11, 2009                        1
+1.7.1                     April 18, 2009                        1
 
 
 
@@ -127,7 +127,7 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
 
 
-1.7.1                     March 11, 2009                        2
+1.7.1                     April 18, 2009                        2
 
 
 
@@ -193,7 +193,7 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
 
 
-1.7.1                     March 11, 2009                        3
+1.7.1                     April 18, 2009                        3
 
 
 
@@ -259,7 +259,7 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
 
 
-1.7.1                     March 11, 2009                        4
+1.7.1                     April 18, 2009                        4
 
 
 
@@ -325,7 +325,7 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
 
 
-1.7.1                     March 11, 2009                        5
+1.7.1                     April 18, 2009                        5
 
 
 
@@ -391,7 +391,7 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
 
 
-1.7.1                     March 11, 2009                        6
+1.7.1                     April 18, 2009                        6
 
 
 
@@ -453,11 +453,11 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
        I\bIn\bnc\bcl\blu\bud\bdi\bin\bng\bg o\bot\bth\bhe\ber\br f\bfi\bil\ble\bes\bs f\bfr\bro\bom\bm w\bwi\bit\bth\bhi\bin\bn s\bsu\bud\bdo\boe\ber\brs\bs
 
        It is possible to include other _\bs_\bu_\bd_\bo_\be_\br_\bs files from within the _\bs_\bu_\bd_\bo_\be_\br_\bs
-       file currently being parsed using the #include directive, similar to
+       file currently being parsed using the #include and #includedir
 
 
 
-1.7.1                     March 11, 2009                        7
+1.7.1                     April 18, 2009                        7
 
 
 
@@ -466,12 +466,13 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
 
-       the one used by the C preprocessor.  This is useful, for example, for
-       keeping a site-wide _\bs_\bu_\bd_\bo_\be_\br_\bs file in addition to a per-machine local
-       one.  For the sake of this example the site-wide _\bs_\bu_\bd_\bo_\be_\br_\bs will be
-       _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs and the per-machine one will be _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bl_\bo_\bc_\ba_\bl.  To
-       include _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bl_\bo_\bc_\ba_\bl from within _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs we would use the
-       following line in _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs:
+       directives.
+
+       This can be used, for example, to keep a site-wide _\bs_\bu_\bd_\bo_\be_\br_\bs file in
+       addition to a local, per-machine file.  For the sake of this example
+       the site-wide _\bs_\bu_\bd_\bo_\be_\br_\bs will be _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs and the per-machine one will
+       be _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bl_\bo_\bc_\ba_\bl.  To include _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bl_\bo_\bc_\ba_\bl from within
+       _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs we would use the following line in _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs:
 
            #include /etc/sudoers.local
 
@@ -489,6 +490,25 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
        will cause s\bsu\bud\bdo\bo to include the file _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bx_\be_\br_\bx_\be_\bs.
 
+       The #includedir directive can be used to create a _\bs_\bu_\bd_\bo_\b._\bd directory that
+       the system package manager can drop _\bs_\bu_\bd_\bo_\be_\br_\bs rules into as part of
+       package installation.  For example, given:
+
+         #includedir /etc/sudoers.d
+
+       s\bsu\bud\bdo\bo will read each file in _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bd, skipping files that end in
+       ".tmp" to avoid causing problems with v\bvi\bis\bsu\bud\bdo\bo.  Files are parsed in
+       sorted lexical order.  That is, _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bd_\b/_\b0_\b1_\b__\bf_\bi_\br_\bs_\bt will be parsed
+       before _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bd_\b/_\b1_\b0_\b__\bs_\be_\bc_\bo_\bn_\bd.  Be aware that because the sorting is
+       lexical, not numeric, _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bd_\b/_\b1_\b__\bw_\bh_\bo_\bo_\bp_\bs would be loaded a\baf\bft\bte\ber\br
+       _\b/_\be_\bt_\bc_\b/_\bs_\bu_\bd_\bo_\be_\br_\bs_\b._\bd_\b/_\b1_\b0_\b__\bs_\be_\bc_\bo_\bn_\bd.  Using a consistent number of leading zeroes
+       in the file names can be used to avoid such problems.
+
+       Note that unlike files included via #include, v\bvi\bis\bsu\bud\bdo\bo will not edit the
+       files in a #includedir directory unless one of them contains a syntax
+       error.  It is still possible to run v\bvi\bis\bsu\bud\bdo\bo with the -f flag to edit the
+       files directly.
+
        O\bOt\bth\bhe\ber\br s\bsp\bpe\bec\bci\bia\bal\bl c\bch\bha\bar\bra\bac\bct\bte\ber\brs\bs a\ban\bnd\bd r\bre\bes\bse\ber\brv\bve\bed\bd w\bwo\bor\brd\bds\bs
 
        The pound sign ('#') is used to indicate a comment (unless it is part
@@ -500,6 +520,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
        The reserved word A\bAL\bLL\bL is a built-in _\ba_\bl_\bi_\ba_\bs that always causes a match to
        succeed.  It can be used wherever one might otherwise use a Cmnd_Alias,
        User_Alias, Runas_Alias, or Host_Alias.  You should not try to define
+
+
+
+1.7.1                     April 18, 2009                        8
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
        your own _\ba_\bl_\bi_\ba_\bs called A\bAL\bLL\bL as the built-in alias will be used in
        preference to your own.  Please note that using A\bAL\bLL\bL can be dangerous
        since in a command context, it allows the user to run a\ban\bny\by command on
@@ -521,17 +553,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
        used as part of a word (e.g. a username or hostname): '@', '!', '=',
        ':', ',', '(', ')', '\'.
 
-
-
-1.7.1                     March 11, 2009                        8
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
 S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
        s\bsu\bud\bdo\bo's behavior can be modified by Default_Entry lines, as explained
        earlier.  A list of all supported Defaults parameters, grouped by type,
@@ -565,6 +586,18 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
                        alternative is to place a colon-separated list of
                        editors in the editor variable.  v\bvi\bis\bsu\bud\bdo\bo will then only
                        use the EDITOR or VISUAL if they match a value
+
+
+
+1.7.1                     April 18, 2009                        9
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
                        specified in editor.  This flag is _\bo_\bf_\bf by default.
 
        env_reset       If set, s\bsu\bud\bdo\bo will reset the environment to only contain
@@ -586,18 +619,6 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
                        working (for example if the machine is not plugged into
                        the network).  Also note that you must use the host's
                        official name as DNS knows it.  That is, you may not
-
-
-
-1.7.1                     March 11, 2009                        9
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
                        use a host alias (CNAME entry) due to performance
                        issues and the fact that there is no way to get all
                        aliases from DNS.  If your machine's hostname (as
@@ -631,6 +652,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
        log_year        If set, the four-digit year will be logged in the (non-
                        syslog) s\bsu\bud\bdo\bo log file.  This flag is _\bo_\bf_\bf by default.
 
+
+
+
+1.7.1                     April 18, 2009                       10
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
        long_otp_prompt When validating with a One Time Password (OPT) scheme
                        such as S\bS/\b/K\bKe\bey\by or O\bOP\bPI\bIE\bE, a two-line prompt is used to
                        make it easier to cut and paste the challenge to a
@@ -652,18 +685,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
        mail_no_perms   If set, mail will be sent to the _\bm_\ba_\bi_\bl_\bt_\bo user if the
                        invoking user is allowed to use s\bsu\bud\bdo\bo but the command
-
-
-
-1.7.1                     March 11, 2009                       10
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
                        they are trying is not listed in their _\bs_\bu_\bd_\bo_\be_\br_\bs file
                        entry or is explicitly denied.  This flag is _\bo_\bf_\bf by
                        default.
@@ -697,6 +718,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
        preserve_groups By default, s\bsu\bud\bdo\bo will initialize the group vector to
                        the list of groups the target user is in.  When
+
+
+
+1.7.1                     April 18, 2009                       11
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
                        _\bp_\br_\be_\bs_\be_\br_\bv_\be_\b__\bg_\br_\bo_\bu_\bp_\bs is set, the user's existing group
                        vector is left unaltered.  The real and effective group
                        IDs, however, are still set to match the target user.
@@ -718,18 +751,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        as _\bc_\br_\bo_\bn(1m) or cgi-bin scripts.  This flag is _\bo_\bf_\bf by
                        default.
 
-
-
-
-1.7.1                     March 11, 2009                       11
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
        root_sudo       If set, root is allowed to run s\bsu\bud\bdo\bo too.  Disabling
                        this prevents users from "chaining" s\bsu\bud\bdo\bo commands to
                        get a root shell by doing something like "sudo sudo
@@ -763,6 +784,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        This can be done by negating the set_logname option.
                        Note that if the _\be_\bn_\bv_\b__\br_\be_\bs_\be_\bt option has not been
                        disabled, entries in the _\be_\bn_\bv_\b__\bk_\be_\be_\bp list will override
+
+
+
+1.7.1                     April 18, 2009                       12
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
                        the value of _\bs_\be_\bt_\b__\bl_\bo_\bg_\bn_\ba_\bm_\be.  This flag is _\bo_\bf_\bf by default.
 
        setenv          Allow the user to disable the _\be_\bn_\bv_\b__\br_\be_\bs_\be_\bt option from the
@@ -784,18 +817,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        style globbing when matching pathnames.  However, since
                        it accesses the file system, _\bg_\bl_\bo_\bb(3) can take a long
                        time to complete for some patterns, especially when the
-
-
-
-1.7.1                     March 11, 2009                       12
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
                        pattern references a network file system that is
                        mounted on demand (automounted).  The _\bf_\ba_\bs_\bt_\b__\bg_\bl_\bo_\bb option
                        causes s\bsu\bud\bdo\bo to use the _\bf_\bn_\bm_\ba_\bt_\bc_\bh(3) function, which does
@@ -829,6 +850,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        user is logged in on in that directory.  This flag is
                        _\bo_\bf_\bf by default.
 
+
+
+
+1.7.1                     April 18, 2009                       13
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
        umask_override  If set, s\bsu\bud\bdo\bo will set the umask as specified by _\bs_\bu_\bd_\bo_\be_\br_\bs
                        without modification.  This makes it possible to
                        specify a more permissive umask in _\bs_\bu_\bd_\bo_\be_\br_\bs than the
@@ -850,18 +883,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        things like "rsh somehost sudo ls" since _\br_\bs_\bh(1) does
                        not allocate a tty.  This flag is _\bo_\bf_\bf by default.
 
-
-
-
-1.7.1                     March 11, 2009                       13
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
        I\bIn\bnt\bte\beg\bge\ber\brs\bs:
 
        closefrom       Before it executes a command, s\bsu\bud\bdo\bo will close all open
@@ -896,6 +917,17 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        their own timestamps via sudo -v and sudo -k
                        respectively.
 
+
+
+1.7.1                     April 18, 2009                       14
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
        umask           Umask to use when running the command.  Negate this
                        option or set it to 0777 to preserve the user's umask.
                        The actual umask that is used will be the union of the
@@ -916,18 +948,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        matches the user's EDITOR environment variable if
                        possible, or the first editor in the list that exists
                        and is executable.  The default is the path to vi on
-
-
-
-1.7.1                     March 11, 2009                       14
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
                        your system.
 
        mailsub         Subject of the mail sent to the _\bm_\ba_\bi_\bl_\bt_\bo user. The escape
@@ -962,6 +982,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
                        %u  expanded to the invoking user's login name
 
+
+
+
+1.7.1                     April 18, 2009                       15
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
                        %%  two consecutive % characters are collapsed into a
                            single % character
 
@@ -982,18 +1014,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        changing the locale may affect how sudoers is
                        interpreted.  Defaults to "C".
 
-
-
-
-1.7.1                     March 11, 2009                       15
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
        timestampdir    The directory in which s\bsu\bud\bdo\bo stores its timestamp files.
                        The default is _\b/_\bv_\ba_\br_\b/_\br_\bu_\bn_\b/_\bs_\bu_\bd_\bo.
 
@@ -1029,6 +1049,17 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
                    always  Always lecture the user.
 
+
+
+1.7.1                     April 18, 2009                       16
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
                    never   Never lecture the user.
 
                    once    Only lecture the user the first time they run s\bsu\bud\bdo\bo.
@@ -1048,18 +1079,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
                    all     All the user's _\bs_\bu_\bd_\bo_\be_\br_\bs entries for the current host
                            must have the NOPASSWD flag set to avoid entering a
-
-
-
-1.7.1                     March 11, 2009                       16
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
                            password.
 
                    always  The user must always enter a password to use the -\b-l\bl
@@ -1095,6 +1114,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                    s\bsu\bud\bdo\bo interpreting the @ sign.  Defaults to root.
 
        secure_path Path used for every command run from s\bsu\bud\bdo\bo.  If you don't
+
+
+
+1.7.1                     April 18, 2009                       17
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
                    trust the people running s\bsu\bud\bdo\bo to have a sane PATH
                    environment variable you may want to use this.  Another use
                    is if you want to have the "root path" be separate from the
@@ -1114,18 +1145,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                            password.
 
                    always  The user must always enter a password to use the -\b-v\bv
-
-
-
-1.7.1                     March 11, 2009                       17
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
                            option.
 
                    any     At least one of the user's _\bs_\bu_\bd_\bo_\be_\br_\bs entries for the
@@ -1161,6 +1180,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        space-separated list or a single value without double-
                        quotes.  The list can be replaced, added to, deleted
                        from, or disabled by using the =, +=, -=, and !
+
+
+
+1.7.1                     April 18, 2009                       18
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
                        operators respectively.  The default list of
                        environment variables to remove is displayed when s\bsu\bud\bdo\bo
                        is run by root with the _\b-_\bV option.  Note that many
@@ -1180,18 +1211,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
                        with the _\b-_\bV option.
 
        When logging via _\bs_\by_\bs_\bl_\bo_\bg(3), s\bsu\bud\bdo\bo accepts the following values for the
-
-
-
-1.7.1                     March 11, 2009                       18
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
        syslog facility (the value of the s\bsy\bys\bsl\blo\bog\bg Parameter): a\bau\but\bth\bhp\bpr\bri\biv\bv (if your
        OS supports it), a\bau\but\bth\bh, d\bda\bae\bem\bmo\bon\bn, u\bus\bse\ber\br, l\blo\boc\bca\bal\bl0\b0, l\blo\boc\bca\bal\bl1\b1, l\blo\boc\bca\bal\bl2\b2, l\blo\boc\bca\bal\bl3\b3,
        l\blo\boc\bca\bal\bl4\b4, l\blo\boc\bca\bal\bl5\b5, l\blo\boc\bca\bal\bl6\b6, and l\blo\boc\bca\bal\bl7\b7.  The following syslog priorities
@@ -1228,6 +1247,18 @@ E\bEX\bXA\bAM\bMP\bPL\bLE\bES\bS
         Host_Alias     SERVERS = master, mail, www, ns
         Host_Alias     CDROM = orion, perseus, hercules
 
+
+
+1.7.1                     April 18, 2009                       19
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
+
         # Cmnd alias specification
         Cmnd_Alias     DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
                                /usr/sbin/restore, /usr/sbin/rrestore
@@ -1246,18 +1277,6 @@ E\bEX\bXA\bAM\bMP\bPL\bLE\bES\bS
        to log via _\bs_\by_\bs_\bl_\bo_\bg(3) using the _\ba_\bu_\bt_\bh facility in all cases.  We don't
        want to subject the full time staff to the s\bsu\bud\bdo\bo lecture, user m\bmi\bil\bll\ble\ber\brt\bt
        need not give a password, and we don't want to reset the LOGNAME, USER
-
-
-
-1.7.1                     March 11, 2009                       19
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
        or USERNAME environment variables when running commands as root.
        Additionally, on the machines in the _\bS_\bE_\bR_\bV_\bE_\bR_\bS Host_Alias, we keep an
        additional local log file and make sure we log the year in each log
@@ -1293,6 +1312,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
        any host but they must authenticate themselves first (since the entry
        lacks the NOPASSWD tag).
 
+
+
+
+1.7.1                     April 18, 2009                       20
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
         jack           CSNETS = ALL
 
        The user j\bja\bac\bck\bk may run any command on the machines in the _\bC_\bS_\bN_\bE_\bT_\bS alias
@@ -1312,18 +1343,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
        The o\bop\bpe\ber\bra\bat\bto\bor\br user may run commands limited to simple maintenance.
        Here, those are commands related to backups, killing processes, the
        printing system, shutting down the system, and any commands in the
-
-
-
-1.7.1                     March 11, 2009                       20
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
        directory _\b/_\bu_\bs_\br_\b/_\bo_\bp_\be_\br_\b/_\bb_\bi_\bn_\b/.
 
         joe            ALL = /usr/bin/su operator
@@ -1359,6 +1378,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
         john           ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
 
+
+
+
+1.7.1                     April 18, 2009                       21
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
        On the _\bA_\bL_\bP_\bH_\bA machines, user j\bjo\boh\bhn\bn may su to anyone except root but he is
        not allowed to specify any options to the _\bs_\bu(1) command.
 
@@ -1378,18 +1409,6 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
        The user s\bst\bte\bev\bve\be may run any command in the directory
        /usr/local/op_commands/ but only as user operator.
 
-
-
-
-1.7.1                     March 11, 2009                       21
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
         matt           valkyrie = KILL
 
        On his personal workstation, valkyrie, m\bma\bat\btt\bt needs to be able to kill
@@ -1425,6 +1444,18 @@ S\bSE\bEC\bCU\bUR\bRI\bIT\bTY\bY N\bNO\bOT\bTE\bES\bS
 
 P\bPR\bRE\bEV\bVE\bEN\bNT\bTI\bIN\bNG\bG S\bSH\bHE\bEL\bLL\bL E\bES\bSC\bCA\bAP\bPE\bES\bS
        Once s\bsu\bud\bdo\bo executes a program, that program is free to do whatever it
+
+
+
+1.7.1                     April 18, 2009                       22
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
        pleases, including run other programs.  This can be a security issue
        since it is not uncommon for a program to allow shell escapes, which
        lets a user bypass s\bsu\bud\bdo\bo's access control and logging.  Common programs
@@ -1444,18 +1475,6 @@ P\bPR\bRE\bEV\bVE\bEN\bNT\bTI\bIN\bNG\bG S\bSH\bHE\bEL\bLL\bL E\bES\bSC\bCA\bAP\bPE\bES\bS
                  to override default library functions by pointing an
                  environment variable (usually LD_PRELOAD) to an alternate
                  shared library.  On such systems, s\bsu\bud\bdo\bo's _\bn_\bo_\be_\bx_\be_\bc functionality
-
-
-
-1.7.1                     March 11, 2009                       22
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
                  can be used to prevent a program run by s\bsu\bud\bdo\bo from executing
                  any other programs.  Note, however, that this applies only to
                  native dynamically-linked executables.  Statically-linked
@@ -1491,6 +1510,18 @@ SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
 
                  This allows user a\baa\bar\bro\bon\bn to run _\b/_\bu_\bs_\br_\b/_\bb_\bi_\bn_\b/_\bm_\bo_\br_\be and _\b/_\bu_\bs_\br_\b/_\bb_\bi_\bn_\b/_\bv_\bi
                  with _\bn_\bo_\be_\bx_\be_\bc enabled.  This will prevent those two commands
+
+
+
+1.7.1                     April 18, 2009                       23
+
+
+
+
+
+SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
+
+
                  from executing other commands (such as a shell).  If you are
                  unsure whether or not your system is capable of supporting
                  _\bn_\bo_\be_\bx_\be_\bc you can always just try it out and see if it works.
@@ -1510,18 +1541,6 @@ C\bCA\bAV\bVE\bEA\bAT\bTS\bS
        _\bs_\bu_\bd_\bo_\be_\br_\bs be free of syntax errors since s\bsu\bud\bdo\bo will not run with a
        syntactically incorrect _\bs_\bu_\bd_\bo_\be_\br_\bs file.
 
-
-
-
-1.7.1                     March 11, 2009                       23
-
-
-
-
-
-SUDOERS(4)             MAINTENANCE COMMANDS            SUDOERS(4)
-
-
        When using netgroups of machines (as opposed to users), if you store
        fully qualified hostnames in the netgroup (as is usually the case), you
        either need to have the machine's hostname be fully qualified as
@@ -1560,25 +1579,6 @@ D\bDI\bIS\bSC\bCL\bLA\bAI\bIM\bME\bER\bR
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1.7.1                     March 11, 2009                       24
+1.7.1                     April 18, 2009                       24
 
 
index 0b4d55736d4147ddef138fba4ac906d6fbf7b5f3..ed39937a84d07a761af7f8455bf00bef8c6bc54f 100644 (file)
 .\" ========================================================================
 .\"
 .IX Title "SUDOERS @mansectform@"
-.TH SUDOERS @mansectform@ "March 11, 2009" "1.7.1" "MAINTENANCE COMMANDS"
+.TH SUDOERS @mansectform@ "April 18, 2009" "1.7.1" "MAINTENANCE COMMANDS"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
@@ -598,13 +598,15 @@ with \fBany\fR arguments.
 .Sh "Including other files from within sudoers"
 .IX Subsection "Including other files from within sudoers"
 It is possible to include other \fIsudoers\fR files from within the
-\&\fIsudoers\fR file currently being parsed using the \f(CW\*(C`#include\*(C'\fR
-directive, similar to the one used by the C preprocessor.  This is
-useful, for example, for keeping a site-wide \fIsudoers\fR file in
-addition to a per-machine local one.  For the sake of this example
-the site-wide \fIsudoers\fR will be \fI/etc/sudoers\fR and the per-machine
-one will be \fI/etc/sudoers.local\fR.  To include \fI/etc/sudoers.local\fR
-from within \fI/etc/sudoers\fR we would use the following line in \fI/etc/sudoers\fR:
+\&\fIsudoers\fR file currently being parsed using the \f(CW\*(C`#include\*(C'\fR and
+\&\f(CW\*(C`#includedir\*(C'\fR directives.
+.PP
+This can be used, for example, to keep a site-wide \fIsudoers\fR file
+in addition to a local, per-machine file.  For the sake of this
+example the site-wide \fIsudoers\fR will be \fI/etc/sudoers\fR and the
+per-machine one will be \fI/etc/sudoers.local\fR.  To include
+\&\fI/etc/sudoers.local\fR from within \fI/etc/sudoers\fR we would use the
+following line in \fI/etc/sudoers\fR:
 .Sp
 .RS 4
 \&\f(CW\*(C`#include /etc/sudoers.local\*(C'\fR
@@ -625,6 +627,28 @@ of the hostname.  I.e., if the machine's hostname is \*(L"xerxes\*(R", then
 .Ve
 .PP
 will cause \fBsudo\fR to include the file \fI/etc/sudoers.xerxes\fR.
+.PP
+The \f(CW\*(C`#includedir\*(C'\fR directive can be used to create a \fIsudo.d\fR
+directory that the system package manager can drop \fIsudoers\fR rules
+into as part of package installation.  For example, given:
+.PP
+.Vb 1
+\&  #includedir /etc/sudoers.d
+.Ve
+.PP
+\&\fBsudo\fR will read each file in \fI/etc/sudoers.d\fR, skipping files
+that end in \*(L".tmp\*(R" to avoid causing problems with \fBvisudo\fR.  Files
+are parsed in sorted lexical order.  That is, \fI/etc/sudoers.d/01_first\fR
+will be parsed before \fI/etc/sudoers.d/10_second\fR.  Be aware that
+because the sorting is lexical, not numeric, \fI/etc/sudoers.d/1_whoops\fR
+would be loaded \fBafter\fR \fI/etc/sudoers.d/10_second\fR.  Using a
+consistent number of leading zeroes in the file names can be used
+to avoid such problems.
+.PP
+Note that unlike files included via \f(CW\*(C`#include\*(C'\fR, \fBvisudo\fR will not
+edit the files in a \f(CW\*(C`#includedir\*(C'\fR directory unless one of them
+contains a syntax error.  It is still possible to run \fBvisudo\fR
+with the \f(CW\*(C`\-f\*(C'\fR flag to edit the files directly.
 .Sh "Other special characters and reserved words"
 .IX Subsection "Other special characters and reserved words"
 The pound sign ('#') is used to indicate a comment (unless it is
index f54660cd7797d4c15689b79eff28e332156ad92d..40db5d5b2f70e2cfde7ee131e63c659f48e77975 100644 (file)
@@ -441,13 +441,15 @@ with B<any> arguments.
 =head2 Including other files from within sudoers
 
 It is possible to include other I<sudoers> files from within the
-I<sudoers> file currently being parsed using the C<#include>
-directive, similar to the one used by the C preprocessor.  This is
-useful, for example, for keeping a site-wide I<sudoers> file in
-addition to a per-machine local one.  For the sake of this example
-the site-wide I<sudoers> will be F</etc/sudoers> and the per-machine
-one will be F</etc/sudoers.local>.  To include F</etc/sudoers.local>
-from within F</etc/sudoers> we would use the following line in F</etc/sudoers>:
+I<sudoers> file currently being parsed using the C<#include> and
+C<#includedir> directives.
+
+This can be used, for example, to keep a site-wide I<sudoers> file
+in addition to a local, per-machine file.  For the sake of this
+example the site-wide I<sudoers> will be F</etc/sudoers> and the
+per-machine one will be F</etc/sudoers.local>.  To include
+F</etc/sudoers.local> from within F</etc/sudoers> we would use the
+following line in F</etc/sudoers>:
 
 =over 4
 
@@ -469,6 +471,26 @@ of the hostname.  I.e., if the machine's hostname is "xerxes", then
 
 will cause B<sudo> to include the file F</etc/sudoers.xerxes>.
 
+The C<#includedir> directive can be used to create a F<sudo.d>
+directory that the system package manager can drop I<sudoers> rules
+into as part of package installation.  For example, given:
+
+  #includedir /etc/sudoers.d
+
+B<sudo> will read each file in F</etc/sudoers.d>, skipping files
+that end in ".tmp" to avoid causing problems with B<visudo>.  Files
+are parsed in sorted lexical order.  That is, F</etc/sudoers.d/01_first>
+will be parsed before F</etc/sudoers.d/10_second>.  Be aware that
+because the sorting is lexical, not numeric, F</etc/sudoers.d/1_whoops>
+would be loaded B<after> F</etc/sudoers.d/10_second>.  Using a
+consistent number of leading zeroes in the file names can be used
+to avoid such problems.
+
+Note that unlike files included via C<#include>, B<visudo> will not
+edit the files in a C<#includedir> directory unless one of them
+contains a syntax error.  It is still possible to run B<visudo>
+with the C<-f> flag to edit the files directly.
+
 =head2 Other special characters and reserved words
 
 The pound sign ('#') is used to indicate a comment (unless it is
index c5bcb184ba5366a5827fa9370f6d77049852ea99..ebe930f41f1399eed1a689371143abb0900c864a 100644 (file)
@@ -373,8 +373,9 @@ set_fqdn()
 }
 
 FILE *
-open_sudoers(path, keepopen)
+open_sudoers(path, isdir, keepopen)
     const char *path;
+    int isdir;
     int *keepopen;
 {
     return(fopen(path, "r"));
diff --git a/toke.c b/toke.c
index 6442bfa2339d351093631297a15cf15515d565cf..407b3fa9c5d13908e0a6b19715b89bc5b7aab918 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -288,69 +288,70 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 48
-#define YY_END_OF_BUFFER 49
-static yyconst short int yy_accept[538] =
+#define YY_NUM_RULES 49
+#define YY_END_OF_BUFFER 50
+static yyconst short int yy_accept[545] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   49,   36,   44,   43,   42,   47,   36,   37,
-       38,   36,   39,   36,   36,   36,   36,   41,   40,   47,
-       32,   32,   32,   32,   32,   32,   47,   36,   36,   44,
-       47,   32,   32,   32,   32,   32,    1,   47,   36,   36,
-       16,   15,   16,   15,   15,   47,   47,   47,    2,    8,
-        7,    8,    3,    8,    4,   47,   12,   12,   12,   10,
-       11,   36,    0,   44,   42,    0,   46,    0,   36,   27,
-        0,   26,    0,   35,   35,    0,   36,   36,    0,   36,
-       36,   36,   36,    0,   30,   32,   32,   32,   32,   32,
-
-       32,   36,   45,   36,   44,    0,    0,    0,    0,    0,
-        0,   36,   36,   36,   36,   36,    1,    0,   33,   33,
-        0,   36,   16,   16,   14,   13,   14,    0,    0,    2,
+        0,    0,   50,   37,   45,   44,   43,   48,   37,   38,
+       39,   37,   40,   37,   37,   37,   37,   42,   41,   48,
+       33,   33,   33,   33,   33,   33,   48,   37,   37,   45,
+       48,   33,   33,   33,   33,   33,    1,   48,   37,   37,
+       16,   15,   16,   15,   15,   48,   48,   48,    2,    8,
+        7,    8,    3,    8,    4,   48,   12,   12,   12,   10,
+       11,   37,    0,   45,   43,    0,   47,    0,   37,   28,
+        0,   27,    0,   36,   36,    0,   37,   37,    0,   37,
+       37,   37,   37,    0,   31,   33,   33,   33,   33,   33,
+
+       33,   37,   46,   37,   45,    0,    0,    0,    0,    0,
+        0,   37,   37,   37,   37,   37,    1,    0,   34,   34,
+        0,   37,   16,   16,   14,   13,   14,    0,    0,    2,
         8,    0,    5,    6,    8,    8,   12,    0,   12,   12,
-        0,    9,    0,    0,    0,   36,   36,   36,   36,   36,
-        0,    0,   30,   30,   32,   32,   32,   32,   32,   32,
-       32,   36,    0,    0,    0,    0,    0,    0,   36,   36,
-       36,   36,   36,    0,   36,    9,    0,   36,   36,   36,
-       36,   36,   36,    0,   31,   31,   31,    0,    0,   30,
-       30,   30,   30,   30,   30,   30,   32,   32,   32,   32,
-
-       32,   32,   32,   36,    0,    0,    0,    0,    0,    0,
-       36,   36,   36,   36,   36,   36,   36,    0,    0,   31,
-       31,   31,    0,   30,   30,    0,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,    0,   23,   32,
-       32,   32,   32,   32,   36,    0,    0,    0,    0,   36,
-       36,   36,   36,   36,   36,   36,   36,    0,   31,    0,
-       30,   30,   30,    0,    0,    0,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   32,
-       32,   32,   32,   32,   36,    0,    0,    0,   36,   36,
-       36,   28,   28,   28,    0,    0,   30,   30,   30,   30,
-
-       30,   30,   30,    0,    0,    0,    0,    0,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,    0,   22,   32,   32,    0,   21,    0,   24,
-       36,    0,    0,    0,   36,   36,   36,   36,   28,   28,
-       28,   28,    0,   30,    0,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,    0,    0,    0,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,   32,   32,   34,    0,    0,    0,   36,   18,
-       33,   36,   29,   29,   29,   30,    0,    0,    0,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
+        0,    9,    0,    0,    0,   37,   37,   37,   37,   37,
+        0,    0,   31,   31,   33,   33,   33,   33,   33,   33,
+       33,   37,    0,    0,    0,    0,    0,    0,   37,   37,
+       37,   37,   37,    0,   37,    9,    0,   37,   37,   37,
+       37,   37,   37,    0,   32,   32,   32,    0,    0,   31,
+       31,   31,   31,   31,   31,   31,   33,   33,   33,   33,
+
+       33,   33,   33,   37,    0,    0,    0,    0,    0,    0,
+       37,   37,   37,   37,   37,   37,   37,    0,    0,   32,
+       32,   32,    0,   31,   31,    0,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,    0,   24,   33,
+       33,   33,   33,   33,   37,    0,    0,    0,    0,   37,
+       37,   37,   37,   37,   37,   37,   37,    0,   32,    0,
+       31,   31,   31,    0,    0,    0,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   33,
+       33,   33,   33,   33,   37,    0,    0,    0,   37,   37,
+       37,   29,   29,   29,    0,    0,   31,   31,   31,   31,
+
+       31,   31,   31,    0,    0,    0,    0,    0,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,    0,   23,   33,   33,    0,   22,    0,   25,
+       37,    0,    0,    0,   37,   37,   37,   37,   29,   29,
+       29,   29,    0,   31,    0,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,    0,    0,    0,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   33,   33,   35,    0,    0,    0,   37,   19,
+       34,   37,   30,   30,   30,   31,    0,    0,    0,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
 
-       30,   30,    0,    0,    0,    0,    0,   30,   30,   30,
-       30,   30,   30,   30,   30,    0,   20,    0,   25,    0,
-       18,    0,   36,    0,   36,   36,   36,   29,   29,   29,
-       29,   29,    0,    0,    0,    0,    0,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,    0,    0,   19,
-       18,    0,   18,    0,   36,   36,   36,   29,   29,    0,
-        0,    0,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       19,    0,   17,   36,   36,   36,   36,   36,    0,    0,
+       31,   31,    0,    0,    0,    0,    0,   31,   31,   31,
+       31,   31,   31,   31,   31,    0,   21,    0,   26,    0,
+       19,    0,    0,   37,    0,   37,   37,   37,   30,   30,
+       30,   30,   30,    0,    0,    0,    0,    0,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,    0,    0,
+        0,   20,   19,    0,   19,    0,   37,   37,   37,   30,
+       30,    0,    0,    0,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   20,    0,   17,    0,   37,   37,   37,   37,
 
-        0,    0,    0,   30,   30,   30,   30,   30,   30,   30,
-       30,   36,   36,   36,   30,   30,   30,   30,   30,   30,
-       36,   36,   36,   36,   36,   30,   30,   30,   30,   30,
-       28,   28,   28,   28,   28,   28,    0
+       37,    0,    0,    0,    0,    0,   31,   31,   31,   31,
+       31,   31,   31,   31,    0,   37,   37,   37,   31,   31,
+       31,   31,   31,   31,    0,   37,   37,   37,   37,   37,
+       31,   31,   31,   31,   31,    0,   18,   29,   29,   29,
+       29,   29,   29,    0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -396,147 +397,149 @@ static yyconst int yy_meta[63] =
        12,   12
     } ;
 
-static yyconst short int yy_base[600] =
+static yyconst short int yy_base[608] =
     {   0,
         0,   61,   62,   63,   69,   84,  128,  189,  250,  294,
-       80,  101, 2317, 2271, 2304, 3379, 2291,  337, 2247, 3379,
-     3379, 2246, 3379,  107,  347,  119,  137, 2266, 3379, 3379,
-      399, 2219,  446, 2224, 2231, 2226,  497,  145,   35,  167,
-      521, 2193, 2180, 2170, 2165, 2166, 2223,  193,  256,   55,
-        0, 3379, 2220,    0, 3379,  264,  573,  110,    0, 2164,
-     3379,   73, 3379,   76, 3379,  117, 2154,  105,  106, 3379,
-      142, 2151,  306, 2185, 2173, 2164, 3379,  201,  209, 2085,
-      506, 2084,  543,  276, 2048,  554,  306,  581, 2068, 2067,
-      325,  364,  317, 2046,   55,  618,    0, 2035,  240, 2027,
-
-     2025,  125, 3379,   98,  523, 2005, 2008, 1998, 1986, 1978,
-      146,  115,  219,   29,  212,  149, 2024,  463,  579, 1958,
-      649,  154,    0, 1998,  256, 3379, 3379,  598,  284,    0,
-     1956,  674, 3379, 3379, 1926,  488, 1925, 1964,  271,  307,
-      288, 1966, 1964, 1939,  676,  688,  720,  752,  784, 1925,
-     1869,  821,  268,  859,  896, 1860, 1818, 1833, 1827, 1804,
-     1810,  236, 1784, 1773, 1764, 1766, 1771,  300,  157, 1759,
-      259,   79,  329,  691,  344, 1803, 1791,  701,  348,  935,
-      967,  711,  366, 1759, 1747,  731,  455, 1706, 1689,  487,
-      741,  999,  760,  768, 1037,  803, 1688,  401, 1679, 1671,
-
-     1654, 1650, 1640,  356, 1624, 1625, 1595, 1608, 1595,  369,
-      442,  503,  233,  462, 1076, 1108, 1140, 1601, 1600,  838,
-     1599, 1582, 1581, 1580,  502,  876,  505,  913,  557, 1172,
-        0,  945, 1183,  954,  774, 1221,  977,  526, 3379, 1539,
-     1529, 1522, 1522, 1510,  532, 1476, 1458, 1444,  581,  363,
-       21,  577,  987,  490, 1260, 1292, 1019, 1479, 1432, 1431,
-     1430, 1322,  630, 1056, 1086, 1096,  647,  670,  794, 1116,
+       80,  101, 2372, 2325, 2367, 3392, 2360,  337, 2310, 3392,
+     3392, 2307, 3392,  107,  347,  119,  137, 2313, 3392, 3392,
+      399, 2292,  446, 2282, 2289, 2284,  497,  145,   35,  167,
+      521, 2250, 2244, 2234, 2229, 2230, 2261,  193,  256,   55,
+        0, 3392, 2256,    0, 3392,  264,  573,  110,    0, 2214,
+     3392,   73, 3392,   76, 3392,  117, 2213,  105,  106, 3392,
+      142, 2204,  306, 2229, 2224, 2224, 3392,  201,  209, 2181,
+      506, 2180,  543,  276, 2179,  554,  306,  581, 2185, 2185,
+      325,  364,  317, 2172,   55,  618,    0, 2155,  240, 2138,
+
+     2127,  125, 3392,   98,  523, 2074, 2078, 2035, 2030, 2021,
+      146,  115,  219,   29,  212,  149, 2068,  463,  579, 2022,
+      649,  154,    0, 2062,  256, 3392, 3392,  598,  284,    0,
+     2020,  674, 3392, 3392, 2016,  488, 2014, 2051,  271,  307,
+      288, 2046, 2035, 2023,  676,  688,  720,  752,  784, 1989,
+     1978,  821,  268,  859,  896, 1971, 1927, 1942, 1937, 1929,
+     1935,  236, 1885, 1887, 1833, 1833, 1811,  300,  157, 1814,
+      259,   79,  329,  691,  344, 1857, 1840,  701,  348,  935,
+      967,  711,  366, 1818, 1817,  731,  455, 1801, 1800,  487,
+      741,  999,  760,  768, 1037,  803, 1799,  401, 1790, 1767,
+
+     1765, 1751, 1748,  356, 1721, 1683, 1652, 1665, 1652,  369,
+      442,  503,  233,  462, 1076, 1108, 1140, 1686, 1670,  838,
+     1670, 1651, 1650, 1648,  502,  876,  505,  913,  557, 1172,
+        0,  945, 1183,  954,  774, 1221,  977,  526, 3392, 1626,
+     1616, 1622, 1594, 1582,  532, 1576, 1544, 1545,  581,  363,
+       21,  577,  987,  490, 1260, 1292, 1019, 1580, 1545, 1544,
+     1530, 1322,  630, 1056, 1086, 1096,  647,  670,  794, 1116,
       926, 1361,    0, 1126, 1372, 1148,  884, 1410, 1158,  583,
-     1409, 1402,  640,  657,  618, 1407, 1344,  486,  632,  599,
-      638, 1448, 1479, 1510, 1374, 1373, 1325, 1200, 1542, 1238,
+     1510, 1517,  640,  657,  618, 1494, 1465,  486,  632,  599,
+      638, 1448, 1479, 1510, 1480, 1430, 1428, 1200, 1542, 1238,
 
-     1208, 1579, 1270, 1278, 1334, 1302, 1312, 1341,  674,  711,
+     1208, 1579, 1270, 1278, 1437, 1302, 1312, 1341,  674,  711,
       987, 1010, 1389, 1067, 1618,    0, 1429, 1629, 1456, 1246,
-     1667, 1466,  688, 3379, 1273, 1261,  689, 3379,  743, 3379,
-      766, 1247, 1187,  605, 1017,  514,  785, 1489,  501, 1705,
-     1736, 1498, 1223, 1222, 1519,  954, 1528,  968, 1768,    0,
+     1667, 1466,  688, 3392, 1406, 1394,  689, 3392,  743, 3392,
+      766, 1380, 1337,  605, 1017,  514,  785, 1489,  501, 1705,
+     1736, 1498, 1373, 1325, 1519,  954, 1528,  968, 1768,    0,
       603, 1779, 1559, 1347, 1816, 1598, 1648, 1686, 1715, 1096,
      1158, 1677, 1725, 1725, 1746, 1855,    0, 1748, 1866, 1757,
-     1397, 1798,  861,  862, 1165, 1155, 1148,  693,  820, 1895,
-     1139, 1927, 1959, 1991, 2023, 1131, 1835, 1886, 1909, 1127,
-     1261, 1293, 1935, 1467, 2055,    0,  806, 2066, 1943, 1567,
-
-     2103, 1969, 1977, 1069, 2001, 2011, 2033, 1312, 1332, 1877,
-      833,  906, 2142,    0,  900, 1039, 3379, 1099, 3379, 1033,
-     2031, 1909, 1391,  981,  934, 2083, 1138, 2152, 2184, 2216,
-     2248, 2046, 2120,  953, 2162, 2172, 2194,  918,  915, 1543,
-     1599, 2200, 1649, 2280,    0,  915, 2291, 2224, 1917, 2328,
-     2234, 2257, 2266, 2309, 1789,  869, 1028,  806,  807,  754,
-      751, 2359,  699, 2384, 2397, 2429, 2461, 2381, 2317, 2411,
-     2439, 2449,  690,  628, 1836, 1896, 2469, 1960, 2493,    0,
-     1022, 2504, 2477, 2091, 2523,  608, 2542, 2551, 2420,  591,
-     3379,  570, 3379, 2559, 1476, 2591, 2623, 2570, 2576,  556,
-
-     2602, 2612, 2633,  468,  381, 1992,  359,  303, 2641,    0,
-     1126, 2655, 2687, 2719, 2663, 2671, 2695,  289,    0,  182,
-     2703, 1478, 2751, 2783, 2733, 3379, 2739, 2763, 2128, 3379,
-     2771, 2791, 2801,  126, 2821, 2813, 3379, 2866, 2879, 2892,
-     2905, 2918, 2931, 2944, 2957, 2970, 2975, 2988, 3001, 3003,
-     3016, 3029, 3042, 3055, 3068, 3081, 3086, 3092, 3105, 3118,
-     3123, 3129, 3134, 3139, 3144, 3150, 3155, 3160, 3165, 3171,
-     3178, 3183, 3188, 3193, 3199, 3206, 3211, 3216, 3222, 3229,
-     3234, 3241, 3247, 3254, 3259, 3266, 3272, 3279, 3292, 3305,
-     3310, 3317, 3323, 3336, 3341, 3348, 3353, 3360, 3365
-
+     1397, 1798,  861,  862, 1259, 1249, 1242, 1453,  820, 1895,
+     1203, 1927, 1959, 1991, 2023, 1223, 1835, 1886, 1909, 1222,
+     1261, 1293, 1935, 1467, 2055,    0,  673, 2066, 1943, 1567,
+
+     2103, 1969, 1977, 1196, 2001, 2011, 2033, 1312, 1332, 1877,
+      814,  833, 2142,    0,  898, 1039, 3392, 1099, 3392, 1137,
+     2031, 1909, 1345,  877, 1110, 1106, 2083, 1138, 2152, 2184,
+     2216, 2248, 2046, 2120, 1069, 2162, 2172, 2194, 1056, 1002,
+     1543, 1599, 2200, 1649, 2280,    0,  916, 2291, 2224, 1917,
+     2328, 2234, 2257, 2266, 2309, 1789,  964, 1028,  907,  939,
+      314,  878,  839, 2359,  821, 2384, 2397, 2429, 2461, 2381,
+     2317, 2411, 2439, 2449,  786,  775, 1836, 1896, 2469, 1960,
+     2493,    0, 1022, 2504, 2477, 2091, 2523,  781, 2542, 2551,
+     2420,  729, 3392,  711, 3392, 1146, 2559, 1476, 2591, 2623,
+
+     2570, 2576,  638, 2602, 2612, 2633,  599,  582, 1992,  559,
+      556, 2641,    0, 1186, 2351, 2655, 2687, 2719, 2663, 2671,
+     2695,  468,    0,  391,  310, 2703, 1478, 2751, 2783, 2733,
+     3392, 2739, 2763, 2128, 3392,  193, 3392, 2771, 2791, 2801,
+      126, 2821, 2813, 3392, 2866, 2879, 2892, 2905, 2918, 2931,
+     2944, 2957, 2970, 2975, 2988, 3001, 3003, 3016, 3029, 3042,
+     3055, 3068, 3081, 3086, 3092, 3105, 3118, 3123, 3129, 3134,
+     3139, 3144, 3150, 3155, 3160, 3165, 3171, 3178, 3183, 3188,
+     3193, 3199, 3206, 3211, 3216, 3222, 3229, 3234, 3241, 3247,
+     3254, 3259, 3266, 3272, 3279, 3292, 3305, 3310, 3317, 3323,
+
+     3336, 3341, 3348, 3353, 3360, 3365, 3378
     } ;
 
-static yyconst short int yy_def[600] =
+static yyconst short int yy_def[608] =
     {   0,
-      537,    1,    1,    1,  538,  538,  539,  539,  540,  540,
-      541,  541,  537,  542,  537,  537,  537,  543,  544,  537,
-      537,  545,  537,  546,  542,   25,   25,  547,  537,  537,
-      537,   31,   31,   33,   33,   33,  542,   25,  542,  537,
-      543,   31,   31,   33,   33,   33,  537,  537,  548,  542,
-      549,  537,  549,  549,  537,  537,  543,  537,  550,  551,
-      537,  551,  537,  551,  537,  552,  553,  553,  553,  537,
-      537,  542,  542,  537,  537,  554,  537,  555,  537,  544,
-      544,  545,  545,  546,  556,  542,  542,   25,  547,   88,
-       88,   88,   88,  557,  558,   31,   33,   33,   33,   33,
-
-       33,  542,  537,  542,  537,  537,  537,  537,  537,  537,
-      554,  542,   88,  542,  542,  542,  537,  537,  548,  559,
-      542,  542,  549,  549,  537,  537,  537,  555,  537,  550,
-      551,  551,  537,  537,  551,  551,  553,  537,  553,  553,
-      537,  537,  554,  560,  537,  542,  542,  542,   88,  149,
-      561,  537,  562,  537,   31,   33,   33,   33,   33,   33,
-       33,  542,  537,  537,  537,  537,  537,  554,  542,  149,
-      542,  542,  542,  537,  542,  537,  560,  542,  542,  542,
-      542,  542,  542,  563,  564,  564,  186,  565,  564,  566,
-      154,  537,  192,  192,  537,  192,   33,   33,   33,   33,
-
-       33,   33,   33,  542,  537,  537,  537,  537,  537,  554,
-      542,  542,  542,  542,  542,  542,  542,  537,  567,  567,
-      220,  567,  568,  569,  570,  537,  571,  195,  571,  571,
-      230,  571,  537,  233,  233,  537,  233,  537,  537,   33,
-       33,   33,   33,   33,  542,  537,  537,  537,  554,  542,
-      542,  542,  542,  542,  542,  542,  542,  572,  572,  573,
-      574,  537,  537,  537,  537,  537,  575,  575,  576,  236,
-      576,  576,  272,  576,  537,  275,  275,  537,  275,   33,
-       33,   33,   33,   33,  542,  537,  537,  554,  542,  542,
-      542,  542,  542,  542,  537,  577,  578,  262,  537,  299,
-
-      299,  537,  299,  537,  537,  537,  537,  537,  537,  579,
-      579,  580,  278,  580,  580,  315,  580,  537,  318,  318,
-      537,  318,  537,  537,   33,   33,  537,  537,  537,  537,
-      542,  537,  537,  554,  542,  542,  542,  542,  542,  542,
-      542,  542,  537,  581,  537,  582,  302,  582,  582,  349,
-      349,  537,  352,  352,  537,  352,  537,  537,  537,  537,
-      583,  583,  584,  321,  584,  584,  366,  584,  537,  369,
-      369,  369,   33,   33,  542,  537,  537,  554,  542,  542,
-      542,  542,  542,  542,  542,  537,  537,  537,  537,  585,
-      585,  586,  355,  586,  586,  395,  395,  537,  398,  398,
-
-      537,  398,  537,  537,  537,  537,  537,  537,  587,  587,
-      588,  588,  588,  413,  413,  537,  537,  537,  537,  537,
-      537,  554,  542,  589,  590,  542,  542,  542,  542,  542,
-      542,  542,  537,  537,  537,  537,  537,  537,  591,  591,
-      592,  401,  592,  592,  444,  444,  537,  447,  447,  537,
-      447,  537,  537,  537,  537,  593,  593,  537,  594,  542,
-      589,  589,  590,  590,  542,  542,  542,  542,  542,  537,
-      537,  537,  537,  595,  595,  596,  450,  596,  596,  479,
-      479,  537,  482,  482,  482,  537,  537,  537,  537,  537,
-      537,  594,  537,  542,  542,  542,  542,  542,  537,  537,
-
-      537,  537,  537,  537,  597,  597,  598,  598,  598,  509,
-      509,  542,  542,  542,  537,  537,  537,  537,  599,  599,
-      542,  542,  542,  542,  542,  537,  537,  537,  537,  537,
-      542,  542,  542,  542,  542,  542,    0,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537
-
+      544,    1,    1,    1,  545,  545,  546,  546,  547,  547,
+      548,  548,  544,  549,  544,  544,  544,  550,  551,  544,
+      544,  552,  544,  553,  549,   25,   25,  554,  544,  544,
+      544,   31,   31,   33,   33,   33,  549,   25,  549,  544,
+      550,   31,   31,   33,   33,   33,  544,  544,  555,  549,
+      556,  544,  556,  556,  544,  544,  550,  544,  557,  558,
+      544,  558,  544,  558,  544,  559,  560,  560,  560,  544,
+      544,  549,  549,  544,  544,  561,  544,  562,  544,  551,
+      551,  552,  552,  553,  563,  549,  549,   25,  554,   88,
+       88,   88,   88,  564,  565,   31,   33,   33,   33,   33,
+
+       33,  549,  544,  549,  544,  544,  544,  544,  544,  544,
+      561,  549,   88,  549,  549,  549,  544,  544,  555,  566,
+      549,  549,  556,  556,  544,  544,  544,  562,  544,  557,
+      558,  558,  544,  544,  558,  558,  560,  544,  560,  560,
+      544,  544,  561,  567,  544,  549,  549,  549,   88,  149,
+      568,  544,  569,  544,   31,   33,   33,   33,   33,   33,
+       33,  549,  544,  544,  544,  544,  544,  561,  549,  149,
+      549,  549,  549,  544,  549,  544,  567,  549,  549,  549,
+      549,  549,  549,  570,  571,  571,  186,  572,  571,  573,
+      154,  544,  192,  192,  544,  192,   33,   33,   33,   33,
+
+       33,   33,   33,  549,  544,  544,  544,  544,  544,  561,
+      549,  549,  549,  549,  549,  549,  549,  544,  574,  574,
+      220,  574,  575,  576,  577,  544,  578,  195,  578,  578,
+      230,  578,  544,  233,  233,  544,  233,  544,  544,   33,
+       33,   33,   33,   33,  549,  544,  544,  544,  561,  549,
+      549,  549,  549,  549,  549,  549,  549,  579,  579,  580,
+      581,  544,  544,  544,  544,  544,  582,  582,  583,  236,
+      583,  583,  272,  583,  544,  275,  275,  544,  275,   33,
+       33,   33,   33,   33,  549,  544,  544,  561,  549,  549,
+      549,  549,  549,  549,  544,  584,  585,  262,  544,  299,
+
+      299,  544,  299,  544,  544,  544,  544,  544,  544,  586,
+      586,  587,  278,  587,  587,  315,  587,  544,  318,  318,
+      544,  318,  544,  544,   33,   33,  544,  544,  544,  544,
+      549,  544,  544,  561,  549,  549,  549,  549,  549,  549,
+      549,  549,  544,  588,  544,  589,  302,  589,  589,  349,
+      349,  544,  352,  352,  544,  352,  544,  544,  544,  544,
+      590,  590,  591,  321,  591,  591,  366,  591,  544,  369,
+      369,  369,   33,   33,  549,  544,  544,  561,  549,  549,
+      549,  549,  549,  549,  549,  544,  544,  544,  544,  592,
+      592,  593,  355,  593,  593,  395,  395,  544,  398,  398,
+
+      544,  398,  544,  544,  544,  544,  544,  544,  594,  594,
+      595,  595,  595,  413,  413,  544,  544,  544,  544,  544,
+      544,  561,  561,  549,  596,  597,  549,  549,  549,  549,
+      549,  549,  549,  544,  544,  544,  544,  544,  544,  598,
+      598,  599,  401,  599,  599,  445,  445,  544,  448,  448,
+      544,  448,  544,  544,  544,  544,  600,  600,  544,  601,
+      561,  549,  596,  596,  597,  597,  549,  549,  549,  549,
+      549,  544,  544,  544,  544,  602,  602,  603,  451,  603,
+      603,  481,  481,  544,  484,  484,  484,  544,  544,  544,
+      544,  544,  544,  601,  544,  561,  549,  549,  549,  549,
+
+      549,  544,  544,  544,  544,  544,  544,  604,  604,  605,
+      605,  605,  512,  512,  561,  549,  549,  549,  544,  544,
+      544,  544,  606,  606,  607,  549,  549,  549,  549,  549,
+      544,  544,  544,  544,  544,  607,  544,  549,  549,  549,
+      549,  549,  549,    0,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+
+      544,  544,  544,  544,  544,  544,  544
     } ;
 
-static yyconst short int yy_nxt[3442] =
+static yyconst short int yy_nxt[3455] =
     {   0,
        14,   15,   16,   17,   14,   18,   19,   20,   21,   14,
        22,   23,   14,   14,   24,   25,   26,   27,   25,   25,
@@ -558,7 +561,7 @@ static yyconst short int yy_nxt[3442] =
        90,   90,   90,   90,   90,   90,   90,   90,  105,   73,
        73,  169,   58,   59,   59,   59,   59,   59,   59,   59,
        59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       15,   16,   17,   73,   57,  345,  106,  107,   73,  173,
+       15,   16,   17,   73,   57,  537,  106,  107,   73,  173,
 
       108,   73,  168,  175,  109,  118,  211,  110,   79,   79,
        79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
@@ -572,26 +575,26 @@ static yyconst short int yy_nxt[3442] =
       142,  191,  211,  204,   66,   15,   16,   17,   61,   57,
 
       121,   85,   77,   73,   62,   63,   64,   72,  127,   72,
-      140,   72,  477,   72,   72,  138,  537,   72,   65,  211,
+      140,   72,  537,   72,   72,  138,   77,   72,   65,  211,
        86,  146,  147,  148,  146,  146,  146,  146,  146,   72,
        72,   72,  150,  150,  150,  150,  150,  150,   66,   77,
       150,  150,  150,  150,  150,  150,  150,  150,  210,   78,
        73,  138,   79,   79,   79,   79,   79,   79,   79,   79,
        87,  178,   88,   88,   88,   88,   88,   88,   88,   88,
-       89,   77,  345,   73,   90,   90,   90,   90,   90,  150,
+       89,   77,  496,   73,   90,   90,   90,   90,   90,  150,
       150,  150,  150,  150,  150,  150,  150,  211,   73,   89,
       289,   73,   73,   90,   90,   90,   90,   90,   90,   72,
 
-       73,  214,  238,   72,  477,   72,  245,   73,   72,   72,
+       73,  214,  238,   72,  345,   72,  245,   73,   72,   72,
        73,   72,   72,   72,   96,   96,   96,   96,   96,   96,
        96,   96,   89,  249,  239,   72,   96,   96,   96,   96,
        96,   97,   97,   97,   97,   97,   97,   97,   97,   97,
        97,   97,   97,   73,   97,   90,   90,   90,   90,   90,
        90,   72,   72,   72,   72,   72,   72,   72,   72,   72,
-       72,   97,   97,   97,   97,   97,   97,   97,   97,  537,
+       72,   97,   97,   97,   97,   97,   97,   97,   97,  544,
       222,  222,  222,   97,   97,   97,   97,   97,   79,   79,
        79,   79,   79,   79,   79,   79,   73,  250,   77,  129,
-      103,  442,   72,   72,   72,   72,   72,   72,  102,  103,
+      103,  479,   72,   72,   72,   72,   72,   72,  102,  103,
 
        72,  152,   72,  253,   72,   72,   73,   80,   72,   80,
       191,   80,  252,   80,   80,  338,  152,   80,  226,  152,
@@ -599,327 +602,328 @@ static yyconst short int yy_nxt[3442] =
        80,   80,  132,   78,   73,  334,   79,   79,   79,   79,
        79,   79,   79,   79,   82,   73,   82,   73,   82,  239,
        82,   82,  106,  107,   82,   84,  108,   72,   73,   84,
-      109,   72,   72,  110,  251,   84,   82,   82,   82,  499,
-      537,  152,  493,  380,  111,   77,   73,   84,   84,   72,
-      228,  285,  120,   77,  323,  128,  120,  120,  537,  537,
-      537,  537,  537,  537,  537,  537,  149,  149,  149,  149,
-
-      149,  149,  149,  149,  120,  152,  324,   77,  149,  149,
-      149,  149,  149,  537,  537,  537,  537,  537,  537,  537,
-      537,   73,  152,  121,  390,  390,  291,  149,  149,  149,
+      109,   72,   72,  110,  251,   84,   82,   82,   82,  544,
+      544,  152,  345,  380,  111,   77,   73,   84,   84,   72,
+      228,  285,  120,   77,  323,  128,  120,  120,  544,  544,
+      544,  544,  544,  544,  544,  544,  149,  149,  149,  149,
+
+      149,  149,  149,  149,  120,  479,  324,   77,  149,  149,
+      149,  149,  149,  544,  544,  544,  544,  544,  544,  544,
+      544,   73,  443,  121,  390,  390,  291,  149,  149,  149,
       149,  149,  149,  155,  155,  155,  155,  155,  155,  155,
       155,  327,  288,   73,  152,  155,  155,  155,  155,  155,
-      119,  442,   72,  191,  119,  378,   72,   72,  329,  336,
+      119,  502,   72,  191,  119,  378,   72,   72,  329,  336,
       119,  152,   73,  328,  149,  149,  149,  149,  149,  149,
       228,  331,  119,  119,   72,  131,   73,   85,  131,  131,
       330,   85,   73,  226,  152,  131,  335,   85,  152,  323,
-      327,  337,  120,  228,  422,   77,  120,  228,  131,   85,
+      327,  337,  120,  228,  440,  440,  120,  228,  131,   85,
 
        85,  178,  120,  179,  179,  179,  179,  179,  179,  179,
-      179,  324,  328,  393,  120,  120,  215,  216,  217,  215,
+      179,  324,  328,  495,  120,  120,  215,  216,  217,  215,
       215,  215,  215,  215,  178,  152,  179,  179,  179,  179,
       179,  179,   73,  178,  270,  180,  180,  180,  180,  180,
-      180,  180,  180,  464,  329,   73,  220,  220,  221,  222,
+      180,  180,  180,  152,  329,   73,  220,  220,  221,  222,
       222,  222,  222,  222,  188,   73,  196,  196,  196,  196,
       196,  196,  196,  196,   73,  178,  330,  181,  181,  181,
       181,  181,  182,  179,  179,  230,  230,  230,  230,  230,
       230,  230,  230,  231,  231,  231,  231,  231,  232,  273,
-      273,  273,  273,  273,  274,  462,   73,   72,   73,  183,
+      273,  273,  273,  273,  274,  152,   73,   72,  443,  183,
 
-      183,  183,  183,  183,  183,  183,  183,  226,  152,  493,
-       73,  183,  183,  183,  183,  183,  537,  270,  229,  229,
-      229,  229,  229,  229,  229,  229,  375,  439,  439,   73,
+      183,  183,  183,  183,  183,  183,  183,  226,  152,  393,
+       73,  183,  183,  183,  183,  183,  544,  270,  229,  229,
+      229,  229,  229,  229,  229,  229,  375,  226,  152,   73,
       183,  183,  183,  183,  183,  183,  185,  186,  187,  187,
-      187,  187,  187,  187,  188,  381,  226,  152,  189,  189,
+      187,  187,  187,  187,  188,  381,  544,  152,  189,  189,
       189,  189,  189,  259,  259,  259,  259,  259,  259,  259,
-      259,  188,  416,  418,   73,  491,  423,  189,  189,  189,
+      259,  188,  416,  418,   73,  466,  424,  189,  189,  189,
       189,  189,  189,  152,  192,  193,  194,  192,  192,  192,
-      192,  192,  195,  152,  417,  419,  196,  196,  196,  196,
+      192,  192,  195,  464,  417,  419,  196,  196,  196,  196,
       196,  264,  265,  266,  264,  264,  264,  264,  264,  316,
 
       316,  316,  316,  316,  317,  196,  196,  196,  196,  196,
-      196,  197,  197,  197,  197,  197,  197,  197,  197,  537,
-      152,  456,  456,  197,  197,  197,  197,  197,  237,  237,
-      237,  237,  237,  237,  237,  237,  474,  474,  393,  537,
-      152,  347,  183,  183,  183,  183,  183,  183,  178,  270,
+      196,  197,  197,  197,  197,  197,  197,  197,  197,  457,
+      457,   73,   73,  197,  197,  197,  197,  197,  237,  237,
+      237,  237,  237,  237,  237,  237,  462,  476,  476,  544,
+      152,  495,  183,  183,  183,  183,  183,  183,  178,  270,
       179,  179,  179,  179,  179,  179,  179,  179,  226,  152,
-      268,  268,  268,  268,  268,  268,  433,  345,  228,  272,
-      272,  272,  272,  272,  272,  272,  272,  347,  464,   73,
-      178,  537,  179,  179,  179,  179,  179,  179,  179,  179,
-      537,  347,  271,  271,  271,  271,  271,  271,  271,  271,
+      268,  268,  268,  268,  268,  268,  493,  345,  228,  272,
+      272,  272,  272,  272,  272,  272,  272,  347,  152,   73,
+      178,  544,  179,  179,  179,  179,  179,  179,  179,  179,
+      544,  347,  271,  271,  271,  271,  271,  271,  271,  271,
 
       226,  152,  292,  293,  294,  292,  292,  292,  292,  292,
       270,   73,  226,  152,  227,  227,  227,  227,  227,  227,
-      227,  227,  228,  226,  152,  462,  229,  229,  229,  229,
+      227,  227,  228,  226,  152,  393,  229,  229,  229,  229,
       229,   73,  253,  313,  254,  254,  254,  254,  254,  254,
-      416,  226,  152,  505,  505,  229,  229,  229,  229,  229,
+      416,  226,  152,  508,  508,  229,  229,  229,  229,  229,
       229,  152,  233,  234,  235,  233,  233,  233,  233,  233,
       236,   73,  417,   73,  237,  237,  237,  237,  237,  304,
-      379,  305,  305,  305,  305,  305,  305,  305,  305,  458,
-      537,  152,  403,  237,  237,  237,  237,  237,  237,  253,
+      379,  305,  305,  305,  305,  305,  305,  305,  305,  347,
+      544,  152,  434,  237,  237,  237,  237,  237,  237,  253,
       313,  254,  254,  254,  254,  254,  254,  254,  254,  304,
 
       418,  306,  306,  306,  306,  306,  306,  306,  306,  304,
       152,  307,  307,  307,  307,  307,  308,  305,  305,  270,
        73,  253,  419,  255,  255,  255,  255,  255,  255,  255,
       255,  279,  279,  279,  279,  279,  279,  279,  279,  226,
-      152,  311,  311,  311,  311,  311,  311,  519,  519,  270,
-      347,  426,   73,  253,  298,  256,  256,  256,  256,  256,
+      152,  311,  311,  311,  311,  311,  311,  515,   77,  270,
+      466,  427,   73,  253,  464,  256,  256,  256,  256,  256,
       257,  254,  254,  315,  315,  315,  315,  315,  315,  315,
-      315,  537,  152,  314,  314,  314,  314,  314,  314,  314,
-      314,  313,   73,   73,   73,  226,  152,  268,  268,  268,
+      315,  544,  152,  314,  314,  314,  314,  314,  314,  314,
+      314,  313,   73,  459,   73,  226,  152,  268,  268,  268,
       268,  268,  268,  268,  268,  228,  226,  152,  269,  269,
 
-      269,  269,  269,  269,  269,  269,  270,  421,  420,   73,
+      269,  269,  269,  269,  269,  269,  270,  523,  523,  403,
       271,  271,  271,  271,  271,  303,  303,  303,  303,  303,
       303,  303,  303,  350,  350,  350,  350,  350,  351,  271,
       271,  271,  271,  271,  271,  152,  275,  276,  277,  275,
-      275,  275,  275,  275,  278,  298,  224,  377,  279,  279,
+      275,  275,  275,  275,  278,  347,  298,   73,  279,  279,
       279,  279,  279,  349,  349,  349,  349,  349,  349,  349,
       349,  367,  367,  367,  367,  367,  368,  279,  279,  279,
       279,  279,  279,  253,  345,  254,  254,  254,  254,  254,
-      254,  254,  254,  537,  347,  348,  348,  348,  348,  348,
+      254,  254,  254,  544,  347,  348,  348,  348,  348,  348,
       348,  348,  348,  357,  358,  359,  357,  357,  357,  357,
 
-      357,  376,  374,  373,   73,  253,  345,  254,  254,  254,
+      357,  421,  420,   73,   73,  253,  345,  254,  254,  254,
       254,  254,  254,  254,  254,  304,  393,  305,  305,  305,
       305,  305,  305,  305,  305,  304,  152,  305,  305,  305,
       305,  305,  305,  305,  305,  313,   73,  299,  300,  301,
-      299,  299,  299,  299,  299,  302,  152,  304,  298,  303,
+      299,  299,  299,  299,  299,  302,  152,   77,  298,  303,
       303,  303,  303,  303,  304,  364,  305,  305,  305,  305,
       305,  305,  396,  396,  396,  396,  396,  397,  303,  303,
       303,  303,  303,  303,  226,  152,  311,  311,  311,  311,
       311,  311,  311,  311,  270,  226,  152,  312,  312,  312,
-      312,  312,  312,  312,  312,  313,  224,  188,  333,  314,
+      312,  312,  312,  312,  312,  313,  224,  377,  461,  314,
 
       314,  314,  314,  314,  322,  322,  322,  322,  322,  322,
       322,  322,  414,  414,  414,  414,  414,  415,  314,  314,
       314,  314,  314,  314,  152,  318,  319,  320,  318,  318,
-      318,  318,  318,  321,  332,   73,  326,  322,  322,  322,
+      318,  318,  318,  321,  376,  374,  373,  322,  322,  322,
       322,  322,  226,  152,  362,  362,  362,  362,  362,  362,
-      460,  325,  313,  298,  224,  188,  322,  322,  322,  322,
+      304,  298,  313,  224,  422,   77,  322,  322,  322,  322,
       322,  322,  338,  339,  339,  339,  339,  339,  339,  339,
-      339,  366,  366,  366,  366,  366,  366,  366,  366,  537,
-      537,  365,  365,  365,  365,  365,  365,  365,  365,  494,
-      393,  521,   73,  338,  340,  340,  340,  340,  340,  340,
+      339,  366,  366,  366,  366,  366,  366,  366,  366,  544,
+      544,  365,  365,  365,  365,  365,  365,  365,  365,  497,
+      393,  526,   73,  338,  340,  340,  340,  340,  340,  340,
 
-      340,  340,  188,  246,  382,  383,  384,  385,  382,  382,
-      382,  382,  338,  339,  339,  339,  339,  339,  339,  287,
-       73,  286,   73,   73,  338,  341,  341,  341,  341,  341,
+      340,  340,  423,  188,  382,  383,  384,  385,  382,  382,
+      382,  382,  338,  339,  339,  339,  339,  339,  339,  333,
+       73,  332,   73,   73,  338,  341,  341,  341,  341,  341,
       342,  339,  339,   73,  387,  388,  389,  387,  387,  387,
       387,  387,   73,  356,  356,  356,  356,  356,  356,  356,
-      356,  284,  283,  282,   73,  345,  345,  346,  346,  346,
-      346,  346,  346,  346,  346,  347,  393,  281,  280,  348,
+      356,  326,  325,  298,   73,  345,  345,  346,  346,  346,
+      346,  346,  346,  346,  346,  347,  393,  224,  188,  348,
       348,  348,  348,  348,  395,  395,  395,  395,  395,  395,
-      395,  395,  445,  445,  445,  445,  445,  446,  348,  348,
+      395,  395,  446,  446,  446,  446,  446,  447,  348,  348,
       348,  348,  348,  348,  352,  353,  354,  352,  352,  352,
 
-      352,  352,  355,  262,  224,  188,  356,  356,  356,  356,
-      356,  537,  345,  394,  394,  394,  394,  394,  394,  394,
-      394,  258,  442,  188,   95,  356,  356,  356,  356,  356,
+      352,  352,  355,  188,  246,  287,  356,  356,  356,  356,
+      356,  544,  345,  394,  394,  394,  394,  394,  394,  394,
+      394,  286,  443,  284,  283,  356,  356,  356,  356,  356,
       356,  226,  152,  362,  362,  362,  362,  362,  362,  362,
       362,  313,  226,  152,  363,  363,  363,  363,  363,  363,
-      363,  363,  364,  246,  248,  246,  365,  365,  365,  365,
-      365,  403,  537,  404,  404,  404,  404,  404,  404,  404,
-      404,  247,  442,  246,  244,  365,  365,  365,  365,  365,
+      363,  363,  364,  282,  281,  280,  365,  365,  365,  365,
+      365,  403,  544,  404,  404,  404,  404,  404,  404,  404,
+      404,  262,  443,  224,  188,  365,  365,  365,  365,  365,
       365,  152,  369,  370,  371,  369,  369,  369,  369,  369,
-      226,  152,  243,  242,  372,  372,  372,  372,  372,  403,
+      226,  152,  258,  188,  372,  372,  372,  372,  372,  403,
 
-      313,  405,  405,  405,  405,  405,  405,  405,  405,  241,
-      240,   89,  188,  372,  372,  372,  372,  372,  372,  338,
-      339,  339,  339,  339,  339,  339,  339,  339,  403,  224,
+      313,  405,  405,  405,  405,  405,  405,  405,  405,   95,
+      246,  248,  246,  372,  372,  372,  372,  372,  372,  338,
+      339,  339,  339,  339,  339,  339,  339,  339,  403,  247,
       406,  406,  406,  406,  406,  407,  404,  404,  226,  152,
       372,  372,  372,  372,  372,  372,  372,  372,  364,   73,
-      338,  339,  339,  339,  339,  339,  339,  339,  339,  537,
+      338,  339,  339,  339,  339,  339,  339,  339,  339,  544,
       152,  226,  152,  410,  410,  410,  410,  410,  410,  364,
-      188,  364,  413,  413,  413,  413,  413,  413,  413,  413,
-       73,  345,   95,  391,  391,  391,  391,  391,  391,  391,
-      391,  347,  345,   77,  392,  392,  392,  392,  392,  392,
+      246,  364,  413,  413,  413,  413,  413,  413,  413,  413,
+       73,  345,  244,  391,  391,  391,  391,  391,  391,  391,
+      391,  347,  345,  243,  392,  392,  392,  392,  392,  392,
 
-      392,  392,  393,  152,  176,  212,  394,  394,  394,  394,
-      394,  537,  364,  412,  412,  412,  412,  412,  412,  412,
-      412,  209,  208,  207,  206,  394,  394,  394,  394,  394,
+      392,  392,  393,  152,  242,  241,  394,  394,  394,  394,
+      394,  544,  364,  412,  412,  412,  412,  412,  412,  412,
+      412,  240,   89,  188,  224,  394,  394,  394,  394,  394,
       394,  398,  399,  400,  398,  398,  398,  398,  398,  401,
-      205,  203,  202,  402,  402,  402,  402,  402,  433,  345,
-      434,  434,  434,  434,  434,  434,  434,  434,  201,  442,
-      200,  199,  402,  402,  402,  402,  402,  402,  226,  152,
+      188,   95,   77,  402,  402,  402,  402,  402,  434,  345,
+      435,  435,  435,  435,  435,  435,  435,  435,  176,  443,
+      212,  209,  402,  402,  402,  402,  402,  402,  226,  152,
       410,  410,  410,  410,  410,  410,  410,  410,  364,  226,
-      152,  411,  411,  411,  411,  411,  411,  411,  411,  198,
-      226,  152,   95,  412,  412,  412,  412,  412,  424,  433,
-
-      364,  435,  435,  435,  435,  435,  435,  435,  435,  345,
-      422,   77,  412,  412,  412,  412,  412,  412,  424,  477,
-      424,  425,  433,  459,  436,  436,  436,  436,  436,  437,
-      434,  434,  480,  480,  480,  480,  480,  481,   87,   73,
-      426,   77,  427,  427,  427,  427,  427,  427,  427,  427,
-      402,  402,  402,  402,  402,  402,  402,  402,  444,  444,
-      444,  444,  444,  444,  444,  444,   77,  176,  137,  138,
-      132,   73,  426,  537,  428,  428,  428,  428,  428,  428,
-      428,  428,  537,  477,  443,  443,  443,  443,  443,  443,
-      443,  443,  452,  453,  454,  452,  452,  452,  452,  452,
-
-      132,  124,  174,   73,  426,  345,  429,  429,  429,  429,
-      429,  430,  431,  431,  403,  477,  404,  404,  404,  404,
-      404,  404,  404,  404,  403,  117,  404,  404,  404,  404,
-      404,  404,  404,  404,  424,   73,  426,  167,  432,  432,
-      432,  427,  427,  427,  427,  427,  403,  166,  404,  404,
-      404,  404,  404,  404,  424,  165,  424,  424,  164,  426,
-      163,  469,  469,  469,  161,  160,  156,   73,  345,   95,
-      440,  440,  440,  440,  440,  440,  440,  440,  393,  345,
-       72,  441,  441,  441,  441,  441,  441,  441,  441,  442,
-       73,   95,  145,  443,  443,  443,  443,  443,  465,  466,
-
-      467,  465,  465,  465,  465,  465,  510,  510,  510,  510,
-      510,  511,  443,  443,  443,  443,  443,  443,  447,  448,
-      449,  447,  447,  447,  447,  447,  450,   73,   83,   81,
-      451,  451,  451,  451,  451,  470,  471,  472,  470,  470,
-      470,  470,  470,  526,  526,  526,  526,  526,  526,  451,
-      451,  451,  451,  451,  451,  226,  152,  457,  457,  457,
-      457,  457,  457,  457,  457,  426,   77,  431,  431,  431,
-      431,  431,  431,  431,  431,  433,   75,  434,  434,  434,
-      434,  434,  434,  434,  434,  433,   74,  434,  434,  434,
-      434,  434,  434,  434,  434,   73,   73,  426,  138,  431,
-
-      431,  431,  431,  431,  431,  431,  431,  433,  132,  434,
-      434,  434,  434,  434,  434,  451,  451,  451,  451,  451,
-      451,  451,  451,  124,  117,  116,  115,  114,   73,  426,
-      113,  431,  431,  431,  431,  431,  431,  468,  468,  479,
-      479,  479,  479,  479,  479,  479,  479,  537,  112,  478,
-      478,  478,  478,  478,  478,  478,  478,  101,  100,   99,
-       73,  426,   98,  468,  468,  468,  468,  468,  468,  468,
-      468,  152,  486,  486,  486,  486,  486,  486,  486,  486,
-      152,  487,  487,  487,  487,  487,  487,  487,  487,   95,
-       83,   81,   73,  345,   75,  475,  475,  475,  475,  475,
-
-      475,  475,  475,  442,  345,   74,  476,  476,  476,  476,
-      476,  476,  476,  476,  477,   73,  537,  537,  478,  478,
-      478,  478,  478,  152,  488,  488,  488,  488,  488,  489,
-      486,  486,  469,  469,  469,  537,  537,  478,  478,  478,
-      478,  478,  478,  482,  483,  484,  482,  482,  482,  482,
-      482,  537,  537,  537,  537,  485,  485,  485,  485,  485,
-      461,   73,  461,  537,  461,  537,  461,  461,  537,  537,
-      461,  537,  537,  537,  485,  485,  485,  485,  485,  485,
-      537,  537,  461,  461,  461,  463,  537,  463,  537,  463,
-      537,  463,  463,  537,  537,  463,  468,  468,  468,  468,
-
-      468,  468,  468,  468,  537,  537,  537,  463,  463,  463,
-      494,  537,  495,  495,  495,  495,  495,  495,  495,  495,
-      537,  537,  537,  537,  499,   73,  500,  500,  500,  500,
-      500,  500,  500,  500,  152,  486,  486,  486,  486,  486,
-      486,   73,  494,  537,  496,  496,  496,  496,  496,  496,
-      496,  496,  499,  537,  501,  501,  501,  501,  501,  501,
-      501,  501,  499,  537,  502,  502,  502,  502,  502,  503,
-      500,  500,  537,   73,  494,  537,  497,  497,  497,  497,
-      497,  498,  495,  495,  485,  485,  485,  485,  485,  485,
-      485,  485,  509,  509,  509,  509,  509,  509,  509,  509,
-
-      537,  537,  537,  537,  537,   73,  345,  537,  506,  506,
-      506,  506,  506,  506,  506,  506,  477,  345,  537,  507,
-      507,  507,  507,  507,  507,  507,  507,  537,  537,  537,
-      537,  508,  508,  508,  508,  508,  537,  537,  508,  508,
-      508,  508,  508,  508,  508,  508,  537,  537,  537,  537,
-      508,  508,  508,  508,  508,  508,  152,  486,  486,  486,
-      486,  486,  486,  486,  486,  152,  486,  486,  486,  486,
-      486,  486,  486,  486,  512,  513,  514,  512,  512,  512,
-      512,  512,  537,  494,  537,  495,  495,  495,  495,  495,
-      495,  515,  516,  517,  515,  515,  515,  515,  515,  537,
-
-      537,  537,  537,   73,  494,  537,  495,  495,  495,  495,
-      495,  495,  495,  495,   73,  499,  537,  500,  500,  500,
-      500,  500,  500,  500,  500,  499,  537,  500,  500,  500,
-      500,  500,  500,  500,  500,   73,  494,  537,  495,  495,
-      495,  495,  495,  495,  495,  495,  499,  537,  500,  500,
-      500,  500,  500,  500,  345,  537,  520,  520,  520,  520,
-      520,  520,  520,  520,  537,  537,  537,   73,  521,  537,
-      522,  522,  522,  522,  522,  522,  522,  522,  526,  526,
-      526,  526,  526,  526,  526,  526,  527,  527,  527,  527,
-      527,  527,  527,  527,  537,  537,  537,  537,  537,   73,
-
-      521,  537,  523,  523,  523,  523,  523,  523,  523,  523,
-      528,  528,  528,  528,  528,  529,  526,  526,  531,  532,
-      533,  531,  531,  531,  531,  531,  537,  537,  537,  537,
-      537,   73,  521,  537,  524,  524,  524,  524,  524,  525,
-      522,  522,  537,  537,  537,  537,  521,   73,  522,  522,
-      522,  522,  522,  522,  526,  526,  526,  526,  526,  526,
-      526,  526,  537,   73,  521,  537,  522,  522,  522,  522,
-      522,  522,  522,  522,  537,  537,  537,   73,  526,  526,
-      526,  526,  526,  526,  526,  526,  534,  534,  534,  534,
-      534,  534,  534,  534,  537,   73,  521,  537,  522,  522,
-
-      522,  522,  522,  522,  522,  522,  531,  531,  531,  531,
-      531,  531,  531,  531,  537,   73,  535,  535,  535,  535,
-      535,  536,  534,  534,  537,  537,  537,   73,  534,  534,
-      534,  534,  534,  534,  537,   73,  534,  534,  534,  534,
-      534,  534,  534,  534,  537,   73,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,   73,  537,  537,
-      537,  537,  537,  537,  537,   73,   51,   51,   51,   51,
+      152,  411,  411,  411,  411,  411,  411,  411,  411,  208,
+      226,  152,  207,  412,  412,  412,  412,  412,  425,  434,
+
+      364,  436,  436,  436,  436,  436,  436,  436,  436,  345,
+      422,   77,  412,  412,  412,  412,  412,  412,  425,  479,
+      425,  426,  434,  460,  437,  437,  437,  437,  437,  438,
+      435,  435,  482,  482,  482,  482,  482,  483,  206,   73,
+      427,  205,  428,  428,  428,  428,  428,  428,  428,  428,
+      402,  402,  402,  402,  402,  402,  402,  402,  445,  445,
+      445,  445,  445,  445,  445,  445,  203,  202,  201,  200,
+      199,   73,  427,  544,  429,  429,  429,  429,  429,  429,
+      429,  429,  544,  479,  444,  444,  444,  444,  444,  444,
+      444,  444,  453,  454,  455,  453,  453,  453,  453,  453,
+
+      198,   95,   87,   73,  427,  345,  430,  430,  430,  430,
+      430,  431,  432,  432,  403,  479,  404,  404,  404,  404,
+      404,  404,  404,  404,  403,   77,  404,  404,  404,  404,
+      404,  404,  404,  404,  425,   73,  427,   77,  433,  433,
+      433,  428,  428,  428,  428,  428,  403,  176,  404,  404,
+      404,  404,  404,  404,  425,  137,  425,  425,  138,  427,
+      132,  471,  471,  471,  132,  124,  174,   73,  345,  117,
+      441,  441,  441,  441,  441,  441,  441,  441,  393,  345,
+      167,  442,  442,  442,  442,  442,  442,  442,  442,  443,
+       73,  166,  165,  444,  444,  444,  444,  444,  467,  468,
+
+      469,  467,  467,  467,  467,  467,  513,  513,  513,  513,
+      513,  514,  444,  444,  444,  444,  444,  444,  448,  449,
+      450,  448,  448,  448,  448,  448,  451,   73,  164,  163,
+      452,  452,  452,  452,  452,  472,  473,  474,  472,  472,
+      472,  472,  472,  531,  531,  531,  531,  531,  531,  452,
+      452,  452,  452,  452,  452,  226,  152,  458,  458,  458,
+      458,  458,  458,  458,  458,  427,  161,  432,  432,  432,
+      432,  432,  432,  432,  432,  434,  160,  435,  435,  435,
+      435,  435,  435,  435,  435,  434,  156,  435,  435,  435,
+      435,  435,  435,  435,  435,   95,   73,  427,   72,  432,
+
+      432,  432,  432,  432,  432,  432,  432,  434,   95,  435,
+      435,  435,  435,  435,  435,  452,  452,  452,  452,  452,
+      452,  452,  452,  145,   83,   81,   77,   75,   73,  427,
+       74,  432,  432,  432,  432,  432,  432,  470,  470,  481,
+      481,  481,  481,  481,  481,  481,  481,  544,   73,  480,
+      480,  480,  480,  480,  480,  480,  480,  138,  132,  124,
+       73,  427,  117,  470,  470,  470,  470,  470,  470,  470,
+      470,  152,  488,  488,  488,  488,  488,  488,  488,  488,
+      152,  489,  489,  489,  489,  489,  489,  489,  489,  116,
+      115,  114,   73,  345,  113,  477,  477,  477,  477,  477,
+
+      477,  477,  477,  443,  345,  112,  478,  478,  478,  478,
+      478,  478,  478,  478,  479,  101,  100,   99,  480,  480,
+      480,  480,  480,  152,  490,  490,  490,  490,  490,  491,
+      488,  488,  471,  471,  471,   98,   95,  480,  480,  480,
+      480,  480,  480,  484,  485,  486,  484,  484,  484,  484,
+      484,   83,  515,   77,   81,  487,  487,  487,  487,  487,
+      463,   73,  463,   75,  463,  525,  463,  463,   74,   73,
+      463,  544,  544,  544,  487,  487,  487,  487,  487,  487,
+      544,  544,  463,  463,  463,  465,  544,  465,  544,  465,
+      544,  465,  465,  544,  544,  465,  470,  470,  470,  470,
+
+      470,  470,  470,  470,  544,  544,  544,  465,  465,  465,
+      497,  544,  498,  498,  498,  498,  498,  498,  498,  498,
+      544,  544,  544,  544,  502,   73,  503,  503,  503,  503,
+      503,  503,  503,  503,  152,  488,  488,  488,  488,  488,
+      488,   73,  497,  544,  499,  499,  499,  499,  499,  499,
+      499,  499,  502,  544,  504,  504,  504,  504,  504,  504,
+      504,  504,  502,  544,  505,  505,  505,  505,  505,  506,
+      503,  503,  544,   73,  497,  544,  500,  500,  500,  500,
+      500,  501,  498,  498,  487,  487,  487,  487,  487,  487,
+      487,  487,  512,  512,  512,  512,  512,  512,  512,  512,
+
+      544,  544,  544,  544,  544,   73,  345,  544,  509,  509,
+      509,  509,  509,  509,  509,  509,  479,  345,  544,  510,
+      510,  510,  510,  510,  510,  510,  510,  544,  544,  544,
+      544,  511,  511,  511,  511,  511,  544,  544,  511,  511,
+      511,  511,  511,  511,  511,  511,  544,  544,  544,  544,
+      511,  511,  511,  511,  511,  511,  152,  488,  488,  488,
+      488,  488,  488,  488,  488,  152,  488,  488,  488,  488,
+      488,  488,  488,  488,  516,  517,  518,  516,  516,  516,
+      516,  516,  544,  497,  544,  498,  498,  498,  498,  498,
+      498,  519,  520,  521,  519,  519,  519,  519,  519,  544,
+
+      544,  544,  544,   73,  497,  544,  498,  498,  498,  498,
+      498,  498,  498,  498,   73,  502,  544,  503,  503,  503,
+      503,  503,  503,  503,  503,  502,  544,  503,  503,  503,
+      503,  503,  503,  503,  503,   73,  497,  544,  498,  498,
+      498,  498,  498,  498,  498,  498,  502,  544,  503,  503,
+      503,  503,  503,  503,  345,  544,  524,  524,  524,  524,
+      524,  524,  524,  524,  544,  544,  544,   73,  526,  544,
+      527,  527,  527,  527,  527,  527,  527,  527,  531,  531,
+      531,  531,  531,  531,  531,  531,  532,  532,  532,  532,
+      532,  532,  532,  532,  544,  544,  544,  544,  544,   73,
+
+      526,  544,  528,  528,  528,  528,  528,  528,  528,  528,
+      533,  533,  533,  533,  533,  534,  531,  531,  538,  539,
+      540,  538,  538,  538,  538,  538,  544,  544,  544,  544,
+      544,   73,  526,  544,  529,  529,  529,  529,  529,  530,
+      527,  527,  544,  544,  544,  544,  526,   73,  527,  527,
+      527,  527,  527,  527,  531,  531,  531,  531,  531,  531,
+      531,  531,  544,   73,  526,  544,  527,  527,  527,  527,
+      527,  527,  527,  527,  544,  544,  544,   73,  531,  531,
+      531,  531,  531,  531,  531,  531,  541,  541,  541,  541,
+      541,  541,  541,  541,  544,   73,  526,  544,  527,  527,
+
+      527,  527,  527,  527,  527,  527,  538,  538,  538,  538,
+      538,  538,  538,  538,  544,   73,  542,  542,  542,  542,
+      542,  543,  541,  541,  544,  544,  544,   73,  541,  541,
+      541,  541,  541,  541,  544,   73,  541,  541,  541,  541,
+      541,  541,  541,  541,  544,   73,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,   73,  544,  544,
+      544,  544,  544,  544,  544,   73,   51,   51,   51,   51,
        51,   51,   51,   51,   51,   51,   51,   51,   51,   30,
        30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
        30,   30,   60,   60,   60,   60,   60,   60,   60,   60,
 
        60,   60,   60,   60,   60,   67,   67,   67,   67,   67,
-       67,   67,   67,   67,   67,   67,   67,   67,   72,  537,
-      537,  537,   72,  537,   72,   72,   72,  537,   72,   72,
+       67,   67,   67,   67,   67,   67,   67,   67,   72,  544,
+      544,  544,   72,  544,   72,   72,   72,  544,   72,   72,
        72,   76,   76,   76,   76,   76,   76,   76,   76,   76,
-       76,   76,   76,   76,   80,  537,  537,  537,   80,  537,
-       80,   80,   80,  537,   80,   80,   80,   82,  537,  537,
-      537,   82,  537,   82,   82,   82,  537,   82,   82,   82,
-       84,  537,  537,   84,   84,  537,   84,   84,   84,  537,
-       84,   84,   84,   94,   94,  537,  537,   94,  119,  537,
-      537,  119,  119,  537,  119,  119,  119,  537,  119,  119,
-
-      119,  123,  537,  537,  123,  123,  123,  123,  123,  123,
-      537,  537,  123,  123,  130,  130,  131,  537,  537,  131,
-      537,  537,  131,  131,  131,  131,  131,  131,  131,  135,
+       76,   76,   76,   76,   80,  544,  544,  544,   80,  544,
+       80,   80,   80,  544,   80,   80,   80,   82,  544,  544,
+      544,   82,  544,   82,   82,   82,  544,   82,   82,   82,
+       84,  544,  544,   84,   84,  544,   84,   84,   84,  544,
+       84,   84,   84,   94,   94,  544,  544,   94,  119,  544,
+      544,  119,  119,  544,  119,  119,  119,  544,  119,  119,
+
+      119,  123,  544,  544,  123,  123,  123,  123,  123,  123,
+      544,  544,  123,  123,  130,  130,  131,  544,  544,  131,
+      544,  544,  131,  131,  131,  131,  131,  131,  131,  135,
       135,  135,  135,  135,  135,  135,  135,  135,  135,  135,
-      135,  135,  137,  137,  537,  137,  537,  137,  137,  137,
+      135,  135,  137,  137,  544,  137,  544,  137,  137,  137,
       137,  137,  137,  137,  137,  143,  143,  143,  143,  143,
       143,  143,  143,  143,  143,  143,  143,  143,  144,  144,
-      537,  144,  144,  144,  144,  144,  144,  144,  144,  144,
-      144,   85,  537,  537,   85,   85,  537,   85,   85,   85,
-      537,   85,   85,   85,  151,  151,  537,  537,  151,  153,
+      544,  144,  144,  144,  144,  144,  144,  144,  144,  144,
+      144,   85,  544,  544,   85,   85,  544,   85,   85,   85,
+      544,   85,   85,   85,  151,  151,  544,  544,  151,  153,
 
-      153,  153,  537,  537,  153,  120,  537,  537,  120,  120,
-      537,  120,  120,  120,  537,  120,  120,  120,  177,  177,
+      153,  153,  544,  544,  153,  120,  544,  544,  120,  120,
+      544,  120,  120,  120,  544,  120,  120,  120,  177,  177,
       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  184,  184,  537,  537,  184,  190,  190,  190,  537,
-      537,  190,  218,  218,  537,  537,  218,  219,  219,  537,
-      537,  219,  223,  223,  537,  537,  223,  225,  225,  225,
-      537,  537,  225,  258,  258,  537,  537,  258,  260,  260,
-      537,  537,  260,  261,  261,  537,  537,  261,  263,  263,
-      263,  537,  537,  263,  267,  267,  267,  267,  537,  537,
-      267,  295,  295,  537,  537,  295,  296,  296,  537,  537,
-
-      296,  297,  297,  537,  537,  297,  309,  309,  309,  537,
-      537,  309,  310,  310,  310,  310,  537,  537,  310,  343,
-      343,  537,  537,  343,  344,  344,  537,  537,  344,  360,
-      360,  360,  537,  537,  360,  361,  361,  361,  361,  537,
-      537,  361,  386,  386,  537,  537,  386,  390,  537,  390,
-      390,  537,  537,  390,  408,  408,  408,  537,  537,  408,
-      409,  409,  409,  409,  537,  537,  409,  438,  438,  537,
-      537,  438,  439,  537,  439,  439,  537,  537,  439,  455,
-      455,  455,  537,  537,  455,  456,  456,  456,  537,  537,
-      537,  456,  461,  537,  537,  537,  461,  537,  461,  461,
-
-      461,  537,  461,  461,  461,  463,  537,  537,  537,  463,
-      537,  463,  463,  463,  537,  463,  463,  463,  473,  473,
-      537,  537,  473,  474,  537,  474,  474,  537,  537,  474,
-      490,  490,  537,  537,  537,  490,  492,  492,  492,  492,
-      492,  492,  492,  492,  492,  492,  492,  492,  492,  504,
-      504,  537,  537,  504,  505,  537,  505,  505,  537,  537,
-      505,  518,  518,  537,  537,  518,  519,  537,  519,  537,
-      537,  537,  519,  530,  537,  537,  537,  530,   13,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537
+      177,  184,  184,  544,  544,  184,  190,  190,  190,  544,
+      544,  190,  218,  218,  544,  544,  218,  219,  219,  544,
+      544,  219,  223,  223,  544,  544,  223,  225,  225,  225,
+      544,  544,  225,  258,  258,  544,  544,  258,  260,  260,
+      544,  544,  260,  261,  261,  544,  544,  261,  263,  263,
+      263,  544,  544,  263,  267,  267,  267,  267,  544,  544,
+      267,  295,  295,  544,  544,  295,  296,  296,  544,  544,
+
+      296,  297,  297,  544,  544,  297,  309,  309,  309,  544,
+      544,  309,  310,  310,  310,  310,  544,  544,  310,  343,
+      343,  544,  544,  343,  344,  344,  544,  544,  344,  360,
+      360,  360,  544,  544,  360,  361,  361,  361,  361,  544,
+      544,  361,  386,  386,  544,  544,  386,  390,  544,  390,
+      390,  544,  544,  390,  408,  408,  408,  544,  544,  408,
+      409,  409,  409,  409,  544,  544,  409,  439,  439,  544,
+      544,  439,  440,  544,  440,  440,  544,  544,  440,  456,
+      456,  456,  544,  544,  456,  457,  457,  457,  544,  544,
+      544,  457,  463,  544,  544,  544,  463,  544,  463,  463,
+
+      463,  544,  463,  463,  463,  465,  544,  544,  544,  465,
+      544,  465,  465,  465,  544,  465,  465,  465,  475,  475,
+      544,  544,  475,  476,  544,  476,  476,  544,  544,  476,
+      492,  492,  544,  544,  544,  492,  494,  494,  494,  494,
+      494,  494,  494,  494,  494,  494,  494,  494,  494,  507,
+      507,  544,  544,  507,  508,  544,  508,  508,  544,  544,
+      508,  522,  522,  544,  544,  522,  523,  544,  523,  544,
+      544,  544,  523,  535,  544,  544,  544,  535,  536,  536,
+      536,  536,  536,  536,  536,  536,  536,  536,  536,  536,
+      536,   13,  544,  544,  544,  544,  544,  544,  544,  544,
+
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544
     } ;
 
-static yyconst short int yy_chk[3442] =
+static yyconst short int yy_chk[3455] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -939,9 +943,9 @@ static yyconst short int yy_chk[3442] =
        26,   26,  104,   71,   71,   12,   71,  104,  111,   68,
        69,   24,   27,   27,   27,   27,   27,   27,   38,  112,
        38,   38,   38,   38,   38,   38,   38,   38,   40,  102,
-      534,  112,    7,    7,    7,    7,    7,    7,    7,    7,
+      541,  112,    7,    7,    7,    7,    7,    7,    7,    7,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
-        8,    8,    8,  116,    8,  520,   40,   40,  122,  116,
+        8,    8,    8,  116,    8,  536,   40,   40,  122,  116,
 
        40,  169,  111,  122,   40,   48,  169,   40,   48,   48,
        48,   48,   48,   48,   48,   48,   78,   78,   78,   78,
@@ -955,17 +959,17 @@ static yyconst short int yy_chk[3442] =
       141,  153,  213,  162,    9,   10,   10,   10,   10,   10,
 
        49,   84,  168,  171,   10,   10,   10,   73,   56,   73,
-      140,   73,  518,   73,   73,  139,  508,   73,   10,  171,
+      140,   73,  525,   73,   73,  139,  461,   73,   10,  171,
        84,   87,   87,   87,   87,   87,   87,   87,   87,   73,
        73,   73,   93,   93,   93,   93,   93,   93,   10,   18,
        91,   91,   91,   91,   91,   91,   91,   91,  168,   18,
        87,  140,   18,   18,   18,   18,   18,   18,   18,   18,
        25,  179,   25,   25,   25,   25,   25,   25,   25,   25,
-       25,  210,  507,  173,   25,   25,   25,   25,   25,   92,
+       25,  210,  461,  173,   25,   25,   25,   25,   25,   92,
        92,   92,   92,   92,   92,   92,   92,  173,  175,  183,
       250,   25,  179,   25,   25,   25,   25,   25,   25,   31,
 
-      204,  175,  198,   31,  505,   31,  204,  250,   31,   31,
+      204,  175,  198,   31,  524,   31,  204,  250,   31,   31,
       183,   31,   31,   31,   31,   31,   31,   31,   31,   31,
        31,   31,   31,  210,  198,   31,   31,   31,   31,   31,
        31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
@@ -974,7 +978,7 @@ static yyconst short int yy_chk[3442] =
        31,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       187,  187,  187,   33,   33,   33,   33,   33,  118,  118,
       118,  118,  118,  118,  118,  118,  211,  211,  288,  136,
-      136,  504,   33,   33,   33,   33,   33,   33,   37,   37,
+      136,  522,   33,   33,   33,   33,   33,   33,   37,   37,
 
        37,  190,   37,  254,   37,   37,  214,   81,   37,   81,
       190,   81,  214,   81,   81,  339,  225,   81,  227,  227,
@@ -982,324 +986,325 @@ static yyconst short int yy_chk[3442] =
        81,   81,  136,   41,  254,  288,   41,   41,   41,   41,
        41,   41,   41,   41,   83,  339,   83,  212,   83,  238,
        83,   83,  105,  105,   83,   86,  105,   86,  336,   86,
-      105,   86,   86,  105,  212,   86,   83,   83,   83,  500,
-      229,  229,  492,  336,   41,   57,  245,   86,   86,   86,
+      105,   86,   86,  105,  212,   86,   83,   83,   83,  511,
+      229,  229,  510,  336,   41,   57,  245,   86,   86,   86,
       229,  245,  119,  249,  280,   57,  119,  119,   57,   57,
        57,   57,   57,   57,   57,   57,   88,   88,   88,   88,
 
-       88,   88,   88,   88,  119,  490,  280,  334,   88,   88,
+       88,   88,   88,   88,  119,  508,  280,  334,   88,   88,
        88,   88,   88,  128,  128,  128,  128,  128,  128,  128,
-      128,  252,  486,  119,  351,  351,  252,   88,   88,   88,
+      128,  252,  507,  119,  351,  351,  252,   88,   88,   88,
        88,   88,   88,   96,   96,   96,   96,   96,   96,   96,
        96,  283,  249,  290,  263,   96,   96,   96,   96,   96,
-      121,  474,  121,  263,  121,  334,  121,  121,  284,  290,
+      121,  503,  121,  263,  121,  334,  121,  121,  284,  290,
       121,  267,  285,  283,   96,   96,   96,   96,   96,   96,
       267,  285,  121,  121,  121,  132,  289,  145,  132,  132,
       284,  145,  291,  268,  268,  132,  289,  145,  309,  323,
-      327,  291,  174,  268,  378,  378,  174,  309,  132,  145,
+      327,  291,  174,  268,  397,  397,  174,  309,  132,  145,
 
       145,  146,  174,  146,  146,  146,  146,  146,  146,  146,
-      146,  323,  327,  473,  174,  174,  178,  178,  178,  178,
+      146,  323,  327,  494,  174,  174,  178,  178,  178,  178,
       178,  178,  178,  178,  182,  310,  182,  182,  182,  182,
       182,  182,  146,  147,  310,  147,  147,  147,  147,  147,
-      147,  147,  147,  463,  329,  178,  186,  186,  186,  186,
+      147,  147,  147,  492,  329,  178,  186,  186,  186,  186,
       186,  186,  186,  186,  186,  182,  191,  191,  191,  191,
       191,  191,  191,  191,  147,  148,  329,  148,  148,  148,
       148,  148,  148,  148,  148,  193,  193,  193,  193,  193,
       193,  193,  193,  194,  194,  194,  194,  194,  194,  235,
-      235,  235,  235,  235,  235,  461,  148,  149,  460,  149,
+      235,  235,  235,  235,  235,  488,  148,  149,  476,  149,
 
-      149,  149,  149,  149,  149,  149,  149,  269,  269,  459,
+      149,  149,  149,  149,  149,  149,  149,  269,  269,  475,
       331,  149,  149,  149,  149,  149,  196,  269,  196,  196,
-      196,  196,  196,  196,  196,  196,  331,  397,  397,  337,
+      196,  196,  196,  196,  196,  196,  331,  411,  411,  337,
       149,  149,  149,  149,  149,  149,  152,  152,  152,  152,
-      152,  152,  152,  152,  152,  337,  411,  411,  152,  152,
+      152,  152,  152,  152,  152,  337,  412,  412,  152,  152,
       152,  152,  152,  220,  220,  220,  220,  220,  220,  220,
-      220,  220,  373,  374,  379,  458,  379,  152,  152,  152,
+      220,  220,  373,  374,  379,  465,  379,  152,  152,  152,
       152,  152,  152,  154,  154,  154,  154,  154,  154,  154,
-      154,  154,  154,  456,  373,  374,  154,  154,  154,  154,
+      154,  154,  154,  463,  373,  374,  154,  154,  154,  154,
       154,  226,  226,  226,  226,  226,  226,  226,  226,  277,
 
       277,  277,  277,  277,  277,  154,  154,  154,  154,  154,
-      154,  155,  155,  155,  155,  155,  155,  155,  155,  412,
-      412,  415,  415,  155,  155,  155,  155,  155,  228,  228,
-      228,  228,  228,  228,  228,  228,  446,  446,  439,  271,
-      271,  438,  155,  155,  155,  155,  155,  155,  180,  271,
+      154,  155,  155,  155,  155,  155,  155,  155,  155,  415,
+      415,  424,  462,  155,  155,  155,  155,  155,  228,  228,
+      228,  228,  228,  228,  228,  228,  424,  447,  447,  271,
+      271,  460,  155,  155,  155,  155,  155,  155,  180,  271,
       180,  180,  180,  180,  180,  180,  180,  180,  232,  232,
-      232,  232,  232,  232,  232,  232,  434,  346,  232,  234,
-      234,  234,  234,  234,  234,  234,  234,  346,  425,  180,
+      232,  232,  232,  232,  232,  232,  459,  346,  232,  234,
+      234,  234,  234,  234,  234,  234,  234,  346,  457,  180,
       181,  348,  181,  181,  181,  181,  181,  181,  181,  181,
       237,  348,  237,  237,  237,  237,  237,  237,  237,  237,
 
       311,  311,  253,  253,  253,  253,  253,  253,  253,  253,
       311,  181,  192,  192,  192,  192,  192,  192,  192,  192,
-      192,  192,  192,  312,  312,  424,  192,  192,  192,  192,
+      192,  192,  192,  312,  312,  440,  192,  192,  192,  192,
       192,  253,  257,  312,  257,  257,  257,  257,  257,  257,
-      416,  457,  457,  481,  481,  192,  192,  192,  192,  192,
+      416,  458,  458,  483,  483,  192,  192,  192,  192,  192,
       192,  195,  195,  195,  195,  195,  195,  195,  195,  195,
       195,  335,  416,  257,  195,  195,  195,  195,  195,  264,
-      335,  264,  264,  264,  264,  264,  264,  264,  264,  420,
-      314,  314,  404,  195,  195,  195,  195,  195,  195,  215,
+      335,  264,  264,  264,  264,  264,  264,  264,  264,  439,
+      314,  314,  435,  195,  195,  195,  195,  195,  195,  215,
       314,  215,  215,  215,  215,  215,  215,  215,  215,  265,
 
       418,  265,  265,  265,  265,  265,  265,  265,  265,  266,
       360,  266,  266,  266,  266,  266,  266,  266,  266,  360,
       215,  216,  418,  216,  216,  216,  216,  216,  216,  216,
       216,  270,  270,  270,  270,  270,  270,  270,  270,  274,
-      274,  274,  274,  274,  274,  274,  274,  511,  511,  274,
-      390,  427,  216,  217,  386,  217,  217,  217,  217,  217,
+      274,  274,  274,  274,  274,  274,  274,  496,  496,  274,
+      426,  428,  216,  217,  425,  217,  217,  217,  217,  217,
       217,  217,  217,  276,  276,  276,  276,  276,  276,  276,
       276,  279,  361,  279,  279,  279,  279,  279,  279,  279,
-      279,  361,  427,  381,  217,  230,  230,  230,  230,  230,
+      279,  361,  428,  420,  217,  230,  230,  230,  230,  230,
       230,  230,  230,  230,  230,  230,  233,  233,  233,  233,
 
-      233,  233,  233,  233,  233,  233,  233,  377,  376,  375,
+      233,  233,  233,  233,  233,  233,  233,  514,  514,  404,
       233,  233,  233,  233,  233,  298,  298,  298,  298,  298,
       298,  298,  298,  301,  301,  301,  301,  301,  301,  233,
       233,  233,  233,  233,  233,  236,  236,  236,  236,  236,
-      236,  236,  236,  236,  236,  344,  343,  333,  236,  236,
+      236,  236,  236,  236,  236,  390,  386,  381,  236,  236,
       236,  236,  236,  300,  300,  300,  300,  300,  300,  300,
       300,  320,  320,  320,  320,  320,  320,  236,  236,  236,
       236,  236,  236,  255,  391,  255,  255,  255,  255,  255,
       255,  255,  255,  303,  391,  303,  303,  303,  303,  303,
       303,  303,  303,  304,  304,  304,  304,  304,  304,  304,
 
-      304,  332,  326,  325,  255,  256,  392,  256,  256,  256,
+      304,  377,  376,  375,  255,  256,  392,  256,  256,  256,
       256,  256,  256,  256,  256,  306,  392,  306,  306,  306,
       306,  306,  306,  306,  306,  307,  408,  307,  307,  307,
       307,  307,  307,  307,  307,  408,  256,  262,  262,  262,
-      262,  262,  262,  262,  262,  262,  409,  305,  297,  262,
+      262,  262,  262,  262,  262,  262,  409,  423,  344,  262,
       262,  262,  262,  262,  308,  409,  308,  308,  308,  308,
       308,  308,  354,  354,  354,  354,  354,  354,  262,  262,
       262,  262,  262,  262,  272,  272,  272,  272,  272,  272,
       272,  272,  272,  272,  272,  275,  275,  275,  275,  275,
-      275,  275,  275,  275,  275,  275,  296,  295,  287,  275,
+      275,  275,  275,  275,  275,  275,  343,  333,  423,  275,
 
       275,  275,  275,  275,  313,  313,  313,  313,  313,  313,
       313,  313,  371,  371,  371,  371,  371,  371,  275,  275,
       275,  275,  275,  275,  278,  278,  278,  278,  278,  278,
-      278,  278,  278,  278,  286,  423,  282,  278,  278,  278,
+      278,  278,  278,  278,  332,  326,  325,  278,  278,  278,
       278,  278,  317,  317,  317,  317,  317,  317,  317,  317,
-      423,  281,  317,  261,  260,  259,  278,  278,  278,  278,
+      305,  297,  317,  296,  378,  378,  278,  278,  278,  278,
       278,  278,  292,  292,  292,  292,  292,  292,  292,  292,
       292,  319,  319,  319,  319,  319,  319,  319,  319,  322,
-      394,  322,  322,  322,  322,  322,  322,  322,  322,  495,
-      394,  522,  292,  293,  293,  293,  293,  293,  293,  293,
+      394,  322,  322,  322,  322,  322,  322,  322,  322,  498,
+      394,  527,  292,  293,  293,  293,  293,  293,  293,  293,
 
-      293,  293,  258,  248,  338,  338,  338,  338,  338,  338,
-      338,  338,  342,  342,  342,  342,  342,  342,  342,  247,
-      495,  246,  522,  293,  294,  294,  294,  294,  294,  294,
+      293,  293,  378,  295,  338,  338,  338,  338,  338,  338,
+      338,  338,  342,  342,  342,  342,  342,  342,  342,  287,
+      498,  286,  527,  293,  294,  294,  294,  294,  294,  294,
       294,  294,  294,  338,  345,  345,  345,  345,  345,  345,
       345,  345,  342,  347,  347,  347,  347,  347,  347,  347,
-      347,  244,  243,  242,  294,  299,  440,  299,  299,  299,
-      299,  299,  299,  299,  299,  299,  440,  241,  240,  299,
+      347,  282,  281,  261,  294,  299,  441,  299,  299,  299,
+      299,  299,  299,  299,  299,  299,  441,  260,  259,  299,
       299,  299,  299,  299,  353,  353,  353,  353,  353,  353,
       353,  353,  400,  400,  400,  400,  400,  400,  299,  299,
       299,  299,  299,  299,  302,  302,  302,  302,  302,  302,
 
-      302,  302,  302,  224,  223,  222,  302,  302,  302,  302,
-      302,  356,  441,  356,  356,  356,  356,  356,  356,  356,
-      356,  221,  441,  219,  218,  302,  302,  302,  302,  302,
+      302,  302,  302,  258,  248,  247,  302,  302,  302,  302,
+      302,  356,  442,  356,  356,  356,  356,  356,  356,  356,
+      356,  246,  442,  244,  243,  302,  302,  302,  302,  302,
       302,  315,  315,  315,  315,  315,  315,  315,  315,  315,
       315,  315,  318,  318,  318,  318,  318,  318,  318,  318,
-      318,  318,  318,  209,  208,  207,  318,  318,  318,  318,
-      318,  357,  443,  357,  357,  357,  357,  357,  357,  357,
-      357,  206,  443,  205,  203,  318,  318,  318,  318,  318,
+      318,  318,  318,  242,  241,  240,  318,  318,  318,  318,
+      318,  357,  444,  357,  357,  357,  357,  357,  357,  357,
+      357,  224,  444,  223,  222,  318,  318,  318,  318,  318,
       318,  321,  321,  321,  321,  321,  321,  321,  321,  321,
-      362,  362,  202,  201,  321,  321,  321,  321,  321,  358,
+      362,  362,  221,  219,  321,  321,  321,  321,  321,  358,
 
-      362,  358,  358,  358,  358,  358,  358,  358,  358,  200,
-      199,  197,  189,  321,  321,  321,  321,  321,  321,  340,
-      340,  340,  340,  340,  340,  340,  340,  340,  359,  188,
+      362,  358,  358,  358,  358,  358,  358,  358,  358,  218,
+      209,  208,  207,  321,  321,  321,  321,  321,  321,  340,
+      340,  340,  340,  340,  340,  340,  340,  340,  359,  206,
       359,  359,  359,  359,  359,  359,  359,  359,  363,  363,
       364,  364,  364,  364,  364,  364,  364,  364,  363,  340,
       341,  341,  341,  341,  341,  341,  341,  341,  341,  365,
       365,  368,  368,  368,  368,  368,  368,  368,  368,  365,
-      185,  368,  370,  370,  370,  370,  370,  370,  370,  370,
-      341,  349,  184,  349,  349,  349,  349,  349,  349,  349,
-      349,  349,  352,  177,  352,  352,  352,  352,  352,  352,
+      205,  368,  370,  370,  370,  370,  370,  370,  370,  370,
+      341,  349,  203,  349,  349,  349,  349,  349,  349,  349,
+      349,  349,  352,  202,  352,  352,  352,  352,  352,  352,
 
-      352,  352,  352,  455,  176,  170,  352,  352,  352,  352,
-      352,  372,  455,  372,  372,  372,  372,  372,  372,  372,
-      372,  167,  166,  165,  164,  352,  352,  352,  352,  352,
+      352,  352,  352,  456,  201,  200,  352,  352,  352,  352,
+      352,  372,  456,  372,  372,  372,  372,  372,  372,  372,
+      372,  199,  197,  189,  188,  352,  352,  352,  352,  352,
       352,  355,  355,  355,  355,  355,  355,  355,  355,  355,
-      163,  161,  160,  355,  355,  355,  355,  355,  387,  475,
-      387,  387,  387,  387,  387,  387,  387,  387,  159,  475,
-      158,  157,  355,  355,  355,  355,  355,  355,  366,  366,
+      185,  184,  177,  355,  355,  355,  355,  355,  387,  477,
+      387,  387,  387,  387,  387,  387,  387,  387,  176,  477,
+      170,  167,  355,  355,  355,  355,  355,  355,  366,  366,
       366,  366,  366,  366,  366,  366,  366,  366,  366,  369,
-      369,  369,  369,  369,  369,  369,  369,  369,  369,  156,
-      410,  410,  151,  369,  369,  369,  369,  369,  380,  388,
+      369,  369,  369,  369,  369,  369,  369,  369,  369,  166,
+      410,  410,  165,  369,  369,  369,  369,  369,  380,  388,
 
-      410,  388,  388,  388,  388,  388,  388,  388,  388,  476,
-      422,  422,  369,  369,  369,  369,  369,  369,  380,  476,
+      410,  388,  388,  388,  388,  388,  388,  388,  388,  478,
+      422,  422,  369,  369,  369,  369,  369,  369,  380,  478,
       380,  380,  389,  422,  389,  389,  389,  389,  389,  389,
-      389,  389,  449,  449,  449,  449,  449,  449,  150,  380,
-      382,  144,  382,  382,  382,  382,  382,  382,  382,  382,
+      389,  389,  450,  450,  450,  450,  450,  450,  164,  380,
+      382,  163,  382,  382,  382,  382,  382,  382,  382,  382,
       393,  393,  393,  393,  393,  393,  393,  393,  399,  399,
-      399,  399,  399,  399,  399,  399,  143,  142,  138,  137,
-      135,  382,  383,  478,  383,  383,  383,  383,  383,  383,
-      383,  383,  402,  478,  402,  402,  402,  402,  402,  402,
+      399,  399,  399,  399,  399,  399,  161,  160,  159,  158,
+      157,  382,  383,  480,  383,  383,  383,  383,  383,  383,
+      383,  383,  402,  480,  402,  402,  402,  402,  402,  402,
       402,  402,  403,  403,  403,  403,  403,  403,  403,  403,
 
-      131,  124,  120,  383,  384,  506,  384,  384,  384,  384,
-      384,  384,  384,  384,  405,  506,  405,  405,  405,  405,
-      405,  405,  405,  405,  406,  117,  406,  406,  406,  406,
-      406,  406,  406,  406,  421,  384,  385,  110,  385,  385,
-      385,  385,  385,  385,  385,  385,  407,  109,  407,  407,
-      407,  407,  407,  407,  421,  108,  421,  421,  107,  432,
-      106,  432,  432,  432,  101,  100,   98,  385,  395,   94,
+      156,  151,  150,  383,  384,  509,  384,  384,  384,  384,
+      384,  384,  384,  384,  405,  509,  405,  405,  405,  405,
+      405,  405,  405,  405,  406,  144,  406,  406,  406,  406,
+      406,  406,  406,  406,  421,  384,  385,  143,  385,  385,
+      385,  385,  385,  385,  385,  385,  407,  142,  407,  407,
+      407,  407,  407,  407,  421,  138,  421,  421,  137,  433,
+      135,  433,  433,  433,  131,  124,  120,  385,  395,  117,
       395,  395,  395,  395,  395,  395,  395,  395,  395,  398,
-       90,  398,  398,  398,  398,  398,  398,  398,  398,  398,
-      432,   89,   85,  398,  398,  398,  398,  398,  426,  426,
-
-      426,  426,  426,  426,  426,  426,  484,  484,  484,  484,
-      484,  484,  398,  398,  398,  398,  398,  398,  401,  401,
-      401,  401,  401,  401,  401,  401,  401,  426,   82,   80,
-      401,  401,  401,  401,  401,  433,  433,  433,  433,  433,
-      433,  433,  433,  529,  529,  529,  529,  529,  529,  401,
+      110,  398,  398,  398,  398,  398,  398,  398,  398,  398,
+      433,  109,  108,  398,  398,  398,  398,  398,  427,  427,
+
+      427,  427,  427,  427,  427,  427,  486,  486,  486,  486,
+      486,  486,  398,  398,  398,  398,  398,  398,  401,  401,
+      401,  401,  401,  401,  401,  401,  401,  427,  107,  106,
+      401,  401,  401,  401,  401,  434,  434,  434,  434,  434,
+      434,  434,  434,  534,  534,  534,  534,  534,  534,  401,
       401,  401,  401,  401,  401,  413,  413,  413,  413,  413,
-      413,  413,  413,  413,  413,  428,   76,  428,  428,  428,
-      428,  428,  428,  428,  428,  435,   75,  435,  435,  435,
-      435,  435,  435,  435,  435,  436,   74,  436,  436,  436,
-      436,  436,  436,  436,  436,   72,  428,  429,   67,  429,
-
-      429,  429,  429,  429,  429,  429,  429,  437,   60,  437,
-      437,  437,  437,  437,  437,  442,  442,  442,  442,  442,
-      442,  442,  442,   53,   47,   46,   45,   44,  429,  430,
-       43,  430,  430,  430,  430,  430,  430,  430,  430,  448,
-      448,  448,  448,  448,  448,  448,  448,  451,   42,  451,
-      451,  451,  451,  451,  451,  451,  451,   36,   35,   34,
-      430,  431,   32,  431,  431,  431,  431,  431,  431,  431,
-      431,  452,  452,  452,  452,  452,  452,  452,  452,  452,
-      453,  453,  453,  453,  453,  453,  453,  453,  453,   28,
-       22,   19,  431,  444,   17,  444,  444,  444,  444,  444,
-
-      444,  444,  444,  444,  447,   15,  447,  447,  447,  447,
-      447,  447,  447,  447,  447,   14,   13,    0,  447,  447,
-      447,  447,  447,  454,  454,  454,  454,  454,  454,  454,
-      454,  454,  469,  469,  469,    0,    0,  447,  447,  447,
-      447,  447,  447,  450,  450,  450,  450,  450,  450,  450,
-      450,    0,    0,    0,    0,  450,  450,  450,  450,  450,
-      462,  469,  462,    0,  462,    0,  462,  462,    0,    0,
-      462,    0,    0,    0,  450,  450,  450,  450,  450,  450,
-        0,    0,  462,  462,  462,  464,    0,  464,    0,  464,
-        0,  464,  464,    0,    0,  464,  468,  468,  468,  468,
-
-      468,  468,  468,  468,    0,    0,    0,  464,  464,  464,
-      465,    0,  465,  465,  465,  465,  465,  465,  465,  465,
-        0,    0,    0,    0,  470,  468,  470,  470,  470,  470,
-      470,  470,  470,  470,  489,  489,  489,  489,  489,  489,
-      489,  465,  466,    0,  466,  466,  466,  466,  466,  466,
-      466,  466,  471,    0,  471,  471,  471,  471,  471,  471,
-      471,  471,  472,    0,  472,  472,  472,  472,  472,  472,
-      472,  472,    0,  466,  467,    0,  467,  467,  467,  467,
-      467,  467,  467,  467,  477,  477,  477,  477,  477,  477,
-      477,  477,  483,  483,  483,  483,  483,  483,  483,  483,
-
-        0,    0,    0,    0,    0,  467,  479,    0,  479,  479,
-      479,  479,  479,  479,  479,  479,  479,  482,    0,  482,
-      482,  482,  482,  482,  482,  482,  482,    0,    0,    0,
-        0,  482,  482,  482,  482,  482,  485,    0,  485,  485,
-      485,  485,  485,  485,  485,  485,    0,    0,    0,    0,
-      482,  482,  482,  482,  482,  482,  487,  487,  487,  487,
-      487,  487,  487,  487,  487,  488,  488,  488,  488,  488,
-      488,  488,  488,  488,  494,  494,  494,  494,  494,  494,
-      494,  494,    0,  498,    0,  498,  498,  498,  498,  498,
-      498,  499,  499,  499,  499,  499,  499,  499,  499,    0,
-
-        0,    0,    0,  494,  496,    0,  496,  496,  496,  496,
-      496,  496,  496,  496,  498,  501,    0,  501,  501,  501,
-      501,  501,  501,  501,  501,  502,    0,  502,  502,  502,
-      502,  502,  502,  502,  502,  496,  497,    0,  497,  497,
-      497,  497,  497,  497,  497,  497,  503,    0,  503,  503,
-      503,  503,  503,  503,  509,    0,  509,  509,  509,  509,
-      509,  509,  509,  509,    0,    0,    0,  497,  512,    0,
-      512,  512,  512,  512,  512,  512,  512,  512,  515,  515,
-      515,  515,  515,  515,  515,  515,  516,  516,  516,  516,
-      516,  516,  516,  516,    0,    0,    0,    0,    0,  512,
-
-      513,    0,  513,  513,  513,  513,  513,  513,  513,  513,
-      517,  517,  517,  517,  517,  517,  517,  517,  521,  521,
-      521,  521,  521,  521,  521,  521,    0,    0,    0,    0,
-        0,  513,  514,    0,  514,  514,  514,  514,  514,  514,
-      514,  514,    0,    0,    0,    0,  525,  521,  525,  525,
-      525,  525,  525,  525,  527,  527,  527,  527,  527,  527,
-      527,  527,    0,  514,  523,    0,  523,  523,  523,  523,
-      523,  523,  523,  523,    0,    0,    0,  525,  528,  528,
-      528,  528,  528,  528,  528,  528,  531,  531,  531,  531,
-      531,  531,  531,  531,    0,  523,  524,    0,  524,  524,
-
-      524,  524,  524,  524,  524,  524,  532,  532,  532,  532,
-      532,  532,  532,  532,    0,  531,  533,  533,  533,  533,
-      533,  533,  533,  533,    0,    0,    0,  524,  536,  536,
-      536,  536,  536,  536,    0,  532,  535,  535,  535,  535,
-      535,  535,  535,  535,    0,  533,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  536,    0,    0,
-        0,    0,    0,    0,    0,  535,  538,  538,  538,  538,
-      538,  538,  538,  538,  538,  538,  538,  538,  538,  539,
-      539,  539,  539,  539,  539,  539,  539,  539,  539,  539,
-      539,  539,  540,  540,  540,  540,  540,  540,  540,  540,
-
-      540,  540,  540,  540,  540,  541,  541,  541,  541,  541,
-      541,  541,  541,  541,  541,  541,  541,  541,  542,    0,
-        0,    0,  542,    0,  542,  542,  542,    0,  542,  542,
-      542,  543,  543,  543,  543,  543,  543,  543,  543,  543,
-      543,  543,  543,  543,  544,    0,    0,    0,  544,    0,
-      544,  544,  544,    0,  544,  544,  544,  545,    0,    0,
-        0,  545,    0,  545,  545,  545,    0,  545,  545,  545,
-      546,    0,    0,  546,  546,    0,  546,  546,  546,    0,
-      546,  546,  546,  547,  547,    0,    0,  547,  548,    0,
-        0,  548,  548,    0,  548,  548,  548,    0,  548,  548,
-
-      548,  549,    0,    0,  549,  549,  549,  549,  549,  549,
-        0,    0,  549,  549,  550,  550,  551,    0,    0,  551,
-        0,    0,  551,  551,  551,  551,  551,  551,  551,  552,
-      552,  552,  552,  552,  552,  552,  552,  552,  552,  552,
-      552,  552,  553,  553,    0,  553,    0,  553,  553,  553,
-      553,  553,  553,  553,  553,  554,  554,  554,  554,  554,
-      554,  554,  554,  554,  554,  554,  554,  554,  555,  555,
-        0,  555,  555,  555,  555,  555,  555,  555,  555,  555,
-      555,  556,    0,    0,  556,  556,    0,  556,  556,  556,
-        0,  556,  556,  556,  557,  557,    0,    0,  557,  558,
-
-      558,  558,    0,    0,  558,  559,    0,    0,  559,  559,
-        0,  559,  559,  559,    0,  559,  559,  559,  560,  560,
-      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
-      560,  561,  561,    0,    0,  561,  562,  562,  562,    0,
-        0,  562,  563,  563,    0,    0,  563,  564,  564,    0,
-        0,  564,  565,  565,    0,    0,  565,  566,  566,  566,
-        0,    0,  566,  567,  567,    0,    0,  567,  568,  568,
-        0,    0,  568,  569,  569,    0,    0,  569,  570,  570,
-      570,    0,    0,  570,  571,  571,  571,  571,    0,    0,
-      571,  572,  572,    0,    0,  572,  573,  573,    0,    0,
-
-      573,  574,  574,    0,    0,  574,  575,  575,  575,    0,
-        0,  575,  576,  576,  576,  576,    0,    0,  576,  577,
-      577,    0,    0,  577,  578,  578,    0,    0,  578,  579,
-      579,  579,    0,    0,  579,  580,  580,  580,  580,    0,
-        0,  580,  581,  581,    0,    0,  581,  582,    0,  582,
-      582,    0,    0,  582,  583,  583,  583,    0,    0,  583,
-      584,  584,  584,  584,    0,    0,  584,  585,  585,    0,
-        0,  585,  586,    0,  586,  586,    0,    0,  586,  587,
-      587,  587,    0,    0,  587,  588,  588,  588,    0,    0,
-        0,  588,  589,    0,    0,    0,  589,    0,  589,  589,
-
-      589,    0,  589,  589,  589,  590,    0,    0,    0,  590,
-        0,  590,  590,  590,    0,  590,  590,  590,  591,  591,
-        0,    0,  591,  592,    0,  592,  592,    0,    0,  592,
-      593,  593,    0,    0,    0,  593,  594,  594,  594,  594,
-      594,  594,  594,  594,  594,  594,  594,  594,  594,  595,
-      595,    0,    0,  595,  596,    0,  596,  596,    0,    0,
-      596,  597,  597,    0,    0,  597,  598,    0,  598,    0,
-        0,    0,  598,  599,    0,    0,    0,  599,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537
+      413,  413,  413,  413,  413,  429,  101,  429,  429,  429,
+      429,  429,  429,  429,  429,  436,  100,  436,  436,  436,
+      436,  436,  436,  436,  436,  437,   98,  437,  437,  437,
+      437,  437,  437,  437,  437,   94,  429,  430,   90,  430,
+
+      430,  430,  430,  430,  430,  430,  430,  438,   89,  438,
+      438,  438,  438,  438,  438,  443,  443,  443,  443,  443,
+      443,  443,  443,   85,   82,   80,   76,   75,  430,  431,
+       74,  431,  431,  431,  431,  431,  431,  431,  431,  449,
+      449,  449,  449,  449,  449,  449,  449,  452,   72,  452,
+      452,  452,  452,  452,  452,  452,  452,   67,   60,   53,
+      431,  432,   47,  432,  432,  432,  432,  432,  432,  432,
+      432,  453,  453,  453,  453,  453,  453,  453,  453,  453,
+      454,  454,  454,  454,  454,  454,  454,  454,  454,   46,
+       45,   44,  432,  445,   43,  445,  445,  445,  445,  445,
+
+      445,  445,  445,  445,  448,   42,  448,  448,  448,  448,
+      448,  448,  448,  448,  448,   36,   35,   34,  448,  448,
+      448,  448,  448,  455,  455,  455,  455,  455,  455,  455,
+      455,  455,  471,  471,  471,   32,   28,  448,  448,  448,
+      448,  448,  448,  451,  451,  451,  451,  451,  451,  451,
+      451,   22,  515,  515,   19,  451,  451,  451,  451,  451,
+      464,  471,  464,   17,  464,  515,  464,  464,   15,   14,
+      464,   13,    0,    0,  451,  451,  451,  451,  451,  451,
+        0,    0,  464,  464,  464,  466,    0,  466,    0,  466,
+        0,  466,  466,    0,    0,  466,  470,  470,  470,  470,
+
+      470,  470,  470,  470,    0,    0,    0,  466,  466,  466,
+      467,    0,  467,  467,  467,  467,  467,  467,  467,  467,
+        0,    0,    0,    0,  472,  470,  472,  472,  472,  472,
+      472,  472,  472,  472,  491,  491,  491,  491,  491,  491,
+      491,  467,  468,    0,  468,  468,  468,  468,  468,  468,
+      468,  468,  473,    0,  473,  473,  473,  473,  473,  473,
+      473,  473,  474,    0,  474,  474,  474,  474,  474,  474,
+      474,  474,    0,  468,  469,    0,  469,  469,  469,  469,
+      469,  469,  469,  469,  479,  479,  479,  479,  479,  479,
+      479,  479,  485,  485,  485,  485,  485,  485,  485,  485,
+
+        0,    0,    0,    0,    0,  469,  481,    0,  481,  481,
+      481,  481,  481,  481,  481,  481,  481,  484,    0,  484,
+      484,  484,  484,  484,  484,  484,  484,    0,    0,    0,
+        0,  484,  484,  484,  484,  484,  487,    0,  487,  487,
+      487,  487,  487,  487,  487,  487,    0,    0,    0,    0,
+      484,  484,  484,  484,  484,  484,  489,  489,  489,  489,
+      489,  489,  489,  489,  489,  490,  490,  490,  490,  490,
+      490,  490,  490,  490,  497,  497,  497,  497,  497,  497,
+      497,  497,    0,  501,    0,  501,  501,  501,  501,  501,
+      501,  502,  502,  502,  502,  502,  502,  502,  502,    0,
+
+        0,    0,    0,  497,  499,    0,  499,  499,  499,  499,
+      499,  499,  499,  499,  501,  504,    0,  504,  504,  504,
+      504,  504,  504,  504,  504,  505,    0,  505,  505,  505,
+      505,  505,  505,  505,  505,  499,  500,    0,  500,  500,
+      500,  500,  500,  500,  500,  500,  506,    0,  506,  506,
+      506,  506,  506,  506,  512,    0,  512,  512,  512,  512,
+      512,  512,  512,  512,    0,    0,    0,  500,  516,    0,
+      516,  516,  516,  516,  516,  516,  516,  516,  519,  519,
+      519,  519,  519,  519,  519,  519,  520,  520,  520,  520,
+      520,  520,  520,  520,    0,    0,    0,    0,    0,  516,
+
+      517,    0,  517,  517,  517,  517,  517,  517,  517,  517,
+      521,  521,  521,  521,  521,  521,  521,  521,  526,  526,
+      526,  526,  526,  526,  526,  526,    0,    0,    0,    0,
+        0,  517,  518,    0,  518,  518,  518,  518,  518,  518,
+      518,  518,    0,    0,    0,    0,  530,  526,  530,  530,
+      530,  530,  530,  530,  532,  532,  532,  532,  532,  532,
+      532,  532,    0,  518,  528,    0,  528,  528,  528,  528,
+      528,  528,  528,  528,    0,    0,    0,  530,  533,  533,
+      533,  533,  533,  533,  533,  533,  538,  538,  538,  538,
+      538,  538,  538,  538,    0,  528,  529,    0,  529,  529,
+
+      529,  529,  529,  529,  529,  529,  539,  539,  539,  539,
+      539,  539,  539,  539,    0,  538,  540,  540,  540,  540,
+      540,  540,  540,  540,    0,    0,    0,  529,  543,  543,
+      543,  543,  543,  543,    0,  539,  542,  542,  542,  542,
+      542,  542,  542,  542,    0,  540,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  543,    0,    0,
+        0,    0,    0,    0,    0,  542,  545,  545,  545,  545,
+      545,  545,  545,  545,  545,  545,  545,  545,  545,  546,
+      546,  546,  546,  546,  546,  546,  546,  546,  546,  546,
+      546,  546,  547,  547,  547,  547,  547,  547,  547,  547,
+
+      547,  547,  547,  547,  547,  548,  548,  548,  548,  548,
+      548,  548,  548,  548,  548,  548,  548,  548,  549,    0,
+        0,    0,  549,    0,  549,  549,  549,    0,  549,  549,
+      549,  550,  550,  550,  550,  550,  550,  550,  550,  550,
+      550,  550,  550,  550,  551,    0,    0,    0,  551,    0,
+      551,  551,  551,    0,  551,  551,  551,  552,    0,    0,
+        0,  552,    0,  552,  552,  552,    0,  552,  552,  552,
+      553,    0,    0,  553,  553,    0,  553,  553,  553,    0,
+      553,  553,  553,  554,  554,    0,    0,  554,  555,    0,
+        0,  555,  555,    0,  555,  555,  555,    0,  555,  555,
+
+      555,  556,    0,    0,  556,  556,  556,  556,  556,  556,
+        0,    0,  556,  556,  557,  557,  558,    0,    0,  558,
+        0,    0,  558,  558,  558,  558,  558,  558,  558,  559,
+      559,  559,  559,  559,  559,  559,  559,  559,  559,  559,
+      559,  559,  560,  560,    0,  560,    0,  560,  560,  560,
+      560,  560,  560,  560,  560,  561,  561,  561,  561,  561,
+      561,  561,  561,  561,  561,  561,  561,  561,  562,  562,
+        0,  562,  562,  562,  562,  562,  562,  562,  562,  562,
+      562,  563,    0,    0,  563,  563,    0,  563,  563,  563,
+        0,  563,  563,  563,  564,  564,    0,    0,  564,  565,
+
+      565,  565,    0,    0,  565,  566,    0,    0,  566,  566,
+        0,  566,  566,  566,    0,  566,  566,  566,  567,  567,
+      567,  567,  567,  567,  567,  567,  567,  567,  567,  567,
+      567,  568,  568,    0,    0,  568,  569,  569,  569,    0,
+        0,  569,  570,  570,    0,    0,  570,  571,  571,    0,
+        0,  571,  572,  572,    0,    0,  572,  573,  573,  573,
+        0,    0,  573,  574,  574,    0,    0,  574,  575,  575,
+        0,    0,  575,  576,  576,    0,    0,  576,  577,  577,
+      577,    0,    0,  577,  578,  578,  578,  578,    0,    0,
+      578,  579,  579,    0,    0,  579,  580,  580,    0,    0,
+
+      580,  581,  581,    0,    0,  581,  582,  582,  582,    0,
+        0,  582,  583,  583,  583,  583,    0,    0,  583,  584,
+      584,    0,    0,  584,  585,  585,    0,    0,  585,  586,
+      586,  586,    0,    0,  586,  587,  587,  587,  587,    0,
+        0,  587,  588,  588,    0,    0,  588,  589,    0,  589,
+      589,    0,    0,  589,  590,  590,  590,    0,    0,  590,
+      591,  591,  591,  591,    0,    0,  591,  592,  592,    0,
+        0,  592,  593,    0,  593,  593,    0,    0,  593,  594,
+      594,  594,    0,    0,  594,  595,  595,  595,    0,    0,
+        0,  595,  596,    0,    0,    0,  596,    0,  596,  596,
+
+      596,    0,  596,  596,  596,  597,    0,    0,    0,  597,
+        0,  597,  597,  597,    0,  597,  597,  597,  598,  598,
+        0,    0,  598,  599,    0,  599,  599,    0,    0,  599,
+      600,  600,    0,    0,    0,  600,  601,  601,  601,  601,
+      601,  601,  601,  601,  601,  601,  601,  601,  601,  602,
+      602,    0,    0,  602,  603,    0,  603,  603,    0,    0,
+      603,  604,  604,    0,    0,  604,  605,    0,  605,    0,
+        0,    0,  605,  606,    0,    0,    0,  606,  607,  607,
+      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
+      607,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  544,  544
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1344,6 +1349,7 @@ char *yytext;
 
 #include <sys/types.h>
 #include <sys/param.h>
+#include <sys/stat.h>
 #include <stdio.h>
 #ifdef STDC_HEADERS
 # include <stdlib.h>
@@ -1367,6 +1373,7 @@ char *yytext;
 # include <malloc.h>
 #endif /* HAVE_MALLOC_H && !STDC_HEADERS */
 #include <ctype.h>
+#include <dirent.h>
 #include "sudo.h"
 #include "parse.h"
 #include <gram.h>
@@ -1386,15 +1393,16 @@ static int append               __P((char *, int));
 static int _fill               __P((char *, int, int));
 static int fill_cmnd           __P((char *, int));
 static int fill_args           __P((char *, int, int));
-static int switch_buffer       __P((char *));
+static int _push_include       __P((char *, int));
+static int pop_include         __P((void));
 static int ipv6_valid          __P((const char *s));
 static char *parse_include     __P((char *));
 extern void yyerror            __P((const char *));
 
 #define fill(a, b)             _fill(a, b, 0)
 
-#define        push_include(_p)        (switch_buffer((_p)))
-#define        pop_include()           (switch_buffer(NULL))
+#define        push_include(_p)        (_push_include((_p), FALSE))
+#define        push_includedir(_p)     (_push_include((_p), TRUE))
 
 /* realloc() to size + COMMANDARGINC to make room for command args */
 #define COMMANDARGINC  64
@@ -1415,7 +1423,7 @@ extern void yyerror               __P((const char *));
 
 #define INSTR 5
 
-#line 1419 "lex.yy.c"
+#line 1427 "lex.yy.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -1569,9 +1577,9 @@ YY_DECL
        register char *yy_cp, *yy_bp;
        register int yy_act;
 
-#line 113 "toke.l"
+#line 116 "toke.l"
 
-#line 1575 "lex.yy.c"
+#line 1583 "lex.yy.c"
 
        if ( yy_init )
                {
@@ -1623,13 +1631,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 538 )
+                               if ( yy_current_state >= 545 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 3379 );
+               while ( yy_base[yy_current_state] != 3392 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -1657,12 +1665,12 @@ do_action:      /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 114 "toke.l"
+#line 117 "toke.l"
 BEGIN STARTDEFS;
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 116 "toke.l"
+#line 119 "toke.l"
 {
                            BEGIN INDEFS;
                            LEXTRACE("DEFVAR ");
@@ -1674,7 +1682,7 @@ YY_RULE_SETUP
 
 case 3:
 YY_RULE_SETUP
-#line 125 "toke.l"
+#line 128 "toke.l"
 {
                            BEGIN STARTDEFS;
                            LEXTRACE(", ");
@@ -1683,7 +1691,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 131 "toke.l"
+#line 134 "toke.l"
 {
                            LEXTRACE("= ");
                            return('=');
@@ -1691,7 +1699,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 136 "toke.l"
+#line 139 "toke.l"
 {
                            LEXTRACE("+= ");
                            return('+');
@@ -1699,7 +1707,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 141 "toke.l"
+#line 144 "toke.l"
 {
                            LEXTRACE("-= ");
                            return('-');
@@ -1707,7 +1715,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 146 "toke.l"
+#line 149 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            yylval.string = NULL;
@@ -1716,7 +1724,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 152 "toke.l"
+#line 155 "toke.l"
 {
                            LEXTRACE("WORD(2) ");
                            if (!fill(yytext, yyleng))
@@ -1728,7 +1736,7 @@ YY_RULE_SETUP
 
 case 9:
 YY_RULE_SETUP
-#line 161 "toke.l"
+#line 164 "toke.l"
 {
                            /* Line continuation char followed by newline. */
                            ++sudolineno;
@@ -1737,7 +1745,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 167 "toke.l"
+#line 170 "toke.l"
 {
                            LEXTRACE("ENDSTR ");
                            BEGIN INDEFS;
@@ -1746,7 +1754,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 173 "toke.l"
+#line 176 "toke.l"
 {
                            LEXTRACE("BACKSLASH ");
                            if (!append(yytext, yyleng))
@@ -1755,7 +1763,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 179 "toke.l"
+#line 182 "toke.l"
 {
                            LEXTRACE("STRBODY ");
                            if (!append(yytext, yyleng))
@@ -1766,7 +1774,7 @@ YY_RULE_SETUP
 
 case 13:
 YY_RULE_SETUP
-#line 187 "toke.l"
+#line 190 "toke.l"
 {
                            /* quoted fnmatch glob char, pass verbatim */
                            LEXTRACE("QUOTEDCHAR ");
@@ -1777,7 +1785,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 195 "toke.l"
+#line 198 "toke.l"
 {
                            /* quoted sudoers special char, strip backslash */
                            LEXTRACE("QUOTEDCHAR ");
@@ -1788,7 +1796,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 203 "toke.l"
+#line 206 "toke.l"
 {
                            BEGIN INITIAL;
                            yyless(0);
@@ -1797,7 +1805,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 209 "toke.l"
+#line 212 "toke.l"
 {
                            LEXTRACE("ARG ");
                            if (!fill_args(yytext, yyleng, sawspace))
@@ -1808,7 +1816,7 @@ YY_RULE_SETUP
 
 case 17:
 YY_RULE_SETUP
-#line 217 "toke.l"
+#line 220 "toke.l"
 {
                            char *path;
 
@@ -1824,7 +1832,23 @@ YY_RULE_SETUP
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 230 "toke.l"
+#line 233 "toke.l"
+{
+                           char *path;
+
+                           if ((path = parse_include(yytext)) == NULL)
+                               yyterminate();
+
+                           LEXTRACE("INCLUDEDIR\n");
+
+                           /* Push current buffer and switch to include file */
+                           if (!push_includedir(path))
+                               yyterminate();
+                       }
+       YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 246 "toke.l"
 {
                            int n;
                            for (n = 0; isblank((unsigned char)yytext[n]); n++)
@@ -1854,9 +1878,9 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 19:
+case 20:
 YY_RULE_SETUP
-#line 259 "toke.l"
+#line 275 "toke.l"
 {
                            int n;
                            for (n = 0; isblank((unsigned char)yytext[n]); n++)
@@ -1877,59 +1901,59 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 20:
+case 21:
 YY_RULE_SETUP
-#line 279 "toke.l"
+#line 295 "toke.l"
 {
                                /* cmnd does not require passwd for this user */
                                LEXTRACE("NOPASSWD ");
                                return(NOPASSWD);
                        }
        YY_BREAK
-case 21:
+case 22:
 YY_RULE_SETUP
-#line 285 "toke.l"
+#line 301 "toke.l"
 {
                                /* cmnd requires passwd for this user */
                                LEXTRACE("PASSWD ");
                                return(PASSWD);
                        }
        YY_BREAK
-case 22:
+case 23:
 YY_RULE_SETUP
-#line 291 "toke.l"
+#line 307 "toke.l"
 {
                                LEXTRACE("NOEXEC ");
                                return(NOEXEC);
                        }
        YY_BREAK
-case 23:
+case 24:
 YY_RULE_SETUP
-#line 296 "toke.l"
+#line 312 "toke.l"
 {
                                LEXTRACE("EXEC ");
                                return(EXEC);
                        }
        YY_BREAK
-case 24:
+case 25:
 YY_RULE_SETUP
-#line 301 "toke.l"
+#line 317 "toke.l"
 {
                                LEXTRACE("SETENV ");
                                return(SETENV);
                        }
        YY_BREAK
-case 25:
+case 26:
 YY_RULE_SETUP
-#line 306 "toke.l"
+#line 322 "toke.l"
 {
                                LEXTRACE("NOSETENV ");
                                return(NOSETENV);
                        }
        YY_BREAK
-case 26:
+case 27:
 YY_RULE_SETUP
-#line 311 "toke.l"
+#line 327 "toke.l"
 {
                            /* netgroup */
                            if (!fill(yytext, yyleng))
@@ -1938,9 +1962,9 @@ YY_RULE_SETUP
                            return(NETGROUP);
                        }
        YY_BREAK
-case 27:
+case 28:
 YY_RULE_SETUP
-#line 319 "toke.l"
+#line 335 "toke.l"
 {
                            /* UN*X group */
                            if (!fill(yytext, yyleng))
@@ -1949,9 +1973,9 @@ YY_RULE_SETUP
                            return(USERGROUP);
                        }
        YY_BREAK
-case 28:
+case 29:
 YY_RULE_SETUP
-#line 327 "toke.l"
+#line 343 "toke.l"
 {
                            if (!fill(yytext, yyleng))
                                yyterminate();
@@ -1959,9 +1983,9 @@ YY_RULE_SETUP
                            return(NTWKADDR);
                        }
        YY_BREAK
-case 29:
+case 30:
 YY_RULE_SETUP
-#line 334 "toke.l"
+#line 350 "toke.l"
 {
                            if (!fill(yytext, yyleng))
                                yyterminate();
@@ -1969,9 +1993,9 @@ YY_RULE_SETUP
                            return(NTWKADDR);
                        }
        YY_BREAK
-case 30:
+case 31:
 YY_RULE_SETUP
-#line 341 "toke.l"
+#line 357 "toke.l"
 {
                            if (!ipv6_valid(yytext)) {
                                LEXTRACE("ERROR ");
@@ -1983,9 +2007,9 @@ YY_RULE_SETUP
                            return(NTWKADDR);
                        }
        YY_BREAK
-case 31:
+case 32:
 YY_RULE_SETUP
-#line 352 "toke.l"
+#line 368 "toke.l"
 {
                            if (!ipv6_valid(yytext)) {
                                LEXTRACE("ERROR ");
@@ -1997,9 +2021,9 @@ YY_RULE_SETUP
                            return(NTWKADDR);
                        }
        YY_BREAK
-case 32:
+case 33:
 YY_RULE_SETUP
-#line 363 "toke.l"
+#line 379 "toke.l"
 {
                            if (strcmp(yytext, "ALL") == 0) {
                                LEXTRACE("ALL ");
@@ -2022,9 +2046,9 @@ YY_RULE_SETUP
                            return(ALIAS);
                        }
        YY_BREAK
-case 33:
+case 34:
 YY_RULE_SETUP
-#line 385 "toke.l"
+#line 401 "toke.l"
 {
                            /* no command args allowed for Defaults!/path */
                            if (!fill_cmnd(yytext, yyleng))
@@ -2033,9 +2057,9 @@ YY_RULE_SETUP
                            return(COMMAND);
                        }
        YY_BREAK
-case 34:
+case 35:
 YY_RULE_SETUP
-#line 393 "toke.l"
+#line 409 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -2043,9 +2067,9 @@ YY_RULE_SETUP
                                yyterminate();
                        }                       /* sudo -e */
        YY_BREAK
-case 35:
+case 36:
 YY_RULE_SETUP
-#line 400 "toke.l"
+#line 416 "toke.l"
 {
                            /* directories can't have args... */
                            if (yytext[yyleng - 1] == '/') {
@@ -2061,9 +2085,9 @@ YY_RULE_SETUP
                            }
                        }                       /* a pathname */
        YY_BREAK
-case 36:
+case 37:
 YY_RULE_SETUP
-#line 415 "toke.l"
+#line 431 "toke.l"
 {
                            /* a word */
                            if (!fill(yytext, yyleng))
@@ -2072,57 +2096,57 @@ YY_RULE_SETUP
                            return(WORD);
                        }
        YY_BREAK
-case 37:
+case 38:
 YY_RULE_SETUP
-#line 423 "toke.l"
+#line 439 "toke.l"
 {
                            LEXTRACE("( ");
                            return ('(');
                        }
        YY_BREAK
-case 38:
+case 39:
 YY_RULE_SETUP
-#line 428 "toke.l"
+#line 444 "toke.l"
 {
                            LEXTRACE(") ");
                            return(')');
                        }
        YY_BREAK
-case 39:
+case 40:
 YY_RULE_SETUP
-#line 433 "toke.l"
+#line 449 "toke.l"
 {
                            LEXTRACE(", ");
                            return(',');
                        }                       /* return ',' */
        YY_BREAK
-case 40:
+case 41:
 YY_RULE_SETUP
-#line 438 "toke.l"
+#line 454 "toke.l"
 {
                            LEXTRACE("= ");
                            return('=');
                        }                       /* return '=' */
        YY_BREAK
-case 41:
+case 42:
 YY_RULE_SETUP
-#line 443 "toke.l"
+#line 459 "toke.l"
 {
                            LEXTRACE(": ");
                            return(':');
                        }                       /* return ':' */
        YY_BREAK
-case 42:
+case 43:
 YY_RULE_SETUP
-#line 448 "toke.l"
+#line 464 "toke.l"
 {
                            if (yyleng % 2 == 1)
                                return('!');    /* return '!' */
                        }
        YY_BREAK
-case 43:
+case 44:
 YY_RULE_SETUP
-#line 453 "toke.l"
+#line 469 "toke.l"
 {
                            BEGIN INITIAL;
                            ++sudolineno;
@@ -2130,25 +2154,25 @@ YY_RULE_SETUP
                            return(COMMENT);
                        }                       /* return newline */
        YY_BREAK
-case 44:
+case 45:
 YY_RULE_SETUP
-#line 460 "toke.l"
+#line 476 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = TRUE;    /* but remember for fill_args */
                        }
        YY_BREAK
-case 45:
+case 46:
 YY_RULE_SETUP
-#line 464 "toke.l"
+#line 480 "toke.l"
 {
                            sawspace = TRUE;    /* remember for fill_args */
                            ++sudolineno;
                            LEXTRACE("\n\t");
                        }                       /* throw away EOL after \ */
        YY_BREAK
-case 46:
+case 47:
 YY_RULE_SETUP
-#line 470 "toke.l"
+#line 486 "toke.l"
 {
                            BEGIN INITIAL;
                            ++sudolineno;
@@ -2156,9 +2180,9 @@ YY_RULE_SETUP
                            return(COMMENT);
                        }                       /* comment, not uid/gid */
        YY_BREAK
-case 47:
+case 48:
 YY_RULE_SETUP
-#line 477 "toke.l"
+#line 493 "toke.l"
 {
                            LEXTRACE("ERROR ");
                            return(ERROR);
@@ -2170,7 +2194,7 @@ case YY_STATE_EOF(GOTCMND):
 case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
 case YY_STATE_EOF(INSTR):
-#line 482 "toke.l"
+#line 498 "toke.l"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -2181,12 +2205,12 @@ case YY_STATE_EOF(INSTR):
                                yyterminate();
                        }
        YY_BREAK
-case 48:
+case 49:
 YY_RULE_SETUP
-#line 492 "toke.l"
+#line 508 "toke.l"
 ECHO;
        YY_BREAK
-#line 2190 "lex.yy.c"
+#line 2214 "lex.yy.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -2477,7 +2501,7 @@ static yy_state_type yy_get_previous_state()
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 538 )
+                       if ( yy_current_state >= 545 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2512,11 +2536,11 @@ yy_state_type yy_current_state;
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 538 )
+               if ( yy_current_state >= 545 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 537);
+       yy_is_jam = (yy_current_state == 544);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -3075,7 +3099,7 @@ int main()
        return 0;
        }
 #endif
-#line 492 "toke.l"
+#line 508 "toke.l"
 
 static int
 _fill(src, len, olen)
@@ -3192,63 +3216,228 @@ fill_args(s, len, addspace)
     return(TRUE);
 }
 
-struct sudoers_state {
+struct path_list {
+    char *path;
+    struct path_list *next;
+};
+
+struct include_stack {
     YY_BUFFER_STATE bs;
     char *path;
+    struct path_list *more; /* more files in case of includedir */
     int lineno;
+    int keepopen;
 };
 
+static int
+pl_compare(v1, v2)
+    const void *v1;
+    const void *v2;
+{
+    const struct path_list * const *p1 = v1;
+    const struct path_list * const *p2 = v2;
+
+    return(strcmp((*p1)->path, (*p2)->path));
+}
+
+static char *
+switch_dir(stack, dirpath)
+    struct include_stack *stack;
+    char *dirpath;
+{
+    DIR *dir;
+    int i, count = 0;
+    char *path = NULL;
+    struct dirent *dent;
+    struct stat sb;
+    struct path_list *pl, *first = NULL;
+    struct path_list **sorted = NULL;
+
+    if (!(dir = opendir(dirpath))) {
+       yyerror(dirpath);
+       return(FALSE);
+    }
+    while ((dent = readdir(dir))) {
+       /* Ignore visudo .tmp files. */
+       if (dent->d_namlen > 4 &&
+           strcmp(dent->d_name + dent->d_namlen - 4, ".tmp") == 0) {
+           continue;
+       }
+       if (asprintf(&path, "%s/%s", dirpath, dent->d_name) == -1) {
+           closedir(dir);
+           goto bad;
+       }
+       if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) {
+           efree(path);
+           continue;
+       }
+       pl = malloc(sizeof(*pl));
+       if (pl == NULL)
+           goto bad;
+       pl->path = path;
+       pl->next = first;
+       first = pl;
+       count++;
+    }
+    closedir(dir);
+
+    if (count == 0)
+       goto done;
+
+    /* Sort the list as an array. */
+    sorted = malloc(sizeof(*sorted) * count);
+    if (sorted == NULL)
+       goto bad;
+    pl = first;
+    for (i = 0; i < count; i++) {
+       sorted[i] = pl;
+       pl = pl->next;
+    }
+    qsort(sorted, count, sizeof(*sorted), pl_compare);
+
+    /* Apply sorting to the list. */
+    first = sorted[0];
+    sorted[count - 1]->next = NULL;
+    for (i = 1; i < count; i++)
+       sorted[i - 1]->next = sorted[i];
+    efree(sorted);
+
+    /* Pull out the first element for parsing, leave the rest for later. */
+    if (count) {
+       path = first->path;
+       pl = first->next;
+       efree(first);
+       stack->more = pl;
+    } else {
+       path = NULL;
+    }
+done:
+    efree(dirpath);
+    return(path);
+bad:
+    while (first != NULL) {
+       pl = first;
+       first = pl->next;
+       free(pl->path);
+       free(pl);
+    }
+    efree(sorted);
+    efree(dirpath);
+    efree(path);
+    return(NULL);
+}
+
 #define MAX_SUDOERS_DEPTH      128
 #define SUDOERS_STACK_INCREMENT        16
 
+static size_t istacksize, idepth;
+static struct include_stack *istack;
+static int keepopen;
+
+void
+init_lexer()
+{
+    struct path_list *pl;
+
+    while (idepth) {
+       idepth--;
+       while ((pl = istack[idepth].more) != NULL) {
+           istack[idepth].more = pl->next;
+           efree(pl->path);
+           efree(pl);
+       }
+       efree(istack[idepth].path);
+       if (!istack[idepth].keepopen)
+           fclose(istack[idepth].bs->yy_input_file);
+       yy_delete_buffer(istack[idepth].bs);
+    }
+    efree(istack);
+    istack = NULL;
+    istacksize = idepth = 0;
+    keepopen = FALSE;
+}
+
 static int
-switch_buffer(path)
+_push_include(path, isdir)
     char *path;
+    int isdir;
 {
-    static size_t stacksize, depth;
-    static struct sudoers_state *state;
-    static int keepopen;
     FILE *fp;
 
-    if (path != NULL) {
-       /* push current state */
-       if (depth >= stacksize) {
-           if (depth > MAX_SUDOERS_DEPTH) {
-               yyerror("too many levels of includes");
-               return(FALSE);
-           }
-           stacksize += SUDOERS_STACK_INCREMENT;
-           state = (struct sudoers_state *) realloc(state,
-               sizeof(state) * stacksize);
-           if (state == NULL) {
-               yyerror("unable to allocate memory");
-               return(FALSE);
-           }
+    /* push current state onto stack */
+    if (idepth >= istacksize) {
+       if (idepth > MAX_SUDOERS_DEPTH) {
+           yyerror("too many levels of includes");
+           return(FALSE);
        }
-       if ((fp = open_sudoers(path, &keepopen)) == NULL) {
+       istacksize += SUDOERS_STACK_INCREMENT;
+       istack = (struct include_stack *) realloc(istack,
+           sizeof(istack) * istacksize);
+       if (istack == NULL) {
+           yyerror("unable to allocate memory");
+           return(FALSE);
+       }
+    }
+    if (isdir) {
+       if (!(path = switch_dir(&istack[idepth], path))) {
            yyerror(path);
            return(FALSE);
        }
-       state[depth].bs = YY_CURRENT_BUFFER;
-       state[depth].path = sudoers;
-       state[depth].lineno = sudolineno;
-       depth++;
+       if ((fp = open_sudoers(path, FALSE, &keepopen)) == NULL) {
+           yyerror(path);
+           return(FALSE); /* XXX - just to go next one? */
+       }
+    } else {
+       if ((fp = open_sudoers(path, TRUE, &keepopen)) == NULL) {
+           yyerror(path);
+           return(FALSE);
+       }
+       istack[idepth].more = NULL;
+    }
+    /* Push the old (current) file and open the new one. */
+    istack[idepth].path = sudoers; /* push old path */
+    istack[idepth].bs = YY_CURRENT_BUFFER;
+    istack[idepth].lineno = sudolineno;
+    istack[idepth].keepopen = keepopen;
+    idepth++;
+    sudolineno = 1;
+    sudoers = path;
+    yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE));
+
+    return(TRUE);
+}
+
+static int
+pop_include()
+{
+    struct path_list *pl;
+    FILE *fp;
+
+    if (idepth == 0)
+       return(FALSE);
+
+    if (!keepopen)
+       fclose(YY_CURRENT_BUFFER->yy_input_file);
+    yy_delete_buffer(YY_CURRENT_BUFFER);
+    keepopen = FALSE;
+    if ((pl = istack[idepth - 1].more) != NULL) {
+       /* Move to next file in the dir. */
+       istack[idepth - 1].more = pl->next;
+       if ((fp = open_sudoers(pl->path, FALSE, &keepopen)) == NULL) {
+           yyerror(pl->path);
+           return(FALSE); /* XXX - just to go next one? */
+       }
+       efree(sudoers);
+       sudoers = pl->path;
        sudolineno = 1;
-       sudoers = path;
        yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE));
+       efree(pl);
     } else {
-       /* pop */
-       if (depth == 0)
-           return(FALSE);
-       depth--;
-       if (!keepopen)
-           fclose(YY_CURRENT_BUFFER->yy_input_file);
-       yy_delete_buffer(YY_CURRENT_BUFFER);
-       yy_switch_to_buffer(state[depth].bs);
+       idepth--;
+       yy_switch_to_buffer(istack[idepth].bs);
        efree(sudoers);
-       sudoers = state[depth].path;
-       sudolineno = state[depth].lineno;
-       keepopen = FALSE;
+       sudoers = istack[idepth].path;
+       sudolineno = istack[idepth].lineno;
     }
     return(TRUE);
 }
@@ -3263,6 +3452,8 @@ parse_include(base)
 
     /* Pull out path from #include line. */
     cp = base + sizeof("#include");
+    if (*cp == 'i')
+       cp += 3; /* includedir */
     while (isblank((unsigned char) *cp))
        cp++;
     ep = cp;
diff --git a/toke.l b/toke.l
index 90a5100b4bab0be209fe40e1a50ecb3d66a46dee..6d8199138bfde324290c221377b6ed526dfe5b82 100644 (file)
--- a/toke.l
+++ b/toke.l
@@ -27,6 +27,7 @@
 
 #include <sys/types.h>
 #include <sys/param.h>
+#include <sys/stat.h>
 #include <stdio.h>
 #ifdef STDC_HEADERS
 # include <stdlib.h>
@@ -50,6 +51,7 @@
 # include <malloc.h>
 #endif /* HAVE_MALLOC_H && !STDC_HEADERS */
 #include <ctype.h>
+#include <dirent.h>
 #include "sudo.h"
 #include "parse.h"
 #include <gram.h>
@@ -69,15 +71,16 @@ static int append           __P((char *, int));
 static int _fill               __P((char *, int, int));
 static int fill_cmnd           __P((char *, int));
 static int fill_args           __P((char *, int, int));
-static int switch_buffer       __P((char *));
+static int _push_include       __P((char *, int));
+static int pop_include         __P((void));
 static int ipv6_valid          __P((const char *s));
 static char *parse_include     __P((char *));
 extern void yyerror            __P((const char *));
 
 #define fill(a, b)             _fill(a, b, 0)
 
-#define        push_include(_p)        (switch_buffer((_p)))
-#define        pop_include()           (switch_buffer(NULL))
+#define        push_include(_p)        (_push_include((_p), FALSE))
+#define        push_includedir(_p)     (_push_include((_p), TRUE))
 
 /* realloc() to size + COMMANDARGINC to make room for command args */
 #define COMMANDARGINC  64
@@ -227,6 +230,19 @@ DEFVAR                     [a-z_]+
                                yyterminate();
                        }
 
+<INITIAL>^#includedir[[:blank:]]+\/.*\n {
+                           char *path;
+
+                           if ((path = parse_include(yytext)) == NULL)
+                               yyterminate();
+
+                           LEXTRACE("INCLUDEDIR\n");
+
+                           /* Push current buffer and switch to include file */
+                           if (!push_includedir(path))
+                               yyterminate();
+                       }
+
 <INITIAL>^[[:blank:]]*Defaults([:@>\!]{WORD})? {
                            int n;
                            for (n = 0; isblank((unsigned char)yytext[n]); n++)
@@ -605,63 +621,228 @@ fill_args(s, len, addspace)
     return(TRUE);
 }
 
-struct sudoers_state {
+struct path_list {
+    char *path;
+    struct path_list *next;
+};
+
+struct include_stack {
     YY_BUFFER_STATE bs;
     char *path;
+    struct path_list *more; /* more files in case of includedir */
     int lineno;
+    int keepopen;
 };
 
+static int
+pl_compare(v1, v2)
+    const void *v1;
+    const void *v2;
+{
+    const struct path_list * const *p1 = v1;
+    const struct path_list * const *p2 = v2;
+
+    return(strcmp((*p1)->path, (*p2)->path));
+}
+
+static char *
+switch_dir(stack, dirpath)
+    struct include_stack *stack;
+    char *dirpath;
+{
+    DIR *dir;
+    int i, count = 0;
+    char *path = NULL;
+    struct dirent *dent;
+    struct stat sb;
+    struct path_list *pl, *first = NULL;
+    struct path_list **sorted = NULL;
+
+    if (!(dir = opendir(dirpath))) {
+       yyerror(dirpath);
+       return(FALSE);
+    }
+    while ((dent = readdir(dir))) {
+       /* Ignore visudo .tmp files. */
+       if (dent->d_namlen > 4 &&
+           strcmp(dent->d_name + dent->d_namlen - 4, ".tmp") == 0) {
+           continue;
+       }
+       if (asprintf(&path, "%s/%s", dirpath, dent->d_name) == -1) {
+           closedir(dir);
+           goto bad;
+       }
+       if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) {
+           efree(path);
+           continue;
+       }
+       pl = malloc(sizeof(*pl));
+       if (pl == NULL)
+           goto bad;
+       pl->path = path;
+       pl->next = first;
+       first = pl;
+       count++;
+    }
+    closedir(dir);
+
+    if (count == 0)
+       goto done;
+
+    /* Sort the list as an array. */
+    sorted = malloc(sizeof(*sorted) * count);
+    if (sorted == NULL)
+       goto bad;
+    pl = first;
+    for (i = 0; i < count; i++) {
+       sorted[i] = pl;
+       pl = pl->next;
+    }
+    qsort(sorted, count, sizeof(*sorted), pl_compare);
+
+    /* Apply sorting to the list. */
+    first = sorted[0];
+    sorted[count - 1]->next = NULL;
+    for (i = 1; i < count; i++)
+       sorted[i - 1]->next = sorted[i];
+    efree(sorted);
+
+    /* Pull out the first element for parsing, leave the rest for later. */
+    if (count) {
+       path = first->path;
+       pl = first->next;
+       efree(first);
+       stack->more = pl;
+    } else {
+       path = NULL;
+    }
+done:
+    efree(dirpath);
+    return(path);
+bad:
+    while (first != NULL) {
+       pl = first;
+       first = pl->next;
+       free(pl->path);
+       free(pl);
+    }
+    efree(sorted);
+    efree(dirpath);
+    efree(path);
+    return(NULL);
+}
+
 #define MAX_SUDOERS_DEPTH      128
 #define SUDOERS_STACK_INCREMENT        16
 
+static size_t istacksize, idepth;
+static struct include_stack *istack;
+static int keepopen;
+
+void
+init_lexer()
+{
+    struct path_list *pl;
+
+    while (idepth) {
+       idepth--;
+       while ((pl = istack[idepth].more) != NULL) {
+           istack[idepth].more = pl->next;
+           efree(pl->path);
+           efree(pl);
+       }
+       efree(istack[idepth].path);
+       if (!istack[idepth].keepopen)
+           fclose(istack[idepth].bs->yy_input_file);
+       yy_delete_buffer(istack[idepth].bs);
+    }
+    efree(istack);
+    istack = NULL;
+    istacksize = idepth = 0;
+    keepopen = FALSE;
+}
+
 static int
-switch_buffer(path)
+_push_include(path, isdir)
     char *path;
+    int isdir;
 {
-    static size_t stacksize, depth;
-    static struct sudoers_state *state;
-    static int keepopen;
     FILE *fp;
 
-    if (path != NULL) {
-       /* push current state */
-       if (depth >= stacksize) {
-           if (depth > MAX_SUDOERS_DEPTH) {
-               yyerror("too many levels of includes");
-               return(FALSE);
-           }
-           stacksize += SUDOERS_STACK_INCREMENT;
-           state = (struct sudoers_state *) realloc(state,
-               sizeof(state) * stacksize);
-           if (state == NULL) {
-               yyerror("unable to allocate memory");
-               return(FALSE);
-           }
+    /* push current state onto stack */
+    if (idepth >= istacksize) {
+       if (idepth > MAX_SUDOERS_DEPTH) {
+           yyerror("too many levels of includes");
+           return(FALSE);
        }
-       if ((fp = open_sudoers(path, &keepopen)) == NULL) {
+       istacksize += SUDOERS_STACK_INCREMENT;
+       istack = (struct include_stack *) realloc(istack,
+           sizeof(istack) * istacksize);
+       if (istack == NULL) {
+           yyerror("unable to allocate memory");
+           return(FALSE);
+       }
+    }
+    if (isdir) {
+       if (!(path = switch_dir(&istack[idepth], path))) {
            yyerror(path);
            return(FALSE);
        }
-       state[depth].bs = YY_CURRENT_BUFFER;
-       state[depth].path = sudoers;
-       state[depth].lineno = sudolineno;
-       depth++;
+       if ((fp = open_sudoers(path, FALSE, &keepopen)) == NULL) {
+           yyerror(path);
+           return(FALSE); /* XXX - just to go next one? */
+       }
+    } else {
+       if ((fp = open_sudoers(path, TRUE, &keepopen)) == NULL) {
+           yyerror(path);
+           return(FALSE);
+       }
+       istack[idepth].more = NULL;
+    }
+    /* Push the old (current) file and open the new one. */
+    istack[idepth].path = sudoers; /* push old path */
+    istack[idepth].bs = YY_CURRENT_BUFFER;
+    istack[idepth].lineno = sudolineno;
+    istack[idepth].keepopen = keepopen;
+    idepth++;
+    sudolineno = 1;
+    sudoers = path;
+    yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE));
+
+    return(TRUE);
+}
+
+static int
+pop_include()
+{
+    struct path_list *pl;
+    FILE *fp;
+
+    if (idepth == 0)
+       return(FALSE);
+
+    if (!keepopen)
+       fclose(YY_CURRENT_BUFFER->yy_input_file);
+    yy_delete_buffer(YY_CURRENT_BUFFER);
+    keepopen = FALSE;
+    if ((pl = istack[idepth - 1].more) != NULL) {
+       /* Move to next file in the dir. */
+       istack[idepth - 1].more = pl->next;
+       if ((fp = open_sudoers(pl->path, FALSE, &keepopen)) == NULL) {
+           yyerror(pl->path);
+           return(FALSE); /* XXX - just to go next one? */
+       }
+       efree(sudoers);
+       sudoers = pl->path;
        sudolineno = 1;
-       sudoers = path;
        yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE));
+       efree(pl);
     } else {
-       /* pop */
-       if (depth == 0)
-           return(FALSE);
-       depth--;
-       if (!keepopen)
-           fclose(YY_CURRENT_BUFFER->yy_input_file);
-       yy_delete_buffer(YY_CURRENT_BUFFER);
-       yy_switch_to_buffer(state[depth].bs);
+       idepth--;
+       yy_switch_to_buffer(istack[idepth].bs);
        efree(sudoers);
-       sudoers = state[depth].path;
-       sudolineno = state[depth].lineno;
-       keepopen = FALSE;
+       sudoers = istack[idepth].path;
+       sudolineno = istack[idepth].lineno;
     }
     return(TRUE);
 }
@@ -676,6 +857,8 @@ parse_include(base)
 
     /* Pull out path from #include line. */
     cp = base + sizeof("#include");
+    if (*cp == 'i')
+       cp += 3; /* includedir */
     while (isblank((unsigned char) *cp))
        cp++;
     ep = cp;
index e9098f76741c4374f942eadff89b099251809364..ce4fb85d78854d1e65540b8ef995b2de8253aabe 100644 (file)
--- a/visudo.c
+++ b/visudo.c
@@ -93,10 +93,11 @@ __unused static const char rcsid[] = "$Sudo$";
 
 struct sudoersfile {
     char *path;
-    int fd;
     char *tpath;
+    int fd;
     int tfd;
     int modified;
+    int doedit;
     struct sudoersfile *next;
 };
 
@@ -215,8 +216,9 @@ main(argc, argv)
      * Parse the existing sudoers file(s) in quiet mode to highlight any
      * existing errors and to pull in editor and env_editor conf values.
      */
-    if ((yyin = open_sudoers(sudoers_path, NULL)) == NULL)
+    if ((yyin = open_sudoers(sudoers_path, TRUE, NULL)) == NULL) {
        error(1, "%s", sudoers_path);
+    }
     init_parser(sudoers_path, 0);
     yyparse();
     (void) update_defaults(SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER);
@@ -228,6 +230,8 @@ main(argc, argv)
 
     /* Edit the sudoers file(s) */
     tq_foreach_fwd(&sudoerslist, sp) {
+       if (!sp->doedit)
+           continue;
        if (sp != tq_first(&sudoerslist)) {
            printf("press return to edit %s: ", sp->path);
            while ((ch = getchar()) != EOF && ch != '\n')
@@ -747,8 +751,9 @@ check_syntax(sudoers_path, quiet, strict)
  * any subsequent files #included via a callback from the parser.
  */
 FILE *
-open_sudoers(path, keepopen)
+open_sudoers(path, doedit, keepopen)
     const char *path;
+    int doedit;
     int *keepopen;
 {
     struct sudoersfile *entry;
@@ -766,6 +771,8 @@ open_sudoers(path, keepopen)
        entry->next = NULL;
        entry->fd = open(entry->path, O_RDWR | O_CREAT, SUDOERS_MODE);
        entry->tpath = NULL;
+       entry->tfd = -1;
+       entry->doedit = doedit;
        if (entry->fd == -1) {
            warning("%s", entry->path);
            efree(entry);