// Path: tenacity-core/src/main/java/com/yammer/tenacity/core/properties/TenacityPropertyKey.java
// public interface TenacityPropertyKey extends HystrixCommandKey, HystrixThreadPoolKey {
//     default Predicate<TenacityPropertyKey> isEqualPredicate() {
//         return (value) -> value.name().equals(name());
//     }
// 
//     default TenacityPropertyKey validate(Collection<TenacityPropertyKey> keys) {
//         return keys.stream()
//                 .filter(isEqualPredicate())
//                 .findAny()
//                 .orElseThrow(() -> new NoSuchElementException("No TenacityPropertyKey " + name()));
//     }
// }


import com.netflix.hystrix.*;
import com.netflix.hystrix.metric.consumer.CumulativeCommandEventCounterStream;
import com.netflix.hystrix.metric.consumer.RollingCommandEventCounterStream;
import com.netflix.hystrix.strategy.properties.HystrixPropertiesFactory;
import com.yammer.tenacity.core.properties.TenacityPropertyKey;
import rx.Observable;
import java.util.function.Supplier;
package com.yammer.tenacity.core;



public abstract class TenacityObservableCommand<R> extends HystrixObservableCommand<R> {
    protected TenacityObservableCommand(TenacityPropertyKey tenacityPropertyKey) {
        super(HystrixObservableCommand.Setter.withGroupKey(TenacityCommand.tenacityGroupKey())
                .andCommandKey(tenacityPropertyKey));
    }

    public static HystrixCommandGroupKey commandGroupKeyFrom(String key) {
        return HystrixCommandGroupKey.Factory.asKey(key);
    }

// Path: tenacity-core/src/main/java/com/yammer/tenacity/core/properties/TenacityPropertyKey.java
// public interface TenacityPropertyKey extends HystrixCommandKey, HystrixThreadPoolKey {
//     default Predicate<TenacityPropertyKey> isEqualPredicate() {
//         return (value) -> value.name().equals(name());
//     }
// 
//     default TenacityPropertyKey validate(Collection<TenacityPropertyKey> keys) {
//         return keys.stream()
//                 .filter(isEqualPredicate())
//                 .findAny()
//                 .orElseThrow(() -> new NoSuchElementException("No TenacityPropertyKey " + name()));
//     }
// }


// Path: tenacity-core/src/main/java/com/yammer/tenacity/core/TenacityObservableCommand.java
import com.netflix.hystrix.*;
import com.netflix.hystrix.metric.consumer.CumulativeCommandEventCounterStream;
import com.netflix.hystrix.metric.consumer.RollingCommandEventCounterStream;
import com.netflix.hystrix.strategy.properties.HystrixPropertiesFactory;
import com.yammer.tenacity.core.properties.TenacityPropertyKey;
import rx.Observable;
import java.util.function.Supplier;

package com.yammer.tenacity.core;



public abstract class TenacityObservableCommand<R> extends HystrixObservableCommand<R> {
    protected TenacityObservableCommand(TenacityPropertyKey tenacityPropertyKey) {
        super(HystrixObservableCommand.Setter.withGroupKey(TenacityCommand.tenacityGroupKey())
                .andCommandKey(tenacityPropertyKey));
    }

    public static HystrixCommandGroupKey commandGroupKeyFrom(String key) {
        return HystrixCommandGroupKey.Factory.asKey(key);
    }

    public static HystrixCommandProperties getCommandProperties(TenacityPropertyKey key) {