code: func NegotiateClaim(ctx context.Context, audience string, conn *amqp.Client, provider auth.TokenProvider) error {
  	span, ctx := tracing.StartSpanFromContext(ctx, "az-amqp-common.cbs.NegotiateClaim")
  	defer span.End()
  
  	link, err := rpc.NewLink(conn, cbsAddress)
  	if err != nil {
  		return err
  	}
  	defer link.Close(ctx)
  
  	token, err := provider.GetToken(audience)
  	if err != nil {
  		return err
  	}
  
  	log.For(ctx).Debug(fmt.Sprintf("negotiating claim for audience %s with token type %s and expiry of %s", audience, token.TokenType, token.Expiry))
  	msg := &amqp.Message{
  		Value: token.Token,
  		ApplicationProperties: map[string]interface{}{
  			cbsOperationKey:  cbsOperationPutToken,
  			cbsTokenTypeKey:  string(token.TokenType),
  			cbsAudienceKey:   audience,
  			cbsExpirationKey: token.Expiry,
  		},
  	}
  
  	res, err := link.RetryableRPC(ctx, 3, 1*time.Second, msg)
  	if err != nil {
  		log.For(ctx).Error(err)
  		return err
  	}
  
  	log.For(ctx).Debug(fmt.Sprintf("negotiated with response code %d and message: %s", res.Code, res.Description))
  	return nil
  }
docs: // NegotiateClaim attempts to put a token to the $cbs management endpoint to negotiate auth for the given audience