(command.CommandList
  children: [
    (command.ShFunction
      name: usage
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [
                {<echo>}
                {(DQ <'usage: ssh-copy-id [-lv] [-i keyfile] [-o option] [-p port] [user@]hostname'>)}
              ]
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
        )
    )
    (command.ShFunction
      name: sendkey
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'h='> (DQ ($ Id.VSub_Number '$1'))})
            (C {<local>} {<Id.Lit_VarLike 'k='> (DQ ($ Id.VSub_Number '$2'))})
            (command.Pipeline
              children: [
                (C {<printf>} {(DQ <'%s'> <Id.Lit_BadBackslash '\\'> <n>)} 
                  {(DQ ($ Id.VSub_DollarName '$k'))}
                )
                (C {<ssh>} {($ Id.VSub_DollarName '$port')} {<-S>} {<none>} 
                  {($ Id.VSub_DollarName '$options')} {(DQ ($ Id.VSub_DollarName '$user') ($ Id.VSub_DollarName '$h'))} {<'/bin/sh'>} {<-c>} 
                  {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>) 
                    (SQ <' \\\n'> <'\t\tset -e; \\\n'> <'\t\tumask 077; \\\n'> 
                      <'\t\tkeyfile=$HOME/.ssh/authorized_keys ; \\\n'> <'\t\tmkdir -p -- "$HOME/.ssh/" ; \\\n'> <'\t\twhile read alg key comment ; do \\\n'> 
                      <'\t\t\t[ -n "$key" ] || continue; \\\n'> <'\t\t\tif ! grep -sqwF "$key" "$keyfile"; then \\\n'> 
                      <'\t\t\t\tprintf "$alg $key $comment\\n" >> "$keyfile" ; \\\n'> <'\t\t\tfi ; \\\n'> <'\t\tdone ; \\\n'> <'\t\tif [ -x /sbin/restorecon ]; then \\\n'> 
                      <
'\t\t\t/sbin/restorecon -F "$HOME/.ssh/" "$keyfile" >/dev/null 2>&1 || true ; \\\n'
                      > <'\t\tfi \\\n'> <'\t'>
                    ) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\''>)
                  }
                )
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: agentKeys
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:keys)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (command_sub
                          left_token: <Id.Left_DollarParen '$('>
                          child: 
                            (command.Pipeline
                              children: [
                                (C {<ssh-add>} {<-L>})
                                (C {<grep>} {<-v>} {(SQ <'The agent has no identities.'>)})
                              ]
                              negated: F
                            )
                        ) ($ Id.VSub_DollarName '$nl') ($ Id.VSub_DollarName '$keys')
                      )
                    }
                  spids: [196]
                )
              ]
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:keys)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [220]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:host)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [224]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:hasarg)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [228]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:user)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [232]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:port)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [236]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:nl)
          op: assign_op.Equal
          rhs: {(DQ <'\n'>)}
          spids: [240]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:options)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [245]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:IFS)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$nl')}
          spids: [250]
        )
      ]
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: 
        (condition.Shell
          commands: [
            (command.Sentence
              child: (C {<getopts>} {(SQ <'i:lo:p:v'>)} {<arg>})
              terminator: <Id.Op_Semi _>
            )
          ]
        )
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {($ Id.VSub_DollarName '$arg')}
              arms: [
                (case_arm
                  pat_list: [{<i>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:hasarg)
                          op: assign_op.Equal
                          rhs: {(DQ <x>)}
                          spids: [280]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {<-r>} 
                                      {(DQ (${ Id.VSub_Name OPTARG) <.pub>)} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:keys)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ 
                                        (command_sub
                                          left_token: <Id.Left_DollarParen '$('>
                                          child: 
                                            (C {<cat>} {<-->} {(DQ (${ Id.VSub_Name OPTARG) <.pub>)})
                                        ) ($ Id.VSub_DollarName '$nl') ($ Id.VSub_DollarName '$keys')
                                      )
                                    }
                                  spids: [305]
                                )
                              ]
                            )
                          ]
                          spids: [286 302]
                        )
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (C {<Id.Lit_LBracket '['>} {<-r>} 
                                      {(DQ ($ Id.VSub_DollarName '$OPTARG'))} {<Id.Lit_RBracket ']'>}
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:keys)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ 
                                        (command_sub
                                          left_token: <Id.Left_DollarParen '$('>
                                          child: 
                                            (C {<cat>} {<-->} {(DQ ($ Id.VSub_DollarName '$OPTARG'))})
                                        ) ($ Id.VSub_DollarName '$nl') ($ Id.VSub_DollarName '$keys')
                                      )
                                    }
                                  spids: [340]
                                )
                              ]
                            )
                          ]
                          spids: [324 337]
                        )
                      ]
                      else_action: [
                        (command.Simple
                          words: [
                            {<echo>}
                            {(DQ <'File '> ($ Id.VSub_DollarName '$OPTARG') <' not found'>)}
                          ]
                          redirects: [
                            (redir
                              op: <Id.Redir_GreatAnd '>&'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<2>}
                            )
                          ]
                          do_fork: T
                        )
                        (command.ControlFlow
                          token: <Id.ControlFlow_Exit exit>
                          arg_word: {<1>}
                        )
                      ]
                    )
                  ]
                  spids: [275 276 379 -1]
                )
                (case_arm
                  pat_list: [{<l>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:hasarg)
                          op: assign_op.Equal
                          rhs: {(DQ <x>)}
                          spids: [387]
                        )
                      ]
                    )
                    (C {<agentKeys>})
                  ]
                  spids: [382 383 396 -1]
                )
                (case_arm
                  pat_list: [{<p>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:port)
                          op: assign_op.Equal
                          rhs: {<-p> ($ Id.VSub_DollarName '$nl') ($ Id.VSub_DollarName '$OPTARG')}
                          spids: [404]
                        )
                      ]
                    )
                  ]
                  spids: [399 400 410 -1]
                )
                (case_arm
                  pat_list: [{<o>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:options)
                          op: assign_op.Equal
                          rhs: 
                            {($ Id.VSub_DollarName '$options') ($ Id.VSub_DollarName '$nl') <-o> 
                              ($ Id.VSub_DollarName '$nl') ($ Id.VSub_DollarName '$OPTARG')
                            }
                          spids: [418]
                        )
                      ]
                    )
                  ]
                  spids: [413 414 426 -1]
                )
                (case_arm
                  pat_list: [{<v>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:options)
                          op: assign_op.Equal
                          rhs: 
                            {(DQ ($ Id.VSub_DollarName '$options') ($ Id.VSub_DollarName '$nl') <-v>)}
                          spids: [433]
                        )
                      ]
                    )
                  ]
                  spids: [429 430 441 -1]
                )
                (case_arm
                  pat_list: [{<Id.Lit_Star '*'>}]
                  action: [(C {<usage>})]
                  spids: [444 445 452 -1]
                )
              ]
            )
          ]
        )
      redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
    )
    (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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$hasarg'))} 
                      {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [(C {<agentKeys>})]
          spids: [473 486]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$keys'))} 
                          {<Id.Lit_RBracket ']'>}
                        )
                        (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$keys'))} 
                          {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$nl'))} {<Id.Lit_RBracket ']'>}
                        )
                      ]
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Simple
              words: [{<echo>} {(DQ <'no keys found'>)}]
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [493 522]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Pound '$#'))} {<-eq>} {<0>} 
                      {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [(C {<usage>})]
          spids: [541 556]
        )
      ]
    )
    (command.ForEach
      iter_name: host
      iter_words: [{(DQ ($ Id.VSub_At '$@'))}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (C {<sendkey>} {(DQ ($ Id.VSub_DollarName '$host'))} {(DQ ($ Id.VSub_DollarName '$keys'))})
          ]
        )
    )
  ]
)