(command.CommandList
  children: [
    (command.ShFunction
      name: err
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$quietflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.Simple
                      words: [
                        {<echo>}
                        {(${ Id.VSub_Name THISCMD) <Id.Lit_Colon ':'>}
                        {<ERROR> <Id.Lit_Colon ':'>}
                        {($ Id.VSub_Star '$*')}
                      ]
                      redirects: [
                        (redir
                          op: <Id.Redir_GreatAnd '1>&'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<2>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  spids: [101 114]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: info
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$quietflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(${ Id.VSub_Name THISCMD) <Id.Lit_Colon ':'>} 
                      {<INFO> <Id.Lit_Colon ':'>} {($ Id.VSub_Star '$*')}
                    )
                  ]
                  spids: [154 167]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_nextuid
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_uid)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [214]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_nextuid)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [218]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_uid'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_nextuid)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ 
                                (command_sub
                                  left_token: <Id.Left_Backtick '`'>
                                  child: 
                                    (command.Pipeline
                                      children: [
                                        (C {(${ Id.VSub_Name PWCMD)} {<usernext>})
                                        (C {<cut>} {<-f1>} {<-d> <Id.Lit_Colon ':'>})
                                      ]
                                      negated: F
                                    )
                                )
                              )
                            }
                          spids: [238]
                        )
                      ]
                    )
                  ]
                  spids: [222 235]
                )
              ]
              else_action: [
                (command.WhileUntil
                  keyword: <Id.KW_While while>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: (C {<Id.Lit_Colon ':'>})
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  body: 
                    (command.DoGroup
                      children: [
                        (command.Simple
                          words: [
                            {(${ Id.VSub_Name PWCMD)}
                            {<usershow>}
                            {($ Id.VSub_DollarName '$_uid')}
                          ]
                          redirects: [
                            (redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<'/dev/null'>}
                            )
                            (redir
                              op: <Id.Redir_GreatAnd '2>&'>
                              loc: (redir_loc.Fd fd:2)
                              arg: {<1>}
                            )
                          ]
                          do_fork: T
                        )
                        (command.If
                          arms: [
                            (if_arm
                              cond: 
                                (condition.Shell
                                  commands: [
                                    (command.Sentence
                                      child: 
                                        (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} 
                                          {(DQ ($ Id.VSub_QMark '$?'))} {<-eq>} {<0>} {<Id.Lit_RBracket ']'>}
                                        )
                                      terminator: <Id.Op_Semi _>
                                    )
                                  ]
                                )
                              action: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:_nextuid)
                                      op: assign_op.Equal
                                      rhs: {($ Id.VSub_DollarName '$_uid')}
                                      spids: [309]
                                    )
                                  ]
                                )
                                (command.ControlFlow
                                  token: <Id.ControlFlow_Break break>
                                )
                              ]
                              spids: [289 306]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:_uid)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (word_part.ArithSub
                                    anode: 
                                      (arith_expr.Binary
                                        op_id: Id.Arith_Plus
                                        left: {($ Id.VSub_DollarName '$_uid')}
                                        right: {<Id.Lit_Digits 1>}
                                      )
                                  )
                                }
                              spids: [319]
                            )
                          ]
                        )
                      ]
                    )
                )
              ]
            )
            (C {<echo>} {($ Id.VSub_DollarName '$_nextuid')})
          ]
        )
    )
    (command.ShFunction
      name: show_usage
      body: 
        (BraceGroup
          children: [
            (C {<echo>} {(DQ <'usage: '> (${ Id.VSub_Name THISCMD) <' [options]'>)})
            (C {<echo>} {(DQ <'  options may include:'>)})
            (C {<echo>} {(DQ <'  -C\t\tsave to the configuration file only'>)})
            (C {<echo>} {(DQ <'  -D\t\tdo not attempt to create the home directory'>)})
            (C {<echo>} {(DQ <'  -E\t\tdisable this account after creation'>)})
            (C {<echo>} {(DQ <'  -G\t\tadditional groups to add accounts to'>)})
            (C {<echo>} {(DQ <'  -L\t\tlogin class of the user'>)})
            (C {<echo>} {(DQ <'  -M\t\tfile permission for home directory'>)})
            (C {<echo>} {(DQ <'  -N\t\tdo not read configuration file'>)})
            (C {<echo>} {(DQ <'  -S\t\ta nonexistent shell is not an error'>)})
            (C {<echo>} {(DQ <'  -d\t\thome directory'>)})
            (C {<echo>} {(DQ <'  -f\t\tfile from which input will be received'>)})
            (C {<echo>} {(DQ <'  -g\t\tdefault login group'>)})
            (C {<echo>} {(DQ <'  -h\t\tdisplay this usage message'>)})
            (C {<echo>} {(DQ <'  -k\t\tpath to skeleton home directory'>)})
            (C {<echo>} {(DQ <'  -m\t\tuser welcome message file'>)})
            (C {<echo>} {(DQ <'  -q\t\tabsolute minimal user feedback'>)})
            (C {<echo>} {(DQ <'  -s\t\tshell'>)})
            (C {<echo>} {(DQ <'  -u\t\tuid to start at'>)})
            (C {<echo>} {(DQ <'  -w\t\tpassword type: no, none, yes or random'>)})
          ]
        )
    )
    (command.ShFunction
      name: valid_shells
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_prefix)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [524]
                )
              ]
            )
            (command.Pipeline
              children: [
                (C {<cat>} {(${ Id.VSub_Name ETCSHELLS)})
                (command.WhileUntil
                  keyword: <Id.KW_While while>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: (C {<read>} {<_path>} {<_junk>})
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  body: 
                    (command.DoGroup
                      children: [
                        (command.Case
                          to_match: {($ Id.VSub_DollarName '$_path')}
                          arms: [
                            (case_arm
                              pat_list: [
                                {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\#'>) 
                                  <Id.Lit_Star '*'>
                                }
                                {(SQ )}
                              ]
                              spids: [556 561 564 -1]
                            )
                            (case_arm
                              pat_list: [{<Id.Lit_Star '*'>}]
                              action: [
                                (C {<echo>} {<-n>} 
                                  {
                                    (DQ (${ Id.VSub_Name _prefix) 
                                      (command_sub
                                        left_token: <Id.Left_Backtick '`'>
                                        child: (C {<basename>} {($ Id.VSub_DollarName '$_path')})
                                      )
                                    )
                                  }
                                )
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:_prefix)
                                      op: assign_op.Equal
                                      rhs: {(SQ <' '>)}
                                      spids: [589]
                                    )
                                  ]
                                )
                              ]
                              spids: [567 568 595 -1]
                            )
                          ]
                        )
                      ]
                    )
                )
              ]
              negated: F
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-x>} {(DQ (${ Id.VSub_Name NOLOGIN_PATH))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (C {<echo>} {<-n>} {(DQ <' '> (${ Id.VSub_Name NOLOGIN))})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: fullpath_from_shell
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_shell)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [659]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_shell'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ControlFlow
                  token: <Id.ControlFlow_Return return>
                  arg_word: {<1>}
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_shell'))} 
                              {<Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name NOLOGIN))} {<-o>} {(DQ ($ Id.VSub_DollarName '$_shell'))} {<Id.Lit_Equals '='>} 
                              {(DQ (${ Id.VSub_Name NOLOGIN_PATH))} {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(${ Id.VSub_Name NOLOGIN_PATH)})
                    (command.Sentence
                      child: (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  spids: [701 736]
                )
              ]
            )
            (command.Pipeline
              children: [
                (C {<cat>} {(${ Id.VSub_Name ETCSHELLS)})
                (command.WhileUntil
                  keyword: <Id.KW_While while>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: (C {<read>} {<_path>} {<_junk>})
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  body: 
                    (command.DoGroup
                      children: [
                        (command.Case
                          to_match: {(DQ ($ Id.VSub_DollarName '$_path'))}
                          arms: [
                            (case_arm
                              pat_list: [
                                {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\#'>) 
                                  <Id.Lit_Star '*'>
                                }
                                {(SQ )}
                              ]
                              spids: [787 792 795 -1]
                            )
                            (case_arm
                              pat_list: [{<Id.Lit_Star '*'>}]
                              action: [
                                (command.If
                                  arms: [
                                    (if_arm
                                      cond: 
                                        (condition.Shell
                                          commands: [
                                            (command.Sentence
                                              child: 
                                                (C {<Id.Lit_LBracket '['>} 
                                                  {(DQ ($ Id.VSub_DollarName '$_path'))} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$_shell'))} {<-o>} 
                                                  {
                                                    (DQ 
                                                      (command_sub
                                                        left_token: <Id.Left_Backtick '`'>
                                                        child: 
                                                          (C {<basename>} 
                                                            {($ Id.VSub_DollarName '$_path')}
                                                          )
                                                      )
                                                    )
                                                  } {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$_shell'))} {<Id.Lit_RBracket ']'>}
                                                )
                                              terminator: <Id.Op_Semi _>
                                            )
                                          ]
                                        )
                                      action: [
                                        (C {<echo>} {($ Id.VSub_DollarName '$_path')})
                                        (command.ControlFlow
                                          token: <Id.ControlFlow_Return return>
                                          arg_word: {<0>}
                                        )
                                      ]
                                      spids: [802 839]
                                    )
                                  ]
                                )
                              ]
                              spids: [798 799 855 -1]
                            )
                          ]
                        )
                      ]
                    )
                )
              ]
              negated: F
            )
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<1>})
          ]
        )
    )
    (command.ShFunction
      name: shell_exists
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_sh)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$1'))}
                  spids: [900]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_shellchk)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ (${ Id.VSub_Name GREPCMD) <' \'^'> ($ Id.VSub_DollarName '$_sh') 
                        <Id.Lit_Dollar '$'> <'\' '> (${ Id.VSub_Name ETCSHELLS) <' > /dev/null 2>&1'>
                      )
                    }
                  spids: [906]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [(C {<eval>} {($ Id.VSub_DollarName '$_shellchk')})]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_sh'))} 
                                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name NOLOGIN_PATH))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<err>} 
                              {
                                (DQ <'Invalid shell ('> ($ Id.VSub_DollarName '$_sh') <') for user '> 
                                  ($ Id.VSub_DollarName '$username') <.>
                                )
                              }
                            )
                            (command.ControlFlow
                              token: <Id.ControlFlow_Return return>
                              arg_word: {<1>}
                            )
                          ]
                          spids: [939 959]
                        )
                      ]
                    )
                  ]
                  spids: [923 932]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Pipeline
                  children: [
                    (C {<Id.Lit_LBracket '['>} {<-x>} {(DQ ($ Id.VSub_DollarName '$_sh'))} 
                      {<Id.Lit_RBracket ']'>}
                    )
                  ]
                  negated: T
                )
                (C {<info>} 
                  {
                    (DQ <'The shell ('> ($ Id.VSub_DollarName '$_sh') 
                      <') does not exist or is not executable.'>
                    )
                  }
                )
              ]
            )
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShFunction
      name: save_config
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<echo>} {(DQ <'# Configuration file for adduser(8).'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'# NOTE: only *some* variables are saved.'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [
                {<echo>}
                {
                  (DQ <'# Last Modified on '> 
                    (command_sub
                      left_token: <Id.Left_Backtick '`'>
                      child: (C {(${ Id.VSub_Name DATECMD)})
                    ) <.>
                  )
                }
              ]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(SQ )}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'defaultHomePerm='> ($ Id.VSub_DollarName '$uhomeperm'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'defaultLgroup='> ($ Id.VSub_DollarName '$ulogingroup'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'defaultclass='> ($ Id.VSub_DollarName '$uclass'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'defaultgroups='> ($ Id.VSub_DollarName '$ugroups'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'passwdtype='> ($ Id.VSub_DollarName '$passwdtype'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'homeprefix='> ($ Id.VSub_DollarName '$homeprefix'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'defaultshell='> ($ Id.VSub_DollarName '$ushell'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'udotdir='> ($ Id.VSub_DollarName '$udotdir'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'msgfile='> ($ Id.VSub_DollarName '$msgfile'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'disableflag='> ($ Id.VSub_DollarName '$disableflag'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'uidstart='> ($ Id.VSub_DollarName '$uidstart'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: add_user
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<save_config>})
                    (command.ControlFlow token:<Id.ControlFlow_Return return>)
                  ]
                  spids: [1281 1294]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_uid)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1307]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_name)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1310]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_comment)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1313]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_gecos)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1316]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_home)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1319]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_group)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1322]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_grouplist)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1325]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_shell)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1328]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_class)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1331]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_dotdir)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1334]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_expire)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1337]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_pwexpire)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1340]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_passwd)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1343]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_upasswd)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1346]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_passwdmethod)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1349]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_name)
                  op: assign_op.Equal
                  rhs: {(DQ <'-n \''> ($ Id.VSub_DollarName '$username') <'\''>)}
                  spids: [1353]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uuid'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_uid)
                      op: assign_op.Equal
                      rhs: {(SQ <'-u "$uuid"'>)}
                      spids: [1373]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$ulogingroup'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_group)
                      op: assign_op.Equal
                      rhs: {(SQ <'-g "$ulogingroup"'>)}
                      spids: [1391]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$ugroups'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_grouplist)
                      op: assign_op.Equal
                      rhs: {(SQ <'-G "$ugroups"'>)}
                      spids: [1409]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$ushell'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_shell)
                      op: assign_op.Equal
                      rhs: {(SQ <'-s "$ushell"'>)}
                      spids: [1427]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uclass'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_class)
                      op: assign_op.Equal
                      rhs: {(SQ <'-L "$uclass"'>)}
                      spids: [1445]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$ugecos'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_comment)
                      op: assign_op.Equal
                      rhs: {(SQ <'-c "$ugecos"'>)}
                      spids: [1463]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$udotdir'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_dotdir)
                      op: assign_op.Equal
                      rhs: {(SQ <'-k "$udotdir"'>)}
                      spids: [1481]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uexpire'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_expire)
                      op: assign_op.Equal
                      rhs: {(SQ <'-e "$uexpire"'>)}
                      spids: [1499]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$upwexpire'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_pwexpire)
                      op: assign_op.Equal
                      rhs: {(SQ <'-p "$upwexpire"'>)}
                      spids: [1517]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$Dflag'))} 
                              {<-a>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uhome'))} {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$uhome'))} 
                                      {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$NOHOME'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:_home)
                                  op: assign_op.Equal
                                  rhs: {(SQ <'-d "$uhome"'>)}
                                  spids: [1575]
                                )
                              ]
                            )
                          ]
                          spids: [1555 1572]
                        )
                      ]
                      else_action: [
                        (command.If
                          arms: [
                            (if_arm
                              cond: 
                                (condition.Shell
                                  commands: [
                                    (command.Sentence
                                      child: 
                                        (C {<Id.Lit_LBracket '['>} {<-n>} 
                                          {(DQ ($ Id.VSub_DollarName '$uhomeperm'))} {<Id.Lit_RBracket ']'>}
                                        )
                                      terminator: <Id.Op_Semi _>
                                    )
                                  ]
                                )
                              action: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:_home)
                                      op: assign_op.Equal
                                      rhs: {(SQ <'-m -d "$uhome" -M "$uhomeperm"'>)}
                                      spids: [1604]
                                    )
                                  ]
                                )
                              ]
                              spids: [1588 1601]
                            )
                          ]
                          else_action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:_home)
                                  op: assign_op.Equal
                                  rhs: {(SQ <'-m -d "$uhome"'>)}
                                  spids: [1613]
                                )
                              ]
                            )
                          ]
                        )
                      ]
                    )
                  ]
                  spids: [1523 1544]
                )
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$Dflag'))} 
                              {<-a>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uhome'))} {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_home)
                          op: assign_op.Equal
                          rhs: {(SQ <'-d "$uhome"'>)}
                          spids: [1649]
                        )
                      ]
                    )
                  ]
                  spids: [1625 1646]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_DollarName '$passwdtype')}
              arms: [
                (case_arm
                  pat_list: [{<no>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_passwdmethod)
                          op: assign_op.Equal
                          rhs: {(DQ <'-w no'>)}
                          spids: [1669]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_passwd)
                          op: assign_op.Equal
                          rhs: {(DQ <'-h -'>)}
                          spids: [1675]
                        )
                      ]
                    )
                  ]
                  spids: [1665 1666 1681 -1]
                )
                (case_arm
                  pat_list: [{<yes>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_passwdmethod)
                          op: assign_op.Equal
                          rhs: {(DQ <'-w yes'>)}
                          spids: [1712]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_passwd)
                          op: assign_op.Equal
                          rhs: {(DQ <'-h 0'>)}
                          spids: [1718]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_upasswd)
                          op: assign_op.Equal
                          rhs: {(SQ <'echo "$upass" |'>)}
                          spids: [1724]
                        )
                      ]
                    )
                  ]
                  spids: [1684 1685 1730 -1]
                )
                (case_arm
                  pat_list: [{<none>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_passwdmethod)
                          op: assign_op.Equal
                          rhs: {(DQ <'-w none'>)}
                          spids: [1737]
                        )
                      ]
                    )
                  ]
                  spids: [1733 1734 1743 -1]
                )
                (case_arm
                  pat_list: [{<random>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_passwdmethod)
                          op: assign_op.Equal
                          rhs: {(DQ <'-w random'>)}
                          spids: [1750]
                        )
                      ]
                    )
                  ]
                  spids: [1746 1747 1756 -1]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_pwcmd)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName '$_upasswd') <' '> (${ Id.VSub_Name PWCMD) <' useradd '> 
                        ($ Id.VSub_DollarName '$_uid') <' '> ($ Id.VSub_DollarName '$_name') <' '> ($ Id.VSub_DollarName '$_group') <' '> 
                        ($ Id.VSub_DollarName '$_grouplist') <' '> ($ Id.VSub_DollarName '$_comment')
                      )
                    }
                  spids: [1763]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_pwcmd)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName '$_pwcmd') <' '> ($ Id.VSub_DollarName '$_shell') <' '> 
                        ($ Id.VSub_DollarName '$_class') <' '> ($ Id.VSub_DollarName '$_home') <' '> ($ Id.VSub_DollarName '$_dotdir') <' '> 
                        ($ Id.VSub_DollarName '$_passwdmethod') <' '> ($ Id.VSub_DollarName '$_passwd')
                      )
                    }
                  spids: [1783]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_pwcmd)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName '$_pwcmd') <' '> ($ Id.VSub_DollarName '$_expire') <' '> 
                        ($ Id.VSub_DollarName '$_pwexpire')
                      )
                    }
                  spids: [1801]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:_output)
                                      op: assign_op.Equal
                                      rhs: 
                                        {
                                          (command_sub
                                            left_token: <Id.Left_Backtick '`'>
                                            child: (C {<eval>} {($ Id.VSub_DollarName '$_pwcmd')})
                                          )
                                        }
                                      spids: [1816]
                                    )
                                  ]
                                )
                              ]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<err>} 
                      {
                        (DQ <'There was an error adding user ('> ($ Id.VSub_DollarName '$username') 
                          <').'>
                        )
                      }
                    )
                    (command.ControlFlow
                      token: <Id.ControlFlow_Return return>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [1812 1827]
                )
              ]
              else_action: [
                (C {<info>} 
                  {
                    (DQ <'Successfully added ('> ($ Id.VSub_DollarName '$username') 
                      <') to the user database.'>
                    )
                  }
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (command.Sentence
                              child: 
                                (C {<Id.Lit_LBracket '['>} {(DQ <random>)} {<Id.Lit_Equals '='>} 
                                  {(DQ ($ Id.VSub_DollarName '$passwdtype'))} {<Id.Lit_RBracket ']'>}
                                )
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:randompass)
                              op: assign_op.Equal
                              rhs: {(DQ ($ Id.VSub_DollarName '$_output'))}
                              spids: [1876]
                            )
                          ]
                        )
                        (C {<info>} 
                          {
                            (DQ <'Password for ('> ($ Id.VSub_DollarName '$username') <') is: '> 
                              ($ Id.VSub_DollarName '$randompass')
                            )
                          }
                        )
                      ]
                      spids: [1856 1873]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} 
                              {(DQ ($ Id.VSub_DollarName '$disableflag'))} {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {(${ Id.VSub_Name PWCMD)} {<lock>} 
                                      {($ Id.VSub_DollarName '$username')}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<info>} 
                              {(DQ <'Account ('> ($ Id.VSub_DollarName '$username') <') is locked.'>)}
                            )
                          ]
                          spids: [1915 1927]
                        )
                      ]
                      else_action: [
                        (C {<info>} 
                          {
                            (DQ <'Account ('> ($ Id.VSub_DollarName '$username') 
                              <') could NOT be locked.'>
                            )
                          }
                        )
                      ]
                    )
                  ]
                  spids: [1899 1912]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_line)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1958]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_owner)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1961]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_perms)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1964]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$msgflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {<-r>} {(DQ ($ Id.VSub_DollarName '$msgfile'))} 
                          {<Id.Lit_RBracket ']'>}
                        )
                        (BraceGroup
                          children: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:_dir)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ 
                                        (command_sub
                                          left_token: <Id.Left_Backtick '`'>
                                          child: (C {<dirname>} {($ Id.VSub_DollarName '$msgfile')})
                                        )
                                      )
                                    }
                                  spids: [2018]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:_file)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ 
                                        (command_sub
                                          left_token: <Id.Left_Backtick '`'>
                                          child: (C {<basename>} {($ Id.VSub_DollarName '$msgfile')})
                                        )
                                      )
                                    }
                                  spids: [2030]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:_perms)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (command_sub
                                        left_token: <Id.Left_Backtick '`'>
                                        child: 
                                          (C {<'/usr/bin/find'>} {($ Id.VSub_DollarName '$_dir')} 
                                            {<-name>} {($ Id.VSub_DollarName '$_file')} {<-perm>} {<Id.Lit_Other '+'> <07022>} {<-prune>}
                                          )
                                      )
                                    }
                                  spids: [2042]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:_owner)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (command_sub
                                        left_token: <Id.Left_Backtick '`'>
                                        child: 
                                          (C {<'/usr/bin/find'>} {($ Id.VSub_DollarName '$_dir')} 
                                            {<-name>} {($ Id.VSub_DollarName '$_file')} {<-user>} {<0>} {<-prune>}
                                          )
                                      )
                                    }
                                  spids: [2063]
                                )
                              ]
                            )
                            (command.If
                              arms: [
                                (if_arm
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: 
                                            (C {<Id.Lit_LBracket '['>} {<-z>} 
                                              {(DQ ($ Id.VSub_DollarName '$_owner'))} {<-o>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_perms'))} {<Id.Lit_RBracket ']'>}
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  action: [
                                    (C {<err>} 
                                      {
                                        (DQ <'The message file ('> ($ Id.VSub_DollarName '$msgfile') 
                                          <') may be writeable only by root.'>
                                        )
                                      }
                                    )
                                    (command.ControlFlow
                                      token: <Id.ControlFlow_Return return>
                                      arg_word: {<1>}
                                    )
                                  ]
                                  spids: [2083 2104]
                                )
                              ]
                            )
                            (command.Pipeline
                              children: [
                                (C {<cat>} {(DQ ($ Id.VSub_DollarName '$msgfile'))})
                                (command.WhileUntil
                                  keyword: <Id.KW_While while>
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: (C {<read>} {<_line>})
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  body: 
                                    (command.DoGroup
                                      children: [
                                        (C {<eval>} {<echo>} {(DQ ($ Id.VSub_DollarName '$_line'))})
                                      ]
                                    )
                                )
                                (C {(${ Id.VSub_Name MAILCMD)} {<-s> (DQ <Welcome>)} 
                                  {(${ Id.VSub_Name username)}
                                )
                              ]
                              negated: F
                            )
                            (C {<info>} 
                              {
                                (DQ <'Sent welcome message to ('> ($ Id.VSub_DollarName '$username') 
                                  <').'>
                                )
                              }
                            )
                          ]
                        )
                      ]
                    )
                  ]
                  spids: [1967 1980]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_user
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_input)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [2216]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ControlFlow token:<Id.ControlFlow_Return return>)
              ]
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: (C {<Id.Lit_Colon ':'>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {<-z>} 
                                      {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [(C {<echo>} {<-n>} {(DQ <'Username: '>)}) (C {<read>} {<_input>})]
                          spids: [2249 2262]
                        )
                      ]
                      else_action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:_input)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ 
                                    (command_sub
                                      left_token: <Id.Left_Backtick '`'>
                                      child: 
                                        (command.Pipeline
                                          children: [
                                            (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                            (C {<cut>} {<-f1>} {<-d> <Id.Lit_Colon ':'>})
                                          ]
                                          negated: F
                                        )
                                    )
                                  )
                                }
                              spids: [2282]
                            )
                          ]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {<-z>} 
                                      {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<err>} {(DQ <'You must enter a username!'>)})
                            (command.AndOr
                              ops: [Id.Op_DAmp]
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                                  {<Id.Lit_RBracket ']'>}
                                )
                                (command.ControlFlow
                                  token: <Id.ControlFlow_Continue continue>
                                )
                              ]
                            )
                          ]
                          spids: [2325 2338]
                        )
                      ]
                    )
                    (command.Simple
                      words: [{(${ Id.VSub_Name PWCMD)} {<usershow>} {($ Id.VSub_DollarName '$_input')}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                        (redir
                          op: <Id.Redir_GreatAnd '2>&'>
                          loc: (redir_loc.Fd fd:2)
                          arg: {<1>}
                        )
                      ]
                      do_fork: T
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_QMark '$?'))} {<-eq>} 
                                      {<0>} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<err>} {(DQ <'User exists!'>)})
                            (command.AndOr
                              ops: [Id.Op_DAmp]
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                                  {<Id.Lit_RBracket ']'>}
                                )
                                (command.ControlFlow
                                  token: <Id.ControlFlow_Continue continue>
                                )
                              ]
                            )
                          ]
                          spids: [2382 2397]
                        )
                      ]
                    )
                    (command.ControlFlow token:<Id.ControlFlow_Break break>)
                  ]
                )
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:username)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$_input'))}
                  spids: [2431]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_gecos
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_input)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [2458]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ControlFlow token:<Id.ControlFlow_Return return>)
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [(C {<echo>} {<-n>} {(DQ <'Full name: '>)}) (C {<read>} {<_input>})]
                  spids: [2482 2495]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (command_sub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                    (C {<cut>} {<-f7>} {<-d> <Id.Lit_Colon ':'>})
                                  ]
                                  negated: F
                                )
                            )
                          )
                        }
                      spids: [2515]
                    )
                  ]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:ugecos)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$_input'))}
                  spids: [2541]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_shell
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_input)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [2571]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_fullpath)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [2574]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:ushell)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$defaultshell'))}
                  spids: [2577]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$Sflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.Pipeline
                                      children: [
                                        (C {<shell_exists>} {($ Id.VSub_DollarName '$ushell')})
                                      ]
                                      negated: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<info>} 
                              {(DQ <'Using default shell '> (${ Id.VSub_Name defaultshell) <.>)}
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:ushell)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName '$defaultshell'))}
                                  spids: [2628]
                                )
                              ]
                            )
                          ]
                          spids: [2604 2614]
                        )
                      ]
                    )
                  ]
                  spids: [2588 2601]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {<-n>} 
                      {
                        (DQ <'Shell ('> ($ Id.VSub_DollarName '$shells') <') ['> 
                          (command_sub
                            left_token: <Id.Left_Backtick '`'>
                            child: (C {<basename>} {($ Id.VSub_DollarName '$ushell')})
                          ) <']: '>
                        )
                      }
                    )
                    (C {<read>} {<_input>})
                  ]
                  spids: [2641 2654]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (command_sub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                    (C {<cut>} {<-f9>} {<-d> <Id.Lit_Colon ':'>})
                                  ]
                                  negated: F
                                )
                            )
                          )
                        }
                      spids: [2684]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {<-n>} 
                                      {(DQ ($ Id.VSub_DollarName '$Sflag'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:ushell)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName '$_input'))}
                                  spids: [2742]
                                )
                              ]
                            )
                          ]
                          spids: [2726 2739]
                        )
                      ]
                      else_action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:_fullpath)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (command_sub
                                    left_token: <Id.Left_Backtick '`'>
                                    child: 
                                      (C {<fullpath_from_shell>} {($ Id.VSub_DollarName '$_input')})
                                  )
                                }
                              spids: [2751]
                            )
                          ]
                        )
                        (command.If
                          arms: [
                            (if_arm
                              cond: 
                                (condition.Shell
                                  commands: [
                                    (command.Sentence
                                      child: 
                                        (C {<Id.Lit_LBracket '['>} {<-n>} 
                                          {(DQ ($ Id.VSub_DollarName '$_fullpath'))} {<Id.Lit_RBracket ']'>}
                                        )
                                      terminator: <Id.Op_Semi _>
                                    )
                                  ]
                                )
                              action: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:ushell)
                                      op: assign_op.Equal
                                      rhs: {(DQ ($ Id.VSub_DollarName '$_fullpath'))}
                                      spids: [2777]
                                    )
                                  ]
                                )
                              ]
                              spids: [2761 2774]
                            )
                          ]
                          else_action: [
                            (C {<err>} 
                              {
                                (DQ <'Invalid shell ('> ($ Id.VSub_DollarName '$_input') 
                                  <') for user '> ($ Id.VSub_DollarName '$username') <.>
                                )
                              }
                            )
                            (C {<info>} 
                              {(DQ <'Using default shell '> (${ Id.VSub_Name defaultshell) <.>)}
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:ushell)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName '$defaultshell'))}
                                  spids: [2808]
                                )
                              ]
                            )
                          ]
                        )
                      ]
                    )
                  ]
                  spids: [2710 2723]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_homedir
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_input)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [2844]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {<-n>} 
                      {
                        (DQ <'Home directory ['> (${ Id.VSub_Name homeprefix) <'/'> 
                          (${ Id.VSub_Name username) <']: '>
                        )
                      }
                    )
                    (C {<read>} {<_input>})
                  ]
                  spids: [2847 2860]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (command_sub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                    (C {<cut>} {<-f8>} {<-d> <Id.Lit_Colon ':'>})
                                  ]
                                  negated: F
                                )
                            )
                          )
                        }
                      spids: [2888]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:uhome)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$_input'))}
                          spids: [2931]
                        )
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DAmp Id.Op_DPipe]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                          {<Id.Lit_RBracket ']'>}
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:homeprefix)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ 
                                    (command_sub
                                      left_token: <Id.Left_Backtick '`'>
                                      child: (C {<dirname>} {($ Id.VSub_DollarName '$uhome')})
                                    )
                                  )
                                }
                              spids: [2965]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:homeprefix)
                              op: assign_op.Equal
                              rhs: {(DQ ($ Id.VSub_DollarName '$uhome'))}
                              spids: [2978]
                            )
                          ]
                        )
                      ]
                    )
                  ]
                  spids: [2915 2928]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:uhome)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name homeprefix) <'/'> (${ Id.VSub_Name username))}
                      spids: [2987]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_homeperm
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:uhomeperm)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName '$defaultHomePerm')}
                  spids: [3020]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_input)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [3024]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_prompt)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [3027]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uhomeperm'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_prompt)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ <'Home directory permissions ['> (${ Id.VSub_Name uhomeperm) <']: '>)
                            }
                          spids: [3047]
                        )
                      ]
                    )
                  ]
                  spids: [3031 3044]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_prompt)
                      op: assign_op.Equal
                      rhs: {(DQ <'Home directory permissions (Leave empty for default): '>)}
                      spids: [3060]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_prompt'))})
                    (C {<read>} {<_input>})
                  ]
                  spids: [3069 3082]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:uhomeperm)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$_input'))}
                          spids: [3119]
                        )
                      ]
                    )
                  ]
                  spids: [3103 3116]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_uid
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:uuid)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Name uidstart)}
                  spids: [3149]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_input)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [3155]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_prompt)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [3158]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uuid'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:uuid)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Id.Left_Backtick '`'>
                                child: (C {<get_nextuid>} {($ Id.VSub_DollarName '$uuid')})
                              )
                            }
                          spids: [3178]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_prompt)
                          op: assign_op.Equal
                          rhs: {(DQ <'Uid ['> ($ Id.VSub_DollarName '$uuid') <']: '>)}
                          spids: [3188]
                        )
                      ]
                    )
                  ]
                  spids: [3162 3175]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_prompt)
                      op: assign_op.Equal
                      rhs: {(DQ <'Uid (Leave empty for default): '>)}
                      spids: [3199]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_prompt'))})
                    (C {<read>} {<_input>})
                  ]
                  spids: [3208 3221]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (command_sub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                    (C {<cut>} {<-f2>} {<-d> <Id.Lit_Colon ':'>})
                                  ]
                                  negated: F
                                )
                            )
                          )
                        }
                      spids: [3241]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:uuid)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_DollarName '$_input')}
                      spids: [3280]
                    )
                  ]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:uuid)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_Backtick '`'>
                        child: (C {<get_nextuid>} {($ Id.VSub_DollarName '$uuid')})
                      )
                    }
                  spids: [3284]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:uidstart)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName '$uuid')}
                  spids: [3294]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_class
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:uclass)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$defaultclass'))}
                  spids: [3316]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_input)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [3322]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_class)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name uclass>
                        suffix_op: 
                          (suffix_op.Unary
                            tok: <Id.VTest_ColonHyphen ':-'>
                            arg_word: {(DQ <default>)}
                          )
                      )
                    }
                  spids: [3325]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {<-n>} {(DQ <'Login class ['> ($ Id.VSub_DollarName '$_class') <']: '>)})
                    (C {<read>} {<_input>})
                  ]
                  spids: [3336 3349]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (command_sub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                    (C {<cut>} {<-f4>} {<-d> <Id.Lit_Colon ':'>})
                                  ]
                                  negated: F
                                )
                            )
                          )
                        }
                      spids: [3371]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:uclass)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_DollarName '$_input'))}
                      spids: [3410]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_logingroup
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:ulogingroup)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$defaultLgroup'))}
                  spids: [3446]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_input)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [3452]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {<-n>} 
                      {
                        (DQ <'Login group ['> 
                          (braced_var_sub
                            token: <Id.VSub_Name ulogingroup>
                            suffix_op: 
                              (suffix_op.Unary
                                tok: <Id.VTest_ColonHyphen ':-'>
                                arg_word: {($ Id.VSub_DollarName '$username')}
                              )
                          ) <']: '>
                        )
                      }
                    )
                    (C {<read>} {<_input>})
                  ]
                  spids: [3456 3469]
                )
              ]
              else_action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (command_sub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                    (C {<cut>} {<-f3>} {<-d> <Id.Lit_Colon ':'>})
                                  ]
                                  negated: F
                                )
                            )
                          )
                        }
                      spids: [3495]
                    )
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:ulogingroup)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_DollarName '$_input'))}
                      spids: [3538]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_groups
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:ugroups)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$defaultgroups'))}
                  spids: [3565]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_input)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [3571]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_group)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name ulogingroup>
                        suffix_op: 
                          (suffix_op.Unary
                            tok: <Id.VTest_ColonHyphen ':-'>
                            arg_word: {(DQ (${ Id.VSub_Name username))}
                          )
                      )
                    }
                  spids: [3574]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                          {<Id.Lit_RBracket ']'>}
                        )
                        (C {<echo>} {<-n>} 
                          {
                            (DQ <'Login group is '> ($ Id.VSub_DollarName '$_group') <'. Invite '> 
                              ($ Id.VSub_DollarName '$username')
                            )
                          }
                        )
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                          {<Id.Lit_RBracket ']'>}
                        )
                        (C {<echo>} {<-n>} 
                          {(DQ <' into other groups? ['> ($ Id.VSub_DollarName '$ugroups') <']: '>)}
                        )
                      ]
                    )
                  ]
                  spids: [3587 3600]
                )
              ]
              else_action: [
                (command.AndOr
                  ops: [Id.Op_DAmp]
                  children: [
                    (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                      {<Id.Lit_RBracket ']'>}
                    )
                    (C {<echo>} {<-n>} 
                      {(DQ <'Enter additional groups ['> ($ Id.VSub_DollarName '$ugroups') <']: '>)}
                    )
                  ]
                )
              ]
            )
            (C {<read>} {<_input>})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:ugroups)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_DollarName '$_input'))}
                      spids: [3697]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_expire_dates
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:upwexpire)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: 
                            (command.Pipeline
                              children: [
                                (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                (C {<cut>} {<-f5>} {<-d> <Id.Lit_Colon ':'>})
                              ]
                              negated: F
                            )
                        )
                      )
                    }
                  spids: [3724]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:uexpire)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: 
                            (command.Pipeline
                              children: [
                                (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                (C {<cut>} {<-f6>} {<-d> <Id.Lit_Colon ':'>})
                              ]
                              negated: F
                            )
                        )
                      )
                    }
                  spids: [3747]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_password
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$savedpwtype'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (BraceGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:passwdtype)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$savedpwtype')}
                          spids: [3830]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:savedpwtype)
                          op: assign_op.Equal
                          rhs: (word.Empty)
                          spids: [3834]
                        )
                      ]
                    )
                  ]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:upass)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name fileline>
                        suffix_op: 
                          (suffix_op.Unary
                            tok: <Id.VOp1_Pound '#'>
                            arg_word: 
                              {<Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> 
                                <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> 
                                <Id.Lit_Other '*'> <':'>
                              }
                          )
                      )
                    }
                  spids: [3845]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$upass'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.Case
                      to_match: {($ Id.VSub_DollarName '$passwdtype')}
                      arms: [
                        (case_arm
                          pat_list: [{<yes>}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:passwdtype)
                                  op: assign_op.Equal
                                  rhs: {<none>}
                                  spids: [3902]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:savedpwtype)
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                  spids: [3906]
                                )
                              ]
                            )
                          ]
                          spids: [3894 3895 3910 -1]
                        )
                      ]
                    )
                  ]
                  spids: [3871 3884]
                )
              ]
              else_action: [
                (command.Case
                  to_match: {($ Id.VSub_DollarName '$passwdtype')}
                  arms: [
                    (case_arm
                      pat_list: [{<random>}]
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:passwdtype)
                              op: assign_op.Equal
                              rhs: {<yes>}
                              spids: [3930]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:savedpwtype)
                              op: assign_op.Equal
                              rhs: {<random>}
                              spids: [3934]
                            )
                          ]
                        )
                      ]
                      spids: [3926 3927 3938 -1]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: input_from_file
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_field)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [3968]
                )
              ]
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: (C {<read>} {<-r>} {<fileline>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (command.Case
                      to_match: {(DQ ($ Id.VSub_DollarName '$fileline'))}
                      arms: [
                        (case_arm
                          pat_list: [
                            {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\#'>) 
                              <Id.Lit_Star '*'>
                            }
                            {(SQ )}
                          ]
                          spids: [3994 3999 4002 -1]
                        )
                        (case_arm
                          pat_list: [{<Id.Lit_Star '*'>}]
                          action: [
                            (command.AndOr
                              ops: [Id.Op_DPipe]
                              children: [
                                (C {<get_user>})
                                (command.ControlFlow
                                  token: <Id.ControlFlow_Continue continue>
                                )
                              ]
                            )
                            (C {<get_gecos>})
                            (C {<get_uid>})
                            (C {<get_logingroup>})
                            (C {<get_class>})
                            (C {<get_shell>})
                            (C {<get_homedir>})
                            (C {<get_homeperm>})
                            (C {<get_password>})
                            (C {<get_expire_dates>})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:ugroups)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName '$defaultgroups'))}
                                  spids: [4043]
                                )
                              ]
                            )
                            (C {<add_user>})
                          ]
                          spids: [4005 4006 4053 -1]
                        )
                      ]
                    )
                  ]
                )
            )
          ]
        )
    )
    (command.ShFunction
      name: input_interactive
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_disable)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [4083]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_pass)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [4086]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_passconfirm)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [4089]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_random)
                  op: assign_op.Equal
                  rhs: {(DQ <no>)}
                  spids: [4092]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_emptypass)
                  op: assign_op.Equal
                  rhs: {(DQ <no>)}
                  spids: [4098]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_usepass)
                  op: assign_op.Equal
                  rhs: {(DQ <yes>)}
                  spids: [4104]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_logingroup_ok)
                  op: assign_op.Equal
                  rhs: {(DQ <no>)}
                  spids: [4110]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_groups_ok)
                  op: assign_op.Equal
                  rhs: {(DQ <no>)}
                  spids: [4116]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_DollarName '$passwdtype')}
              arms: [
                (case_arm
                  pat_list: [{<none>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_emptypass)
                          op: assign_op.Equal
                          rhs: {(DQ <yes>)}
                          spids: [4133]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_usepass)
                          op: assign_op.Equal
                          rhs: {(DQ <yes>)}
                          spids: [4139]
                        )
                      ]
                    )
                  ]
                  spids: [4129 4130 4145 -1]
                )
                (case_arm
                  pat_list: [{<no>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_usepass)
                          op: assign_op.Equal
                          rhs: {(DQ <no>)}
                          spids: [4152]
                        )
                      ]
                    )
                  ]
                  spids: [4148 4149 4158 -1]
                )
                (case_arm
                  pat_list: [{<random>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_random)
                          op: assign_op.Equal
                          rhs: {(DQ <yes>)}
                          spids: [4165]
                        )
                      ]
                    )
                  ]
                  spids: [4161 4162 4171 -1]
                )
              ]
            )
            (C {<get_user>})
            (C {<get_gecos>})
            (C {<get_uid>})
            (command.WhileUntil
              keyword: <Id.KW_Until until>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_logingroup_ok'))} 
                          {<Id.Lit_Equals '='>} {<yes>} {<Id.Lit_RBracket ']'>}
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<get_logingroup>})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_logingroup_ok)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [4217]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {<-n>} 
                                      {(DQ ($ Id.VSub_DollarName '$ulogingroup'))} {<-a>} {(DQ ($ Id.VSub_DollarName '$username'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} 
                                      {(DQ ($ Id.VSub_DollarName '$ulogingroup'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (command.If
                              arms: [
                                (if_arm
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: 
                                            (command.Pipeline
                                              children: [
                                                (command.Simple
                                                  words: [
                                                    {(${ Id.VSub_Name PWCMD)}
                                                    {<show>}
                                                    {<group>}
                                                    {($ Id.VSub_DollarName '$ulogingroup')}
                                                  ]
                                                  redirects: [
                                                    (redir
                                                      op: <Id.Redir_Great '>'>
                                                      loc: (redir_loc.Fd fd:1)
                                                      arg: {<'/dev/null'>}
                                                    )
                                                    (redir
                                                      op: <Id.Redir_GreatAnd '2>&'>
                                                      loc: (redir_loc.Fd fd:2)
                                                      arg: {<1>}
                                                    )
                                                  ]
                                                  do_fork: T
                                                )
                                              ]
                                              negated: T
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  action: [
                                    (C {<echo>} 
                                      {
                                        (DQ <'Group '> ($ Id.VSub_DollarName '$ulogingroup') 
                                          <' does not exist!'>
                                        )
                                      }
                                    )
                                    (command.ShAssignment
                                      pairs: [
                                        (assign_pair
                                          lhs: (sh_lhs_expr.Name name:_logingroup_ok)
                                          op: assign_op.Equal
                                          rhs: {<no>}
                                          spids: [4284]
                                        )
                                      ]
                                    )
                                  ]
                                  spids: [4250 4272]
                                )
                              ]
                            )
                          ]
                          spids: [4221 4247]
                        )
                      ]
                    )
                  ]
                )
            )
            (command.WhileUntil
              keyword: <Id.KW_Until until>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_groups_ok'))} 
                          {<Id.Lit_Equals '='>} {<yes>} {<Id.Lit_RBracket ']'>}
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<get_groups>})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_groups_ok)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [4318]
                        )
                      ]
                    )
                    (command.ForEach
                      iter_name: i
                      iter_words: [{($ Id.VSub_DollarName '$ugroups')}]
                      do_arg_iter: F
                      body: 
                        (command.DoGroup
                          children: [
                            (command.If
                              arms: [
                                (if_arm
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: 
                                            (C {<Id.Lit_LBracket '['>} 
                                              {(DQ ($ Id.VSub_DollarName '$username'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$i'))} {<Id.Lit_RBracket ']'>}
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  action: [
                                    (command.If
                                      arms: [
                                        (if_arm
                                          cond: 
                                            (condition.Shell
                                              commands: [
                                                (command.Sentence
                                                  child: 
                                                    (command.Pipeline
                                                      children: [
                                                        (command.Simple
                                                          words: [
                                                            {(${ Id.VSub_Name PWCMD)}
                                                            {<show>}
                                                            {<group>}
                                                            {($ Id.VSub_DollarName '$i')}
                                                          ]
                                                          redirects: [
                                                            (redir
                                                              op: <Id.Redir_Great '>'>
                                                              loc: (redir_loc.Fd fd:1)
                                                              arg: {<'/dev/null'>}
                                                            )
                                                            (redir
                                                              op: <Id.Redir_GreatAnd '2>&'>
                                                              loc: (redir_loc.Fd fd:2)
                                                              arg: {<1>}
                                                            )
                                                          ]
                                                          do_fork: T
                                                        )
                                                      ]
                                                      negated: T
                                                    )
                                                  terminator: <Id.Op_Semi _>
                                                )
                                              ]
                                            )
                                          action: [
                                            (C {<echo>} 
                                              {
                                                (DQ <'Group '> ($ Id.VSub_DollarName '$i') 
                                                  <' does not exist!'>
                                                )
                                              }
                                            )
                                            (command.ShAssignment
                                              pairs: [
                                                (assign_pair
                                                  lhs: (sh_lhs_expr.Name name:_groups_ok)
                                                  op: assign_op.Equal
                                                  rhs: {<no>}
                                                  spids: [4389]
                                                )
                                              ]
                                            )
                                          ]
                                          spids: [4355 4377]
                                        )
                                      ]
                                    )
                                  ]
                                  spids: [4334 4352]
                                )
                              ]
                            )
                          ]
                        )
                    )
                  ]
                )
            )
            (C {<get_class>})
            (C {<get_shell>})
            (C {<get_homedir>})
            (C {<get_homeperm>})
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: (C {<Id.Lit_Colon ':'>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<echo>} {<-n>} 
                      {
                        (DQ <'Use password-based authentication? ['> 
                          ($ Id.VSub_DollarName '$_usepass') <']: '>
                        )
                      }
                    )
                    (C {<read>} {<_input>})
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                          {<Id.Lit_RBracket ']'>}
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:_input)
                              op: assign_op.Equal
                              rhs: {($ Id.VSub_DollarName '$_usepass')}
                              spids: [4456]
                            )
                          ]
                        )
                      ]
                    )
                    (command.Case
                      to_match: {($ Id.VSub_DollarName '$_input')}
                      arms: [
                        (case_arm
                          pat_list: [
                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> 
                              <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:passwdtype)
                                  op: assign_op.Equal
                                  rhs: {(DQ <no>)}
                                  spids: [4480]
                                )
                              ]
                            )
                          ]
                          spids: [4467 4477 4486 -1]
                        )
                        (case_arm
                          pat_list: [
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                              <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                              <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                          ]
                          action: [
                            (command.WhileUntil
                              keyword: <Id.KW_While while>
                              cond: 
                                (condition.Shell
                                  commands: [
                                    (command.Sentence
                                      child: (C {<Id.Lit_Colon ':'>})
                                      terminator: <Id.Op_Semi _>
                                    )
                                  ]
                                )
                              body: 
                                (command.DoGroup
                                  children: [
                                    (C {<echo>} {<-n>} 
                                      {
                                        (DQ <'Use an empty password? (yes/no) ['> 
                                          ($ Id.VSub_DollarName '$_emptypass') <']: '>
                                        )
                                      }
                                    )
                                    (C {<read>} {<_input>})
                                    (command.AndOr
                                      ops: [Id.Op_DAmp]
                                      children: [
                                        (C {<Id.Lit_LBracket '['>} {<-n>} 
                                          {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>}
                                        )
                                        (command.ShAssignment
                                          pairs: [
                                            (assign_pair
                                              lhs: (sh_lhs_expr.Name name:_emptypass)
                                              op: assign_op.Equal
                                              rhs: {($ Id.VSub_DollarName '$_input')}
                                              spids: [4549]
                                            )
                                          ]
                                        )
                                      ]
                                    )
                                    (command.Case
                                      to_match: {($ Id.VSub_DollarName '$_emptypass')}
                                      arms: [
                                        (case_arm
                                          pat_list: [
                                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> 
                                              <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'>
                                            }
                                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                                          ]
                                          action: [
                                            (C {<echo>} {<-n>} 
                                              {
                                                (DQ <'Use a random password? (yes/no) ['> 
                                                  ($ Id.VSub_DollarName '$_random') <']: '>
                                                )
                                              }
                                            )
                                            (C {<read>} {<_input>})
                                            (command.AndOr
                                              ops: [Id.Op_DAmp]
                                              children: [
                                                (C {<Id.Lit_LBracket '['>} {<-n>} 
                                                  {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>}
                                                )
                                                (command.ShAssignment
                                                  pairs: [
                                                    (assign_pair
                                                      lhs: (sh_lhs_expr.Name name:_random)
                                                      op: assign_op.Equal
                                                      rhs: {(DQ ($ Id.VSub_DollarName '$_input'))}
                                                      spids: [4601]
                                                    )
                                                  ]
                                                )
                                              ]
                                            )
                                            (command.Case
                                              to_match: {($ Id.VSub_DollarName '$_random')}
                                              arms: [
                                                (case_arm
                                                  pat_list: [
                                                    {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> 
                                                      <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                                                    }
                                                    {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> 
                                                      <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'>
                                                    }
                                                    {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                                                  ]
                                                  action: [
                                                    (command.ShAssignment
                                                      pairs: [
                                                        (assign_pair
                                                          lhs: (sh_lhs_expr.Name name:passwdtype)
                                                          op: assign_op.Equal
                                                          rhs: {(DQ <random>)}
                                                          spids: [4637]
                                                        )
                                                      ]
                                                    )
                                                    (command.ControlFlow
                                                      token: <Id.ControlFlow_Break break>
                                                    )
                                                  ]
                                                  spids: [4614 4634 4646 -1]
                                                )
                                              ]
                                            )
                                            (command.ShAssignment
                                              pairs: [
                                                (assign_pair
                                                  lhs: (sh_lhs_expr.Name name:passwdtype)
                                                  op: assign_op.Equal
                                                  rhs: {(DQ <yes>)}
                                                  spids: [4652]
                                                )
                                              ]
                                            )
                                            (command.AndOr
                                              ops: [Id.Op_DAmp]
                                              children: [
                                                (C {<Id.Lit_LBracket '['>} {<-n>} 
                                                  {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>}
                                                )
                                                (command.ControlFlow
                                                  token: <Id.ControlFlow_Break break>
                                                )
                                              ]
                                            )
                                            (C {<trap>} {(SQ <'stty echo; exit'>)} {<0>} {<1>} {<2>} {<3>} 
                                              {<15>}
                                            )
                                            (C {<stty>} {<-echo>})
                                            (C {<echo>} {<-n>} {(DQ <'Enter password: '>)})
                                            (C {<read>} {<-r>} {<upass>})
                                            (C {<echo> (SQ )})
                                            (C {<echo>} {<-n>} {(DQ <'Enter password again: '>)})
                                            (C {<read>} {<-r>} {<_passconfirm>})
                                            (C {<echo>} {(SQ )})
                                            (C {<stty>} {<echo>})
                                            (command.AndOr
                                              ops: [Id.Op_DAmp]
                                              children: [
                                                (C {<Id.Lit_LBracket '['>} {<-z>} 
                                                  {(DQ ($ Id.VSub_DollarName '$upass'))} {<-a>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_passconfirm'))} {<Id.Lit_RBracket ']'>}
                                                )
                                                (command.ControlFlow
                                                  token: <Id.ControlFlow_Continue continue>
                                                )
                                              ]
                                            )
                                          ]
                                          spids: [4560 4570 4776 -1]
                                        )
                                        (case_arm
                                          pat_list: [
                                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> 
                                              <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                                            }
                                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> 
                                              <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'>
                                            }
                                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                                          ]
                                          action: [
                                            (command.ShAssignment
                                              pairs: [
                                                (assign_pair
                                                  lhs: (sh_lhs_expr.Name name:passwdtype)
                                                  op: assign_op.Equal
                                                  rhs: {(DQ <none>)}
                                                  spids: [4802]
                                                )
                                              ]
                                            )
                                            (command.Sentence
                                              child: 
                                                (command.ControlFlow
                                                  token: <Id.ControlFlow_Break break>
                                                )
                                              terminator: <Id.Op_Semi _>
                                            )
                                          ]
                                          spids: [4779 4799 4812 -1]
                                        )
                                        (case_arm
                                          pat_list: [{<Id.Lit_Star '*'>}]
                                          action: [
                                            (command.ControlFlow
                                              token: <Id.ControlFlow_Continue continue>
                                            )
                                          ]
                                          spids: [4815 4816 4826 -1]
                                        )
                                      ]
                                    )
                                    (command.If
                                      arms: [
                                        (if_arm
                                          cond: 
                                            (condition.Shell
                                              commands: [
                                                (command.Sentence
                                                  child: 
                                                    (C {<Id.Lit_LBracket '['>} 
                                                      {(DQ ($ Id.VSub_DollarName '$upass'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$_passconfirm'))} 
                                                      {<Id.Lit_RBracket ']'>}
                                                    )
                                                  terminator: <Id.Op_Semi _>
                                                )
                                              ]
                                            )
                                          action: [
                                            (C {<echo>} {(DQ <'Passwords did not match!'>)})
                                            (command.ControlFlow
                                              token: <Id.ControlFlow_Continue continue>
                                            )
                                          ]
                                          spids: [4832 4850]
                                        )
                                      ]
                                    )
                                    (command.ControlFlow
                                      token: <Id.ControlFlow_Break break>
                                    )
                                  ]
                                )
                            )
                          ]
                          spids: [4489 4509 4872 -1]
                        )
                        (case_arm
                          pat_list: [{<Id.Lit_Star '*'>}]
                          action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)]
                          spids: [4875 4876 4886 -1]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (command.ControlFlow token:<Id.ControlFlow_Break break>)
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_disable)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name disableflag>
                        suffix_op: 
                          (suffix_op.Unary
                            tok: <Id.VTest_ColonHyphen ':-'>
                            arg_word: {(DQ <no>)}
                          )
                      )
                    }
                  spids: [4899]
                )
              ]
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: (C {<Id.Lit_Colon ':'>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<echo>} {<-n>} 
                      {
                        (DQ <'Lock out the account after creation? ['> 
                          ($ Id.VSub_DollarName '$_disable') <']: '>
                        )
                      }
                    )
                    (C {<read>} {<_input>})
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                          {<Id.Lit_RBracket ']'>}
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:_input)
                              op: assign_op.Equal
                              rhs: {($ Id.VSub_DollarName '$_disable')}
                              spids: [4946]
                            )
                          ]
                        )
                      ]
                    )
                    (command.Case
                      to_match: {($ Id.VSub_DollarName '$_input')}
                      arms: [
                        (case_arm
                          pat_list: [
                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> 
                              <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:disableflag)
                                  op: assign_op.Equal
                                  rhs: (word.Empty)
                                  spids: [4970]
                                )
                              ]
                            )
                          ]
                          spids: [4957 4967 4973 -1]
                        )
                        (case_arm
                          pat_list: [
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                              <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                              <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:disableflag)
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                  spids: [4999]
                                )
                              ]
                            )
                          ]
                          spids: [4976 4996 5003 -1]
                        )
                        (case_arm
                          pat_list: [{<Id.Lit_Star '*'>}]
                          action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)]
                          spids: [5006 5007 5017 -1]
                        )
                      ]
                    )
                    (command.ControlFlow token:<Id.ControlFlow_Break break>)
                  ]
                )
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_disable)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name disableflag>
                        suffix_op: 
                          (suffix_op.Unary
                            tok: <Id.VTest_ColonHyphen ':-'>
                            arg_word: {(DQ <no>)}
                          )
                      )
                    }
                  spids: [5043]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {<Username>} 
                  {($ Id.VSub_DollarName '$username')}
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_DollarName '$passwdtype')}
              arms: [
                (case_arm
                  pat_list: [{<yes>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_pass)
                          op: assign_op.Equal
                          rhs: {(SQ <'*****'>)}
                          spids: [5089]
                        )
                      ]
                    )
                  ]
                  spids: [5085 5086 5095 -1]
                )
                (case_arm
                  pat_list: [{<no>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_pass)
                          op: assign_op.Equal
                          rhs: {(SQ <'<disabled>'>)}
                          spids: [5102]
                        )
                      ]
                    )
                  ]
                  spids: [5098 5099 5108 -1]
                )
                (case_arm
                  pat_list: [{<none>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_pass)
                          op: assign_op.Equal
                          rhs: {(SQ <'<blank>'>)}
                          spids: [5115]
                        )
                      ]
                    )
                  ]
                  spids: [5111 5112 5121 -1]
                )
                (case_arm
                  pat_list: [{<random>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_pass)
                          op: assign_op.Equal
                          rhs: {(SQ <'<random>'>)}
                          spids: [5128]
                        )
                      ]
                    )
                  ]
                  spids: [5124 5125 5134 -1]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Password>)} 
                  {(DQ ($ Id.VSub_DollarName '$_pass'))}
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <'Pass Type'>)} 
                  {(DQ ($ Id.VSub_DollarName '$passwdtype'))}
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <'Full Name'>)} 
                  {(DQ ($ Id.VSub_DollarName '$ugecos'))}
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Uid>)} 
                  {(DQ ($ Id.VSub_DollarName '$uuid'))}
                )
              ]
            )
            (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Class>)} 
              {(DQ ($ Id.VSub_DollarName '$uclass'))}
            )
            (C {<printf>} {(DQ <'%-10s : %s %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Groups>)} 
              {
                (DQ 
                  (braced_var_sub
                    token: <Id.VSub_Name ulogingroup>
                    suffix_op: 
                      (suffix_op.Unary
                        tok: <Id.VTest_ColonHyphen ':-'>
                        arg_word: {($ Id.VSub_DollarName '$username')}
                      )
                  )
                )
              } {(DQ ($ Id.VSub_DollarName '$ugroups'))}
            )
            (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Home>)} 
              {(DQ ($ Id.VSub_DollarName '$uhome'))}
            )
            (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <'Home Mode'>)} 
              {(DQ ($ Id.VSub_DollarName '$uhomeperm'))}
            )
            (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Shell>)} 
              {(DQ ($ Id.VSub_DollarName '$ushell'))}
            )
            (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Locked>)} 
              {(DQ ($ Id.VSub_DollarName '$_disable'))}
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: (C {<Id.Lit_Colon ':'>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (C {<echo>} {<-n>} {(DQ <'OK? (yes/no): '>)})
                    (C {<read>} {<_input>})
                    (command.Case
                      to_match: {($ Id.VSub_DollarName '$_input')}
                      arms: [
                        (case_arm
                          pat_list: [
                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> 
                              <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                          ]
                          action: [
                            (command.ControlFlow
                              token: <Id.ControlFlow_Return return>
                              arg_word: {<1>}
                            )
                          ]
                          spids: [5396 5406 5414 -1]
                        )
                        (case_arm
                          pat_list: [
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                              <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                              <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                          ]
                          action: [(C {<add_user>})]
                          spids: [5417 5437 5443 -1]
                        )
                        (case_arm
                          pat_list: [{<Id.Lit_Star '*'>}]
                          action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)]
                          spids: [5446 5447 5453 -1]
                        )
                      ]
                    )
                    (command.ControlFlow token:<Id.ControlFlow_Break break>)
                  ]
                )
            )
            (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:THISCMD)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_Backtick '`'>
                child: (C {<'/usr/bin/basename'>} {($ Id.VSub_Number '$0')})
              )
            }
          spids: [5476]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DEFAULTSHELL)
          op: assign_op.Equal
          rhs: {<'/bin/sh'>}
          spids: [5485]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ADDUSERCONF)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name ADDUSERCONF>
                  suffix_op: 
                    (suffix_op.Unary
                      tok: <Id.VTest_ColonHyphen ':-'>
                      arg_word: {<Id.Lit_Slash '/'> <etc> <Id.Lit_Slash '/'> <adduser.conf>}
                    )
                )
              )
            }
          spids: [5488]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PWCMD)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name PWCMD>
                  suffix_op: 
                    (suffix_op.Unary
                      tok: <Id.VTest_ColonHyphen ':-'>
                      arg_word: 
                        {<Id.Lit_Slash '/'> <usr> <Id.Lit_Slash '/'> <sbin> <Id.Lit_Slash '/'> <pw>}
                    )
                )
              )
            }
          spids: [5500]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:MAILCMD)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name MAILCMD>
                  suffix_op: (suffix_op.Unary tok:<Id.VTest_ColonHyphen ':-'> arg_word:{<mail>})
                )
              )
            }
          spids: [5514]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ETCSHELLS)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name ETCSHELLS>
                  suffix_op: 
                    (suffix_op.Unary
                      tok: <Id.VTest_ColonHyphen ':-'>
                      arg_word: {<Id.Lit_Slash '/'> <etc> <Id.Lit_Slash '/'> <shells>}
                    )
                )
              )
            }
          spids: [5523]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NOHOME)
          op: assign_op.Equal
          rhs: {(DQ <'/nonexistent'>)}
          spids: [5535]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NOLOGIN)
          op: assign_op.Equal
          rhs: {(DQ <nologin>)}
          spids: [5540]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NOLOGIN_PATH)
          op: assign_op.Equal
          rhs: {(DQ <'/usr/sbin/nologin'>)}
          spids: [5545]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GREPCMD)
          op: assign_op.Equal
          rhs: {(DQ <'/usr/bin/grep'>)}
          spids: [5550]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DATECMD)
          op: assign_op.Equal
          rhs: {(DQ <'/bin/date'>)}
          spids: [5555]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:username)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5567]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uuid)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5569]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uidstart)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5571]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ugecos)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5573]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ulogingroup)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5575]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uclass)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5577]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uhome)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5579]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uhomeperm)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5581]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:upass)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5583]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ushell)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5585]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:udotdir)
          op: assign_op.Equal
          rhs: {<'/usr/share/skel'>}
          spids: [5587]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ugroups)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5590]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uexpire)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5592]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:upwexpire)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5594]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:shells)
          op: assign_op.Equal
          rhs: {(DQ (command_sub left_token:<Id.Left_Backtick '`'> child:(C {<valid_shells>})))}
          spids: [5596]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:passwdtype)
          op: assign_op.Equal
          rhs: {(DQ <yes>)}
          spids: [5605]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:msgfile)
          op: assign_op.Equal
          rhs: {<'/etc/adduser.msg'>}
          spids: [5610]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:msgflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5613]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:quietflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5615]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:configflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5617]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5619]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:infile)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5621]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:disableflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5623]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:Dflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5625]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:Sflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5627]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:readconfig)
          op: assign_op.Equal
          rhs: {(DQ <yes>)}
          spids: [5629]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:homeprefix)
          op: assign_op.Equal
          rhs: {(DQ <'/home'>)}
          spids: [5634]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:randompass)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5639]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fileline)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5641]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:savedpwtype)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5643]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultclass)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5645]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultLgroup)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5647]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultgroups)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5649]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultshell)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name DEFAULTSHELL))}
          spids: [5651]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultHomePerm)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5658]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:procowner)
          op: assign_op.Equal
          rhs: 
            {
              (braced_var_sub
                token: <Id.VSub_Name procowner>
                suffix_op: 
                  (suffix_op.Unary
                    tok: <Id.VTest_ColonHyphen ':-'>
                    arg_word: 
                      {
                        (command_sub
                          left_token: <Id.Left_Backtick '`'>
                          child: (C {<'/usr/bin/id'>} {<-u>})
                        )
                      }
                  )
              )
            }
          spids: [5673]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$procowner'))} 
                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <0>)} {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (C {<err>} {(SQ <'you must be the super-user (uid 0) to use this utility.'>)})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [5686 5704]
        )
      ]
    )
    (command.ForEach
      iter_name: _i
      iter_words: [{($ Id.VSub_Star '$*')}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_i'))} 
                              {<Id.Lit_Equals '='>} {(DQ <-N>)} {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:readconfig)
                          op: assign_op.Equal
                          rhs: (word.Empty)
                          spids: [5772]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (command.ControlFlow token:<Id.ControlFlow_Break break>)
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  spids: [5752 5769]
                )
              ]
            )
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$readconfig'))} 
                      {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Subshell
                              child: 
                                (command.Simple
                                  words: [{<.>} {(${ Id.VSub_Name ADDUSERCONF)}]
                                  redirects: [
                                    (redir
                                      op: <Id.Redir_Great '>'>
                                      loc: (redir_loc.Fd fd:1)
                                      arg: {<'/dev/null'>}
                                    )
                                    (redir
                                      op: <Id.Redir_GreatAnd '2>&'>
                                      loc: (redir_loc.Fd fd:2)
                                      arg: {<1>}
                                    )
                                  ]
                                  do_fork: T
                                )
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {<-r>} {(${ Id.VSub_Name ADDUSERCONF)} 
                          {<Id.Lit_RBracket ']'>}
                        )
                        (command.Simple
                          words: [{<.>} {(${ Id.VSub_Name ADDUSERCONF)}]
                          redirects: [
                            (redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<'/dev/null'>}
                            )
                            (redir
                              op: <Id.Redir_GreatAnd '2>&'>
                              loc: (redir_loc.Fd fd:2)
                              arg: {<1>}
                            )
                          ]
                          do_fork: T
                        )
                      ]
                    )
                  ]
                  spids: [5807 5827]
                )
              ]
            )
          ]
          spids: [5783 5796]
        )
      ]
    )
    (command.ForEach
      iter_name: _switch
      do_arg_iter: T
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {($ Id.VSub_DollarName '$_switch')}
              arms: [
                (case_arm
                  pat_list: [{<-L>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:defaultclass)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number '$2'))}
                          spids: [5888]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [5884 5885 5900 -1]
                )
                (case_arm
                  pat_list: [{<-C>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:configflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [5907]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [5903 5904 5914 -1]
                )
                (case_arm
                  pat_list: [{<-D>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:Dflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [5921]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [5917 5918 5928 -1]
                )
                (case_arm
                  pat_list: [{<-E>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:disableflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [5935]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [5931 5932 5942 -1]
                )
                (case_arm
                  pat_list: [{<-k>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:udotdir)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number '$2'))}
                          spids: [5949]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [5945 5946 5961 -1]
                )
                (case_arm
                  pat_list: [{<-f>}]
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number '$2'))} 
                          {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <->)} {<Id.Lit_RBracket ']'>}
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:infile)
                              op: assign_op.Equal
                              rhs: {(DQ ($ Id.VSub_Number '$2'))}
                              spids: [5985]
                            )
                          ]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:fflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [5991]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [5964 5965 6001 -1]
                )
                (case_arm
                  pat_list: [{<-g>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:defaultLgroup)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number '$2'))}
                          spids: [6008]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [6004 6005 6020 -1]
                )
                (case_arm
                  pat_list: [{<-G>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:defaultgroups)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number '$2'))}
                          spids: [6027]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [6023 6024 6039 -1]
                )
                (case_arm
                  pat_list: [{<-h>}]
                  action: [
                    (C {<show_usage>})
                    (command.ControlFlow
                      token: <Id.ControlFlow_Exit exit>
                      arg_word: {<0>}
                    )
                  ]
                  spids: [6042 6043 6054 -1]
                )
                (case_arm
                  pat_list: [{<-d>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:homeprefix)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number '$2'))}
                          spids: [6061]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [6057 6058 6073 -1]
                )
                (case_arm
                  pat_list: [{<-m>}]
                  action: [
                    (command.Case
                      to_match: {(DQ ($ Id.VSub_Number '$2'))}
                      arms: [
                        (case_arm
                          pat_list: [
                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> 
                              <Id.Lit_RBracket ']'>
                            }
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:msgflag)
                                  op: assign_op.Equal
                                  rhs: (word.Empty)
                                  spids: [6098]
                                )
                              ]
                            )
                          ]
                          spids: [6089 6095 6101 -1]
                        )
                        (case_arm
                          pat_list: [{<Id.Lit_Star '*'>}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:msgflag)
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                  spids: [6108]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:msgfile)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_Number '$2'))}
                                  spids: [6112]
                                )
                              ]
                            )
                          ]
                          spids: [6104 6105 6118 -1]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [6076 6077 6130 -1]
                )
                (case_arm
                  pat_list: [{<-M>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:defaultHomePerm)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$2')}
                          spids: [6137]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [6133 6134 6147 -1]
                )
                (case_arm
                  pat_list: [{<-N>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:readconfig)
                          op: assign_op.Equal
                          rhs: (word.Empty)
                          spids: [6154]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [6150 6151 6160 -1]
                )
                (case_arm
                  pat_list: [{<-w>}]
                  action: [
                    (command.Case
                      to_match: {(DQ ($ Id.VSub_Number '$2'))}
                      arms: [
                        (case_arm
                          pat_list: [{<no>} {<none>} {<random>} {<yes>}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:passwdtype)
                                  op: assign_op.Equal
                                  rhs: {($ Id.VSub_Number '$2')}
                                  spids: [6186]
                                )
                              ]
                            )
                          ]
                          spids: [6176 6183 6190 -1]
                        )
                        (case_arm
                          pat_list: [{<Id.Lit_Star '*'>}]
                          action: [
                            (C {<show_usage>})
                            (command.ControlFlow
                              token: <Id.ControlFlow_Exit exit>
                              arg_word: {<1>}
                            )
                          ]
                          spids: [6193 6194 6205 -1]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [6163 6164 6217 -1]
                )
                (case_arm
                  pat_list: [{<-q>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:quietflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [6224]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [6220 6221 6231 -1]
                )
                (case_arm
                  pat_list: [{<-s>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:defaultshell)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ 
                                (command_sub
                                  left_token: <Id.Left_Backtick '`'>
                                  child: (C {<fullpath_from_shell>} {($ Id.VSub_Number '$2')})
                                )
                              )
                            }
                          spids: [6238]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [6234 6235 6256 -1]
                )
                (case_arm
                  pat_list: [{<-S>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:Sflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [6263]
                        )
                      ]
                    )
                    (C {<shift>})
                  ]
                  spids: [6259 6260 6270 -1]
                )
                (case_arm
                  pat_list: [{<-u>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:uidstart)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number '$2')}
                          spids: [6277]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {<shift>})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<shift>})
                  ]
                  spids: [6273 6274 6287 -1]
                )
              ]
            )
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                      {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$infile'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [(C {<input_from_file>})]
                  spids: [6320 6333]
                )
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$infile'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {<-r>} 
                                      {(DQ ($ Id.VSub_DollarName '$infile'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (command.Simple
                              words: [{<input_from_file>}]
                              redirects: [
                                (redir
                                  op: <Id.Redir_Less '<'>
                                  loc: (redir_loc.Fd fd:0)
                                  arg: {($ Id.VSub_DollarName '$infile')}
                                )
                              ]
                              do_fork: T
                            )
                          ]
                          spids: [6355 6368]
                        )
                      ]
                      else_action: [
                        (C {<err>} 
                          {
                            (DQ <'File ('> ($ Id.VSub_DollarName '$infile') 
                              <') is unreadable or does not exist.'>
                            )
                          }
                        )
                      ]
                    )
                  ]
                  spids: [6339 6352]
                )
              ]
            )
          ]
          spids: [6304 6317]
        )
      ]
      else_action: [
        (C {<input_interactive>})
        (command.WhileUntil
          keyword: <Id.KW_While while>
          cond: 
            (condition.Shell
              commands: [(command.Sentence child:(C {<Id.Lit_Colon ':'>}) terminator:<Id.Op_Semi _>)]
            )
          body: 
            (command.DoGroup
              children: [
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (command.Sentence
                              child: 
                                (C {<Id.Lit_LBracket '['>} {<-z>} 
                                  {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>}
                                )
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                        )
                      action: [(C {<echo>} {<-n>} {(DQ <'Add another user? (yes/no): '>)})]
                      spids: [6410 6423]
                    )
                  ]
                  else_action: [
                    (C {<echo>} {<-n>} {(DQ <'Re-edit the default configuration? (yes/no): '>)})
                  ]
                )
                (C {<read>} {<_input>})
                (command.Case
                  to_match: {($ Id.VSub_DollarName '$_input')}
                  arms: [
                    (case_arm
                      pat_list: [
                        {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                          <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                        }
                        {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                          <Id.Lit_RBracket ']'>
                        }
                        {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                      ]
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:uidstart)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (command_sub
                                    left_token: <Id.Left_Backtick '`'>
                                    child: (C {<get_nextuid>} {($ Id.VSub_DollarName '$uidstart')})
                                  )
                                }
                              spids: [6485]
                            )
                          ]
                        )
                        (C {<input_interactive>})
                        (command.ControlFlow
                          token: <Id.ControlFlow_Continue continue>
                        )
                      ]
                      spids: [6462 6482 6501 -1]
                    )
                    (case_arm
                      pat_list: [
                        {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> 
                          <Id.Lit_RBracket ']'>
                        }
                        {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                      ]
                      action: [(C {<echo>} {(DQ <'Goodbye!'>)})]
                      spids: [6504 6514 6524 -1]
                    )
                    (case_arm
                      pat_list: [{<Id.Lit_Star '*'>}]
                      action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)]
                      spids: [6527 6528 6534 -1]
                    )
                  ]
                )
                (command.ControlFlow token:<Id.ControlFlow_Break break>)
              ]
            )
        )
      ]
    )
  ]
)