public static ByteBuffer get(FileDescription description)
	{
		if (description.getIndex() == 255 && description.getArchive() == 255)
		{
			return meta;
		}
		if (data.containsKey(description))
		{
			return data.get(description);
		}
		ArchiveMeta meta = cache.get(description.getIndex()).getArchiveMeta(
				description.getArchive());
		ByteBuffer buffer = ByteBuffer.allocate(meta.getSize());
		int remaining = meta.getSize();
		int block = meta.getBlock();
		int cycles = 0;
		while (remaining > 0)
		{
			int read = Constants.BLOCK_SIZE;
			if (read > remaining)
			{
				read = remaining;
			}
			try
			{
				ByteBuffer data = datum.map(MapMode.PRIVATE, block
						* Constants.BLOCK_DATA, read + Constants.BLOCK_HEADER);
				int expectedArchive = data.getShort() & 0xFFFF;
				int expectedCycle = data.getShort() & 0xFFFF;
				int nextBlock = (data.get() & 0xFF) << 16
						| (data.get() & 0xFF) << 8 | (data.get() & 0xFF);
				int expectedIndex = data.get() & 0xFF;
				if (expectedArchive != description.getArchive()
						|| expectedCycle != cycles++
						|| expectedIndex != description.getIndex() + 1)
				{
					throw new IOException();
				}
				remaining -= read;
				block = nextBlock;
				buffer.put(data);
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		buffer.flip();
		data.put(description, buffer);
		return buffer;
	}