(command.CommandList
  children: [
    (command.ShFunction
      name: fn1
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:x)
                  op: assign_op.Equal
                  rhs: {(DQ <'fn1 started'>)}
                  spids: [11]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DParen
                              child: 
                                (arith_expr.Binary
                                  op_id: Id.Arith_DEqual
                                  left: {($ Id.VSub_Number '$1')}
                                  right: {<Id.Lit_Digits 0>}
                                )
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<fn2>} {(DQ <'testing 1'>)} {(DQ <'2 3'>)})
                    (command.ControlFlow token:<Id.ControlFlow_Return return>)
                  ]
                  spids: [17 32]
                )
              ]
            )
            (C {<let>} {<Id.Lit_VarLike 'a='> ($ Id.VSub_Number '$1') <-1>})
            (C {<fn1>} {($ Id.VSub_DollarName '$a')})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:x)
                  op: assign_op.Equal
                  rhs: {(DQ <'fn1 returning'>)}
                  spids: [65]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: fn2
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:x)
                  op: assign_op.Equal
                  rhs: {(DQ <'fn2 started'>)}
                  spids: [80]
                )
              ]
            )
            (C {<echo>} {(DQ <'fn2: '> ($ Id.VSub_Number '$1') <' '> ($ Id.VSub_Number '$2'))})
            (C {<fn3>})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:x)
                  op: assign_op.Equal
                  rhs: {(DQ <'fn2 returning'>)}
                  spids: [99]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: fn3
      body: 
        (BraceGroup
          children: [
            (C {<echo>} {(DQ <'fn3: '> ($ Id.VSub_Number '$1') <' '> ($ Id.VSub_Number '$2'))})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:x)
                  op: assign_op.Equal
                  rhs: {(DQ <'fn3 returning'>)}
                  spids: [124]
                )
              ]
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:x)
          op: assign_op.Equal
          rhs: {(DQ <main>)}
          spids: [132]
        )
      ]
    )
    (C {<fn1>} {<5>})
    (command.Pipeline children:[(C {<echo>} {(DQ <'exit 5'>)}) (C {<bash>})] negated:F)
    (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>})
  ]
)