// Path: src/main/java/org/rakam/cache/hazelcast/hyperloglog/HyperLogLog.java
// public interface HyperLogLog extends DistributedObject {
//     /**
//      * Returns the name of this HyperLogLog instance.
//      *
//      * @return name of this instance
//      */
// 
//     String getName();
// 
//     /**
//      * Returns the cardinality of the HyperLogLog container
//      */
//     public long cardinality();
// 
//     public void reset();
// 
//     /**
//      * Unions given hll container with the internal one.
//      *
//      * @param hll the hll container to marge
//      */
//     public void union(HLLWrapper hll);
// 
//     public void addAll(Collection<String> coll);
// 
//     public void add(String obj);
// }
// 
// Path: src/main/java/org/rakam/util/HLLWrapper.java
// public class HLLWrapper {
//     final private static int SEED = 123456;
//     private HLL hll;
// 
//     public HLLWrapper() {
//         hll = new HLL(13/*log2m*/, 5/*registerWidth*/);
//     }
// 
//     public HLLWrapper(byte[] bytes) {
//         hll = HLL.fromBytes(bytes);
//     }
// 
//     public long cardinality() {
//         return hll.cardinality();
//     }
// 
//     public void union(HLLWrapper hll) {
//         this.hll.union(hll.hll);
//     }
// 
//     public void addAll(Collection<String> coll) {
//         for (String a : coll) {
//             byte[] s = a.getBytes();
//             hll.addRaw(MurmurHash3.murmurhash3x8632(s, 0, s.length, SEED));
//         }
//     }
// 
//     public void add(String obj) {
//         if (obj == null)
//             throw new IllegalArgumentException();
//         byte[] s = obj.getBytes();
// 
//         hll.addRaw(MurmurHash3.murmurhash3x8632(s, 0, s.length, SEED));
//     }
// 
//     public void set(byte[] bytes) {
//         hll = HLL.fromBytes(bytes);
//     }
// 
//     public byte[] bytes() {
//         return hll.toBytes();
//     }
// 
//     public void reset() {
//         hll = new HLL(13/*log2m*/, 5/*registerWidth*/);
//     }
// }


import com.hazelcast.client.ClientRequest;
import com.hazelcast.client.spi.ClientProxy;
import com.hazelcast.nio.serialization.Data;
import org.rakam.cache.hazelcast.hyperloglog.HyperLogLog;
import org.rakam.util.HLLWrapper;
import java.util.Collection;

    protected <T> T invoke(ClientRequest req) {
        return super.invoke(req, getKey());
    }

    private Data getKey() {
        if (key == null) {
            key = toData(name);
        }
        return key;
    }

    @Override
    public String toString() {
        return "HyperLogLog{" + "name='" + name + '\'' + '}';
    }

    @Override
    public long cardinality() {
        CardinalityRequest request = new CardinalityRequest(name);
        return (Long) invoke(request);
    }

    @Override
    public void reset() {
        ResetRequest request = new ResetRequest(name);
        invoke(request);
    }

    @Override
// Path: src/main/java/org/rakam/cache/hazelcast/hyperloglog/HyperLogLog.java
// public interface HyperLogLog extends DistributedObject {
//     /**
//      * Returns the name of this HyperLogLog instance.
//      *
//      * @return name of this instance
//      */
// 
//     String getName();
// 
//     /**
//      * Returns the cardinality of the HyperLogLog container
//      */
//     public long cardinality();
// 
//     public void reset();
// 
//     /**
//      * Unions given hll container with the internal one.
//      *
//      * @param hll the hll container to marge
//      */
//     public void union(HLLWrapper hll);
// 
//     public void addAll(Collection<String> coll);
// 
//     public void add(String obj);
// }
// 
// Path: src/main/java/org/rakam/util/HLLWrapper.java
// public class HLLWrapper {
//     final private static int SEED = 123456;
//     private HLL hll;
// 
//     public HLLWrapper() {
//         hll = new HLL(13/*log2m*/, 5/*registerWidth*/);
//     }
// 
//     public HLLWrapper(byte[] bytes) {
//         hll = HLL.fromBytes(bytes);
//     }
// 
//     public long cardinality() {
//         return hll.cardinality();
//     }
// 
//     public void union(HLLWrapper hll) {
//         this.hll.union(hll.hll);
//     }
// 
//     public void addAll(Collection<String> coll) {
//         for (String a : coll) {
//             byte[] s = a.getBytes();
//             hll.addRaw(MurmurHash3.murmurhash3x8632(s, 0, s.length, SEED));
//         }
//     }
// 
//     public void add(String obj) {
//         if (obj == null)
//             throw new IllegalArgumentException();
//         byte[] s = obj.getBytes();
// 
//         hll.addRaw(MurmurHash3.murmurhash3x8632(s, 0, s.length, SEED));
//     }
// 
//     public void set(byte[] bytes) {
//         hll = HLL.fromBytes(bytes);
//     }
// 
//     public byte[] bytes() {
//         return hll.toBytes();
//     }
// 
//     public void reset() {
//         hll = new HLL(13/*log2m*/, 5/*registerWidth*/);
//     }
// }


// Path: src/main/java/org/rakam/cache/hazelcast/hyperloglog/client/ClientHyperLogLogProxy.java
import com.hazelcast.client.ClientRequest;
import com.hazelcast.client.spi.ClientProxy;
import com.hazelcast.nio.serialization.Data;
import org.rakam.cache.hazelcast.hyperloglog.HyperLogLog;
import org.rakam.util.HLLWrapper;
import java.util.Collection;


    protected <T> T invoke(ClientRequest req) {
        return super.invoke(req, getKey());
    }

    private Data getKey() {
        if (key == null) {
            key = toData(name);
        }
        return key;
    }

    @Override
    public String toString() {
        return "HyperLogLog{" + "name='" + name + '\'' + '}';
    }

    @Override
    public long cardinality() {
        CardinalityRequest request = new CardinalityRequest(name);
        return (Long) invoke(request);
    }

    @Override
    public void reset() {
        ResetRequest request = new ResetRequest(name);
        invoke(request);
    }

    @Override
    public void union(HLLWrapper hll) {