// Path: src/main/java/com/shapesecurity/functional/data/HashCodeBuilder.java
// @CheckReturnValue
// public final class HashCodeBuilder {
//     //int is a 32 bit integer
//     private static final int INITIAL_VALUE = -2128831035;
//     private static final int MULT = 16777619;
//     private static final int NULL_SIGIL = -1150993239;
// 
//     public static int init() {
//         return INITIAL_VALUE;
//     }
// 
//     public static int put(int hash, @Nullable Object os) {
//         int p = os == null ? NULL_SIGIL : os.hashCode();
//         hash = hash * MULT ^ (p & 255);
//         p >>>= 8;
//         hash = hash * MULT ^ (p & 255);
//         p >>>= 8;
//         hash = hash * MULT ^ (p & 255);
//         p >>>= 8;
//         hash = hash * MULT ^ (p & 255);
//         return hash;
//     }
// 
//     public static int putChar(int hash, char p) {
//         hash = hash * MULT ^ (p & 255);
//         p >>>= 8;
//         hash = hash * MULT ^ (p & 255);
//         return hash;
//     }
// }


import com.shapesecurity.functional.data.HashCodeBuilder;
import javax.annotation.CheckReturnValue;
import javax.annotation.Nonnull;
        return new Tuple4<>(f.apply(this.a), this.b, this.c, this.d);
    }

    @Nonnull
    public <B1> Tuple4<A, B1, C, D> mapB(@Nonnull F<B, B1> f) {
        return new Tuple4<>(this.a, f.apply(this.b), this.c, this.d);
    }

    @Nonnull
    public <C1> Tuple4<A, B, C1, D> mapC(@Nonnull F<C, C1> f) {
        return new Tuple4<>(this.a, this.b, f.apply(this.c), this.d);
    }

    @Nonnull
    public <D1> Tuple4<A, B, C, D1> mapD(@Nonnull F<D, D1> f) {
        return new Tuple4<>(this.a, this.b, this.c, f.apply(this.d));
    }

    @SuppressWarnings("unchecked")
    @Override
    public boolean equals(Object obj) {
        return obj == this || obj instanceof Tuple4 &&
                ((Tuple4<A, B, C, D>) obj).a.equals(this.a) &&
                ((Tuple4<A, B, C, D>) obj).b.equals(this.b) &&
                ((Tuple4<A, B, C, D>) obj).c.equals(this.c) &&
                ((Tuple4<A, B, C, D>) obj).d.equals(this.d);
    }

    @Override
    public int hashCode() {
// Path: src/main/java/com/shapesecurity/functional/data/HashCodeBuilder.java
// @CheckReturnValue
// public final class HashCodeBuilder {
//     //int is a 32 bit integer
//     private static final int INITIAL_VALUE = -2128831035;
//     private static final int MULT = 16777619;
//     private static final int NULL_SIGIL = -1150993239;
// 
//     public static int init() {
//         return INITIAL_VALUE;
//     }
// 
//     public static int put(int hash, @Nullable Object os) {
//         int p = os == null ? NULL_SIGIL : os.hashCode();
//         hash = hash * MULT ^ (p & 255);
//         p >>>= 8;
//         hash = hash * MULT ^ (p & 255);
//         p >>>= 8;
//         hash = hash * MULT ^ (p & 255);
//         p >>>= 8;
//         hash = hash * MULT ^ (p & 255);
//         return hash;
//     }
// 
//     public static int putChar(int hash, char p) {
//         hash = hash * MULT ^ (p & 255);
//         p >>>= 8;
//         hash = hash * MULT ^ (p & 255);
//         return hash;
//     }
// }


// Path: src/main/java/com/shapesecurity/functional/Tuple4.java
import com.shapesecurity.functional.data.HashCodeBuilder;
import javax.annotation.CheckReturnValue;
import javax.annotation.Nonnull;

        return new Tuple4<>(f.apply(this.a), this.b, this.c, this.d);
    }

    @Nonnull
    public <B1> Tuple4<A, B1, C, D> mapB(@Nonnull F<B, B1> f) {
        return new Tuple4<>(this.a, f.apply(this.b), this.c, this.d);
    }

    @Nonnull
    public <C1> Tuple4<A, B, C1, D> mapC(@Nonnull F<C, C1> f) {
        return new Tuple4<>(this.a, this.b, f.apply(this.c), this.d);
    }

    @Nonnull
    public <D1> Tuple4<A, B, C, D1> mapD(@Nonnull F<D, D1> f) {
        return new Tuple4<>(this.a, this.b, this.c, f.apply(this.d));
    }

    @SuppressWarnings("unchecked")
    @Override
    public boolean equals(Object obj) {
        return obj == this || obj instanceof Tuple4 &&
                ((Tuple4<A, B, C, D>) obj).a.equals(this.a) &&
                ((Tuple4<A, B, C, D>) obj).b.equals(this.b) &&
                ((Tuple4<A, B, C, D>) obj).c.equals(this.c) &&
                ((Tuple4<A, B, C, D>) obj).d.equals(this.d);
    }

    @Override
    public int hashCode() {
        int hash = HashCodeBuilder.put(HashCodeBuilder.init(), "Tuple4");