// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static byte[] getBytes(byte[] buffer, int offset) {
// 	byte[] b = new byte[buffer.length - offset];
// 	System.arraycopy(buffer, offset, b, 0, buffer.length - offset);
// 	return b;
// }
// 
// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static int getInt(byte[] buffer, int offset, int length) {
// 	return getInt(getBytes(buffer, offset, length));
// }
// 
// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static String getString(byte[] buffer, int offset, int length) {
// 	return getString(getBytes(buffer, offset, length));
// }
// 
// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static void writeInt(int data, int length, OutputStream out) throws IOException {
// 	out.write(getBytes(data, new byte[length]), 0, length);
// }
// 
// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static void writeString(String data, int length, OutputStream out) throws IOException {
// 	byte[] s = getBytes(data);
// 	byte[] b = new byte[length];
// 	System.arraycopy(s, 0, b, 0, s.length);
// 	out.write(b, 0, length);
// }


import static org.apache.commons.lang3.BooleanUtils.negate;
import static org.rr.mobi4java.ByteUtils.getBytes;
import static org.rr.mobi4java.ByteUtils.getInt;
import static org.rr.mobi4java.ByteUtils.getString;
import static org.rr.mobi4java.ByteUtils.writeInt;
import static org.rr.mobi4java.ByteUtils.writeString;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.output.TeeOutputStream;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
	private List<MobiContentTagEntry> tags;

	MobiContentTagx(byte[] content) throws IOException {
		super(content, CONTENT_TYPE.TAGX);
		readMobiTagx();
	}

	private void readMobiTagx() throws IOException {
		String identifier = getString(content, 0, 4);
		if (negate(StringUtils.equals(identifier, IDENTIFIER))) {
			throw new IOException("Expected to find TAGX header identifier TAGX but got '" + identifier + "' instead");
		}
		headerLength = getInt(content, 4, 4);
		controlByteCount = getInt(content, 8, 4);
		int tagCount = (headerLength - 12) / 4;
		tagTable = getBytes(content, 12, headerLength - 12);
		
		tags = new ArrayList<>(tagCount);
		for (int i = 0; i < tagCount; i++) {
			MobiContentTagEntry mobiContentTag = new MobiContentTagEntry(getBytes(content, 12 + (4 * i), 4));
			tags.add(mobiContentTag);
		}
	}
	
	@Override
	byte[] writeContent(OutputStream out) throws IOException {
		ByteArrayOutputStream branch = new ByteArrayOutputStream();
		TeeOutputStream tee = new TeeOutputStream(out, branch);
		writeString(IDENTIFIER, 4, tee);
		writeInt(headerLength, 4, tee);
// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static byte[] getBytes(byte[] buffer, int offset) {
// 	byte[] b = new byte[buffer.length - offset];
// 	System.arraycopy(buffer, offset, b, 0, buffer.length - offset);
// 	return b;
// }
// 
// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static int getInt(byte[] buffer, int offset, int length) {
// 	return getInt(getBytes(buffer, offset, length));
// }
// 
// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static String getString(byte[] buffer, int offset, int length) {
// 	return getString(getBytes(buffer, offset, length));
// }
// 
// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static void writeInt(int data, int length, OutputStream out) throws IOException {
// 	out.write(getBytes(data, new byte[length]), 0, length);
// }
// 
// Path: src/main/java/org/rr/mobi4java/ByteUtils.java
// public static void writeString(String data, int length, OutputStream out) throws IOException {
// 	byte[] s = getBytes(data);
// 	byte[] b = new byte[length];
// 	System.arraycopy(s, 0, b, 0, s.length);
// 	out.write(b, 0, length);
// }


// Path: src/main/java/org/rr/mobi4java/MobiContentTagx.java
import static org.apache.commons.lang3.BooleanUtils.negate;
import static org.rr.mobi4java.ByteUtils.getBytes;
import static org.rr.mobi4java.ByteUtils.getInt;
import static org.rr.mobi4java.ByteUtils.getString;
import static org.rr.mobi4java.ByteUtils.writeInt;
import static org.rr.mobi4java.ByteUtils.writeString;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.output.TeeOutputStream;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;

	private List<MobiContentTagEntry> tags;

	MobiContentTagx(byte[] content) throws IOException {
		super(content, CONTENT_TYPE.TAGX);
		readMobiTagx();
	}

	private void readMobiTagx() throws IOException {
		String identifier = getString(content, 0, 4);
		if (negate(StringUtils.equals(identifier, IDENTIFIER))) {
			throw new IOException("Expected to find TAGX header identifier TAGX but got '" + identifier + "' instead");
		}
		headerLength = getInt(content, 4, 4);
		controlByteCount = getInt(content, 8, 4);
		int tagCount = (headerLength - 12) / 4;
		tagTable = getBytes(content, 12, headerLength - 12);
		
		tags = new ArrayList<>(tagCount);
		for (int i = 0; i < tagCount; i++) {
			MobiContentTagEntry mobiContentTag = new MobiContentTagEntry(getBytes(content, 12 + (4 * i), 4));
			tags.add(mobiContentTag);
		}
	}
	
	@Override
	byte[] writeContent(OutputStream out) throws IOException {
		ByteArrayOutputStream branch = new ByteArrayOutputStream();
		TeeOutputStream tee = new TeeOutputStream(out, branch);
		writeString(IDENTIFIER, 4, tee);
		writeInt(headerLength, 4, tee);
		writeInt(controlByteCount, 4, tee);