// Path: jrand-core/src/main/java/me/xdrop/jrand/Generator.java
// public abstract class Generator<T> {
// 
//     private Rand randGen;
// 
//     public Generator() {
//         this.randGen = new Rand();
//     }
// 
//     public Rand random() {
//         return this.randGen;
//     }
// 
//     public abstract T gen();
// 
//     public String repeat(int times) {
//         StringBuilder sb = new StringBuilder();
//         while (times-- > 0) {
//             sb.append(gen());
//         }
//         return sb.toString();
//     }
// 
//     public String genString() {
//         return gen().toString();
//     }
// 
//     public List<T> genMany(int num) {
//         List<T> many = new ArrayList<>();
//         for (int n = 0; n < num; n++) {
//             many.add(gen());
//         }
//         return many;
//     }
// 
//     public List<T> genManyUnique(int num) {
//         List<T> many = new LinkedList<>();
//         Set<T> present = new HashSet<>();
// 
// 
//         for (int n = 0; n < num; n++) {
//             T gen;
//             do {
//                 gen = gen();
//             } while (present.contains(gen));
//             many.add(gen);
//             present.add(gen);
//         }
// 
//         return many;
//     }
// 
//     public Set<T> genManyAsSet(int num) {
//         List<T> many = new LinkedList<>();
//         for (int n = 0; n < num; n++) {
//             many.add(gen());
//         }
//         return new HashSet<>(many);
//     }
// 
// }
// 
// Path: jrand-core/src/main/java/me/xdrop/jrand/generators/basics/NaturalGenerator.java
// @Facade(accessor = "natural")
// public class NaturalGenerator extends Generator<Integer> {
// 
//     protected int min;
//     protected int max;
// 
//     public NaturalGenerator() {
//         this.max = Integer.MAX_VALUE - 1;
//         this.min = 0;
//     }
// 
//     /**
//      * Set the minimum value (inclusive)
//      *
//      * @param min The minimum value
//      * @return The same generator
//      */
//     public NaturalGenerator min(int min) {
//         this.min = min;
//         return this;
//     }
// 
//     /**
//      * Set the maximum value to return (inclusive)
//      *
//      * @param max The maximum value to return (inclusive)
//      * @return The same generator
//      */
//     public NaturalGenerator max(int max) {
//         this.max = max;
//         return this;
//     }
// 
//     /**
//      * Set a min/max range
//      *
//      * @param min Minimum value to be returned (inclusive)
//      * @param max Maximum value to be returned (inclusive)
//      * @return The same generator
//      */
//     public NaturalGenerator range(int min, int max) {
//         min(min);
//         max(max);
//         return this;
//     }
// 
//     /**
//      * Set a range starting from 0
//      *
//      * @param max Maximum value to be returned (inclusive)
//      * @return The same generator
//      */
//     public NaturalGenerator range(int max) {
//         min(0);
//         max(max - 1);
//         return this;
//     }
// 
//     public NaturalGenerator range(Range<Integer> rangeOption) {
//         min(rangeOption.getMin());
//         max(rangeOption.getMax());
//         return this;
//     }
// 
//     /**
//      * Retrieve n uniform samples from population without replacement
//      * @param sampleSize Number of samples to retrieve
//      * @param population The population size
//      * @return A list of integer samples
//      */
//     public List<Integer> sample(int sampleSize, int population) {
//         int t = 0, m =0;
//         List<Integer> samples = new ArrayList<>();
// 
//         while (m < sampleSize) {
//             double u = random().randDouble();
//             if ((population -t) * u >= sampleSize -m) {
//                 t++;
//             } else {
//                 samples.add(t);
//                 t++; m++;
//             }
//         }
//         return samples;
//     }
// 
//     @Override
//     public Integer gen() {
//         return random().randInt((max - min) + 1) + min;
//     }
// }


import me.xdrop.jrand.Generator;
import me.xdrop.jrand.annotation.Facade;
import me.xdrop.jrand.generators.basics.NaturalGenerator;
package me.xdrop.jrand.generators.money;


@Facade(accessor = "cvv")
public class CVVGenerator extends Generator<String> {
    protected NaturalGenerator nat;
    protected boolean amex;

    public CVVGenerator() {
        nat = new NaturalGenerator();
        amex = false;
    }

    /**
     * Return a 4-digit American Express CVV
     *
     * @param enable Set to true to enable this
     *               setting
     * @return The same generator
     */
    public CVVGenerator amex(boolean enable) {
        this.amex = enable;
        return this;
    }

    /**
     * Return a 4-digit American Express CVV
     *
     * @return The same generator
     */
    public CVVGenerator amex() {
        return amex(true);
    }

    @Override
    public String gen() {
        StringBuilder cvv = new StringBuilder(3);
        cvv.append(nat.range(1,9).gen());
        cvv.append(nat.range(0,9).gen());
        cvv.append(nat.range(0,9).gen());
// Path: jrand-core/src/main/java/me/xdrop/jrand/Generator.java
// public abstract class Generator<T> {
// 
//     private Rand randGen;
// 
//     public Generator() {
//         this.randGen = new Rand();
//     }
// 
//     public Rand random() {
//         return this.randGen;
//     }
// 
//     public abstract T gen();
// 
//     public String repeat(int times) {
//         StringBuilder sb = new StringBuilder();
//         while (times-- > 0) {
//             sb.append(gen());
//         }
//         return sb.toString();
//     }
// 
//     public String genString() {
//         return gen().toString();
//     }
// 
//     public List<T> genMany(int num) {
//         List<T> many = new ArrayList<>();
//         for (int n = 0; n < num; n++) {
//             many.add(gen());
//         }
//         return many;
//     }
// 
//     public List<T> genManyUnique(int num) {
//         List<T> many = new LinkedList<>();
//         Set<T> present = new HashSet<>();
// 
// 
//         for (int n = 0; n < num; n++) {
//             T gen;
//             do {
//                 gen = gen();
//             } while (present.contains(gen));
//             many.add(gen);
//             present.add(gen);
//         }
// 
//         return many;
//     }
// 
//     public Set<T> genManyAsSet(int num) {
//         List<T> many = new LinkedList<>();
//         for (int n = 0; n < num; n++) {
//             many.add(gen());
//         }
//         return new HashSet<>(many);
//     }
// 
// }
// 
// Path: jrand-core/src/main/java/me/xdrop/jrand/generators/basics/NaturalGenerator.java
// @Facade(accessor = "natural")
// public class NaturalGenerator extends Generator<Integer> {
// 
//     protected int min;
//     protected int max;
// 
//     public NaturalGenerator() {
//         this.max = Integer.MAX_VALUE - 1;
//         this.min = 0;
//     }
// 
//     /**
//      * Set the minimum value (inclusive)
//      *
//      * @param min The minimum value
//      * @return The same generator
//      */
//     public NaturalGenerator min(int min) {
//         this.min = min;
//         return this;
//     }
// 
//     /**
//      * Set the maximum value to return (inclusive)
//      *
//      * @param max The maximum value to return (inclusive)
//      * @return The same generator
//      */
//     public NaturalGenerator max(int max) {
//         this.max = max;
//         return this;
//     }
// 
//     /**
//      * Set a min/max range
//      *
//      * @param min Minimum value to be returned (inclusive)
//      * @param max Maximum value to be returned (inclusive)
//      * @return The same generator
//      */
//     public NaturalGenerator range(int min, int max) {
//         min(min);
//         max(max);
//         return this;
//     }
// 
//     /**
//      * Set a range starting from 0
//      *
//      * @param max Maximum value to be returned (inclusive)
//      * @return The same generator
//      */
//     public NaturalGenerator range(int max) {
//         min(0);
//         max(max - 1);
//         return this;
//     }
// 
//     public NaturalGenerator range(Range<Integer> rangeOption) {
//         min(rangeOption.getMin());
//         max(rangeOption.getMax());
//         return this;
//     }
// 
//     /**
//      * Retrieve n uniform samples from population without replacement
//      * @param sampleSize Number of samples to retrieve
//      * @param population The population size
//      * @return A list of integer samples
//      */
//     public List<Integer> sample(int sampleSize, int population) {
//         int t = 0, m =0;
//         List<Integer> samples = new ArrayList<>();
// 
//         while (m < sampleSize) {
//             double u = random().randDouble();
//             if ((population -t) * u >= sampleSize -m) {
//                 t++;
//             } else {
//                 samples.add(t);
//                 t++; m++;
//             }
//         }
//         return samples;
//     }
// 
//     @Override
//     public Integer gen() {
//         return random().randInt((max - min) + 1) + min;
//     }
// }


// Path: jrand-core/src/main/java/me/xdrop/jrand/generators/money/CVVGenerator.java
import me.xdrop.jrand.Generator;
import me.xdrop.jrand.annotation.Facade;
import me.xdrop.jrand.generators.basics.NaturalGenerator;

package me.xdrop.jrand.generators.money;


@Facade(accessor = "cvv")
public class CVVGenerator extends Generator<String> {
    protected NaturalGenerator nat;
    protected boolean amex;

    public CVVGenerator() {
        nat = new NaturalGenerator();
        amex = false;
    }

    /**
     * Return a 4-digit American Express CVV
     *
     * @param enable Set to true to enable this
     *               setting
     * @return The same generator
     */
    public CVVGenerator amex(boolean enable) {
        this.amex = enable;
        return this;
    }

    /**
     * Return a 4-digit American Express CVV
     *
     * @return The same generator
     */
    public CVVGenerator amex() {
        return amex(true);
    }

    @Override
    public String gen() {
        StringBuilder cvv = new StringBuilder(3);
        cvv.append(nat.range(1,9).gen());
        cvv.append(nat.range(0,9).gen());
        cvv.append(nat.range(0,9).gen());
        if (amex) {