class DecorrelatedJitterDelay extends Delay implements StatefulDelay {

    private final Duration lower;

    private final Duration upper;

    private final long base;

    private final TimeUnit targetTimeUnit;

    /*
     * Delays may be used by different threads, this one is volatile to prevent visibility issues
     */
    private volatile long prevDelay;

    DecorrelatedJitterDelay(Duration lower, Duration upper, long base, TimeUnit targetTimeUnit) {
        this.lower = lower;
        this.upper = upper;
        this.base = base;
        this.targetTimeUnit = targetTimeUnit;
        reset();
    }

    @Override
    public Duration createDelay(long attempt) {<FILL_FUNCTION_BODY>}

    @Override
    public void reset() {
        prevDelay = 0L;
    }

}

        long value = randomBetween(base, Math.max(base, prevDelay * 3));
        Duration delay = applyBounds(Duration.ofNanos(targetTimeUnit.toNanos(value)), lower, upper);
        prevDelay = targetTimeUnit.convert(delay.toNanos(), TimeUnit.NANOSECONDS);
        return delay;
    
<methods>public static io.lettuce.core.resource.Delay constant(java.time.Duration) ,public static io.lettuce.core.resource.Delay constant(int, java.util.concurrent.TimeUnit) ,public abstract java.time.Duration createDelay(long) ,public static Supplier<io.lettuce.core.resource.Delay> decorrelatedJitter() ,public static Supplier<io.lettuce.core.resource.Delay> decorrelatedJitter(java.time.Duration, java.time.Duration, long, java.util.concurrent.TimeUnit) ,public static Supplier<io.lettuce.core.resource.Delay> decorrelatedJitter(long, long, long, java.util.concurrent.TimeUnit) ,public static io.lettuce.core.resource.Delay equalJitter() ,public static io.lettuce.core.resource.Delay equalJitter(java.time.Duration, java.time.Duration, long, java.util.concurrent.TimeUnit) ,public static io.lettuce.core.resource.Delay equalJitter(long, long, long, java.util.concurrent.TimeUnit) ,public static io.lettuce.core.resource.Delay exponential() ,public static io.lettuce.core.resource.Delay exponential(java.time.Duration, java.time.Duration, int, java.util.concurrent.TimeUnit) ,public static io.lettuce.core.resource.Delay exponential(long, long, java.util.concurrent.TimeUnit, int) ,public static io.lettuce.core.resource.Delay fullJitter() ,public static io.lettuce.core.resource.Delay fullJitter(java.time.Duration, java.time.Duration, long, java.util.concurrent.TimeUnit) ,public static io.lettuce.core.resource.Delay fullJitter(long, long, long, java.util.concurrent.TimeUnit) <variables>private static java.time.Duration DEFAULT_LOWER_BOUND,private static int DEFAULT_POWER_OF,private static java.util.concurrent.TimeUnit DEFAULT_TIMEUNIT,private static java.time.Duration DEFAULT_UPPER_BOUND