// Path: FlowTwist/src/flow/twist/trackable/Taint.java
// public class Taint extends Trackable {
// 
// 	public final Value value;
// 	public final Type type;
// 
// 	public Taint(Unit sourceUnit, Trackable predecessor, Value value, Type type) {
// 		super(sourceUnit, predecessor);
// 
// 		if (value instanceof Constant) {
// 			throw new IllegalArgumentException("Constant value has been tainted.");
// 		}
// 
// 		this.value = value;
// 		this.type = type;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (!super.equals(obj))
// 			return false;
// 		if (!(obj instanceof Taint))
// 			return false;
// 		Taint other = (Taint) obj;
// 		if (type == null) {
// 			if (other.type != null)
// 				return false;
// 		} else if (!type.equals(other.type))
// 			return false;
// 		if (value == null) {
// 			if (other.value != null)
// 				return false;
// 		} else if (!value.equals(other.value))
// 			return false;
// 		return true;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = super.hashCode();
// 		result = prime * result + ((type == null) ? 0 : type.hashCode());
// 		result = prime * result + ((value == null) ? 0 : value.hashCode());
// 		return result;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "[Taint" + payloadString() + ": " + value + " Type: " + type + "]";
// 		// return "[Taint: " + value + "; " + System.identityHashCode(this) +
// 		// "; " + System.identityHashCode(value) + "; " + hashCode() + "]";
// 	}
// 
// 	public Taint createAlias(Value value, Unit sourceUnit) {
// 		return new Taint(sourceUnit, this, value, type);
// 	}
// 
// 	@Override
// 	public Trackable createAlias(Unit sourceUnit) {
// 		return new Taint(sourceUnit, this, value, type);
// 	}
// 
// 	@Override
// 	public Taint cloneWithoutNeighborsAndPayload() {
// 		return new Taint(sourceUnit, predecessor, value, type);
// 	}
// 
// }
// 
// Path: FlowTwist/src/flow/twist/trackable/Trackable.java
// public abstract class Trackable implements LinkedNode<Trackable> {
// 
// 	public final Trackable predecessor;
// 	public final Unit sourceUnit;
// 	private final List<Trackable> neighbors;
// 	private final Set<Object> payload;
// 
// 	protected Trackable() {
// 		this.predecessor = null;
// 		this.sourceUnit = null;
// 		payload = Sets.newHashSet();
// 		neighbors = Lists.newLinkedList();
// 	}
// 
// 	public Trackable(Unit sourceUnit, Trackable predecessor) {
// 		this.predecessor = predecessor;
// 		this.sourceUnit = sourceUnit;
// 		payload = Sets.newHashSet();
// 		neighbors = Lists.newLinkedList();
// 		payload.addAll(predecessor.payload);
// 	}
// 
// 	public void addPayload(Object payload) {
// 		this.payload.add(payload);
// 	}
// 
// 	public void addNeighbor(Trackable trackable) {
// 		// trackable.neighbors.addAll(getSelfAndNeighbors());
// 		neighbors.add(trackable);
// 	}
// 
// 	public Collection<Trackable> getSelfAndNeighbors() {
// 		LinkedList<Trackable> result = Lists.newLinkedList(neighbors);
// 		result.add(this);
// 		return result;
// 	}
// 
// 	public boolean hasSelfOrNeighborAnPredecessor() {
// 		for (Trackable t : getSelfAndNeighbors())
// 			if (t.predecessor != null)
// 				return true;
// 		return false;
// 	}
// 
// 	public abstract Trackable cloneWithoutNeighborsAndPayload();
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((payload == null) ? 0 : payload.hashCode());
// 		return result;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (!(obj instanceof Trackable))
// 			return false;
// 		Trackable other = (Trackable) obj;
// 		if (payload == null) {
// 			if (other.payload != null)
// 				return false;
// 		} else if (!payload.equals(other.payload))
// 			return false;
// 		return true;
// 	}
// 
// 	public String payloadString() {
// 		if (payload.size() == 0)
// 			return "";
// 		return "(" + Joiner.on(",").join(payload) + ")";
// 	}
// 
// 	public abstract Trackable createAlias(Unit sourceUnits);
// 
// 	public Collection<Object> getPayload() {
// 		return payload;
// 	}
// }


import flow.twist.trackable.Taint;
import flow.twist.trackable.Trackable;
						return true;
					}
	
				}
				return false;
			}
	
			@Override
			public String toString() {
				return ".*" + name + ".*";
			}
		};
	}

	public static TrackableSelector taint(final String name) {
		return new TrackableSelector() {
	
			@Override
			public boolean matches(Trackable trackable) {
				if (trackable instanceof Taint) {
					String taintString = ((Taint) trackable).value.toString();
					if (taintString.equals(name)) {
						return true;
					}
				}
				return false;
			}
	
			@Override
			public String toString() {
// Path: FlowTwist/src/flow/twist/trackable/Taint.java
// public class Taint extends Trackable {
// 
// 	public final Value value;
// 	public final Type type;
// 
// 	public Taint(Unit sourceUnit, Trackable predecessor, Value value, Type type) {
// 		super(sourceUnit, predecessor);
// 
// 		if (value instanceof Constant) {
// 			throw new IllegalArgumentException("Constant value has been tainted.");
// 		}
// 
// 		this.value = value;
// 		this.type = type;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (!super.equals(obj))
// 			return false;
// 		if (!(obj instanceof Taint))
// 			return false;
// 		Taint other = (Taint) obj;
// 		if (type == null) {
// 			if (other.type != null)
// 				return false;
// 		} else if (!type.equals(other.type))
// 			return false;
// 		if (value == null) {
// 			if (other.value != null)
// 				return false;
// 		} else if (!value.equals(other.value))
// 			return false;
// 		return true;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = super.hashCode();
// 		result = prime * result + ((type == null) ? 0 : type.hashCode());
// 		result = prime * result + ((value == null) ? 0 : value.hashCode());
// 		return result;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "[Taint" + payloadString() + ": " + value + " Type: " + type + "]";
// 		// return "[Taint: " + value + "; " + System.identityHashCode(this) +
// 		// "; " + System.identityHashCode(value) + "; " + hashCode() + "]";
// 	}
// 
// 	public Taint createAlias(Value value, Unit sourceUnit) {
// 		return new Taint(sourceUnit, this, value, type);
// 	}
// 
// 	@Override
// 	public Trackable createAlias(Unit sourceUnit) {
// 		return new Taint(sourceUnit, this, value, type);
// 	}
// 
// 	@Override
// 	public Taint cloneWithoutNeighborsAndPayload() {
// 		return new Taint(sourceUnit, predecessor, value, type);
// 	}
// 
// }
// 
// Path: FlowTwist/src/flow/twist/trackable/Trackable.java
// public abstract class Trackable implements LinkedNode<Trackable> {
// 
// 	public final Trackable predecessor;
// 	public final Unit sourceUnit;
// 	private final List<Trackable> neighbors;
// 	private final Set<Object> payload;
// 
// 	protected Trackable() {
// 		this.predecessor = null;
// 		this.sourceUnit = null;
// 		payload = Sets.newHashSet();
// 		neighbors = Lists.newLinkedList();
// 	}
// 
// 	public Trackable(Unit sourceUnit, Trackable predecessor) {
// 		this.predecessor = predecessor;
// 		this.sourceUnit = sourceUnit;
// 		payload = Sets.newHashSet();
// 		neighbors = Lists.newLinkedList();
// 		payload.addAll(predecessor.payload);
// 	}
// 
// 	public void addPayload(Object payload) {
// 		this.payload.add(payload);
// 	}
// 
// 	public void addNeighbor(Trackable trackable) {
// 		// trackable.neighbors.addAll(getSelfAndNeighbors());
// 		neighbors.add(trackable);
// 	}
// 
// 	public Collection<Trackable> getSelfAndNeighbors() {
// 		LinkedList<Trackable> result = Lists.newLinkedList(neighbors);
// 		result.add(this);
// 		return result;
// 	}
// 
// 	public boolean hasSelfOrNeighborAnPredecessor() {
// 		for (Trackable t : getSelfAndNeighbors())
// 			if (t.predecessor != null)
// 				return true;
// 		return false;
// 	}
// 
// 	public abstract Trackable cloneWithoutNeighborsAndPayload();
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((payload == null) ? 0 : payload.hashCode());
// 		return result;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (!(obj instanceof Trackable))
// 			return false;
// 		Trackable other = (Trackable) obj;
// 		if (payload == null) {
// 			if (other.payload != null)
// 				return false;
// 		} else if (!payload.equals(other.payload))
// 			return false;
// 		return true;
// 	}
// 
// 	public String payloadString() {
// 		if (payload.size() == 0)
// 			return "";
// 		return "(" + Joiner.on(",").join(payload) + ")";
// 	}
// 
// 	public abstract Trackable createAlias(Unit sourceUnits);
// 
// 	public Collection<Object> getPayload() {
// 		return payload;
// 	}
// }


// Path: FlowTwist/test/flow/twist/test/util/selectors/TrackableSelectorFactory.java
import flow.twist.trackable.Taint;
import flow.twist.trackable.Trackable;

						return true;
					}
	
				}
				return false;
			}
	
			@Override
			public String toString() {
				return ".*" + name + ".*";
			}
		};
	}

	public static TrackableSelector taint(final String name) {
		return new TrackableSelector() {
	
			@Override
			public boolean matches(Trackable trackable) {
				if (trackable instanceof Taint) {
					String taintString = ((Taint) trackable).value.toString();
					if (taintString.equals(name)) {
						return true;
					}
				}
				return false;
			}
	
			@Override
			public String toString() {
				return name;