code: func (ar *AutoRelay) relayAddrs(addrs []ma.Multiaddr) []ma.Multiaddr {
  	ar.mx.Lock()
  	defer ar.mx.Unlock()
  
  	if ar.status != autonat.NATStatusPrivate {
  		return addrs
  	}
  
  	if ar.cachedAddrs != nil && time.Now().Before(ar.cachedAddrsExpiry) {
  		return ar.cachedAddrs
  	}
  
  	raddrs := make([]ma.Multiaddr, 0, 4*len(ar.relays)+4)
  
  	// only keep private addrs from the original addr set
  	for _, addr := range addrs {
  		if manet.IsPrivateAddr(addr) {
  			raddrs = append(raddrs, addr)
  		}
  	}
  
  	// add relay specific addrs to the list
  	for p := range ar.relays {
  		addrs := cleanupAddressSet(ar.host.Peerstore().Addrs(p))
  
  		circuit, err := ma.NewMultiaddr(fmt.Sprintf("/p2p/%s/p2p-circuit", p.Pretty()))
  		if err != nil {
  			panic(err)
  		}
  
  		for _, addr := range addrs {
  			pub := addr.Encapsulate(circuit)
  			raddrs = append(raddrs, pub)
  		}
  	}
  
  	ar.cachedAddrs = raddrs
  	ar.cachedAddrsExpiry = time.Now().Add(30 * time.Second)
  
  	return raddrs
  }
docs: // This function is computes the NATed relay addrs when our status is private:
  // - The public addrs are removed from the address set.
  // - The non-public addrs are included verbatim so that peers behind the same NAT/firewall
  //   can still dial us directly.
  // - On top of those, we add the relay-specific addrs for the relays to which we are
  //   connected. For each non-private relay addr, we encapsulate the p2p-circuit addr
  //   through which we can be dialed.