code: public Retryer<R> exponentialWait(final long multiplier, final long maximumWait) {
          checkArgument(multiplier > 0L, "multiplier must be > 0 but is %d", multiplier);
          checkArgument(maximumWait >= 0L, "maximumWait must be >= 0 but is %d", maximumWait);
          checkArgument(multiplier < maximumWait, "multiplier must be < maximumWait but is %d", multiplier);
          
          return withWaitStrategy(new WaitStrategy() {
              
              @Override public long computeSleepTime(int previousAttemptNumber, long delaySinceFirstAttemptInMillis) {
                  double exp = Math.pow(2, previousAttemptNumber);
                  long result = Math.round(multiplier * exp);
                  if (result > maximumWait) {
                      result = maximumWait;
                  }
                  return result >= 0L ? result : 0L;
              }
          });
      }
docs: Sets the wait strategy which sleeps for an exponential amount of time after the first failed attempt,
  and in exponentially incrementing amounts after each failed attempt up to the maximumTime.
  The wait time between the retries can be controlled by the multiplier.
  nextWaitTime = exponentialIncrement * {@code multiplier}.
  
  @param multiplier
  @param maximumTime the unit of the maximumTime is {@link TimeUnit#MILLISECONDS}
  @return