code: func NewStaticUpstreams(c *caddyfile.Dispenser) ([]Upstream, error) {
  	var upstreams []Upstream
  	for c.Next() {
  		upstream := &staticUpstream{
  			from: ".",
  			HealthCheck: healthcheck.HealthCheck{
  				FailTimeout: 5 * time.Second,
  				MaxFails:    3,
  			},
  			ex: newDNSEx(),
  		}
  
  		if !c.Args(&upstream.netsource) {
  			return upstreams, c.ArgErr()
  		}
  
  		_, _, err := net.ParseCIDR(upstream.netsource)
  
  		if err != nil {
  			upstream.from = upstream.netsource
  			upstream.netsource = ""
  		}
  
  		upstream.from = plugin.Host(upstream.from).Normalize()
  
  		to := c.RemainingArgs()
  		if len(to) == 0 {
  			return upstreams, c.ArgErr()
  		}
  
  		// process the host list, substituting in any nameservers in files
  		toHosts, err := dnsutil.ParseHostPortOrFile(to...)
  		if err != nil {
  			return upstreams, err
  		}
  
  		for c.NextBlock() {
  			if err := parseBlock(c, upstream); err != nil {
  				return upstreams, err
  			}
  		}
  
  		upstream.Hosts = make([]*healthcheck.UpstreamHost, len(toHosts))
  
  		for i, host := range toHosts {
  			uh := &healthcheck.UpstreamHost{
  				Name:        host,
  				FailTimeout: upstream.FailTimeout,
  				CheckDown:   checkDownFunc(upstream),
  			}
  			upstream.Hosts[i] = uh
  		}
  		upstream.Start()
  
  		upstreams = append(upstreams, upstream)
  	}
  	return upstreams, nil
  }
docs: // NewStaticUpstreams parses the configuration input and sets up
  // static upstreams for the proxy plugin.