client/src/main/java/com/github/heuermh/personalgenome/client/Ancestry.java
@Immutable
public final class Ancestry {
    private final String profileId;
    private final String label;
    private final double proportion;
    private final double unassigned;
    private final List<Ancestry> subPopulations;

    public Ancestry(final String profileId, final String label, final double proportion, final double unassigned, final List<Ancestry> subPopulations)
    {
        checkNotNull(profileId);
        checkNotNull(label);
        checkNotNull(subPopulations);
        this.profileId = profileId;
        this.label = label;
        this.proportion = proportion;
        this.unassigned = unassigned;
        this.subPopulations = ImmutableList.copyOf(subPopulations);
    }

    public String getProfileId() {
        return profileId;
    }

    public String getLabel() {
        return label;
    }

    public double getProportion() {
        return proportion;
    }

    public double getUnassigned() {
        return unassigned;
    }

    public List<Ancestry> getSubPopulations() {
        return subPopulations;
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/UserName.java
@Immutable
public final class UserName {
    private final String id;
    private final String firstName;
    private final String lastName;
    private final List<ProfileName> profileNames;

    public UserName(final String id, final String firstName, final String lastName, final List<ProfileName> profileNames) {
        checkNotNull(id);
        checkNotNull(firstName);
        checkNotNull(lastName);
        checkNotNull(profileNames);
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.profileNames = ImmutableList.copyOf(profileNames);
    }

    public String getId() {
        return id;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public List<ProfileName> getProfileNames() {
        return profileNames;
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/PersonalGenomeClientException.java
public class PersonalGenomeClientException extends RuntimeException {

    /**
     * Create a new personal genome client exception with the specified error description.
     *
     * @param description error description
     */
    public PersonalGenomeClientException(final String description) {
        super(description);
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/Haplogroup.java
@Immutable
public final class Haplogroup {
    private final String profileId;
    private final String paternal; // may be null
    private final String maternal;
    private final List<PaternalTerminalSnp> paternalTerminalSnps; // may be null
    private final List<MaternalTerminalSnp> maternalTerminalSnps;

    public Haplogroup(final String profileId,
                      final String paternal,
                      final String maternal,
                      final List<PaternalTerminalSnp> paternalTerminalSnps,
                      final List<MaternalTerminalSnp> maternalTerminalSnps) {
        checkNotNull(profileId);
        checkNotNull(maternal);
        checkNotNull(maternalTerminalSnps);
        this.profileId = profileId;
        this.paternal = paternal;
        this.maternal = maternal;
        this.paternalTerminalSnps = paternalTerminalSnps == null ? null : ImmutableList.copyOf(paternalTerminalSnps);
        this.maternalTerminalSnps = ImmutableList.copyOf(maternalTerminalSnps);
    }

    public String getProfileId() {
        return profileId;
    }

    public String getPaternal() {
        return paternal;
    }

    public String getMaternal() {
        return maternal;
    }

    public List<PaternalTerminalSnp> getPaternalTerminalSnps() {
        return paternalTerminalSnps;
    }

    public List<MaternalTerminalSnp> getMaternalTerminalSnps() {
        return maternalTerminalSnps;
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/DrugResponse.java
@Immutable
public final class DrugResponse {
    private final String profileId;
    private final String reportId;
    private final String description;
    private final String status;

    public DrugResponse(final String profileId, final String reportId, final String description, final String status) {
        checkNotNull(profileId);
        checkNotNull(reportId);
        checkNotNull(description);
        checkNotNull(status);
        this.profileId = profileId;
        this.reportId = reportId;
        this.description = description;
        this.status = status;
    }

    public String getProfileId() {
        return profileId;
    }

    public String getReportId() {
        return reportId;
    }

    public String getDescription() {
        return description;
    }

    public String getStatus() {
        return status;
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/Trait.java
@Immutable
public final class Trait {
    private final String profileId;
    private final String reportId;
    private final String description;

    // todo:  trait is a value in possible_traits, or null if the profile's not analyzed at those markers
    private final String trait;

    private final Set<String> possibleTraits;

    public Trait(final String profileId, final String reportId, final String description, final String trait, final Set<String> possibleTraits) {
        checkNotNull(profileId);
        checkNotNull(reportId);
        checkNotNull(description);
        checkNotNull(trait);
        checkNotNull(possibleTraits);
        if (!possibleTraits.contains(trait)) {
            throw new IllegalArgumentException("trait must be contained in possible traits");
        }
        this.profileId = profileId;
        this.reportId = reportId;
        this.description = description;
        this.trait = trait;
        this.possibleTraits = ImmutableSet.copyOf(possibleTraits);
    }

    public String getProfileId() {
        return profileId;
    }

    public String getReportId() {
        return reportId;
    }

    public String getDescription() {
        return description;
    }

    public String getTrait() {
        return trait;
    }

    public Set<String> getPossibleTraits() {
        return possibleTraits;
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/User.java
@Immutable
public final class User {
    private final String id;
    private final List<Profile> profiles;

    public User(final String id, final List<Profile> profiles) {
        checkNotNull(id);
        checkNotNull(profiles);
        this.id = id;
        this.profiles = ImmutableList.copyOf(profiles);
    }

    public String getId() {
        return id;
    }

    public List<Profile> getProfiles() {
        return profiles;
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/Genotype.java
@Immutable
public final class Genotype {
    private final String profileId;
    private final Map<String, String> values;

    public Genotype(final String profileId, final Map<String, String> values) {
        checkNotNull(profileId);
        checkNotNull(values);
        this.profileId = profileId;
        this.values = ImmutableMap.copyOf(values);
    }

    public String getProfileId() {
        return profileId;
    }

    public Map<String, String> getValues() {
        return values;
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/Carrier.java
@Immutable
public final class Carrier {
    private final String profileId;
    private final String reportId;
    private final String description;
    private final int mutations;

    public Carrier(final String profileId, final String reportId, final String description, final int mutations) {
        checkNotNull(profileId);
        checkNotNull(reportId);
        checkNotNull(description);
        this.profileId = profileId;
        this.reportId = reportId;
        this.description = description;
        this.mutations = mutations;
    }

    public String getProfileId() {
        return profileId;
    }

    public String getReportId() {
        return reportId;
    }

    public String getDescription() {
        return description;
    }

    public int getMutations() {
        return mutations;
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/Risk.java
@Immutable
public final class Risk {
    private final String profileId;
    private final String reportId;
    private final String description;
    private final double risk;
    private final double populationRisk;

    public Risk(final String profileId, final String reportId, final String description, final double risk, final double populationRisk) {
        checkNotNull(profileId);
        checkNotNull(reportId);
        checkNotNull(description);
        this.profileId = profileId;
        this.reportId = reportId;
        this.description = description;
        this.risk = risk;
        this.populationRisk = populationRisk;
    }

    public String getProfileId() {
        return profileId;
    }

    public String getReportId() {
        return reportId;
    }

    public String getDescription() {
        return description;
    }

    public double getRisk() {
        return risk;
    }

    public double getPopulationRisk() {
        return populationRisk;
    }
}
client/src/main/java/com/github/heuermh/personalgenome/client/Genome.java
@Immutable
public final class Genome {
    private final String profileId;
    private final String values;

    public Genome(final String profileId, final String values) {
        checkNotNull(profileId);
        checkNotNull(values);
        this.profileId = profileId;
        this.values = values;
    }

    public String getProfileId() {
        return profileId;
    }

    public String getValues() {
        return values;
    }

    public Genotype asGenotype() {
        return asGenotype(Locations.locations());
    }

    public Genotype asGenotype(final String... locations) {
        checkNotNull(locations);
        Map<String, String> genotypeValues = new HashMap<String, String>(locations.length);
        for (String location : locations) {
            checkNotNull(location);
            int index = Locations.index(location);
            if (index >= 0 && index < values.length() - 1) {
                genotypeValues.put(location, values.substring(index, index + 2));
            }
        }
        return new Genotype(profileId, genotypeValues);
    }

    public Genotype asGenotype(final Iterable<String> locations) {
        checkNotNull(locations);
        Map<String, String> genotypeValues = new HashMap<String, String>();
        for (String location : locations) {
            checkNotNull(location);
            int index = Locations.index(location);
            if (index >= 0 && index < values.length() - 1) {
                genotypeValues.put(location, values.substring(index, index + 2));
            }
        }
        return new Genotype(profileId, genotypeValues);
    }
}


Question: import com.github.heuermh.personalgenome.client.Genome;
import com.github.heuermh.personalgenome.client.Genotype;
import com.github.heuermh.personalgenome.client.Haplogroup;
import com.github.heuermh.personalgenome.client.PersonalGenomeClientException;
import com.github.heuermh.personalgenome.client.Relative;
import com.github.heuermh.personalgenome.client.Risk;
import com.github.heuermh.personalgenome.client.Trait;
import com.github.heuermh.personalgenome.client.User;
import com.github.heuermh.personalgenome.client.UserName;
import java.io.InputStream;
import java.util.List;
import com.github.heuermh.personalgenome.client.Ancestry;
import com.github.heuermh.personalgenome.client.Carrier;
import com.github.heuermh.personalgenome.client.DrugResponse;
/*

    personal-genome-client  Java client for the 23andMe Personal Genome API.
    Copyright (c) 2012-2013 held jointly by the individual authors.

    This library is free software; you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as published
    by the Free Software Foundation; either version 3 of the License, or (at
    your option) any later version.

    This library is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
    License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this library;  if not, write to the Free Software Foundation,
    Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA.

    > http://www.fsf.org/licensing/licenses/lgpl.html
    > http://www.opensource.org/licenses/lgpl-license.php

*/
package com.github.heuermh.personalgenome.client;




/**
 * Converter.
 */
public interface PersonalGenomeConverter {

    /**
     * Parse the specified input stream and return a personal genome client exception.
     *
     * @param inputStream input stream, must not be null
     * @return the specified input stream parsed into a personal genome client exception
     */
    PersonalGenomeClientException parseException(InputStream inputStream);

    /**
     * Parse the specified input stream and return a user.
     *
     * @param inputStream input stream, must not be null
     * @return the specified input stream parsed into a user
     */
    User parseUser(InputStream inputStream);

    /**
     * Parse the specified input stream and return user names.
     *
     * @param inputStream input stream, must not be null
     * @return the specified input stream parsed into user names
     */
Answer:     UserName parseNames(InputStream inputStream);