// Path: src/main/java/de/galan/verjson/step/IncrementVersionStep.java
// public class IncrementVersionStep implements Step {
// 
// 	@Override
// 	public void process(JsonNode node) {
// 		Long version = MetaWrapper.getVersion(node);
// 		MetaWrapper.setVersion(node, version++);
// 	}
// 
// }
// 
// Path: src/main/java/de/galan/verjson/step/NoopStep.java
// public class NoopStep implements Step {
// 
// 	@Override
// 	public void process(JsonNode node) {
// 		// nothing
// 	}
// 
// }
// 
// Path: src/main/java/de/galan/verjson/step/Step.java
// public interface Step {
// 
// 	/** Perform action on wrapped root node */
// 	public void process(JsonNode node) throws ProcessStepException;
// 
// }
// 
// Path: src/main/java/de/galan/verjson/step/validation/Validation.java
// public class Validation implements Step {
// 
// 	protected final static String LS = StandardSystemProperty.LINE_SEPARATOR.value();
// 
// 	String description;
// 	JsonSchema schema; // thread-safe
// 	static JsonSchemaFactory factory; // cached
// 
// 
// 	public Validation(String schema) {
// 		this(schema, null);
// 	}
// 
// 
// 	public Validation(String schema, String description) {
// 		this.description = description;
// 		this.schema = create(schema);
// 	}
// 
// 
// 	public String getDescription() {
// 		return description;
// 	}
// 
// 
// 	protected String getDescriptionAppendable() {
// 		return isBlank(getDescription()) ? EMPTY : (" (" + getDescription() + ")");
// 	}
// 
// 
// 	protected static synchronized JsonSchemaFactory getFactory() {
// 		if (factory == null) {
// 			factory = JsonSchemaFactory.byDefault();
// 		}
// 		return factory;
// 	}
// 
// 
// 	protected JsonSchemaFactory getJsonSchemaFactory() {
// 		return getFactory();
// 	}
// 
// 
// 	@Override
// 	public void process(JsonNode node) throws ProcessStepException {
// 		validate(MetaWrapper.getData(node));
// 	}
// 
// 
// 	protected JsonSchema getSchema() {
// 		return schema;
// 	}
// 
// 
// 	public void validate(JsonNode node) throws InvalidJsonException {
// 		ProcessingReport report = null;
// 		try {
// 			report = getSchema().validate(node);
// 		}
// 		catch (Throwable ex) {
// 			throw new InvalidJsonException("Could not validate JSON against schema" + getDescriptionAppendable(), ex);
// 		}
// 		if (!report.isSuccess()) {
// 
// 			StringBuilder builder = new StringBuilder();
// 			builder.append("Could not validate JSON against schema");
// 			builder.append(getDescriptionAppendable());
// 			builder.append(":");
// 			builder.append(LS);
// 			List<ProcessingMessage> messages = Lists.newArrayList(report);
// 			for (int i = 0; i < messages.size(); i++) {
// 				builder.append("- ");
// 				builder.append(messages.get(i).getMessage());
// 				builder.append(i == (messages.size() - 1) ? EMPTY : LS);
// 			}
// 			throw new InvalidJsonException(builder.toString());
// 		}
// 	}
// 
// 
// 	public JsonSchema create(String schemaString) {
// 		JsonSchema jsonSchema = null;
// 		try {
// 			JsonNode schemaNode = JsonLoader.fromString(schemaString);
// 			if (!getJsonSchemaFactory().getSyntaxValidator().schemaIsValid(schemaNode)) {
// 				throw new InvalidSchemaException("JSON Schema is invalid" + getDescriptionAppendable());
// 			}
// 			jsonSchema = getJsonSchemaFactory().getJsonSchema(schemaNode);
// 		}
// 		catch (NullPointerException | IOException | ProcessingException ex) {
// 			throw new InvalidSchemaException("JSON Schema could not be loaded" + getDescriptionAppendable(), ex);
// 		}
// 		return jsonSchema;
// 	}
// 
// }


import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import de.galan.verjson.step.IncrementVersionStep;
import de.galan.verjson.step.NoopStep;
import de.galan.verjson.step.Step;
import de.galan.verjson.step.validation.Validation;
				result.put(++lastVersion, proxy);
			}
		}
		return result;
	}


	protected void assignSuccessors(List<ProxyStep> proxies) {
		ProxyStep precessor = null;
		for (ProxyStep step: Lists.reverse(proxies)) {
			if (precessor != null) {
				step.setSuccessor(precessor);
			}
			precessor = step;
		}
	}


	protected List<ProxyStep> createProxies(ListMultimap<Long, Step> steps) {
		List<ProxyStep> list = Lists.newArrayList();
		for (Long sourceVersion: steps.keySet()) {
			for (Step step: steps.get(sourceVersion)) {
				list.add(new ProxyStep(sourceVersion, step));
			}
		}
		return list;
	}


	protected List<ProxyStep> fillIncrements(List<ProxyStep> proxies) {
// Path: src/main/java/de/galan/verjson/step/IncrementVersionStep.java
// public class IncrementVersionStep implements Step {
// 
// 	@Override
// 	public void process(JsonNode node) {
// 		Long version = MetaWrapper.getVersion(node);
// 		MetaWrapper.setVersion(node, version++);
// 	}
// 
// }
// 
// Path: src/main/java/de/galan/verjson/step/NoopStep.java
// public class NoopStep implements Step {
// 
// 	@Override
// 	public void process(JsonNode node) {
// 		// nothing
// 	}
// 
// }
// 
// Path: src/main/java/de/galan/verjson/step/Step.java
// public interface Step {
// 
// 	/** Perform action on wrapped root node */
// 	public void process(JsonNode node) throws ProcessStepException;
// 
// }
// 
// Path: src/main/java/de/galan/verjson/step/validation/Validation.java
// public class Validation implements Step {
// 
// 	protected final static String LS = StandardSystemProperty.LINE_SEPARATOR.value();
// 
// 	String description;
// 	JsonSchema schema; // thread-safe
// 	static JsonSchemaFactory factory; // cached
// 
// 
// 	public Validation(String schema) {
// 		this(schema, null);
// 	}
// 
// 
// 	public Validation(String schema, String description) {
// 		this.description = description;
// 		this.schema = create(schema);
// 	}
// 
// 
// 	public String getDescription() {
// 		return description;
// 	}
// 
// 
// 	protected String getDescriptionAppendable() {
// 		return isBlank(getDescription()) ? EMPTY : (" (" + getDescription() + ")");
// 	}
// 
// 
// 	protected static synchronized JsonSchemaFactory getFactory() {
// 		if (factory == null) {
// 			factory = JsonSchemaFactory.byDefault();
// 		}
// 		return factory;
// 	}
// 
// 
// 	protected JsonSchemaFactory getJsonSchemaFactory() {
// 		return getFactory();
// 	}
// 
// 
// 	@Override
// 	public void process(JsonNode node) throws ProcessStepException {
// 		validate(MetaWrapper.getData(node));
// 	}
// 
// 
// 	protected JsonSchema getSchema() {
// 		return schema;
// 	}
// 
// 
// 	public void validate(JsonNode node) throws InvalidJsonException {
// 		ProcessingReport report = null;
// 		try {
// 			report = getSchema().validate(node);
// 		}
// 		catch (Throwable ex) {
// 			throw new InvalidJsonException("Could not validate JSON against schema" + getDescriptionAppendable(), ex);
// 		}
// 		if (!report.isSuccess()) {
// 
// 			StringBuilder builder = new StringBuilder();
// 			builder.append("Could not validate JSON against schema");
// 			builder.append(getDescriptionAppendable());
// 			builder.append(":");
// 			builder.append(LS);
// 			List<ProcessingMessage> messages = Lists.newArrayList(report);
// 			for (int i = 0; i < messages.size(); i++) {
// 				builder.append("- ");
// 				builder.append(messages.get(i).getMessage());
// 				builder.append(i == (messages.size() - 1) ? EMPTY : LS);
// 			}
// 			throw new InvalidJsonException(builder.toString());
// 		}
// 	}
// 
// 
// 	public JsonSchema create(String schemaString) {
// 		JsonSchema jsonSchema = null;
// 		try {
// 			JsonNode schemaNode = JsonLoader.fromString(schemaString);
// 			if (!getJsonSchemaFactory().getSyntaxValidator().schemaIsValid(schemaNode)) {
// 				throw new InvalidSchemaException("JSON Schema is invalid" + getDescriptionAppendable());
// 			}
// 			jsonSchema = getJsonSchemaFactory().getJsonSchema(schemaNode);
// 		}
// 		catch (NullPointerException | IOException | ProcessingException ex) {
// 			throw new InvalidSchemaException("JSON Schema could not be loaded" + getDescriptionAppendable(), ex);
// 		}
// 		return jsonSchema;
// 	}
// 
// }


// Path: src/main/java/de/galan/verjson/core/DefaultStepSequencer.java
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import de.galan.verjson.step.IncrementVersionStep;
import de.galan.verjson.step.NoopStep;
import de.galan.verjson.step.Step;
import de.galan.verjson.step.validation.Validation;

				result.put(++lastVersion, proxy);
			}
		}
		return result;
	}


	protected void assignSuccessors(List<ProxyStep> proxies) {
		ProxyStep precessor = null;
		for (ProxyStep step: Lists.reverse(proxies)) {
			if (precessor != null) {
				step.setSuccessor(precessor);
			}
			precessor = step;
		}
	}


	protected List<ProxyStep> createProxies(ListMultimap<Long, Step> steps) {
		List<ProxyStep> list = Lists.newArrayList();
		for (Long sourceVersion: steps.keySet()) {
			for (Step step: steps.get(sourceVersion)) {
				list.add(new ProxyStep(sourceVersion, step));
			}
		}
		return list;
	}


	protected List<ProxyStep> fillIncrements(List<ProxyStep> proxies) {
		List<ProxyStep> result = Lists.newArrayList();