(command.CommandList
  children: [
    (command.ShFunction
      name: err
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$quietflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:112)
                    )
                  ]
                  action: [
                    (command.Simple
                      words: [
                        {(echo)}
                        {(${ Id.VSub_Name THISCMD) (Id.Lit_Other ':')}
                        {(ERROR) (Id.Lit_Other ':')}
                        {($ Id.VSub_Star '$*')}
                      ]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_GreatAnd val:'1>&' span_id:119)
                          fd: 1
                          arg_word: {(2)}
                        )
                      ]
                    )
                  ]
                  spids: [101 114]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: info
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$quietflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:165)
                    )
                  ]
                  action: [
                    (C {(echo)} {(${ Id.VSub_Name THISCMD) (Id.Lit_Other ':')} 
                      {(INFO) (Id.Lit_Other ':')} {($ Id.VSub_Star '$*')}
                    )
                  ]
                  spids: [154 167]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_nextuid
      body: 
        (command.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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$_uid'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:233)
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_nextuid)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ 
                                (command_sub
                                  left_token: (Token id:Id.Left_Backtick val:'`' span_id:240)
                                  command_list: 
                                    (command.CommandList
                                      children: [
                                        (command.Pipeline
                                          children: [
                                            (C {(${ Id.VSub_Name PWCMD)} {(usernext)})
                                            (C {(cut)} {(-f1)} {(-d) (Id.Lit_Other ':')})
                                          ]
                                          negated: F
                                        )
                                      ]
                                    )
                                )
                              )
                            }
                          spids: [238]
                        )
                      ]
                    )
                  ]
                  spids: [222 235]
                )
              ]
              else_action: [
                (command.WhileUntil
                  keyword: (Token id:Id.KW_While val:while span_id:264)
                  cond: [
                    (command.Sentence
                      child: (C {(Id.Lit_Other ':')})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:268)
                    )
                  ]
                  body: 
                    (command.DoGroup
                      children: [
                        (command.Simple
                          words: [
                            {(${ Id.VSub_Name PWCMD)}
                            {(usershow)}
                            {($ Id.VSub_DollarName '$_uid')}
                          ]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Great val:'>' span_id:281)
                              fd: -1
                              arg_word: {(/dev/null)}
                            )
                            (redir.Redir
                              op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:285)
                              fd: 2
                              arg_word: {(1)}
                            )
                          ]
                        )
                        (command.If
                          arms: [
                            (if_arm
                              cond: [
                                (command.Sentence
                                  child: 
                                    (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} 
                                      {(DQ ($ Id.VSub_QMark '$?'))} {(-eq)} {(0)} {(Id.Lit_RBracket ']')}
                                    )
                                  terminator: (Token id:Id.Op_Semi val:';' span_id:304)
                                )
                              ]
                              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: (Token id:Id.ControlFlow_Break val:break span_id:313)
                                )
                              ]
                              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: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$_uid')})
                                        right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)})
                                      )
                                  )
                                }
                              spids: [319]
                            )
                          ]
                        )
                      ]
                    )
                )
              ]
            )
            (C {(echo)} {($ Id.VSub_DollarName '$_nextuid')})
          ]
        )
    )
    (command.ShFunction
      name: show_usage
      body: 
        (command.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: 
        (command.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: (Token id:Id.KW_While val:while span_id:536)
                  cond: [
                    (command.Sentence
                      child: (C {(read)} {(_path)} {(_junk)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:544)
                    )
                  ]
                  body: 
                    (command.DoGroup
                      children: [
                        (command.Case
                          to_match: {($ Id.VSub_DollarName '$_path')}
                          arms: [
                            (case_arm
                              pat_list: [
                                {
                                  (word_part.EscapedLiteral
                                    token: (Token id:Id.Lit_EscapedChar val:'\\#' span_id:556)
                                  ) (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: (Token id:Id.Left_Backtick val:'`' span_id:579)
                                        command_list: 
                                          (command.CommandList
                                            children: [
                                              (C {(basename)} {($ Id.VSub_DollarName '$_path')})
                                            ]
                                          )
                                      )
                                    )
                                  }
                                )
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:_prefix)
                                      op: assign_op.Equal
                                      rhs: {(SQ (Token id:Id.Lit_Chars val:' ' span_id:591))}
                                      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: 
        (command.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: (Token id:Id.ControlFlow_Return val:return span_id:675)
                  arg_word: {(1)}
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (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: (Token id:Id.Op_Semi val:';' span_id:734)
                    )
                  ]
                  action: [
                    (C {(echo)} {(${ Id.VSub_Name NOLOGIN_PATH)})
                    (command.Sentence
                      child: 
                        (command.ControlFlow
                          token: (Token id:Id.ControlFlow_Return val:return span_id:746)
                          arg_word: {(0)}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:749)
                    )
                  ]
                  spids: [701 736]
                )
              ]
            )
            (command.Pipeline
              children: [
                (C {(cat)} {(${ Id.VSub_Name ETCSHELLS)})
                (command.WhileUntil
                  keyword: (Token id:Id.KW_While val:while span_id:765)
                  cond: [
                    (command.Sentence
                      child: (C {(read)} {(_path)} {(_junk)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:773)
                    )
                  ]
                  body: 
                    (command.DoGroup
                      children: [
                        (command.Case
                          to_match: {(DQ ($ Id.VSub_DollarName '$_path'))}
                          arms: [
                            (case_arm
                              pat_list: [
                                {
                                  (word_part.EscapedLiteral
                                    token: (Token id:Id.Lit_EscapedChar val:'\\#' span_id:787)
                                  ) (Id.Lit_Star '*')
                                }
                                {(SQ )}
                              ]
                              spids: [787 792 795 -1]
                            )
                            (case_arm
                              pat_list: [{(Id.Lit_Star '*')}]
                              action: [
                                (command.If
                                  arms: [
                                    (if_arm
                                      cond: [
                                        (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: 
                                                      (Token
                                                        id: Id.Left_Backtick
                                                        val: '`'
                                                        span_id: 821
                                                      )
                                                    command_list: 
                                                      (command.CommandList
                                                        children: [
                                                          (C {(basename)} 
                                                            {($ Id.VSub_DollarName '$_path')}
                                                          )
                                                        ]
                                                      )
                                                  )
                                                )
                                              } {(Id.Lit_Equals '=')} {(DQ ($ Id.VSub_DollarName '$_shell'))} {(Id.Lit_RBracket ']')}
                                            )
                                          terminator: (Token id:Id.Op_Semi val:';' span_id:837)
                                        )
                                      ]
                                      action: [
                                        (C {(echo)} {($ Id.VSub_DollarName '$_path')})
                                        (command.ControlFlow
                                          token: 
                                            (Token
                                              id: Id.ControlFlow_Return
                                              val: return
                                              span_id: 847
                                            )
                                          arg_word: {(0)}
                                        )
                                      ]
                                      spids: [802 839]
                                    )
                                  ]
                                )
                              ]
                              spids: [798 799 855 -1]
                            )
                          ]
                        )
                      ]
                    )
                )
              ]
              negated: F
            )
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Return val:return span_id:865)
              arg_word: {(1)}
            )
          ]
        )
    )
    (command.ShFunction
      name: shell_exists
      body: 
        (command.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_Other '$') ("' ") (${ Id.VSub_Name ETCSHELLS) (' > /dev/null 2>&1')
                      )
                    }
                  spids: [906]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.Pipeline
                          children: [(C {(eval)} {($ Id.VSub_DollarName '$_shellchk')})]
                          negated: T
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:930)
                    )
                  ]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (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: (Token id:Id.Op_Semi val:';' span_id:957)
                            )
                          ]
                          action: [
                            (C {(err)} 
                              {
                                (DQ ('Invalid shell (') ($ Id.VSub_DollarName '$_sh') (') for user ') 
                                  ($ Id.VSub_DollarName '$username') (.)
                                )
                              }
                            )
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Return val:return span_id:973)
                              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: (Token id:Id.ControlFlow_Return val:return span_id:1009)
              arg_word: {(0)}
            )
          ]
        )
    )
    (command.ShFunction
      name: save_config
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(echo)} {(DQ ('# Configuration file for adduser(8).'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1044)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('# NOTE: only *some* variables are saved.'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1057)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [
                {(echo)}
                {
                  (DQ ('# Last Modified on ') 
                    (command_sub
                      left_token: (Token id:Id.Left_Backtick val:'`' span_id:1068)
                      command_list: (command.CommandList children:[(C {(${ Id.VSub_Name DATECMD)})])
                    ) (.)
                  )
                }
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1078)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(SQ )}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1090)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('defaultHomePerm=') ($ Id.VSub_DollarName '$uhomeperm'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1104)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('defaultLgroup=') ($ Id.VSub_DollarName '$ulogingroup'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1118)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('defaultclass=') ($ Id.VSub_DollarName '$uclass'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1132)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('defaultgroups=') ($ Id.VSub_DollarName '$ugroups'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1146)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('passwdtype=') ($ Id.VSub_DollarName '$passwdtype'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1160)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('homeprefix=') ($ Id.VSub_DollarName '$homeprefix'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1174)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('defaultshell=') ($ Id.VSub_DollarName '$ushell'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1188)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('udotdir=') ($ Id.VSub_DollarName '$udotdir'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1202)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('msgfile=') ($ Id.VSub_DollarName '$msgfile'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1216)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('disableflag=') ($ Id.VSub_DollarName '$disableflag'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1230)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(DQ ('uidstart=') ($ Id.VSub_DollarName '$uidstart'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:1244)
                  fd: -1
                  arg_word: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: add_user
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1292)
                    )
                  ]
                  action: [
                    (C {(save_config)})
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Return val:return span_id:1300)
                    )
                  ]
                  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 (Token id:Id.Lit_Chars val:'-u "$uuid"' span_id:1375))}
                      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 (Token id:Id.Lit_Chars val:'-g "$ulogingroup"' span_id:1393))}
                      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 (Token id:Id.Lit_Chars val:'-G "$ugroups"' span_id:1411))}
                      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 (Token id:Id.Lit_Chars val:'-s "$ushell"' span_id:1429))}
                      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 (Token id:Id.Lit_Chars val:'-L "$uclass"' span_id:1447))}
                      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 (Token id:Id.Lit_Chars val:'-c "$ugecos"' span_id:1465))}
                      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 (Token id:Id.Lit_Chars val:'-k "$udotdir"' span_id:1483))}
                      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 (Token id:Id.Lit_Chars val:'-e "$uexpire"' span_id:1501))}
                      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 (Token id:Id.Lit_Chars val:'-p "$upwexpire"' span_id:1519))}
                      spids: [1517]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$Dflag'))} {(-a)} 
                          {(-n)} {(DQ ($ Id.VSub_DollarName '$uhome'))} {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1542)
                    )
                  ]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$uhome'))} 
                                  {(Id.Lit_Equals '=')} {(DQ ($ Id.VSub_DollarName '$NOHOME'))} {(Id.Lit_RBracket ']')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:1570)
                            )
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:_home)
                                  op: assign_op.Equal
                                  rhs: {(SQ (Token id:Id.Lit_Chars val:'-d "$uhome"' span_id:1577))}
                                  spids: [1575]
                                )
                              ]
                            )
                          ]
                          spids: [1555 1572]
                        )
                      ]
                      else_action: [
                        (command.If
                          arms: [
                            (if_arm
                              cond: [
                                (command.Sentence
                                  child: 
                                    (C {(Id.Lit_LBracket '[')} {(-n)} 
                                      {(DQ ($ Id.VSub_DollarName '$uhomeperm'))} {(Id.Lit_RBracket ']')}
                                    )
                                  terminator: (Token id:Id.Op_Semi val:';' span_id:1599)
                                )
                              ]
                              action: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:_home)
                                      op: assign_op.Equal
                                      rhs: 
                                        {
                                          (SQ 
                                            (Token
                                              id: Id.Lit_Chars
                                              val: '-m -d "$uhome" -M "$uhomeperm"'
                                              span_id: 1606
                                            )
                                          )
                                        }
                                      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 (Token id:Id.Lit_Chars val:'-m -d "$uhome"' span_id:1615))}
                                  spids: [1613]
                                )
                              ]
                            )
                          ]
                        )
                      ]
                    )
                  ]
                  spids: [1523 1544]
                )
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$Dflag'))} {(-a)} 
                          {(-n)} {(DQ ($ Id.VSub_DollarName '$uhome'))} {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1644)
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_home)
                          op: assign_op.Equal
                          rhs: {(SQ (Token id:Id.Lit_Chars val:'-d "$uhome"' span_id:1651))}
                          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 (Token id:Id.Lit_Chars val:'echo "$upass" |' span_id:1726))}
                          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: [
                    (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: (Token id:Id.Left_Backtick val:'`' span_id:1817)
                                        command_list: 
                                          (command.CommandList
                                            children: [(C {(eval)} {($ Id.VSub_DollarName '$_pwcmd')})]
                                          )
                                      )
                                    }
                                  spids: [1816]
                                )
                              ]
                            )
                          ]
                          negated: T
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1825)
                    )
                  ]
                  action: [
                    (C {(err)} 
                      {
                        (DQ ('There was an error adding user (') ($ Id.VSub_DollarName '$username') 
                          (').')
                        )
                      }
                    )
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Return val:return span_id:1839)
                      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: [
                        (command.Sentence
                          child: 
                            (C {(Id.Lit_LBracket '[')} {(DQ (random))} {(Id.Lit_Equals '=')} 
                              {(DQ ($ Id.VSub_DollarName '$passwdtype'))} {(Id.Lit_RBracket ']')}
                            )
                          terminator: (Token id:Id.Op_Semi val:';' span_id:1871)
                        )
                      ]
                      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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$disableflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1910)
                    )
                  ]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(${ Id.VSub_Name PWCMD)} {(lock)} 
                                  {($ Id.VSub_DollarName '$username')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:1925)
                            )
                          ]
                          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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$msgflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1978)
                    )
                  ]
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {(Id.Lit_LBracket '[')} {(-r)} {(DQ ($ Id.VSub_DollarName '$msgfile'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                        (command.BraceGroup
                          children: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:_dir)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ 
                                        (command_sub
                                          left_token: 
                                            (Token
                                              id: Id.Left_Backtick
                                              val: '`'
                                              span_id: 2020
                                            )
                                          command_list: 
                                            (command.CommandList
                                              children: [
                                                (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: 
                                            (Token
                                              id: Id.Left_Backtick
                                              val: '`'
                                              span_id: 2032
                                            )
                                          command_list: 
                                            (command.CommandList
                                              children: [
                                                (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: (Token id:Id.Left_Backtick val:'`' span_id:2043)
                                        command_list: 
                                          (command.CommandList
                                            children: [
                                              (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: (Token id:Id.Left_Backtick val:'`' span_id:2064)
                                        command_list: 
                                          (command.CommandList
                                            children: [
                                              (C {(/usr/bin/find)} {($ Id.VSub_DollarName '$_dir')} 
                                                {(-name)} {($ Id.VSub_DollarName '$_file')} {(-user)} {(0)} {(-prune)}
                                              )
                                            ]
                                          )
                                      )
                                    }
                                  spids: [2063]
                                )
                              ]
                            )
                            (command.If
                              arms: [
                                (if_arm
                                  cond: [
                                    (command.Sentence
                                      child: 
                                        (C {(Id.Lit_LBracket '[')} {(-z)} 
                                          {(DQ ($ Id.VSub_DollarName '$_owner'))} {(-o)} {(-n)} {(DQ ($ Id.VSub_DollarName '$_perms'))} {(Id.Lit_RBracket ']')}
                                        )
                                      terminator: (Token id:Id.Op_Semi val:';' span_id:2102)
                                    )
                                  ]
                                  action: [
                                    (C {(err)} 
                                      {
                                        (DQ ('The message file (') ($ Id.VSub_DollarName '$msgfile') 
                                          (') may be writeable only by root.')
                                        )
                                      }
                                    )
                                    (command.ControlFlow
                                      token: (Token id:Id.ControlFlow_Return val:return span_id:2116)
                                      arg_word: {(1)}
                                    )
                                  ]
                                  spids: [2083 2104]
                                )
                              ]
                            )
                            (command.Pipeline
                              children: [
                                (C {(cat)} {(DQ ($ Id.VSub_DollarName '$msgfile'))})
                                (command.WhileUntil
                                  keyword: (Token id:Id.KW_While val:while span_id:2133)
                                  cond: [
                                    (command.Sentence
                                      child: (C {(read)} {(_line)})
                                      terminator: (Token id:Id.Op_Semi val:';' span_id:2139)
                                    )
                                  ]
                                  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: 
        (command.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: (Token id:Id.ControlFlow_Return val:return span_id:2236)
                )
              ]
            )
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:2240)
              cond: [
                (command.Sentence
                  child: (C {(Id.Lit_Other ':')})
                  terminator: (Token id:Id.Op_Semi val:';' span_id:2244)
                )
              ]
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                                  {(Id.Lit_RBracket ']')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:2260)
                            )
                          ]
                          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: (Token id:Id.Left_Backtick val:'`' span_id:2284)
                                      command_list: 
                                        (command.CommandList
                                          children: [
                                            (command.Pipeline
                                              children: [
                                                (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                                (C {(cut)} {(-f1)} {(-d) (Id.Lit_Other ':')})
                                              ]
                                              negated: F
                                            )
                                          ]
                                        )
                                    )
                                  )
                                }
                              spids: [2282]
                            )
                          ]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                                  {(Id.Lit_RBracket ']')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:2336)
                            )
                          ]
                          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: (Token id:Id.ControlFlow_Continue val:continue span_id:2360)
                                )
                              ]
                            )
                          ]
                          spids: [2325 2338]
                        )
                      ]
                    )
                    (command.Simple
                      words: [{(${ Id.VSub_Name PWCMD)} {(usershow)} {($ Id.VSub_DollarName '$_input')}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Great val:'>' span_id:2374)
                          fd: -1
                          arg_word: {(/dev/null)}
                        )
                        (redir.Redir
                          op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:2378)
                          fd: 2
                          arg_word: {(1)}
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_QMark '$?'))} {(-eq)} {(0)} 
                                  {(Id.Lit_RBracket ']')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:2395)
                            )
                          ]
                          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: (Token id:Id.ControlFlow_Continue val:continue span_id:2419)
                                )
                              ]
                            )
                          ]
                          spids: [2382 2397]
                        )
                      ]
                    )
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Break val:break span_id:2425)
                    )
                  ]
                )
            )
            (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: 
        (command.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: (Token id:Id.ControlFlow_Return val:return span_id:2478)
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:2493)
                    )
                  ]
                  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: (Token id:Id.Left_Backtick val:'`' span_id:2517)
                              command_list: 
                                (command.CommandList
                                  children: [
                                    (command.Pipeline
                                      children: [
                                        (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                        (C {(cut)} {(-f7)} {(-d) (Id.Lit_Other ':')})
                                      ]
                                      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: 
        (command.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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$Sflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:2599)
                    )
                  ]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (command.Pipeline
                                  children: [(C {(shell_exists)} {($ Id.VSub_DollarName '$ushell')})]
                                  negated: T
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:2612)
                            )
                          ]
                          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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:2652)
                    )
                  ]
                  action: [
                    (C {(echo)} {(-n)} 
                      {
                        (DQ ('Shell (') ($ Id.VSub_DollarName '$shells') (') [') 
                          (command_sub
                            left_token: (Token id:Id.Left_Backtick val:'`' span_id:2665)
                            command_list: 
                              (command.CommandList
                                children: [(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: (Token id:Id.Left_Backtick val:'`' span_id:2686)
                              command_list: 
                                (command.CommandList
                                  children: [
                                    (command.Pipeline
                                      children: [
                                        (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                        (C {(cut)} {(-f9)} {(-d) (Id.Lit_Other ':')})
                                      ]
                                      negated: F
                                    )
                                  ]
                                )
                            )
                          )
                        }
                      spids: [2684]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:2721)
                    )
                  ]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$Sflag'))} 
                                  {(Id.Lit_RBracket ']')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:2737)
                            )
                          ]
                          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: (Token id:Id.Left_Backtick val:'`' span_id:2752)
                                    command_list: 
                                      (command.CommandList
                                        children: [
                                          (C {(fullpath_from_shell)} {($ Id.VSub_DollarName '$_input')})
                                        ]
                                      )
                                  )
                                }
                              spids: [2751]
                            )
                          ]
                        )
                        (command.If
                          arms: [
                            (if_arm
                              cond: [
                                (command.Sentence
                                  child: 
                                    (C {(Id.Lit_LBracket '[')} {(-n)} 
                                      {(DQ ($ Id.VSub_DollarName '$_fullpath'))} {(Id.Lit_RBracket ']')}
                                    )
                                  terminator: (Token id:Id.Op_Semi val:';' span_id:2772)
                                )
                              ]
                              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: 
        (command.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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:2858)
                    )
                  ]
                  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: (Token id:Id.Left_Backtick val:'`' span_id:2890)
                              command_list: 
                                (command.CommandList
                                  children: [
                                    (command.Pipeline
                                      children: [
                                        (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                        (C {(cut)} {(-f8)} {(-d) (Id.Lit_Other ':')})
                                      ]
                                      negated: F
                                    )
                                  ]
                                )
                            )
                          )
                        }
                      spids: [2888]
                    )
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:2926)
                    )
                  ]
                  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: (Token id:Id.Left_Backtick val:'`' span_id:2967)
                                      command_list: 
                                        (command.CommandList
                                          children: [(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: 
        (command.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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$uhomeperm'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:3042)
                    )
                  ]
                  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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:3080)
                    )
                  ]
                  action: [
                    (C {(echo)} {(-n)} {(DQ ($ Id.VSub_DollarName '$_prompt'))})
                    (C {(read)} {(_input)})
                  ]
                  spids: [3069 3082]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$_input'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:3114)
                    )
                  ]
                  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: 
        (command.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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$uuid'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:3173)
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:uuid)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: (Token id:Id.Left_Backtick val:'`' span_id:3179)
                                command_list: 
                                  (command.CommandList
                                    children: [(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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:3219)
                    )
                  ]
                  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: (Token id:Id.Left_Backtick val:'`' span_id:3243)
                              command_list: 
                                (command.CommandList
                                  children: [
                                    (command.Pipeline
                                      children: [
                                        (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                        (C {(cut)} {(-f2)} {(-d) (Id.Lit_Other ':')})
                                      ]
                                      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: (Token id:Id.Left_Backtick val:'`' span_id:3285)
                        command_list: 
                          (command.CommandList
                            children: [(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: 
        (command.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: (Token id:Id.VSub_Name val:uclass span_id:3327)
                        suffix_op: 
                          (suffix_op.Unary
                            op_id: Id.VTest_ColonHyphen
                            arg_word: {(DQ (default))}
                          )
                      )
                    }
                  spids: [3325]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:3347)
                    )
                  ]
                  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: (Token id:Id.Left_Backtick val:'`' span_id:3373)
                              command_list: 
                                (command.CommandList
                                  children: [
                                    (command.Pipeline
                                      children: [
                                        (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                        (C {(cut)} {(-f4)} {(-d) (Id.Lit_Other ':')})
                                      ]
                                      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: 
        (command.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: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:3467)
                    )
                  ]
                  action: [
                    (C {(echo)} {(-n)} 
                      {
                        (DQ ('Login group [') 
                          (braced_var_sub
                            token: (Token id:Id.VSub_Name val:ulogingroup span_id:3479)
                            suffix_op: 
                              (suffix_op.Unary
                                op_id: 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: (Token id:Id.Left_Backtick val:'`' span_id:3497)
                              command_list: 
                                (command.CommandList
                                  children: [
                                    (command.Pipeline
                                      children: [
                                        (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                        (C {(cut)} {(-f3)} {(-d) (Id.Lit_Other ':')})
                                      ]
                                      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: 
        (command.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: (Token id:Id.VSub_Name val:ulogingroup span_id:3576)
                        suffix_op: 
                          (suffix_op.Unary
                            op_id: Id.VTest_ColonHyphen
                            arg_word: {(DQ (${ Id.VSub_Name username))}
                          )
                      )
                    }
                  spids: [3574]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:3598)
                    )
                  ]
                  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: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:upwexpire)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (command_sub
                          left_token: (Token id:Id.Left_Backtick val:'`' span_id:3726)
                          command_list: 
                            (command.CommandList
                              children: [
                                (command.Pipeline
                                  children: [
                                    (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                    (C {(cut)} {(-f5)} {(-d) (Id.Lit_Other ':')})
                                  ]
                                  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: (Token id:Id.Left_Backtick val:'`' span_id:3749)
                          command_list: 
                            (command.CommandList
                              children: [
                                (command.Pipeline
                                  children: [
                                    (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fileline'))})
                                    (C {(cut)} {(-f6)} {(-d) (Id.Lit_Other ':')})
                                  ]
                                  negated: F
                                )
                              ]
                            )
                        )
                      )
                    }
                  spids: [3747]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: get_password
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$savedpwtype'))} 
                  {(Id.Lit_RBracket ']')}
                )
                (command.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: (Token id:Id.VSub_Name val:fileline span_id:3847)
                        suffix_op: 
                          (suffix_op.Unary
                            op_id: Id.VOp1_Pound
                            arg_word: {('*:*:*:*:*:*:*:*:*:')}
                          )
                      )
                    }
                  spids: [3845]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$upass'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:3865)
                    )
                  ]
                  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: [3885]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:savedpwtype)
                                  op: assign_op.Equal
                                  rhs: {(yes)}
                                  spids: [3889]
                                )
                              ]
                            )
                          ]
                          spids: [3877 3878 3893 -1]
                        )
                      ]
                    )
                  ]
                  spids: [3854 3867]
                )
              ]
              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: [3913]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:savedpwtype)
                              op: assign_op.Equal
                              rhs: {(random)}
                              spids: [3917]
                            )
                          ]
                        )
                      ]
                      spids: [3909 3910 3921 -1]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: input_from_file
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_field)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [3951]
                )
              ]
            )
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:3955)
              cond: [
                (command.Sentence
                  child: (C {(read)} {(-r)} {(fileline)})
                  terminator: (Token id:Id.Op_Semi val:';' span_id:3963)
                )
              ]
              body: 
                (command.DoGroup
                  children: [
                    (command.Case
                      to_match: {(DQ ($ Id.VSub_DollarName '$fileline'))}
                      arms: [
                        (case_arm
                          pat_list: [
                            {
                              (word_part.EscapedLiteral
                                token: (Token id:Id.Lit_EscapedChar val:'\\#' span_id:3977)
                              ) (Id.Lit_Star '*')
                            }
                            {(SQ )}
                          ]
                          spids: [3977 3982 3985 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.Lit_Star '*')}]
                          action: [
                            (command.AndOr
                              ops: [Id.Op_DPipe]
                              children: [
                                (C {(get_user)})
                                (command.ControlFlow
                                  token: (Token id:Id.ControlFlow_Continue val:continue span_id:3996)
                                )
                              ]
                            )
                            (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: [4026]
                                )
                              ]
                            )
                            (C {(add_user)})
                          ]
                          spids: [3988 3989 4036 -1]
                        )
                      ]
                    )
                  ]
                )
            )
          ]
        )
    )
    (command.ShFunction
      name: input_interactive
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_disable)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [4066]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_pass)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [4069]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_passconfirm)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [4072]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_random)
                  op: assign_op.Equal
                  rhs: {(DQ (no))}
                  spids: [4075]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_emptypass)
                  op: assign_op.Equal
                  rhs: {(DQ (no))}
                  spids: [4081]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_usepass)
                  op: assign_op.Equal
                  rhs: {(DQ (yes))}
                  spids: [4087]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_logingroup_ok)
                  op: assign_op.Equal
                  rhs: {(DQ (no))}
                  spids: [4093]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_groups_ok)
                  op: assign_op.Equal
                  rhs: {(DQ (no))}
                  spids: [4099]
                )
              ]
            )
            (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: [4116]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:_usepass)
                          op: assign_op.Equal
                          rhs: {(DQ (yes))}
                          spids: [4122]
                        )
                      ]
                    )
                  ]
                  spids: [4112 4113 4128 -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: [4135]
                        )
                      ]
                    )
                  ]
                  spids: [4131 4132 4141 -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: [4148]
                        )
                      ]
                    )
                  ]
                  spids: [4144 4145 4154 -1]
                )
              ]
            )
            (C {(get_user)})
            (C {(get_gecos)})
            (C {(get_uid)})
            (command.WhileUntil
              keyword: (Token id:Id.KW_Until val:until span_id:4179)
              cond: [
                (command.Sentence
                  child: 
                    (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$_logingroup_ok'))} 
                      {(Id.Lit_Equals '=')} {(yes)} {(Id.Lit_RBracket ']')}
                    )
                  terminator: (Token id:Id.Op_Semi val:';' span_id:4192)
                )
              ]
              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: [4200]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (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: (Token id:Id.Op_Semi val:';' span_id:4228)
                            )
                          ]
                          action: [
                            (command.If
                              arms: [
                                (if_arm
                                  cond: [
                                    (command.Sentence
                                      child: 
                                        (command.Pipeline
                                          children: [
                                            (command.Simple
                                              words: [
                                                {(${ Id.VSub_Name PWCMD)}
                                                {(show)}
                                                {(group)}
                                                {($ Id.VSub_DollarName '$ulogingroup')}
                                              ]
                                              redirects: [
                                                (redir.Redir
                                                  op: (Token id:Id.Redir_Great val:'>' span_id:4247)
                                                  fd: -1
                                                  arg_word: {(/dev/null)}
                                                )
                                                (redir.Redir
                                                  op: 
                                                    (Token
                                                      id: Id.Redir_GreatAnd
                                                      val: '2>&'
                                                      span_id: 4251
                                                    )
                                                  fd: 2
                                                  arg_word: {(1)}
                                                )
                                              ]
                                            )
                                          ]
                                          negated: T
                                        )
                                      terminator: (Token id:Id.Op_Semi val:';' span_id:4253)
                                    )
                                  ]
                                  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: [4267]
                                        )
                                      ]
                                    )
                                  ]
                                  spids: [4233 4255]
                                )
                              ]
                            )
                          ]
                          spids: [4204 4230]
                        )
                      ]
                    )
                  ]
                )
            )
            (command.WhileUntil
              keyword: (Token id:Id.KW_Until val:until span_id:4280)
              cond: [
                (command.Sentence
                  child: 
                    (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$_groups_ok'))} 
                      {(Id.Lit_Equals '=')} {(yes)} {(Id.Lit_RBracket ']')}
                    )
                  terminator: (Token id:Id.Op_Semi val:';' span_id:4293)
                )
              ]
              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: [4301]
                        )
                      ]
                    )
                    (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: [
                                    (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: (Token id:Id.Op_Semi val:';' span_id:4333)
                                    )
                                  ]
                                  action: [
                                    (command.If
                                      arms: [
                                        (if_arm
                                          cond: [
                                            (command.Sentence
                                              child: 
                                                (command.Pipeline
                                                  children: [
                                                    (command.Simple
                                                      words: [
                                                        {(${ Id.VSub_Name PWCMD)}
                                                        {(show)}
                                                        {(group)}
                                                        {($ Id.VSub_DollarName '$i')}
                                                      ]
                                                      redirects: [
                                                        (redir.Redir
                                                          op: 
                                                            (Token
                                                              id: Id.Redir_Great
                                                              val: '>'
                                                              span_id: 4352
                                                            )
                                                          fd: -1
                                                          arg_word: {(/dev/null)}
                                                        )
                                                        (redir.Redir
                                                          op: 
                                                            (Token
                                                              id: Id.Redir_GreatAnd
                                                              val: '2>&'
                                                              span_id: 4356
                                                            )
                                                          fd: 2
                                                          arg_word: {(1)}
                                                        )
                                                      ]
                                                    )
                                                  ]
                                                  negated: T
                                                )
                                              terminator: (Token id:Id.Op_Semi val:';' span_id:4358)
                                            )
                                          ]
                                          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: [4372]
                                                )
                                              ]
                                            )
                                          ]
                                          spids: [4338 4360]
                                        )
                                      ]
                                    )
                                  ]
                                  spids: [4317 4335]
                                )
                              ]
                            )
                          ]
                        )
                    )
                  ]
                )
            )
            (C {(get_class)})
            (C {(get_shell)})
            (C {(get_homedir)})
            (C {(get_homeperm)})
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:4402)
              cond: [
                (command.Sentence
                  child: (C {(Id.Lit_Other ':')})
                  terminator: (Token id:Id.Op_Semi val:';' span_id:4406)
                )
              ]
              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: [4439]
                            )
                          ]
                        )
                      ]
                    )
                    (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: [4463]
                                )
                              ]
                            )
                          ]
                          spids: [4450 4460 4469 -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: (Token id:Id.KW_While val:while span_id:4495)
                              cond: [
                                (command.Sentence
                                  child: (C {(Id.Lit_Other ':')})
                                  terminator: (Token id:Id.Op_Semi val:';' span_id:4499)
                                )
                              ]
                              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: [4532]
                                            )
                                          ]
                                        )
                                      ]
                                    )
                                    (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: [4584]
                                                    )
                                                  ]
                                                )
                                              ]
                                            )
                                            (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: [4620]
                                                        )
                                                      ]
                                                    )
                                                    (command.ControlFlow
                                                      token: 
                                                        (Token
                                                          id: Id.ControlFlow_Break
                                                          val: break
                                                          span_id: 4626
                                                        )
                                                    )
                                                  ]
                                                  spids: [4597 4617 4629 -1]
                                                )
                                              ]
                                            )
                                            (command.ShAssignment
                                              pairs: [
                                                (assign_pair
                                                  lhs: (sh_lhs_expr.Name name:passwdtype)
                                                  op: assign_op.Equal
                                                  rhs: {(DQ (yes))}
                                                  spids: [4635]
                                                )
                                              ]
                                            )
                                            (command.AndOr
                                              ops: [Id.Op_DAmp]
                                              children: [
                                                (C {(Id.Lit_LBracket '[')} {(-n)} 
                                                  {(DQ ($ Id.VSub_DollarName '$configflag'))} {(Id.Lit_RBracket ']')}
                                                )
                                                (command.ControlFlow
                                                  token: 
                                                    (Token
                                                      id: Id.ControlFlow_Break
                                                      val: break
                                                      span_id: 4653
                                                    )
                                                )
                                              ]
                                            )
                                            (C {(trap)} 
                                              {
                                                (SQ 
                                                  (Token
                                                    id: Id.Lit_Chars
                                                    val: 'stty echo; exit'
                                                    span_id: 4659
                                                  )
                                                )
                                              } {(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: 
                                                    (Token
                                                      id: Id.ControlFlow_Continue
                                                      val: continue
                                                      span_id: 4756
                                                    )
                                                )
                                              ]
                                            )
                                          ]
                                          spids: [4543 4553 4759 -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: [4785]
                                                )
                                              ]
                                            )
                                            (command.Sentence
                                              child: 
                                                (command.ControlFlow
                                                  token: 
                                                    (Token
                                                      id: Id.ControlFlow_Break
                                                      val: break
                                                      span_id: 4791
                                                    )
                                                )
                                              terminator: (Token id:Id.Op_Semi val:';' span_id:4792)
                                            )
                                          ]
                                          spids: [4762 4782 4795 -1]
                                        )
                                        (case_arm
                                          pat_list: [{(Id.Lit_Star '*')}]
                                          action: [
                                            (command.ControlFlow
                                              token: 
                                                (Token
                                                  id: Id.ControlFlow_Continue
                                                  val: continue
                                                  span_id: 4806
                                                )
                                            )
                                          ]
                                          spids: [4798 4799 4809 -1]
                                        )
                                      ]
                                    )
                                    (command.If
                                      arms: [
                                        (if_arm
                                          cond: [
                                            (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: (Token id:Id.Op_Semi val:';' span_id:4831)
                                            )
                                          ]
                                          action: [
                                            (C {(echo)} {(DQ ('Passwords did not match!'))})
                                            (command.ControlFlow
                                              token: 
                                                (Token
                                                  id: Id.ControlFlow_Continue
                                                  val: continue
                                                  span_id: 4843
                                                )
                                            )
                                          ]
                                          spids: [4815 4833]
                                        )
                                      ]
                                    )
                                    (command.ControlFlow
                                      token: (Token id:Id.ControlFlow_Break val:break span_id:4849)
                                    )
                                  ]
                                )
                            )
                          ]
                          spids: [4472 4492 4855 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.Lit_Star '*')}]
                          action: [
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Continue val:continue span_id:4866)
                            )
                          ]
                          spids: [4858 4859 4869 -1]
                        )
                      ]
                    )
                    (command.Sentence
                      child: 
                        (command.ControlFlow
                          token: (Token id:Id.ControlFlow_Break val:break span_id:4875)
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:4876)
                    )
                  ]
                )
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_disable)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: (Token id:Id.VSub_Name val:disableflag span_id:4884)
                        suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(DQ (no))})
                      )
                    }
                  spids: [4882]
                )
              ]
            )
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:4892)
              cond: [
                (command.Sentence
                  child: (C {(Id.Lit_Other ':')})
                  terminator: (Token id:Id.Op_Semi val:';' span_id:4896)
                )
              ]
              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: [4929]
                            )
                          ]
                        )
                      ]
                    )
                    (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: [4953]
                                )
                              ]
                            )
                          ]
                          spids: [4940 4950 4956 -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: [4982]
                                )
                              ]
                            )
                          ]
                          spids: [4959 4979 4986 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.Lit_Star '*')}]
                          action: [
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Continue val:continue span_id:4997)
                            )
                          ]
                          spids: [4989 4990 5000 -1]
                        )
                      ]
                    )
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Break val:break span_id:5006)
                    )
                  ]
                )
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_disable)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: (Token id:Id.VSub_Name val:disableflag span_id:5028)
                        suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(DQ (no))})
                      )
                    }
                  spids: [5026]
                )
              ]
            )
            (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_Other '\\') (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 (Token id:Id.Lit_Chars val:'*****' span_id:5074))}
                          spids: [5072]
                        )
                      ]
                    )
                  ]
                  spids: [5068 5069 5078 -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 (Token id:Id.Lit_Chars val:'<disabled>' span_id:5087))}
                          spids: [5085]
                        )
                      ]
                    )
                  ]
                  spids: [5081 5082 5091 -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 (Token id:Id.Lit_Chars val:'<blank>' span_id:5100))}
                          spids: [5098]
                        )
                      ]
                    )
                  ]
                  spids: [5094 5095 5104 -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 (Token id:Id.Lit_Chars val:'<random>' span_id:5113))}
                          spids: [5111]
                        )
                      ]
                    )
                  ]
                  spids: [5107 5108 5117 -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_Other '\\') (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_Other '\\') (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_Other '\\') (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_Other '\\') (n))} {(DQ (Uid))} 
                  {(DQ ($ Id.VSub_DollarName '$uuid'))}
                )
              ]
            )
            (C {(printf)} {(DQ ('%-10s : %s') (Id.Lit_Other '\\') (n))} {(DQ (Class))} 
              {(DQ ($ Id.VSub_DollarName '$uclass'))}
            )
            (C {(printf)} {(DQ ('%-10s : %s %s') (Id.Lit_Other '\\') (n))} {(DQ (Groups))} 
              {
                (DQ 
                  (braced_var_sub
                    token: (Token id:Id.VSub_Name val:ulogingroup span_id:5270)
                    suffix_op: 
                      (suffix_op.Unary
                        op_id: Id.VTest_ColonHyphen
                        arg_word: {($ Id.VSub_DollarName '$username')}
                      )
                  )
                )
              } {(DQ ($ Id.VSub_DollarName '$ugroups'))}
            )
            (C {(printf)} {(DQ ('%-10s : %s') (Id.Lit_Other '\\') (n))} {(DQ (Home))} 
              {(DQ ($ Id.VSub_DollarName '$uhome'))}
            )
            (C {(printf)} {(DQ ('%-10s : %s') (Id.Lit_Other '\\') (n))} {(DQ ('Home Mode'))} 
              {(DQ ($ Id.VSub_DollarName '$uhomeperm'))}
            )
            (C {(printf)} {(DQ ('%-10s : %s') (Id.Lit_Other '\\') (n))} {(DQ (Shell))} 
              {(DQ ($ Id.VSub_DollarName '$ushell'))}
            )
            (C {(printf)} {(DQ ('%-10s : %s') (Id.Lit_Other '\\') (n))} {(DQ (Locked))} 
              {(DQ ($ Id.VSub_DollarName '$_disable'))}
            )
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:5349)
              cond: [
                (command.Sentence
                  child: (C {(Id.Lit_Other ':')})
                  terminator: (Token id:Id.Op_Semi val:';' span_id:5353)
                )
              ]
              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: (Token id:Id.ControlFlow_Return val:return span_id:5392)
                              arg_word: {(1)}
                            )
                          ]
                          spids: [5379 5389 5397 -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: [5400 5420 5426 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.Lit_Star '*')}]
                          action: [
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Continue val:continue span_id:5433)
                            )
                          ]
                          spids: [5429 5430 5436 -1]
                        )
                      ]
                    )
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Break val:break span_id:5442)
                    )
                  ]
                )
            )
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Return val:return span_id:5448)
              arg_word: {(0)}
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:THISCMD)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_Backtick val:'`' span_id:5460)
                command_list: 
                  (command.CommandList
                    children: [(C {(/usr/bin/basename)} {($ Id.VSub_Number '$0')})]
                  )
              )
            }
          spids: [5459]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DEFAULTSHELL)
          op: assign_op.Equal
          rhs: {(/bin/sh)}
          spids: [5468]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ADDUSERCONF)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: (Token id:Id.VSub_Name val:ADDUSERCONF span_id:5474)
                  suffix_op: 
                    (suffix_op.Unary
                      op_id: Id.VTest_ColonHyphen
                      arg_word: {(Id.Lit_Slash /) (etc) (Id.Lit_Slash /) (adduser.conf)}
                    )
                )
              )
            }
          spids: [5471]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PWCMD)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: (Token id:Id.VSub_Name val:PWCMD span_id:5486)
                  suffix_op: 
                    (suffix_op.Unary
                      op_id: Id.VTest_ColonHyphen
                      arg_word: {(Id.Lit_Slash /) (usr) (Id.Lit_Slash /) (sbin) (Id.Lit_Slash /) (pw)}
                    )
                )
              )
            }
          spids: [5483]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:MAILCMD)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: (Token id:Id.VSub_Name val:MAILCMD span_id:5500)
                  suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(mail)})
                )
              )
            }
          spids: [5497]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ETCSHELLS)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: (Token id:Id.VSub_Name val:ETCSHELLS span_id:5509)
                  suffix_op: 
                    (suffix_op.Unary
                      op_id: Id.VTest_ColonHyphen
                      arg_word: {(Id.Lit_Slash /) (etc) (Id.Lit_Slash /) (shells)}
                    )
                )
              )
            }
          spids: [5506]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NOHOME)
          op: assign_op.Equal
          rhs: {(DQ (/nonexistent))}
          spids: [5518]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NOLOGIN)
          op: assign_op.Equal
          rhs: {(DQ (nologin))}
          spids: [5523]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NOLOGIN_PATH)
          op: assign_op.Equal
          rhs: {(DQ (/usr/sbin/nologin))}
          spids: [5528]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GREPCMD)
          op: assign_op.Equal
          rhs: {(DQ (/usr/bin/grep))}
          spids: [5533]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DATECMD)
          op: assign_op.Equal
          rhs: {(DQ (/bin/date))}
          spids: [5538]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:username)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5550]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uuid)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5552]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uidstart)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5554]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ugecos)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5556]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ulogingroup)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5558]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uclass)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5560]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uhome)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5562]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uhomeperm)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5564]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:upass)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5566]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ushell)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5568]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:udotdir)
          op: assign_op.Equal
          rhs: {(/usr/share/skel)}
          spids: [5570]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ugroups)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5573]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uexpire)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5575]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:upwexpire)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5577]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:shells)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_Backtick val:'`' span_id:5581)
                  command_list: (command.CommandList children:[(C {(valid_shells)})])
                )
              )
            }
          spids: [5579]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:passwdtype)
          op: assign_op.Equal
          rhs: {(DQ (yes))}
          spids: [5588]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:msgfile)
          op: assign_op.Equal
          rhs: {(/etc/adduser.msg)}
          spids: [5593]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:msgflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5596]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:quietflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5598]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:configflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5600]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5602]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:infile)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5604]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:disableflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5606]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:Dflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5608]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:Sflag)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5610]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:readconfig)
          op: assign_op.Equal
          rhs: {(DQ (yes))}
          spids: [5612]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:homeprefix)
          op: assign_op.Equal
          rhs: {(DQ (/home))}
          spids: [5617]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:randompass)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5622]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fileline)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5624]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:savedpwtype)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5626]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultclass)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5628]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultLgroup)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5630]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultgroups)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5632]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultshell)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name DEFAULTSHELL))}
          spids: [5634]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:defaultHomePerm)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [5641]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:procowner)
          op: assign_op.Equal
          rhs: 
            {
              (braced_var_sub
                token: (Token id:Id.VSub_Name val:procowner span_id:5658)
                suffix_op: 
                  (suffix_op.Unary
                    op_id: Id.VTest_ColonHyphen
                    arg_word: 
                      {
                        (command_sub
                          left_token: (Token id:Id.Left_Backtick val:'`' span_id:5660)
                          command_list: (command.CommandList children:[(C {(/usr/bin/id)} {(-u)})])
                        )
                      }
                  )
              )
            }
          spids: [5656]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$procowner'))} 
                  {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(DQ (0))} {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:5685)
            )
          ]
          action: [
            (C {(err)} 
              {
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 'you must be the super-user (uid 0) to use this utility.'
                    span_id: 5693
                  )
                )
              }
            )
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:5697)
              arg_word: {(1)}
            )
          ]
          spids: [5669 5687]
        )
      ]
    )
    (command.ForEach
      iter_name: _i
      iter_words: [{($ Id.VSub_Star '$*')}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$_i'))} 
                          {(Id.Lit_Equals '=')} {(DQ (-N))} {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:5750)
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:readconfig)
                          op: assign_op.Equal
                          rhs: (word.Empty)
                          spids: [5755]
                        )
                      ]
                    )
                    (command.Sentence
                      child: 
                        (command.ControlFlow
                          token: (Token id:Id.ControlFlow_Break val:break span_id:5758)
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:5759)
                    )
                  ]
                  spids: [5735 5752]
                )
              ]
            )
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$readconfig'))} 
                  {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:5777)
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.Subshell
                          command_list: 
                            (command.CommandList
                              children: [
                                (command.Simple
                                  words: [{(.)} {(${ Id.VSub_Name ADDUSERCONF)}]
                                  redirects: [
                                    (redir.Redir
                                      op: (Token id:Id.Redir_Great val:'>' span_id:5800)
                                      fd: -1
                                      arg_word: {(/dev/null)}
                                    )
                                    (redir.Redir
                                      op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:5804)
                                      fd: 2
                                      arg_word: {(1)}
                                    )
                                  ]
                                )
                              ]
                            )
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:5808)
                    )
                  ]
                  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.Redir
                              op: (Token id:Id.Redir_Great val:'>' span_id:5831)
                              fd: -1
                              arg_word: {(/dev/null)}
                            )
                            (redir.Redir
                              op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:5835)
                              fd: 2
                              arg_word: {(1)}
                            )
                          ]
                        )
                      ]
                    )
                  ]
                  spids: [5790 5810]
                )
              ]
            )
          ]
          spids: [5766 5779]
        )
      ]
    )
    (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: [5871]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:5878)
                    )
                    (C {(shift)})
                  ]
                  spids: [5867 5868 5883 -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: [5890]
                        )
                      ]
                    )
                    (C {(shift)})
                  ]
                  spids: [5886 5887 5897 -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: [5904]
                        )
                      ]
                    )
                    (C {(shift)})
                  ]
                  spids: [5900 5901 5911 -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: [5918]
                        )
                      ]
                    )
                    (C {(shift)})
                  ]
                  spids: [5914 5915 5925 -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: [5932]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:5939)
                    )
                    (C {(shift)})
                  ]
                  spids: [5928 5929 5944 -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: [5968]
                            )
                          ]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:fflag)
                          op: assign_op.Equal
                          rhs: {(yes)}
                          spids: [5974]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:5979)
                    )
                    (C {(shift)})
                  ]
                  spids: [5947 5948 5984 -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: [5991]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:5998)
                    )
                    (C {(shift)})
                  ]
                  spids: [5987 5988 6003 -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: [6010]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:6017)
                    )
                    (C {(shift)})
                  ]
                  spids: [6006 6007 6022 -1]
                )
                (case_arm
                  pat_list: [{(-h)}]
                  action: [
                    (C {(show_usage)})
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Exit val:exit span_id:6032)
                      arg_word: {(0)}
                    )
                  ]
                  spids: [6025 6026 6037 -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: [6044]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:6051)
                    )
                    (C {(shift)})
                  ]
                  spids: [6040 6041 6056 -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: [6081]
                                )
                              ]
                            )
                          ]
                          spids: [6072 6078 6084 -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: [6091]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:msgfile)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_Number '$2'))}
                                  spids: [6095]
                                )
                              ]
                            )
                          ]
                          spids: [6087 6088 6101 -1]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:6108)
                    )
                    (C {(shift)})
                  ]
                  spids: [6059 6060 6113 -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: [6120]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:6125)
                    )
                    (C {(shift)})
                  ]
                  spids: [6116 6117 6130 -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: [6137]
                        )
                      ]
                    )
                    (C {(shift)})
                  ]
                  spids: [6133 6134 6143 -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: [6169]
                                )
                              ]
                            )
                          ]
                          spids: [6159 6166 6173 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.Lit_Star '*')}]
                          action: [
                            (C {(show_usage)})
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Exit val:exit span_id:6183)
                              arg_word: {(1)}
                            )
                          ]
                          spids: [6176 6177 6188 -1]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:6195)
                    )
                    (C {(shift)})
                  ]
                  spids: [6146 6147 6200 -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: [6207]
                        )
                      ]
                    )
                    (C {(shift)})
                  ]
                  spids: [6203 6204 6214 -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: (Token id:Id.Left_Backtick val:'`' span_id:6223)
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(fullpath_from_shell)} {($ Id.VSub_Number '$2')})]
                                    )
                                )
                              )
                            }
                          spids: [6221]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:6234)
                    )
                    (C {(shift)})
                  ]
                  spids: [6217 6218 6239 -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: [6246]
                        )
                      ]
                    )
                    (C {(shift)})
                  ]
                  spids: [6242 6243 6253 -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: [6260]
                        )
                      ]
                    )
                    (command.Sentence
                      child: (C {(shift)})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:6265)
                    )
                    (C {(shift)})
                  ]
                  spids: [6256 6257 6270 -1]
                )
              ]
            )
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$fflag'))} 
                  {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:6298)
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$infile'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:6314)
                    )
                  ]
                  action: [(C {(input_from_file)})]
                  spids: [6303 6316]
                )
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$infile'))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:6333)
                    )
                  ]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(Id.Lit_LBracket '[')} {(-r)} {(DQ ($ Id.VSub_DollarName '$infile'))} 
                                  {(Id.Lit_RBracket ']')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:6349)
                            )
                          ]
                          action: [
                            (command.Simple
                              words: [{(input_from_file)}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Less val:'<' span_id:6356)
                                  fd: -1
                                  arg_word: {($ Id.VSub_DollarName '$infile')}
                                )
                              ]
                            )
                          ]
                          spids: [6338 6351]
                        )
                      ]
                      else_action: [
                        (C {(err)} 
                          {
                            (DQ ('File (') ($ Id.VSub_DollarName '$infile') 
                              (') is unreadable or does not exist.')
                            )
                          }
                        )
                      ]
                    )
                  ]
                  spids: [6322 6335]
                )
              ]
            )
          ]
          spids: [6287 6300]
        )
      ]
      else_action: [
        (C {(input_interactive)})
        (command.WhileUntil
          keyword: (Token id:Id.KW_While val:while span_id:6384)
          cond: [
            (command.Sentence
              child: (C {(Id.Lit_Other ':')})
              terminator: (Token id:Id.Op_Semi val:';' span_id:6388)
            )
          ]
          body: 
            (command.DoGroup
              children: [
                (command.If
                  arms: [
                    (if_arm
                      cond: [
                        (command.Sentence
                          child: 
                            (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$configflag'))} 
                              {(Id.Lit_RBracket ']')}
                            )
                          terminator: (Token id:Id.Op_Semi val:';' span_id:6404)
                        )
                      ]
                      action: [(C {(echo)} {(-n)} {(DQ ('Add another user? (yes/no): '))})]
                      spids: [6393 6406]
                    )
                  ]
                  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: (Token id:Id.Left_Backtick val:'`' span_id:6469)
                                    command_list: 
                                      (command.CommandList
                                        children: [
                                          (C {(get_nextuid)} {($ Id.VSub_DollarName '$uidstart')})
                                        ]
                                      )
                                  )
                                }
                              spids: [6468]
                            )
                          ]
                        )
                        (C {(input_interactive)})
                        (command.ControlFlow
                          token: (Token id:Id.ControlFlow_Continue val:continue span_id:6481)
                        )
                      ]
                      spids: [6445 6465 6484 -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: [6487 6497 6507 -1]
                    )
                    (case_arm
                      pat_list: [{(Id.Lit_Star '*')}]
                      action: [
                        (command.ControlFlow
                          token: (Token id:Id.ControlFlow_Continue val:continue span_id:6514)
                        )
                      ]
                      spids: [6510 6511 6517 -1]
                    )
                  ]
                )
                (command.ControlFlow
                  token: (Token id:Id.ControlFlow_Break val:break span_id:6523)
                )
              ]
            )
        )
      ]
    )
  ]
)