// Path: src/org/transformenator/internal/UnsignedByte.java
// public class UnsignedByte
// {
// 
// 	private UnsignedByte()
// 	{
// 	}
// 
// 	/**
// 	 * Returns the value of the specified byte in unsigned form as an integer.
// 	 * 
// 	 * @param b
// 	 *                the byte to be returned as an int.
// 	 * @return unsigned b represented as an integer.
// 	 */
// 
// 	public static int intValue(byte b)
// 	{
// 		if (b >= 0)
// 			return b;
// 		else
// 			return 256 + b;
// 	}
// 
// 	public static int intValue(byte lo, byte hi)
// 	{
// 		return UnsignedByte.intValue(hi) * 256 + UnsignedByte.intValue(lo);
// 	}
// 
// 	public static byte loByte(int value)
// 	{
// 		return (byte) (value & 0x00ff);
// 	}
// 
// 	public static byte hiByte(int value)
// 	{
// 		return (byte) ((value & 0xff00) >> 8);
// 	}
// 
// 	public static byte loByte(long value)
// 	{
// 		return (byte) (loByte((int) value));
// 	}
// 
//   public static byte hiByte(long value)
//   {
//     return (byte) (hiByte((int) value));
//   }
// 
//   public static byte loNibble(byte value)
//   {
//     return (byte) (value & 0x0f);
//   }
// 
//   public static byte hiNibble(byte value)
//   {
//     return (byte) ((value & 0xf0)/16);
//   }
// 
//   public static byte composeByte(byte hiNibble, byte loNibble)
//   {
//     return (byte) (UnsignedByte.intValue(loNibble) + (UnsignedByte.intValue(hiNibble) * 16));
//   }
// 	/**
// 	 * Returns the value of the specified four bytes in unsigned form as a long.
// 	 * 
// 	 * @param b1    the least significant byte
// 	 * @param b2    the next most significant byte after b1
// 	 * @param b3    the next most significant byte after b2
// 	 * @param b4    the most significant byte
// 	 * @return long b1 through b4 represented as a long.
// 	 */
// 
// 	public static long longValue(byte b1, byte b2, byte b3, byte b4)
// 	{
// 		return UnsignedByte.intValue(b4) * (long)4294967296.0 + UnsignedByte.intValue(b3) * 65536 + UnsignedByte.intValue(b2) * 256 + UnsignedByte.intValue(b1);
// 	}
// 
// 	/**
// 	 * Returns the string representation of the specified byte in unsigned form as a two-digit hex value.
// 	 * 
// 	 * @param b
// 	 *                the byte to represent as a hex string
// 	 * @return b represented as a hex string.
// 	 */
// 
// 	public static String toString(byte b)
// 	{
// 		int i = intValue(b);
// 		char c;
// 		if (i / 16 < 10)
// 			c = (char) (i / 16 + 48);
// 		else
// 			c = (char) (i / 16 + 55);
// 
// 		char c1;
// 		if (i % 16 < 10)
// 			c1 = (char) (i % 16 + 48);
// 		else
// 			c1 = (char) (i % 16 + 55);
// 
// 		return ("" + c + "" + c1);
// 	}
// 
// 	/**
// 	 * Returns the string representation of the specified integer in unsigned form as a hex value.
// 	 * 
// 	 * @param b
// 	 *                the byte to represent as a hex string
// 	 * @return b represented as a hex string.
// 	 */
// 
// 	public static String toString(int i)
// 	{
// 		char c;
// 		if (i / 16 < 10)
// 			c = (char) (i / 16 + 48);
// 		else
// 			c = (char) (i / 16 + 55);
// 
// 		char c1;
// 		if (i % 16 < 10)
// 			c1 = (char) (i % 16 + 48);
// 		else
// 			c1 = (char) (i % 16 + 55);
// 
// 		return ("" + c + "" + c1);
// 	}
// 
// }
// 
// Path: src/org/transformenator/internal/Version.java
// public class Version
// {
// 	public static String VersionString = "v2.0.1";
// }


import org.transformenator.internal.Version;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import org.transformenator.internal.UnsignedByte;
		// Check for stoned virus
		if (hasStonedVirus(inData) && (inData.length == 1200*1024))
		{
			// Copy out the stashed boot block
			for (int i = 0; i < 512; i++)
			{
				inData[i] = inData[i+0x2200];
				inData[i+0x2200] = 0x00;
			}	
			System.err.println("Removed Stoned virus from 1.2MB image.");
			return true;
		}
		else if (hasMichelangeloVirus(inData) && (inData.length == 1200*1024))
		{
			// Copy out the stashed boot block
			for (int i = 0; i < 512; i++)
			{
				inData[i] = inData[i+0x3800];
				inData[i+0x3800] = 0x00;
			}	
			System.err.println("Removed Michelangelo virus from 1.2MB image.");
			return true;
		}
		// System.err.println("DEBUG: is1200k is false.");
		return false;
	}
	
	/**
	 * isFixable - determine if we can fix this image at all
	 */
// Path: src/org/transformenator/internal/UnsignedByte.java
// public class UnsignedByte
// {
// 
// 	private UnsignedByte()
// 	{
// 	}
// 
// 	/**
// 	 * Returns the value of the specified byte in unsigned form as an integer.
// 	 * 
// 	 * @param b
// 	 *                the byte to be returned as an int.
// 	 * @return unsigned b represented as an integer.
// 	 */
// 
// 	public static int intValue(byte b)
// 	{
// 		if (b >= 0)
// 			return b;
// 		else
// 			return 256 + b;
// 	}
// 
// 	public static int intValue(byte lo, byte hi)
// 	{
// 		return UnsignedByte.intValue(hi) * 256 + UnsignedByte.intValue(lo);
// 	}
// 
// 	public static byte loByte(int value)
// 	{
// 		return (byte) (value & 0x00ff);
// 	}
// 
// 	public static byte hiByte(int value)
// 	{
// 		return (byte) ((value & 0xff00) >> 8);
// 	}
// 
// 	public static byte loByte(long value)
// 	{
// 		return (byte) (loByte((int) value));
// 	}
// 
//   public static byte hiByte(long value)
//   {
//     return (byte) (hiByte((int) value));
//   }
// 
//   public static byte loNibble(byte value)
//   {
//     return (byte) (value & 0x0f);
//   }
// 
//   public static byte hiNibble(byte value)
//   {
//     return (byte) ((value & 0xf0)/16);
//   }
// 
//   public static byte composeByte(byte hiNibble, byte loNibble)
//   {
//     return (byte) (UnsignedByte.intValue(loNibble) + (UnsignedByte.intValue(hiNibble) * 16));
//   }
// 	/**
// 	 * Returns the value of the specified four bytes in unsigned form as a long.
// 	 * 
// 	 * @param b1    the least significant byte
// 	 * @param b2    the next most significant byte after b1
// 	 * @param b3    the next most significant byte after b2
// 	 * @param b4    the most significant byte
// 	 * @return long b1 through b4 represented as a long.
// 	 */
// 
// 	public static long longValue(byte b1, byte b2, byte b3, byte b4)
// 	{
// 		return UnsignedByte.intValue(b4) * (long)4294967296.0 + UnsignedByte.intValue(b3) * 65536 + UnsignedByte.intValue(b2) * 256 + UnsignedByte.intValue(b1);
// 	}
// 
// 	/**
// 	 * Returns the string representation of the specified byte in unsigned form as a two-digit hex value.
// 	 * 
// 	 * @param b
// 	 *                the byte to represent as a hex string
// 	 * @return b represented as a hex string.
// 	 */
// 
// 	public static String toString(byte b)
// 	{
// 		int i = intValue(b);
// 		char c;
// 		if (i / 16 < 10)
// 			c = (char) (i / 16 + 48);
// 		else
// 			c = (char) (i / 16 + 55);
// 
// 		char c1;
// 		if (i % 16 < 10)
// 			c1 = (char) (i % 16 + 48);
// 		else
// 			c1 = (char) (i % 16 + 55);
// 
// 		return ("" + c + "" + c1);
// 	}
// 
// 	/**
// 	 * Returns the string representation of the specified integer in unsigned form as a hex value.
// 	 * 
// 	 * @param b
// 	 *                the byte to represent as a hex string
// 	 * @return b represented as a hex string.
// 	 */
// 
// 	public static String toString(int i)
// 	{
// 		char c;
// 		if (i / 16 < 10)
// 			c = (char) (i / 16 + 48);
// 		else
// 			c = (char) (i / 16 + 55);
// 
// 		char c1;
// 		if (i % 16 < 10)
// 			c1 = (char) (i % 16 + 48);
// 		else
// 			c1 = (char) (i % 16 + 55);
// 
// 		return ("" + c + "" + c1);
// 	}
// 
// }
// 
// Path: src/org/transformenator/internal/Version.java
// public class Version
// {
// 	public static String VersionString = "v2.0.1";
// }


// Path: src/org/transformenator/util/DOSImage.java
import org.transformenator.internal.Version;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import org.transformenator.internal.UnsignedByte;

		// Check for stoned virus
		if (hasStonedVirus(inData) && (inData.length == 1200*1024))
		{
			// Copy out the stashed boot block
			for (int i = 0; i < 512; i++)
			{
				inData[i] = inData[i+0x2200];
				inData[i+0x2200] = 0x00;
			}	
			System.err.println("Removed Stoned virus from 1.2MB image.");
			return true;
		}
		else if (hasMichelangeloVirus(inData) && (inData.length == 1200*1024))
		{
			// Copy out the stashed boot block
			for (int i = 0; i < 512; i++)
			{
				inData[i] = inData[i+0x3800];
				inData[i+0x3800] = 0x00;
			}	
			System.err.println("Removed Michelangelo virus from 1.2MB image.");
			return true;
		}
		// System.err.println("DEBUG: is1200k is false.");
		return false;
	}
	
	/**
	 * isFixable - determine if we can fix this image at all
	 */
	public static boolean isFixable(byte inData[])