docs: protected static <R extends AddressSection, S extends AddressSegment> R increment(
  			R section,
  			long increment,
  			AddressCreator<?, R, ?, S> addrCreator, 
  			long count,
  			long lowerValue,
  			long upperValue,
  			Supplier<R> lowerProducer,
  			Supplier<R> upperProducer,
  			Integer prefixLength) {
  		if(!section.isMultiple()) {
  			return add(section, lowerValue, increment, addrCreator, prefixLength);
  		}
  		boolean isDecrement = increment <= 0;
  		if(isDecrement) {
  			//we know lowerValue + increment >= 0 because we already did an overflow check
  			return add(lowerProducer.get(), lowerValue, increment, addrCreator, prefixLength);
  		} 
  		if(count > increment) {
  			if(count == increment + 1) {
  				return upperProducer.get();
  			}
  			return incrementRange(section, increment, addrCreator, lowerProducer, prefixLength);
  		}
  		if(increment <= Long.MAX_VALUE - upperValue) {
  			return add(upperProducer.get(), upperValue, increment - (count - 1), addrCreator, prefixLength);
  		}
  		return add(upperProducer.get(), BigInteger.valueOf(increment - (count - 1)), addrCreator, prefixLength);
  	}