code: func ParseBlocklistP2PLine(l []byte) (r Range, ok bool, err error) {
  	l = bytes.TrimSpace(l)
  	if len(l) == 0 || bytes.HasPrefix(l, []byte("#")) {
  		return
  	}
  	// TODO: Check this when IPv6 blocklists are available.
  	colon := bytes.LastIndexAny(l, ":")
  	if colon == -1 {
  		err = errors.New("missing colon")
  		return
  	}
  	hyphen := bytes.IndexByte(l[colon+1:], '-')
  	if hyphen == -1 {
  		err = errors.New("missing hyphen")
  		return
  	}
  	hyphen += colon + 1
  	r.Description = string(l[:colon])
  	r.First = net.ParseIP(string(l[colon+1 : hyphen]))
  	minifyIP(&r.First)
  	r.Last = net.ParseIP(string(l[hyphen+1:]))
  	minifyIP(&r.Last)
  	if r.First == nil || r.Last == nil || len(r.First) != len(r.Last) {
  		err = errors.New("bad IP range")
  		return
  	}
  	ok = true
  	return
  }
docs: // Parse a line of the PeerGuardian Text Lists (P2P) Format. Returns !ok but
  // no error if a line doesn't contain a range but isn't erroneous, such as
  // comment and blank lines.