class RLP {

	public static byte[] encode(Object input) {
		Value val = new Value(input);
		if (val.isList()) {
			List<Object> inputArray = val.asList();
			if (inputArray.size() == 0) {
				return encodeLength(inputArray.size(), OFFSET_SHORT_LIST);
			}
			byte[] output = ByteUtil.EMPTY_BYTE_ARRAY;
			for (Object object : inputArray) {
				output = concatenate(output, encode(object));
			}
			byte[] prefix = encodeLength(output.length, OFFSET_SHORT_LIST);
            return concatenate(prefix, output);
		} else {
			byte[] inputAsBytes = toBytes(input); 
			if (inputAsBytes.length == 1) {
				return inputAsBytes;
			} else {
				byte[] firstByte = encodeLength(inputAsBytes.length, OFFSET_SHORT_ITEM);				
				return concatenate(firstByte, inputAsBytes);
			}
		} 
	}

}