(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:SAVEPATH)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$PATH'))}
          spids: [66]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {(source)} {(sources/include.sh)})
        (command.ControlFlow
          token: (Token id:Id.ControlFlow_Exit val:exit span_id:77)
          arg_word: {(1)}
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:STAGE_DIR)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name HOSTTOOLS))}
          spids: [82]
        )
      ]
    )
    (C {(blank_tempdir)} {(DQ ($ Id.VSub_DollarName '$WORK'))})
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [(C {(mkdir)} {(-p)} {(DQ ($ Id.VSub_DollarName '$STAGE_DIR'))}) (C {(dienow)})]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PATH)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:181)
                  command_list: (command.CommandList children:[(C {(hosttools_path)})])
                ) (':') ($ Id.VSub_DollarName '$PATH')
              )
            }
          spids: [179]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$BUILD_STATIC'))} 
              {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(none)} {(Id.Lit_RBracket ']')}
            )
          ]
          action: [
            (C {($ Id.VSub_DollarName '$CC')} 
              {(DQ ($ Id.VSub_DollarName '$SOURCES') (/root-filesystem/src/hello.c))} {(--static)} {(-o)} {(/dev/null)}
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (C {(Id.Lit_LBracket '[')} {($ Id.VSub_QMark '$?')} {(-ne)} {(0)} 
                      {(Id.Lit_RBracket ']')}
                    )
                  ]
                  action: [
                    (command.Simple
                      words: [{(echo)} {(DQ ('Your host toolchain does not support static linking.'))}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:248)
                          fd: -1
                          arg_word: {(2)}
                        )
                      ]
                    )
                    (command.Simple
                      words: [{(echo)} {(DQ ('Either install support, or export BUILD_STATIC=none'))}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:258)
                          fd: -1
                          arg_word: {(2)}
                        )
                      ]
                    )
                    (C {(dienow)})
                  ]
                  spids: [226 239]
                )
              ]
            )
          ]
          spids: [193 208]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp Id.Op_DAmp]
      children: [
        (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-f)} 
          {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') (/busybox))} {(Id.Lit_RBracket ']')}
        )
        (C {(build_section)} {(busybox)})
        (C {(rm)} {(-f)} {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') (/sh))})
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-f)} 
          {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') (/toybox))} {(Id.Lit_RBracket ']')}
        )
        (C {(build_section)} {(toybox)})
      ]
    )
    (command.ForEach
      iter_name: i
      iter_words: [
        {(ar)}
        {(as)}
        {(nm)}
        {(cc)}
        {(make)}
        {(ld)}
        {(gcc)}
        {(objdump)}
        {(sh)}
        {($ Id.VSub_DollarName '$HOST_EXTRA')}
      ]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-f)} 
                      {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') (/) ($ Id.VSub_DollarName '$i'))} {(Id.Lit_RBracket ']')}
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:X)
                          op: assign_op.Equal
                          rhs: {(0)}
                          spids: [415]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FALLBACK)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$STAGE_DIR'))}
                          spids: [419]
                        )
                      ]
                    )
                    (command.Pipeline
                      children: [
                        (command.Simple
                          words: [
                            {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') (/which))}
                            {(-a)}
                            {(DQ ($ Id.VSub_DollarName '$i'))}
                          ]
                          more_env: [
                            (env_pair
                              name: PATH
                              val: {(DQ ($ Id.VSub_DollarName '$SAVEPATH'))}
                              spids: [425]
                            )
                          ]
                        )
                        (command.WhileUntil
                          keyword: (Token id:Id.KW_While val:while span_id:443)
                          cond: [(C {(read)} {(j)})]
                          body: 
                            (command.DoGroup
                              children: [
                                (command.If
                                  arms: [
                                    (if_arm
                                      cond: [
                                        (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-e)} 
                                          {
                                            (DQ ($ Id.VSub_DollarName '$FALLBACK') (/) 
                                              ($ Id.VSub_DollarName '$i')
                                            )
                                          } {(Id.Lit_RBracket ']')}
                                        )
                                      ]
                                      action: [
                                        (command.AndOr
                                          ops: [Id.Op_DAmp Id.Op_DPipe]
                                          children: [
                                            (C {(mkdir)} {(-p)} {(DQ ($ Id.VSub_DollarName '$FALLBACK'))})
                                            (C {(ln)} {(-sf)} {(DQ ($ Id.VSub_DollarName '$j'))} 
                                              {
                                                (DQ ($ Id.VSub_DollarName '$FALLBACK') (/) 
                                                  ($ Id.VSub_DollarName '$i')
                                                )
                                              }
                                            )
                                            (C {(dienow)})
                                          ]
                                        )
                                      ]
                                      spids: [453 470]
                                    )
                                  ]
                                )
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:X)
                                      op: assign_op.Equal
                                      rhs: 
                                        {
                                          (word_part.ExprSub
                                            left: 
                                              (Token
                                                id: Id.Left_DollarBracket
                                                val: '$['
                                                span_id: 508
                                              )
                                            child: 
                                              (expr.Binary
                                                op: (Token id:Id.Arith_Plus val:'+' span_id:510)
                                                left: ($ Id.VSub_DollarName '$X')
                                                right: (Const Id.Expr_DecInt 1)
                                              )
                                          )
                                        }
                                      spids: [507]
                                    )
                                  ]
                                )
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:FALLBACK)
                                      op: assign_op.Equal
                                      rhs: 
                                        {
                                          (DQ ($ Id.VSub_DollarName '$STAGE_DIR') (/fallback-) 
                                            ($ Id.VSub_DollarName '$X')
                                          )
                                        }
                                      spids: [515]
                                    )
                                  ]
                                )
                              ]
                            )
                        )
                      ]
                      negated: F
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-f)} 
                              {
                                (DQ ($ Id.VSub_DollarName '$STAGE_DIR') (/) ($ Id.VSub_DollarName '$i'))
                              } {(Id.Lit_RBracket ']')}
                            )
                          ]
                          action: [
                            (command.Simple
                              words: [
                                {(echo)}
                                {(DQ ('Toolchain component missing: ') ($ Id.VSub_DollarName '$i'))}
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:554)
                                  fd: -1
                                  arg_word: {(2)}
                                )
                              ]
                            )
                            (C {(dienow)})
                          ]
                          spids: [527 544]
                        )
                      ]
                    )
                  ]
                  spids: [390 407]
                )
              ]
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ET_TU_UBUNTU)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:578)
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.Simple
                          words: [{(DQ ($ Id.VSub_DollarName '$STAGE_DIR') (/which))} {(gcc.real)}]
                          more_env: [
                            (env_pair
                              name: PATH
                              val: {(DQ ($ Id.VSub_DollarName '$SAVEPATH'))}
                              spids: [579]
                            )
                          ]
                        )
                      ]
                    )
                )
              )
            }
          spids: [576]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-z)} {(DQ ($ Id.VSub_DollarName '$ET_TU_UBUNTU'))} 
          {(Id.Lit_RBracket ']')}
        )
        (command.Simple
          words: [
            {(ln)}
            {(-s)}
            {(DQ ($ Id.VSub_DollarName '$ET_TU_UBUNTU'))}
            {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') (/gcc.real))}
          ]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'2>' span_id:620)
              fd: 2
              arg_word: {(/dev/null)}
            )
          ]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PATH)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:633)
                  command_list: (command.CommandList children:[(C {(hosttools_path)})])
                )
              )
            }
          spids: [631]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-z)} 
              {
                (DQ 
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:647)
                    command_list: 
                      (command.CommandList
                        children: [
                          (command.Simple
                            words: [
                              {(find)}
                              {(DQ ($ Id.VSub_DollarName '$STAGE_DIR'))}
                              {(-newer)}
                              {(DQ ($ Id.VSub_DollarName '$BUILD') (/record-commands))}
                            ]
                            redirects: [
                              (redir.Redir
                                op: (Token id:Id.Redir_Great val:'2>' span_id:661)
                                fd: 2
                                arg_word: {(/dev/null)}
                              )
                            ]
                          )
                        ]
                      )
                  )
                )
              } {(Id.Lit_RBracket ']')}
            )
          ]
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DPipe]
              children: [
                (C {(cd)} {(DQ ($ Id.VSub_DollarName '$TOP'))})
                (C {(more/record-commands.sh)})
                (C {(dienow)})
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:PATH)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$WRAPDIR'))}
                  spids: [686]
                )
              ]
            )
          ]
          spids: [638 668]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (C {(Id.Lit_LBracket '[')} {(-z)} 
              {
                (DQ 
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:727)
                    command_list: (command.CommandList children:[(C {(which)} {(distccd)})])
                  )
                )
              } {(Id.Lit_RBracket ']')}
            )
          ]
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(setupfor)} {(distcc)})
                (C {(./configure)} {(--with-included-popt)} {(--disable-Werror)})
                (C {(make)} {(-j)} {(DQ ($ Id.VSub_DollarName '$CPUS'))})
                (C {(cp)} {(distcc)} {(distccd)} {(DQ (${ Id.VSub_Name STAGE_DIR))})
              ]
            )
            (C {(cleanup)})
          ]
          spids: [720 736]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-f)} 
              {(DQ (${ Id.VSub_Name STAGE_DIR)) (/genext2fs)} {(Id.Lit_RBracket ']')}
            )
          ]
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(setupfor)} {(genext2fs)})
                (C {(./configure)})
                (C {(make)} {(-j)} {($ Id.VSub_DollarName '$CPUS')})
                (C {(cp)} {(genext2fs)} {(DQ (${ Id.VSub_Name STAGE_DIR))})
              ]
            )
            (C {(cleanup)})
          ]
          spids: [792 809]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-f)} 
              {(DQ (${ Id.VSub_Name STAGE_DIR)) (/mke2fs)} {(Id.Lit_RBracket ']')}
            )
          ]
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(setupfor)} {(e2fsprogs)})
                (C {(./configure)} {(--disable-tls)} {(--disable-nls)} {(--enable-htree)})
                (C {(make)} {(-j)} {(DQ ($ Id.VSub_DollarName '$CPUS'))})
                (C {(cp)} 
                  (word.BracedTree
                    parts: [(misc/) (word_part.BracedTuple words:[{(mke2fs)} {(tune2fs)}])]
                  ) {(resize/resize2fs)} {(DQ (${ Id.VSub_Name STAGE_DIR))}
                )
                (C {(cp)} {(e2fsck/e2fsck)} {(DQ ($ Id.VSub_DollarName '$STAGE_DIR')) (/fsck.ext2)})
              ]
            )
            (C {(cleanup)})
          ]
          spids: [883 900]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-f)} 
              {(DQ (${ Id.VSub_Name STAGE_DIR)) (/mksquashfs)} {(Id.Lit_RBracket ']')}
            )
          ]
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(setupfor)} {(zlib)})
                (C {(./configure)})
                (C {(make)} {(-j)} {($ Id.VSub_DollarName '$CPUS')})
                (C {(mv)} {(z) (Id.Lit_Star '*') (.h)} {(libz.a)} {(..)})
              ]
            )
            (C {(cleanup)})
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(setupfor)} {(squashfs)})
                (C {(cd)} {(squashfs-tools)})
                (C {(sed)} {(-i)} {(DQ ('/^XATTR_/d'))} {(Makefile)})
                (command.Simple
                  words: [{(make)} {(-j)} {($ Id.VSub_DollarName '$CPUS')}]
                  more_env: [
                    (env_pair
                      name: CC
                      val: {(DQ ($ Id.VSub_DollarName '$CC') (' -I ../.. -L ../..'))}
                      spids: [1064]
                    )
                  ]
                )
                (C {(cp)} {(mksquashfs)} {(unsquashfs)} {(DQ (${ Id.VSub_Name STAGE_DIR))})
                (C {(rm)} 
                  (word.BracedTree
                    parts: [
                      (../../)
                      (word_part.BracedTuple
                        words: [{(z) (Id.Lit_Star '*') (.h)} {(libz.a)}]
                      )
                    ]
                  )
                )
              ]
            )
            (C {(cleanup)})
          ]
          spids: [972 989]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-z)} 
              {
                (DQ 
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1124)
                    command_list: 
                      (command.CommandList
                        children: [
                          (command.Simple
                            words: [
                              {(find)}
                              {(DQ ($ Id.VSub_DollarName '$STAGE_DIR'))}
                              {(-newer)}
                              {(DQ ($ Id.VSub_DollarName '$BUILD') (/record-commands))}
                            ]
                            redirects: [
                              (redir.Redir
                                op: (Token id:Id.Redir_Great val:'2>' span_id:1138)
                                fd: 2
                                arg_word: {(/dev/null)}
                              )
                            ]
                          )
                        ]
                      )
                  )
                )
              } {(Id.Lit_RBracket ']')}
            )
          ]
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DPipe]
              children: [
                (C {(cd)} {(DQ ($ Id.VSub_DollarName '$TOP'))})
                (C {(more/record-commands.sh)})
                (C {(dienow)})
              ]
            )
          ]
          spids: [1115 1145]
        )
      ]
    )
    (C {(echo)} {(-e)} 
      {(DQ (Id.Lit_Other '\\') ('e[32mHost tools build complete.') (Id.Lit_Other '\\') ('e[0m'))}
    )
  ]
)