(CommandList
  children: [
    (AndOr
      ops: [Op_DAmp]
      children: [
        (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$BALLS_LIB'))}))
        (Assignment
          keyword: Assign_None
          pairs: [(assign_pair lhs:(LhsName name:BALLS_LIB) op:Equal rhs:{(.)} spids:[15])]
          spids: [15]
        )
      ]
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$BALLS_CONF'))}))
        (Assignment
          keyword: Assign_None
          pairs: [(assign_pair lhs:(LhsName name:BALLS_CONF) op:Equal rhs:{(./config.sh)} spids:[31])]
          spids: [31]
        )
      ]
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$BALLS_ROOT'))}))
        (Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (LhsName name:BALLS_ROOT)
              op: Equal
              rhs: 
                {
                  (CommandSubPart
                    command_list: 
                      (CommandList
                        children: [
                          (C {(readlink)} {(-f)} 
                            {
                              (DQ 
                                (CommandSubPart
                                  command_list: 
                                    (CommandList
                                      children: [(C {(dirname)} {($ VSub_Name '$BALLS_CONF')})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [53 57]
                                ) (/../)
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                    spids: [47 60]
                  )
                }
              spids: [46]
            )
          ]
          spids: [46]
        )
      ]
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$BALLS_LIB'))}))
        (Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (LhsName name:BALLS_LIB)
              op: Equal
              rhs: 
                {
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(dirname)} {($ VSub_Number '$0')})])
                    left_token: <Left_CommandSub '$('>
                    spids: [75 79]
                  )
                }
              spids: [74]
            )
          ]
          spids: [74]
        )
      ]
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$BALLS_TMP'))}))
        (Assignment
          keyword: Assign_None
          pairs: [(assign_pair lhs:(LhsName name:BALLS_TMP) op:Equal rhs:{(/tmp/balls)} spids:[94])]
          spids: [94]
        )
      ]
    )
    (AndOr
      ops: [Op_DPipe]
      children: [
        (DBracket expr:(BoolUnary op_id:BoolUnary_d child:{(DQ ($ VSub_Name '$BALLS_TMP'))}))
        (C {(mkdir)} {(DQ ($ VSub_Name '$BALLS_TMP'))})
      ]
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$BALLS_PORT'))}))
        (Assignment
          keyword: Assign_None
          pairs: [(assign_pair lhs:(LhsName name:BALLS_PORT) op:Equal rhs:{(3000)} spids:[128])]
          spids: [128]
        )
      ]
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$BALLS_VIEWS'))}))
        (Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (LhsName name:BALLS_VIEWS)
              op: Equal
              rhs: {($ VSub_Name '$BALLS_ROOT') (/views)}
              spids: [144]
            )
          ]
          spids: [144]
        )
      ]
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$BALLS_ACTIONS'))}))
        (Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (LhsName name:BALLS_ACTIONS)
              op: Equal
              rhs: {($ VSub_Name '$BALLS_ROOT') (/actions)}
              spids: [160]
            )
          ]
          spids: [160]
        )
      ]
    )
    (C {(.)} {($ VSub_Name '$BALLS_LIB') (/util.sh)})
    (C {(.)} {($ VSub_Name '$BALLS_LIB') (/http.sh)})
    (C {(.)} {($ VSub_Name '$BALLS_LIB') (/router.sh)})
    (C {(.)} {($ VSub_Name '$BALLS_LIB') (/server.sh)})
    (C {(.)} {($ VSub_Name '$BALLS_LIB') (/view.sh)})
    (C {(.)} {($ VSub_Name '$BALLS_LIB') (/model.sh)})
  ]
)