code: public boolean matches(HostName host) {
  		if(this == host) {
  			return true;
  		}
  		if(isValid()) {
  			if(host.isValid()) {
  				if(isAddressString()) {
  					return host.isAddressString()
  							&& asAddressString().equals(host.asAddressString())
  							&& Objects.equals(getPort(), host.getPort())
  							&& Objects.equals(getService(), host.getService());
  				}
  				if(host.isAddressString()) {
  					return false;
  				}
  				String thisHost = parsedHost.getHost();
  				String otherHost = host.parsedHost.getHost();
  				if(!thisHost.equals(otherHost)) {
  					return false;
  				}
  				return Objects.equals(parsedHost.getEquivalentPrefixLength(), host.parsedHost.getEquivalentPrefixLength()) &&
  						Objects.equals(parsedHost.getMask(), host.parsedHost.getMask()) &&
  						Objects.equals(parsedHost.getPort(), host.parsedHost.getPort()) &&
  						Objects.equals(parsedHost.getService(), host.parsedHost.getService());
  			}
  			return false;
  		}
  		return !host.isValid() && toString().equals(host.toString());
  	}
docs: Returns whether the given host matches this one.  For hosts to match, they must represent the same addresses or have the same host names.
  Hosts are not resolved when matching.  Also, hosts must have the same port and service.  They must have the same masks if they are host names.
  Even if two hosts are invalid, they match if they have the same invalid string.
  
  @param host
  @return