// Path: src/main/java/jasm/io/BinaryInputStream.java
// public class BinaryInputStream extends InputStream {
// 	protected InputStream input;
// 	protected int value;
// 	protected int count;
// 
// 	public BinaryInputStream(InputStream input) {
// 		this.input = input;
// 	}
// 	
// 	public int read() throws IOException {
// 		if(count == 0) {
// 			return input.read();
// 		} else {
// 			return read_un(8);
// 		}
// 	}
// 	
// 	public int read(byte[] bytes) throws IOException {
// 		for (int i = 0; i != bytes.length; ++i) {
// 			bytes[i] = (byte) read();
// 		}
// 		return bytes.length;
// 	}
// 	
// 	public int read(byte[] bytes, int offset, int length) throws IOException {
// 		for(;offset < length;++offset) {
// 			bytes[offset] = (byte) read();			
// 		}
// 		return length;
// 	}
// 	
// 	public int read_u8() throws IOException {
// 		if(count == 0) {
// 			return input.read() & 0xFF;
// 		} else {
// 			return read_un(8);
// 		}
// 	}	
// 	
// 	public int read_u16() throws IOException {
// 		return (read_u8() << 8) | read_u8();
// 	}
// 		
// 	public long read_u32() throws IOException {
// 		// FIXME: this is most definitely broken
// 		return (read_u8() << 24) | (read_u8() << 16) | (read_u8() << 8)
// 				| read_u8();
// 	}
// 	
// 	public int read_un(int n) throws IOException {		
// 		int value = 0;
// 		int mask = 1;
// 		for(int i=0;i!=n;++i) {
// 			if(read_bit()) {
// 				value |= mask;
// 			}
// 			mask = mask << 1;			
// 		}
// 		return value;		
// 	}
// 	
// 	public int read_uv() throws IOException {
// 		int value = 0;
// 		boolean flag = true;
// 		int shift = 0;
// 		while(flag) {
// 			int w = read_un(4);
// 			flag = (w&8) != 0;
// 			value = ((w&7)<<shift) | value;
// 			shift = shift + 3;			
// 		}
// 		return value;
// 	}
// 	
// 	public boolean read_bit() throws IOException {
// 		if(count == 0) {
// 			value = input.read();
// 			if(value < 0) { throw new EOFException(); }
// 			count = 8;
// 		}
// 		boolean r = (value&1) != 0;
// 		value = value >> 1;
// 		count = count - 1;
// 		return r;
// 	}
// 	
// 	public void pad_u8() throws IOException {		
// 		count = 0; // easy!!
// 	}
// }


import java.io.*;
import java.util.*;
import jasm.attributes.*;
import jasm.io.BinaryInputStream;
import jasm.lang.*;
import jasm.util.*;
			int len = read_i4(index + 2);
			r.add(parseAttribute(index, enclosingMethod, enclosingClass));
			index += len + 6;
		}
		return r;
	}
	
	protected BytecodeAttribute parseAttribute(int offset,
			ClassFile.Method enclosingMethod, ClassFile enclosingClass) {
		String name = getString(read_u2(offset));		
		if (name.equals("Code")) {
			return parseCode(offset, name, enclosingMethod);
		} else if (name.equals("Exceptions")) {
			return parseExceptions(offset, name);
		} else if (name.equals("InnerClasses")) {
			return parseInnerClasses(offset, name, enclosingClass.type());
		} else if (name.equals("ConstantValue")) {
			return parseConstantValue(offset, name);
		}

		int len = read_i4(offset + 2) + 6;
		byte[] bs = new byte[len];
		for (int i = 0; i != len; ++i) {
			bs[i] = bytes[offset + i];
		}

		BytecodeAttribute.Reader reader = attributeReaders.get(name);

		if (reader != null) {
			try {
// Path: src/main/java/jasm/io/BinaryInputStream.java
// public class BinaryInputStream extends InputStream {
// 	protected InputStream input;
// 	protected int value;
// 	protected int count;
// 
// 	public BinaryInputStream(InputStream input) {
// 		this.input = input;
// 	}
// 	
// 	public int read() throws IOException {
// 		if(count == 0) {
// 			return input.read();
// 		} else {
// 			return read_un(8);
// 		}
// 	}
// 	
// 	public int read(byte[] bytes) throws IOException {
// 		for (int i = 0; i != bytes.length; ++i) {
// 			bytes[i] = (byte) read();
// 		}
// 		return bytes.length;
// 	}
// 	
// 	public int read(byte[] bytes, int offset, int length) throws IOException {
// 		for(;offset < length;++offset) {
// 			bytes[offset] = (byte) read();			
// 		}
// 		return length;
// 	}
// 	
// 	public int read_u8() throws IOException {
// 		if(count == 0) {
// 			return input.read() & 0xFF;
// 		} else {
// 			return read_un(8);
// 		}
// 	}	
// 	
// 	public int read_u16() throws IOException {
// 		return (read_u8() << 8) | read_u8();
// 	}
// 		
// 	public long read_u32() throws IOException {
// 		// FIXME: this is most definitely broken
// 		return (read_u8() << 24) | (read_u8() << 16) | (read_u8() << 8)
// 				| read_u8();
// 	}
// 	
// 	public int read_un(int n) throws IOException {		
// 		int value = 0;
// 		int mask = 1;
// 		for(int i=0;i!=n;++i) {
// 			if(read_bit()) {
// 				value |= mask;
// 			}
// 			mask = mask << 1;			
// 		}
// 		return value;		
// 	}
// 	
// 	public int read_uv() throws IOException {
// 		int value = 0;
// 		boolean flag = true;
// 		int shift = 0;
// 		while(flag) {
// 			int w = read_un(4);
// 			flag = (w&8) != 0;
// 			value = ((w&7)<<shift) | value;
// 			shift = shift + 3;			
// 		}
// 		return value;
// 	}
// 	
// 	public boolean read_bit() throws IOException {
// 		if(count == 0) {
// 			value = input.read();
// 			if(value < 0) { throw new EOFException(); }
// 			count = 8;
// 		}
// 		boolean r = (value&1) != 0;
// 		value = value >> 1;
// 		count = count - 1;
// 		return r;
// 	}
// 	
// 	public void pad_u8() throws IOException {		
// 		count = 0; // easy!!
// 	}
// }


// Path: src/main/java/jasm/io/ClassFileReader.java
import java.io.*;
import java.util.*;
import jasm.attributes.*;
import jasm.io.BinaryInputStream;
import jasm.lang.*;
import jasm.util.*;

			int len = read_i4(index + 2);
			r.add(parseAttribute(index, enclosingMethod, enclosingClass));
			index += len + 6;
		}
		return r;
	}
	
	protected BytecodeAttribute parseAttribute(int offset,
			ClassFile.Method enclosingMethod, ClassFile enclosingClass) {
		String name = getString(read_u2(offset));		
		if (name.equals("Code")) {
			return parseCode(offset, name, enclosingMethod);
		} else if (name.equals("Exceptions")) {
			return parseExceptions(offset, name);
		} else if (name.equals("InnerClasses")) {
			return parseInnerClasses(offset, name, enclosingClass.type());
		} else if (name.equals("ConstantValue")) {
			return parseConstantValue(offset, name);
		}

		int len = read_i4(offset + 2) + 6;
		byte[] bs = new byte[len];
		for (int i = 0; i != len; ++i) {
			bs[i] = bytes[offset + i];
		}

		BytecodeAttribute.Reader reader = attributeReaders.get(name);

		if (reader != null) {
			try {
				return reader.read(new BinaryInputStream(