(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:FAILED)
          op: assign_op.Equal
          rhs: {<no>}
          spids: [89]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:WORKDIR)
          op: assign_op.Equal
          rhs: {<work>}
          spids: [92]
        )
      ]
    )
    (command.ShFunction
      name: usage
      body: 
        (BraceGroup
          children: [
            (C {<echo>} {(DQ <'Usage: tests.sh [-s script] [-w workdir]'>)})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COMMAND)
          op: assign_op.Equal
          rhs: {<etcupdate>}
          spids: [120]
        )
      ]
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: 
        (condition.Shell
          commands: [
            (command.Sentence
              child: (C {<getopts>} {(DQ <'s:w:'>)} {<option>})
              terminator: <Id.Op_Semi _>
            )
          ]
        )
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {($ Id.VSub_DollarName '$option')}
              arms: [
                (case_arm
                  pat_list: [{<s>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:COMMAND)
                          op: assign_op.Equal
                          rhs: {(DQ <'sh '> ($ Id.VSub_DollarName '$OPTARG'))}
                          spids: [148]
                        )
                      ]
                    )
                  ]
                  spids: [144 145 155 -1]
                )
                (case_arm
                  pat_list: [{<w>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:WORKDIR)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$OPTARG')}
                          spids: [162]
                        )
                      ]
                    )
                  ]
                  spids: [158 159 166 -1]
                )
                (case_arm
                  pat_list: [{<Id.Lit_Star '*'>}]
                  action: [(C {<echo>}) (C {<usage>})]
                  spids: [169 170 179 -1]
                )
              ]
            )
          ]
        )
    )
    (C {<shift>} 
      {
        (word_part.ArithSub
          anode: 
            (arith_expr.Binary
              op_id: Id.Arith_Minus
              left: <Id.Lit_ArithVarLike OPTIND>
              right: {<Id.Lit_Digits 1>}
            )
        )
      }
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-ne>} {<0>} 
                      {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [(C {<usage>})]
          spids: [197 210]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:CONFLICTS)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$WORKDIR') <'/conflicts'>}
          spids: [218]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:OLD)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$WORKDIR') <'/old'>}
          spids: [222]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NEW)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$WORKDIR') <'/current'>}
          spids: [226]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TEST)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$WORKDIR') <'/test'>}
          spids: [230]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:states)
          op: assign_op.Equal
          rhs: {(DQ <'equal first second difftype difflinks difffiles'>)}
          spids: [238]
        )
      ]
    )
    (command.ShFunction
      name: build_trees
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<i>} {<j>} {<k>})
            (C {<rm>} {<-rf>} {($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$NEW')} 
              {($ Id.VSub_DollarName '$TEST')} {($ Id.VSub_DollarName '$CONFLICTS')}
            )
            (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$OLD') <'/etc'>} 
              {($ Id.VSub_DollarName '$NEW') <'/etc'>} {($ Id.VSub_DollarName '$TEST') <'/etc'>}
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$states')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.ForEach
                      iter_name: j
                      iter_words: [{($ Id.VSub_DollarName '$states')}]
                      do_arg_iter: F
                      body: 
                        (command.DoGroup
                          children: [
                            (command.ForEach
                              iter_name: k
                              iter_words: [{($ Id.VSub_DollarName '$states')}]
                              do_arg_iter: F
                              body: 
                                (command.DoGroup
                                  children: [
                                    (C {<mkdir>} {<-p>} 
                                      {($ Id.VSub_DollarName '$OLD') <'/'> ($ Id.VSub_DollarName '$i') 
                                        <'/'> ($ Id.VSub_DollarName '$j') <'/'> ($ Id.VSub_DollarName '$k')
                                      } 
                                      {($ Id.VSub_DollarName '$NEW') <'/'> ($ Id.VSub_DollarName '$i') 
                                        <'/'> ($ Id.VSub_DollarName '$j') <'/'> ($ Id.VSub_DollarName '$k')
                                      } 
                                      {($ Id.VSub_DollarName '$TEST') <'/'> 
                                        ($ Id.VSub_DollarName '$i') <'/'> ($ Id.VSub_DollarName '$j') <'/'> ($ Id.VSub_DollarName '$k')
                                      }
                                    )
                                  ]
                                )
                            )
                          ]
                        )
                    )
                  ]
                )
            )
            (command.ForEach
              iter_name: i
              iter_words: [
                {($ Id.VSub_DollarName '$OLD')}
                {($ Id.VSub_DollarName '$NEW')}
                {($ Id.VSub_DollarName '$TEST')}
              ]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkfifo>} {($ Id.VSub_DollarName '$i') <'/equal/equal/equal/fifo'>})
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/equal/equal/equal/file'>}
                        )
                      ]
                      do_fork: T
                    )
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/equal/equal/equal/dir'>})
                    (C {<ln>} {<-s>} {(DQ <bar>)} 
                      {($ Id.VSub_DollarName '$i') <'/equal/equal/equal/link'>}
                    )
                  ]
                )
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$NEW')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkfifo>} {($ Id.VSub_DollarName '$i') <'/equal/first/first/fifo'>})
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/equal/first/first/file'>}
                        )
                      ]
                      do_fork: T
                    )
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/equal/first/first/dir'>})
                    (C {<ln>} {<-s>} {(DQ <bar>)} 
                      {($ Id.VSub_DollarName '$i') <'/equal/first/first/link'>}
                    )
                  ]
                )
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$NEW')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkfifo>} {($ Id.VSub_DollarName '$i') <'/equal/difftype/difftype/fifo'>})
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/equal/difftype/difftype/fromdir'>})
                  ]
                )
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/equal/difftype/difftype/fifo'>}
                )
              ]
              do_fork: T
            )
            (C {<ln>} {<-s>} {(DQ <test>)} 
              {($ Id.VSub_DollarName '$TEST') <'/equal/difftype/difftype/fromdir'>}
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$NEW')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<ln>} {<-s>} {(DQ <foo>)} 
                      {($ Id.VSub_DollarName '$i') <'/equal/difflinks/difflinks/link'>}
                    )
                  ]
                )
            )
            (C {<ln>} {<-s>} {(DQ <bar>)} 
              {($ Id.VSub_DollarName '$TEST') <'/equal/difflinks/difflinks/link'>}
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$NEW')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/equal/difffiles/difffiles/file'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/equal/difffiles/difffiles/file'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkfifo>} {($ Id.VSub_DollarName '$i') <'/first/equal/second/fifo'>})
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/first/equal/second/file'>}
                        )
                      ]
                      do_fork: T
                    )
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/first/equal/second/emptydir'>})
                    (C {<ln>} {<-s>} {(DQ <bar>)} 
                      {($ Id.VSub_DollarName '$i') <'/first/equal/second/link'>}
                    )
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/first/equal/second/fulldir'>})
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/first/equal/second/fulldir/file'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$OLD') <'/first/first/equal/fifo'>})
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/first/first/equal/file'>}
                )
              ]
              do_fork: T
            )
            (C {<mkdir>} {($ Id.VSub_DollarName '$OLD') <'/first/first/equal/dir'>})
            (C {<ln>} {<-s>} {(DQ <bar>)} {($ Id.VSub_DollarName '$OLD') <'/first/first/equal/link'>})
            (C {<mkfifo>} {($ Id.VSub_DollarName '$OLD') <'/first/difftype/second/fifo'>})
            (C {<mkdir>} {($ Id.VSub_DollarName '$TEST') <'/first/difftype/second/fifo'>})
            (C {<ln>} {<-s>} {(DQ <'old link'>)} 
              {($ Id.VSub_DollarName '$OLD') <'/first/difflinks/second/link'>}
            )
            (C {<ln>} {<-s>} {(DQ <'test link'>)} 
              {($ Id.VSub_DollarName '$TEST') <'/first/difflinks/second/link'>}
            )
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/first/difffiles/second/file'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/first/difffiles/second/file'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/second/equal/first/file'>}
                )
              ]
              do_fork: T
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$NEW') <'/second/equal/first/fifo'>})
            (C {<ln>} {<-s>} {(DQ <new>)} {($ Id.VSub_DollarName '$NEW') <'/second/equal/first/link'>})
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/second/equal/first/emptydir'>})
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/second/equal/first/fulldir'>})
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/second/equal/first/fulldir/file'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$NEW')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkfifo>} {($ Id.VSub_DollarName '$i') <'/second/second/equal/fifo'>})
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/second/second/equal/file'>}
                        )
                      ]
                      do_fork: T
                    )
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/second/second/equal/dir'>})
                    (C {<ln>} {<-s>} {(DQ <bar>)} 
                      {($ Id.VSub_DollarName '$i') <'/second/second/equal/link'>}
                    )
                  ]
                )
            )
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/second/second/difftype/dir'>})
            (C {<mkfifo>} {($ Id.VSub_DollarName '$TEST') <'/second/second/difftype/dir'>})
            (C {<ln>} {<-s>} {(DQ <'new link'>)} 
              {($ Id.VSub_DollarName '$NEW') <'/second/second/difflinks/link'>}
            )
            (C {<ln>} {<-s>} {(DQ <'test link'>)} 
              {($ Id.VSub_DollarName '$TEST') <'/second/second/difflinks/link'>}
            )
            (command.Simple
              words: [{<echo>} {(DQ <new>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/second/second/difffiles/file'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <test>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/second/second/difffiles/file'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/difftype/equal/difftype/file'>}
                        )
                      ]
                      do_fork: T
                    )
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/difftype/equal/difftype/fromdir'>})
                    (C {<ln>} {<-s>} {(DQ <old>)} 
                      {($ Id.VSub_DollarName '$i') <'/difftype/equal/difftype/todir'>}
                    )
                  ]
                )
            )
            (C {<ln>} {<-s>} {(DQ <test>)} 
              {($ Id.VSub_DollarName '$NEW') <'/difftype/equal/difftype/file'>}
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$NEW') <'/difftype/equal/difftype/fromdir'>})
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/difftype/equal/difftype/todir'>})
            (C {<mkfifo>} {($ Id.VSub_DollarName '$OLD') <'/difftype/first/first/fifo'>})
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/difftype/first/first/fifo'>})
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/difftype/difftype/equal/fifo'>}
                )
              ]
              do_fork: T
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$OLD') <'/difftype/difftype/equal/file'>})
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$NEW')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkfifo>} {($ Id.VSub_DollarName '$i') <'/difftype/difftype/equal/fifo'>})
                    (command.Simple
                      words: [{<echo>} {(DQ <bar>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/difftype/difftype/equal/file'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$OLD') <'/difftype/difftype/difftype/one'>})
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/difftype/difftype/difftype/one'>})
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/difftype/difftype/difftype/one'>}
                )
              ]
              do_fork: T
            )
            (C {<mkdir>} {($ Id.VSub_DollarName '$OLD') <'/difftype/difftype/difftype/two'>})
            (command.Simple
              words: [{<echo>} {(DQ <baz>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/difftype/difftype/difftype/two'>}
                )
              ]
              do_fork: T
            )
            (C {<ln>} {<-s>} {(DQ <bar>)} 
              {($ Id.VSub_DollarName '$TEST') <'/difftype/difftype/difftype/two'>}
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$OLD') <'/difftype/difftype/difflinks/link'>})
            (C {<ln>} {<-s>} {(DQ <new>)} 
              {($ Id.VSub_DollarName '$NEW') <'/difftype/difftype/difflinks/link'>}
            )
            (C {<ln>} {<-s>} {(DQ <test>)} 
              {($ Id.VSub_DollarName '$TEST') <'/difftype/difftype/difflinks/link'>}
            )
            (C {<ln>} {<-s>} {(DQ <old>)} 
              {($ Id.VSub_DollarName '$OLD') <'/difftype/difftype/difffiles/file'>}
            )
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/difftype/difftype/difffiles/file'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/difftype/difftype/difffiles/file'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<ln>} {<-s>} {(DQ <old>)} 
                      {($ Id.VSub_DollarName '$i') <'/difflinks/equal/difflinks/link'>}
                    )
                  ]
                )
            )
            (C {<ln>} {<-s>} {(DQ <new>)} 
              {($ Id.VSub_DollarName '$NEW') <'/difflinks/equal/difflinks/link'>}
            )
            (C {<ln>} {<-s>} {(DQ <old>)} {($ Id.VSub_DollarName '$OLD') <'/difflinks/first/first/link'>})
            (C {<ln>} {<-s>} {(DQ <new>)} {($ Id.VSub_DollarName '$NEW') <'/difflinks/first/first/link'>})
            (C {<ln>} {<-s>} {(DQ <old>)} 
              {($ Id.VSub_DollarName '$OLD') <'/difflinks/difftype/difftype/link'>}
            )
            (C {<ln>} {<-s>} {(DQ <new>)} 
              {($ Id.VSub_DollarName '$NEW') <'/difflinks/difftype/difftype/link'>}
            )
            (command.Simple
              words: [{<echo>} {(DQ <test>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/difflinks/difftype/difftype/link'>}
                )
              ]
              do_fork: T
            )
            (C {<ln>} {<-s>} {(DQ <old>)} 
              {($ Id.VSub_DollarName '$OLD') <'/difflinks/difflinks/equal/link'>}
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$NEW')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<ln>} {<-s>} {(DQ <new>)} 
                      {($ Id.VSub_DollarName '$i') <'/difflinks/difflinks/equal/link'>}
                    )
                  ]
                )
            )
            (C {<ln>} {<-s>} {(DQ <old>)} 
              {($ Id.VSub_DollarName '$OLD') <'/difflinks/difflinks/difflinks/link'>}
            )
            (C {<ln>} {<-s>} {(DQ <new>)} 
              {($ Id.VSub_DollarName '$NEW') <'/difflinks/difflinks/difflinks/link'>}
            )
            (C {<ln>} {<-s>} {(DQ <test>)} 
              {($ Id.VSub_DollarName '$TEST') <'/difflinks/difflinks/difflinks/link'>}
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/difffiles/equal/difffiles/file'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/difffiles/equal/difffiles/file'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/difffiles/first/first/file'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/difffiles/first/first/file'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <old>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/difffiles/difftype/difftype/file'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <new>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/difffiles/difftype/difftype/file'>}
                )
              ]
              do_fork: T
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$TEST') <'/difffiles/difftype/difftype/file'>})
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/difffiles/difffiles/equal/file'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$NEW')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.Simple
                      words: [{<echo>} {(DQ <bar>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/difffiles/difffiles/equal/file'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/difffiles/difffiles/difffiles/simple'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 2262
                      stdin_parts: [<'this is an old line\n'> <'\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/difffiles/difffiles/difffiles/simple'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 2277
                      stdin_parts: [<'this is a new line\n'> <'\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/difffiles/difffiles/difffiles/simple'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 2293
                      stdin_parts: [<'this is an old line\n'> <'\n'> <'this is a local line\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/difffiles/difffiles/difffiles/conflict'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 2307
                      stdin_parts: [<'this is an old file\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/difffiles/difffiles/difffiles/conflict'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 2321
                      stdin_parts: [<'this is a new file\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/difffiles/difffiles/difffiles/conflict'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 2335
                      stdin_parts: [<'this is a test file\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$OLD') <'/adddir'>} 
              {($ Id.VSub_DollarName '$NEW') <'/adddir'>} {($ Id.VSub_DollarName '$TEST') <'/adddir'>}
            )
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/adddir/conflict'>})
            (C {<touch>} {($ Id.VSub_DollarName '$NEW') <'/adddir/conflict/newfile'>})
            (C {<touch>} {($ Id.VSub_DollarName '$TEST') <'/adddir/conflict'>})
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$NEW')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [(C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/adddir/partial'>})]
                )
            )
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/adddir/partial/file'>}
                )
              ]
              do_fork: T
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$TEST') <'/adddir/partial/fifo'>})
            (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$OLD') <'/rmdir'>} 
              {($ Id.VSub_DollarName '$NEW') <'/rmdir'>} {($ Id.VSub_DollarName '$TEST') <'/rmdir'>}
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [(C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/rmdir/extra'>})]
                )
            )
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/rmdir/extra/localfile.txt'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [(C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/rmdir/conflict'>})]
                )
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$OLD') <'/rmdir/conflict/difftype'>})
            (C {<mkdir>} {($ Id.VSub_DollarName '$TEST') <'/rmdir/conflict/difftype'>})
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$i') <'/rmdir/partial/subdir'>})
                    (C {<mkfifo>} {($ Id.VSub_DollarName '$i') <'/rmdir/partial/subdir/fifo'>})
                  ]
                )
            )
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/rmdir/partial/subdir/file'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [
                {($ Id.VSub_DollarName '$OLD')}
                {($ Id.VSub_DollarName '$NEW')}
                {($ Id.VSub_DollarName '$TEST')}
              ]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.ForEach
                      iter_name: j
                      iter_words: [{<already>} {<old>} {<fromdir>} {<todir>}]
                      do_arg_iter: F
                      body: 
                        (command.DoGroup
                          children: [
                            (C {<mkdir>} {<-p>} 
                              {($ Id.VSub_DollarName '$i') <'/dirchange/'> ($ Id.VSub_DollarName '$j')}
                            )
                          ]
                        )
                    )
                  ]
                )
            )
            (C {<mkdir>} {($ Id.VSub_DollarName '$OLD') <'/dirchange/already/fromdir'>})
            (command.Simple
              words: [{<echo>} {(DQ <blah>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/dirchange/already/fromdir/somefile'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$NEW')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.Simple
                      words: [{<echo>} {(DQ <bar>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/dirchange/already/fromdir'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (command.Simple
              words: [{<echo>} {(DQ <baz>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/dirchange/already/todir'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$NEW')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/dirchange/already/todir'>})
                    (command.Simple
                      words: [{<echo>} {(DQ <blah>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/dirchange/already/todir/somefile'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/dirchange/old/fromdir'>})
                    (command.Simple
                      words: [{<echo>} {(DQ <blah>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/dirchange/old/fromdir/somefile'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/dirchange/old/fromdir'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/dirchange/old/todir'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/dirchange/old/todir'>})
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/dirchange/old/todir/file'>}
                )
              ]
              do_fork: T
            )
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/dirchange/fromdir/extradir'>})
                    (command.Simple
                      words: [{<echo>} {(DQ <foo>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$i') <'/dirchange/fromdir/extradir/file'>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$TEST') <'/dirchange/fromdir/extradir/fifo'>})
            (C {<ln>} {<-s>} {(DQ <bar>)} {($ Id.VSub_DollarName '$NEW') <'/dirchange/fromdir/extradir'>})
            (command.ForEach
              iter_name: i
              iter_words: [{($ Id.VSub_DollarName '$OLD')} {($ Id.VSub_DollarName '$TEST')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<mkdir>} {($ Id.VSub_DollarName '$i') <'/dirchange/fromdir/conflict'>})
                  ]
                )
            )
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/dirchange/fromdir/conflict/somefile'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/dirchange/fromdir/conflict/somefile'>}
                )
              ]
              do_fork: T
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$NEW') <'/dirchange/fromdir/conflict'>})
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/dirchange/todir/difffile'>}
                )
              ]
              do_fork: T
            )
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/dirchange/todir/difffile'>})
            (command.Simple
              words: [{<echo>} {(DQ <baz>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/dirchange/todir/difffile/file'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <bar>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/dirchange/todir/difffile'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <foo>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/dirchange/todir/difftype'>}
                )
              ]
              do_fork: T
            )
            (C {<mkdir>} {($ Id.VSub_DollarName '$NEW') <'/dirchange/todir/difftype'>})
            (command.Simple
              words: [{<echo>} {(DQ <baz>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/dirchange/todir/difftype/file'>}
                )
              ]
              do_fork: T
            )
            (C {<mkfifo>} {($ Id.VSub_DollarName '$TEST') <'/dirchange/todir/difftype'>})
            (command.Simple
              words: [{<echo>} {(DQ <'foo:*:16000:100::0:0:& user:/home/foo:/bin/tcsh'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/etc/master.passwd'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/etc/login.conf'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 3191
                      stdin_parts: [
                        <'default:'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                        )
                        <'\n'>
                        <'\t:passwd_format=md5:\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/etc/login.conf'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 3211
                      stdin_parts: [
                        <'default:'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                        )
                        <'\n'>
                        <'\t:passwd_format=md5:'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                        )
                        <'\n'>
                        <'\t:copyright=/etc/COPYRIGHT\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (C {<cp>} {($ Id.VSub_DollarName '$OLD') <'/etc/login.conf'>} 
              {($ Id.VSub_DollarName '$TEST') <'/etc/login.conf'>}
            )
            (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$OLD') <'/etc/mail'>} 
              {($ Id.VSub_DollarName '$NEW') <'/etc/mail'>} {($ Id.VSub_DollarName '$TEST') <'/etc/mail'>}
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/etc/mail/aliases'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 3261
                      stdin_parts: [
                        <'# root: me@my.domain\n'>
                        <'\n'>
                        <'# Basic system aliases -- these MUST be present\n'>
                        <'MAILER-DAEMON: postmaster\n'>
                        <'postmaster: root\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/etc/mail/aliases'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 3283
                      stdin_parts: [
                        <'# root: me@my.domain\n'>
                        <'\n'>
                        <'# Basic system aliases -- these MUST be present\n'>
                        <'MAILER-DAEMON: postmaster\n'>
                        <'postmaster: root\n'>
                        <'\n'>
                        <'# General redirections for pseudo accounts\n'>
                        <'_dhcp:  root\n'>
                        <'_pflogd: root\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$TEST') <'/etc/mail/aliases'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 3301
                      stdin_parts: [
                        <'root: someone@example.com\n'>
                        <'\n'>
                        <'# Basic system aliases -- these MUST be present\n'>
                        <'MAILER-DAEMON: postmaster\n'>
                        <'postmaster: root\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$OLD') <'/etc/services'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 3326
                      stdin_parts: [
                        <'rtmp\t\t  1/ddp\t   #Routing Table Maintenance Protocol\n'>
                        <'tcpmux\t\t  1/tcp\t   #TCP Port Service Multiplexer\n'>
                        <'tcpmux\t\t  1/udp\t   #TCP Port Service Multiplexer\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$NEW') <'/etc/services'>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 3345
                      stdin_parts: [
                        <'rtmp\t\t  1/ddp\t   #Routing Table Maintenance Protocol\n'>
                        <'tcpmux\t\t  1/tcp\t   #TCP Port Service Multiplexer\n'>
                        <'tcpmux\t\t  1/udp\t   #TCP Port Service Multiplexer\n'>
                        <'nbp\t\t  2/ddp\t   #Name Binding Protocol\n'>
                        <'compressnet\t  2/tcp\t   #Management Utility\n'>
                        <'compressnet\t  2/udp\t   #Management Utility\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (C {<cp>} {($ Id.VSub_DollarName '$OLD') <'/etc/services'>} 
              {($ Id.VSub_DollarName '$TEST') <'/etc/services'>}
            )
            (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$TEST') <'/var/db'>})
          ]
        )
    )
    (command.ShFunction
      name: missing
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-e>} 
                              {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')} {<-o>} {<-L>} {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'File '> ($ Id.VSub_Number '$1') <' should be missing'>)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FAILED)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [3409]
                        )
                      ]
                    )
                  ]
                  spids: [3376 3397]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: present
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-e>} 
                                  {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')} {<-o>} {<-L>} {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'File '> ($ Id.VSub_Number '$1') <' should be present'>)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FAILED)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [3463]
                        )
                      ]
                    )
                  ]
                  spids: [3428 3451]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: fifo
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-p>} 
                                  {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'File '> ($ Id.VSub_Number '$1') <' should be a FIFO'>)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FAILED)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [3509]
                        )
                      ]
                    )
                  ]
                  spids: [3482 3497]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: dir
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-d>} 
                                  {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'File '> ($ Id.VSub_Number '$1') <' should be a directory'>)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FAILED)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [3555]
                        )
                      ]
                    )
                  ]
                  spids: [3528 3543]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: link
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<val>})
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-L>} 
                                  {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'File '> ($ Id.VSub_Number '$1') <' should be a link'>)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FAILED)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [3610]
                        )
                      ]
                    )
                  ]
                  spids: [3583 3598]
                )
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-gt>} {<1>} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:val)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Id.Left_Backtick '`'>
                                child: 
                                  (C {<readlink>} 
                                    {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')}
                                  )
                              )
                            }
                          spids: [3630]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$val'))} 
                                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_Number '$2'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<echo>} 
                              {
                                (DQ <'Link '> ($ Id.VSub_Number '$1') <' should link to '> 
                                  (word_part.EscapedLiteral
                                    token: <Id.Lit_EscapedChar '\\"'>
                                  ) ($ Id.VSub_Number '$2') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>)
                                )
                              }
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:FAILED)
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                  spids: [3675]
                                )
                              ]
                            )
                          ]
                          spids: [3642 3660]
                        )
                      ]
                    )
                  ]
                  spids: [3614 3627]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: file
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<contents>} {<sum>})
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-f>} 
                                  {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'File '> ($ Id.VSub_Number '$1') <' should be a regular file'>)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FAILED)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [3738]
                        )
                      ]
                    )
                  ]
                  spids: [3711 3726]
                )
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-eq>} {<2>} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:contents)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Id.Left_Backtick '`'>
                                child: 
                                  (C {<cat>} 
                                    {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')}
                                  )
                              )
                            }
                          spids: [3758]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$contents'))} 
                                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_Number '$2'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<echo>} {(DQ <'File '> ($ Id.VSub_Number '$1') <' has wrong contents'>)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:FAILED)
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                  spids: [3800]
                                )
                              ]
                            )
                          ]
                          spids: [3770 3788]
                        )
                      ]
                    )
                  ]
                  spids: [3742 3755]
                )
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-eq>} {<3>} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:sum)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Id.Left_Backtick '`'>
                                child: 
                                  (C {<md5>} {<-q>} 
                                    {($ Id.VSub_DollarName '$TEST') <'/'> ($ Id.VSub_Number '$1')}
                                  )
                              )
                            }
                          spids: [3823]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$sum'))} 
                                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_Number '$3'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<echo>} {(DQ <'File '> ($ Id.VSub_Number '$1') <' has wrong contents'>)})
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:FAILED)
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                  spids: [3867]
                                )
                              ]
                            )
                          ]
                          spids: [3837 3855]
                        )
                      ]
                    )
                  ]
                  spids: [3807 3820]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: conflict
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<sum>})
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-f>} 
                                  {($ Id.VSub_DollarName '$CONFLICTS') <'/'> ($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'File '> ($ Id.VSub_Number '$1') <' missing conflict'>)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FAILED)
                          op: assign_op.Equal
                          rhs: {<yes>}
                          spids: [3925]
                        )
                      ]
                    )
                  ]
                  spids: [3898 3913]
                )
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-gt>} {<1>} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:sum)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Id.Left_Backtick '`'>
                                child: 
                                  (C {<md5>} {<-q>} 
                                    {($ Id.VSub_DollarName '$CONFLICTS') <'/'> ($ Id.VSub_Number '$1')}
                                  )
                              )
                            }
                          spids: [3945]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$sum'))} 
                                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_Number '$2'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<echo>} 
                              {(DQ <'Conflict '> ($ Id.VSub_Number '$1') <' has wrong contents'>)}
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:FAILED)
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                  spids: [3989]
                                )
                              ]
                            )
                          ]
                          spids: [3959 3977]
                        )
                      ]
                    )
                  ]
                  spids: [3929 3942]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: check_trees
      body: 
        (BraceGroup
          children: [
            (C {<echo>} {(DQ <'Checking tree for correct results:'>)})
            (C {<fifo>} {<'/equal/equal/equal/fifo'>})
            (C {<file>} {<'/equal/equal/equal/file'>} {(DQ <foo>)})
            (C {<dir>} {<'/equal/equal/equal/dir'>})
            (C {<link>} {<'/equal/equal/equal/link'>} {(DQ <bar>)})
            (C {<missing>} {<'/equal/first/first/fifo'>})
            (C {<missing>} {<'/equal/first/first/file'>})
            (C {<missing>} {<'/equal/first/first/dir'>})
            (C {<missing>} {<'/equal/first/first/link'>})
            (C {<file>} {<'/equal/difftype/difftype/fifo'>} {(DQ <bar>)})
            (C {<link>} {<'/equal/difftype/difftype/fromdir'>} {(DQ <test>)})
            (C {<link>} {<'/equal/difflinks/difflinks/link'>} {(DQ <bar>)})
            (C {<file>} {<'/equal/difffiles/difffiles/file'>} {(DQ <bar>)})
            (C {<missing>} {<'/first/equal/second/fifo'>})
            (C {<missing>} {<'/first/equal/second/file'>})
            (C {<missing>} {<'/first/equal/second/emptydir'>})
            (C {<missing>} {<'/first/equal/second/link'>})
            (C {<missing>} {<'/first/equal/second/fulldir'>})
            (C {<missing>} {<'/first/first/equal/fifo'>})
            (C {<missing>} {<'/first/first/equal/file'>})
            (C {<missing>} {<'/first/first/equal/dir'>})
            (C {<missing>} {<'/first/first/equal/link'>})
            (C {<present>} {<'/first/difftype/second/fifo'>})
            (C {<link>} {<'/first/difflinks/second/link'>} {(DQ <'test link'>)})
            (C {<file>} {<'/first/difffiles/second/file'>} {(DQ <bar>)})
            (C {<file>} {<'/second/equal/first/file'>} {(DQ <bar>)})
            (C {<fifo>} {<'/second/equal/first/fifo'>})
            (C {<link>} {<'/second/equal/first/link'>} {(DQ <new>)})
            (C {<missing>} {<'/second/equal/first/emptydir'>})
            (C {<file>} {<'/second/equal/first/fulldir/file'>} {(DQ <foo>)})
            (C {<fifo>} {<'/second/second/equal/fifo'>})
            (C {<file>} {<'/second/second/equal/file'>} {(DQ <foo>)})
            (C {<dir>} {<'/second/second/equal/dir'>})
            (C {<link>} {<'/second/second/equal/link'>} {(DQ <bar>)})
            (C {<fifo>} {<'/second/second/difftype/dir'>})
            (C {<link>} {<'/second/second/difflinks/link'>} {(DQ <'test link'>)})
            (C {<file>} {<'/second/second/difffiles/file'>} {(DQ <test>)})
            (C {<conflict>} {<'/second/second/difffiles/file'>} {<4f2ee8620a251fd53f06bb6112eb6ffa>})
            (C {<link>} {<'/difftype/equal/difftype/file'>} {(DQ <test>)})
            (C {<fifo>} {<'/difftype/equal/difftype/fromdir'>})
            (C {<missing>} {<'/difftype/equal/difftype/todir'>})
            (C {<missing>} {<'/difftype/first/first/fifo'>})
            (C {<fifo>} {<'/difftype/difftype/equal/fifo'>})
            (C {<file>} {<'/difftype/difftype/equal/file'>} {(DQ <bar>)})
            (C {<file>} {<'/difftype/difftype/difftype/one'>} {(DQ <foo>)})
            (C {<link>} {<'/difftype/difftype/difftype/two'>} {(DQ <bar>)})
            (C {<link>} {<'/difftype/difftype/difflinks/link'>} {(DQ <test>)})
            (C {<conflict>} {<'/difftype/difftype/difffiles/file'>} {<117f2bcd1f6491f6044e79e5a57a9229>})
            (C {<link>} {<'/difflinks/equal/difflinks/link'>} {(DQ <new>)})
            (C {<missing>} {<'/difflinks/first/first/link'>})
            (C {<file>} {<'/difflinks/difftype/difftype/link'>} {(DQ <test>)})
            (C {<link>} {<'/difflinks/difflinks/equal/link'>} {(DQ <new>)})
            (C {<link>} {<'/difflinks/difflinks/difflinks/link'>} {(DQ <test>)})
            (C {<file>} {<'/difffiles/equal/difffiles/file'>} {(DQ <bar>)})
            (C {<missing>} {<'/difffiles/first/first/file'>})
            (C {<fifo>} {<'/difffiles/difftype/difftype/file'>})
            (C {<file>} {<'/difffiles/difffiles/equal/file'>} {(DQ <bar>)})
            (C {<file>} {<'/difffiles/difffiles/difffiles/simple'>} {(DQ )} 
              {<cabc7e5e80b0946d79edd555e9648486>}
            )
            (C {<file>} {<'/difffiles/difffiles/difffiles/conflict'>} {(DQ <'this is a test file'>)})
            (C {<conflict>} {<'/difffiles/difffiles/difffiles/conflict'>} 
              {<8261cfdd89280c4a6c26e4ac86541fe9>}
            )
            (C {<file>} {<'/adddir/conflict'>})
            (C {<file>} {<'/adddir/partial/file'>} {(DQ <foo>)})
            (C {<fifo>} {<'/adddir/partial/fifo'>})
            (C {<dir>} {<'/rmdir/extra'>})
            (C {<file>} {<'/rmdir/extra/localfile.txt'>} {(DQ <foo>)})
            (C {<dir>} {<'/rmdir/conflict/difftype'>})
            (C {<present>} {<'/rmdir/conflict'>})
            (C {<missing>} {<'/rmdir/partial'>})
            (C {<file>} {<'/dirchange/already/fromdir'>} {(DQ <bar>)})
            (C {<file>} {<'/dirchange/already/todir/somefile'>} {(DQ <blah>)})
            (C {<file>} {<'/dirchange/old/fromdir'>} {(DQ <bar>)})
            (C {<file>} {<'/dirchange/old/todir/file'>} {(DQ <bar>)})
            (C {<missing>} {<'/dirchange/fromdir/extradir/file'>})
            (C {<fifo>} {<'/dirchange/fromdir/extradir/fifo'>})
            (C {<file>} {<'/dirchange/fromdir/conflict/somefile'>} {(DQ <bar>)})
            (C {<file>} {<'/dirchange/todir/difffile'>} {(DQ <bar>)})
            (C {<fifo>} {<'/dirchange/todir/difftype'>})
            (C {<file>} {<'/etc/master.passwd'>})
            (C {<file>} {<'/etc/passwd'>})
            (C {<file>} {<'/etc/pwd.db'>})
            (C {<file>} {<'/etc/spwd.db'>})
            (C {<file>} {<'/etc/login.conf'>} {(DQ )} {<7774a0f9a3a372c7c109c32fd31c4b6b>})
            (C {<file>} {<'/etc/login.conf.db'>})
            (C {<file>} {<'/etc/mail/aliases'>} {(DQ )} {<7d598f89ec040ab56af54011bdb83337>})
            (C {<file>} {<'/etc/services'>} {(DQ )} {<37fb6a8d1273f3b78329d431f21d9c7d>})
            (C {<file>} {<'/var/db/services.db'>})
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} 
                      {(command_sub left_token:<Id.Left_Backtick '`'> child:(C {<id>} {<-u>}))} {<-ne>} {<0>} {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (C {<echo>} {(DQ <'must be root'>)})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>})
          ]
          spids: [4840 4859]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {<-r>} {<'/etc/etcupdate.conf'>} {<Id.Lit_RBracket ']'>})
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [(C {<echo>} {(DQ <'WARNING: /etc/etcupdate.conf settings may break some tests.'>)})]
          spids: [4876 4887]
        )
      ]
    )
    (C {<build_trees>})
    (command.Simple
      words: [
        {($ Id.VSub_DollarName '$COMMAND')}
        {<-nr>}
        {<-d>}
        {($ Id.VSub_DollarName '$WORKDIR')}
        {<-D>}
        {($ Id.VSub_DollarName '$TEST')}
      ]
      redirects: [
        (redir
          op: <Id.Redir_Great '>'>
          loc: (redir_loc.Fd fd:1)
          arg: {($ Id.VSub_DollarName '$WORKDIR') <'/testn.out'>}
        )
      ]
      do_fork: T
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir
          op: <Id.Redir_Great '>'>
          loc: (redir_loc.Fd fd:1)
          arg: {($ Id.VSub_DollarName '$WORKDIR') <'/correct.out'>}
        )
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {<EOF>}
              here_end_span_id: 5029
              stdin_parts: [
                <'  D /dirchange/fromdir/extradir/file\n'>
                <'  D /dirchange/old/fromdir/somefile\n'>
                <'  D /first/equal/second/fifo\n'>
                <'  D /first/equal/second/file\n'>
                <'  D /first/equal/second/fulldir/file\n'>
                <'  D /first/equal/second/link\n'>
                <'  D /rmdir/partial/subdir/fifo\n'>
                <'  D /rmdir/partial/subdir\n'>
                <'  D /rmdir/partial\n'>
                <'  D /first/equal/second/fulldir\n'>
                <'  D /first/equal/second/emptydir\n'>
                <'  C /difffiles/difffiles/difffiles/conflict\n'>
                <'  M /difffiles/difffiles/difffiles/simple\n'>
                <'  U /difffiles/equal/difffiles/file\n'>
                <'  U /difflinks/equal/difflinks/link\n'>
                <'  C /difftype/difftype/difffiles/file\n'>
                <'  U /difftype/equal/difftype/file\n'>
                <'  U /difftype/equal/difftype/fromdir\n'>
                <'  D /difftype/equal/difftype/todir\n'>
                <'  U /dirchange/old/fromdir\n'>
                <'  U /dirchange/old/todir\n'>
                <'  U /etc/login.conf\n'>
                <'  M /etc/mail/aliases\n'>
                <'  U /etc/services\n'>
                <'  A /adddir/partial/file\n'>
                <'  A /dirchange/old/todir/file\n'>
                <'  A /etc/master.passwd\n'>
                <'  A /second/equal/first/fifo\n'>
                <'  A /second/equal/first/file\n'>
                <'  A /second/equal/first/fulldir/file\n'>
                <'  A /second/equal/first/link\n'>
                <'  C /second/second/difffiles/file\n'>
                <'Warnings:\n'>
                <'  Modified regular file remains: /dirchange/fromdir/conflict/somefile\n'>
                <'  Modified regular file remains: /first/difffiles/second/file\n'>
                <'  Modified symbolic link remains: /first/difflinks/second/link\n'>
                <'  Modified directory remains: /first/difftype/second/fifo\n'>
                <'  Modified directory remains: /rmdir/conflict/difftype\n'>
                <'  Non-empty directory remains: /rmdir/extra\n'>
                <'  Non-empty directory remains: /rmdir/conflict\n'>
                <
'  Modified mismatch: /difffiles/difftype/difftype/file (regular file vs fifo file)\n'
                >
                <'  Removed file changed: /difffiles/first/first/file\n'>
                <'  Modified link changed: /difflinks/difflinks/difflinks/link ('>
                <Id.Right_DoubleQuote '"'>
                <old>
                <Id.Right_DoubleQuote '"'>
                <' became '>
                <Id.Right_DoubleQuote '"'>
                <new>
                <Id.Right_DoubleQuote '"'>
                <')\n'>
                <
'  Modified mismatch: /difflinks/difftype/difftype/link (symbolic link vs regular file)\n'
                >
                <'  Removed link changed: /difflinks/first/first/link ('>
                <Id.Right_DoubleQuote '"'>
                <old>
                <Id.Right_DoubleQuote '"'>
                <' became '>
                <Id.Right_DoubleQuote '"'>
                <new>
                <Id.Right_DoubleQuote '"'>
                <')\n'>
                <'  New link conflict: /difftype/difftype/difflinks/link ('>
                <Id.Right_DoubleQuote '"'>
                <new>
                <Id.Right_DoubleQuote '"'>
                <' vs '>
                <Id.Right_DoubleQuote '"'>
                <test>
                <Id.Right_DoubleQuote '"'>
                <')\n'>
                <
'  Modified regular file changed: /difftype/difftype/difftype/one (fifo file became directory)\n'
                >
                <
'  Modified symbolic link changed: /difftype/difftype/difftype/two (directory became regular file)\n'
                >
                <'  Remove mismatch: /difftype/first/first/fifo (fifo file became directory)\n'>
                <
'  Modified directory changed: /dirchange/fromdir/conflict (directory became fifo file)\n'
                >
                <
'  Modified directory changed: /dirchange/fromdir/extradir (directory became symbolic link)\n'
                >
                <
'  Modified regular file changed: /dirchange/todir/difffile (regular file became directory)\n'
                >
                <
'  Modified fifo file changed: /dirchange/todir/difftype (regular file became directory)\n'
                >
                <'  New file mismatch: /adddir/conflict (directory vs regular file)\n'>
                <'  Directory mismatch: '>
                ($ Id.VSub_DollarName '$TEST')
                <'/adddir/conflict (regular file)\n'>
                <'  Directory mismatch: '>
                ($ Id.VSub_DollarName '$TEST')
                <'/dirchange/todir/difffile (regular file)\n'>
                <'  Directory mismatch: '>
                ($ Id.VSub_DollarName '$TEST')
                <'/dirchange/todir/difftype (fifo file)\n'>
                <'  New link conflict: /second/second/difflinks/link ('>
                <Id.Right_DoubleQuote '"'>
                <'new link'>
                <Id.Right_DoubleQuote '"'>
                <' vs '>
                <Id.Right_DoubleQuote '"'>
                <'test link'>
                <Id.Right_DoubleQuote '"'>
                <')\n'>
                <'  New file mismatch: /second/second/difftype/dir (directory vs fifo file)\n'>
                <
'  Needs update: /etc/mail/aliases.db (requires manual update via newaliases(1))\n'
                >
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<echo>} {(DQ <'Differences for -n:'>)})
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<diff>} {<-u>} {<-L>} {(DQ <correct>)} {($ Id.VSub_DollarName '$WORKDIR') <'/correct.out'>} 
          {<-L>} {(DQ <test>)} {($ Id.VSub_DollarName '$WORKDIR') <'/testn.out'>}
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:failed)
              op: assign_op.Equal
              rhs: {<YES>}
              spids: [5063]
            )
          ]
        )
      ]
    )
    (command.Simple
      words: [
        {($ Id.VSub_DollarName '$COMMAND')}
        {<-r>}
        {<-d>}
        {($ Id.VSub_DollarName '$WORKDIR')}
        {<-D>}
        {($ Id.VSub_DollarName '$TEST')}
      ]
      redirects: [
        (redir
          op: <Id.Redir_Great '>'>
          loc: (redir_loc.Fd fd:1)
          arg: {($ Id.VSub_DollarName '$WORKDIR') <'/test.out'>}
        )
      ]
      do_fork: T
    )
    (C {<echo>} {(DQ <'Differences for real:'>)})
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<diff>} {<-u>} {<-L>} {(DQ <correct>)} {($ Id.VSub_DollarName '$WORKDIR') <'/correct.out'>} 
          {<-L>} {(DQ <test>)} {($ Id.VSub_DollarName '$WORKDIR') <'/test.out'>}
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:failed)
              op: assign_op.Equal
              rhs: {<YES>}
              spids: [5117]
            )
          ]
        )
      ]
    )
    (C {<check_trees>})
    (C {<Id.Lit_LBracket '['>} {(DQ (${ Id.VSub_Name FAILED))} {<Id.Lit_Equals '='>} {<no>} 
      {<Id.Lit_RBracket ']'>}
    )
  ]
)