(command.CommandList
  children: [
    (C {<readonly>} 
      {<Id.Lit_VarLike 'OUTPUT_DIR='> (DQ (${ Id.VSub_Name PROJECT_DERIVED_FILE_DIR) <'/protos'>)}
    )
    (command.ShFunction
      name: die
      body: 
        (BraceGroup
          children: [
            (C {<echo>} {(DQ <'Error: '> ($ Id.VSub_Number '$1'))})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<2>})
          ]
        )
    )
    (command.Case
      to_match: {(DQ (${ Id.VSub_Name ACTION))}
      arms: [
        (case_arm pat_list:[{(DQ )}] spids:[63 65 72 -1])
        (case_arm
          pat_list: [{(DQ <clean>)}]
          action: [
            (C {<rm>} {<-rf>} {(DQ (${ Id.VSub_Name OUTPUT_DIR))})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>})
          ]
          spids: [75 78 97 -1]
        )
        (case_arm
          pat_list: [{<Id.Lit_Star '*'>}]
          action: [(C {<die>} {(DQ <'Unknown action requested: '> (${ Id.VSub_Name ACTION))})]
          spids: [100 101 114 -1]
        )
      ]
    )
    (C {<mkdir>} {<-p>} {(DQ (${ Id.VSub_Name OUTPUT_DIR) <'/google/protobuf'>)})
    (C {<cd>} {(DQ (${ Id.VSub_Name SRCROOT) <'/..'>)})
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (command.DBracket expr:(bool_expr.Unary op_id:Id.BoolUnary_x child:{<'src/protoc'>}))
        (C {<die>} 
          {
            (DQ 
              <
'Could not find the protoc binary; make sure you have built it (objectivec/DevTools/full_mac_build.sh -h).'
              >
            )
          }
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:RUN_PROTOC)
          op: assign_op.Equal
          rhs: {<no>}
          spids: [180]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DBracket
                      expr: 
                        (bool_expr.LogicalNot
                          child: 
                            (bool_expr.Unary
                              op_id: Id.BoolUnary_d
                              child: {(DQ (${ Id.VSub_Name OUTPUT_DIR))}
                            )
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:RUN_PROTOC)
                  op: assign_op.Equal
                  rhs: {<yes>}
                  spids: [204]
                )
              ]
            )
          ]
          spids: [183 201]
        )
      ]
      else_action: [
        (C {<readonly>} 
          {<Id.Lit_VarLike 'NewestInput='> 
            (command_sub
              left_token: <Id.Left_DollarParen '$('>
              child: 
                (command.Pipeline
                  children: [
                    (C {<find>} {<'src/google/protobuf/'> <Id.Lit_Star '*'> <.proto>} 
                      {<'objectivec/Tests/'> <Id.Lit_Star '*'> <.proto>} {<'src/.libs'>} {<'src/'> <Id.Lit_Star '*'> <.la>} {<'src/protoc'>} 
                      {<'objectivec/DevTools/compile_testing_protos.sh'>} {<-type>} {<f>} {<-print0>}
                    )
                    (C {<xargs>} {<-0>} {<stat>} {<-f>} {(DQ <'%m %N'>)})
                    (C {<sort>} {<-n>})
                    (C {<tail>} {<-n1>})
                    (C {<cut>} {<-f2->} {<-d> (DQ <' '>)})
                  ]
                  negated: F
                )
            )
          }
        )
        (C {<readonly>} 
          {<Id.Lit_VarLike 'OldestOutput='> 
            (command_sub
              left_token: <Id.Left_DollarParen '$('>
              child: 
                (command.Pipeline
                  children: [
                    (C {<find>} {(DQ (${ Id.VSub_Name OUTPUT_DIR))} {<-type>} {<f>} {<-name>} 
                      {(DQ <'*pbobjc.[hm]'>)} {<-print0>}
                    )
                    (C {<xargs>} {<-0>} {<stat>} {<-f>} {(DQ <'%m %N'>)})
                    (C {<sort>} {<-n>} {<-r>})
                    (C {<tail>} {<-n1>})
                    (C {<cut>} {<-f2->} {<-d> (DQ <' '>)})
                  ]
                  negated: F
                )
            )
          }
        )
        (command.If
          arms: [
            (if_arm
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.Binary
                              op_id: Id.BoolBinary_nt
                              left: {(DQ (${ Id.VSub_Name NewestInput))}
                              right: {(DQ (${ Id.VSub_Name OldestOutput))}
                            )
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              action: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:RUN_PROTOC)
                      op: assign_op.Equal
                      rhs: {<yes>}
                      spids: [411]
                    )
                  ]
                )
              ]
              spids: [386 408]
            )
          ]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DBracket
                      expr: 
                        (bool_expr.Binary
                          op_id: Id.BoolBinary_GlobNEqual
                          left: {(DQ (${ Id.VSub_Name RUN_PROTOC))}
                          right: {(DQ <yes>)}
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [(command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>})]
          spids: [420 440]
        )
      ]
    )
    (command.Pipeline
      children: [
        (C {<find>} {(DQ (${ Id.VSub_Name OUTPUT_DIR))} {<-type>} {<f>} {<-name>} {(DQ <'*pbobjc.[hm]'>)} 
          {<-print0>}
        )
        (C {<xargs>} {<-0>} {<rm>} {<-rf>})
      ]
      negated: F
    )
    (command.ShFunction
      name: compile_protos
      body: 
        (BraceGroup
          children: [
            (C {<'src/protoc'>} 
              {<--objc_out> <Id.Lit_Equals '='> (DQ (${ Id.VSub_Name OUTPUT_DIR) <'/google/protobuf'>)} {<--proto_path> <Id.Lit_Equals '='> <'src/google/protobuf/'>} 
              {<--proto_path> <Id.Lit_Equals '='> <src>} {(DQ ($ Id.VSub_At '$@'))}
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:CORE_PROTO_FILES)
          op: assign_op.Equal
          rhs: 
            {
              (sh_array_literal
                left: <Id.Op_LParen _>
                words: [
                  {<'src/google/protobuf/any_test.proto'>}
                  {<'src/google/protobuf/unittest_arena.proto'>}
                  {<'src/google/protobuf/unittest_custom_options.proto'>}
                  {<'src/google/protobuf/unittest_enormous_descriptor.proto'>}
                  {<'src/google/protobuf/unittest_embed_optimize_for.proto'>}
                  {<'src/google/protobuf/unittest_empty.proto'>}
                  {<'src/google/protobuf/unittest_import.proto'>}
                  {<'src/google/protobuf/unittest_import_lite.proto'>}
                  {<'src/google/protobuf/unittest_lite.proto'>}
                  {<'src/google/protobuf/unittest_mset.proto'>}
                  {<'src/google/protobuf/unittest_mset_wire_format.proto'>}
                  {<'src/google/protobuf/unittest_no_arena.proto'>}
                  {<'src/google/protobuf/unittest_no_arena_import.proto'>}
                  {<'src/google/protobuf/unittest_no_generic_services.proto'>}
                  {<'src/google/protobuf/unittest_optimize_for.proto'>}
                  {<'src/google/protobuf/unittest.proto'>}
                  {<'src/google/protobuf/unittest_import_public.proto'>}
                  {<'src/google/protobuf/unittest_import_public_lite.proto'>}
                  {<'src/google/protobuf/unittest_drop_unknown_fields.proto'>}
                  {<'src/google/protobuf/unittest_preserve_unknown_enum.proto'>}
                  {<'src/google/protobuf/map_lite_unittest.proto'>}
                  {<'src/google/protobuf/map_proto2_unittest.proto'>}
                  {<'src/google/protobuf/map_unittest.proto'>}
                  {<'src/google/protobuf/descriptor.proto'>}
                ]
              )
            }
          spids: [558]
        )
      ]
    )
    (command.ForEach
      iter_name: a_proto
      iter_words: [
        {
          (DQ 
            (braced_var_sub
              token: <Id.VSub_Name CORE_PROTO_FILES>
              bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
            )
          )
        }
      ]
      do_arg_iter: F
      body: (command.DoGroup children:[(C {<compile_protos>} {(DQ (${ Id.VSub_Name a_proto))})])
    )
    (C {<compile_protos>} {<--proto_path> <Id.Lit_Equals '='> (DQ <'objectivec/Tests'>)} 
      {<'objectivec/Tests/unittest_cycle.proto'>} {<'objectivec/Tests/unittest_extension_chain_a.proto'>} 
      {<'objectivec/Tests/unittest_extension_chain_b.proto'>} {<'objectivec/Tests/unittest_extension_chain_c.proto'>} 
      {<'objectivec/Tests/unittest_extension_chain_d.proto'>} {<'objectivec/Tests/unittest_extension_chain_e.proto'>} 
      {<'objectivec/Tests/unittest_extension_chain_f.proto'>} {<'objectivec/Tests/unittest_extension_chain_g.proto'>} 
      {<'objectivec/Tests/unittest_runtime_proto2.proto'>} {<'objectivec/Tests/unittest_runtime_proto3.proto'>} {<'objectivec/Tests/unittest_objc.proto'>} 
      {<'objectivec/Tests/unittest_objc_startup.proto'>}
    )
  ]
)