From 894d3edd241b01372fbbefbcb15fc3aff521cd1c Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Thu, 30 Dec 2010 02:35:06 +0000 Subject: [PATCH] Backport the latest POIFS/NPOIFS code from trunk, along with Util to power it, and HPSF to use it. Also makes a few tweaks to let existing code compile against these new versions git-svn-id: https://svn.apache.org/repos/asf/poi/branches/NIO_32_BRANCH@1053791 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 6 +- .../poibrowser/TreeReaderListener.java | 2 +- src/java/org/apache/poi/POIDocument.java | 94 +- src/java/org/apache/poi/hpsf/ClassID.java | 4 +- src/java/org/apache/poi/hpsf/Constants.java | 2 - .../org/apache/poi/hpsf/CustomProperties.java | 134 +- .../org/apache/poi/hpsf/CustomProperty.java | 4 +- .../poi/hpsf/DocumentSummaryInformation.java | 23 +- .../org/apache/poi/hpsf/HPSFException.java | 4 +- .../apache/poi/hpsf/HPSFRuntimeException.java | 4 +- .../hpsf/IllegalPropertySetDataException.java | 4 +- .../poi/hpsf/IllegalVariantTypeException.java | 4 +- .../poi/hpsf/MarkUnsupportedException.java | 4 +- .../poi/hpsf/MissingSectionException.java | 4 +- .../org/apache/poi/hpsf/MutableProperty.java | 4 +- .../apache/poi/hpsf/MutablePropertySet.java | 22 +- .../org/apache/poi/hpsf/MutableSection.java | 96 +- .../apache/poi/hpsf/NoFormatIDException.java | 4 +- .../hpsf/NoPropertySetStreamException.java | 5 +- .../poi/hpsf/NoSingleSectionException.java | 4 +- src/java/org/apache/poi/hpsf/Property.java | 29 +- src/java/org/apache/poi/hpsf/PropertySet.java | 4 +- .../apache/poi/hpsf/PropertySetFactory.java | 4 +- .../hpsf/ReadingNotSupportedException.java | 4 +- src/java/org/apache/poi/hpsf/Section.java | 90 +- .../apache/poi/hpsf/SpecialPropertySet.java | 4 +- .../apache/poi/hpsf/SummaryInformation.java | 103 +- src/java/org/apache/poi/hpsf/Thumbnail.java | 38 +- src/java/org/apache/poi/hpsf/TypeWriter.java | 4 +- .../UnexpectedPropertySetTypeException.java | 4 +- .../hpsf/UnsupportedVariantTypeException.java | 4 +- src/java/org/apache/poi/hpsf/Util.java | 24 +- src/java/org/apache/poi/hpsf/Variant.java | 180 +- .../org/apache/poi/hpsf/VariantSupport.java | 56 +- .../apache/poi/hpsf/VariantTypeException.java | 4 +- .../hpsf/WritingNotSupportedException.java | 4 +- .../extractor/HPSFPropertiesExtractor.java | 67 +- .../apache/poi/hssf/record/StyleRecord.java | 2 +- .../poi/hssf/usermodel/HSSFWorkbook.java | 5 +- .../poi/poifs/common/POIFSBigBlockSize.java | 64 + .../poi/poifs/common/POIFSConstants.java | 37 +- .../org/apache/poi/poifs/dev/POIFSDump.java | 148 +- .../poi/poifs/dev/POIFSHeaderDumper.java | 152 + .../org/apache/poi/poifs/dev/POIFSLister.java | 134 +- .../apache/poi/poifs/dev/POIFSViewable.java | 4 +- .../poifs/eventfilesystem/POIFSReader.java | 34 +- .../poi/poifs/filesystem/BlockStore.java | 105 + .../poi/poifs/filesystem/DirectoryEntry.java | 4 +- .../poi/poifs/filesystem/DirectoryNode.java | 193 +- .../poifs/filesystem/DocumentInputStream.java | 528 +-- .../filesystem/DocumentOutputStream.java | 61 +- .../filesystem/NDocumentInputStream.java | 303 ++ .../poi/poifs/filesystem/NPOIFSDocument.java | 193 ++ .../poifs/filesystem/NPOIFSFileSystem.java | 788 +++++ .../poi/poifs/filesystem/NPOIFSMiniStore.java | 211 ++ .../poi/poifs/filesystem/NPOIFSStream.java | 224 ++ .../filesystem/ODocumentInputStream.java | 321 ++ .../poi/poifs/filesystem/Ole10Native.java | 279 ++ .../filesystem/Ole10NativeException.java | 24 + .../poi/poifs/filesystem/POIFSDocument.java | 1131 +++--- .../poifs/filesystem/POIFSDocumentPath.java | 16 +- .../poi/poifs/filesystem/POIFSFileSystem.java | 140 +- .../poifs/nio/ByteArrayBackedDataSource.java | 94 + .../org/apache/poi/poifs/nio/DataSource.java | 35 + .../poi/poifs/nio/FileBackedDataSource.java | 88 + .../poi/poifs/property/DirectoryProperty.java | 70 +- .../poi/poifs/property/NPropertyTable.java | 128 + .../apache/poi/poifs/property/Property.java | 78 +- .../poi/poifs/property/PropertyFactory.java | 81 +- .../poi/poifs/property/PropertyTable.java | 166 +- .../poi/poifs/property/PropertyTableBase.java | 153 + .../poi/poifs/property/RootProperty.java | 30 +- .../apache/poi/poifs/storage/BATBlock.java | 496 ++- .../apache/poi/poifs/storage/BigBlock.java | 16 +- .../storage/BlockAllocationTableReader.java | 203 +- .../storage/BlockAllocationTableWriter.java | 68 +- .../apache/poi/poifs/storage/BlockList.java | 5 +- .../poi/poifs/storage/BlockListImpl.java | 66 +- .../poi/poifs/storage/DataInputBlock.java | 186 + .../poi/poifs/storage/DocumentBlock.java | 93 +- .../apache/poi/poifs/storage/HeaderBlock.java | 388 +++ .../poifs/storage/HeaderBlockConstants.java | 16 +- .../poi/poifs/storage/HeaderBlockReader.java | 205 -- .../poi/poifs/storage/HeaderBlockWriter.java | 144 +- .../poi/poifs/storage/PropertyBlock.java | 34 +- .../poi/poifs/storage/RawDataBlock.java | 16 +- .../poi/poifs/storage/RawDataBlockList.java | 10 +- .../poifs/storage/SmallBlockTableReader.java | 29 +- .../poifs/storage/SmallBlockTableWriter.java | 8 +- .../poi/poifs/storage/SmallDocumentBlock.java | 143 +- .../poifs/storage/SmallDocumentBlockList.java | 2 +- src/java/org/apache/poi/util/ArrayUtil.java | 1 - src/java/org/apache/poi/util/BinaryTree.java | 276 +- .../org/apache/poi/util/BitFieldFactory.java | 16 +- .../poi/util/CloseIgnoringInputStream.java | 41 + .../poi/util/DelayableLittleEndianOutput.java | 34 + .../apache/poi/util/FontMetricsDumper.java | 84 + src/java/org/apache/poi/util/HexDump.java | 18 +- src/java/org/apache/poi/util/HexRead.java | 6 +- src/java/org/apache/poi/util/IOUtils.java | 167 +- src/java/org/apache/poi/util/IntList.java | 27 +- src/java/org/apache/poi/util/IntMapper.java | 23 +- src/java/org/apache/poi/util/Internal.java | 38 + .../org/apache/poi/util/LZWDecompresser.java | 178 + .../org/apache/poi/util/LittleEndian.java | 411 +-- .../LittleEndianByteArrayInputStream.java | 119 + .../LittleEndianByteArrayOutputStream.java | 106 + .../apache/poi/util/LittleEndianInput.java | 34 + .../poi/util/LittleEndianInputStream.java | 144 + .../apache/poi/util/LittleEndianOutput.java | 31 + .../poi/util/LittleEndianOutputStream.java | 91 + src/java/org/apache/poi/util/NullLogger.java | 11 +- .../org/apache/poi/util/POILogFactory.java | 9 +- src/java/org/apache/poi/util/POILogger.java | 208 +- .../poi/util/RecordFormatException.java | 42 + src/java/org/apache/poi/util/ShortList.java | 4 - src/java/org/apache/poi/util/StringUtil.java | 417 ++- .../org/apache/poi/util/SystemOutLogger.java | 16 +- src/java/org/apache/poi/util/TempFile.java | 17 +- .../org/apache/poi/hslf/HSLFSlideShow.java | 4 +- .../src/org/apache/poi/hwpf/HWPFDocument.java | 2 +- .../apache/poi/TestPOIDocumentScratchpad.java | 2 +- .../org/apache/poi/POIDataSamples.java | 245 ++ .../org/apache/poi/TestPOIDocumentMain.java | 95 +- .../apache/poi/poifs/data/BlockSize4096.zvi | Bin 0 -> 65536 bytes .../apache/poi/poifs/data/BlockSize512.zvi | Bin 0 -> 51712 bytes .../org/apache/poi/poifs/data/Notes.ole2 | Bin 0 -> 8192 bytes .../poifs/data/ReferencesInvalidSectors.mpp | Bin 0 -> 356169 bytes .../org/apache/poi/poifs/data/oleObject1.bin | Bin 0 -> 14336 bytes .../org/apache/poi/poifs/data/protect.xlsx | Bin 0 -> 12968 bytes .../TestPOIFSReaderRegistry.java | 45 +- .../filesystem/AllPOIFSFileSystemTests.java | 5 +- .../poifs/filesystem/TestDirectoryNode.java | 82 +- .../poi/poifs/filesystem/TestDocument.java | 67 +- .../filesystem/TestDocumentDescriptor.java | 47 +- .../filesystem/TestDocumentInputStream.java | 104 +- .../poifs/filesystem/TestDocumentNode.java | 39 +- .../filesystem/TestDocumentOutputStream.java | 73 +- .../poifs/filesystem/TestEmptyDocument.java | 197 +- .../filesystem/TestNPOIFSFileSystem.java | 475 +++ .../poifs/filesystem/TestNPOIFSMiniStore.java | 251 ++ .../poifs/filesystem/TestNPOIFSStream.java | 641 ++++ .../TestOffice2007XMLException.java | 3 +- .../poi/poifs/filesystem/TestOle10Native.java | 36 + .../filesystem/TestPOIFSDocumentPath.java | 70 +- .../poifs/filesystem/TestPOIFSFileSystem.java | 212 +- .../poifs/filesystem/TestPropertySorter.java | 22 +- .../poifs/property/AllPOIFSPropertyTests.java | 19 +- .../poifs/property/TestDirectoryProperty.java | 175 +- .../poifs/property/TestDocumentProperty.java | 225 +- .../poifs/property/TestPropertyFactory.java | 2557 ++------------ .../poi/poifs/property/TestPropertyTable.java | 3017 +++-------------- .../poi/poifs/property/TestRootProperty.java | 271 +- .../poifs/storage/AllPOIFSStorageTests.java | 36 +- .../poifs/storage/LocalRawDataBlockList.java | 49 +- .../apache/poi/poifs/storage/RawDataUtil.java | 86 + .../poi/poifs/storage/TestBATBlock.java | 310 +- .../TestBlockAllocationTableReader.java | 1675 ++------- .../TestBlockAllocationTableWriter.java | 94 +- .../poi/poifs/storage/TestBlockListImpl.java | 105 +- .../poi/poifs/storage/TestDocumentBlock.java | 81 +- .../poifs/storage/TestHeaderBlockReader.java | 247 -- .../poifs/storage/TestHeaderBlockReading.java | 83 + .../poifs/storage/TestHeaderBlockWriter.java | 1025 ------ .../poifs/storage/TestHeaderBlockWriting.java | 270 ++ .../poi/poifs/storage/TestPropertyBlock.java | 77 +- .../poi/poifs/storage/TestRawDataBlock.java | 398 +-- .../poifs/storage/TestRawDataBlockList.java | 71 +- .../storage/TestSmallBlockTableReader.java | 2391 ++----------- .../storage/TestSmallBlockTableWriter.java | 61 +- .../poifs/storage/TestSmallDocumentBlock.java | 111 +- .../storage/TestSmallDocumentBlockList.java | 50 +- .../org/apache/poi/util/AllPOIUtilTests.java | 5 +- .../org/apache/poi/util/DummyPOILogger.java | 4 +- .../org/apache/poi/util/LocalTestNode.java | 4 +- .../org/apache/poi/util/TestArrayUtil.java | 350 +- .../org/apache/poi/util/TestBinaryTree.java | 212 +- .../org/apache/poi/util/TestBitField.java | 131 +- .../org/apache/poi/util/TestByteField.java | 74 +- .../org/apache/poi/util/TestIntList.java | 158 +- .../org/apache/poi/util/TestIntegerField.java | 75 +- .../org/apache/poi/util/TestLittleEndian.java | 20 +- .../poi/util/TestLittleEndianStreams.java | 80 + .../apache/poi/util/TestPOILogFactory.java | 37 +- .../org/apache/poi/util/TestPOILogger.java | 28 +- .../org/apache/poi/util/TestShortField.java | 70 +- .../org/apache/poi/util/TestShortList.java | 158 +- .../org/apache/poi/util/TestStringUtil.java | 263 +- 188 files changed, 13051 insertions(+), 16591 deletions(-) create mode 100644 src/java/org/apache/poi/poifs/common/POIFSBigBlockSize.java create mode 100644 src/java/org/apache/poi/poifs/dev/POIFSHeaderDumper.java create mode 100644 src/java/org/apache/poi/poifs/filesystem/BlockStore.java create mode 100644 src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java create mode 100644 src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java create mode 100644 src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java create mode 100644 src/java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java create mode 100644 src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java create mode 100644 src/java/org/apache/poi/poifs/filesystem/ODocumentInputStream.java create mode 100644 src/java/org/apache/poi/poifs/filesystem/Ole10Native.java create mode 100644 src/java/org/apache/poi/poifs/filesystem/Ole10NativeException.java create mode 100644 src/java/org/apache/poi/poifs/nio/ByteArrayBackedDataSource.java create mode 100644 src/java/org/apache/poi/poifs/nio/DataSource.java create mode 100644 src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java create mode 100644 src/java/org/apache/poi/poifs/property/NPropertyTable.java create mode 100644 src/java/org/apache/poi/poifs/property/PropertyTableBase.java create mode 100644 src/java/org/apache/poi/poifs/storage/DataInputBlock.java create mode 100644 src/java/org/apache/poi/poifs/storage/HeaderBlock.java delete mode 100644 src/java/org/apache/poi/poifs/storage/HeaderBlockReader.java create mode 100644 src/java/org/apache/poi/util/CloseIgnoringInputStream.java create mode 100644 src/java/org/apache/poi/util/DelayableLittleEndianOutput.java create mode 100644 src/java/org/apache/poi/util/FontMetricsDumper.java create mode 100644 src/java/org/apache/poi/util/Internal.java create mode 100644 src/java/org/apache/poi/util/LZWDecompresser.java create mode 100644 src/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java create mode 100644 src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java create mode 100644 src/java/org/apache/poi/util/LittleEndianInput.java create mode 100644 src/java/org/apache/poi/util/LittleEndianInputStream.java create mode 100644 src/java/org/apache/poi/util/LittleEndianOutput.java create mode 100644 src/java/org/apache/poi/util/LittleEndianOutputStream.java create mode 100644 src/java/org/apache/poi/util/RecordFormatException.java create mode 100644 src/testcases/org/apache/poi/POIDataSamples.java create mode 100644 src/testcases/org/apache/poi/poifs/data/BlockSize4096.zvi create mode 100644 src/testcases/org/apache/poi/poifs/data/BlockSize512.zvi create mode 100644 src/testcases/org/apache/poi/poifs/data/Notes.ole2 create mode 100644 src/testcases/org/apache/poi/poifs/data/ReferencesInvalidSectors.mpp create mode 100644 src/testcases/org/apache/poi/poifs/data/oleObject1.bin create mode 100644 src/testcases/org/apache/poi/poifs/data/protect.xlsx create mode 100644 src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java create mode 100644 src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSMiniStore.java create mode 100644 src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSStream.java create mode 100644 src/testcases/org/apache/poi/poifs/filesystem/TestOle10Native.java create mode 100644 src/testcases/org/apache/poi/poifs/storage/RawDataUtil.java delete mode 100644 src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockReader.java create mode 100644 src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockReading.java delete mode 100644 src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockWriter.java create mode 100644 src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockWriting.java create mode 100644 src/testcases/org/apache/poi/util/TestLittleEndianStreams.java diff --git a/build.xml b/build.xml index 6bfcb1f7ef..9a6d74b85d 100644 --- a/build.xml +++ b/build.xml @@ -119,11 +119,11 @@ under the License. - + - - diff --git a/src/contrib/src/org/apache/poi/contrib/poibrowser/TreeReaderListener.java b/src/contrib/src/org/apache/poi/contrib/poibrowser/TreeReaderListener.java index a98ec3906c..1c9e0d2d53 100644 --- a/src/contrib/src/org/apache/poi/contrib/poibrowser/TreeReaderListener.java +++ b/src/contrib/src/org/apache/poi/contrib/poibrowser/TreeReaderListener.java @@ -164,7 +164,7 @@ public class TreeReaderListener implements POIFSReaderListener { is.close(); } - catch (IOException ex) + catch (Exception ex) { System.err.println ("Unexpected exception while closing " + diff --git a/src/java/org/apache/poi/POIDocument.java b/src/java/org/apache/poi/POIDocument.java index 4d7e50c0fb..6e1527e858 100644 --- a/src/java/org/apache/poi/POIDocument.java +++ b/src/java/org/apache/poi/POIDocument.java @@ -20,6 +20,7 @@ package org.apache.poi; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.util.Iterator; import java.util.List; @@ -47,27 +48,28 @@ import org.apache.poi.util.POILogger; */ public abstract class POIDocument { /** Holds metadata on our document */ - protected SummaryInformation sInf; + private SummaryInformation sInf; /** Holds further metadata on our document */ - protected DocumentSummaryInformation dsInf; - /** The open POIFS FileSystem that contains our document */ - protected POIFSFileSystem filesystem; + private DocumentSummaryInformation dsInf; /** The directory that our document lives in */ protected DirectoryNode directory; /** For our own logging use */ - protected POILogger logger = POILogFactory.getLogger(this.getClass()); + private final static POILogger logger = POILogFactory.getLogger(POIDocument.class); /* Have the property streams been read yet? (Only done on-demand) */ - protected boolean initialized = false; + private boolean initialized = false; - protected POIDocument(DirectoryNode dir, POIFSFileSystem fs) { - this.filesystem = fs; + protected POIDocument(DirectoryNode dir) { this.directory = dir; } + @Deprecated + protected POIDocument(DirectoryNode dir, POIFSFileSystem fs) { + this.directory = dir; + } protected POIDocument(POIFSFileSystem fs) { - this(fs.getRoot(), fs); + this(fs.getRoot()); } /** @@ -85,6 +87,25 @@ public abstract class POIDocument { if(!initialized) readProperties(); return sInf; } + + /** + * Will create whichever of SummaryInformation + * and DocumentSummaryInformation (HPSF) properties + * are not already part of your document. + * This is normally useful when creating a new + * document from scratch. + * If the information properties are already there, + * then nothing will happen. + */ + public void createInformationProperties() { + if(!initialized) readProperties(); + if(sInf == null) { + sInf = PropertySetFactory.newSummaryInformation(); + } + if(dsInf == null) { + dsInf = PropertySetFactory.newDocumentSummaryInformation(); + } + } /** * Find, and create objects for, the standard @@ -120,28 +141,31 @@ public abstract class POIDocument { * if it wasn't found */ protected PropertySet getPropertySet(String setName) { - DocumentInputStream dis; - try { - // Find the entry, and get an input stream for it - dis = directory.createDocumentInputStream(setName); - } catch(IOException ie) { - // Oh well, doesn't exist - logger.log(POILogger.WARN, "Error getting property set with name " + setName + "\n" + ie); - return null; - } + //directory can be null when creating new documents + if(directory == null) return null; - try { - // Create the Property Set - PropertySet set = PropertySetFactory.create(dis); - return set; - } catch(IOException ie) { - // Must be corrupt or something like that - logger.log(POILogger.WARN, "Error creating property set with name " + setName + "\n" + ie); - } catch(org.apache.poi.hpsf.HPSFException he) { - // Oh well, doesn't exist - logger.log(POILogger.WARN, "Error creating property set with name " + setName + "\n" + he); - } - return null; + DocumentInputStream dis; + try { + // Find the entry, and get an input stream for it + dis = directory.createDocumentInputStream( directory.getEntry(setName) ); + } catch(IOException ie) { + // Oh well, doesn't exist + logger.log(POILogger.WARN, "Error getting property set with name " + setName + "\n" + ie); + return null; + } + + try { + // Create the Property Set + PropertySet set = PropertySetFactory.create(dis); + return set; + } catch(IOException ie) { + // Must be corrupt or something like that + logger.log(POILogger.WARN, "Error creating property set with name " + setName + "\n" + ie); + } catch(org.apache.poi.hpsf.HPSFException he) { + // Oh well, doesn't exist + logger.log(POILogger.WARN, "Error creating property set with name " + setName + "\n" + he); + } + return null; } /** @@ -157,14 +181,16 @@ public abstract class POIDocument { * @param writtenEntries a list of POIFS entries to add the property names too */ protected void writeProperties(POIFSFileSystem outFS, List writtenEntries) throws IOException { - if(sInf != null) { - writePropertySet(SummaryInformation.DEFAULT_STREAM_NAME,sInf,outFS); + SummaryInformation si = getSummaryInformation(); + if(si != null) { + writePropertySet(SummaryInformation.DEFAULT_STREAM_NAME, si, outFS); if(writtenEntries != null) { writtenEntries.add(SummaryInformation.DEFAULT_STREAM_NAME); } } - if(dsInf != null) { - writePropertySet(DocumentSummaryInformation.DEFAULT_STREAM_NAME,dsInf,outFS); + DocumentSummaryInformation dsi = getDocumentSummaryInformation(); + if(dsi != null) { + writePropertySet(DocumentSummaryInformation.DEFAULT_STREAM_NAME, dsi, outFS); if(writtenEntries != null) { writtenEntries.add(DocumentSummaryInformation.DEFAULT_STREAM_NAME); } diff --git a/src/java/org/apache/poi/hpsf/ClassID.java b/src/java/org/apache/poi/hpsf/ClassID.java index 7044aca0e8..dd623b8b77 100644 --- a/src/java/org/apache/poi/hpsf/ClassID.java +++ b/src/java/org/apache/poi/hpsf/ClassID.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import org.apache.poi.util.HexDump; @@ -27,8 +27,6 @@ import org.apache.poi.util.HexDump; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-02-09 */ public class ClassID { diff --git a/src/java/org/apache/poi/hpsf/Constants.java b/src/java/org/apache/poi/hpsf/Constants.java index a2a2f7b366..05bc2fd9a4 100644 --- a/src/java/org/apache/poi/hpsf/Constants.java +++ b/src/java/org/apache/poi/hpsf/Constants.java @@ -22,8 +22,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @since 2004-06-20 - * @version $Id$ */ public class Constants { diff --git a/src/java/org/apache/poi/hpsf/CustomProperties.java b/src/java/org/apache/poi/hpsf/CustomProperties.java index 420fc2f9bb..83858eb736 100644 --- a/src/java/org/apache/poi/hpsf/CustomProperties.java +++ b/src/java/org/apache/poi/hpsf/CustomProperties.java @@ -33,7 +33,7 @@ import org.apache.poi.hpsf.wellknown.PropertyIDMap; * name is the key that maps to a typed value. This implementation hides * property IDs from the developer and regards the property names as keys to * typed values.

- * + * *

While this class provides a simple API to custom properties, it ignores * the fact that not names, but IDs are the real keys to properties. Under the * hood this class maintains a 1:1 relationship between IDs and names. Therefore @@ -41,71 +41,68 @@ import org.apache.poi.hpsf.wellknown.PropertyIDMap; * mapping to the same name or with properties without a name: the result will * contain only a subset of the original properties. If you really need to deal * such property sets, use HPSF's low-level access methods.

- * + * *

An application can call the {@link #isPure} method to check whether a * property set parsed by {@link CustomProperties} is still pure (i.e. * unmodified) or whether one or more properties have been dropped.

- * + * *

This class is not thread-safe; concurrent access to instances of this - * class must be syncronized.

- * + * class must be synchronized.

+ * + *

While this class is roughly HashMap, that's the + * internal representation. To external calls, it should appear as + * HashMap mapping between Names and Custom Property Values.

+ * * @author Rainer Klute <klute@rainer-klute.de> - * @since 2006-02-09 - * @version $Id$ */ -public class CustomProperties extends HashMap +@SuppressWarnings("serial") +public class CustomProperties extends HashMap { /** *

Maps property IDs to property names.

*/ - private Map dictionaryIDToName = new HashMap(); + private Map dictionaryIDToName = new HashMap(); /** *

Maps property names to property IDs.

*/ - private Map dictionaryNameToID = new HashMap(); - + private Map dictionaryNameToID = new HashMap(); + /** *

Tells whether this object is pure or not.

*/ private boolean isPure = true; - /** *

Puts a {@link CustomProperty} into this map. It is assumed that the * {@link CustomProperty} already has a valid ID. Otherwise use * {@link #put(CustomProperty)}.

*/ - public Object put(final Object name, final Object customProperty) throws ClassCastException + public CustomProperty put(final String name, final CustomProperty cp) { - final CustomProperty cp = (CustomProperty) customProperty; if (name == null) { /* Ignoring a property without a name. */ isPure = false; return null; } - if (!(name instanceof String)) - throw new ClassCastException("The name of a custom property must " + - "be a java.lang.String, but it is a " + - name.getClass().getName()); if (!(name.equals(cp.getName()))) throw new IllegalArgumentException("Parameter \"name\" (" + name + ") and custom property's name (" + cp.getName() + ") do not match."); /* Register name and ID in the dictionary. Mapping in both directions is possible. If there is already a */ - final Long idKey = new Long(cp.getID()); - final Object oldID = dictionaryNameToID.get(name); + final Long idKey = Long.valueOf(cp.getID()); + final Long oldID = dictionaryNameToID.get(name); dictionaryIDToName.remove(oldID); dictionaryNameToID.put(name, idKey); dictionaryIDToName.put(idKey, name); /* Put the custom property into this map. */ - final Object oldCp = super.remove(oldID); + final CustomProperty oldCp = super.remove(oldID); super.put(idKey, cp); return oldCp; } @@ -115,16 +112,16 @@ public class CustomProperties extends HashMap /** *

Puts a {@link CustomProperty} that has not yet a valid ID into this * map. The method will allocate a suitable ID for the custom property:

- * + * *
    - * + * *
  • If there is already a property with the same name, take the ID * of that property.

  • - * + * *
  • Otherwise find the highest ID and use its value plus one.

  • - * + * *
- * + * * @param customProperty * @return If the was already a property with the same name, the * @throws ClassCastException @@ -140,9 +137,9 @@ public class CustomProperties extends HashMap else { long max = 1; - for (final Iterator i = dictionaryIDToName.keySet().iterator(); i.hasNext();) + for (final Iterator i = dictionaryIDToName.keySet().iterator(); i.hasNext();) { - final long id = ((Long) i.next()).longValue(); + final long id = i.next().longValue(); if (id > max) max = id; } @@ -155,7 +152,7 @@ public class CustomProperties extends HashMap /** *

Removes a custom property.

- * @param name The name of the custom property to remove + * @param name The name of the custom property to remove * @return The removed property or null if the specified property was not found. * * @see java.util.HashSet#remove(java.lang.Object) @@ -172,7 +169,7 @@ public class CustomProperties extends HashMap /** *

Adds a named string property.

- * + * * @param name The property's name. * @param value The property's value. * @return the property that was stored under the specified name before, or @@ -260,10 +257,10 @@ public class CustomProperties extends HashMap return put(cp); } - + /** *

Gets a named value from the custom properties.

- * + * * @param name the name of the value to get * @return the value or null if a value with the specified * name is not found in the custom properties. @@ -294,18 +291,34 @@ public class CustomProperties extends HashMap final CustomProperty cp = new CustomProperty(p, name); return put(cp); } - + + /** + * Returns a set of all the names of our + * custom properties. Equivalent to + * {@link #nameSet()} + */ + public Set keySet() { + return dictionaryNameToID.keySet(); + } + /** * Returns a set of all the names of our * custom properties */ - public Set keySet() { - return dictionaryNameToID.keySet(); - } + public Set nameSet() { + return dictionaryNameToID.keySet(); + } + + /** + * Returns a set of all the IDs of our + * custom properties + */ + public Set idSet() { + return dictionaryNameToID.keySet(); + } - - /** + /** *

Sets the codepage.

* * @param codepage the codepage @@ -315,7 +328,7 @@ public class CustomProperties extends HashMap final MutableProperty p = new MutableProperty(); p.setID(PropertyIDMap.PID_CODEPAGE); p.setType(Variant.VT_I2); - p.setValue(new Integer(codepage)); + p.setValue(Integer.valueOf(codepage)); put(new CustomProperty(p)); } @@ -324,17 +337,47 @@ public class CustomProperties extends HashMap /** *

Gets the dictionary which contains IDs and names of the named custom * properties. - * + * * @return the dictionary. */ - Map getDictionary() + Map getDictionary() { return dictionaryIDToName; } - /** + * Checks against both String Name and Long ID + */ + public boolean containsKey(Object key) { + if(key instanceof Long) { + return super.containsKey((Long)key); + } + if(key instanceof String) { + return super.containsKey((Long)dictionaryNameToID.get(key)); + } + return false; + } + + /** + * Checks against both the property, and its values. + */ + public boolean containsValue(Object value) { + if(value instanceof CustomProperty) { + return super.containsValue((CustomProperty)value); + } else { + for(CustomProperty cp : super.values()) { + if(cp.getValue() == value) { + return true; + } + } + } + return false; + } + + + + /** *

Gets the codepage.

* * @return the codepage or -1 if the codepage is undefined. @@ -342,9 +385,9 @@ public class CustomProperties extends HashMap public int getCodepage() { int codepage = -1; - for (final Iterator i = this.values().iterator(); codepage == -1 && i.hasNext();) + for (final Iterator i = this.values().iterator(); codepage == -1 && i.hasNext();) { - final CustomProperty cp = (CustomProperty) i.next(); + final CustomProperty cp = i.next(); if (cp.getID() == PropertyIDMap.PID_CODEPAGE) codepage = ((Integer) cp.getValue()).intValue(); } @@ -357,7 +400,7 @@ public class CustomProperties extends HashMap *

Tells whether this {@link CustomProperties} instance is pure or one or * more properties of the underlying low-level property set has been * dropped.

- * + * * @return true if the {@link CustomProperties} is pure, else * false. */ @@ -375,5 +418,4 @@ public class CustomProperties extends HashMap { this.isPure = isPure; } - } diff --git a/src/java/org/apache/poi/hpsf/CustomProperty.java b/src/java/org/apache/poi/hpsf/CustomProperty.java index 4bd1f8e0f3..994adf7b6e 100644 --- a/src/java/org/apache/poi/hpsf/CustomProperty.java +++ b/src/java/org/apache/poi/hpsf/CustomProperty.java @@ -18,15 +18,13 @@ package org.apache.poi.hpsf; /** - *

This class represents custum properties in the document summary + *

This class represents custom properties in the document summary * information stream. The difference to normal properties is that custom * properties have an optional name. If the name is not null it * will be maintained in the section's dictionary.

* * @author Rainer Klute <klute@rainer-klute.de> - * @since 2006-02-09 - * @version $Id$ */ public class CustomProperty extends MutableProperty { diff --git a/src/java/org/apache/poi/hpsf/DocumentSummaryInformation.java b/src/java/org/apache/poi/hpsf/DocumentSummaryInformation.java index 62c6127ee4..0e98396ad4 100644 --- a/src/java/org/apache/poi/hpsf/DocumentSummaryInformation.java +++ b/src/java/org/apache/poi/hpsf/DocumentSummaryInformation.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.util.Iterator; @@ -32,8 +32,6 @@ import org.apache.poi.hpsf.wellknown.SectionIDMap; * @author Drew Varner (Drew.Varner closeTo sc.edu) * @author robert_flaherty@hyperion.com * @see SummaryInformation - * @version $Id$ - * @since 2002-02-09 */ public class DocumentSummaryInformation extends SpecialPropertySet { @@ -569,9 +567,8 @@ public class DocumentSummaryInformation extends SpecialPropertySet /** *

Gets the custom properties.

- * + * * @return The custom properties. - * @since 2006-02-09 */ public CustomProperties getCustomProperties() { @@ -580,7 +577,7 @@ public class DocumentSummaryInformation extends SpecialPropertySet { cps = new CustomProperties(); final Section section = (Section) getSections().get(1); - final Map dictionary = section.getDictionary(); + final Map dictionary = section.getDictionary(); final Property[] properties = section.getProperties(); int propertyCount = 0; for (int i = 0; i < properties.length; i++) @@ -591,7 +588,7 @@ public class DocumentSummaryInformation extends SpecialPropertySet { propertyCount++; final CustomProperty cp = new CustomProperty(p, - (String) dictionary.get(new Long(id))); + dictionary.get(Long.valueOf(id))); cps.put(cp.getName(), cp); } } @@ -603,15 +600,14 @@ public class DocumentSummaryInformation extends SpecialPropertySet /** *

Sets the custom properties.

- * + * * @param customProperties The custom properties - * @since 2006-02-07 */ public void setCustomProperties(final CustomProperties customProperties) { ensureSection2(); final MutableSection section = (MutableSection) getSections().get(1); - final Map dictionary = customProperties.getDictionary(); + final Map dictionary = customProperties.getDictionary(); section.clear(); /* Set the codepage. If both custom properties and section have a @@ -625,9 +621,9 @@ public class DocumentSummaryInformation extends SpecialPropertySet customProperties.setCodepage(cpCodepage); section.setCodepage(cpCodepage); section.setDictionary(dictionary); - for (final Iterator i = customProperties.values().iterator(); i.hasNext();) + for (final Iterator i = customProperties.values().iterator(); i.hasNext();) { - final Property p = (Property) i.next(); + final Property p = i.next(); section.setProperty(p); } } @@ -652,8 +648,6 @@ public class DocumentSummaryInformation extends SpecialPropertySet /** *

Removes the custom properties.

- * - * @since 2006-02-08 */ public void removeCustomProperties() { @@ -676,5 +670,4 @@ public class DocumentSummaryInformation extends SpecialPropertySet { throw new UnsupportedOperationException(msg + " is not yet implemented."); } - } diff --git a/src/java/org/apache/poi/hpsf/HPSFException.java b/src/java/org/apache/poi/hpsf/HPSFException.java index e8a8a574a9..f0f12dbc6c 100644 --- a/src/java/org/apache/poi/hpsf/HPSFException.java +++ b/src/java/org/apache/poi/hpsf/HPSFException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -24,8 +24,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-02-09 */ public class HPSFException extends Exception { diff --git a/src/java/org/apache/poi/hpsf/HPSFRuntimeException.java b/src/java/org/apache/poi/hpsf/HPSFRuntimeException.java index 3f2419f7ef..79825ebf82 100644 --- a/src/java/org/apache/poi/hpsf/HPSFRuntimeException.java +++ b/src/java/org/apache/poi/hpsf/HPSFRuntimeException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.PrintStream; @@ -27,8 +27,6 @@ import java.io.PrintWriter; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-02-09 */ public class HPSFRuntimeException extends RuntimeException { diff --git a/src/java/org/apache/poi/hpsf/IllegalPropertySetDataException.java b/src/java/org/apache/poi/hpsf/IllegalPropertySetDataException.java index 2f6dde3933..3217af9580 100644 --- a/src/java/org/apache/poi/hpsf/IllegalPropertySetDataException.java +++ b/src/java/org/apache/poi/hpsf/IllegalPropertySetDataException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -26,8 +26,6 @@ package org.apache.poi.hpsf; * thrown.

* * @author Drew Varner(Drew.Varner atDomain sc.edu) - * @version $Id$ - * @since 2002-05-26 */ public class IllegalPropertySetDataException extends HPSFRuntimeException { diff --git a/src/java/org/apache/poi/hpsf/IllegalVariantTypeException.java b/src/java/org/apache/poi/hpsf/IllegalVariantTypeException.java index 0292510665..f72bb44b2e 100644 --- a/src/java/org/apache/poi/hpsf/IllegalVariantTypeException.java +++ b/src/java/org/apache/poi/hpsf/IllegalVariantTypeException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import org.apache.poi.util.HexDump; @@ -25,8 +25,6 @@ import org.apache.poi.util.HexDump; * * @author Rainer Klute <klute@rainer-klute.de> - * @since 2004-06-21 - * @version $Id$ */ public class IllegalVariantTypeException extends VariantTypeException { diff --git a/src/java/org/apache/poi/hpsf/MarkUnsupportedException.java b/src/java/org/apache/poi/hpsf/MarkUnsupportedException.java index 1ff38f7566..c1c5dc8592 100644 --- a/src/java/org/apache/poi/hpsf/MarkUnsupportedException.java +++ b/src/java/org/apache/poi/hpsf/MarkUnsupportedException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -23,8 +23,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-02-09 */ public class MarkUnsupportedException extends HPSFException { diff --git a/src/java/org/apache/poi/hpsf/MissingSectionException.java b/src/java/org/apache/poi/hpsf/MissingSectionException.java index ccef805f0b..35df686227 100644 --- a/src/java/org/apache/poi/hpsf/MissingSectionException.java +++ b/src/java/org/apache/poi/hpsf/MissingSectionException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -26,8 +26,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id: NoSingleSectionException.java 353545 2004-04-09 13:05:39Z glens $ - * @since 2006-02-08 */ public class MissingSectionException extends HPSFRuntimeException { diff --git a/src/java/org/apache/poi/hpsf/MutableProperty.java b/src/java/org/apache/poi/hpsf/MutableProperty.java index 6128f61849..401ac232c8 100644 --- a/src/java/org/apache/poi/hpsf/MutableProperty.java +++ b/src/java/org/apache/poi/hpsf/MutableProperty.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.IOException; @@ -28,8 +28,6 @@ import java.io.OutputStream; * * @author Rainer Klute <klute@rainer-klute.de> - * @since 2003-08-03 - * @version $Id$ */ public class MutableProperty extends Property { diff --git a/src/java/org/apache/poi/hpsf/MutablePropertySet.java b/src/java/org/apache/poi/hpsf/MutablePropertySet.java index 5ecbfeee3d..3fb13af81a 100644 --- a/src/java/org/apache/poi/hpsf/MutablePropertySet.java +++ b/src/java/org/apache/poi/hpsf/MutablePropertySet.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.ByteArrayInputStream; @@ -33,8 +33,6 @@ import org.apache.poi.poifs.filesystem.Entry; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianConsts; - - /** *

Adds writing support to the {@link PropertySet} class.

* @@ -43,8 +41,6 @@ import org.apache.poi.util.LittleEndianConsts; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2003-02-19 */ public class MutablePropertySet extends PropertySet { @@ -79,10 +75,10 @@ public class MutablePropertySet extends PropertySet /** *

Constructs a MutablePropertySet by doing a deep copy of - * an existing PropertySet. All nested elements, i.e. + * an existing PropertySet. All nested elements, i.e. * Sections and Property instances, will be their * mutable counterparts in the new MutablePropertySet.

- * + * * @param ps The property set to copy */ public MutablePropertySet(final PropertySet ps) @@ -194,7 +190,7 @@ public class MutablePropertySet extends PropertySet /** *

Writes the property set to an output stream.

- * + * * @param out the output stream to write the section to * @exception IOException if an error when writing to the output stream * occurs @@ -236,10 +232,10 @@ public class MutablePropertySet extends PropertySet catch (HPSFRuntimeException ex) { final Throwable cause = ex.getReason(); - if (cause instanceof UnsupportedEncodingException) + if (cause instanceof UnsupportedEncodingException) { throw new IllegalPropertySetDataException(cause); - else - throw ex; + } + throw ex; } } @@ -263,7 +259,7 @@ public class MutablePropertySet extends PropertySet * the {@link MutablePropertySet} only.

* * @return the contents of this property set stream - * + * * @throws WritingNotSupportedException if HPSF does not yet support writing * of a property's variant type. * @throws IOException if an I/O exception occurs. @@ -284,7 +280,7 @@ public class MutablePropertySet extends PropertySet * @param dir The directory in the POI filesystem to write the document to. * @param name The document's name. If there is already a document with the * same name in the directory the latter will be overwritten. - * + * * @throws WritingNotSupportedException * @throws IOException */ diff --git a/src/java/org/apache/poi/hpsf/MutableSection.java b/src/java/org/apache/poi/hpsf/MutableSection.java index 1ba4221e47..3f7c01b3b0 100644 --- a/src/java/org/apache/poi/hpsf/MutableSection.java +++ b/src/java/org/apache/poi/hpsf/MutableSection.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.ByteArrayOutputStream; @@ -37,9 +37,6 @@ import org.apache.poi.util.LittleEndian; * *

Please be aware that this class' functionality will be merged into the * {@link Section} class at a later time, so the API will change.

- * - * @version $Id$ - * @since 2002-02-20 */ public class MutableSection extends Section { @@ -56,7 +53,7 @@ public class MutableSection extends Section * decision has been taken when specifying the "properties" field * as an Property[]. It should have been a {@link java.util.List}.

*/ - private List preprops; + private List preprops; @@ -77,17 +74,17 @@ public class MutableSection extends Section dirty = true; formatID = null; offset = -1; - preprops = new LinkedList(); + preprops = new LinkedList(); } /** - *

Constructs a MutableSection by doing a deep copy of an - * existing Section. All nested Property + *

Constructs a MutableSection by doing a deep copy of an + * existing Section. All nested Property * instances, will be their mutable counterparts in the new * MutableSection.

- * + * * @param s The section set to copy */ public MutableSection(final Section s) @@ -148,7 +145,7 @@ public class MutableSection extends Section public void setProperties(final Property[] properties) { this.properties = properties; - preprops = new LinkedList(); + preprops = new LinkedList(); for (int i = 0; i < properties.length; i++) preprops.add(properties[i]); dirty = true; @@ -185,7 +182,7 @@ public class MutableSection extends Section */ public void setProperty(final int id, final int value) { - setProperty(id, Variant.VT_I4, new Integer(value)); + setProperty(id, Variant.VT_I4, Integer.valueOf(value)); dirty = true; } @@ -202,7 +199,7 @@ public class MutableSection extends Section */ public void setProperty(final int id, final long value) { - setProperty(id, Variant.VT_I8, new Long(value)); + setProperty(id, Variant.VT_I8, Long.valueOf(value)); dirty = true; } @@ -219,7 +216,7 @@ public class MutableSection extends Section */ public void setProperty(final int id, final boolean value) { - setProperty(id, Variant.VT_BOOL, new Boolean(value)); + setProperty(id, Variant.VT_BOOL, Boolean.valueOf(value)); dirty = true; } @@ -279,8 +276,8 @@ public class MutableSection extends Section */ public void removeProperty(final long id) { - for (final Iterator i = preprops.iterator(); i.hasNext();) - if (((Property) i.next()).getID() == id) + for (final Iterator i = preprops.iterator(); i.hasNext();) + if (i.next().getID() == id) { i.remove(); break; @@ -303,7 +300,7 @@ public class MutableSection extends Section */ protected void setPropertyBooleanValue(final int id, final boolean value) { - setProperty(id, Variant.VT_BOOL, new Boolean(value)); + setProperty(id, Variant.VT_BOOL, Boolean.valueOf(value)); } @@ -342,10 +339,10 @@ public class MutableSection extends Section * properties) and the properties themselves.

* * @return the section's length in bytes. - * @throws WritingNotSupportedException - * @throws IOException + * @throws WritingNotSupportedException + * @throws IOException */ - private int calcSize() throws WritingNotSupportedException, IOException + private int calcSize() throws WritingNotSupportedException, IOException { final ByteArrayOutputStream out = new ByteArrayOutputStream(); write(out); @@ -360,7 +357,7 @@ public class MutableSection extends Section /** *

Writes this section into an output stream.

- * + * *

Internally this is done by writing into three byte array output * streams: one for the properties, one for the property list and one for * the section as such. The two former are appended to the latter when they @@ -393,7 +390,7 @@ public class MutableSection extends Section * "propertyListStream". */ final ByteArrayOutputStream propertyListStream = new ByteArrayOutputStream(); - + /* Maintain the current position in the list. */ int position = 0; @@ -421,17 +418,15 @@ public class MutableSection extends Section * dictionary is present. In order to cope with this problem we * add the codepage property and set it to Unicode. */ setProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, - new Integer(Constants.CP_UNICODE)); + Integer.valueOf(Constants.CP_UNICODE)); codepage = getCodepage(); } /* Sort the property list by their property IDs: */ - Collections.sort(preprops, new Comparator() + Collections.sort(preprops, new Comparator() { - public int compare(final Object o1, final Object o2) + public int compare(final Property p1, final Property p2) { - final Property p1 = (Property) o1; - final Property p2 = (Property) o2; if (p1.getID() < p2.getID()) return -1; else if (p1.getID() == p2.getID()) @@ -443,11 +438,11 @@ public class MutableSection extends Section /* Write the properties and the property list into their respective * streams: */ - for (final ListIterator i = preprops.listIterator(); i.hasNext();) + for (final ListIterator i = preprops.listIterator(); i.hasNext();) { final MutableProperty p = (MutableProperty) i.next(); final long id = p.getID(); - + /* Write the property list entry. */ TypeWriter.writeUIntToStream(propertyListStream, p.getID()); TypeWriter.writeUIntToStream(propertyListStream, position); @@ -475,17 +470,17 @@ public class MutableSection extends Section /* Write the section: */ byte[] pb1 = propertyListStream.toByteArray(); byte[] pb2 = propertyStream.toByteArray(); - + /* Write the section's length: */ TypeWriter.writeToStream(out, LittleEndian.INT_SIZE * 2 + pb1.length + pb2.length); - + /* Write the section's number of properties: */ TypeWriter.writeToStream(out, getPropertyCount()); - + /* Write the property list: */ out.write(pb1); - + /* Write the properties: */ out.write(pb2); @@ -505,14 +500,14 @@ public class MutableSection extends Section * @exception IOException if an I/O exception occurs. */ private static int writeDictionary(final OutputStream out, - final Map dictionary, final int codepage) + final Map dictionary, final int codepage) throws IOException { int length = TypeWriter.writeUIntToStream(out, dictionary.size()); - for (final Iterator i = dictionary.keySet().iterator(); i.hasNext();) + for (final Iterator i = dictionary.keySet().iterator(); i.hasNext();) { - final Long key = (Long) i.next(); - final String value = (String) dictionary.get(key); + final Long key = i.next(); + final String value = dictionary.get(key); if (codepage == Constants.CP_UNICODE) { @@ -565,7 +560,7 @@ public class MutableSection extends Section *

Overwrites the super class' method to cope with a redundancy: * the property count is maintained in a separate member variable, but * shouldn't.

- * + * * @return The number of properties in this section */ public int getPropertyCount() @@ -577,7 +572,7 @@ public class MutableSection extends Section /** *

Gets this section's properties.

- * + * * @return this section's properties. */ public Property[] getProperties() @@ -590,7 +585,7 @@ public class MutableSection extends Section /** *

Gets a property.

- * + * * @param id The ID of the property to get * @return The property or null if there is no such property */ @@ -614,27 +609,17 @@ public class MutableSection extends Section * method.

* * @param dictionary The dictionary - * + * * @exception IllegalPropertySetDataException if the dictionary's key and * value types are not correct. - * + * * @see Section#getDictionary() */ - public void setDictionary(final Map dictionary) + public void setDictionary(final Map dictionary) throws IllegalPropertySetDataException { if (dictionary != null) { - for (final Iterator i = dictionary.keySet().iterator(); - i.hasNext();) - if (!(i.next() instanceof Long)) - throw new IllegalPropertySetDataException - ("Dictionary keys must be of type Long."); - for (final Iterator i = dictionary.values().iterator(); - i.hasNext();) - if (!(i.next() instanceof String)) - throw new IllegalPropertySetDataException - ("Dictionary values must be of type String."); this.dictionary = dictionary; /* Set the dictionary property (ID 0). Please note that the second @@ -649,7 +634,7 @@ public class MutableSection extends Section (Integer) getProperty(PropertyIDMap.PID_CODEPAGE); if (codepage == null) setProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, - new Integer(Constants.CP_UNICODE)); + Integer.valueOf(Constants.CP_UNICODE)); } else /* Setting the dictionary to null means to remove property 0. @@ -661,7 +646,7 @@ public class MutableSection extends Section /** *

Sets a property.

- * + * * @param id The property ID. * @param value The property's value. The value's class must be one of those * supported by HPSF. @@ -710,7 +695,6 @@ public class MutableSection extends Section public void setCodepage(final int codepage) { setProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, - new Integer(codepage)); + Integer.valueOf(codepage)); } - } diff --git a/src/java/org/apache/poi/hpsf/NoFormatIDException.java b/src/java/org/apache/poi/hpsf/NoFormatIDException.java index 2e9f8f85b9..507aab38a0 100644 --- a/src/java/org/apache/poi/hpsf/NoFormatIDException.java +++ b/src/java/org/apache/poi/hpsf/NoFormatIDException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -25,8 +25,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-09-03 */ public class NoFormatIDException extends HPSFRuntimeException { diff --git a/src/java/org/apache/poi/hpsf/NoPropertySetStreamException.java b/src/java/org/apache/poi/hpsf/NoPropertySetStreamException.java index 4bf1f931e0..cd580fa287 100644 --- a/src/java/org/apache/poi/hpsf/NoPropertySetStreamException.java +++ b/src/java/org/apache/poi/hpsf/NoPropertySetStreamException.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -27,8 +26,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-02-09 */ public class NoPropertySetStreamException extends HPSFException { diff --git a/src/java/org/apache/poi/hpsf/NoSingleSectionException.java b/src/java/org/apache/poi/hpsf/NoSingleSectionException.java index e2feb74f40..46aa332b19 100644 --- a/src/java/org/apache/poi/hpsf/NoSingleSectionException.java +++ b/src/java/org/apache/poi/hpsf/NoSingleSectionException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -28,8 +28,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-02-09 */ public class NoSingleSectionException extends HPSFRuntimeException { diff --git a/src/java/org/apache/poi/hpsf/Property.java b/src/java/org/apache/poi/hpsf/Property.java index 16b4f7e41b..c06a807ef3 100644 --- a/src/java/org/apache/poi/hpsf/Property.java +++ b/src/java/org/apache/poi/hpsf/Property.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.UnsupportedEncodingException; @@ -46,7 +46,7 @@ import org.apache.poi.util.POILogger; * over time but largely depends on your feedback so that the POI team knows * which variant types are really needed. So please feel free to submit error * reports or patches for the types you need.

- * + * *

Microsoft documentation: * Property Set Display Name Dictionary. @@ -56,8 +56,6 @@ import org.apache.poi.util.POILogger; * @author Drew Varner (Drew.Varner InAndAround sc.edu) * @see Section * @see Variant - * @version $Id$ - * @since 2002-02-09 */ public class Property { @@ -112,7 +110,7 @@ public class Property /** *

Creates a property.

- * + * * @param id the property's ID. * @param type the property's type, see {@link Variant}. * @param value the property's value. Only certain types are allowed, see @@ -185,7 +183,7 @@ public class Property /** *

Reads a dictionary.

- * + * * @param src The byte array containing the bytes making out the dictionary. * @param offset At this offset within src the dictionary * starts. @@ -219,7 +217,7 @@ public class Property for (int i = 0; i < nrEntries; i++) { /* The key. */ - final Long id = new Long(LittleEndian.getUInt(src, o)); + final Long id = Long.valueOf(LittleEndian.getUInt(src, o)); o += LittleEndian.INT_SIZE; /* The value (a string). The length is the either the @@ -298,7 +296,7 @@ public class Property * 4.

* * @return the property's size in bytes - * + * * @exception WritingNotSupportedException if HPSF does not yet support the * property's variant type. */ @@ -339,13 +337,14 @@ public class Property * ID == 0 is a special case: It does not have a type, and its value is the * section's dictionary. Another special case are strings: Two properties * may have the different types Variant.VT_LPSTR and Variant.VT_LPWSTR;

- * + * * @see Object#equals(java.lang.Object) */ public boolean equals(final Object o) { - if (!(o instanceof Property)) + if (!(o instanceof Property)) { return false; + } final Property p = (Property) o; final Object pValue = p.getValue(); final long pId = p.getID(); @@ -357,8 +356,8 @@ public class Property return false; /* It's clear now that both values are non-null. */ - final Class valueClass = value.getClass(); - final Class pValueClass = pValue.getClass(); + final Class valueClass = value.getClass(); + final Class pValueClass = pValue.getClass(); if (!(valueClass.isAssignableFrom(pValueClass)) && !(pValueClass.isAssignableFrom(valueClass))) return false; @@ -375,10 +374,10 @@ public class Property { if (t1 == t2 || (t1 == Variant.VT_LPSTR && t2 == Variant.VT_LPWSTR) || - (t2 == Variant.VT_LPSTR && t1 == Variant.VT_LPWSTR)) + (t2 == Variant.VT_LPSTR && t1 == Variant.VT_LPWSTR)) { return true; - else - return false; + } + return false; } diff --git a/src/java/org/apache/poi/hpsf/PropertySet.java b/src/java/org/apache/poi/hpsf/PropertySet.java index b39ba08bfa..df918285cc 100644 --- a/src/java/org/apache/poi/hpsf/PropertySet.java +++ b/src/java/org/apache/poi/hpsf/PropertySet.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.IOException; @@ -57,8 +57,6 @@ import org.apache.poi.util.LittleEndian; * @author Rainer Klute <klute@rainer-klute.de> * @author Drew Varner (Drew.Varner hanginIn sc.edu) - * @version $Id$ - * @since 2002-02-09 */ public class PropertySet { diff --git a/src/java/org/apache/poi/hpsf/PropertySetFactory.java b/src/java/org/apache/poi/hpsf/PropertySetFactory.java index 1cd3dcdaf7..3d2611e849 100644 --- a/src/java/org/apache/poi/hpsf/PropertySetFactory.java +++ b/src/java/org/apache/poi/hpsf/PropertySetFactory.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.InputStream; @@ -30,8 +30,6 @@ import org.apache.poi.hpsf.wellknown.SectionIDMap; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-02-09 */ public class PropertySetFactory { diff --git a/src/java/org/apache/poi/hpsf/ReadingNotSupportedException.java b/src/java/org/apache/poi/hpsf/ReadingNotSupportedException.java index f325543c01..a66dc7c4f4 100644 --- a/src/java/org/apache/poi/hpsf/ReadingNotSupportedException.java +++ b/src/java/org/apache/poi/hpsf/ReadingNotSupportedException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -26,8 +26,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @since 2003-08-08 - * @version $Id$ */ public class ReadingNotSupportedException extends UnsupportedVariantTypeException diff --git a/src/java/org/apache/poi/hpsf/Section.java b/src/java/org/apache/poi/hpsf/Section.java index 76824e7b7e..2c49f02231 100644 --- a/src/java/org/apache/poi/hpsf/Section.java +++ b/src/java/org/apache/poi/hpsf/Section.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.UnsupportedEncodingException; @@ -34,8 +34,6 @@ import org.apache.poi.util.LittleEndian; * @author Rainer Klute <klute@rainer-klute.de> * @author Drew Varner (Drew.Varner allUpIn sc.edu) - * @version $Id$ - * @since 2002-02-09 */ public class Section { @@ -44,7 +42,7 @@ public class Section *

Maps property IDs to section-private PID strings. These * strings can be found in the property with ID 0.

*/ - protected Map dictionary; + protected Map dictionary; /** *

The section's format ID, {@link #getFormatID}.

@@ -148,7 +146,7 @@ public class Section * @param src Contains the complete property set stream. * @param offset The position in the stream that points to the * section's format ID. - * + * * @exception UnsupportedEncodingException if the section's codepage is not * supported. */ @@ -185,7 +183,7 @@ public class Section /* * Read the properties. The offset is positioned at the first * entry of the property list. There are two problems: - * + * * 1. For each property we have to find out its length. In the * property list we find each property's ID and its offset relative * to the section's beginning. Unfortunately the properties in the @@ -193,8 +191,8 @@ public class Section * possible to calculate the length as * (offset of property(i+1) - offset of property(i)). Before we can * that we first have to sort the property list by ascending offsets. - * - * 2. We have to read the property with ID 1 before we read other + * + * 2. We have to read the property with ID 1 before we read other * properties, at least before other properties containing strings. * The reason is that property 1 specifies the codepage. If it is * 1200, all strings are in Unicode. In other words: Before we can @@ -207,10 +205,10 @@ public class Section * seconds pass reads the other properties. */ properties = new Property[propertyCount]; - + /* Pass 1: Read the property list. */ int pass1Offset = o1; - final List propertyList = new ArrayList(propertyCount); + final List propertyList = new ArrayList(propertyCount); PropertyListEntry ple; for (int i = 0; i < properties.length; i++) { @@ -234,34 +232,22 @@ public class Section /* Calculate the properties' lengths. */ for (int i = 0; i < propertyCount - 1; i++) { - final PropertyListEntry ple1 = - (PropertyListEntry) propertyList.get(i); - final PropertyListEntry ple2 = - (PropertyListEntry) propertyList.get(i + 1); + PropertyListEntry ple1 = propertyList.get(i); + PropertyListEntry ple2 = propertyList.get(i + 1); ple1.length = ple2.offset - ple1.offset; } if (propertyCount > 0) { - ple = (PropertyListEntry) propertyList.get(propertyCount - 1); + ple = propertyList.get(propertyCount - 1); ple.length = size - ple.offset; - if (ple.length <= 0) - { - final StringBuffer b = new StringBuffer(); - b.append("The property set claims to have a size of "); - b.append(size); - b.append(" bytes. However, it exceeds "); - b.append(ple.offset); - b.append(" bytes."); - throw new IllegalPropertySetDataException(b.toString()); - } } /* Look for the codepage. */ int codepage = -1; - for (final Iterator i = propertyList.iterator(); + for (final Iterator i = propertyList.iterator(); codepage == -1 && i.hasNext();) { - ple = (PropertyListEntry) i.next(); + ple = i.next(); /* Read the codepage if the property ID is 1. */ if (ple.id == PropertyIDMap.PID_CODEPAGE) @@ -285,14 +271,14 @@ public class Section /* Pass 2: Read all properties - including the codepage property, * if available. */ int i1 = 0; - for (final Iterator i = propertyList.iterator(); i.hasNext();) + for (final Iterator i = propertyList.iterator(); i.hasNext();) { - ple = (PropertyListEntry) i.next(); + ple = i.next(); Property p = new Property(ple.id, src, this.offset + ple.offset, ple.length, codepage); if (p.getID() == PropertyIDMap.PID_CODEPAGE) - p = new Property(p.getID(), p.getType(), new Integer(codepage)); + p = new Property(p.getID(), p.getType(), Integer.valueOf(codepage)); properties[i1++] = p; } @@ -308,7 +294,7 @@ public class Section *

Represents an entry in the property list and holds a property's ID and * its offset from the section's beginning.

*/ - class PropertyListEntry implements Comparable + class PropertyListEntry implements Comparable { int id; int offset; @@ -321,11 +307,9 @@ public class Section * * @see Comparable#compareTo(java.lang.Object) */ - public int compareTo(final Object o) + public int compareTo(final PropertyListEntry o) { - if (!(o instanceof PropertyListEntry)) - throw new ClassCastException(o.toString()); - final int otherOffset = ((PropertyListEntry) o).offset; + final int otherOffset = o.offset; if (offset < otherOffset) return -1; else if (offset == otherOffset) @@ -414,11 +398,11 @@ public class Section protected boolean getPropertyBooleanValue(final int id) { final Boolean b = (Boolean) getProperty(id); - if (b != null) - return b.booleanValue(); - else + if (b == null) { return false; } + return b.booleanValue(); + } @@ -464,7 +448,7 @@ public class Section { String s = null; if (dictionary != null) - s = (String) dictionary.get(new Long(pid)); + s = (String) dictionary.get(Long.valueOf(pid)); if (s == null) s = SectionIDMap.getPIDString(getFormatID().getBytes(), pid); if (s == null) @@ -477,23 +461,23 @@ public class Section /** *

Checks whether this section is equal to another object. The result is * false if one of the the following conditions holds:

- * + * *
    - * + * *
  • The other object is not a {@link Section}.

  • - * + * *
  • The format IDs of the two sections are not equal.

  • - * + * *
  • The sections have a different number of properties. However, * properties with ID 1 (codepage) are not counted.

  • - * + * *
  • The other object is not a {@link Section}.

  • - * + * *
  • The properties have different values. The order of the properties * is irrelevant.

  • - * + * *
- * + * * @param o The object to compare this section with * @return true if the objects are equal, false if * not @@ -506,7 +490,7 @@ public class Section if (!s.getFormatID().equals(getFormatID())) return false; - /* Compare all properties except 0 and 1 as they must be handled + /* Compare all properties except 0 and 1 as they must be handled * specially. */ Property[] pa1 = new Property[getProperties().length]; Property[] pa2 = new Property[s.getProperties().length]; @@ -561,10 +545,10 @@ public class Section dictionaryEqual = p10.getValue().equals(p20.getValue()); else if (p10 != null || p20 != null) dictionaryEqual = false; - if (!dictionaryEqual) - return false; - else + if (dictionaryEqual) { return Util.equals(pa1, pa2); + } + return false; } @@ -573,7 +557,7 @@ public class Section *

Removes a field from a property array. The resulting array is * compactified and returned.

* - * @param pa The property array. + * @param pa The property array. * @param i The index of the field to be removed. * @return the compactified array. */ @@ -644,7 +628,7 @@ public class Section * @return the dictionary or null if the section does not have * a dictionary. */ - public Map getDictionary() + public Map getDictionary() { return dictionary; } diff --git a/src/java/org/apache/poi/hpsf/SpecialPropertySet.java b/src/java/org/apache/poi/hpsf/SpecialPropertySet.java index f415bd5d12..2d04ef6d8e 100644 --- a/src/java/org/apache/poi/hpsf/SpecialPropertySet.java +++ b/src/java/org/apache/poi/hpsf/SpecialPropertySet.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.IOException; @@ -53,8 +53,6 @@ import org.apache.poi.poifs.filesystem.DirectoryEntry; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-02-09 */ public abstract class SpecialPropertySet extends MutablePropertySet { diff --git a/src/java/org/apache/poi/hpsf/SummaryInformation.java b/src/java/org/apache/poi/hpsf/SummaryInformation.java index a143e2bad0..31eaa60574 100644 --- a/src/java/org/apache/poi/hpsf/SummaryInformation.java +++ b/src/java/org/apache/poi/hpsf/SummaryInformation.java @@ -24,15 +24,12 @@ import org.apache.poi.hpsf.wellknown.PropertyIDMap; /** *

Convenience class representing a Summary Information stream in a * Microsoft Office document.

- * + * * @author Rainer Klute <klute@rainer-klute.de> * @see DocumentSummaryInformation - * @version $Id$ - * @since 2002-02-09 */ -public class SummaryInformation extends SpecialPropertySet -{ +public final class SummaryInformation extends SpecialPropertySet { /** *

The document name a summary information stream usually has in a POIFS @@ -48,7 +45,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Creates a {@link SummaryInformation} from a given {@link * PropertySet}.

- * + * * @param ps A property set which should be created from a summary * information stream. * @throws UnexpectedPropertySetTypeException if ps does not @@ -67,7 +64,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the title (or null).

- * + * * @return The title or null */ public String getTitle() @@ -79,7 +76,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the title.

- * + * * @param title The title to set. */ public void setTitle(final String title) @@ -103,7 +100,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the subject (or null).

- * + * * @return The subject or null */ public String getSubject() @@ -115,7 +112,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the subject.

- * + * * @param subject The subject to set. */ public void setSubject(final String subject) @@ -139,7 +136,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the author (or null).

- * + * * @return The author or null */ public String getAuthor() @@ -151,7 +148,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the author.

- * + * * @param author The author to set. */ public void setAuthor(final String author) @@ -175,7 +172,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the keywords (or null).

- * + * * @return The keywords or null */ public String getKeywords() @@ -187,7 +184,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the keywords.

- * + * * @param keywords The keywords to set. */ public void setKeywords(final String keywords) @@ -211,7 +208,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the comments (or null).

- * + * * @return The comments or null */ public String getComments() @@ -223,7 +220,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the comments.

- * + * * @param comments The comments to set. */ public void setComments(final String comments) @@ -247,7 +244,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the template (or null).

- * + * * @return The template or null */ public String getTemplate() @@ -259,7 +256,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the template.

- * + * * @param template The template to set. */ public void setTemplate(final String template) @@ -283,7 +280,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the last author (or null).

- * + * * @return The last author or null */ public String getLastAuthor() @@ -295,7 +292,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the last author.

- * + * * @param lastAuthor The last author to set. */ public void setLastAuthor(final String lastAuthor) @@ -319,7 +316,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the revision number (or null).

- * + * * @return The revision number or null */ public String getRevNumber() @@ -331,7 +328,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the revision number.

- * + * * @param revNumber The revision number to set. */ public void setRevNumber(final String revNumber) @@ -356,24 +353,24 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the total time spent in editing the document (or * 0).

- * + * * @return The total time spent in editing the document or 0 if the {@link * SummaryInformation} does not contain this information. */ public long getEditTime() { final Date d = (Date) getProperty(PropertyIDMap.PID_EDITTIME); - if (d == null) + if (d == null) { return 0; - else - return Util.dateToFileTime(d); + } + return Util.dateToFileTime(d); } /** *

Sets the total time spent in editing the document.

- * + * * @param time The time to set. */ public void setEditTime(final long time) @@ -398,7 +395,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the last printed time (or null).

- * + * * @return The last printed time or null */ public Date getLastPrinted() @@ -410,7 +407,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the lastPrinted.

- * + * * @param lastPrinted The lastPrinted to set. */ public void setLastPrinted(final Date lastPrinted) @@ -435,7 +432,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the creation time (or null).

- * + * * @return The creation time or null */ public Date getCreateDateTime() @@ -447,7 +444,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the creation time.

- * + * * @param createDateTime The creation time to set. */ public void setCreateDateTime(final Date createDateTime) @@ -472,7 +469,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the last save time (or null).

- * + * * @return The last save time or null */ public Date getLastSaveDateTime() @@ -484,7 +481,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the total time spent in editing the document.

- * + * * @param time The time to set. */ public void setLastSaveDateTime(final Date time) @@ -511,7 +508,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the page count or 0 if the {@link SummaryInformation} does * not contain a page count.

- * + * * @return The page count or 0 if the {@link SummaryInformation} does not * contain a page count. */ @@ -524,7 +521,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the page count.

- * + * * @param pageCount The page count to set. */ public void setPageCount(final int pageCount) @@ -549,7 +546,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the word count or 0 if the {@link SummaryInformation} does * not contain a word count.

- * + * * @return The word count or null */ public int getWordCount() @@ -561,7 +558,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the word count.

- * + * * @param wordCount The word count to set. */ public void setWordCount(final int wordCount) @@ -586,7 +583,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the character count or 0 if the {@link SummaryInformation} * does not contain a char count.

- * + * * @return The character count or null */ public int getCharCount() @@ -598,7 +595,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the character count.

- * + * * @param charCount The character count to set. */ public void setCharCount(final int charCount) @@ -624,12 +621,12 @@ public class SummaryInformation extends SpecialPropertySet *

Returns the thumbnail (or null) when this * method is implemented. Please note that the return type is likely to * change!

- * + * *

Hint to developers: Drew Varner <Drew.Varner * -at- sc.edu> said that this is an image in WMF or Clipboard (BMP?) * format. However, we won't do any conversion into any image type but * instead just return a byte array.

- * + * * @return The thumbnail or null */ public byte[] getThumbnail() @@ -641,7 +638,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the thumbnail.

- * + * * @param thumbnail The thumbnail to set. */ public void setThumbnail(final byte[] thumbnail) @@ -666,7 +663,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns the application name (or null).

- * + * * @return The application name or null */ public String getApplicationName() @@ -678,7 +675,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the application name.

- * + * * @param applicationName The application name to set. */ public void setApplicationName(final String applicationName) @@ -702,24 +699,24 @@ public class SummaryInformation extends SpecialPropertySet /** *

Returns a security code which is one of the following values:

- * + * *
    - * + * *
  • 0 if the {@link SummaryInformation} does not contain a * security field or if there is no security on the document. Use * {@link PropertySet#wasNull()} to distinguish between the two * cases!

  • - * + * *
  • 1 if the document is password protected

  • - * + * *
  • 2 if the document is read-only recommended

  • - * + * *
  • 4 if the document is read-only enforced

  • - * + * *
  • 8 if the document is locked for annotations

  • - * + * *
- * + * * @return The security code or null */ public int getSecurity() @@ -731,7 +728,7 @@ public class SummaryInformation extends SpecialPropertySet /** *

Sets the security code.

- * + * * @param security The security code to set. */ public void setSecurity(final int security) diff --git a/src/java/org/apache/poi/hpsf/Thumbnail.java b/src/java/org/apache/poi/hpsf/Thumbnail.java index 9959a64f40..c39abe0a9e 100644 --- a/src/java/org/apache/poi/hpsf/Thumbnail.java +++ b/src/java/org/apache/poi/hpsf/Thumbnail.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import org.apache.poi.util.LittleEndian; @@ -24,11 +24,8 @@ import org.apache.poi.util.LittleEndian; * * @author Drew Varner (Drew.Varner inOrAround sc.edu) * @see SummaryInformation#getThumbnail() - * @version $Id$ - * @since 2002-04-29 */ -public class Thumbnail -{ +public final class Thumbnail { /** *

Offset in bytes where the Clipboard Format Tag starts in the @@ -130,7 +127,7 @@ public class Thumbnail *

A byte[] to hold a thumbnail image in ({@link * Variant#VT_CF VT_CF}) format.

*/ - private byte[] thumbnailData = null; + private byte[] _thumbnailData = null; @@ -156,7 +153,7 @@ public class Thumbnail */ public Thumbnail(final byte[] thumbnailData) { - this.thumbnailData = thumbnailData; + this._thumbnailData = thumbnailData; } @@ -170,7 +167,7 @@ public class Thumbnail */ public byte[] getThumbnail() { - return thumbnailData; + return _thumbnailData; } @@ -184,7 +181,7 @@ public class Thumbnail */ public void setThumbnail(final byte[] thumbnail) { - this.thumbnailData = thumbnail; + this._thumbnailData = thumbnail; } @@ -263,21 +260,18 @@ public class Thumbnail if (!(getClipboardFormatTag() == CFTAG_WINDOWS)) throw new HPSFException("Clipboard Format Tag of Thumbnail must " + "be CFTAG_WINDOWS."); - if (!(getClipboardFormat() == CF_METAFILEPICT)) + if (!(getClipboardFormat() == CF_METAFILEPICT)) { throw new HPSFException("Clipboard Format of Thumbnail must " + "be CF_METAFILEPICT."); - else - { - byte[] thumbnail = getThumbnail(); - int wmfImageLength = thumbnail.length - OFFSET_WMFDATA; - byte[] wmfImage = new byte[wmfImageLength]; - System.arraycopy(thumbnail, - OFFSET_WMFDATA, - wmfImage, - 0, - wmfImageLength); - return wmfImage; } + byte[] thumbnail = getThumbnail(); + int wmfImageLength = thumbnail.length - OFFSET_WMFDATA; + byte[] wmfImage = new byte[wmfImageLength]; + System.arraycopy(thumbnail, + OFFSET_WMFDATA, + wmfImage, + 0, + wmfImageLength); + return wmfImage; } - } diff --git a/src/java/org/apache/poi/hpsf/TypeWriter.java b/src/java/org/apache/poi/hpsf/TypeWriter.java index bd7f346147..84269ab333 100644 --- a/src/java/org/apache/poi/hpsf/TypeWriter.java +++ b/src/java/org/apache/poi/hpsf/TypeWriter.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.IOException; @@ -27,8 +27,6 @@ import org.apache.poi.util.LittleEndian; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2003-02-20 */ public class TypeWriter { diff --git a/src/java/org/apache/poi/hpsf/UnexpectedPropertySetTypeException.java b/src/java/org/apache/poi/hpsf/UnexpectedPropertySetTypeException.java index 2a56fdaaea..de635d61b3 100644 --- a/src/java/org/apache/poi/hpsf/UnexpectedPropertySetTypeException.java +++ b/src/java/org/apache/poi/hpsf/UnexpectedPropertySetTypeException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -27,8 +27,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @version $Id$ - * @since 2002-02-09 */ public class UnexpectedPropertySetTypeException extends HPSFException { diff --git a/src/java/org/apache/poi/hpsf/UnsupportedVariantTypeException.java b/src/java/org/apache/poi/hpsf/UnsupportedVariantTypeException.java index 49ca914591..125f7046f2 100644 --- a/src/java/org/apache/poi/hpsf/UnsupportedVariantTypeException.java +++ b/src/java/org/apache/poi/hpsf/UnsupportedVariantTypeException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import org.apache.poi.util.HexDump; @@ -28,8 +28,6 @@ import org.apache.poi.util.HexDump; * * @author Rainer Klute <klute@rainer-klute.de> - * @since 2003-08-05 - * @version $Id$ */ public abstract class UnsupportedVariantTypeException extends VariantTypeException diff --git a/src/java/org/apache/poi/hpsf/Util.java b/src/java/org/apache/poi/hpsf/Util.java index 85ea0ea095..62a384a3dd 100644 --- a/src/java/org/apache/poi/hpsf/Util.java +++ b/src/java/org/apache/poi/hpsf/Util.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.io.IOException; @@ -27,8 +27,6 @@ import java.util.Date; *

Provides various static utility methods.

* * @author Rainer Klute (klute@rainer-klute.de) - * @version $Id$ - * @since 2002-02-09 */ public class Util { @@ -179,7 +177,7 @@ public class Util * * @param date The date to be converted * @return The filetime - * + * * @see #filetimeToDate(long) * @see #filetimeToDate(int, int) */ @@ -213,10 +211,10 @@ public class Util * @return true if the collections are equal, else * false. */ - public static boolean equals(final Collection c1, final Collection c2) + public static boolean equals(Collection c1, Collection c2) { - final Object[] o1 = c1.toArray(); - final Object[] o2 = c2.toArray(); + Object[] o1 = c1.toArray(); + Object[] o2 = c2.toArray(); return internalEquals(o1, o2); } @@ -231,14 +229,14 @@ public class Util * @return true if the object arrays are equal, * false if they are not. */ - public static boolean equals(final Object[] c1, final Object[] c2) + public static boolean equals(Object[] c1, Object[] c2) { - final Object[] o1 = (Object[]) c1.clone(); - final Object[] o2 = (Object[]) c2.clone(); + final Object[] o1 = c1.clone(); + final Object[] o2 = c2.clone(); return internalEquals(o1, o2); } - private static boolean internalEquals(final Object[] o1, final Object[] o2) + private static boolean internalEquals(Object[] o1, Object[] o2) { for (int i1 = 0; i1 < o1.length; i1++) { @@ -328,9 +326,9 @@ public class Util /** *

Returns a textual representation of a {@link Throwable}, including a * stacktrace.

- * + * * @param t The {@link Throwable} - * + * * @return a string containing the output of a call to * t.printStacktrace(). */ diff --git a/src/java/org/apache/poi/hpsf/Variant.java b/src/java/org/apache/poi/hpsf/Variant.java index 43660043c1..a37cbf0479 100644 --- a/src/java/org/apache/poi/hpsf/Variant.java +++ b/src/java/org/apache/poi/hpsf/Variant.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; import java.util.Collections; @@ -34,8 +34,6 @@ import java.util.Map; * [S] - may appear in a Safe Array.

* * @author Rainer Klute (klute@rainer-klute.de) - * @version $Id$ - * @since 2002-02-09 */ public class Variant { @@ -353,32 +351,32 @@ public class Variant /** *

Denotes a variant type with a length that is unknown to HPSF yet.

*/ - public static final Integer LENGTH_UNKNOWN = new Integer(-2); + public static final Integer LENGTH_UNKNOWN = Integer.valueOf(-2); /** *

Denotes a variant type with a variable length.

*/ - public static final Integer LENGTH_VARIABLE = new Integer(-1); + public static final Integer LENGTH_VARIABLE = Integer.valueOf(-1); /** *

Denotes a variant type with a length of 0 bytes.

*/ - public static final Integer LENGTH_0 = new Integer(0); + public static final Integer LENGTH_0 = Integer.valueOf(0); /** *

Denotes a variant type with a length of 2 bytes.

*/ - public static final Integer LENGTH_2 = new Integer(2); + public static final Integer LENGTH_2 = Integer.valueOf(2); /** *

Denotes a variant type with a length of 4 bytes.

*/ - public static final Integer LENGTH_4 = new Integer(4); + public static final Integer LENGTH_4 = Integer.valueOf(4); /** *

Denotes a variant type with a length of 8 bytes.

*/ - public static final Integer LENGTH_8 = new Integer(8); + public static final Integer LENGTH_8 = Integer.valueOf(8); @@ -386,92 +384,92 @@ public class Variant { /* Initialize the number-to-name map: */ Map tm1 = new HashMap(); - tm1.put(new Long(0), "VT_EMPTY"); - tm1.put(new Long(1), "VT_NULL"); - tm1.put(new Long(2), "VT_I2"); - tm1.put(new Long(3), "VT_I4"); - tm1.put(new Long(4), "VT_R4"); - tm1.put(new Long(5), "VT_R8"); - tm1.put(new Long(6), "VT_CY"); - tm1.put(new Long(7), "VT_DATE"); - tm1.put(new Long(8), "VT_BSTR"); - tm1.put(new Long(9), "VT_DISPATCH"); - tm1.put(new Long(10), "VT_ERROR"); - tm1.put(new Long(11), "VT_BOOL"); - tm1.put(new Long(12), "VT_VARIANT"); - tm1.put(new Long(13), "VT_UNKNOWN"); - tm1.put(new Long(14), "VT_DECIMAL"); - tm1.put(new Long(16), "VT_I1"); - tm1.put(new Long(17), "VT_UI1"); - tm1.put(new Long(18), "VT_UI2"); - tm1.put(new Long(19), "VT_UI4"); - tm1.put(new Long(20), "VT_I8"); - tm1.put(new Long(21), "VT_UI8"); - tm1.put(new Long(22), "VT_INT"); - tm1.put(new Long(23), "VT_UINT"); - tm1.put(new Long(24), "VT_VOID"); - tm1.put(new Long(25), "VT_HRESULT"); - tm1.put(new Long(26), "VT_PTR"); - tm1.put(new Long(27), "VT_SAFEARRAY"); - tm1.put(new Long(28), "VT_CARRAY"); - tm1.put(new Long(29), "VT_USERDEFINED"); - tm1.put(new Long(30), "VT_LPSTR"); - tm1.put(new Long(31), "VT_LPWSTR"); - tm1.put(new Long(64), "VT_FILETIME"); - tm1.put(new Long(65), "VT_BLOB"); - tm1.put(new Long(66), "VT_STREAM"); - tm1.put(new Long(67), "VT_STORAGE"); - tm1.put(new Long(68), "VT_STREAMED_OBJECT"); - tm1.put(new Long(69), "VT_STORED_OBJECT"); - tm1.put(new Long(70), "VT_BLOB_OBJECT"); - tm1.put(new Long(71), "VT_CF"); - tm1.put(new Long(72), "VT_CLSID"); + tm1.put(Long.valueOf(0), "VT_EMPTY"); + tm1.put(Long.valueOf(1), "VT_NULL"); + tm1.put(Long.valueOf(2), "VT_I2"); + tm1.put(Long.valueOf(3), "VT_I4"); + tm1.put(Long.valueOf(4), "VT_R4"); + tm1.put(Long.valueOf(5), "VT_R8"); + tm1.put(Long.valueOf(6), "VT_CY"); + tm1.put(Long.valueOf(7), "VT_DATE"); + tm1.put(Long.valueOf(8), "VT_BSTR"); + tm1.put(Long.valueOf(9), "VT_DISPATCH"); + tm1.put(Long.valueOf(10), "VT_ERROR"); + tm1.put(Long.valueOf(11), "VT_BOOL"); + tm1.put(Long.valueOf(12), "VT_VARIANT"); + tm1.put(Long.valueOf(13), "VT_UNKNOWN"); + tm1.put(Long.valueOf(14), "VT_DECIMAL"); + tm1.put(Long.valueOf(16), "VT_I1"); + tm1.put(Long.valueOf(17), "VT_UI1"); + tm1.put(Long.valueOf(18), "VT_UI2"); + tm1.put(Long.valueOf(19), "VT_UI4"); + tm1.put(Long.valueOf(20), "VT_I8"); + tm1.put(Long.valueOf(21), "VT_UI8"); + tm1.put(Long.valueOf(22), "VT_INT"); + tm1.put(Long.valueOf(23), "VT_UINT"); + tm1.put(Long.valueOf(24), "VT_VOID"); + tm1.put(Long.valueOf(25), "VT_HRESULT"); + tm1.put(Long.valueOf(26), "VT_PTR"); + tm1.put(Long.valueOf(27), "VT_SAFEARRAY"); + tm1.put(Long.valueOf(28), "VT_CARRAY"); + tm1.put(Long.valueOf(29), "VT_USERDEFINED"); + tm1.put(Long.valueOf(30), "VT_LPSTR"); + tm1.put(Long.valueOf(31), "VT_LPWSTR"); + tm1.put(Long.valueOf(64), "VT_FILETIME"); + tm1.put(Long.valueOf(65), "VT_BLOB"); + tm1.put(Long.valueOf(66), "VT_STREAM"); + tm1.put(Long.valueOf(67), "VT_STORAGE"); + tm1.put(Long.valueOf(68), "VT_STREAMED_OBJECT"); + tm1.put(Long.valueOf(69), "VT_STORED_OBJECT"); + tm1.put(Long.valueOf(70), "VT_BLOB_OBJECT"); + tm1.put(Long.valueOf(71), "VT_CF"); + tm1.put(Long.valueOf(72), "VT_CLSID"); Map tm2 = new HashMap(tm1.size(), 1.0F); tm2.putAll(tm1); numberToName = Collections.unmodifiableMap(tm2); /* Initialize the number-to-length map: */ tm1.clear(); - tm1.put(new Long(0), LENGTH_0); - tm1.put(new Long(1), LENGTH_UNKNOWN); - tm1.put(new Long(2), LENGTH_2); - tm1.put(new Long(3), LENGTH_4); - tm1.put(new Long(4), LENGTH_4); - tm1.put(new Long(5), LENGTH_8); - tm1.put(new Long(6), LENGTH_UNKNOWN); - tm1.put(new Long(7), LENGTH_UNKNOWN); - tm1.put(new Long(8), LENGTH_UNKNOWN); - tm1.put(new Long(9), LENGTH_UNKNOWN); - tm1.put(new Long(10), LENGTH_UNKNOWN); - tm1.put(new Long(11), LENGTH_UNKNOWN); - tm1.put(new Long(12), LENGTH_UNKNOWN); - tm1.put(new Long(13), LENGTH_UNKNOWN); - tm1.put(new Long(14), LENGTH_UNKNOWN); - tm1.put(new Long(16), LENGTH_UNKNOWN); - tm1.put(new Long(17), LENGTH_UNKNOWN); - tm1.put(new Long(18), LENGTH_UNKNOWN); - tm1.put(new Long(19), LENGTH_UNKNOWN); - tm1.put(new Long(20), LENGTH_UNKNOWN); - tm1.put(new Long(21), LENGTH_UNKNOWN); - tm1.put(new Long(22), LENGTH_UNKNOWN); - tm1.put(new Long(23), LENGTH_UNKNOWN); - tm1.put(new Long(24), LENGTH_UNKNOWN); - tm1.put(new Long(25), LENGTH_UNKNOWN); - tm1.put(new Long(26), LENGTH_UNKNOWN); - tm1.put(new Long(27), LENGTH_UNKNOWN); - tm1.put(new Long(28), LENGTH_UNKNOWN); - tm1.put(new Long(29), LENGTH_UNKNOWN); - tm1.put(new Long(30), LENGTH_VARIABLE); - tm1.put(new Long(31), LENGTH_UNKNOWN); - tm1.put(new Long(64), LENGTH_8); - tm1.put(new Long(65), LENGTH_UNKNOWN); - tm1.put(new Long(66), LENGTH_UNKNOWN); - tm1.put(new Long(67), LENGTH_UNKNOWN); - tm1.put(new Long(68), LENGTH_UNKNOWN); - tm1.put(new Long(69), LENGTH_UNKNOWN); - tm1.put(new Long(70), LENGTH_UNKNOWN); - tm1.put(new Long(71), LENGTH_UNKNOWN); - tm1.put(new Long(72), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(0), LENGTH_0); + tm1.put(Long.valueOf(1), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(2), LENGTH_2); + tm1.put(Long.valueOf(3), LENGTH_4); + tm1.put(Long.valueOf(4), LENGTH_4); + tm1.put(Long.valueOf(5), LENGTH_8); + tm1.put(Long.valueOf(6), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(7), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(8), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(9), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(10), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(11), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(12), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(13), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(14), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(16), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(17), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(18), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(19), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(20), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(21), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(22), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(23), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(24), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(25), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(26), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(27), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(28), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(29), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(30), LENGTH_VARIABLE); + tm1.put(Long.valueOf(31), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(64), LENGTH_8); + tm1.put(Long.valueOf(65), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(66), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(67), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(68), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(69), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(70), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(71), LENGTH_UNKNOWN); + tm1.put(Long.valueOf(72), LENGTH_UNKNOWN); tm2 = new HashMap(tm1.size(), 1.0F); tm2.putAll(tm1); numberToLength = Collections.unmodifiableMap(tm2); @@ -488,7 +486,7 @@ public class Variant */ public static String getVariantName(final long variantType) { - final String name = (String) numberToName.get(new Long(variantType)); + final String name = (String) numberToName.get(Long.valueOf(variantType)); return name != null ? name : "unknown variant type"; } @@ -503,7 +501,7 @@ public class Variant */ public static int getVariantLength(final long variantType) { - final Long key = new Long((int) variantType); + final Long key = Long.valueOf((int) variantType); final Long length = (Long) numberToLength.get(key); if (length == null) return -2; diff --git a/src/java/org/apache/poi/hpsf/VariantSupport.java b/src/java/org/apache/poi/hpsf/VariantSupport.java index 703e8abe8d..c01b3c57c5 100644 --- a/src/java/org/apache/poi/hpsf/VariantSupport.java +++ b/src/java/org/apache/poi/hpsf/VariantSupport.java @@ -29,10 +29,10 @@ import org.apache.poi.util.LittleEndianConsts; /** *

Supports reading and writing of variant data.

- * + * *

FIXME (3): Reading and writing should be made more * uniform than it is now. The following items should be resolved: - * + * *

    * *
  • Reading requires a length parameter that is 4 byte greater than the @@ -45,8 +45,6 @@ import org.apache.poi.util.LittleEndianConsts; * * @author Rainer Klute <klute@rainer-klute.de> - * @since 2003-08-08 - * @version $Id$ */ public class VariantSupport extends Variant { @@ -70,7 +68,7 @@ public class VariantSupport extends Variant * on or off.

    * * @return true if logging is turned on, else - * false. + * false. */ public static boolean isLogUnsupportedTypes() { @@ -99,7 +97,7 @@ public class VariantSupport extends Variant { if (unsupportedMessage == null) unsupportedMessage = new LinkedList(); - Long vt = new Long(ex.getVariantType()); + Long vt = Long.valueOf(ex.getVariantType()); if (!unsupportedMessage.contains(vt)) { System.err.println(ex.getMessage()); @@ -123,7 +121,7 @@ public class VariantSupport extends Variant *

    Checks whether HPSF supports the specified variant type. Unsupported * types should be implemented included in the {@link #SUPPORTED_TYPES} * array.

    - * + * * @see Variant * @param variantType the variant type to check * @return true if HPFS supports this type, else @@ -141,7 +139,7 @@ public class VariantSupport extends Variant /** *

    Reads a variant type from a byte array.

    - * + * * @param src The byte array * @param offset The offset in the byte array where the variant starts * @param length The length of the variant including the variant type field @@ -184,7 +182,7 @@ public class VariantSupport extends Variant * Read a short. In Java it is represented as an * Integer object. */ - value = new Integer(LittleEndian.getShort(src, o1)); + value = Integer.valueOf(LittleEndian.getShort(src, o1)); break; } case Variant.VT_I4: @@ -193,7 +191,7 @@ public class VariantSupport extends Variant * Read a word. In Java it is represented as an * Integer object. */ - value = new Integer(LittleEndian.getInt(src, o1)); + value = Integer.valueOf(LittleEndian.getInt(src, o1)); break; } case Variant.VT_I8: @@ -202,7 +200,7 @@ public class VariantSupport extends Variant * Read a double word. In Java it is represented as a * Long object. */ - value = new Long(LittleEndian.getLong(src, o1)); + value = Long.valueOf(LittleEndian.getLong(src, o1)); break; } case Variant.VT_R8: @@ -274,9 +272,20 @@ public class VariantSupport extends Variant } case Variant.VT_CF: { + if(l1 < 0) { + /** + * YK: reading the ClipboardData packet (VT_CF) is not quite correct. + * The size of the data is determined by the first four bytes of the packet + * while the current implementation calculates it in the Section constructor. + * Test files in Bugzilla 42726 and 45583 clearly show that this approach does not always work. + * The workaround below attempts to gracefully handle such cases instead of throwing exceptions. + * + * August 20, 2009 + */ + l1 = LittleEndian.getInt(src, o1); o1 += LittleEndian.INT_SIZE; + } final byte[] v = new byte[l1]; - for (int i = 0; i < l1; i++) - v[i] = src[(o1 + i)]; + System.arraycopy(src, o1, v, 0, v.length); value = v; break; } @@ -309,16 +318,16 @@ public class VariantSupport extends Variant /** - *

    Turns a codepage number into the equivalent character encoding's + *

    Turns a codepage number into the equivalent character encoding's * name.

    * * @param codepage The codepage number - * - * @return The character encoding's name. If the codepage number is 65001, + * + * @return The character encoding's name. If the codepage number is 65001, * the encoding name is "UTF-8". All other positive numbers are mapped to - * "cp" followed by the number, e.g. if the codepage number is 1252 the + * "cp" followed by the number, e.g. if the codepage number is 1252 the * returned character encoding name will be "cp1252". - * + * * @exception UnsupportedEncodingException if the specified codepage is * less than zero. */ @@ -491,7 +500,7 @@ public class VariantSupport extends Variant } case Variant.VT_LPWSTR: { - final int nrOfChars = ((String) value).length() + 1; + final int nrOfChars = ((String) value).length() + 1; length += TypeWriter.writeUIntToStream(out, nrOfChars); char[] s = Util.pad4((String) value); for (int i = 0; i < s.length; i++) @@ -511,7 +520,7 @@ public class VariantSupport extends Variant } case Variant.VT_CF: { - final byte[] b = (byte[]) value; + final byte[] b = (byte[]) value; out.write(b); length = b.length; break; @@ -537,7 +546,7 @@ public class VariantSupport extends Variant + value.getClass().toString() + ", " + value.toString()); } - length += TypeWriter.writeToStream(out, + length += TypeWriter.writeToStream(out, ((Integer) value).intValue()); break; } @@ -549,7 +558,7 @@ public class VariantSupport extends Variant } case Variant.VT_R8: { - length += TypeWriter.writeToStream(out, + length += TypeWriter.writeToStream(out, ((Double) value).doubleValue()); break; } @@ -570,7 +579,7 @@ public class VariantSupport extends Variant * is a byte array we can write it nevertheless. */ if (value instanceof byte[]) { - final byte[] b = (byte[]) value; + final byte[] b = (byte[]) value; out.write(b); length = b.length; writeUnsupportedTypeMessage @@ -584,5 +593,4 @@ public class VariantSupport extends Variant return length; } - } diff --git a/src/java/org/apache/poi/hpsf/VariantTypeException.java b/src/java/org/apache/poi/hpsf/VariantTypeException.java index 0f35a887d5..58100bd074 100644 --- a/src/java/org/apache/poi/hpsf/VariantTypeException.java +++ b/src/java/org/apache/poi/hpsf/VariantTypeException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -23,8 +23,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @since 2004-06-21 - * @version $Id$ */ public abstract class VariantTypeException extends HPSFException { diff --git a/src/java/org/apache/poi/hpsf/WritingNotSupportedException.java b/src/java/org/apache/poi/hpsf/WritingNotSupportedException.java index 91fcbf16ef..e602478ab8 100644 --- a/src/java/org/apache/poi/hpsf/WritingNotSupportedException.java +++ b/src/java/org/apache/poi/hpsf/WritingNotSupportedException.java @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hpsf; /** @@ -26,8 +26,6 @@ package org.apache.poi.hpsf; * * @author Rainer Klute <klute@rainer-klute.de> - * @since 2003-08-08 - * @version $Id$ */ public class WritingNotSupportedException extends UnsupportedVariantTypeException diff --git a/src/java/org/apache/poi/hpsf/extractor/HPSFPropertiesExtractor.java b/src/java/org/apache/poi/hpsf/extractor/HPSFPropertiesExtractor.java index ecad5c05be..32f9049639 100644 --- a/src/java/org/apache/poi/hpsf/extractor/HPSFPropertiesExtractor.java +++ b/src/java/org/apache/poi/hpsf/extractor/HPSFPropertiesExtractor.java @@ -14,8 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ + package org.apache.poi.hpsf.extractor; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; @@ -28,12 +31,13 @@ import org.apache.poi.hpsf.Property; import org.apache.poi.hpsf.SpecialPropertySet; import org.apache.poi.hpsf.SummaryInformation; import org.apache.poi.hpsf.wellknown.PropertyIDMap; +import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.LittleEndian; /** * Extracts all of the HPSF properties, both - * build in and custom, returning them in + * build in and custom, returning them in * textual form. */ public class HPSFPropertiesExtractor extends POITextExtractor { @@ -46,54 +50,59 @@ public class HPSFPropertiesExtractor extends POITextExtractor { public HPSFPropertiesExtractor(POIFSFileSystem fs) { super(new PropertiesOnlyDocument(fs)); } - + public HPSFPropertiesExtractor(NPOIFSFileSystem fs) { + super(new PropertiesOnlyDocument(fs)); + } + public String getDocumentSummaryInformationText() { DocumentSummaryInformation dsi = document.getDocumentSummaryInformation(); StringBuffer text = new StringBuffer(); // Normal properties text.append( getPropertiesText(dsi) ); - + // Now custom ones - CustomProperties cps = dsi.getCustomProperties(); - Iterator keys = cps.keySet().iterator(); - while(keys.hasNext()) { - String key = (String)keys.next(); - String val = getPropertyValueText( cps.get(key) ); - text.append(key + " = " + val + "\n"); + CustomProperties cps = dsi == null ? null : dsi.getCustomProperties(); + if(cps != null) { + Iterator keys = cps.nameSet().iterator(); + while(keys.hasNext()) { + String key = keys.next(); + String val = getPropertyValueText( cps.get(key) ); + text.append(key + " = " + val + "\n"); + } } - + // All done return text.toString(); } public String getSummaryInformationText() { SummaryInformation si = document.getSummaryInformation(); - + // Just normal properties return getPropertiesText(si); } - + private static String getPropertiesText(SpecialPropertySet ps) { if(ps == null) { // Not defined, oh well return ""; } - + StringBuffer text = new StringBuffer(); - + PropertyIDMap idMap = ps.getPropertySetIDMap(); Property[] props = ps.getProperties(); for(int i=0; iA class describing attributes of the Big Block Size

    + */ +public final class POIFSBigBlockSize +{ + private int bigBlockSize; + private short headerValue; + + protected POIFSBigBlockSize(int bigBlockSize, short headerValue) { + this.bigBlockSize = bigBlockSize; + this.headerValue = headerValue; + } + + public int getBigBlockSize() { + return bigBlockSize; + } + + /** + * Returns the value that gets written into the + * header. + * Is the power of two that corresponds to the + * size of the block, eg 512 => 9 + */ + public short getHeaderValue() { + return headerValue; + } + + public int getPropertiesPerBlock() { + return bigBlockSize / POIFSConstants.PROPERTY_SIZE; + } + + public int getBATEntriesPerBlock() { + return bigBlockSize / LittleEndianConsts.INT_SIZE; + } + public int getXBATEntriesPerBlock() { + return getBATEntriesPerBlock() - 1; + } + public int getNextXBATChainOffset() { + return getXBATEntriesPerBlock() * LittleEndianConsts.INT_SIZE; + } +} diff --git a/src/java/org/apache/poi/poifs/common/POIFSConstants.java b/src/java/org/apache/poi/poifs/common/POIFSConstants.java index ff2050274d..d148f8b0bf 100644 --- a/src/java/org/apache/poi/poifs/common/POIFSConstants.java +++ b/src/java/org/apache/poi/poifs/common/POIFSConstants.java @@ -21,21 +21,48 @@ package org.apache.poi.poifs.common; /** *

    A repository for constants shared by POI classes.

    - * - * @author Marc Johnson (mjohnson at apache dot org) */ - public interface POIFSConstants { /** Most files use 512 bytes as their big block size */ - public static final int BIG_BLOCK_SIZE = 0x0200; + public static final int SMALLER_BIG_BLOCK_SIZE = 0x0200; + public static final POIFSBigBlockSize SMALLER_BIG_BLOCK_SIZE_DETAILS = + new POIFSBigBlockSize(SMALLER_BIG_BLOCK_SIZE, (short)9); /** Some use 4096 bytes */ public static final int LARGER_BIG_BLOCK_SIZE = 0x1000; + public static final POIFSBigBlockSize LARGER_BIG_BLOCK_SIZE_DETAILS = + new POIFSBigBlockSize(LARGER_BIG_BLOCK_SIZE, (short)12); - public static final int END_OF_CHAIN = -2; + /** How big a block in the small block stream is. Fixed size */ + public static final int SMALL_BLOCK_SIZE = 0x0040; + + /** How big a single property is */ public static final int PROPERTY_SIZE = 0x0080; + + /** + * The minimum size of a document before it's stored using + * Big Blocks (normal streams). Smaller documents go in the + * Mini Stream (SBAT / Small Blocks) + */ + public static final int BIG_BLOCK_MINIMUM_DOCUMENT_SIZE = 0x1000; + + /** The highest sector number you're allowed, 0xFFFFFFFA */ + public static final int LARGEST_REGULAR_SECTOR_NUMBER = -5; + + /** Indicates the sector holds a DIFAT block (0xFFFFFFFC) */ + public static final int DIFAT_SECTOR_BLOCK = -4; + /** Indicates the sector holds a FAT block (0xFFFFFFFD) */ + public static final int FAT_SECTOR_BLOCK = -3; + /** Indicates the sector is the end of a chain (0xFFFFFFFE) */ + public static final int END_OF_CHAIN = -2; + /** Indicates the sector is not used (0xFFFFFFFF) */ public static final int UNUSED_BLOCK = -1; + /** The first 4 bytes of an OOXML file, used in detection */ public static final byte[] OOXML_FILE_HEADER = new byte[] { 0x50, 0x4b, 0x03, 0x04 }; + + /** HACKY: For backwards compatibility on 3.2 */ + public static final int BIG_BLOCK_SIZE = SMALLER_BIG_BLOCK_SIZE; + } // end public interface POIFSConstants; diff --git a/src/java/org/apache/poi/poifs/dev/POIFSDump.java b/src/java/org/apache/poi/poifs/dev/POIFSDump.java index 5028bab720..ace19d8d18 100755 --- a/src/java/org/apache/poi/poifs/dev/POIFSDump.java +++ b/src/java/org/apache/poi/poifs/dev/POIFSDump.java @@ -1,74 +1,74 @@ -/* ==================================================================== - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -==================================================================== */ -package org.apache.poi.poifs.dev; - -import org.apache.poi.poifs.filesystem.*; - -import java.io.FileInputStream; -import java.io.File; -import java.io.IOException; -import java.io.FileOutputStream; -import java.util.Iterator; - -/** - * - * Dump internal structure of a OLE2 file into file system - * - * @author Yegor Kozlov - */ -public class POIFSDump { - - public static void main(String[] args) throws Exception { - for (int i = 0; i < args.length; i++) { - System.out.println("Dumping " + args[i]); - FileInputStream is = new FileInputStream(args[i]); - POIFSFileSystem fs = new POIFSFileSystem(is); - is.close(); - - DirectoryEntry root = fs.getRoot(); - File file = new File(root.getName()); - file.mkdir(); - - dump(root, file); - } - } - - - public static void dump(DirectoryEntry root, File parent) throws IOException { - for(Iterator it = root.getEntries(); it.hasNext();){ - Entry entry = (Entry)it.next(); - if(entry instanceof DocumentNode){ - DocumentNode node = (DocumentNode)entry; - DocumentInputStream is = new DocumentInputStream(node); - byte[] bytes = new byte[node.getSize()]; - is.read(bytes); - is.close(); - - FileOutputStream out = new FileOutputStream(new File(parent, node.getName().trim())); - out.write(bytes); - out.close(); - } else if (entry instanceof DirectoryEntry){ - DirectoryEntry dir = (DirectoryEntry)entry; - File file = new File(parent, entry.getName()); - file.mkdir(); - dump(dir, file); - } else { - System.err.println("Skipping unsupported POIFS entry: " + entry); - } - } - } -} +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.poifs.dev; + +import org.apache.poi.poifs.filesystem.*; + +import java.io.FileInputStream; +import java.io.File; +import java.io.IOException; +import java.io.FileOutputStream; +import java.util.Iterator; + +/** + * + * Dump internal structure of a OLE2 file into file system + * + * @author Yegor Kozlov + */ +public class POIFSDump { + + public static void main(String[] args) throws Exception { + for (int i = 0; i < args.length; i++) { + System.out.println("Dumping " + args[i]); + FileInputStream is = new FileInputStream(args[i]); + POIFSFileSystem fs = new POIFSFileSystem(is); + is.close(); + + DirectoryEntry root = fs.getRoot(); + File file = new File(root.getName()); + file.mkdir(); + + dump(root, file); + } + } + + + public static void dump(DirectoryEntry root, File parent) throws IOException { + for(Iterator it = root.getEntries(); it.hasNext();){ + Entry entry = (Entry)it.next(); + if(entry instanceof DocumentNode){ + DocumentNode node = (DocumentNode)entry; + DocumentInputStream is = new DocumentInputStream(node); + byte[] bytes = new byte[node.getSize()]; + is.read(bytes); + is.close(); + + FileOutputStream out = new FileOutputStream(new File(parent, node.getName().trim())); + out.write(bytes); + out.close(); + } else if (entry instanceof DirectoryEntry){ + DirectoryEntry dir = (DirectoryEntry)entry; + File file = new File(parent, entry.getName()); + file.mkdir(); + dump(dir, file); + } else { + System.err.println("Skipping unsupported POIFS entry: " + entry); + } + } + } +} diff --git a/src/java/org/apache/poi/poifs/dev/POIFSHeaderDumper.java b/src/java/org/apache/poi/poifs/dev/POIFSHeaderDumper.java new file mode 100644 index 0000000000..78ed986a40 --- /dev/null +++ b/src/java/org/apache/poi/poifs/dev/POIFSHeaderDumper.java @@ -0,0 +1,152 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.dev; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.poi.poifs.common.POIFSBigBlockSize; +import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.property.PropertyTable; +import org.apache.poi.poifs.storage.BlockAllocationTableReader; +import org.apache.poi.poifs.storage.BlockList; +import org.apache.poi.poifs.storage.HeaderBlock; +import org.apache.poi.poifs.storage.ListManagedBlock; +import org.apache.poi.poifs.storage.RawDataBlockList; +import org.apache.poi.poifs.storage.SmallBlockTableReader; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.IntList; + +/** + * A very low level debugging tool, for printing out core + * information on the headers and FAT blocks. + * You probably only want to use this if you're trying + * to understand POIFS, or if you're trying to track + * down the source of corruption in a file. + */ +public class POIFSHeaderDumper { + /** + * Display the entries of multiple POIFS files + * + * @param args the names of the files to be displayed + */ + public static void main(final String args[]) throws Exception { + if (args.length == 0) { + System.err.println("Must specify at least one file to view"); + System.exit(1); + } + + for (int j = 0; j < args.length; j++) { + viewFile(args[j]); + } + } + + public static void viewFile(final String filename) throws Exception { + InputStream inp = new FileInputStream(filename); + + // Header + HeaderBlock header_block = new HeaderBlock(inp); + displayHeader(header_block); + + // Raw blocks + POIFSBigBlockSize bigBlockSize = header_block.getBigBlockSize(); + RawDataBlockList data_blocks = new RawDataBlockList(inp, bigBlockSize); + displayRawBlocksSummary(data_blocks); + + // Main FAT Table + BlockAllocationTableReader batReader = + new BlockAllocationTableReader( + header_block.getBigBlockSize(), + header_block.getBATCount(), + header_block.getBATArray(), + header_block.getXBATCount(), + header_block.getXBATIndex(), + data_blocks); + displayBATReader(batReader); + + // Properties Table + PropertyTable properties = + new PropertyTable(header_block, data_blocks); + + // Mini Fat + BlockList sbat = + SmallBlockTableReader.getSmallDocumentBlocks( + bigBlockSize, data_blocks, properties.getRoot(), + header_block.getSBATStart() + ); + } + + public static void displayHeader(HeaderBlock header_block) throws Exception { + System.out.println("Header Details:"); + System.out.println(" Block size: " + header_block.getBigBlockSize().getBigBlockSize()); + System.out.println(" BAT (FAT) header blocks: " + header_block.getBATArray().length); + System.out.println(" BAT (FAT) block count: " + header_block.getBATCount()); + System.out.println(" XBAT (FAT) block count: " + header_block.getXBATCount()); + System.out.println(" XBAT (FAT) block 1 at: " + header_block.getXBATIndex()); + System.out.println(" SBAT (MiniFAT) block count: " + header_block.getSBATCount()); + System.out.println(" SBAT (MiniFAT) block 1 at: " + header_block.getSBATStart()); + System.out.println(" Property table at: " + header_block.getPropertyStart()); + System.out.println(""); + } + + public static void displayRawBlocksSummary(RawDataBlockList data_blocks) throws Exception { + System.out.println("Raw Blocks Details:"); + System.out.println(" Number of blocks: " + data_blocks.blockCount()); + + Method gbm = data_blocks.getClass().getSuperclass().getDeclaredMethod("get", int.class); + gbm.setAccessible(true); + + for(int i=0; i " + bnS); + } + + System.out.println(""); + } +} diff --git a/src/java/org/apache/poi/poifs/dev/POIFSLister.java b/src/java/org/apache/poi/poifs/dev/POIFSLister.java index cdd9902c40..357773a632 100644 --- a/src/java/org/apache/poi/poifs/dev/POIFSLister.java +++ b/src/java/org/apache/poi/poifs/dev/POIFSLister.java @@ -17,82 +17,88 @@ package org.apache.poi.poifs.dev; +import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; -import org.apache.poi.poifs.filesystem.DirectoryEntry; import org.apache.poi.poifs.filesystem.DirectoryNode; -import org.apache.poi.poifs.filesystem.DocumentEntry; import org.apache.poi.poifs.filesystem.DocumentNode; +import org.apache.poi.poifs.filesystem.Entry; +import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * A lister of the entries in POIFS files. - * + * * Much simpler than {@link POIFSViewer} */ public class POIFSLister { - /** - * Display the entries of multiple POIFS files - * - * @param args the names of the files to be displayed - */ - public static void main(final String args[]) throws IOException { - if (args.length == 0) - { - System.err.println("Must specify at least one file to view"); - System.exit(1); - } + /** + * Display the entries of multiple POIFS files + * + * @param args the names of the files to be displayed + */ + public static void main(final String args[]) throws IOException { + if (args.length == 0) { + System.err.println("Must specify at least one file to view"); + System.exit(1); + } - boolean withSizes = false; - for (int j = 0; j < args.length; j++) { - if(args[j].equalsIgnoreCase("-size") || - args[j].equalsIgnoreCase("-sizes")) { - withSizes = true; - } else { - viewFile(args[j], withSizes); - } - } - } + boolean withSizes = false; + boolean newPOIFS = true; + for (int j = 0; j < args.length; j++) { + if (args[j].equalsIgnoreCase("-size") || args[j].equalsIgnoreCase("-sizes")) { + withSizes = true; + } else if (args[j].equalsIgnoreCase("-old") || args[j].equalsIgnoreCase("-old-poifs")) { + newPOIFS = false; + } else { + if(newPOIFS) { + viewFile(args[j], withSizes); + } else { + viewFileOld(args[j], withSizes); + } + } + } + } - public static void viewFile(final String filename, boolean withSizes) throws IOException - { - POIFSFileSystem fs = new POIFSFileSystem( - new FileInputStream(filename) - ); - displayDirectory(fs.getRoot(), "", withSizes); - } - - public static void displayDirectory(DirectoryNode dir, String indent, boolean withSizes) { - System.out.println(indent + dir.getName() + " -"); - String newIndent = indent + " "; - - boolean hadChildren = false; - for(Iterator it = dir.getEntries(); it.hasNext(); ) { - hadChildren = true; - Object entry = it.next(); - if(entry instanceof DirectoryNode) { - displayDirectory((DirectoryNode)entry, newIndent, withSizes); - } else { - DocumentNode doc = (DocumentNode)entry; - String name = doc.getName(); - String size = ""; - if(name.charAt(0) < 10) { - String altname = "(0x0" + (int)name.charAt(0) + ")" + name.substring(1); - name = name.substring(1) + " <" + altname + ">"; - } - if(withSizes) { - size = " [" + - doc.getSize() + " / 0x" + - Integer.toHexString(doc.getSize()) + - "]"; - } - System.out.println(newIndent + name + size); - } - } - if(!hadChildren) { - System.out.println(newIndent + "(no children)"); - } - } -} \ No newline at end of file + public static void viewFile(final String filename, boolean withSizes) throws IOException { + NPOIFSFileSystem fs = new NPOIFSFileSystem(new File(filename)); + displayDirectory(fs.getRoot(), "", withSizes); + } + + public static void viewFileOld(final String filename, boolean withSizes) throws IOException { + POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filename)); + displayDirectory(fs.getRoot(), "", withSizes); + } + + public static void displayDirectory(DirectoryNode dir, String indent, boolean withSizes) { + System.out.println(indent + dir.getName() + " -"); + String newIndent = indent + " "; + + boolean hadChildren = false; + for(Iterator it = dir.getEntries(); it.hasNext();) { + hadChildren = true; + Entry entry = it.next(); + if (entry instanceof DirectoryNode) { + displayDirectory((DirectoryNode) entry, newIndent, withSizes); + } else { + DocumentNode doc = (DocumentNode) entry; + String name = doc.getName(); + String size = ""; + if (name.charAt(0) < 10) { + String altname = "(0x0" + (int) name.charAt(0) + ")" + name.substring(1); + name = name.substring(1) + " <" + altname + ">"; + } + if (withSizes) { + size = " [" + doc.getSize() + " / 0x" + + Integer.toHexString(doc.getSize()) + "]"; + } + System.out.println(newIndent + name + size); + } + } + if (!hadChildren) { + System.out.println(newIndent + "(no children)"); + } + } +} diff --git a/src/java/org/apache/poi/poifs/dev/POIFSViewable.java b/src/java/org/apache/poi/poifs/dev/POIFSViewable.java index 458072834d..c5d7748e75 100644 --- a/src/java/org/apache/poi/poifs/dev/POIFSViewable.java +++ b/src/java/org/apache/poi/poifs/dev/POIFSViewable.java @@ -46,7 +46,7 @@ public interface POIFSViewable */ public Object [] getViewableArray(); - + /** * Get an Iterator of objects, some of which may implement * POIFSViewable @@ -54,7 +54,7 @@ public interface POIFSViewable * @return an Iterator; may not be null, but may have an empty * back end store */ - + @SuppressWarnings("unchecked") public Iterator getViewableIterator(); /** diff --git a/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java b/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java index 73911e6b0e..567527523e 100644 --- a/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java +++ b/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java @@ -31,7 +31,7 @@ import org.apache.poi.poifs.property.Property; import org.apache.poi.poifs.property.PropertyTable; import org.apache.poi.poifs.storage.BlockAllocationTableReader; import org.apache.poi.poifs.storage.BlockList; -import org.apache.poi.poifs.storage.HeaderBlockReader; +import org.apache.poi.poifs.storage.HeaderBlock; import org.apache.poi.poifs.storage.RawDataBlockList; import org.apache.poi.poifs.storage.SmallBlockTableReader; @@ -75,29 +75,31 @@ public class POIFSReader registryClosed = true; // read the header block from the stream - HeaderBlockReader header_block_reader = new HeaderBlockReader(stream); + HeaderBlock header_block = new HeaderBlock(stream); // read the rest of the stream into blocks - RawDataBlockList data_blocks = new RawDataBlockList(stream, header_block_reader.getBigBlockSize()); + RawDataBlockList data_blocks = new RawDataBlockList(stream, header_block.getBigBlockSize()); // set up the block allocation table (necessary for the // data_blocks to be manageable - new BlockAllocationTableReader(header_block_reader.getBATCount(), - header_block_reader.getBATArray(), - header_block_reader.getXBATCount(), - header_block_reader.getXBATIndex(), + new BlockAllocationTableReader(header_block.getBigBlockSize(), + header_block.getBATCount(), + header_block.getBATArray(), + header_block.getXBATCount(), + header_block.getXBATIndex(), data_blocks); // get property table from the document PropertyTable properties = - new PropertyTable(header_block_reader.getPropertyStart(), - data_blocks); + new PropertyTable(header_block, data_blocks); // process documents processProperties(SmallBlockTableReader - .getSmallDocumentBlocks(data_blocks, properties - .getRoot(), header_block_reader - .getSBATStart()), data_blocks, properties.getRoot() + .getSmallDocumentBlocks( + header_block.getBigBlockSize(), + data_blocks, properties.getRoot(), + header_block.getSBATStart()), + data_blocks, properties.getRoot() .getChildren(), new POIFSDocumentPath()); } @@ -245,13 +247,13 @@ public class POIFSReader { document = new POIFSDocument(name, small_blocks - .fetchBlocks(startBlock), size); + .fetchBlocks(startBlock, -1), size); } else { document = new POIFSDocument(name, big_blocks - .fetchBlocks(startBlock), size); + .fetchBlocks(startBlock, -1), size); } while (listeners.hasNext()) { @@ -270,11 +272,11 @@ public class POIFSReader // consume the document's data and discard it if (property.shouldUseSmallBlocks()) { - small_blocks.fetchBlocks(startBlock); + small_blocks.fetchBlocks(startBlock, -1); } else { - big_blocks.fetchBlocks(startBlock); + big_blocks.fetchBlocks(startBlock, -1); } } } diff --git a/src/java/org/apache/poi/poifs/filesystem/BlockStore.java b/src/java/org/apache/poi/poifs/filesystem/BlockStore.java new file mode 100644 index 0000000000..1da9b6a965 --- /dev/null +++ b/src/java/org/apache/poi/poifs/filesystem/BlockStore.java @@ -0,0 +1,105 @@ + +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.filesystem; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import org.apache.poi.poifs.storage.BATBlock.BATBlockAndIndex; + +/** + * This abstract class describes a way to read, store, chain + * and free a series of blocks (be they Big or Small ones) + */ +public abstract class BlockStore { + /** + * Returns the size of the blocks managed through the block store. + */ + protected abstract int getBlockStoreBlockSize(); + + /** + * Load the block at the given offset. + */ + protected abstract ByteBuffer getBlockAt(final int offset) throws IOException; + + /** + * Extends the file if required to hold blocks up to + * the specified offset, and return the block from there. + */ + protected abstract ByteBuffer createBlockIfNeeded(final int offset) throws IOException; + + /** + * Returns the BATBlock that handles the specified offset, + * and the relative index within it + */ + protected abstract BATBlockAndIndex getBATBlockAndIndex(final int offset); + + /** + * Works out what block follows the specified one. + */ + protected abstract int getNextBlock(final int offset); + + /** + * Changes the record of what block follows the specified one. + */ + protected abstract void setNextBlock(final int offset, final int nextBlock); + + /** + * Finds a free block, and returns its offset. + * This method will extend the file/stream if needed, and if doing + * so, allocate new FAT blocks to address the extra space. + */ + protected abstract int getFreeBlock() throws IOException; + + /** + * Creates a Detector for loops in the chain + */ + protected abstract ChainLoopDetector getChainLoopDetector() throws IOException; + + /** + * Used to detect if a chain has a loop in it, so + * we can bail out with an error rather than + * spinning away for ever... + */ + protected class ChainLoopDetector { + private boolean[] used_blocks; + protected ChainLoopDetector(long rawSize) { + int numBlocks = (int)Math.ceil( rawSize / getBlockStoreBlockSize() ); + used_blocks = new boolean[numBlocks]; + } + protected void claim(int offset) { + if(offset >= used_blocks.length) { + // They're writing, and have had new blocks requested + // for the write to proceed. That means they're into + // blocks we've allocated for them, so are safe + return; + } + + // Claiming an existing block, ensure there's no loop + if(used_blocks[offset]) { + throw new IllegalStateException( + "Potential loop detected - Block " + offset + + " was already claimed but was just requested again" + ); + } + used_blocks[offset] = true; + } + } +} + diff --git a/src/java/org/apache/poi/poifs/filesystem/DirectoryEntry.java b/src/java/org/apache/poi/poifs/filesystem/DirectoryEntry.java index de8bb1f577..844070fb50 100644 --- a/src/java/org/apache/poi/poifs/filesystem/DirectoryEntry.java +++ b/src/java/org/apache/poi/poifs/filesystem/DirectoryEntry.java @@ -33,7 +33,7 @@ import org.apache.poi.hpsf.ClassID; */ public interface DirectoryEntry - extends Entry + extends Entry, Iterable { /** @@ -47,7 +47,7 @@ public interface DirectoryEntry * implementations of Entry. */ - public Iterator getEntries(); + public Iterator getEntries(); /** * is this DirectoryEntry empty? diff --git a/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java b/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java index 6805e5197b..ea733ea879 100644 --- a/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java +++ b/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java @@ -19,9 +19,14 @@ package org.apache.poi.poifs.filesystem; -import java.io.*; - -import java.util.*; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.apache.poi.hpsf.ClassID; import org.apache.poi.poifs.dev.POIFSViewable; @@ -34,17 +39,21 @@ import org.apache.poi.poifs.property.Property; * * @author Marc Johnson (mjohnson at apache dot org) */ - public class DirectoryNode extends EntryNode - implements DirectoryEntry, POIFSViewable + implements DirectoryEntry, POIFSViewable, Iterable { // Map of Entry instances, keyed by their names - private Map _entries; + private Map _byname; + // Our list of entries, kept sorted to preserve order + private ArrayList _entries; + // Only one of these two will exist // the POIFSFileSystem we belong to - private POIFSFileSystem _filesystem; + private POIFSFileSystem _ofilesystem; + // the NPOIFSFileSytem we belong to + private NPOIFSFileSystem _nfilesystem; // the path described by this document private POIFSDocumentPath _path; @@ -57,10 +66,32 @@ public class DirectoryNode * @param filesystem the POIFSFileSystem we belong to * @param parent the parent of this entry */ - DirectoryNode(final DirectoryProperty property, final POIFSFileSystem filesystem, final DirectoryNode parent) + { + this(property, parent); + _ofilesystem = filesystem; + } + + /** + * create a DirectoryNode. This method is not public by design; it + * is intended strictly for the internal use of this package + * + * @param property the DirectoryProperty for this DirectoryEntry + * @param nfilesystem the NPOIFSFileSystem we belong to + * @param parent the parent of this entry + */ + DirectoryNode(final DirectoryProperty property, + final NPOIFSFileSystem nfilesystem, + final DirectoryNode parent) + { + this(property, parent); + _nfilesystem = nfilesystem; + } + + private DirectoryNode(final DirectoryProperty property, + final DirectoryNode parent) { super(property, parent); if (parent == null) @@ -74,26 +105,30 @@ public class DirectoryNode property.getName() }); } - _filesystem = filesystem; - _entries = new HashMap(); - Iterator iter = property.getChildren(); + _byname = new HashMap(); + _entries = new ArrayList(); + Iterator iter = property.getChildren(); while (iter.hasNext()) { - Property child = ( Property ) iter.next(); + Property child = iter.next(); Entry childNode = null; if (child.isDirectory()) { - childNode = new DirectoryNode(( DirectoryProperty ) child, - _filesystem, this); + DirectoryProperty childDir = (DirectoryProperty) child; + if(_ofilesystem != null) { + childNode = new DirectoryNode(childDir, _ofilesystem, this); + } else { + childNode = new DirectoryNode(childDir, _nfilesystem, this); + } } else { - childNode = new DocumentNode(( DocumentProperty ) child, - this); + childNode = new DocumentNode((DocumentProperty) child, this); } - _entries.put(childNode.getName(), childNode); + _entries.add(childNode); + _byname.put(childNode.getName(), childNode); } } @@ -106,6 +141,22 @@ public class DirectoryNode return _path; } + /** + * @return the filesystem that this belongs to + */ + public POIFSFileSystem getFileSystem() + { + return _ofilesystem; + } + + /** + * @return the filesystem that this belongs to + */ + public NPOIFSFileSystem getNFileSystem() + { + return _nfilesystem; + } + /** * open a document in the directory's entry's list of entries * @@ -116,19 +167,34 @@ public class DirectoryNode * @exception IOException if the document does not exist or the * name is that of a DirectoryEntry */ - public DocumentInputStream createDocumentInputStream( final String documentName) throws IOException { - Entry document = getEntry(documentName); + return createDocumentInputStream(getEntry(documentName)); + } - if (!document.isDocumentEntry()) - { - throw new IOException("Entry '" + documentName + /** + * open a document in the directory's entry's list of entries + * + * @param documentEntry the document to be opened + * + * @return a newly opened DocumentInputStream or NDocumentInputStream + * + * @exception IOException if the document does not exist or the + * name is that of a DirectoryEntry + */ + public DocumentInputStream createDocumentInputStream( + final Entry document) + throws IOException + { + if (!document.isDocumentEntry()) { + throw new IOException("Entry '" + document.getName() + "' is not a DocumentEntry"); } - return new DocumentInputStream(( DocumentEntry ) document); + + DocumentEntry entry = (DocumentEntry)document; + return new DocumentInputStream(entry); } /** @@ -140,7 +206,6 @@ public class DirectoryNode * * @exception IOException */ - DocumentEntry createDocument(final POIFSDocument document) throws IOException { @@ -148,8 +213,33 @@ public class DirectoryNode DocumentNode rval = new DocumentNode(property, this); (( DirectoryProperty ) getProperty()).addChild(property); - _filesystem.addDocument(document); - _entries.put(property.getName(), rval); + _ofilesystem.addDocument(document); + + _entries.add(rval); + _byname.put(property.getName(), rval); + return rval; + } + + /** + * create a new DocumentEntry + * + * @param document the new document + * + * @return the new DocumentEntry + * + * @exception IOException + */ + DocumentEntry createDocument(final NPOIFSDocument document) + throws IOException + { + DocumentProperty property = document.getDocumentProperty(); + DocumentNode rval = new DocumentNode(property, this); + + (( DirectoryProperty ) getProperty()).addChild(property); + _nfilesystem.addDocument(document); + + _entries.add(rval); + _byname.put(property.getName(), rval); return rval; } @@ -161,11 +251,10 @@ public class DirectoryNode * * @return true if the operation succeeded, else false */ - boolean changeName(final String oldName, final String newName) { boolean rval = false; - EntryNode child = ( EntryNode ) _entries.get(oldName); + EntryNode child = ( EntryNode ) _byname.get(oldName); if (child != null) { @@ -173,8 +262,8 @@ public class DirectoryNode .changeName(child.getProperty(), newName); if (rval) { - _entries.remove(oldName); - _entries.put(child.getProperty().getName(), child); + _byname.remove(oldName); + _byname.put(child.getProperty().getName(), child); } } return rval; @@ -196,8 +285,14 @@ public class DirectoryNode if (rval) { - _entries.remove(entry.getName()); - _filesystem.remove(entry); + _entries.remove(entry); + _byname.remove(entry.getName()); + + if(_ofilesystem != null) { + _ofilesystem.remove(entry); + } else { + _nfilesystem.remove(entry); + } } return rval; } @@ -215,9 +310,9 @@ public class DirectoryNode * implementations of Entry. */ - public Iterator getEntries() + public Iterator getEntries() { - return _entries.values().iterator(); + return _entries.iterator(); } /** @@ -263,7 +358,7 @@ public class DirectoryNode if (name != null) { - rval = ( Entry ) _entries.get(name); + rval = _byname.get(name); } if (rval == null) { @@ -326,13 +421,20 @@ public class DirectoryNode public DirectoryEntry createDirectory(final String name) throws IOException { + DirectoryNode rval; DirectoryProperty property = new DirectoryProperty(name); - DirectoryNode rval = new DirectoryNode(property, _filesystem, - this); + + if(_ofilesystem != null) { + rval = new DirectoryNode(property, _ofilesystem, this); + _ofilesystem.addDirectory(property); + } else { + rval = new DirectoryNode(property, _nfilesystem, this); + _nfilesystem.addDirectory(property); + } (( DirectoryProperty ) getProperty()).addChild(property); - _filesystem.addDirectory(property); - _entries.put(name, rval); + _entries.add(rval); + _byname.put(name, rval); return rval; } @@ -410,15 +512,13 @@ public class DirectoryNode * @return an Iterator; may not be null, but may have an empty * back end store */ - + @SuppressWarnings("unchecked") public Iterator getViewableIterator() { List components = new ArrayList(); components.add(getProperty()); - SortedMap sortedEntries = new TreeMap(_entries); - Iterator iter = sortedEntries.values().iterator(); - + Iterator iter = _entries.iterator(); while (iter.hasNext()) { components.add(iter.next()); @@ -451,6 +551,13 @@ public class DirectoryNode return getName(); } + /** + * Returns an Iterator over all the entries + */ + public Iterator iterator() { + return getEntries(); + } + /* ********** END begin implementation of POIFSViewable ********** */ } // end public class DirectoryNode diff --git a/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java b/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java index 786a8d24e2..d39582f7ad 100644 --- a/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java +++ b/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,437 +14,156 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; -import java.io.*; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.poi.util.LittleEndianInput; /** * This class provides methods to read a DocumentEntry managed by a - * Filesystem instance. - * - * @author Marc Johnson (mjohnson at apache dot org) + * {@link POIFSFileSystem} or {@link NPOIFSFileSystem} instance. + * It creates the appropriate one, and delegates, allowing us to + * work transparently with the two. */ +public class DocumentInputStream extends InputStream implements LittleEndianInput { + /** returned by read operations if we're at end of document */ + protected static final int EOF = -1; -public class DocumentInputStream - extends InputStream -{ + protected static final int SIZE_SHORT = 2; + protected static final int SIZE_INT = 4; + protected static final int SIZE_LONG = 8; + + private DocumentInputStream delegate; + + /** For use by downstream implementations */ + protected DocumentInputStream() {} - // current offset into the Document - private int _current_offset; + /** + * Create an InputStream from the specified DocumentEntry + * + * @param document the DocumentEntry to be read + * + * @exception IOException if the DocumentEntry cannot be opened (like, maybe it has + * been deleted?) + */ + public DocumentInputStream(DocumentEntry document) throws IOException { + if (!(document instanceof DocumentNode)) { + throw new IOException("Cannot open internal document storage"); + } + DocumentNode documentNode = (DocumentNode)document; + DirectoryNode parentNode = (DirectoryNode)document.getParent(); - // current marked offset into the Document (used by mark and - // reset) - private int _marked_offset; + if(documentNode.getDocument() != null) { + delegate = new ODocumentInputStream(document); + } else if(parentNode.getFileSystem() != null) { + delegate = new ODocumentInputStream(document); + } else if(parentNode.getNFileSystem() != null) { + delegate = new NDocumentInputStream(document); + } else { + throw new IOException("No FileSystem bound on the parent, can't read contents"); + } + } - // the Document's size - private int _document_size; + /** + * Create an InputStream from the specified Document + * + * @param document the Document to be read + */ + public DocumentInputStream(POIFSDocument document) { + delegate = new ODocumentInputStream(document); + } - // have we been closed? - private boolean _closed; + /** + * Create an InputStream from the specified Document + * + * @param document the Document to be read + */ + public DocumentInputStream(NPOIFSDocument document) { + delegate = new NDocumentInputStream(document); + } - // the actual Document - private POIFSDocument _document; + public int available() { + return delegate.available(); + } - // buffer used to read one byte at a time - private byte[] _tiny_buffer; + public void close() { + delegate.close(); + } - // returned by read operations if we're at end of document - static private final int EOD = -1; + public void mark(int ignoredReadlimit) { + delegate.mark(ignoredReadlimit); + } - /** - * Create an InputStream from the specified DocumentEntry - * - * @param document the DocumentEntry to be read - * - * @exception IOException if the DocumentEntry cannot be opened - * (like, maybe it has been deleted?) - */ + /** + * Tests if this input stream supports the mark and reset methods. + * + * @return true always + */ + public boolean markSupported() { + return true; + } - public DocumentInputStream(final DocumentEntry document) - throws IOException - { - _current_offset = 0; - _marked_offset = 0; - _document_size = document.getSize(); - _closed = false; - _tiny_buffer = null; - if (document instanceof DocumentNode) - { - _document = (( DocumentNode ) document).getDocument(); - } - else - { - throw new IOException("Cannot open internal document storage"); - } - } + public int read() throws IOException { + return delegate.read(); + } - /** - * Create an InputStream from the specified Document - * - * @param document the Document to be read - * - * @exception IOException if the DocumentEntry cannot be opened - * (like, maybe it has been deleted?) - */ + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } - public DocumentInputStream(final POIFSDocument document) - throws IOException - { - _current_offset = 0; - _marked_offset = 0; - _document_size = document.getSize(); - _closed = false; - _tiny_buffer = null; - _document = document; - } + public int read(byte[] b, int off, int len) throws IOException { + return delegate.read(b, off, len); + } - /** - * Returns the number of bytes that can be read (or skipped over) - * from this input stream without blocking by the next caller of a - * method for this input stream. The next caller might be the same - * thread or or another thread. - * - * @return the number of bytes that can be read from this input - * stream without blocking. - * - * @exception IOException on error (such as the stream has been - * closed) - */ + /** + * Repositions this stream to the position at the time the mark() method was + * last called on this input stream. If mark() has not been called this + * method repositions the stream to its beginning. + */ + public void reset() { + delegate.reset(); + } - public int available() - throws IOException - { - dieIfClosed(); - return _document_size - _current_offset; - } + public long skip(long n) throws IOException { + return delegate.skip(n); + } - /** - * Closes this input stream and releases any system resources - * associated with the stream. - * - * @exception IOException - */ + public byte readByte() { + return delegate.readByte(); + } - public void close() - throws IOException - { - _closed = true; - } + public double readDouble() { + return delegate.readDouble(); + } - /** - * Marks the current position in this input stream. A subsequent - * call to the reset method repositions this stream at the last - * marked position so that subsequent reads re-read the same - * bytes. - *

    - * The readlimit arguments tells this input stream to allow that - * many bytes to be read before the mark position gets - * invalidated. This implementation, however, does not care. - *

    - * The general contract of mark is that, if the method - * markSupported returns true, the stream somehow remembers all - * the bytes read after the call to mark and stands ready to - * supply those same bytes again if and whenever the method reset - * is called. However, the stream is not required to remember any - * data at all if more than readlimit bytes are read from the - * stream before reset is called. But this stream will. - * - * @param ignoredReadlimit the maximum limit of bytes that can be - * read before the mark position becomes - * invalid. Ignored by this - * implementation. - */ + public short readShort() { + return (short) readUShort(); + } - public void mark(int ignoredReadlimit) - { - _marked_offset = _current_offset; - } + public void readFully(byte[] buf) { + readFully(buf, 0, buf.length); + } - /** - * Tests if this input stream supports the mark and reset methods. - * - * @return true - */ + public void readFully(byte[] buf, int off, int len) { + delegate.readFully(buf, off, len); + } - public boolean markSupported() - { - return true; - } + public long readLong() { + return delegate.readLong(); + } - /** - * Reads the next byte of data from the input stream. The value - * byte is returned as an int in the range 0 to 255. If no byte is - * available because the end of the stream has been reached, the - * value -1 is returned. The definition of this method in - * java.io.InputStream allows this method to block, but it won't. - * - * @return the next byte of data, or -1 if the end of the stream - * is reached. - * - * @exception IOException - */ + public int readInt() { + return delegate.readInt(); + } - public int read() - throws IOException - { - dieIfClosed(); - if (atEOD()) - { - return EOD; - } - if (_tiny_buffer == null) - { - _tiny_buffer = new byte[ 1 ]; - } - _document.read(_tiny_buffer, _current_offset++); - return ((int)_tiny_buffer[ 0 ]) & 0x000000FF; - } - - /** - * Reads some number of bytes from the input stream and stores - * them into the buffer array b. The number of bytes actually read - * is returned as an integer. The definition of this method in - * java.io.InputStream allows this method to block, but it won't. - *

    - * If b is null, a NullPointerException is thrown. If the length - * of b is zero, then no bytes are read and 0 is returned; - * otherwise, there is an attempt to read at least one byte. If no - * byte is available because the stream is at end of file, the - * value -1 is returned; otherwise, at least one byte is read and - * stored into b. - *

    - * The first byte read is stored into element b[0], the next one - * into b[1], and so on. The number of bytes read is, at most, - * equal to the length of b. Let k be the number of bytes actually - * read; these bytes will be stored in elements b[0] through - * b[k-1], leaving elements b[k] through b[b.length-1] unaffected. - *

    - * If the first byte cannot be read for any reason other than end - * of file, then an IOException is thrown. In particular, an - * IOException is thrown if the input stream has been closed. - *

    - * The read(b) method for class InputStream has the same effect as: - *

    - * read(b, 0, b.length) - * - * @param b the buffer into which the data is read. - * - * @return the total number of bytes read into the buffer, or -1 - * if there is no more data because the end of the stream - * has been reached. - * - * @exception IOException - * @exception NullPointerException - */ - - public int read(final byte [] b) - throws IOException, NullPointerException - { - return read(b, 0, b.length); - } - - /** - * Reads up to len bytes of data from the input stream into an - * array of bytes. An attempt is made to read as many as len - * bytes, but a smaller number may be read, possibly zero. The - * number of bytes actually read is returned as an integer. - *

    - * The definition of this method in java.io.InputStream allows it - * to block, but it won't. - *

    - * If b is null, a NullPointerException is thrown. - *

    - * If off is negative, or len is negative, or off+len is greater - * than the length of the array b, then an - * IndexOutOfBoundsException is thrown. - *

    - * If len is zero, then no bytes are read and 0 is returned; - * otherwise, there is an attempt to read at least one byte. If no - * byte is available because the stream is at end of file, the - * value -1 is returned; otherwise, at least one byte is read and - * stored into b. - *

    - * The first byte read is stored into element b[off], the next one - * into b[off+1], and so on. The number of bytes read is, at most, - * equal to len. Let k be the number of bytes actually read; these - * bytes will be stored in elements b[off] through b[off+k-1], - * leaving elements b[off+k] through b[off+len-1] unaffected. - *

    - * In every case, elements b[0] through b[off] and elements - * b[off+len] through b[b.length-1] are unaffected. - *

    - * If the first byte cannot be read for any reason other than end - * of file, then an IOException is thrown. In particular, an - * IOException is thrown if the input stream has been closed. - * - * @param b the buffer into which the data is read. - * @param off the start offset in array b at which the data is - * written. - * @param len the maximum number of bytes to read. - * - * @return the total number of bytes read into the buffer, or -1 - * if there is no more data because the end of the stream - * has been reached. - * - * @exception IOException - * @exception NullPointerException - * @exception IndexOutOfBoundsException - */ - - public int read(final byte [] b, final int off, final int len) - throws IOException, NullPointerException, IndexOutOfBoundsException - { - dieIfClosed(); - if (b == null) - { - throw new NullPointerException("buffer is null"); - } - if ((off < 0) || (len < 0) || (b.length < (off + len))) - { - throw new IndexOutOfBoundsException( - "can't read past buffer boundaries"); - } - if (len == 0) - { - return 0; - } - if (atEOD()) - { - return EOD; - } - int limit = Math.min(available(), len); - - if ((off == 0) && (limit == b.length)) - { - _document.read(b, _current_offset); - } - else - { - byte[] buffer = new byte[ limit ]; - - _document.read(buffer, _current_offset); - System.arraycopy(buffer, 0, b, off, limit); - } - _current_offset += limit; - return limit; - } - - /** - * Repositions this stream to the position at the time the mark - * method was last called on this input stream. - *

    - * The general contract of reset is: - *

    - *

      - *
    • - * If the method markSupported returns true, then: - *
        - *
      • - * If the method mark has not been called since the - * stream was created, or the number of bytes read - * from the stream since mark was last called is - * larger than the argument to mark at that last - * call, then an IOException might be thrown. - *
      • - *
      • - * If such an IOException is not thrown, then the - * stream is reset to a state such that all the - * bytes read since the most recent call to mark - * (or since the start of the file, if mark has not - * been called) will be resupplied to subsequent - * callers of the read method, followed by any - * bytes that otherwise would have been the next - * input data as of the time of the call to reset. - *
      • - *
      - *
    • - *
    • - * If the method markSupported returns false, then: - *
        - *
      • - * The call to reset may throw an IOException. - *
      • - *
      • - * If an IOException is not thrown, then the - * stream is reset to a fixed state that depends - * on the particular type of the input and how it - * was created. The bytes that will be supplied to - * subsequent callers of the read method depend on - * the particular type of the input stream. - *
      • - *
      - *
    • - *
    - *

    - * All well and good ... this class's markSupported method returns - * true and this method does not care whether you've called mark - * at all, or whether you've exceeded the number of bytes - * specified in the last call to mark. We're basically walking a - * byte array ... mark and reset to your heart's content. - */ - - public void reset() - { - _current_offset = _marked_offset; - } - - /** - * Skips over and discards n bytes of data from this input - * stream. The skip method may, for a variety of reasons, end up - * skipping over some smaller number of bytes, possibly 0. This - * may result from any of a number of conditions; reaching end of - * file before n bytes have been skipped is only one - * possibility. The actual number of bytes skipped is returned. If - * n is negative, no bytes are skipped. - * - * @param n the number of bytes to be skipped. - * - * @return the actual number of bytes skipped. - * - * @exception IOException - */ - - public long skip(final long n) - throws IOException - { - dieIfClosed(); - if (n < 0) - { - return 0; - } - int new_offset = _current_offset + ( int ) n; - - if (new_offset < _current_offset) - { - - // wrap around in converting a VERY large long to an int - new_offset = _document_size; - } - else if (new_offset > _document_size) - { - new_offset = _document_size; - } - long rval = new_offset - _current_offset; - - _current_offset = new_offset; - return rval; - } - - private void dieIfClosed() - throws IOException - { - if (_closed) - { - throw new IOException( - "cannot perform requested operation on a closed stream"); - } - } - - private boolean atEOD() - { - return _current_offset == _document_size; - } -} // end public class DocumentInputStream + public int readUShort() { + return delegate.readUShort(); + } + public int readUByte() { + return delegate.readUByte(); + } +} diff --git a/src/java/org/apache/poi/poifs/filesystem/DocumentOutputStream.java b/src/java/org/apache/poi/poifs/filesystem/DocumentOutputStream.java index 4e669a869b..fd1ffa9a5e 100644 --- a/src/java/org/apache/poi/poifs/filesystem/DocumentOutputStream.java +++ b/src/java/org/apache/poi/poifs/filesystem/DocumentOutputStream.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; @@ -30,12 +28,10 @@ import java.util.*; * @author Marc Johnson (mjohnson at apache dot org) */ -public class DocumentOutputStream - extends OutputStream -{ - private OutputStream stream; - private int limit; - private int written; +public final class DocumentOutputStream extends OutputStream { + private final OutputStream _stream; + private final int _limit; + private int _written; /** * Create a DocumentOutputStream @@ -44,12 +40,10 @@ public class DocumentOutputStream * read * @param limit the maximum number of bytes that can be written */ - - DocumentOutputStream(final OutputStream stream, final int limit) - { - this.stream = stream; - this.limit = limit; - this.written = 0; + DocumentOutputStream(OutputStream stream, int limit) { + _stream = stream; + _limit = limit; + _written = 0; } /** @@ -64,12 +58,11 @@ public class DocumentOutputStream * output stream has been closed, or if the * writer tries to write too much data. */ - - public void write(final int b) + public void write(int b) throws IOException { limitCheck(1); - stream.write(b); + _stream.write(b); } /** @@ -79,8 +72,7 @@ public class DocumentOutputStream * @param b the data. * @exception IOException if an I/O error occurs. */ - - public void write(final byte b[]) + public void write(byte b[]) throws IOException { write(b, 0, b.length); @@ -106,12 +98,11 @@ public class DocumentOutputStream * output stream is closed or if the writer * tries to write too many bytes. */ - - public void write(final byte b[], final int off, final int len) + public void write(byte b[], int off, int len) throws IOException { limitCheck(len); - stream.write(b, off, len); + _stream.write(b, off, len); } /** @@ -120,11 +111,10 @@ public class DocumentOutputStream * * @exception IOException if an I/O error occurs. */ - public void flush() throws IOException { - stream.flush(); + _stream.flush(); } /** @@ -135,10 +125,7 @@ public class DocumentOutputStream * * @exception IOException if an I/O error occurs. */ - - public void close() - throws IOException - { + public void close() { // ignore this call } @@ -152,27 +139,25 @@ public class DocumentOutputStream * * @exception IOException on I/O error */ - - void writeFiller(final int totalLimit, final byte fill) + void writeFiller(int totalLimit, byte fill) throws IOException { - if (totalLimit > written) + if (totalLimit > _written) { - byte[] filler = new byte[ totalLimit - written ]; + byte[] filler = new byte[ totalLimit - _written ]; Arrays.fill(filler, fill); - stream.write(filler); + _stream.write(filler); } } - private void limitCheck(final int toBeWritten) + private void limitCheck(int toBeWritten) throws IOException { - if ((written + toBeWritten) > limit) + if ((_written + toBeWritten) > _limit) { throw new IOException("tried to write too much data"); } - written += toBeWritten; + _written += toBeWritten; } -} // end public class DocumentOutputStream - +} diff --git a/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java b/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java new file mode 100644 index 0000000000..602cb5ff56 --- /dev/null +++ b/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java @@ -0,0 +1,303 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.filesystem; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Iterator; + +import org.apache.poi.poifs.property.DocumentProperty; +import org.apache.poi.util.LittleEndian; + +/** + * This class provides methods to read a DocumentEntry managed by a + * {@link NPOIFSFileSystem} instance. + */ +public final class NDocumentInputStream extends DocumentInputStream { + /** current offset into the Document */ + private int _current_offset; + /** current block count */ + private int _current_block_count; + + /** current marked offset into the Document (used by mark and reset) */ + private int _marked_offset; + /** and the block count for it */ + private int _marked_offset_count; + + /** the Document's size */ + private int _document_size; + + /** have we been closed? */ + private boolean _closed; + + /** the actual Document */ + private NPOIFSDocument _document; + + private Iterator _data; + private ByteBuffer _buffer; + + /** + * Create an InputStream from the specified DocumentEntry + * + * @param document the DocumentEntry to be read + * + * @exception IOException if the DocumentEntry cannot be opened (like, maybe it has + * been deleted?) + */ + public NDocumentInputStream(DocumentEntry document) throws IOException { + if (!(document instanceof DocumentNode)) { + throw new IOException("Cannot open internal document storage"); + } + _current_offset = 0; + _current_block_count = 0; + _marked_offset = 0; + _marked_offset_count = 0; + _document_size = document.getSize(); + _closed = false; + + DocumentNode doc = (DocumentNode)document; + DocumentProperty property = (DocumentProperty)doc.getProperty(); + _document = new NPOIFSDocument( + property, + ((DirectoryNode)doc.getParent()).getNFileSystem() + ); + _data = _document.getBlockIterator(); + } + + /** + * Create an InputStream from the specified Document + * + * @param document the Document to be read + */ + public NDocumentInputStream(NPOIFSDocument document) { + _current_offset = 0; + _current_block_count = 0; + _marked_offset = 0; + _marked_offset_count = 0; + _document_size = document.getSize(); + _closed = false; + _document = document; + _data = _document.getBlockIterator(); + } + + @Override + public int available() { + if (_closed) { + throw new IllegalStateException("cannot perform requested operation on a closed stream"); + } + return _document_size - _current_offset; + } + + @Override + public void close() { + _closed = true; + } + + @Override + public void mark(int ignoredReadlimit) { + _marked_offset = _current_offset; + _marked_offset_count = _current_block_count; + } + + @Override + public int read() throws IOException { + dieIfClosed(); + if (atEOD()) { + return EOF; + } + byte[] b = new byte[1]; + int result = read(b, 0, 1); + if(result >= 0) { + if(b[0] < 0) { + return b[0]+256; + } + return b[0]; + } + return result; + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + dieIfClosed(); + if (b == null) { + throw new IllegalArgumentException("buffer must not be null"); + } + if (off < 0 || len < 0 || b.length < off + len) { + throw new IndexOutOfBoundsException("can't read past buffer boundaries"); + } + if (len == 0) { + return 0; + } + if (atEOD()) { + return EOF; + } + int limit = Math.min(available(), len); + readFully(b, off, limit); + return limit; + } + + /** + * Repositions this stream to the position at the time the mark() method was + * last called on this input stream. If mark() has not been called this + * method repositions the stream to its beginning. + */ + @Override + public void reset() { + // Special case for reset to the start + if(_marked_offset == 0 && _marked_offset_count == 0) { + _current_block_count = _marked_offset_count; + _current_offset = _marked_offset; + _data = _document.getBlockIterator(); + _buffer = null; + return; + } + + // Start again, then wind on to the required block + _data = _document.getBlockIterator(); + _current_offset = 0; + for(int i=0; i<_marked_offset_count; i++) { + _buffer = _data.next(); + _current_offset += _buffer.remaining(); + } + + _current_block_count = _marked_offset_count; + + // Do we need to position within it? + if(_current_offset != _marked_offset) { + // Grab the right block + _buffer = _data.next(); + _current_block_count++; + + // Skip to the right place in it + _buffer.position(_marked_offset - _current_offset); + } + + // All done + _current_offset = _marked_offset; + } + + @Override + public long skip(long n) throws IOException { + dieIfClosed(); + if (n < 0) { + return 0; + } + int new_offset = _current_offset + (int) n; + + if (new_offset < _current_offset) { + // wrap around in converting a VERY large long to an int + new_offset = _document_size; + } else if (new_offset > _document_size) { + new_offset = _document_size; + } + + long rval = new_offset - _current_offset; + + // TODO Do this better + byte[] skip = new byte[(int)rval]; + readFully(skip); + return rval; + } + + private void dieIfClosed() throws IOException { + if (_closed) { + throw new IOException("cannot perform requested operation on a closed stream"); + } + } + + private boolean atEOD() { + return _current_offset == _document_size; + } + + private void checkAvaliable(int requestedSize) { + if (_closed) { + throw new IllegalStateException("cannot perform requested operation on a closed stream"); + } + if (requestedSize > _document_size - _current_offset) { + throw new RuntimeException("Buffer underrun - requested " + requestedSize + + " bytes but " + (_document_size - _current_offset) + " was available"); + } + } + + @Override + public void readFully(byte[] buf, int off, int len) { + checkAvaliable(len); + + int read = 0; + while(read < len) { + if(_buffer == null || _buffer.remaining() == 0) { + _current_block_count++; + _buffer = _data.next(); + } + + int limit = Math.min(len-read, _buffer.remaining()); + _buffer.get(buf, off+read, limit); + _current_offset += limit; + read += limit; + } + } + + @Override + public byte readByte() { + return (byte) readUByte(); + } + + @Override + public double readDouble() { + return Double.longBitsToDouble(readLong()); + } + + @Override + public long readLong() { + checkAvaliable(SIZE_LONG); + byte[] data = new byte[SIZE_LONG]; + readFully(data, 0, SIZE_LONG); + return LittleEndian.getLong(data, 0); + } + + @Override + public short readShort() { + return (short) readUShort(); + } + + @Override + public int readInt() { + checkAvaliable(SIZE_INT); + byte[] data = new byte[SIZE_INT]; + readFully(data, 0, SIZE_INT); + return LittleEndian.getInt(data); + } + + @Override + public int readUShort() { + checkAvaliable(SIZE_SHORT); + byte[] data = new byte[SIZE_SHORT]; + readFully(data, 0, SIZE_SHORT); + return LittleEndian.getShort(data); + } + + @Override + public int readUByte() { + checkAvaliable(1); + byte[] data = new byte[1]; + readFully(data, 0, 1); + if(data[0] >= 0) + return data[0]; + return data[0] + 256; + } +} diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java new file mode 100644 index 0000000000..09536d4ade --- /dev/null +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java @@ -0,0 +1,193 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.filesystem; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.Collections; +import java.util.Iterator; + +import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.dev.POIFSViewable; +import org.apache.poi.poifs.property.DocumentProperty; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.IOUtils; + +/** + * This class manages a document in the NIO POIFS filesystem. + * This is the {@link NPOIFSFileSystem} version. + */ +public final class NPOIFSDocument implements POIFSViewable { + private DocumentProperty _property; + + private NPOIFSFileSystem _filesystem; + private NPOIFSStream _stream; + private int _block_size; + + /** + * Constructor for an existing Document + */ + public NPOIFSDocument(DocumentProperty property, NPOIFSFileSystem filesystem) + throws IOException + { + this._property = property; + this._filesystem = filesystem; + + if(property.getSize() <= POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE) { + _stream = new NPOIFSStream(_filesystem.getMiniStore(), property.getStartBlock()); + _block_size = _filesystem.getMiniStore().getBlockStoreBlockSize(); + } else { + _stream = new NPOIFSStream(_filesystem, property.getStartBlock()); + _block_size = _filesystem.getBlockStoreBlockSize(); + } + } + + /** + * Constructor for a new Document + * + * @param name the name of the POIFSDocument + * @param stream the InputStream we read data from + */ + public NPOIFSDocument(String name, NPOIFSFileSystem filesystem, InputStream stream) + throws IOException + { + this._filesystem = filesystem; + + // Buffer the contents into memory. This is a bit icky... + // TODO Replace with a buffer up to the mini stream size, then streaming write + byte[] contents; + if(stream instanceof ByteArrayInputStream) { + ByteArrayInputStream bais = (ByteArrayInputStream)stream; + contents = new byte[bais.available()]; + bais.read(contents); + } else { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + IOUtils.copy(stream, baos); + contents = baos.toByteArray(); + } + + // Do we need to store as a mini stream or a full one? + if(contents.length <= POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE) { + _stream = new NPOIFSStream(filesystem.getMiniStore()); + _block_size = _filesystem.getMiniStore().getBlockStoreBlockSize(); + } else { + _stream = new NPOIFSStream(filesystem); + _block_size = _filesystem.getBlockStoreBlockSize(); + } + + // Store it + _stream.updateContents(contents); + + // And build the property for it + this._property = new DocumentProperty(name, contents.length); + _property.setStartBlock(_stream.getStartBlock()); + } + + int getDocumentBlockSize() { + return _block_size; + } + + Iterator getBlockIterator() { + return _stream.getBlockIterator(); + } + + /** + * @return size of the document + */ + public int getSize() { + return _property.getSize(); + } + + /** + * @return the instance's DocumentProperty + */ + DocumentProperty getDocumentProperty() { + return _property; + } + + /** + * Get an array of objects, some of which may implement POIFSViewable + * + * @return an array of Object; may not be null, but may be empty + */ + public Object[] getViewableArray() { + Object[] results = new Object[1]; + String result; + + try { + if(getSize() > 0) { + // Get all the data into a single array + byte[] data = new byte[getSize()]; + int offset = 0; + for(ByteBuffer buffer : _stream) { + int length = Math.min(_block_size, data.length-offset); + buffer.get(data, offset, length); + offset += length; + } + + ByteArrayOutputStream output = new ByteArrayOutputStream(); + HexDump.dump(data, 0, output, 0); + result = output.toString(); + } else { + result = ""; + } + } catch (IOException e) { + result = e.getMessage(); + } + results[0] = result; + return results; + } + + /** + * Get an Iterator of objects, some of which may implement POIFSViewable + * + * @return an Iterator; may not be null, but may have an empty back end + * store + */ + public Iterator getViewableIterator() { + return Collections.EMPTY_LIST.iterator(); + } + + /** + * Give viewers a hint as to whether to call getViewableArray or + * getViewableIterator + * + * @return true if a viewer should call getViewableArray, + * false if a viewer should call getViewableIterator + */ + public boolean preferArray() { + return true; + } + + /** + * Provides a short description of the object, to be used when a + * POIFSViewable object has not provided its contents. + * + * @return short description + */ + public String getShortDescription() { + StringBuffer buffer = new StringBuffer(); + + buffer.append("Document: \"").append(_property.getName()).append("\""); + buffer.append(" size = ").append(getSize()); + return buffer.toString(); + } +} diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java new file mode 100644 index 0000000000..e671d870bb --- /dev/null +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java @@ -0,0 +1,788 @@ + +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + + +package org.apache.poi.poifs.filesystem; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PushbackInputStream; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.ReadableByteChannel; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.apache.poi.poifs.common.POIFSBigBlockSize; +import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.dev.POIFSViewable; +import org.apache.poi.poifs.nio.ByteArrayBackedDataSource; +import org.apache.poi.poifs.nio.DataSource; +import org.apache.poi.poifs.nio.FileBackedDataSource; +import org.apache.poi.poifs.property.DirectoryProperty; +import org.apache.poi.poifs.property.NPropertyTable; +import org.apache.poi.poifs.storage.BATBlock; +import org.apache.poi.poifs.storage.BlockAllocationTableReader; +import org.apache.poi.poifs.storage.BlockAllocationTableWriter; +import org.apache.poi.poifs.storage.HeaderBlock; +import org.apache.poi.poifs.storage.HeaderBlockConstants; +import org.apache.poi.poifs.storage.HeaderBlockWriter; +import org.apache.poi.poifs.storage.BATBlock.BATBlockAndIndex; +import org.apache.poi.util.CloseIgnoringInputStream; +import org.apache.poi.util.IOUtils; +import org.apache.poi.util.LongField; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; + +/** + * This is the main class of the POIFS system; it manages the entire + * life cycle of the filesystem. + * This is the new NIO version + */ + +public class NPOIFSFileSystem extends BlockStore + implements POIFSViewable +{ + private static final POILogger _logger = + POILogFactory.getLogger(NPOIFSFileSystem.class); + + /** + * Convenience method for clients that want to avoid the auto-close behaviour of the constructor. + */ + public static InputStream createNonClosingInputStream(InputStream is) { + return new CloseIgnoringInputStream(is); + } + + private NPOIFSMiniStore _mini_store; + private NPropertyTable _property_table; + private List _xbat_blocks; + private List _bat_blocks; + private HeaderBlock _header; + private DirectoryNode _root; + + private DataSource _data; + + /** + * What big block size the file uses. Most files + * use 512 bytes, but a few use 4096 + */ + private POIFSBigBlockSize bigBlockSize = + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; + + /** + * Constructor, intended for writing + */ + public NPOIFSFileSystem() + { + _header = new HeaderBlock(bigBlockSize); + _property_table = new NPropertyTable(_header); + _mini_store = new NPOIFSMiniStore(this, _property_table.getRoot(), new ArrayList(), _header); + _xbat_blocks = new ArrayList(); + _bat_blocks = new ArrayList(); + _root = null; + } + + /** + * Creates a POIFSFileSystem from a File. This uses less memory than + * creating from an InputStream. + * + * Note that with this constructor, you will need to call {@link #close()} + * when you're done to have the underlying file closed, as the file is + * kept open during normal operation to read the data out. + * + * @param file the File from which to read the data + * + * @exception IOException on errors reading, or on invalid data + */ + public NPOIFSFileSystem(File file) + throws IOException + { + this(); + + // Open the underlying channel + FileChannel channel = (new RandomAccessFile(file, "r")).getChannel(); + + // Get the header + ByteBuffer headerBuffer = ByteBuffer.allocate(POIFSConstants.SMALLER_BIG_BLOCK_SIZE); + IOUtils.readFully(channel, headerBuffer); + + // Have the header processed + _header = new HeaderBlock(headerBuffer); + + // Now process the various entries + _data = new FileBackedDataSource(channel); + readCoreContents(); + } + + /** + * Create a POIFSFileSystem from an InputStream. Normally the stream is read until + * EOF. The stream is always closed.

    + * + * Some streams are usable after reaching EOF (typically those that return true + * for markSupported()). In the unlikely case that the caller has such a stream + * and needs to use it after this constructor completes, a work around is to wrap the + * stream in order to trap the close() call. A convenience method ( + * createNonClosingInputStream()) has been provided for this purpose: + *

    +     * InputStream wrappedStream = POIFSFileSystem.createNonClosingInputStream(is);
    +     * HSSFWorkbook wb = new HSSFWorkbook(wrappedStream);
    +     * is.reset();
    +     * doSomethingElse(is);
    +     * 
    + * Note also the special case of ByteArrayInputStream for which the close() + * method does nothing. + *
    +     * ByteArrayInputStream bais = ...
    +     * HSSFWorkbook wb = new HSSFWorkbook(bais); // calls bais.close() !
    +     * bais.reset(); // no problem
    +     * doSomethingElse(bais);
    +     * 
    + * + * @param stream the InputStream from which to read the data + * + * @exception IOException on errors reading, or on invalid data + */ + + public NPOIFSFileSystem(InputStream stream) + throws IOException + { + this(); + + ReadableByteChannel channel = null; + boolean success = false; + + try { + // Turn our InputStream into something NIO based + channel = Channels.newChannel(stream); + + // Get the header + ByteBuffer headerBuffer = ByteBuffer.allocate(POIFSConstants.SMALLER_BIG_BLOCK_SIZE); + IOUtils.readFully(channel, headerBuffer); + + // Have the header processed + _header = new HeaderBlock(headerBuffer); + + // Sanity check the block count + BlockAllocationTableReader.sanityCheckBlockCount(_header.getBATCount()); + + // We need to buffer the whole file into memory when + // working with an InputStream. + // The max possible size is when each BAT block entry is used + int maxSize = BATBlock.calculateMaximumSize(_header); + ByteBuffer data = ByteBuffer.allocate(maxSize); + // Copy in the header + headerBuffer.position(0); + data.put(headerBuffer); + data.position(headerBuffer.capacity()); + // Now read the rest of the stream + IOUtils.readFully(channel, data); + success = true; + + // Turn it into a DataSource + _data = new ByteArrayBackedDataSource(data.array(), data.position()); + } finally { + // As per the constructor contract, always close the stream + if(channel != null) + channel.close(); + closeInputStream(stream, success); + } + + // Now process the various entries + readCoreContents(); + } + /** + * @param stream the stream to be closed + * @param success false if an exception is currently being thrown in the calling method + */ + private void closeInputStream(InputStream stream, boolean success) { + try { + stream.close(); + } catch (IOException e) { + if(success) { + throw new RuntimeException(e); + } + // else not success? Try block did not complete normally + // just print stack trace and leave original ex to be thrown + e.printStackTrace(); + } + } + + /** + * Checks that the supplied InputStream (which MUST + * support mark and reset, or be a PushbackInputStream) + * has a POIFS (OLE2) header at the start of it. + * If your InputStream does not support mark / reset, + * then wrap it in a PushBackInputStream, then be + * sure to always use that, and not the original! + * @param inp An InputStream which supports either mark/reset, or is a PushbackInputStream + */ + public static boolean hasPOIFSHeader(InputStream inp) throws IOException { + // We want to peek at the first 8 bytes + inp.mark(8); + + byte[] header = new byte[8]; + IOUtils.readFully(inp, header); + LongField signature = new LongField(HeaderBlockConstants._signature_offset, header); + + // Wind back those 8 bytes + if(inp instanceof PushbackInputStream) { + PushbackInputStream pin = (PushbackInputStream)inp; + pin.unread(header); + } else { + inp.reset(); + } + + // Did it match the signature? + return (signature.get() == HeaderBlockConstants._signature); + } + + /** + * Read and process the PropertiesTable and the + * FAT / XFAT blocks, so that we're ready to + * work with the file + */ + private void readCoreContents() throws IOException { + // Grab the block size + bigBlockSize = _header.getBigBlockSize(); + + // Each block should only ever be used by one of the + // FAT, XFAT or Property Table. Ensure it does + ChainLoopDetector loopDetector = getChainLoopDetector(); + + // Read the FAT blocks + for(int fatAt : _header.getBATArray()) { + readBAT(fatAt, loopDetector); + } + + // Now read the XFAT blocks, and the FATs within them + BATBlock xfat; + int nextAt = _header.getXBATIndex(); + for(int i=0; i<_header.getXBATCount(); i++) { + loopDetector.claim(nextAt); + ByteBuffer fatData = getBlockAt(nextAt); + xfat = BATBlock.createBATBlock(bigBlockSize, fatData); + xfat.setOurBlockIndex(nextAt); + nextAt = xfat.getValueAt(bigBlockSize.getXBATEntriesPerBlock()); + _xbat_blocks.add(xfat); + + for(int j=0; j sbats = new ArrayList(); + _mini_store = new NPOIFSMiniStore(this, _property_table.getRoot(), sbats, _header); + nextAt = _header.getSBATStart(); + for(int i=0; i<_header.getSBATCount(); i++) { + loopDetector.claim(nextAt); + ByteBuffer fatData = getBlockAt(nextAt); + sfat = BATBlock.createBATBlock(bigBlockSize, fatData); + sfat.setOurBlockIndex(nextAt); + sbats.add(sfat); + nextAt = getNextBlock(nextAt); + } + } + private void readBAT(int batAt, ChainLoopDetector loopDetector) throws IOException { + loopDetector.claim(batAt); + ByteBuffer fatData = getBlockAt(batAt); + BATBlock bat = BATBlock.createBATBlock(bigBlockSize, fatData); + bat.setOurBlockIndex(batAt); + _bat_blocks.add(bat); + } + private BATBlock createBAT(int offset, boolean isBAT) throws IOException { + // Create a new BATBlock + BATBlock newBAT = BATBlock.createEmptyBATBlock(bigBlockSize, !isBAT); + newBAT.setOurBlockIndex(offset); + // Ensure there's a spot in the file for it + ByteBuffer buffer = ByteBuffer.allocate(bigBlockSize.getBigBlockSize()); + int writeTo = (1+offset) * bigBlockSize.getBigBlockSize(); // Header isn't in BATs + _data.write(buffer, writeTo); + // All done + return newBAT; + } + + /** + * Load the block at the given offset. + */ + protected ByteBuffer getBlockAt(final int offset) throws IOException { + // The header block doesn't count, so add one + long startAt = (offset+1) * bigBlockSize.getBigBlockSize(); + return _data.read(bigBlockSize.getBigBlockSize(), startAt); + } + + /** + * Load the block at the given offset, + * extending the file if needed + */ + protected ByteBuffer createBlockIfNeeded(final int offset) throws IOException { + try { + return getBlockAt(offset); + } catch(IndexOutOfBoundsException e) { + // The header block doesn't count, so add one + long startAt = (offset+1) * bigBlockSize.getBigBlockSize(); + // Allocate and write + ByteBuffer buffer = ByteBuffer.allocate(getBigBlockSize()); + _data.write(buffer, startAt); + // Retrieve the properly backed block + return getBlockAt(offset); + } + } + + /** + * Returns the BATBlock that handles the specified offset, + * and the relative index within it + */ + protected BATBlockAndIndex getBATBlockAndIndex(final int offset) { + return BATBlock.getBATBlockAndIndex( + offset, _header, _bat_blocks + ); + } + + /** + * Works out what block follows the specified one. + */ + protected int getNextBlock(final int offset) { + BATBlockAndIndex bai = getBATBlockAndIndex(offset); + return bai.getBlock().getValueAt( bai.getIndex() ); + } + + /** + * Changes the record of what block follows the specified one. + */ + protected void setNextBlock(final int offset, final int nextBlock) { + BATBlockAndIndex bai = getBATBlockAndIndex(offset); + bai.getBlock().setValueAt( + bai.getIndex(), nextBlock + ); + } + + /** + * Finds a free block, and returns its offset. + * This method will extend the file if needed, and if doing + * so, allocate new FAT blocks to address the extra space. + */ + protected int getFreeBlock() throws IOException { + // First up, do we have any spare ones? + int offset = 0; + for(int i=0; i<_bat_blocks.size(); i++) { + int numSectors = bigBlockSize.getBATEntriesPerBlock(); + + // Check this one + BATBlock bat = _bat_blocks.get(i); + if(bat.hasFreeSectors()) { + // Claim one of them and return it + for(int j=0; j= 109) { + // Needs to come from an XBAT + BATBlock xbat = null; + for(BATBlock x : _xbat_blocks) { + if(x.hasFreeSectors()) { + xbat = x; + break; + } + } + if(xbat == null) { + // Oh joy, we need a new XBAT too... + xbat = createBAT(offset+1, false); + xbat.setValueAt(0, offset); + bat.setValueAt(offset+1, POIFSConstants.DIFAT_SECTOR_BLOCK); + + // Will go one place higher as XBAT added in + offset++; + + // Chain it + if(_xbat_blocks.size() == 0) { + _header.setXBATStart(offset); + } else { + _xbat_blocks.get(_xbat_blocks.size()-1).setValueAt( + bigBlockSize.getXBATEntriesPerBlock(), offset + ); + } + _xbat_blocks.add(xbat); + _header.setXBATCount(_xbat_blocks.size()); + } + // Allocate us in the XBAT + for(int i=0; i _sbat_blocks; + private HeaderBlock _header; + private RootProperty _root; + + protected NPOIFSMiniStore(NPOIFSFileSystem filesystem, RootProperty root, + List sbats, HeaderBlock header) + { + this._filesystem = filesystem; + this._sbat_blocks = sbats; + this._header = header; + this._root = root; + + this._mini_stream = new NPOIFSStream(filesystem, root.getStartBlock()); + } + + /** + * Load the block at the given offset. + */ + protected ByteBuffer getBlockAt(final int offset) throws IOException { + // Which big block is this? + int byteOffset = offset * POIFSConstants.SMALL_BLOCK_SIZE; + int bigBlockNumber = byteOffset / _filesystem.getBigBlockSize(); + int bigBlockOffset = byteOffset % _filesystem.getBigBlockSize(); + + // Now locate the data block for it + Iterator it = _mini_stream.getBlockIterator(); + for(int i=0; i +{ + private BlockStore blockStore; + private int startBlock; + + /** + * Constructor for an existing stream. It's up to you + * to know how to get the start block (eg from a + * {@link HeaderBlock} or a {@link Property}) + */ + public NPOIFSStream(BlockStore blockStore, int startBlock) { + this.blockStore = blockStore; + this.startBlock = startBlock; + } + + /** + * Constructor for a new stream. A start block won't + * be allocated until you begin writing to it. + */ + public NPOIFSStream(BlockStore blockStore) { + this.blockStore = blockStore; + this.startBlock = POIFSConstants.END_OF_CHAIN; + } + + /** + * What block does this stream start at? + * Will be {@link POIFSConstants#END_OF_CHAIN} for a + * new stream that hasn't been written to yet. + */ + public int getStartBlock() { + return startBlock; + } + + /** + * Returns an iterator that'll supply one {@link ByteBuffer} + * per block in the stream. + */ + public Iterator iterator() { + return getBlockIterator(); + } + + public Iterator getBlockIterator() { + if(startBlock == POIFSConstants.END_OF_CHAIN) { + throw new IllegalStateException( + "Can't read from a new stream before it has been written to" + ); + } + return new StreamBlockByteBufferIterator(startBlock); + } + + /** + * Updates the contents of the stream to the new + * set of bytes. + * Note - if this is property based, you'll still + * need to update the size in the property yourself + */ + public void updateContents(byte[] contents) throws IOException { + // How many blocks are we going to need? + int blockSize = blockStore.getBlockStoreBlockSize(); + int blocks = (int)Math.ceil(contents.length / blockSize); + + // Make sure we don't encounter a loop whilst overwriting + // the existing blocks + ChainLoopDetector loopDetector = blockStore.getChainLoopDetector(); + + // Start writing + int prevBlock = POIFSConstants.END_OF_CHAIN; + int nextBlock = startBlock; + for(int i=0; i { + private ChainLoopDetector loopDetector; + private int nextBlock; + + protected StreamBlockByteBufferIterator(int firstBlock) { + this.nextBlock = firstBlock; + try { + this.loopDetector = blockStore.getChainLoopDetector(); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + + public boolean hasNext() { + if(nextBlock == POIFSConstants.END_OF_CHAIN) { + return false; + } + return true; + } + + public ByteBuffer next() { + if(nextBlock == POIFSConstants.END_OF_CHAIN) { + throw new IndexOutOfBoundsException("Can't read past the end of the stream"); + } + + try { + loopDetector.claim(nextBlock); + ByteBuffer data = blockStore.getBlockAt(nextBlock); + nextBlock = blockStore.getNextBlock(nextBlock); + return data; + } catch(IOException e) { + throw new RuntimeException(e); + } + } + + public void remove() { + throw new UnsupportedOperationException(); + } + } +} + diff --git a/src/java/org/apache/poi/poifs/filesystem/ODocumentInputStream.java b/src/java/org/apache/poi/poifs/filesystem/ODocumentInputStream.java new file mode 100644 index 0000000000..a1bc5da95f --- /dev/null +++ b/src/java/org/apache/poi/poifs/filesystem/ODocumentInputStream.java @@ -0,0 +1,321 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.filesystem; + +import java.io.IOException; + +import org.apache.poi.poifs.storage.DataInputBlock; + +/** + * This class provides methods to read a DocumentEntry managed by a + * {@link POIFSFileSystem} instance. + * + * @author Marc Johnson (mjohnson at apache dot org) + */ +public final class ODocumentInputStream extends DocumentInputStream { + /** current offset into the Document */ + private int _current_offset; + + /** current marked offset into the Document (used by mark and reset) */ + private int _marked_offset; + + /** the Document's size */ + private int _document_size; + + /** have we been closed? */ + private boolean _closed; + + /** the actual Document */ + private POIFSDocument _document; + + /** the data block containing the current stream pointer */ + private DataInputBlock _currentBlock; + + /** + * Create an InputStream from the specified DocumentEntry + * + * @param document the DocumentEntry to be read + * + * @exception IOException if the DocumentEntry cannot be opened (like, maybe it has + * been deleted?) + */ + public ODocumentInputStream(DocumentEntry document) throws IOException { + if (!(document instanceof DocumentNode)) { + throw new IOException("Cannot open internal document storage"); + } + DocumentNode documentNode = (DocumentNode)document; + if(documentNode.getDocument() == null) { + throw new IOException("Cannot open internal document storage"); + } + + _current_offset = 0; + _marked_offset = 0; + _document_size = document.getSize(); + _closed = false; + _document = documentNode.getDocument(); + _currentBlock = getDataInputBlock(0); + } + + /** + * Create an InputStream from the specified Document + * + * @param document the Document to be read + */ + public ODocumentInputStream(POIFSDocument document) { + _current_offset = 0; + _marked_offset = 0; + _document_size = document.getSize(); + _closed = false; + _document = document; + _currentBlock = getDataInputBlock(0); + } + + @Override + public int available() { + if (_closed) { + throw new IllegalStateException("cannot perform requested operation on a closed stream"); + } + return _document_size - _current_offset; + } + + @Override + public void close() { + _closed = true; + } + + @Override + public void mark(int ignoredReadlimit) { + _marked_offset = _current_offset; + } + + private DataInputBlock getDataInputBlock(int offset) { + return _document.getDataInputBlock(offset); + } + + @Override + public int read() throws IOException { + dieIfClosed(); + if (atEOD()) { + return EOF; + } + int result = _currentBlock.readUByte(); + _current_offset++; + if (_currentBlock.available() < 1) { + _currentBlock = getDataInputBlock(_current_offset); + } + return result; + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + dieIfClosed(); + if (b == null) { + throw new IllegalArgumentException("buffer must not be null"); + } + if (off < 0 || len < 0 || b.length < off + len) { + throw new IndexOutOfBoundsException("can't read past buffer boundaries"); + } + if (len == 0) { + return 0; + } + if (atEOD()) { + return EOF; + } + int limit = Math.min(available(), len); + readFully(b, off, limit); + return limit; + } + + /** + * Repositions this stream to the position at the time the mark() method was + * last called on this input stream. If mark() has not been called this + * method repositions the stream to its beginning. + */ + @Override + public void reset() { + _current_offset = _marked_offset; + _currentBlock = getDataInputBlock(_current_offset); + } + + @Override + public long skip(long n) throws IOException { + dieIfClosed(); + if (n < 0) { + return 0; + } + int new_offset = _current_offset + (int) n; + + if (new_offset < _current_offset) { + + // wrap around in converting a VERY large long to an int + new_offset = _document_size; + } else if (new_offset > _document_size) { + new_offset = _document_size; + } + long rval = new_offset - _current_offset; + + _current_offset = new_offset; + _currentBlock = getDataInputBlock(_current_offset); + return rval; + } + + private void dieIfClosed() throws IOException { + if (_closed) { + throw new IOException("cannot perform requested operation on a closed stream"); + } + } + + private boolean atEOD() { + return _current_offset == _document_size; + } + + private void checkAvaliable(int requestedSize) { + if (_closed) { + throw new IllegalStateException("cannot perform requested operation on a closed stream"); + } + if (requestedSize > _document_size - _current_offset) { + throw new RuntimeException("Buffer underrun - requested " + requestedSize + + " bytes but " + (_document_size - _current_offset) + " was available"); + } + } + + @Override + public byte readByte() { + return (byte) readUByte(); + } + + @Override + public double readDouble() { + return Double.longBitsToDouble(readLong()); + } + + @Override + public short readShort() { + return (short) readUShort(); + } + + @Override + public void readFully(byte[] buf, int off, int len) { + checkAvaliable(len); + int blockAvailable = _currentBlock.available(); + if (blockAvailable > len) { + _currentBlock.readFully(buf, off, len); + _current_offset += len; + return; + } + // else read big amount in chunks + int remaining = len; + int writePos = off; + while (remaining > 0) { + boolean blockIsExpiring = remaining >= blockAvailable; + int reqSize; + if (blockIsExpiring) { + reqSize = blockAvailable; + } else { + reqSize = remaining; + } + _currentBlock.readFully(buf, writePos, reqSize); + remaining -= reqSize; + writePos += reqSize; + _current_offset += reqSize; + if (blockIsExpiring) { + if (_current_offset == _document_size) { + if (remaining > 0) { + throw new IllegalStateException( + "reached end of document stream unexpectedly"); + } + _currentBlock = null; + break; + } + _currentBlock = getDataInputBlock(_current_offset); + blockAvailable = _currentBlock.available(); + } + } + } + + @Override + public long readLong() { + checkAvaliable(SIZE_LONG); + int blockAvailable = _currentBlock.available(); + long result; + if (blockAvailable > SIZE_LONG) { + result = _currentBlock.readLongLE(); + } else { + DataInputBlock nextBlock = getDataInputBlock(_current_offset + blockAvailable); + if (blockAvailable == SIZE_LONG) { + result = _currentBlock.readLongLE(); + } else { + result = nextBlock.readLongLE(_currentBlock, blockAvailable); + } + _currentBlock = nextBlock; + } + _current_offset += SIZE_LONG; + return result; + } + + @Override + public int readInt() { + checkAvaliable(SIZE_INT); + int blockAvailable = _currentBlock.available(); + int result; + if (blockAvailable > SIZE_INT) { + result = _currentBlock.readIntLE(); + } else { + DataInputBlock nextBlock = getDataInputBlock(_current_offset + blockAvailable); + if (blockAvailable == SIZE_INT) { + result = _currentBlock.readIntLE(); + } else { + result = nextBlock.readIntLE(_currentBlock, blockAvailable); + } + _currentBlock = nextBlock; + } + _current_offset += SIZE_INT; + return result; + } + + @Override + public int readUShort() { + checkAvaliable(SIZE_SHORT); + int blockAvailable = _currentBlock.available(); + int result; + if (blockAvailable > SIZE_SHORT) { + result = _currentBlock.readUShortLE(); + } else { + DataInputBlock nextBlock = getDataInputBlock(_current_offset + blockAvailable); + if (blockAvailable == SIZE_SHORT) { + result = _currentBlock.readUShortLE(); + } else { + result = nextBlock.readUShortLE(_currentBlock); + } + _currentBlock = nextBlock; + } + _current_offset += SIZE_SHORT; + return result; + } + + @Override + public int readUByte() { + checkAvaliable(1); + int result = _currentBlock.readUByte(); + _current_offset++; + if (_currentBlock.available() < 1) { + _currentBlock = getDataInputBlock(_current_offset); + } + return result; + } +} diff --git a/src/java/org/apache/poi/poifs/filesystem/Ole10Native.java b/src/java/org/apache/poi/poifs/filesystem/Ole10Native.java new file mode 100644 index 0000000000..488bfb3053 --- /dev/null +++ b/src/java/org/apache/poi/poifs/filesystem/Ole10Native.java @@ -0,0 +1,279 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.filesystem; + +import org.apache.poi.util.*; + +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * Represents an Ole10Native record which is wrapped around certain binary + * files being embedded in OLE2 documents. + * + * @author Rainer Schwarze + */ +public class Ole10Native { + // (the fields as they appear in the raw record:) + private final int totalSize; // 4 bytes, total size of record not including this field + private short flags1; // 2 bytes, unknown, mostly [02 00] + private final String label; // ASCIIZ, stored in this field without the terminating zero + private final String fileName; // ASCIIZ, stored in this field without the terminating zero + private short flags2; // 2 bytes, unknown, mostly [00 00] + // private byte unknown1Length; // 1 byte, specifying the length of the following byte array (unknown1) + private byte[] unknown1; // see below + private byte[] unknown2; // 3 bytes, unknown, mostly [00 00 00] + private final String command; // ASCIIZ, stored in this field without the terminating zero + private final int dataSize; // 4 bytes (if space), size of following buffer + private final byte[] dataBuffer; // varying size, the actual native data + private short flags3; // some final flags? or zero terminators?, sometimes not there + public static final String OLE10_NATIVE = "\u0001Ole10Native"; + + /** + * Creates an instance of this class from an embedded OLE Object. The OLE Object is expected + * to include a stream "{01}Ole10Native" which contains the actual + * data relevant for this class. + * + * @param poifs POI Filesystem object + * @return Returns an instance of this class + * @throws IOException on IO error + * @throws Ole10NativeException on invalid or unexcepted data format + */ + public static Ole10Native createFromEmbeddedOleObject(POIFSFileSystem poifs) throws IOException, Ole10NativeException { + boolean plain = false; + + try { + poifs.getRoot().getEntry("\u0001Ole10ItemName"); + plain = true; + } catch (FileNotFoundException ex) { + plain = false; + } + + DocumentInputStream dis = poifs.createDocumentInputStream(OLE10_NATIVE); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + IOUtils.copy(dis, bos); + byte[] data = bos.toByteArray(); + + return new Ole10Native(data, 0, plain); + } + + /** + * Creates an instance and fills the fields based on the data in the given buffer. + * + * @param data The buffer containing the Ole10Native record + * @param offset The start offset of the record in the buffer + * @throws Ole10NativeException on invalid or unexcepted data format + */ + public Ole10Native(byte[] data, int offset) throws Ole10NativeException { + this(data, offset, false); + } + /** + * Creates an instance and fills the fields based on the data in the given buffer. + * + * @param data The buffer containing the Ole10Native record + * @param offset The start offset of the record in the buffer + * @param plain Specified 'plain' format without filename + * @throws Ole10NativeException on invalid or unexcepted data format + */ + public Ole10Native(byte[] data, int offset, boolean plain) throws Ole10NativeException { + int ofs = offset; // current offset, initialized to start + + if (data.length LittleEndianConsts.INT_SIZE) { + dataSize = LittleEndian.getInt(data, ofs); + ofs += LittleEndianConsts.INT_SIZE; + + if (dataSize > totalSize || dataSize<0) { + throw new Ole10NativeException("Invalid Ole10Native"); + } + + dataBuffer = new byte[dataSize]; + System.arraycopy(data, ofs, dataBuffer, 0, dataSize); + ofs += dataSize; + + if (unknown1.length > 0) { + flags3 = LittleEndian.getShort(data, ofs); + ofs += LittleEndianConsts.SHORT_SIZE; + } else { + flags3 = 0; + } + } else { + throw new Ole10NativeException("Invalid Ole10Native"); + } + } + } + + /* + * Helper - determine length of zero terminated string (ASCIIZ). + */ + private static int getStringLength(byte[] data, int ofs) { + int len = 0; + while (len+ofsnull. + * + * @return the dataSize + */ + public int getDataSize() { + return dataSize; + } + + /** + * Returns the buffer containing the embedded file's data, or null + * if no data was embedded. Note that an embedding may provide information about + * the data, but the actual data is not included. (So label, filename etc. are + * available, but this method returns null.) + * + * @return the dataBuffer + */ + public byte[] getDataBuffer() { + return dataBuffer; + } + + /** + * Returns the flags3 - currently unknown. + * + * @return the flags3 + */ + public short getFlags3() { + return flags3; + } +} diff --git a/src/java/org/apache/poi/poifs/filesystem/Ole10NativeException.java b/src/java/org/apache/poi/poifs/filesystem/Ole10NativeException.java new file mode 100644 index 0000000000..a186990ca0 --- /dev/null +++ b/src/java/org/apache/poi/poifs/filesystem/Ole10NativeException.java @@ -0,0 +1,24 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.filesystem; + +public class Ole10NativeException extends Exception { + public Ole10NativeException(String message) { + super(message); + } +} diff --git a/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java b/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java index c313baf489..5588c8baa9 100644 --- a/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java +++ b/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,21 +14,27 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; -import java.io.*; - -import java.util.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.dev.POIFSViewable; import org.apache.poi.poifs.property.DocumentProperty; import org.apache.poi.poifs.property.Property; import org.apache.poi.poifs.storage.BlockWritable; -import org.apache.poi.poifs.storage.ListManagedBlock; +import org.apache.poi.poifs.storage.DataInputBlock; import org.apache.poi.poifs.storage.DocumentBlock; +import org.apache.poi.poifs.storage.ListManagedBlock; import org.apache.poi.poifs.storage.RawDataBlock; import org.apache.poi.poifs.storage.SmallDocumentBlock; import org.apache.poi.util.HexDump; @@ -39,595 +44,525 @@ import org.apache.poi.util.HexDump; * * @author Marc Johnson (mjohnson at apache dot org) */ - -public class POIFSDocument - implements BATManaged, BlockWritable, POIFSViewable -{ - private DocumentProperty _property; - private int _size; - - // one of these stores will be valid - private SmallBlockStore _small_store; - private BigBlockStore _big_store; - - /** - * Constructor from large blocks - * - * @param name the name of the POIFSDocument - * @param blocks the big blocks making up the POIFSDocument - * @param length the actual length of the POIFSDocument - * - * @exception IOException - */ - - public POIFSDocument(final String name, final RawDataBlock [] blocks, - final int length) - throws IOException - { - _size = length; - _big_store = new BigBlockStore(blocks); - _property = new DocumentProperty(name, _size); - _small_store = new SmallBlockStore(new BlockWritable[ 0 ]); - _property.setDocument(this); - } - - /** - * Constructor from small blocks - * - * @param name the name of the POIFSDocument - * @param blocks the small blocks making up the POIFSDocument - * @param length the actual length of the POIFSDocument - */ - - public POIFSDocument(final String name, - final SmallDocumentBlock [] blocks, final int length) - { - _size = length; - try - { - _big_store = new BigBlockStore(new RawDataBlock[ 0 ]); - } - catch (IOException ignored) - { - - // can't happen with that constructor - } - _property = new DocumentProperty(name, _size); - _small_store = new SmallBlockStore(blocks); - _property.setDocument(this); - } - - /** - * Constructor from small blocks - * - * @param name the name of the POIFSDocument - * @param blocks the small blocks making up the POIFSDocument - * @param length the actual length of the POIFSDocument - * - * @exception IOException - */ - - public POIFSDocument(final String name, final ListManagedBlock [] blocks, - final int length) - throws IOException - { - _size = length; - _property = new DocumentProperty(name, _size); - _property.setDocument(this); - if (Property.isSmall(_size)) - { - _big_store = new BigBlockStore(new RawDataBlock[ 0 ]); - _small_store = new SmallBlockStore(blocks); - } - else - { - _big_store = new BigBlockStore(blocks); - _small_store = new SmallBlockStore(new BlockWritable[ 0 ]); - } - } - - /** - * Constructor - * - * @param name the name of the POIFSDocument - * @param stream the InputStream we read data from - * - * @exception IOException thrown on read errors - */ - - public POIFSDocument(final String name, final InputStream stream) - throws IOException - { - List blocks = new ArrayList(); - - _size = 0; - while (true) - { - DocumentBlock block = new DocumentBlock(stream); - int blockSize = block.size(); - - if (blockSize > 0) - { - blocks.add(block); - _size += blockSize; - } - if (block.partiallyRead()) - { - break; - } - } - DocumentBlock[] bigBlocks = - ( DocumentBlock [] ) blocks.toArray(new DocumentBlock[ 0 ]); - - _big_store = new BigBlockStore(bigBlocks); - _property = new DocumentProperty(name, _size); - _property.setDocument(this); - if (_property.shouldUseSmallBlocks()) - { - _small_store = - new SmallBlockStore(SmallDocumentBlock.convert(bigBlocks, - _size)); - _big_store = new BigBlockStore(new DocumentBlock[ 0 ]); - } - else - { - _small_store = new SmallBlockStore(new BlockWritable[ 0 ]); - } - } - - /** - * Constructor - * - * @param name the name of the POIFSDocument - * @param size the length of the POIFSDocument - * @param path the path of the POIFSDocument - * @param writer the writer who will eventually write the document - * contents - * - * @exception IOException thrown on read errors - */ - - public POIFSDocument(final String name, final int size, - final POIFSDocumentPath path, - final POIFSWriterListener writer) - throws IOException - { - _size = size; - _property = new DocumentProperty(name, _size); - _property.setDocument(this); - if (_property.shouldUseSmallBlocks()) - { - _small_store = new SmallBlockStore(path, name, size, writer); - _big_store = new BigBlockStore(new Object[ 0 ]); - } - else - { - _small_store = new SmallBlockStore(new BlockWritable[ 0 ]); - _big_store = new BigBlockStore(path, name, size, writer); - } - } - - /** - * return the array of SmallDocumentBlocks used - * - * @return array of SmallDocumentBlocks; may be empty, cannot be null - */ - - public BlockWritable [] getSmallBlocks() - { - return _small_store.getBlocks(); - } - - /** - * @return size of the document - */ - - public int getSize() - { - return _size; - } - - /** - * read data from the internal stores - * - * @param buffer the buffer to write to - * @param offset the offset into our storage to read from - */ - - void read(final byte [] buffer, final int offset) - { - if (_property.shouldUseSmallBlocks()) - { - SmallDocumentBlock.read(_small_store.getBlocks(), buffer, offset); - } - else - { - DocumentBlock.read(_big_store.getBlocks(), buffer, offset); - } - } - - /** - * Get the DocumentProperty - * - * @return the instance's DocumentProperty - */ - - DocumentProperty getDocumentProperty() - { - return _property; - } - - /* ********** START implementation of BlockWritable ********** */ - - /** - * Write the storage to an OutputStream - * - * @param stream the OutputStream to which the stored data should - * be written - * - * @exception IOException on problems writing to the specified - * stream - */ - - public void writeBlocks(final OutputStream stream) - throws IOException - { - _big_store.writeBlocks(stream); - } - - /* ********** END implementation of BlockWritable ********** */ - /* ********** START implementation of BATManaged ********** */ - - /** - * Return the number of BigBlock's this instance uses - * - * @return count of BigBlock instances - */ - - public int countBlocks() - { - return _big_store.countBlocks(); - } - - /** - * Set the start block for this instance - * - * @param index index into the array of blocks making up the - * filesystem - */ - - public void setStartBlock(final int index) - { - _property.setStartBlock(index); - } - - /* ********** END implementation of BATManaged ********** */ - /* ********** START begin implementation of POIFSViewable ********** */ - - /** - * Get an array of objects, some of which may implement - * POIFSViewable - * - * @return an array of Object; may not be null, but may be empty - */ - - public Object [] getViewableArray() - { - Object[] results = new Object[ 1 ]; - String result; - - try - { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - BlockWritable[] blocks = null; - - if (_big_store.isValid()) - { - blocks = _big_store.getBlocks(); - } - else if (_small_store.isValid()) - { - blocks = _small_store.getBlocks(); - } - if (blocks != null) - { - for (int k = 0; k < blocks.length; k++) - { - blocks[ k ].writeBlocks(output); - } - byte[] data = output.toByteArray(); - - if (data.length > _property.getSize()) - { - byte[] tmp = new byte[ _property.getSize() ]; - - System.arraycopy(data, 0, tmp, 0, tmp.length); - data = tmp; - } - output = new ByteArrayOutputStream(); - HexDump.dump(data, 0, output, 0); - result = output.toString(); - } - else - { - result = ""; - } - } - catch (IOException e) - { - result = e.getMessage(); - } - results[ 0 ] = result; - return results; - } - - /** - * Get an Iterator of objects, some of which may implement - * POIFSViewable - * - * @return an Iterator; may not be null, but may have an empty - * back end store - */ - - public Iterator getViewableIterator() - { - return Collections.EMPTY_LIST.iterator(); - } - - /** - * Give viewers a hint as to whether to call getViewableArray or - * getViewableIterator - * - * @return true if a viewer should call getViewableArray, false if - * a viewer should call getViewableIterator - */ - - public boolean preferArray() - { - return true; - } - - /** - * Provides a short description of the object, to be used when a - * POIFSViewable object has not provided its contents. - * - * @return short description - */ - - public String getShortDescription() - { - StringBuffer buffer = new StringBuffer(); - - buffer.append("Document: \"").append(_property.getName()) - .append("\""); - buffer.append(" size = ").append(getSize()); - return buffer.toString(); - } - - /* ********** END begin implementation of POIFSViewable ********** */ - private class SmallBlockStore - { - private SmallDocumentBlock[] smallBlocks; - private POIFSDocumentPath path; - private String name; - private int size; - private POIFSWriterListener writer; - - /** - * Constructor - * - * @param blocks blocks to construct the store from - */ - - SmallBlockStore(final Object [] blocks) - { - smallBlocks = new SmallDocumentBlock[ blocks.length ]; - for (int j = 0; j < blocks.length; j++) - { - smallBlocks[ j ] = ( SmallDocumentBlock ) blocks[ j ]; - } - this.path = null; - this.name = null; - this.size = -1; - this.writer = null; - } - - /** - * Constructor for a small block store that will be written - * later - * - * @param path path of the document - * @param name name of the document - * @param size length of the document - * @param writer the object that will eventually write the document - */ - - SmallBlockStore(final POIFSDocumentPath path, final String name, - final int size, final POIFSWriterListener writer) - { - smallBlocks = new SmallDocumentBlock[ 0 ]; - this.path = path; - this.name = name; - this.size = size; - this.writer = writer; - } - - /** - * @return true if this store is a valid source of data - */ - - boolean isValid() - { - return ((smallBlocks.length > 0) || (writer != null)); - } - - /** - * @return the SmallDocumentBlocks - */ - - BlockWritable [] getBlocks() - { - if (isValid() && (writer != null)) - { - ByteArrayOutputStream stream = - new ByteArrayOutputStream(size); - DocumentOutputStream dstream = - new DocumentOutputStream(stream, size); - - writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, - path, name, size)); - smallBlocks = SmallDocumentBlock.convert(stream.toByteArray(), - size); - } - return smallBlocks; - } - } // end private class SmallBlockStore - - private class BigBlockStore - { - private DocumentBlock[] bigBlocks; - private POIFSDocumentPath path; - private String name; - private int size; - private POIFSWriterListener writer; - - /** - * Constructor - * - * @param blocks the blocks making up the store - * - * @exception IOException on I/O error - */ - - BigBlockStore(final Object [] blocks) - throws IOException - { - bigBlocks = new DocumentBlock[ blocks.length ]; - for (int j = 0; j < blocks.length; j++) - { - if (blocks[ j ] instanceof DocumentBlock) - { - bigBlocks[ j ] = ( DocumentBlock ) blocks[ j ]; - } - else - { - bigBlocks[ j ] = - new DocumentBlock(( RawDataBlock ) blocks[ j ]); - } - } - this.path = null; - this.name = null; - this.size = -1; - this.writer = null; - } - - /** - * Constructor for a big block store that will be written - * later - * - * @param path path of the document - * @param name name of the document - * @param size length of the document - * @param writer the object that will eventually write the - * document - */ - - BigBlockStore(final POIFSDocumentPath path, final String name, - final int size, final POIFSWriterListener writer) - { - bigBlocks = new DocumentBlock[ 0 ]; - this.path = path; - this.name = name; - this.size = size; - this.writer = writer; - } - - /** - * @return true if this store is a valid source of data - */ - - boolean isValid() - { - return ((bigBlocks.length > 0) || (writer != null)); - } - - /** - * @return the DocumentBlocks - */ - - DocumentBlock [] getBlocks() - { - if (isValid() && (writer != null)) - { - ByteArrayOutputStream stream = - new ByteArrayOutputStream(size); - DocumentOutputStream dstream = - new DocumentOutputStream(stream, size); - - writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, - path, name, size)); - bigBlocks = DocumentBlock.convert(stream.toByteArray(), size); - } - return bigBlocks; - } - - /** - * write the blocks to a stream - * - * @param stream the stream to which the data is to be written - * - * @exception IOException on error - */ - - void writeBlocks(OutputStream stream) - throws IOException - { - if (isValid()) - { - if (writer != null) - { - DocumentOutputStream dstream = - new DocumentOutputStream(stream, size); - - writer.processPOIFSWriterEvent( - new POIFSWriterEvent(dstream, path, name, size)); - dstream.writeFiller(countBlocks() - * POIFSConstants - .BIG_BLOCK_SIZE, DocumentBlock - .getFillByte()); - } - else - { - for (int k = 0; k < bigBlocks.length; k++) - { - bigBlocks[ k ].writeBlocks(stream); - } - } - } - } - - /** - * @return number of big blocks making up this document - */ - - int countBlocks() - { - int rval = 0; - - if (isValid()) - { - if (writer != null) - { - rval = (size + POIFSConstants.BIG_BLOCK_SIZE - 1) - / POIFSConstants.BIG_BLOCK_SIZE; - } - else - { - rval = bigBlocks.length; - } - } - return rval; - } - } // end private class BigBlockStore -} // end class POIFSDocument - +public final class POIFSDocument implements BATManaged, BlockWritable, POIFSViewable { + private static final DocumentBlock[] EMPTY_BIG_BLOCK_ARRAY = { }; + private static final SmallDocumentBlock[] EMPTY_SMALL_BLOCK_ARRAY = { }; + private DocumentProperty _property; + private int _size; + + private final POIFSBigBlockSize _bigBigBlockSize; + + // one of these stores will be valid + private SmallBlockStore _small_store; + private BigBlockStore _big_store; + + /** + * Constructor from large blocks + * + * @param name the name of the POIFSDocument + * @param blocks the big blocks making up the POIFSDocument + * @param length the actual length of the POIFSDocument + */ + public POIFSDocument(String name, RawDataBlock[] blocks, int length) throws IOException { + _size = length; + if(blocks.length == 0) { + _bigBigBlockSize = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; + } else { + _bigBigBlockSize = (blocks[0].getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE ? + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS : + POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS + ); + } + + _big_store = new BigBlockStore(_bigBigBlockSize, convertRawBlocksToBigBlocks(blocks)); + _property = new DocumentProperty(name, _size); + _small_store = new SmallBlockStore(_bigBigBlockSize, EMPTY_SMALL_BLOCK_ARRAY); + _property.setDocument(this); + } + + // TODO - awkward typing going on here + private static DocumentBlock[] convertRawBlocksToBigBlocks(ListManagedBlock[] blocks) throws IOException { + DocumentBlock[] result = new DocumentBlock[blocks.length]; + for (int i = 0; i < result.length; i++) { + result[i] = new DocumentBlock((RawDataBlock)blocks[i]); + } + return result; + } + private static SmallDocumentBlock[] convertRawBlocksToSmallBlocks(ListManagedBlock[] blocks) { + if (blocks instanceof SmallDocumentBlock[]) { + return (SmallDocumentBlock[]) blocks; + } + SmallDocumentBlock[] result = new SmallDocumentBlock[blocks.length]; + System.arraycopy(blocks, 0, result, 0, blocks.length); + return result; + } + + /** + * Constructor from small blocks + * + * @param name the name of the POIFSDocument + * @param blocks the small blocks making up the POIFSDocument + * @param length the actual length of the POIFSDocument + */ + public POIFSDocument(String name, SmallDocumentBlock[] blocks, int length) { + _size = length; + + if(blocks.length == 0) { + _bigBigBlockSize = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; + } else { + _bigBigBlockSize = blocks[0].getBigBlockSize(); + } + + _big_store = new BigBlockStore(_bigBigBlockSize, EMPTY_BIG_BLOCK_ARRAY); + _property = new DocumentProperty(name, _size); + _small_store = new SmallBlockStore(_bigBigBlockSize, blocks); + _property.setDocument(this); + } + + /** + * Constructor from small blocks + * + * @param name the name of the POIFSDocument + * @param blocks the small blocks making up the POIFSDocument + * @param length the actual length of the POIFSDocument + */ + public POIFSDocument(String name, POIFSBigBlockSize bigBlockSize, ListManagedBlock[] blocks, int length) throws IOException { + _size = length; + _bigBigBlockSize = bigBlockSize; + _property = new DocumentProperty(name, _size); + _property.setDocument(this); + if (Property.isSmall(_size)) { + _big_store = new BigBlockStore(bigBlockSize,EMPTY_BIG_BLOCK_ARRAY); + _small_store = new SmallBlockStore(bigBlockSize,convertRawBlocksToSmallBlocks(blocks)); + } else { + _big_store = new BigBlockStore(bigBlockSize,convertRawBlocksToBigBlocks(blocks)); + _small_store = new SmallBlockStore(bigBlockSize,EMPTY_SMALL_BLOCK_ARRAY); + } + } + public POIFSDocument(String name, ListManagedBlock[] blocks, int length) throws IOException { + this(name, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, blocks, length); + } + + /** + * Constructor + * + * @param name the name of the POIFSDocument + * @param stream the InputStream we read data from + */ + public POIFSDocument(String name, POIFSBigBlockSize bigBlockSize, InputStream stream) throws IOException { + List blocks = new ArrayList(); + + _size = 0; + _bigBigBlockSize = bigBlockSize; + while (true) { + DocumentBlock block = new DocumentBlock(stream, bigBlockSize); + int blockSize = block.size(); + + if (blockSize > 0) { + blocks.add(block); + _size += blockSize; + } + if (block.partiallyRead()) { + break; + } + } + DocumentBlock[] bigBlocks = blocks.toArray(new DocumentBlock[blocks.size()]); + + _big_store = new BigBlockStore(bigBlockSize,bigBlocks); + _property = new DocumentProperty(name, _size); + _property.setDocument(this); + if (_property.shouldUseSmallBlocks()) { + _small_store = new SmallBlockStore(bigBlockSize,SmallDocumentBlock.convert(bigBlockSize,bigBlocks, _size)); + _big_store = new BigBlockStore(bigBlockSize,new DocumentBlock[0]); + } else { + _small_store = new SmallBlockStore(bigBlockSize,EMPTY_SMALL_BLOCK_ARRAY); + } + } + public POIFSDocument(String name, InputStream stream) throws IOException { + this(name, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, stream); + } + + /** + * Constructor + * + * @param name the name of the POIFSDocument + * @param size the length of the POIFSDocument + * @param path the path of the POIFSDocument + * @param writer the writer who will eventually write the document contents + */ + public POIFSDocument(String name, int size, POIFSBigBlockSize bigBlockSize, POIFSDocumentPath path, POIFSWriterListener writer) { + _size = size; + _bigBigBlockSize = bigBlockSize; + _property = new DocumentProperty(name, _size); + _property.setDocument(this); + if (_property.shouldUseSmallBlocks()) { + _small_store = new SmallBlockStore(_bigBigBlockSize, path, name, size, writer); + _big_store = new BigBlockStore(_bigBigBlockSize, EMPTY_BIG_BLOCK_ARRAY); + } else { + _small_store = new SmallBlockStore(_bigBigBlockSize, EMPTY_SMALL_BLOCK_ARRAY); + _big_store = new BigBlockStore(_bigBigBlockSize, path, name, size, writer); + } + } + public POIFSDocument(String name, int size, POIFSDocumentPath path, POIFSWriterListener writer) { + this(name, size, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, path, writer); + } + + /** + * @return array of SmallDocumentBlocks; may be empty, cannot be null + */ + public BlockWritable[] getSmallBlocks() { + return _small_store.getBlocks(); + } + + /** + * @return size of the document + */ + public int getSize() { + return _size; + } + + /** + * read data from the internal stores + * + * @param buffer the buffer to write to + * @param offset the offset into our storage to read from + * This method is currently (Oct 2008) only used by test code. Perhaps it can be deleted + */ + void read(byte[] buffer, int offset) { + int len = buffer.length; + + DataInputBlock currentBlock = getDataInputBlock(offset); + + int blockAvailable = currentBlock.available(); + if (blockAvailable > len) { + currentBlock.readFully(buffer, 0, len); + return; + } + // else read big amount in chunks + int remaining = len; + int writePos = 0; + int currentOffset = offset; + while (remaining > 0) { + boolean blockIsExpiring = remaining >= blockAvailable; + int reqSize; + if (blockIsExpiring) { + reqSize = blockAvailable; + } else { + reqSize = remaining; + } + currentBlock.readFully(buffer, writePos, reqSize); + remaining-=reqSize; + writePos+=reqSize; + currentOffset += reqSize; + if (blockIsExpiring) { + if (currentOffset == _size) { + if (remaining > 0) { + throw new IllegalStateException("reached end of document stream unexpectedly"); + } + currentBlock = null; + break; + } + currentBlock = getDataInputBlock(currentOffset); + blockAvailable = currentBlock.available(); + } + } + } + + /** + * @return null if offset points to the end of the document stream + */ + DataInputBlock getDataInputBlock(int offset) { + if (offset >= _size) { + if (offset > _size) { + throw new RuntimeException("Request for Offset " + offset + " doc size is " + _size); + } + return null; + } + if (_property.shouldUseSmallBlocks()) { + return SmallDocumentBlock.getDataInputBlock(_small_store.getBlocks(), offset); + } + return DocumentBlock.getDataInputBlock(_big_store.getBlocks(), offset); + } + + /** + * @return the instance's DocumentProperty + */ + + DocumentProperty getDocumentProperty() { + return _property; + } + + /* ********** START implementation of BlockWritable ********** */ + + /** + * Write the storage to an OutputStream + * + * @param stream the OutputStream to which the stored data should be written + */ + public void writeBlocks(OutputStream stream) throws IOException { + _big_store.writeBlocks(stream); + } + + /* ********** END implementation of BlockWritable ********** */ + /* ********** START implementation of BATManaged ********** */ + + /** + * Return the number of BigBlock's this instance uses + * + * @return count of BigBlock instances + */ + public int countBlocks() { + return _big_store.countBlocks(); + } + + /** + * Set the start block for this instance + * + * @param index index into the array of blocks making up the filesystem + */ + public void setStartBlock(int index) { + _property.setStartBlock(index); + } + + /* ********** END implementation of BATManaged ********** */ + /* ********** START begin implementation of POIFSViewable ********** */ + + /** + * Get an array of objects, some of which may implement POIFSViewable + * + * @return an array of Object; may not be null, but may be empty + */ + public Object[] getViewableArray() { + Object[] results = new Object[1]; + String result; + + try { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + BlockWritable[] blocks = null; + + if (_big_store.isValid()) { + blocks = _big_store.getBlocks(); + } else if (_small_store.isValid()) { + blocks = _small_store.getBlocks(); + } + if (blocks != null) { + for (int k = 0; k < blocks.length; k++) { + blocks[k].writeBlocks(output); + } + byte[] data = output.toByteArray(); + + if (data.length > _property.getSize()) { + byte[] tmp = new byte[_property.getSize()]; + + System.arraycopy(data, 0, tmp, 0, tmp.length); + data = tmp; + } + output = new ByteArrayOutputStream(); + HexDump.dump(data, 0, output, 0); + result = output.toString(); + } else { + result = ""; + } + } catch (IOException e) { + result = e.getMessage(); + } + results[0] = result; + return results; + } + + /** + * Get an Iterator of objects, some of which may implement POIFSViewable + * + * @return an Iterator; may not be null, but may have an empty back end + * store + */ + public Iterator getViewableIterator() { + return Collections.EMPTY_LIST.iterator(); + } + + /** + * Give viewers a hint as to whether to call getViewableArray or + * getViewableIterator + * + * @return true if a viewer should call getViewableArray, + * false if a viewer should call getViewableIterator + */ + public boolean preferArray() { + return true; + } + + /** + * Provides a short description of the object, to be used when a + * POIFSViewable object has not provided its contents. + * + * @return short description + */ + public String getShortDescription() { + StringBuffer buffer = new StringBuffer(); + + buffer.append("Document: \"").append(_property.getName()).append("\""); + buffer.append(" size = ").append(getSize()); + return buffer.toString(); + } + + /* ********** END begin implementation of POIFSViewable ********** */ + private static final class SmallBlockStore { + private SmallDocumentBlock[] _smallBlocks; + private final POIFSDocumentPath _path; + private final String _name; + private final int _size; + private final POIFSWriterListener _writer; + private final POIFSBigBlockSize _bigBlockSize; + + /** + * Constructor + * + * @param blocks blocks to construct the store from + */ + SmallBlockStore(POIFSBigBlockSize bigBlockSize, SmallDocumentBlock[] blocks) { + _bigBlockSize = bigBlockSize; + _smallBlocks = blocks.clone(); + this._path = null; + this._name = null; + this._size = -1; + this._writer = null; + } + + /** + * Constructor for a small block store that will be written later + * + * @param path path of the document + * @param name name of the document + * @param size length of the document + * @param writer the object that will eventually write the document + */ + SmallBlockStore(POIFSBigBlockSize bigBlockSize, POIFSDocumentPath path, + String name, int size, POIFSWriterListener writer) { + _bigBlockSize = bigBlockSize; + _smallBlocks = new SmallDocumentBlock[0]; + this._path = path; + this._name = name; + this._size = size; + this._writer = writer; + } + + /** + * @return true if this store is a valid source of data + */ + boolean isValid() { + return _smallBlocks.length > 0 || _writer != null; + } + + /** + * @return the SmallDocumentBlocks + */ + SmallDocumentBlock[] getBlocks() { + if (isValid() && _writer != null) { + ByteArrayOutputStream stream = new ByteArrayOutputStream(_size); + DocumentOutputStream dstream = new DocumentOutputStream(stream, _size); + + _writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, _path, _name, _size)); + _smallBlocks = SmallDocumentBlock.convert(_bigBlockSize, stream.toByteArray(), _size); + } + return _smallBlocks; + } + } // end private class SmallBlockStore + + private static final class BigBlockStore { + private DocumentBlock[] bigBlocks; + private final POIFSDocumentPath _path; + private final String _name; + private final int _size; + private final POIFSWriterListener _writer; + private final POIFSBigBlockSize _bigBlockSize; + + /** + * Constructor + * + * @param blocks the blocks making up the store + */ + BigBlockStore(POIFSBigBlockSize bigBlockSize, DocumentBlock[] blocks) { + _bigBlockSize = bigBlockSize; + bigBlocks = blocks.clone(); + _path = null; + _name = null; + _size = -1; + _writer = null; + } + + /** + * Constructor for a big block store that will be written later + * + * @param path path of the document + * @param name name of the document + * @param size length of the document + * @param writer the object that will eventually write the document + */ + BigBlockStore(POIFSBigBlockSize bigBlockSize, POIFSDocumentPath path, + String name, int size, POIFSWriterListener writer) { + _bigBlockSize = bigBlockSize; + bigBlocks = new DocumentBlock[0]; + _path = path; + _name = name; + _size = size; + _writer = writer; + } + + /** + * @return true if this store is a valid source of data + */ + boolean isValid() { + return bigBlocks.length > 0 || _writer != null; + } + + /** + * @return the DocumentBlocks + */ + DocumentBlock[] getBlocks() { + if (isValid() && _writer != null) { + ByteArrayOutputStream stream = new ByteArrayOutputStream(_size); + DocumentOutputStream dstream = new DocumentOutputStream(stream, _size); + + _writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, _path, _name, _size)); + bigBlocks = DocumentBlock.convert(_bigBlockSize, stream.toByteArray(), _size); + } + return bigBlocks; + } + + /** + * write the blocks to a stream + * + * @param stream the stream to which the data is to be written + */ + void writeBlocks(OutputStream stream) throws IOException { + if (isValid()) { + if (_writer != null) { + DocumentOutputStream dstream = new DocumentOutputStream(stream, _size); + + _writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, _path, _name, _size)); + dstream.writeFiller(countBlocks() * _bigBlockSize.getBigBlockSize(), + DocumentBlock.getFillByte()); + } else { + for (int k = 0; k < bigBlocks.length; k++) { + bigBlocks[k].writeBlocks(stream); + } + } + } + } + + /** + * @return number of big blocks making up this document + */ + int countBlocks() { + + if (isValid()) { + if (_writer == null) { + return bigBlocks.length; + } + return (_size + _bigBlockSize.getBigBlockSize() - 1) + / _bigBlockSize.getBigBlockSize(); + } + return 0; + } + } // end private class BigBlockStore +} diff --git a/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java b/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java index 9617d6836a..dc1539a939 100644 --- a/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java +++ b/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java @@ -21,6 +21,9 @@ package org.apache.poi.poifs.filesystem; import java.io.File; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; + /** * Class POIFSDocumentPath * @@ -30,6 +33,8 @@ import java.io.File; public class POIFSDocumentPath { + private static final POILogger log = POILogFactory.getLogger(POIFSDocumentPath.class); + private String[] components; private int hashcode = 0; @@ -125,12 +130,17 @@ public class POIFSDocumentPath { for (int j = 0; j < components.length; j++) { - if ((components[ j ] == null) - || (components[ j ].length() == 0)) + if (components[ j ] == null) { throw new IllegalArgumentException( - "components cannot contain null or empty strings"); + "components cannot contain null"); } + if (components[ j ].length() == 0) + { + log.log(POILogger.WARN, "Directory under " + path + " has an empty name, " + + "not all OLE2 readers will handle this file correctly!"); + } + this.components[ j + path.components.length ] = components[ j ]; } diff --git a/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java index 92348ceaff..acc8a4b3c3 100644 --- a/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java +++ b/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.poifs.filesystem; @@ -31,6 +31,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.dev.POIFSViewable; import org.apache.poi.poifs.property.DirectoryProperty; @@ -42,11 +43,12 @@ import org.apache.poi.poifs.storage.BlockAllocationTableWriter; import org.apache.poi.poifs.storage.BlockList; import org.apache.poi.poifs.storage.BlockWritable; import org.apache.poi.poifs.storage.HeaderBlockConstants; -import org.apache.poi.poifs.storage.HeaderBlockReader; +import org.apache.poi.poifs.storage.HeaderBlock; import org.apache.poi.poifs.storage.HeaderBlockWriter; import org.apache.poi.poifs.storage.RawDataBlockList; import org.apache.poi.poifs.storage.SmallBlockTableReader; import org.apache.poi.poifs.storage.SmallBlockTableWriter; +import org.apache.poi.util.CloseIgnoringInputStream; import org.apache.poi.util.IOUtils; import org.apache.poi.util.LongField; import org.apache.poi.util.POILogFactory; @@ -64,47 +66,32 @@ public class POIFSFileSystem { private static final POILogger _logger = POILogFactory.getLogger(POIFSFileSystem.class); - - private static final class CloseIgnoringInputStream extends InputStream { - private final InputStream _is; - public CloseIgnoringInputStream(InputStream is) { - _is = is; - } - public int read() throws IOException { - return _is.read(); - } - public int read(byte[] b, int off, int len) throws IOException { - return _is.read(b, off, len); - } - public void close() { - // do nothing - } - } - /** * Convenience method for clients that want to avoid the auto-close behaviour of the constructor. */ public static InputStream createNonClosingInputStream(InputStream is) { return new CloseIgnoringInputStream(is); } - + private PropertyTable _property_table; private List _documents; private DirectoryNode _root; - + /** * What big block size the file uses. Most files * use 512 bytes, but a few use 4096 */ - private int bigBlockSize = POIFSConstants.BIG_BLOCK_SIZE; + private POIFSBigBlockSize bigBlockSize = + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; /** * Constructor, intended for writing */ public POIFSFileSystem() { - _property_table = new PropertyTable(); + HeaderBlock header_block = new HeaderBlock(bigBlockSize); + _property_table = new PropertyTable(header_block); _documents = new ArrayList(); _root = null; } @@ -112,20 +99,20 @@ public class POIFSFileSystem /** * Create a POIFSFileSystem from an InputStream. Normally the stream is read until * EOF. The stream is always closed.

    - * - * Some streams are usable after reaching EOF (typically those that return true - * for markSupported()). In the unlikely case that the caller has such a stream + * + * Some streams are usable after reaching EOF (typically those that return true + * for markSupported()). In the unlikely case that the caller has such a stream * and needs to use it after this constructor completes, a work around is to wrap the * stream in order to trap the close() call. A convenience method ( * createNonClosingInputStream()) has been provided for this purpose: *

          * InputStream wrappedStream = POIFSFileSystem.createNonClosingInputStream(is);
          * HSSFWorkbook wb = new HSSFWorkbook(wrappedStream);
    -     * is.reset(); 
    -     * doSomethingElse(is); 
    +     * is.reset();
    +     * doSomethingElse(is);
          * 
    * Note also the special case of ByteArrayInputStream for which the close() - * method does nothing. + * method does nothing. *
          * ByteArrayInputStream bais = ...
          * HSSFWorkbook wb = new HSSFWorkbook(bais); // calls bais.close() !
    @@ -144,49 +131,57 @@ public class POIFSFileSystem
             this();
             boolean success = false;
     
    -        HeaderBlockReader header_block_reader;
    +        HeaderBlock header_block;
             RawDataBlockList data_blocks;
             try {
                 // read the header block from the stream
    -            header_block_reader = new HeaderBlockReader(stream);
    -            bigBlockSize = header_block_reader.getBigBlockSize();
    -            
    +            header_block = new HeaderBlock(stream);
    +            bigBlockSize = header_block.getBigBlockSize();
    +
                 // read the rest of the stream into blocks
                 data_blocks = new RawDataBlockList(stream, bigBlockSize);
                 success = true;
             } finally {
                 closeInputStream(stream, success);
             }
    -        
    +
     
             // set up the block allocation table (necessary for the
             // data_blocks to be manageable
    -        new BlockAllocationTableReader(header_block_reader.getBATCount(),
    -                                       header_block_reader.getBATArray(),
    -                                       header_block_reader.getXBATCount(),
    -                                       header_block_reader.getXBATIndex(),
    +        new BlockAllocationTableReader(header_block.getBigBlockSize(),
    +                                       header_block.getBATCount(),
    +                                       header_block.getBATArray(),
    +                                       header_block.getXBATCount(),
    +                                       header_block.getXBATIndex(),
                                            data_blocks);
     
             // get property table from the document
             PropertyTable properties =
    -            new PropertyTable(header_block_reader.getPropertyStart(),
    -                              data_blocks);
    +            new PropertyTable(header_block, data_blocks);
     
             // init documents
    -        processProperties(SmallBlockTableReader
    -            .getSmallDocumentBlocks(data_blocks, properties
    -                .getRoot(), header_block_reader
    -                    .getSBATStart()), data_blocks, properties.getRoot()
    -                        .getChildren(), null);
    +        processProperties(
    +        		SmallBlockTableReader.getSmallDocumentBlocks(
    +        		      bigBlockSize, data_blocks, properties.getRoot(),
    +        				header_block.getSBATStart()
    +        		),
    +        		data_blocks,
    +        		properties.getRoot().getChildren(),
    +        		null,
    +        		header_block.getPropertyStart()
    +        );
    +
    +        // For whatever reason CLSID of root is always 0.
    +        getRoot().setStorageClsid(properties.getRoot().getStorageClsid());
         }
         /**
          * @param stream the stream to be closed
          * @param success false if an exception is currently being thrown in the calling method
          */
         private void closeInputStream(InputStream stream, boolean success) {
    -        
    +
             if(stream.markSupported() && !(stream instanceof ByteArrayInputStream)) {
    -            String msg = "POIFS is closing the supplied input stream of type (" 
    +            String msg = "POIFS is closing the supplied input stream of type ("
                         + stream.getClass().getName() + ") which supports mark/reset.  "
                         + "This will be a problem for the caller if the stream will still be used.  "
                         + "If that is the case the caller should wrap the input stream to avoid this close logic.  "
    @@ -199,7 +194,7 @@ public class POIFSFileSystem
                 if(success) {
                     throw new RuntimeException(e);
                 }
    -            // else not success? Try block did not complete normally 
    +            // else not success? Try block did not complete normally
                 // just print stack trace and leave original ex to be thrown
                 e.printStackTrace();
             }
    @@ -207,15 +202,15 @@ public class POIFSFileSystem
     
         /**
          * Checks that the supplied InputStream (which MUST
    -     *  support mark and reset, or be a PushbackInputStream) 
    +     *  support mark and reset, or be a PushbackInputStream)
          *  has a POIFS (OLE2) header at the start of it.
          * If your InputStream does not support mark / reset,
          *  then wrap it in a PushBackInputStream, then be
          *  sure to always use that, and not the original!
    -     * @param inp An InputStream which supports either mark/reset, or is a PushbackInputStream 
    +     * @param inp An InputStream which supports either mark/reset, or is a PushbackInputStream
          */
         public static boolean hasPOIFSHeader(InputStream inp) throws IOException {
    -        // We want to peek at the first 8 bytes 
    +        // We want to peek at the first 8 bytes
             inp.mark(8);
     
             byte[] header = new byte[8];
    @@ -229,7 +224,7 @@ public class POIFSFileSystem
             } else {
                 inp.reset();
             }
    -        
    +
             // Did it match the signature?
             return (signature.get() == HeaderBlockConstants._signature);
         }
    @@ -288,7 +283,7 @@ public class POIFSFileSystem
         {
             return getRoot().createDirectory(name);
         }
    -    
    +
         /**
          * Write the filesystem out
          *
    @@ -307,11 +302,11 @@ public class POIFSFileSystem
     
             // create the small block store, and the SBAT
             SmallBlockTableWriter      sbtw       =
    -            new SmallBlockTableWriter(_documents, _property_table.getRoot());
    +            new SmallBlockTableWriter(bigBlockSize, _documents, _property_table.getRoot());
     
             // create the block allocation table
             BlockAllocationTableWriter bat        =
    -            new BlockAllocationTableWriter();
    +            new BlockAllocationTableWriter(bigBlockSize);
     
             // create a list of BATManaged objects: the documents plus the
             // property table and the small block table
    @@ -349,7 +344,7 @@ public class POIFSFileSystem
             int               batStartBlock       = bat.createBlocks();
     
             // get the extended block allocation table blocks
    -        HeaderBlockWriter header_block_writer = new HeaderBlockWriter();
    +        HeaderBlockWriter header_block_writer = new HeaderBlockWriter(bigBlockSize);
             BATBlock[]        xbat_blocks         =
                 header_block_writer.setBATBlocks(bat.countBlocks(),
                                                  batStartBlock);
    @@ -491,7 +486,8 @@ public class POIFSFileSystem
         private void processProperties(final BlockList small_blocks,
                                        final BlockList big_blocks,
                                        final Iterator properties,
    -                                   final DirectoryNode dir)
    +                                   final DirectoryNode dir,
    +                                   final int headerPropertiesStartAt)
             throws IOException
         {
             while (properties.hasNext())
    @@ -511,7 +507,8 @@ public class POIFSFileSystem
     
                     processProperties(
                         small_blocks, big_blocks,
    -                    (( DirectoryProperty ) property).getChildren(), new_dir);
    +                    (( DirectoryProperty ) property).getChildren(),
    +                    new_dir, headerPropertiesStartAt);
                 }
                 else
                 {
    @@ -522,14 +519,15 @@ public class POIFSFileSystem
                     if (property.shouldUseSmallBlocks())
                     {
                         document =
    -                        new POIFSDocument(name, small_blocks
    -                            .fetchBlocks(startBlock), size);
    +                        new POIFSDocument(name,
    +                                          small_blocks.fetchBlocks(startBlock, headerPropertiesStartAt),
    +                                          size);
                     }
                     else
                     {
                         document =
                             new POIFSDocument(name,
    -                                          big_blocks.fetchBlocks(startBlock),
    +                                          big_blocks.fetchBlocks(startBlock, headerPropertiesStartAt),
                                               size);
                     }
                     parent.createDocument(document);
    @@ -552,10 +550,7 @@ public class POIFSFileSystem
             {
                 return (( POIFSViewable ) getRoot()).getViewableArray();
             }
    -        else
    -        {
    -            return new Object[ 0 ];
    -        }
    +        return new Object[ 0 ];
         }
     
         /**
    @@ -572,10 +567,7 @@ public class POIFSFileSystem
             {
                 return (( POIFSViewable ) getRoot()).getViewableIterator();
             }
    -        else
    -        {
    -            return Collections.EMPTY_LIST.iterator();
    -        }
    +        return Collections.EMPTY_LIST.iterator();
         }
     
         /**
    @@ -607,9 +599,15 @@ public class POIFSFileSystem
          * @return The Big Block size, normally 512 bytes, sometimes 4096 bytes
          */
         public int getBigBlockSize() {
    -    	return bigBlockSize;
    +    	return bigBlockSize.getBigBlockSize();
         }
    -    
    +    /**
    +     * @return The Big Block size, normally 512 bytes, sometimes 4096 bytes
    +     */
    +    public POIFSBigBlockSize getBigBlockSizeDetails() {
    +      return bigBlockSize;
    +    }
    +
         /* **********  END  begin implementation of POIFSViewable ********** */
     }   // end public class POIFSFileSystem
     
    diff --git a/src/java/org/apache/poi/poifs/nio/ByteArrayBackedDataSource.java b/src/java/org/apache/poi/poifs/nio/ByteArrayBackedDataSource.java
    new file mode 100644
    index 0000000000..24460a2e3f
    --- /dev/null
    +++ b/src/java/org/apache/poi/poifs/nio/ByteArrayBackedDataSource.java
    @@ -0,0 +1,94 @@
    +/* ====================================================================
    +   Licensed to the Apache Software Foundation (ASF) under one or more
    +   contributor license agreements.  See the NOTICE file distributed with
    +   this work for additional information regarding copyright ownership.
    +   The ASF licenses this file to You under the Apache License, Version 2.0
    +   (the "License"); you may not use this file except in compliance with
    +   the License.  You may obtain a copy of the License at
    +
    +       http://www.apache.org/licenses/LICENSE-2.0
    +
    +   Unless required by applicable law or agreed to in writing, software
    +   distributed under the License is distributed on an "AS IS" BASIS,
    +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +   See the License for the specific language governing permissions and
    +   limitations under the License.
    +==================================================================== */
    +
    +package org.apache.poi.poifs.nio;
    +
    +import java.io.IOException;
    +import java.io.OutputStream;
    +import java.nio.ByteBuffer;
    +
    +/**
    + * A POIFS {@link DataSource} backed by a byte array.
    + */
    +public class ByteArrayBackedDataSource extends DataSource {
    +   private byte[] buffer;
    +   private long size;
    +   
    +   public ByteArrayBackedDataSource(byte[] data, int size) {
    +      this.buffer = data;
    +      this.size = size;
    +   }
    +   public ByteArrayBackedDataSource(byte[] data) {
    +      this(data, data.length);
    +   }
    +                
    +   public ByteBuffer read(int length, long position) {
    +      if(position >= size) {
    +         throw new IndexOutOfBoundsException(
    +               "Unable to read " + length + " bytes from " +
    +               position + " in stream of length " + size
    +         );
    +      }
    +      
    +      int toRead = (int)Math.min(length, size - position);
    +      return ByteBuffer.wrap(buffer, (int)position, toRead);
    +   }
    +   
    +   public void write(ByteBuffer src, long position) {
    +      // Extend if needed
    +      long endPosition = position + src.capacity(); 
    +      if(endPosition > buffer.length) {
    +         extend(endPosition);
    +      }
    +      
    +      // Now copy
    +      src.get(buffer, (int)position, src.capacity());
    +      
    +      // Update size if needed
    +      if(endPosition > size) {
    +         size = endPosition;
    +      }
    +   }
    +   
    +   private void extend(long length) {
    +      // Consider extending by a bit more than requested
    +      long difference = length - buffer.length;
    +      if(difference < buffer.length*0.25) {
    +         difference = (long)(buffer.length*0.25);
    +      }
    +      if(difference < 4096) {
    +         difference = 4096;
    +      }
    +
    +      byte[] nb = new byte[(int)(difference+buffer.length)];
    +      System.arraycopy(buffer, 0, nb, 0, (int)size);
    +      buffer = nb;
    +   }
    +   
    +   public void copyTo(OutputStream stream) throws IOException {
    +      stream.write(buffer, 0, (int)size);
    +   }
    +   
    +   public long size() {
    +      return size;
    +   }
    +   
    +   public void close() {
    +      buffer = null;
    +      size = -1;
    +   }
    +}
    diff --git a/src/java/org/apache/poi/poifs/nio/DataSource.java b/src/java/org/apache/poi/poifs/nio/DataSource.java
    new file mode 100644
    index 0000000000..f43667626f
    --- /dev/null
    +++ b/src/java/org/apache/poi/poifs/nio/DataSource.java
    @@ -0,0 +1,35 @@
    +/* ====================================================================
    +   Licensed to the Apache Software Foundation (ASF) under one or more
    +   contributor license agreements.  See the NOTICE file distributed with
    +   this work for additional information regarding copyright ownership.
    +   The ASF licenses this file to You under the Apache License, Version 2.0
    +   (the "License"); you may not use this file except in compliance with
    +   the License.  You may obtain a copy of the License at
    +
    +       http://www.apache.org/licenses/LICENSE-2.0
    +
    +   Unless required by applicable law or agreed to in writing, software
    +   distributed under the License is distributed on an "AS IS" BASIS,
    +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +   See the License for the specific language governing permissions and
    +   limitations under the License.
    +==================================================================== */
    +
    +package org.apache.poi.poifs.nio;
    +
    +import java.io.IOException;
    +import java.io.OutputStream;
    +import java.nio.ByteBuffer;
    +
    +/**
    + * Common definition of how we read and write bytes
    + */
    +public abstract class DataSource {
    +   public abstract ByteBuffer read(int length, long position) throws IOException;
    +   public abstract void write(ByteBuffer src, long position) throws IOException;
    +   public abstract long size() throws IOException;
    +   /** Close the underlying stream */
    +   public abstract void close() throws IOException;
    +   /** Copies the contents to the specified OutputStream */
    +   public abstract void copyTo(OutputStream stream) throws IOException;
    +}
    diff --git a/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java b/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java
    new file mode 100644
    index 0000000000..ed2f7ce110
    --- /dev/null
    +++ b/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java
    @@ -0,0 +1,88 @@
    +/* ====================================================================
    +   Licensed to the Apache Software Foundation (ASF) under one or more
    +   contributor license agreements.  See the NOTICE file distributed with
    +   this work for additional information regarding copyright ownership.
    +   The ASF licenses this file to You under the Apache License, Version 2.0
    +   (the "License"); you may not use this file except in compliance with
    +   the License.  You may obtain a copy of the License at
    +
    +       http://www.apache.org/licenses/LICENSE-2.0
    +
    +   Unless required by applicable law or agreed to in writing, software
    +   distributed under the License is distributed on an "AS IS" BASIS,
    +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +   See the License for the specific language governing permissions and
    +   limitations under the License.
    +==================================================================== */
    +
    +package org.apache.poi.poifs.nio;
    +
    +import java.io.File;
    +import java.io.FileNotFoundException;
    +import java.io.IOException;
    +import java.io.OutputStream;
    +import java.io.RandomAccessFile;
    +import java.nio.ByteBuffer;
    +import java.nio.channels.Channels;
    +import java.nio.channels.FileChannel;
    +import java.nio.channels.WritableByteChannel;
    +
    +import org.apache.poi.util.IOUtils;
    +
    +/**
    + * A POIFS {@link DataSource} backed by a File
    + */
    +public class FileBackedDataSource extends DataSource {
    +   private FileChannel channel;
    +   
    +   public FileBackedDataSource(File file) throws FileNotFoundException {
    +      if(!file.exists()) {
    +         throw new FileNotFoundException(file.toString());
    +      }
    +      this.channel = (new RandomAccessFile(file, "r")).getChannel();
    +   }
    +   public FileBackedDataSource(FileChannel channel) {
    +      this.channel = channel;
    +   }
    +   
    +   public ByteBuffer read(int length, long position) throws IOException {
    +      if(position >= size()) {
    +         throw new IllegalArgumentException("Position " + position + " past the end of the file");
    +      }
    +
    +      // Read
    +      channel.position(position);
    +      ByteBuffer dst = ByteBuffer.allocate(length);
    +      int worked = IOUtils.readFully(channel, dst);
    +      
    +      // Check
    +      if(worked == -1) {
    +         throw new IllegalArgumentException("Position " + position + " past the end of the file");
    +      }
    +      
    +      // Ready it for reading
    +      dst.position(0);
    +      
    +      // All done
    +      return dst;
    +   }
    +   
    +   public void write(ByteBuffer src, long position) throws IOException {
    +      channel.write(src, position);
    +   }
    +   
    +   public void copyTo(OutputStream stream) throws IOException {
    +      // Wrap the OutputSteam as a channel
    +      WritableByteChannel out = Channels.newChannel(stream);
    +      // Now do the transfer
    +      channel.transferTo(0, channel.size(), out);
    +   }
    +   
    +   public long size() throws IOException {
    +      return channel.size();
    +   }
    +   
    +   public void close() throws IOException {
    +      channel.close();
    +   }
    +}
    diff --git a/src/java/org/apache/poi/poifs/property/DirectoryProperty.java b/src/java/org/apache/poi/poifs/property/DirectoryProperty.java
    index ece87efd4a..f263419910 100644
    --- a/src/java/org/apache/poi/poifs/property/DirectoryProperty.java
    +++ b/src/java/org/apache/poi/poifs/property/DirectoryProperty.java
    @@ -1,4 +1,3 @@
    -
     /* ====================================================================
        Licensed to the Apache Software Foundation (ASF) under one or more
        contributor license agreements.  See the NOTICE file distributed with
    @@ -15,44 +14,35 @@
        See the License for the specific language governing permissions and
        limitations under the License.
     ==================================================================== */
    -        
     
     package org.apache.poi.poifs.property;
     
    -import java.util.*;
    -
     import java.io.IOException;
    -
    -import org.apache.poi.poifs.storage.SmallDocumentBlock;
    +import java.util.*;
     
     /**
      * Directory property
      *
      * @author Marc Johnson (mjohnson at apache dot org)
      */
    +public class DirectoryProperty extends Property implements Parent { // TODO - fix instantiable superclass
     
    -public class DirectoryProperty
    -    extends Property
    -    implements Parent
    -{
    +    /** List of Property instances */
    +    private List _children;
     
    -    // List of Property instances
    -    private List _children;
    -
    -    // set of children's names
    -    private Set  _children_names;
    +    /** set of children's names */
    +    private Set  _children_names;
     
         /**
          * Default constructor
          *
          * @param name the name of the directory
          */
    -
         public DirectoryProperty(String name)
         {
             super();
    -        _children       = new ArrayList();
    -        _children_names = new HashSet();
    +        _children       = new ArrayList();
    +        _children_names = new HashSet();
             setName(name);
             setSize(0);
             setPropertyType(PropertyConstants.DIRECTORY_TYPE);
    @@ -67,13 +57,12 @@ public class DirectoryProperty
          * @param array byte data
          * @param offset offset into byte data
          */
    -
         protected DirectoryProperty(final int index, final byte [] array,
                                     final int offset)
         {
             super(index, array, offset);
    -        _children       = new ArrayList();
    -        _children_names = new HashSet();
    +        _children       = new ArrayList();
    +        _children_names = new HashSet();
         }
     
         /**
    @@ -84,8 +73,7 @@ public class DirectoryProperty
          *
          * @return true if the name change could be made, else false
          */
    -
    -    public boolean changeName(final Property property, final String newName)
    +    public boolean changeName(Property property, String newName)
         {
             boolean result;
             String  oldName = property.getName();
    @@ -116,8 +104,7 @@ public class DirectoryProperty
          *
          * @return true if the Property could be deleted, else false
          */
    -
    -    public boolean deleteChild(final Property property)
    +    public boolean deleteChild(Property property)
         {
             boolean result = _children.remove(property);
     
    @@ -128,9 +115,7 @@ public class DirectoryProperty
             return result;
         }
     
    -    public static class PropertyComparator
    -        implements Comparator
    -    {
    +    public static class PropertyComparator implements Comparator {
     
             /**
              * Object equality, implemented as object identity
    @@ -139,7 +124,6 @@ public class DirectoryProperty
              *
              * @return true if identical, else false
              */
    -
             public boolean equals(Object o)
             {
                 return this == o;
    @@ -160,12 +144,11 @@ public class DirectoryProperty
              *         zero           if o1 == o2,
              *         positive value if o1 >  o2.
              */
    -
    -        public int compare(Object o1, Object o2)
    +        public int compare(Property o1, Property o2)
             {
                 String VBA_PROJECT = "_VBA_PROJECT";
    -            String name1  = (( Property ) o1).getName();
    -            String name2  = (( Property ) o2).getName();
    +            String name1  = o1.getName();
    +            String name2  = o2.getName();
                 int  result = name1.length() - name2.length();
     
                 if (result == 0)
    @@ -200,14 +183,11 @@ public class DirectoryProperty
                 }
                 return result;
             }
    -    }   // end private class PropertyComparator
    -
    -    /* ********** START extension of Property ********** */
    +    }
     
         /**
          * @return true if a directory type Property
          */
    -
         public boolean isDirectory()
         {
             return true;
    @@ -217,13 +197,11 @@ public class DirectoryProperty
          * Perform whatever activities need to be performed prior to
          * writing
          */
    -
         protected void preWrite()
         {
             if (_children.size() > 0)
             {
    -            Property[] children =
    -                ( Property [] ) _children.toArray(new Property[ 0 ]);
    +            Property[] children = _children.toArray(new Property[ 0 ]);
     
                 Arrays.sort(children, new PropertyComparator());
                 int midpoint = children.length / 2;
    @@ -259,17 +237,13 @@ public class DirectoryProperty
             }
         }
     
    -    /* **********  END  extension of Property ********** */
    -    /* ********** START implementation of Parent ********** */
    -
         /**
          * Get an iterator over the children of this Parent; all elements
          * are instances of Property.
          *
          * @return Iterator of children; may refer to an empty collection
          */
    -
    -    public Iterator getChildren()
    +    public Iterator getChildren()
         {
             return _children.iterator();
         }
    @@ -282,7 +256,6 @@ public class DirectoryProperty
          * @exception IOException if we already have a child with the same
          *                        name
          */
    -
         public void addChild(final Property property)
             throws IOException
         {
    @@ -295,7 +268,4 @@ public class DirectoryProperty
             _children_names.add(name);
             _children.add(property);
         }
    -
    -    /* **********  END  implementation of Parent ********** */
    -}   // end public class DirectoryProperty
    -
    +}
    diff --git a/src/java/org/apache/poi/poifs/property/NPropertyTable.java b/src/java/org/apache/poi/poifs/property/NPropertyTable.java
    new file mode 100644
    index 0000000000..36ded35789
    --- /dev/null
    +++ b/src/java/org/apache/poi/poifs/property/NPropertyTable.java
    @@ -0,0 +1,128 @@
    +/* ====================================================================
    +   Licensed to the Apache Software Foundation (ASF) under one or more
    +   contributor license agreements.  See the NOTICE file distributed with
    +   this work for additional information regarding copyright ownership.
    +   The ASF licenses this file to You under the Apache License, Version 2.0
    +   (the "License"); you may not use this file except in compliance with
    +   the License.  You may obtain a copy of the License at
    +
    +       http://www.apache.org/licenses/LICENSE-2.0
    +
    +   Unless required by applicable law or agreed to in writing, software
    +   distributed under the License is distributed on an "AS IS" BASIS,
    +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +   See the License for the specific language governing permissions and
    +   limitations under the License.
    +==================================================================== */
    +
    +package org.apache.poi.poifs.property;
    +
    +import java.io.ByteArrayOutputStream;
    +import java.io.IOException;
    +import java.nio.ByteBuffer;
    +import java.util.ArrayList;
    +import java.util.Iterator;
    +import java.util.List;
    +
    +import org.apache.poi.poifs.common.POIFSBigBlockSize;
    +import org.apache.poi.poifs.common.POIFSConstants;
    +import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
    +import org.apache.poi.poifs.filesystem.NPOIFSStream;
    +import org.apache.poi.poifs.storage.HeaderBlock;
    +
    +/**
    + * This class embodies the Property Table for a {@link NPOIFSFileSystem}; 
    + *  this is basically the directory for all of the documents in the
    + * filesystem.
    + */
    +public final class NPropertyTable extends PropertyTableBase {
    +    private POIFSBigBlockSize _bigBigBlockSize;
    +
    +    public NPropertyTable(HeaderBlock headerBlock)
    +    {
    +        super(headerBlock);
    +        _bigBigBlockSize = headerBlock.getBigBlockSize();
    +    }
    +
    +    /**
    +     * reading constructor (used when we've read in a file and we want
    +     * to extract the property table from it). Populates the
    +     * properties thoroughly
    +     *
    +     * @param headerBlock the header block of the file
    +     * @param filesystem the filesystem to read from
    +     *
    +     * @exception IOException if anything goes wrong (which should be
    +     *            a result of the input being NFG)
    +     */
    +    public NPropertyTable(final HeaderBlock headerBlock,
    +                          final NPOIFSFileSystem filesystem)
    +        throws IOException
    +    {
    +        super(
    +              headerBlock,
    +              buildProperties(
    +                    (new NPOIFSStream(filesystem, headerBlock.getPropertyStart())).iterator(),
    +                    headerBlock.getBigBlockSize()
    +              )
    +        );
    +        _bigBigBlockSize = headerBlock.getBigBlockSize();
    +    }
    +    
    +    /**
    +     * Builds
    +     * @param startAt
    +     * @param filesystem
    +     * @return
    +     * @throws IOException
    +     */
    +    private static List buildProperties(final Iterator dataSource,
    +          final POIFSBigBlockSize bigBlockSize) throws IOException
    +    {
    +       List properties = new ArrayList();
    +       while(dataSource.hasNext()) {
    +          ByteBuffer bb = dataSource.next();
    +          
    +          // Turn it into an array
    +          byte[] data;
    +          if(bb.hasArray() && bb.arrayOffset() == 0 && 
    +                bb.array().length == bigBlockSize.getBigBlockSize()) {
    +             data = bb.array();
    +          } else {
    +             data = new byte[bigBlockSize.getBigBlockSize()];
    +             bb.get(data, 0, data.length);
    +          }
    +          
    +          PropertyFactory.convertToProperties(data, properties);
    +       }
    +       return properties;
    +    }
    +
    +    /**
    +     * Return the number of BigBlock's this instance uses
    +     *
    +     * @return count of BigBlock instances
    +     */
    +    public int countBlocks()
    +    {
    +       int size = _properties.size() * POIFSConstants.PROPERTY_SIZE;
    +       return (int)Math.ceil(size / _bigBigBlockSize.getBigBlockSize());
    +    }
    + 
    +    /**
    +     * Writes the properties out into the given low-level stream
    +     */
    +    public void write(NPOIFSStream stream) throws IOException {
    +       // TODO - Use a streaming write
    +       ByteArrayOutputStream baos = new ByteArrayOutputStream();
    +       for(Property property : _properties) {
    +          property.writeData(baos);
    +       }
    +       stream.updateContents(baos.toByteArray());
    +       
    +       // Update the start position if needed
    +       if(getStartBlock() != stream.getStartBlock()) {
    +          setStartBlock(stream.getStartBlock());
    +       }
    +    }
    +}
    diff --git a/src/java/org/apache/poi/poifs/property/Property.java b/src/java/org/apache/poi/poifs/property/Property.java
    index fe0e8d9b48..127dab1e39 100644
    --- a/src/java/org/apache/poi/poifs/property/Property.java
    +++ b/src/java/org/apache/poi/poifs/property/Property.java
    @@ -15,7 +15,7 @@
        See the License for the specific language governing permissions and
        limitations under the License.
     ==================================================================== */
    -        
    +
     
     package org.apache.poi.poifs.property;
     
    @@ -39,9 +39,7 @@ import org.apache.poi.util.ShortField;
      * @author Marc Johnson (mjohnson at apache dot org)
      */
     
    -public abstract class Property
    -    implements Child, POIFSViewable
    -{
    +public abstract class Property implements Child, POIFSViewable {
         static final private byte   _default_fill             = ( byte ) 0x00;
         static final private int    _name_size_offset         = 0x40;
         static final private int    _max_name_length          =
    @@ -67,7 +65,7 @@ public abstract class Property
         static final protected byte _NODE_RED                 = 0;
     
         // documents must be at least this size to be stored in big blocks
    -    static final private int    _big_block_minimum_bytes  = 4096;
    +    static final private int    _big_block_minimum_bytes  = POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE;
         private String              _name;
         private ShortField          _name_size;
         private ByteField           _property_type;
    @@ -88,10 +86,6 @@ public abstract class Property
         private Child               _next_child;
         private Child               _previous_child;
     
    -    /**
    -     * Default constructor
    -     */
    -
         protected Property()
         {
             _raw_data = new byte[ POIFSConstants.PROPERTY_SIZE ];
    @@ -129,8 +123,7 @@ public abstract class Property
          * @param array byte data
          * @param offset offset into byte data
          */
    -
    -    protected Property(final int index, final byte [] array, final int offset)
    +    protected Property(int index, byte [] array, int offset)
         {
             _raw_data = new byte[ POIFSConstants.PROPERTY_SIZE ];
             System.arraycopy(array, offset, _raw_data, 0,
    @@ -187,8 +180,7 @@ public abstract class Property
          * @exception IOException on problems writing to the specified
          *            stream.
          */
    -
    -    public void writeData(final OutputStream stream)
    +    public void writeData(OutputStream stream)
             throws IOException
         {
             stream.write(_raw_data);
    @@ -200,8 +192,7 @@ public abstract class Property
          *
          * @param startBlock the start block index
          */
    -
    -    public void setStartBlock(final int startBlock)
    +    public void setStartBlock(int startBlock)
         {
             _start_block.set(startBlock, _raw_data);
         }
    @@ -209,7 +200,6 @@ public abstract class Property
         /**
          * @return the start block
          */
    -
         public int getStartBlock()
         {
             return _start_block.get();
    @@ -220,7 +210,6 @@ public abstract class Property
          *
          * @return size in bytes
          */
    -
         public int getSize()
         {
             return _size.get();
    @@ -232,7 +221,6 @@ public abstract class Property
          *
          * @return true if the size is less than _big_block_minimum_bytes
          */
    -
         public boolean shouldUseSmallBlocks()
         {
             return Property.isSmall(_size.get());
    @@ -246,8 +234,7 @@ public abstract class Property
          * @return true if the length is less than
          *         _big_block_minimum_bytes
          */
    -
    -    public static boolean isSmall(final int length)
    +    public static boolean isSmall(int length)
         {
             return length < _big_block_minimum_bytes;
         }
    @@ -257,7 +244,6 @@ public abstract class Property
          *
          * @return property name as String
          */
    -
         public String getName()
         {
             return _name;
    @@ -266,7 +252,6 @@ public abstract class Property
         /**
          * @return true if a directory type Property
          */
    -
         abstract public boolean isDirectory();
     
         /**
    @@ -284,7 +269,7 @@ public abstract class Property
          *
          * @param name the new name
          */
    -    protected final void setName(final String name)
    +    protected void setName(String name)
         {
             char[] char_array = name.toCharArray();
             int    limit      = Math.min(char_array.length, _max_name_length);
    @@ -329,8 +314,7 @@ public abstract class Property
          *
          * @param propertyType the property type (root, file, directory)
          */
    -
    -    protected void setPropertyType(final byte propertyType)
    +    protected void setPropertyType(byte propertyType)
         {
             _property_type.set(propertyType, _raw_data);
         }
    @@ -340,8 +324,7 @@ public abstract class Property
          *
          * @param nodeColor the node color (red or black)
          */
    -
    -    protected void setNodeColor(final byte nodeColor)
    +    protected void setNodeColor(byte nodeColor)
         {
             _node_color.set(nodeColor, _raw_data);
         }
    @@ -351,8 +334,7 @@ public abstract class Property
          *
          * @param child the child property's index in the Property Table
          */
    -
    -    protected void setChildProperty(final int child)
    +    protected void setChildProperty(int child)
         {
             _child_property.set(child, _raw_data);
         }
    @@ -362,7 +344,6 @@ public abstract class Property
          *
          * @return child property index
          */
    -
         protected int getChildIndex()
         {
             return _child_property.get();
    @@ -373,8 +354,7 @@ public abstract class Property
          *
          * @param size the size of the document, in bytes
          */
    -
    -    protected void setSize(final int size)
    +    protected void setSize(int size)
         {
             _size.set(size, _raw_data);
         }
    @@ -385,8 +365,7 @@ public abstract class Property
          * @param index this Property's index within its containing
          *              Property Table
          */
    -
    -    protected void setIndex(final int index)
    +    protected void setIndex(int index)
         {
             _index = index;
         }
    @@ -396,7 +375,6 @@ public abstract class Property
          *
          * @return the index of this Property within its Property Table
          */
    -
         protected int getIndex()
         {
             return _index;
    @@ -406,7 +384,6 @@ public abstract class Property
          * Perform whatever activities need to be performed prior to
          * writing
          */
    -
         abstract protected void preWrite();
     
         /**
    @@ -414,7 +391,6 @@ public abstract class Property
          *
          * @return index of next sibling
          */
    -
         int getNextChildIndex()
         {
             return _next_property.get();
    @@ -425,7 +401,6 @@ public abstract class Property
          *
          * @return index of previous sibling
          */
    -
         int getPreviousChildIndex()
         {
             return _previous_property.get();
    @@ -438,20 +413,16 @@ public abstract class Property
          *
          * @return true if the index is valid
          */
    -
         static boolean isValidIndex(int index)
         {
             return index != _NO_INDEX;
         }
     
    -    /* ********** START implementation of Child ********** */
    -
         /**
          * Get the next Child, if any
          *
          * @return the next Child; may return null
          */
    -
         public Child getNextChild()
         {
             return _next_child;
    @@ -462,7 +433,6 @@ public abstract class Property
          *
          * @return the previous Child; may return null
          */
    -
         public Child getPreviousChild()
         {
             return _previous_child;
    @@ -474,8 +444,7 @@ public abstract class Property
          * @param child the new 'next' child; may be null, which has the
          *              effect of saying there is no 'next' child
          */
    -
    -    public void setNextChild(final Child child)
    +    public void setNextChild(Child child)
         {
             _next_child = child;
             _next_property.set((child == null) ? _NO_INDEX
    @@ -489,8 +458,7 @@ public abstract class Property
          * @param child the new 'previous' child; may be null, which has
          *              the effect of saying there is no 'previous' child
          */
    -
    -    public void setPreviousChild(final Child child)
    +    public void setPreviousChild(Child child)
         {
             _previous_child = child;
             _previous_property.set((child == null) ? _NO_INDEX
    @@ -498,16 +466,12 @@ public abstract class Property
                                                        .getIndex(), _raw_data);
         }
     
    -    /* **********  END  implementation of Child ********** */
    -    /* ********** START begin implementation of POIFSViewable ********** */
    -
         /**
          * Get an array of objects, some of which may implement
          * POIFSViewable
          *
          * @return an array of Object; may not be null, but may be empty
          */
    -
         public Object [] getViewableArray()
         {
             Object[] results = new Object[ 5 ];
    @@ -518,11 +482,11 @@ public abstract class Property
             long time = _days_1.get();
     
             time         <<= 32;
    -        time         += (( long ) _seconds_1.get()) & 0x0000FFFFL;
    +        time         += _seconds_1.get() & 0x0000FFFFL;
             results[ 3 ] = "Time 1        = " + time;
             time         = _days_2.get();
             time         <<= 32;
    -        time         += (( long ) _seconds_2.get()) & 0x0000FFFFL;
    +        time         += _seconds_2.get() & 0x0000FFFFL;
             results[ 4 ] = "Time 2        = " + time;
             return results;
         }
    @@ -534,7 +498,6 @@ public abstract class Property
          * @return an Iterator; may not be null, but may have an empty
          * back end store
          */
    -
         public Iterator getViewableIterator()
         {
             return Collections.EMPTY_LIST.iterator();
    @@ -547,7 +510,6 @@ public abstract class Property
          * @return true if a viewer should call getViewableArray, false if
          *         a viewer should call getViewableIterator
          */
    -
         public boolean preferArray()
         {
             return true;
    @@ -559,7 +521,6 @@ public abstract class Property
          *
          * @return short description
          */
    -
         public String getShortDescription()
         {
             StringBuffer buffer = new StringBuffer();
    @@ -567,7 +528,4 @@ public abstract class Property
             buffer.append("Property: \"").append(getName()).append("\"");
             return buffer.toString();
         }
    -
    -    /* **********  END  begin implementation of POIFSViewable ********** */
    -}   // end public abstract class Property
    -
    +}
    diff --git a/src/java/org/apache/poi/poifs/property/PropertyFactory.java b/src/java/org/apache/poi/poifs/property/PropertyFactory.java
    index a4036f9d00..38533b71a7 100644
    --- a/src/java/org/apache/poi/poifs/property/PropertyFactory.java
    +++ b/src/java/org/apache/poi/poifs/property/PropertyFactory.java
    @@ -28,7 +28,7 @@ import org.apache.poi.poifs.storage.ListManagedBlock;
     
     /**
      * Factory for turning an array of RawDataBlock instances containing
    - * Proprty data into an array of proper Property objects.
    + * Property data into an array of proper Property objects.
      *
      * The array produced may be sparse, in that any portion of data that
      * should correspond to a Property, but which does not map to a proper
    @@ -40,7 +40,6 @@ import org.apache.poi.poifs.storage.ListManagedBlock;
     
     class PropertyFactory
     {
    -
         // no need for an accessible constructor
         private PropertyFactory()
         {
    @@ -56,48 +55,52 @@ class PropertyFactory
          *
          * @exception IOException if any of the blocks are empty
          */
    -
    -    static List convertToProperties(ListManagedBlock [] blocks)
    +    static List convertToProperties(ListManagedBlock [] blocks)
             throws IOException
         {
    -        List properties = new ArrayList();
    +        List properties = new ArrayList();
     
    -        for (int j = 0; j < blocks.length; j++)
    -        {
    -            byte[] data           = blocks[ j ].getData();
    -            int    property_count = data.length
    -                                    / POIFSConstants.PROPERTY_SIZE;
    -            int    offset         = 0;
    -
    -            for (int k = 0; k < property_count; k++)
    -            {
    -                switch (data[ offset + PropertyConstants.PROPERTY_TYPE_OFFSET ])
    -                {
    -
    -                    case PropertyConstants.DIRECTORY_TYPE :
    -                        properties
    -                            .add(new DirectoryProperty(properties.size(),
    -                                                       data, offset));
    -                        break;
    -
    -                    case PropertyConstants.DOCUMENT_TYPE :
    -                        properties.add(new DocumentProperty(properties.size(),
    -                                                            data, offset));
    -                        break;
    -
    -                    case PropertyConstants.ROOT_TYPE :
    -                        properties.add(new RootProperty(properties.size(),
    -                                                        data, offset));
    -                        break;
    -
    -                    default :
    -                        properties.add(null);
    -                        break;
    -                }
    -                offset += POIFSConstants.PROPERTY_SIZE;
    -            }
    +        for (int j = 0; j < blocks.length; j++) {
    +            byte[] data = blocks[ j ].getData();
    +            convertToProperties(data, properties);
             }
             return properties;
         }
    +    
    +    static void convertToProperties(byte[] data, List properties)
    +        throws IOException
    +    {
    +       int property_count = data.length / POIFSConstants.PROPERTY_SIZE;
    +       int offset         = 0;
    +
    +       for (int k = 0; k < property_count; k++) {
    +          switch (data[ offset + PropertyConstants.PROPERTY_TYPE_OFFSET ]) {
    +          case PropertyConstants.DIRECTORY_TYPE :
    +             properties.add(
    +                   new DirectoryProperty(properties.size(), data, offset)
    +             );
    +             break;
    +
    +          case PropertyConstants.DOCUMENT_TYPE :
    +             properties.add(
    +                   new DocumentProperty(properties.size(), data, offset)
    +             );
    +             break;
    +
    +          case PropertyConstants.ROOT_TYPE :
    +             properties.add(
    +                   new RootProperty(properties.size(), data, offset)
    +             );
    +             break;
    +
    +          default :
    +             properties.add(null);
    +             break;
    +          }
    +          
    +          offset += POIFSConstants.PROPERTY_SIZE;
    +       }
    +    }
    +    
     }   // end package scope class PropertyFactory
     
    diff --git a/src/java/org/apache/poi/poifs/property/PropertyTable.java b/src/java/org/apache/poi/poifs/property/PropertyTable.java
    index 11c56e886d..45a9734158 100644
    --- a/src/java/org/apache/poi/poifs/property/PropertyTable.java
    +++ b/src/java/org/apache/poi/poifs/property/PropertyTable.java
    @@ -1,4 +1,3 @@
    -
     /* ====================================================================
        Licensed to the Apache Software Foundation (ASF) under one or more
        contributor license agreements.  See the NOTICE file distributed with
    @@ -15,46 +14,34 @@
        See the License for the specific language governing permissions and
        limitations under the License.
     ==================================================================== */
    -        
     
     package org.apache.poi.poifs.property;
     
     import java.io.IOException;
     import java.io.OutputStream;
     
    -import java.util.*;
    -
    -import org.apache.poi.poifs.common.POIFSConstants;
    -import org.apache.poi.poifs.filesystem.BATManaged;
    +import org.apache.poi.poifs.common.POIFSBigBlockSize;
    +import org.apache.poi.poifs.filesystem.POIFSFileSystem;
     import org.apache.poi.poifs.storage.BlockWritable;
    +import org.apache.poi.poifs.storage.HeaderBlock;
     import org.apache.poi.poifs.storage.PropertyBlock;
    -import org.apache.poi.poifs.storage.RawDataBlock;
     import org.apache.poi.poifs.storage.RawDataBlockList;
     
     /**
    - * This class embodies the Property Table for the filesystem; this is
    - * basically the dsirectory for all of the documents in the
    + * This class embodies the Property Table for the {@link POIFSFileSystem}; 
    + *  this is basically the directory for all of the documents in the
      * filesystem.
      *
      * @author Marc Johnson (mjohnson at apache dot org)
      */
    +public final class PropertyTable extends PropertyTableBase implements BlockWritable {
    +    private POIFSBigBlockSize _bigBigBlockSize;
    +    private BlockWritable[]   _blocks;
     
    -public class PropertyTable
    -    implements BATManaged, BlockWritable
    -{
    -    private int             _start_block;
    -    private List            _properties;
    -    private BlockWritable[] _blocks;
    -
    -    /**
    -     * Default constructor
    -     */
    -
    -    public PropertyTable()
    +    public PropertyTable(HeaderBlock headerBlock)
         {
    -        _start_block = POIFSConstants.END_OF_CHAIN;
    -        _properties  = new ArrayList();
    -        addProperty(new RootProperty());
    +        super(headerBlock);
    +        _bigBigBlockSize = headerBlock.getBigBlockSize();
             _blocks = null;
         }
     
    @@ -63,68 +50,32 @@ public class PropertyTable
          * to extract the property table from it). Populates the
          * properties thoroughly
          *
    -     * @param startBlock the first block of the property table
    +     * @param headerBlock the header block of the file
          * @param blockList the list of blocks
          *
          * @exception IOException if anything goes wrong (which should be
          *            a result of the input being NFG)
          */
    -
    -    public PropertyTable(final int startBlock,
    +    public PropertyTable(final HeaderBlock headerBlock,
                              final RawDataBlockList blockList)
             throws IOException
         {
    -        _start_block = POIFSConstants.END_OF_CHAIN;
    +        super(
    +              headerBlock,
    +              PropertyFactory.convertToProperties(
    +                    blockList.fetchBlocks(headerBlock.getPropertyStart(), -1)
    +              )
    +        );
    +        _bigBigBlockSize = headerBlock.getBigBlockSize();
             _blocks      = null;
    -        _properties  =
    -            PropertyFactory
    -                .convertToProperties(blockList.fetchBlocks(startBlock));
    -        populatePropertyTree(( DirectoryProperty ) _properties.get(0));
    -    }
    -
    -    /**
    -     * Add a property to the list of properties we manage
    -     *
    -     * @param property the new Property to manage
    -     */
    -
    -    public void addProperty(final Property property)
    -    {
    -        _properties.add(property);
    -    }
    -
    -    /**
    -     * Remove a property from the list of properties we manage
    -     *
    -     * @param property the Property to be removed
    -     */
    -
    -    public void removeProperty(final Property property)
    -    {
    -        _properties.remove(property);
    -    }
    -
    -    /**
    -     * Get the root property
    -     *
    -     * @return the root property
    -     */
    -
    -    public RootProperty getRoot()
    -    {
    -
    -        // it's always the first element in the List
    -        return ( RootProperty ) _properties.get(0);
         }
     
         /**
          * Prepare to be written
          */
    -
         public void preWrite()
         {
    -        Property[] properties =
    -            ( Property [] ) _properties.toArray(new Property[ 0 ]);
    +        Property[] properties = _properties.toArray(new Property[_properties.size()]);
     
             // give each property its index
             for (int k = 0; k < properties.length; k++)
    @@ -133,7 +84,7 @@ public class PropertyTable
             }
     
             // allocate the blocks for the property table
    -        _blocks = PropertyBlock.createPropertyBlockArray(_properties);
    +        _blocks = PropertyBlock.createPropertyBlockArray(_bigBigBlockSize, _properties);
     
             // prepare each property for writing
             for (int k = 0; k < properties.length; k++)
    @@ -141,83 +92,18 @@ public class PropertyTable
                 properties[ k ].preWrite();
             }
         }
    -
    -    /**
    -     * Get the start block for the property table
    -     *
    -     * @return start block index
    -     */
    -
    -    public int getStartBlock()
    -    {
    -        return _start_block;
    -    }
    -
    -    private void populatePropertyTree(DirectoryProperty root)
    -        throws IOException
    -    {
    -        int index = root.getChildIndex();
    -
    -        if (!Property.isValidIndex(index))
    -        {
    -
    -            // property has no children
    -            return;
    -        }
    -        Stack children = new Stack();
    -
    -        children.push(_properties.get(index));
    -        while (!children.empty())
    -        {
    -            Property property = ( Property ) children.pop();
    -
    -            root.addChild(property);
    -            if (property.isDirectory())
    -            {
    -                populatePropertyTree(( DirectoryProperty ) property);
    -            }
    -            index = property.getPreviousChildIndex();
    -            if (Property.isValidIndex(index))
    -            {
    -                children.push(_properties.get(index));
    -            }
    -            index = property.getNextChildIndex();
    -            if (Property.isValidIndex(index))
    -            {
    -                children.push(_properties.get(index));
    -            }
    -        }
    -    }
    -
    -    /* ********** START implementation of BATManaged ********** */
    -
    +    
         /**
          * Return the number of BigBlock's this instance uses
          *
          * @return count of BigBlock instances
          */
    -
         public int countBlocks()
         {
             return (_blocks == null) ? 0
                                      : _blocks.length;
         }
     
    -    /**
    -     * Set the start block for this instance
    -     *
    -     * @param index index into the array of BigBlock instances making
    -     *              up the the filesystem
    -     */
    -
    -    public void setStartBlock(final int index)
    -    {
    -        _start_block = index;
    -    }
    -
    -    /* **********  END  implementation of BATManaged ********** */
    -    /* ********** START implementation of BlockWritable ********** */
    -
         /**
          * Write the storage to an OutputStream
          *
    @@ -227,7 +113,6 @@ public class PropertyTable
          * @exception IOException on problems writing to the specified
          *            stream
          */
    -
         public void writeBlocks(final OutputStream stream)
             throws IOException
         {
    @@ -239,7 +124,4 @@ public class PropertyTable
                 }
             }
         }
    -
    -    /* **********  END  implementation of BlockWritable ********** */
    -}   // end public class PropertyTable
    -
    +}
    diff --git a/src/java/org/apache/poi/poifs/property/PropertyTableBase.java b/src/java/org/apache/poi/poifs/property/PropertyTableBase.java
    new file mode 100644
    index 0000000000..a3520815e3
    --- /dev/null
    +++ b/src/java/org/apache/poi/poifs/property/PropertyTableBase.java
    @@ -0,0 +1,153 @@
    +/* ====================================================================
    +   Licensed to the Apache Software Foundation (ASF) under one or more
    +   contributor license agreements.  See the NOTICE file distributed with
    +   this work for additional information regarding copyright ownership.
    +   The ASF licenses this file to You under the Apache License, Version 2.0
    +   (the "License"); you may not use this file except in compliance with
    +   the License.  You may obtain a copy of the License at
    +
    +       http://www.apache.org/licenses/LICENSE-2.0
    +
    +   Unless required by applicable law or agreed to in writing, software
    +   distributed under the License is distributed on an "AS IS" BASIS,
    +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +   See the License for the specific language governing permissions and
    +   limitations under the License.
    +==================================================================== */
    +
    +package org.apache.poi.poifs.property;
    +
    +import java.io.IOException;
    +import java.util.ArrayList;
    +import java.util.List;
    +import java.util.Stack;
    +
    +import org.apache.poi.poifs.filesystem.BATManaged;
    +import org.apache.poi.poifs.storage.HeaderBlock;
    +
    +/**
    + * This class embodies the Property Table for the filesystem,
    + *  which looks up entries in the filesystem to their
    + *  chain of blocks.
    + * This is the core support, there are implementations
    + *  for the different block schemes as needed.
    + */
    +public abstract class PropertyTableBase implements BATManaged {
    +    private   final HeaderBlock    _header_block;
    +    protected final List _properties;
    +
    +    public PropertyTableBase(final HeaderBlock header_block)
    +    {
    +        _header_block = header_block;
    +        _properties  = new ArrayList();
    +        addProperty(new RootProperty());
    +    }
    +
    +    /**
    +     * Reading constructor (used when we've read in a file and we want
    +     * to extract the property table from it). Populates the
    +     * properties thoroughly
    +     *
    +     * @param startBlock the first block of the property table
    +     * @param blockList the list of blocks
    +     *
    +     * @exception IOException if anything goes wrong (which should be
    +     *            a result of the input being NFG)
    +     */
    +    public PropertyTableBase(final HeaderBlock header_block,
    +                         final List properties)
    +        throws IOException
    +    {
    +        _header_block = header_block;
    +        _properties   = properties;
    +        populatePropertyTree( (DirectoryProperty)_properties.get(0));
    +    }
    +
    +    /**
    +     * Add a property to the list of properties we manage
    +     *
    +     * @param property the new Property to manage
    +     */
    +    public void addProperty(Property property)
    +    {
    +        _properties.add(property);
    +    }
    +
    +    /**
    +     * Remove a property from the list of properties we manage
    +     *
    +     * @param property the Property to be removed
    +     */
    +    public void removeProperty(final Property property)
    +    {
    +        _properties.remove(property);
    +    }
    +
    +    /**
    +     * Get the root property
    +     *
    +     * @return the root property
    +     */
    +    public RootProperty getRoot()
    +    {
    +        // it's always the first element in the List
    +        return ( RootProperty ) _properties.get(0);
    +    }
    +    
    +    private void populatePropertyTree(DirectoryProperty root)
    +        throws IOException
    +    {
    +        int index = root.getChildIndex();
    +
    +        if (!Property.isValidIndex(index))
    +        {
    +
    +            // property has no children
    +            return;
    +        }
    +        Stack children = new Stack();
    +
    +        children.push(_properties.get(index));
    +        while (!children.empty())
    +        {
    +            Property property = children.pop();
    +
    +            root.addChild(property);
    +            if (property.isDirectory())
    +            {
    +                populatePropertyTree(( DirectoryProperty ) property);
    +            }
    +            index = property.getPreviousChildIndex();
    +            if (Property.isValidIndex(index))
    +            {
    +                children.push(_properties.get(index));
    +            }
    +            index = property.getNextChildIndex();
    +            if (Property.isValidIndex(index))
    +            {
    +                children.push(_properties.get(index));
    +            }
    +        }
    +    }
    +
    +    /**
    +     * Get the start block for the property table
    +     *
    +     * @return start block index
    +     */
    +    public int getStartBlock()
    +    {
    +        return _header_block.getPropertyStart();
    +    }
    +
    +    /**
    +     * Set the start block for this instance
    +     *
    +     * @param index index into the array of BigBlock instances making
    +     *              up the the filesystem
    +     */
    +    public void setStartBlock(final int index)
    +    {
    +        _header_block.setPropertyStart(index);
    +    }
    +}
    diff --git a/src/java/org/apache/poi/poifs/property/RootProperty.java b/src/java/org/apache/poi/poifs/property/RootProperty.java
    index afa82ed1a8..b934a2601b 100644
    --- a/src/java/org/apache/poi/poifs/property/RootProperty.java
    +++ b/src/java/org/apache/poi/poifs/property/RootProperty.java
    @@ -1,4 +1,3 @@
    -
     /* ====================================================================
        Licensed to the Apache Software Foundation (ASF) under one or more
        contributor license agreements.  See the NOTICE file distributed with
    @@ -15,14 +14,9 @@
        See the License for the specific language governing permissions and
        limitations under the License.
     ==================================================================== */
    -        
     
     package org.apache.poi.poifs.property;
     
    -import java.util.*;
    -
    -import java.io.IOException;
    -
     import org.apache.poi.poifs.common.POIFSConstants;
     import org.apache.poi.poifs.storage.SmallDocumentBlock;
     
    @@ -31,18 +25,12 @@ import org.apache.poi.poifs.storage.SmallDocumentBlock;
      *
      * @author Marc Johnson (mjohnson at apache dot org)
      */
    -
    -public class RootProperty
    -    extends DirectoryProperty
    -{
    -
    -    /**
    -     * Default constructor
    -     */
    +public final class RootProperty extends DirectoryProperty {
    +   private static final String NAME = "Root Entry";
     
         RootProperty()
         {
    -        super("Root Entry");
    +        super(NAME);
     
             // overrides
             setNodeColor(_NODE_BLACK);
    @@ -57,7 +45,6 @@ public class RootProperty
          * @param array byte data
          * @param offset offset into byte data
          */
    -
         protected RootProperty(final int index, final byte [] array,
                                final int offset)
         {
    @@ -69,10 +56,17 @@ public class RootProperty
          *
          * @param size size in terms of small blocks
          */
    -
         public void setSize(int size)
         {
             super.setSize(SmallDocumentBlock.calcSize(size));
         }
    -}   // end public class RootProperty
     
    +    /**
    +     * Returns the fixed name "Root Entry", as the
    +     *  raw property doesn't have a real name set
    +     */
    +    @Override
    +    public String getName() {
    +        return NAME;
    +    }
    +}
    diff --git a/src/java/org/apache/poi/poifs/storage/BATBlock.java b/src/java/org/apache/poi/poifs/storage/BATBlock.java
    index 5aa4678b60..661cd12dc6 100644
    --- a/src/java/org/apache/poi/poifs/storage/BATBlock.java
    +++ b/src/java/org/apache/poi/poifs/storage/BATBlock.java
    @@ -1,4 +1,3 @@
    -
     /* ====================================================================
        Licensed to the Apache Software Foundation (ASF) under one or more
        contributor license agreements.  See the NOTICE file distributed with
    @@ -15,19 +14,18 @@
        See the License for the specific language governing permissions and
        limitations under the License.
     ==================================================================== */
    -        
     
     package org.apache.poi.poifs.storage;
     
     import java.io.IOException;
     import java.io.OutputStream;
    -
    +import java.nio.ByteBuffer;
     import java.util.Arrays;
    +import java.util.List;
     
    +import org.apache.poi.poifs.common.POIFSBigBlockSize;
     import org.apache.poi.poifs.common.POIFSConstants;
    -import org.apache.poi.util.IntegerField;
     import org.apache.poi.util.LittleEndian;
    -import org.apache.poi.util.LittleEndianConsts;
     
     /**
      * A block of block allocation table entries. BATBlocks are created
    @@ -35,163 +33,37 @@ import org.apache.poi.util.LittleEndianConsts;
      *
      * @author Marc Johnson (mjohnson at apache dot org)
      */
    -
    -public class BATBlock
    -    extends BigBlock
    -{
    -    private static final int  _entries_per_block      =
    -        POIFSConstants.BIG_BLOCK_SIZE / LittleEndianConsts.INT_SIZE;
    -    private static final int  _entries_per_xbat_block = _entries_per_block
    -                                                            - 1;
    -    private static final int  _xbat_chain_offset      =
    -        _entries_per_xbat_block * LittleEndianConsts.INT_SIZE;
    -    private static final byte _default_value          = ( byte ) 0xFF;
    -    private IntegerField[]    _fields;
    -    private byte[]            _data;
    -
    +public final class BATBlock extends BigBlock {
    +    /**
    +     * For a regular fat block, these are 128 / 1024 
    +     *  next sector values.
    +     * For a XFat (DIFat) block, these are 127 / 1023
    +     *  next sector values, then a chaining value.
    +     */
    +    private int[] _values;
    +    
    +    /**
    +     * Does this BATBlock have any free sectors in it?
    +     */
    +    private boolean _has_free_sectors;
    +    
    +    /**
    +     * Where in the file are we?
    +     */
    +    private int ourBlockIndex;
    +    
         /**
          * Create a single instance initialized with default values
          */
    -
    -    private BATBlock()
    +    private BATBlock(POIFSBigBlockSize bigBlockSize)
         {
    -        _data = new byte[ POIFSConstants.BIG_BLOCK_SIZE ];
    -        Arrays.fill(_data, _default_value);
    -        _fields = new IntegerField[ _entries_per_block ];
    -        int offset = 0;
    +        super(bigBlockSize);
    +        
    +        int _entries_per_block = bigBlockSize.getBATEntriesPerBlock();
    +        _values = new int[_entries_per_block];
    +        _has_free_sectors = true;
     
    -        for (int j = 0; j < _entries_per_block; j++)
    -        {
    -            _fields[ j ] = new IntegerField(offset);
    -            offset       += LittleEndianConsts.INT_SIZE;
    -        }
    -    }
    -
    -    /**
    -     * Create an array of BATBlocks from an array of int block
    -     * allocation table entries
    -     *
    -     * @param entries the array of int entries
    -     *
    -     * @return the newly created array of BATBlocks
    -     */
    -
    -    public static BATBlock [] createBATBlocks(final int [] entries)
    -    {
    -        int        block_count = calculateStorageRequirements(entries.length);
    -        BATBlock[] blocks      = new BATBlock[ block_count ];
    -        int        index       = 0;
    -        int        remaining   = entries.length;
    -
    -        for (int j = 0; j < entries.length; j += _entries_per_block)
    -        {
    -            blocks[ index++ ] = new BATBlock(entries, j,
    -                                             (remaining > _entries_per_block)
    -                                             ? j + _entries_per_block
    -                                             : entries.length);
    -            remaining         -= _entries_per_block;
    -        }
    -        return blocks;
    -    }
    -
    -    /**
    -     * Create an array of XBATBlocks from an array of int block
    -     * allocation table entries
    -     *
    -     * @param entries the array of int entries
    -     * @param startBlock the start block of the array of XBAT blocks
    -     *
    -     * @return the newly created array of BATBlocks
    -     */
    -
    -    public static BATBlock [] createXBATBlocks(final int [] entries,
    -                                               final int startBlock)
    -    {
    -        int        block_count =
    -            calculateXBATStorageRequirements(entries.length);
    -        BATBlock[] blocks      = new BATBlock[ block_count ];
    -        int        index       = 0;
    -        int        remaining   = entries.length;
    -
    -        if (block_count != 0)
    -        {
    -            for (int j = 0; j < entries.length; j += _entries_per_xbat_block)
    -            {
    -                blocks[ index++ ] =
    -                    new BATBlock(entries, j,
    -                                 (remaining > _entries_per_xbat_block)
    -                                 ? j + _entries_per_xbat_block
    -                                 : entries.length);
    -                remaining         -= _entries_per_xbat_block;
    -            }
    -            for (index = 0; index < blocks.length - 1; index++)
    -            {
    -                blocks[ index ].setXBATChain(startBlock + index + 1);
    -            }
    -            blocks[ index ].setXBATChain(POIFSConstants.END_OF_CHAIN);
    -        }
    -        return blocks;
    -    }
    -
    -    /**
    -     * Calculate how many BATBlocks are needed to hold a specified
    -     * number of BAT entries.
    -     *
    -     * @param entryCount the number of entries
    -     *
    -     * @return the number of BATBlocks needed
    -     */
    -
    -    public static int calculateStorageRequirements(final int entryCount)
    -    {
    -        return (entryCount + _entries_per_block - 1) / _entries_per_block;
    -    }
    -
    -    /**
    -     * Calculate how many XBATBlocks are needed to hold a specified
    -     * number of BAT entries.
    -     *
    -     * @param entryCount the number of entries
    -     *
    -     * @return the number of XBATBlocks needed
    -     */
    -
    -    public static int calculateXBATStorageRequirements(final int entryCount)
    -    {
    -        return (entryCount + _entries_per_xbat_block - 1)
    -               / _entries_per_xbat_block;
    -    }
    -
    -    /**
    -     * @return number of entries per block
    -     */
    -
    -    public static final int entriesPerBlock()
    -    {
    -        return _entries_per_block;
    -    }
    -
    -    /**
    -     * @return number of entries per XBAT block
    -     */
    -
    -    public static final int entriesPerXBATBlock()
    -    {
    -        return _entries_per_xbat_block;
    -    }
    -
    -    /**
    -     * @return offset of chain index of XBAT block
    -     */
    -
    -    public static final int getXBATChainOffset()
    -    {
    -        return _xbat_chain_offset;
    -    }
    -
    -    private void setXBATChain(int chainIndex)
    -    {
    -        _fields[ _entries_per_xbat_block ].set(chainIndex, _data);
    +        Arrays.fill(_values, POIFSConstants.UNUSED_BLOCK);
         }
     
         /**
    @@ -205,19 +77,271 @@ public class BATBlock
          *                  k, start_index <= k < end_index)
          */
     
    -    private BATBlock(final int [] entries, final int start_index,
    -                     final int end_index)
    +    private BATBlock(POIFSBigBlockSize bigBlockSize, final int [] entries,
    +                     final int start_index, final int end_index)
         {
    -        this();
    -        for (int k = start_index; k < end_index; k++)
    -        {
    -            _fields[ k - start_index ].set(entries[ k ], _data);
    +        this(bigBlockSize);
    +        for (int k = start_index; k < end_index; k++) {
    +           _values[k - start_index] = entries[k];
    +        }
    +        
    +        // Do we have any free sectors?
    +        if(end_index - start_index == _values.length) {
    +           recomputeFree();
             }
         }
    +    
    +    private void recomputeFree() {
    +       boolean hasFree = false;
    +       for(int k=0; k<_values.length; k++) {
    +          if(_values[k] == POIFSConstants.UNUSED_BLOCK) {
    +             hasFree = true;
    +             break;
    +          }
    +       }
    +       _has_free_sectors = hasFree;
    +    }
    +
    +    /**
    +     * Create a single BATBlock from the byte buffer, which must hold at least
    +     *  one big block of data to be read.
    +     */
    +    public static BATBlock createBATBlock(final POIFSBigBlockSize bigBlockSize, ByteBuffer data)
    +    {
    +       // Create an empty block
    +       BATBlock block = new BATBlock(bigBlockSize);
    +       
    +       // Fill it
    +       byte[] buffer = new byte[LittleEndian.INT_SIZE];
    +       for(int i=0; i _entries_per_block)
    +                                             ? j + _entries_per_block
    +                                             : entries.length);
    +            remaining         -= _entries_per_block;
    +        }
    +        return blocks;
    +    }
    +    
    +    /**
    +     * Create an array of XBATBlocks from an array of int block
    +     * allocation table entries
    +     *
    +     * @param entries the array of int entries
    +     * @param startBlock the start block of the array of XBAT blocks
    +     *
    +     * @return the newly created array of BATBlocks
    +     */
    +
    +    public static BATBlock [] createXBATBlocks(final POIFSBigBlockSize bigBlockSize,
    +                                               final int [] entries,
    +                                               final int startBlock)
    +    {
    +        int        block_count =
    +            calculateXBATStorageRequirements(bigBlockSize, entries.length);
    +        BATBlock[] blocks      = new BATBlock[ block_count ];
    +        int        index       = 0;
    +        int        remaining   = entries.length;
    +
    +        int _entries_per_xbat_block = bigBlockSize.getXBATEntriesPerBlock();
    +        if (block_count != 0)
    +        {
    +            for (int j = 0; j < entries.length; j += _entries_per_xbat_block)
    +            {
    +                blocks[ index++ ] =
    +                    new BATBlock(bigBlockSize, entries, j,
    +                                 (remaining > _entries_per_xbat_block)
    +                                 ? j + _entries_per_xbat_block
    +                                 : entries.length);
    +                remaining         -= _entries_per_xbat_block;
    +            }
    +            for (index = 0; index < blocks.length - 1; index++)
    +            {
    +                blocks[ index ].setXBATChain(bigBlockSize, startBlock + index + 1);
    +            }
    +            blocks[ index ].setXBATChain(bigBlockSize, POIFSConstants.END_OF_CHAIN);
    +        }
    +        return blocks;
    +    }
    +
    +    /**
    +     * Calculate how many BATBlocks are needed to hold a specified
    +     * number of BAT entries.
    +     *
    +     * @param entryCount the number of entries
    +     *
    +     * @return the number of BATBlocks needed
    +     */
    +    public static int calculateStorageRequirements(final POIFSBigBlockSize bigBlockSize, final int entryCount)
    +    {
    +        int _entries_per_block = bigBlockSize.getBATEntriesPerBlock();
    +        return (entryCount + _entries_per_block - 1) / _entries_per_block;
    +    }
    +
    +    /**
    +     * Calculate how many XBATBlocks are needed to hold a specified
    +     * number of BAT entries.
    +     *
    +     * @param entryCount the number of entries
    +     *
    +     * @return the number of XBATBlocks needed
    +     */
    +    public static int calculateXBATStorageRequirements(final POIFSBigBlockSize bigBlockSize, final int entryCount)
    +    {
    +        int _entries_per_xbat_block = bigBlockSize.getXBATEntriesPerBlock();
    +        return (entryCount + _entries_per_xbat_block - 1)
    +               / _entries_per_xbat_block;
    +    }
    +    
    +    /**
    +     * Calculates the maximum size of a file which is addressable given the
    +     *  number of FAT (BAT) sectors specified. (We don't care if those BAT
    +     *  blocks come from the 109 in the header, or from header + XBATS, it
    +     *  won't affect the calculation)
    +     *  
    +     * The actual file size will be between [size of fatCount-1 blocks] and
    +     *   [size of fatCount blocks].
    +     *  For 512 byte block sizes, this means we may over-estimate by up to 65kb.
    +     *  For 4096 byte block sizes, this means we may over-estimate by up to 4mb
    +     */
    +    public static int calculateMaximumSize(final POIFSBigBlockSize bigBlockSize,
    +          final int numBATs) {
    +       int size = 1; // Header isn't FAT addressed
    +       
    +       // The header has up to 109 BATs, and extra ones are referenced
    +       //  from XBATs
    +       // However, all BATs can contain 128/1024 blocks
    +       size += (numBATs * bigBlockSize.getBATEntriesPerBlock());
    +       
    +       // So far we've been in sector counts, turn into bytes
    +       return size * bigBlockSize.getBigBlockSize();
    +    }
    +    public static int calculateMaximumSize(final HeaderBlock header)
    +    {
    +       return calculateMaximumSize(header.getBigBlockSize(), header.getBATCount());
    +    }
    +
    +    /**
    +     * Returns the BATBlock that handles the specified offset,
    +     *  and the relative index within it.
    +     * The List of BATBlocks must be in sequential order
    +     */
    +    public static BATBlockAndIndex getBATBlockAndIndex(final int offset, 
    +                final HeaderBlock header, final List bats) {
    +       POIFSBigBlockSize bigBlockSize = header.getBigBlockSize();
    +       
    +       int whichBAT = (int)Math.floor(offset / bigBlockSize.getBATEntriesPerBlock());
    +       int index = offset % bigBlockSize.getBATEntriesPerBlock();
    +       return new BATBlockAndIndex( index, bats.get(whichBAT) );
    +    }
    +    
    +    /**
    +     * Returns the BATBlock that handles the specified offset,
    +     *  and the relative index within it, for the mini stream.
    +     * The List of BATBlocks must be in sequential order
    +     */
    +    public static BATBlockAndIndex getSBATBlockAndIndex(final int offset, 
    +          final HeaderBlock header, final List sbats) {
    +       POIFSBigBlockSize bigBlockSize = header.getBigBlockSize();
    +       
    +       // SBATs are so much easier, as they're chained streams
    +       int whichSBAT = (int)Math.floor(offset / bigBlockSize.getBATEntriesPerBlock());
    +       int index = offset % bigBlockSize.getBATEntriesPerBlock();
    +       return new BATBlockAndIndex( index, sbats.get(whichSBAT) );
    +    }
    +    
    +    private void setXBATChain(final POIFSBigBlockSize bigBlockSize, int chainIndex)
    +    {
    +        int _entries_per_xbat_block = bigBlockSize.getXBATEntriesPerBlock();
    +        _values[ _entries_per_xbat_block ] = chainIndex;
    +    }
    +    
    +    /**
    +     * Does this BATBlock have any free sectors in it, or
    +     *  is it full?
    +     */
    +    public boolean hasFreeSectors() {
    +       return _has_free_sectors;
    +    }
    +    
    +    public int getValueAt(int relativeOffset) {
    +       if(relativeOffset >= _values.length) {
    +          throw new ArrayIndexOutOfBoundsException(
    +                "Unable to fetch offset " + relativeOffset + " as the " + 
    +                "BAT only contains " + _values.length + " entries"
    +          ); 
    +       }
    +       return _values[relativeOffset];
    +    }
    +    public void setValueAt(int relativeOffset, int value) {
    +       int oldValue = _values[relativeOffset];
    +       _values[relativeOffset] = value;
    +       
    +       // Do we need to re-compute the free?
    +       if(value == POIFSConstants.UNUSED_BLOCK) {
    +          _has_free_sectors = true;
    +          return;
    +       }
    +       if(oldValue == POIFSConstants.UNUSED_BLOCK) {
    +          recomputeFree();
    +       }
    +    }
    +    
    +    /**
    +     * Record where in the file we live
    +     */
    +    public void setOurBlockIndex(int index) {
    +       this.ourBlockIndex = index;
    +    }
    +    /**
    +     * Retrieve where in the file we live 
    +     */
    +    public int getOurBlockIndex() {
    +       return ourBlockIndex;
    +    }
    +
     
         /* ********** START extension of BigBlock ********** */
     
    -    /**
    +   /**
          * Write the block's data to an OutputStream
          *
          * @param stream the OutputStream to which the stored data should
    @@ -226,13 +350,51 @@ public class BATBlock
          * @exception IOException on problems writing to the specified
          *            stream
          */
    -
         void writeData(final OutputStream stream)
             throws IOException
         {
    -        doWriteData(stream, _data);
    +       // Save it out
    +       stream.write( serialize() );
    +    }
    +    
    +    void writeData(final ByteBuffer block)
    +        throws IOException
    +    {
    +       // Save it out
    +       block.put( serialize() );
    +    }
    +    
    +    private byte[] serialize() {
    +       // Create the empty array
    +       byte[] data = new byte[ bigBlockSize.getBigBlockSize() ];
    +       
    +       // Fill in the values
    +       int offset = 0;
    +       for(int i=0; i<_values.length; i++) {
    +          LittleEndian.putInt(data, offset, _values[i]);
    +          offset += LittleEndian.INT_SIZE;
    +       }
    +       
    +       // Done
    +       return data;
         }
     
         /* **********  END  extension of BigBlock ********** */
    -}   // end public class BATBlock
    +    
    +    
    +    public static class BATBlockAndIndex {
    +       private final int index;
    +       private final BATBlock block;
    +       private BATBlockAndIndex(int index, BATBlock block) {
    +          this.index = index;
    +          this.block = block;
    +       }
    +       public int getIndex() {
    +          return index;
    +       }
    +       public BATBlock getBlock() {
    +          return block;
    +       }
    +    }
    +}
     
    diff --git a/src/java/org/apache/poi/poifs/storage/BigBlock.java b/src/java/org/apache/poi/poifs/storage/BigBlock.java
    index 2ca0d307d9..a3fa3f9e6e 100644
    --- a/src/java/org/apache/poi/poifs/storage/BigBlock.java
    +++ b/src/java/org/apache/poi/poifs/storage/BigBlock.java
    @@ -21,8 +21,8 @@ package org.apache.poi.poifs.storage;
     
     /**
      * Abstract base class of all POIFS block storage classes. All
    - * extensions of BigBlock should write 512 bytes of data when
    - * requested to write their data.
    + * extensions of BigBlock should write 512 or 4096 bytes of data when
    + * requested to write their data (as per their BigBlockSize).
      *
      * This class has package scope, as there is no reason at this time to
      * make the class public.
    @@ -33,9 +33,21 @@ package org.apache.poi.poifs.storage;
     import java.io.IOException;
     import java.io.OutputStream;
     
    +import org.apache.poi.poifs.common.POIFSBigBlockSize;
    +import org.apache.poi.poifs.common.POIFSConstants;
    +
     abstract class BigBlock
         implements BlockWritable
     {
    +    /** 
    +     * Either 512 bytes ({@link POIFSConstants#SMALLER_BIG_BLOCK_SIZE}) 
    +     *  or 4096 bytes ({@link POIFSConstants#LARGER_BIG_BLOCK_SIZE})
    +     */
    +    protected POIFSBigBlockSize bigBlockSize;
    +    
    +    protected BigBlock(POIFSBigBlockSize bigBlockSize) {
    +       this.bigBlockSize = bigBlockSize;
    +    }
     
         /**
          * Default implementation of write for extending classes that
    diff --git a/src/java/org/apache/poi/poifs/storage/BlockAllocationTableReader.java b/src/java/org/apache/poi/poifs/storage/BlockAllocationTableReader.java
    index b167d2fca1..0d1b86dd4f 100644
    --- a/src/java/org/apache/poi/poifs/storage/BlockAllocationTableReader.java
    +++ b/src/java/org/apache/poi/poifs/storage/BlockAllocationTableReader.java
    @@ -1,4 +1,3 @@
    -
     /* ====================================================================
        Licensed to the Apache Software Foundation (ASF) under one or more
        contributor license agreements.  See the NOTICE file distributed with
    @@ -15,7 +14,6 @@
        See the License for the specific language governing permissions and
        limitations under the License.
     ==================================================================== */
    -        
     
     package org.apache.poi.poifs.storage;
     
    @@ -23,6 +21,7 @@ import java.io.IOException;
     
     import java.util.*;
     
    +import org.apache.poi.poifs.common.POIFSBigBlockSize;
     import org.apache.poi.poifs.common.POIFSConstants;
     import org.apache.poi.util.IntList;
     import org.apache.poi.util.LittleEndian;
    @@ -43,10 +42,22 @@ import org.apache.poi.util.LittleEndianConsts;
      *
      * @author Marc Johnson (mjohnson at apache dot org)
      */
    -
    -public class BlockAllocationTableReader
    -{
    -    private IntList _entries;
    +public final class BlockAllocationTableReader {
    +    
    +    /**
    +     * Maximum number size (in blocks) of the allocation table as supported by
    +     * POI.
    + * + * This constant has been chosen to help POI identify corrupted data in the + * header block (rather than crash immediately with {@link OutOfMemoryError} + * ). It's not clear if the compound document format actually specifies any + * upper limits. For files with 512 byte blocks, having an allocation table + * of 65,335 blocks would correspond to a total file size of 4GB. Needless + * to say, POI probably cannot handle files anywhere near that size. + */ + private static final int MAX_BLOCK_COUNT = 65535; + private final IntList _entries; + private POIFSBigBlockSize bigBlockSize; /** * create a BlockAllocationTableReader for an existing filesystem. Side @@ -66,33 +77,41 @@ public class BlockAllocationTableReader * @exception IOException if, in trying to create the table, we * encounter logic errors */ + public BlockAllocationTableReader(POIFSBigBlockSize bigBlockSize, int block_count, int [] block_array, + int xbat_count, int xbat_index, BlockList raw_block_list) throws IOException { + this(bigBlockSize); + + sanityCheckBlockCount(block_count); - public BlockAllocationTableReader(final int block_count, - final int [] block_array, - final int xbat_count, - final int xbat_index, - final BlockList raw_block_list) - throws IOException - { - this(); - if (block_count <= 0) - { - throw new IOException( - "Illegal block count; minimum count is 1, got " + block_count - + " instead"); - } - - // acquire raw data blocks containing the BAT block data - RawDataBlock blocks[] = new RawDataBlock[ block_count ]; + // We want to get the whole of the FAT table + // To do this: + // * Work through raw_block_list, which points to the + // first (up to) 109 BAT blocks + // * Jump to the XBAT offset, and read in XBATs which + // point to more BAT blocks int limit = Math.min(block_count, block_array.length); int block_index; + + // This will hold all of the BAT blocks in order + RawDataBlock blocks[] = new RawDataBlock[ block_count ]; + // Process the first (up to) 109 BAT blocks for (block_index = 0; block_index < limit; block_index++) { + // Check that the sector number of the BAT block is a valid one + int nextOffset = block_array[ block_index ]; + if(nextOffset > raw_block_list.blockCount()) { + throw new IOException("Your file contains " + raw_block_list.blockCount() + + " sectors, but the initial DIFAT array at index " + block_index + + " referenced block # " + nextOffset + ". This isn't allowed and " + + " your file is corrupt"); + } + // Record the sector number of this BAT block blocks[ block_index ] = - ( RawDataBlock ) raw_block_list - .remove(block_array[ block_index ]); + ( RawDataBlock ) raw_block_list.remove(nextOffset); } + + // Process additional BAT blocks via the XBATs if (block_index < block_count) { @@ -103,9 +122,12 @@ public class BlockAllocationTableReader "BAT count exceeds limit, yet XBAT index indicates no valid entries"); } int chain_index = xbat_index; - int max_entries_per_block = BATBlock.entriesPerXBATBlock(); - int chain_index_offset = BATBlock.getXBATChainOffset(); + int max_entries_per_block = bigBlockSize.getXBATEntriesPerBlock(); + int chain_index_offset = bigBlockSize.getNextXBATChainOffset(); + // Each XBAT block contains either: + // (maximum number of sector indexes) + index of next XBAT + // some sector indexes + FREE sectors to max # + EndOfChain for (int j = 0; j < xbat_count; j++) { limit = Math.min(block_count - block_index, @@ -132,8 +154,8 @@ public class BlockAllocationTableReader throw new IOException("Could not find all blocks"); } - // now that we have all of the raw data blocks, go through and - // create the indices + // Now that we have all of the raw data blocks which make + // up the FAT, go through and create the indices setEntries(blocks, raw_block_list); } @@ -145,25 +167,31 @@ public class BlockAllocationTableReader * * @exception IOException */ - - BlockAllocationTableReader(final ListManagedBlock [] blocks, - final BlockList raw_block_list) - throws IOException - { - this(); + BlockAllocationTableReader(POIFSBigBlockSize bigBlockSize, ListManagedBlock[] blocks, BlockList raw_block_list) + throws IOException { + this(bigBlockSize); setEntries(blocks, raw_block_list); } - /** - * Constructor BlockAllocationTableReader - * - * - */ - - BlockAllocationTableReader() - { + BlockAllocationTableReader(POIFSBigBlockSize bigBlockSize) { + this.bigBlockSize = bigBlockSize; _entries = new IntList(); } + + public static void sanityCheckBlockCount(int block_count) throws IOException { + if (block_count <= 0) { + throw new IOException( + "Illegal block count; minimum count is 1, got " + + block_count + " instead" + ); + } + if (block_count > MAX_BLOCK_COUNT) { + throw new IOException( + "Block count " + block_count + + " is too high. POI maximum is " + MAX_BLOCK_COUNT + "." + ); + } + } /** * walk the entries from a specified point and return the @@ -177,21 +205,43 @@ public class BlockAllocationTableReader * * @exception IOException if there is a problem acquiring the blocks */ - - ListManagedBlock [] fetchBlocks(final int startBlock, - final BlockList blockList) - throws IOException - { - List blocks = new ArrayList(); + ListManagedBlock[] fetchBlocks(int startBlock, int headerPropertiesStartBlock, + BlockList blockList) throws IOException { + List blocks = new ArrayList(); int currentBlock = startBlock; + boolean firstPass = true; + ListManagedBlock dataBlock = null; - while (currentBlock != POIFSConstants.END_OF_CHAIN) - { - blocks.add(blockList.remove(currentBlock)); - currentBlock = _entries.get(currentBlock); + // Process the chain from the start to the end + // Normally we have header, data, end + // Sometimes we have data, header, end + // For those cases, stop at the header, not the end + while (currentBlock != POIFSConstants.END_OF_CHAIN) { + try { + // Grab the data at the current block offset + dataBlock = blockList.remove(currentBlock); + blocks.add(dataBlock); + // Now figure out which block we go to next + currentBlock = _entries.get(currentBlock); + firstPass = false; + } catch(IOException e) { + if(currentBlock == headerPropertiesStartBlock) { + // Special case where things are in the wrong order + System.err.println("Warning, header block comes after data blocks in POIFS block listing"); + currentBlock = POIFSConstants.END_OF_CHAIN; + } else if(currentBlock == 0 && firstPass) { + // Special case where the termination isn't done right + // on an empty set + System.err.println("Warning, incorrectly terminated empty data blocks in POIFS block listing (should end at -2, ended at 0)"); + currentBlock = POIFSConstants.END_OF_CHAIN; + } else { + // Ripple up + throw e; + } + } } - return ( ListManagedBlock [] ) blocks - .toArray(new ListManagedBlock[ 0 ]); + + return blocks.toArray(new ListManagedBlock[blocks.size()]); } // methods for debugging reader @@ -203,19 +253,14 @@ public class BlockAllocationTableReader * * @return true if the specific block is used, else false */ + boolean isUsed(int index) { - boolean isUsed(final int index) - { - boolean rval = false; - - try - { - rval = _entries.get(index) != -1; + try { + return _entries.get(index) != -1; + } catch (IndexOutOfBoundsException e) { + // ignored + return false; } - catch (IndexOutOfBoundsException ignored) - { - } - return rval; } /** @@ -229,18 +274,11 @@ public class BlockAllocationTableReader * * @exception IOException if the current block is unused */ - - int getNextBlockIndex(final int index) - throws IOException - { - if (isUsed(index)) - { + int getNextBlockIndex(int index) throws IOException { + if (isUsed(index)) { return _entries.get(index); } - else - { - throw new IOException("index " + index + " is unused"); - } + throw new IOException("index " + index + " is unused"); } /** @@ -249,15 +287,9 @@ public class BlockAllocationTableReader * @param blocks the array of blocks containing the indices * @param raw_blocks the list of blocks being managed. Unused * blocks will be eliminated from the list - * - * @exception IOException */ - - private void setEntries(final ListManagedBlock [] blocks, - final BlockList raw_blocks) - throws IOException - { - int limit = BATBlock.entriesPerBlock(); + private void setEntries(ListManagedBlock[] blocks, BlockList raw_blocks) throws IOException { + int limit = bigBlockSize.getBATEntriesPerBlock(); for (int block_index = 0; block_index < blocks.length; block_index++) { @@ -281,5 +313,4 @@ public class BlockAllocationTableReader } raw_blocks.setBAT(this); } -} // end class BlockAllocationTableReader - +} diff --git a/src/java/org/apache/poi/poifs/storage/BlockAllocationTableWriter.java b/src/java/org/apache/poi/poifs/storage/BlockAllocationTableWriter.java index b2f6af2c63..e037b892d6 100644 --- a/src/java/org/apache/poi/poifs/storage/BlockAllocationTableWriter.java +++ b/src/java/org/apache/poi/poifs/storage/BlockAllocationTableWriter.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,20 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; import java.io.IOException; import java.io.OutputStream; +import java.nio.ByteBuffer; -import java.util.*; - +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.filesystem.BATManaged; import org.apache.poi.util.IntList; -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.LittleEndianConsts; /** * This class manages and creates the Block Allocation Table, which is @@ -45,23 +41,21 @@ import org.apache.poi.util.LittleEndianConsts; * * @author Marc Johnson (mjohnson at apache dot org) */ - -public class BlockAllocationTableWriter - implements BlockWritable, BATManaged -{ +public final class BlockAllocationTableWriter implements BlockWritable, BATManaged { private IntList _entries; private BATBlock[] _blocks; private int _start_block; + private POIFSBigBlockSize _bigBlockSize; /** * create a BlockAllocationTableWriter */ - - public BlockAllocationTableWriter() + public BlockAllocationTableWriter(POIFSBigBlockSize bigBlockSize) { - _start_block = POIFSConstants.END_OF_CHAIN; - _entries = new IntList(); - _blocks = new BATBlock[ 0 ]; + _bigBlockSize = bigBlockSize; + _start_block = POIFSConstants.END_OF_CHAIN; + _entries = new IntList(); + _blocks = new BATBlock[ 0 ]; } /** @@ -69,7 +63,6 @@ public class BlockAllocationTableWriter * * @return start block index of BAT blocks */ - public int createBlocks() { int xbat_blocks = 0; @@ -78,12 +71,13 @@ public class BlockAllocationTableWriter while (true) { int calculated_bat_blocks = - BATBlock.calculateStorageRequirements(bat_blocks + BATBlock.calculateStorageRequirements(_bigBlockSize, + bat_blocks + xbat_blocks + _entries.size()); int calculated_xbat_blocks = - HeaderBlockWriter - .calculateXBATStorageRequirements(calculated_bat_blocks); + HeaderBlockWriter.calculateXBATStorageRequirements( + _bigBlockSize, calculated_bat_blocks); if ((bat_blocks == calculated_bat_blocks) && (xbat_blocks == calculated_xbat_blocks)) @@ -92,11 +86,8 @@ public class BlockAllocationTableWriter // stable ... we're OK break; } - else - { - bat_blocks = calculated_bat_blocks; - xbat_blocks = calculated_xbat_blocks; - } + bat_blocks = calculated_bat_blocks; + xbat_blocks = calculated_xbat_blocks; } int startBlock = allocateSpace(bat_blocks); @@ -112,7 +103,6 @@ public class BlockAllocationTableWriter * * @return the starting index of the blocks */ - public int allocateSpace(final int blockCount) { int startBlock = _entries.size(); @@ -136,7 +126,6 @@ public class BlockAllocationTableWriter * * @return the starting block index */ - public int getStartBlock() { return _start_block; @@ -145,14 +134,11 @@ public class BlockAllocationTableWriter /** * create the BATBlocks */ - void simpleCreateBlocks() { - _blocks = BATBlock.createBATBlocks(_entries.toArray()); + _blocks = BATBlock.createBATBlocks(_bigBlockSize, _entries.toArray()); } - /* ********** START implementation of BlockWritable ********** */ - /** * Write the storage to an OutputStream * @@ -162,7 +148,6 @@ public class BlockAllocationTableWriter * @exception IOException on problems writing to the specified * stream */ - public void writeBlocks(final OutputStream stream) throws IOException { @@ -171,16 +156,21 @@ public class BlockAllocationTableWriter _blocks[ j ].writeBlocks(stream); } } - - /* ********** END implementation of BlockWritable ********** */ - /* ********** START implementation of BATManaged ********** */ + + /** + * Write the BAT into its associated block + */ + public static void writeBlock(final BATBlock bat, final ByteBuffer block) + throws IOException + { + bat.writeData(block); + } /** * Return the number of BigBlock's this instance uses * * @return count of BigBlock instances */ - public int countBlocks() { return _blocks.length; @@ -188,15 +178,9 @@ public class BlockAllocationTableWriter /** * Set the start block for this instance - * - * @param start_block */ - public void setStartBlock(int start_block) { _start_block = start_block; } - - /* ********** END implementation of BATManaged ********** */ -} // end class BlockAllocationTableWriter - +} diff --git a/src/java/org/apache/poi/poifs/storage/BlockList.java b/src/java/org/apache/poi/poifs/storage/BlockList.java index 2352d3a2c1..d7e23cfb9c 100644 --- a/src/java/org/apache/poi/poifs/storage/BlockList.java +++ b/src/java/org/apache/poi/poifs/storage/BlockList.java @@ -59,13 +59,14 @@ public interface BlockList * blocks are removed from the list. * * @param startBlock the index of the first block in the stream + * @param headerPropertiesStartBlock the index of the first header block in the stream * * @return the stream as an array of correctly ordered blocks * * @exception IOException if blocks are missing */ - public ListManagedBlock [] fetchBlocks(final int startBlock) + public ListManagedBlock [] fetchBlocks(final int startBlock, final int headerPropertiesStartBlock) throws IOException; /** @@ -78,5 +79,7 @@ public interface BlockList public void setBAT(final BlockAllocationTableReader bat) throws IOException; + + public int blockCount(); } // end public interface BlockList diff --git a/src/java/org/apache/poi/poifs/storage/BlockListImpl.java b/src/java/org/apache/poi/poifs/storage/BlockListImpl.java index 7e44fda3f3..b7c6a0ccff 100644 --- a/src/java/org/apache/poi/poifs/storage/BlockListImpl.java +++ b/src/java/org/apache/poi/poifs/storage/BlockListImpl.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,30 +14,20 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; - -import java.util.*; +import java.io.IOException; /** * A simple implementation of BlockList * * @author Marc Johnson (mjohnson at apache dot org */ - -class BlockListImpl - implements BlockList -{ +abstract class BlockListImpl implements BlockList { private ListManagedBlock[] _blocks; private BlockAllocationTableReader _bat; - /** - * Constructor BlockListImpl - */ - protected BlockListImpl() { _blocks = new ListManagedBlock[ 0 ]; @@ -50,21 +39,17 @@ class BlockListImpl * * @param blocks blocks to be managed */ - protected void setBlocks(final ListManagedBlock [] blocks) { _blocks = blocks; } - /* ********** START implementation of BlockList ********** */ - /** * remove the specified block from the list * * @param index the index of the specified block; if the index is * out of range, that's ok */ - public void zap(final int index) { if ((index >= 0) && (index < _blocks.length)) @@ -73,6 +58,14 @@ class BlockListImpl } } + /** + * Unit testing method. Gets, without sanity checks or + * removing. + */ + protected ListManagedBlock get(final int index) { + return _blocks[index]; + } + /** * remove and return the specified block from the list * @@ -83,7 +76,6 @@ class BlockListImpl * @exception IOException if the index is out of range or has * already been removed */ - public ListManagedBlock remove(final int index) throws IOException { @@ -94,15 +86,17 @@ class BlockListImpl result = _blocks[ index ]; if (result == null) { - throw new IOException("block[ " + index - + " ] already removed"); + throw new IOException( + "block[ " + index + " ] already removed - " + + "does your POIFS have circular or duplicate block references?" + ); } _blocks[ index ] = null; } catch (ArrayIndexOutOfBoundsException ignored) { throw new IOException("Cannot remove block[ " + index - + " ]; out of range[ 0 - " + + + " ]; out of range[ 0 - " + (_blocks.length-1) + " ]"); } return result; @@ -118,8 +112,7 @@ class BlockListImpl * * @exception IOException if blocks are missing */ - - public ListManagedBlock [] fetchBlocks(final int startBlock) + public ListManagedBlock [] fetchBlocks(final int startBlock, final int headerPropertiesStartBlock) throws IOException { if (_bat == null) @@ -127,17 +120,14 @@ class BlockListImpl throw new IOException( "Improperly initialized list: no block allocation table provided"); } - return _bat.fetchBlocks(startBlock, this); + return _bat.fetchBlocks(startBlock, headerPropertiesStartBlock, this); } /** * set the associated BlockAllocationTable * * @param bat the associated BlockAllocationTable - * - * @exception IOException */ - public void setBAT(final BlockAllocationTableReader bat) throws IOException { @@ -148,7 +138,21 @@ class BlockListImpl } _bat = bat; } - - /* ********** END implementation of BlockList ********** */ -} // end package-scope class BlockListImpl - + + /** + * Returns the count of the number of blocks + */ + public int blockCount() { + return _blocks.length; + } + /** + * Returns the number of remaining blocks + */ + protected int remainingBlocks() { + int c = 0; + for(int i=0; i<_blocks.length; i++) { + if(_blocks[i] != null) c++; + } + return c; + } +} diff --git a/src/java/org/apache/poi/poifs/storage/DataInputBlock.java b/src/java/org/apache/poi/poifs/storage/DataInputBlock.java new file mode 100644 index 0000000000..a571a4f22e --- /dev/null +++ b/src/java/org/apache/poi/poifs/storage/DataInputBlock.java @@ -0,0 +1,186 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.storage; + +/** + * Wraps a byte array and provides simple data input access. + * Internally, this class maintains a buffer read index, so that for the most part, primitive + * data can be read in a data-input-stream-like manner.

    + * + * Note - the calling class should call the {@link #available()} method to detect end-of-buffer + * and move to the next data block when the current is exhausted. + * For optimisation reasons, no error handling is performed in this class. Thus, mistakes in + * calling code ran may raise ugly exceptions here, like {@link ArrayIndexOutOfBoundsException}, + * etc .

    + * + * The multi-byte primitive input methods ({@link #readUShortLE()}, {@link #readIntLE()} and + * {@link #readLongLE()}) have corresponding 'spanning read' methods which (when required) perform + * a read across the block boundary. These spanning read methods take the previous + * {@link DataInputBlock} as a parameter. + * Reads of larger amounts of data (into byte array buffers) must be managed by the caller + * since these could conceivably involve more than two blocks. + * + * @author Josh Micich + */ +public final class DataInputBlock { + + /** + * Possibly any size (usually 512K or 64K). Assumed to be at least 8 bytes for all blocks + * before the end of the stream. The last block in the stream can be any size except zero. + */ + private final byte[] _buf; + private int _readIndex; + private int _maxIndex; + + DataInputBlock(byte[] data, int startOffset) { + _buf = data; + _readIndex = startOffset; + _maxIndex = _buf.length; + } + public int available() { + return _maxIndex-_readIndex; + } + + public int readUByte() { + return _buf[_readIndex++] & 0xFF; + } + + /** + * Reads a short which was encoded in little endian format. + */ + public int readUShortLE() { + int i = _readIndex; + + int b0 = _buf[i++] & 0xFF; + int b1 = _buf[i++] & 0xFF; + _readIndex = i; + return (b1 << 8) + (b0 << 0); + } + + /** + * Reads a short which spans the end of prevBlock and the start of this block. + */ + public int readUShortLE(DataInputBlock prevBlock) { + // simple case - will always be one byte in each block + int i = prevBlock._buf.length-1; + + int b0 = prevBlock._buf[i++] & 0xFF; + int b1 = _buf[_readIndex++] & 0xFF; + return (b1 << 8) + (b0 << 0); + } + + /** + * Reads an int which was encoded in little endian format. + */ + public int readIntLE() { + int i = _readIndex; + + int b0 = _buf[i++] & 0xFF; + int b1 = _buf[i++] & 0xFF; + int b2 = _buf[i++] & 0xFF; + int b3 = _buf[i++] & 0xFF; + _readIndex = i; + return (b3 << 24) + (b2 << 16) + (b1 << 8) + (b0 << 0); + } + + /** + * Reads an int which spans the end of prevBlock and the start of this block. + */ + public int readIntLE(DataInputBlock prevBlock, int prevBlockAvailable) { + byte[] buf = new byte[4]; + + readSpanning(prevBlock, prevBlockAvailable, buf); + int b0 = buf[0] & 0xFF; + int b1 = buf[1] & 0xFF; + int b2 = buf[2] & 0xFF; + int b3 = buf[3] & 0xFF; + return (b3 << 24) + (b2 << 16) + (b1 << 8) + (b0 << 0); + } + + /** + * Reads a long which was encoded in little endian format. + */ + public long readLongLE() { + int i = _readIndex; + + int b0 = _buf[i++] & 0xFF; + int b1 = _buf[i++] & 0xFF; + int b2 = _buf[i++] & 0xFF; + int b3 = _buf[i++] & 0xFF; + int b4 = _buf[i++] & 0xFF; + int b5 = _buf[i++] & 0xFF; + int b6 = _buf[i++] & 0xFF; + int b7 = _buf[i++] & 0xFF; + _readIndex = i; + return (((long)b7 << 56) + + ((long)b6 << 48) + + ((long)b5 << 40) + + ((long)b4 << 32) + + ((long)b3 << 24) + + (b2 << 16) + + (b1 << 8) + + (b0 << 0)); + } + + /** + * Reads a long which spans the end of prevBlock and the start of this block. + */ + public long readLongLE(DataInputBlock prevBlock, int prevBlockAvailable) { + byte[] buf = new byte[8]; + + readSpanning(prevBlock, prevBlockAvailable, buf); + + int b0 = buf[0] & 0xFF; + int b1 = buf[1] & 0xFF; + int b2 = buf[2] & 0xFF; + int b3 = buf[3] & 0xFF; + int b4 = buf[4] & 0xFF; + int b5 = buf[5] & 0xFF; + int b6 = buf[6] & 0xFF; + int b7 = buf[7] & 0xFF; + return (((long)b7 << 56) + + ((long)b6 << 48) + + ((long)b5 << 40) + + ((long)b4 << 32) + + ((long)b3 << 24) + + (b2 << 16) + + (b1 << 8) + + (b0 << 0)); + } + + /** + * Reads a small amount of data from across the boundary between two blocks. + * The {@link #_readIndex} of this (the second) block is updated accordingly. + * Note- this method (and other code) assumes that the second {@link DataInputBlock} + * always is big enough to complete the read without being exhausted. + */ + private void readSpanning(DataInputBlock prevBlock, int prevBlockAvailable, byte[] buf) { + System.arraycopy(prevBlock._buf, prevBlock._readIndex, buf, 0, prevBlockAvailable); + int secondReadLen = buf.length-prevBlockAvailable; + System.arraycopy(_buf, 0, buf, prevBlockAvailable, secondReadLen); + _readIndex = secondReadLen; + } + + /** + * Reads len bytes from this block into the supplied buffer. + */ + public void readFully(byte[] buf, int off, int len) { + System.arraycopy(_buf, _readIndex, buf, off, len); + _readIndex += len; + } +} diff --git a/src/java/org/apache/poi/poifs/storage/DocumentBlock.java b/src/java/org/apache/poi/poifs/storage/DocumentBlock.java index ddaf5b3da0..a7c5686257 100644 --- a/src/java/org/apache/poi/poifs/storage/DocumentBlock.java +++ b/src/java/org/apache/poi/poifs/storage/DocumentBlock.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,31 +14,24 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; - import java.util.Arrays; +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.util.IOUtils; -import org.apache.poi.util.IntegerField; -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.LittleEndianConsts; /** * A block of document data. * * @author Marc Johnson (mjohnson at apache dot org) */ - -public class DocumentBlock - extends BigBlock -{ +public final class DocumentBlock extends BigBlock { private static final byte _default_value = ( byte ) 0xFF; private byte[] _data; private int _bytes_read; @@ -55,6 +47,11 @@ public class DocumentBlock public DocumentBlock(final RawDataBlock block) throws IOException { + super( + block.getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE ? + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS : + POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS + ); _data = block.getData(); _bytes_read = _data.length; } @@ -67,10 +64,10 @@ public class DocumentBlock * @exception IOException */ - public DocumentBlock(final InputStream stream) + public DocumentBlock(final InputStream stream, POIFSBigBlockSize bigBlockSize) throws IOException { - this(); + this(bigBlockSize); int count = IOUtils.readFully(stream, _data); _bytes_read = (count == -1) ? 0 @@ -81,9 +78,10 @@ public class DocumentBlock * Create a single instance initialized with default values */ - private DocumentBlock() + private DocumentBlock(POIFSBigBlockSize bigBlockSize) { - _data = new byte[ POIFSConstants.BIG_BLOCK_SIZE ]; + super(bigBlockSize); + _data = new byte[ bigBlockSize.getBigBlockSize() ]; Arrays.fill(_data, _default_value); } @@ -106,7 +104,7 @@ public class DocumentBlock public boolean partiallyRead() { - return _bytes_read != POIFSConstants.BIG_BLOCK_SIZE; + return _bytes_read != bigBlockSize.getBigBlockSize(); } /** @@ -129,26 +127,27 @@ public class DocumentBlock * input array */ - public static DocumentBlock [] convert(final byte [] array, + public static DocumentBlock [] convert(final POIFSBigBlockSize bigBlockSize, + final byte [] array, final int size) { DocumentBlock[] rval = - new DocumentBlock[ (size + POIFSConstants.BIG_BLOCK_SIZE - 1) / POIFSConstants.BIG_BLOCK_SIZE ]; + new DocumentBlock[ (size + bigBlockSize.getBigBlockSize() - 1) / bigBlockSize.getBigBlockSize() ]; int offset = 0; for (int k = 0; k < rval.length; k++) { - rval[ k ] = new DocumentBlock(); + rval[ k ] = new DocumentBlock(bigBlockSize); if (offset < array.length) { - int length = Math.min(POIFSConstants.BIG_BLOCK_SIZE, + int length = Math.min(bigBlockSize.getBigBlockSize(), array.length - offset); System.arraycopy(array, offset, rval[ k ]._data, 0, length); - if (length != POIFSConstants.BIG_BLOCK_SIZE) + if (length != bigBlockSize.getBigBlockSize()) { Arrays.fill(rval[ k ]._data, length, - POIFSConstants.BIG_BLOCK_SIZE, + bigBlockSize.getBigBlockSize(), _default_value); } } @@ -156,50 +155,26 @@ public class DocumentBlock { Arrays.fill(rval[ k ]._data, _default_value); } - offset += POIFSConstants.BIG_BLOCK_SIZE; + offset += bigBlockSize.getBigBlockSize(); } return rval; } - /** - * read data from an array of DocumentBlocks - * - * @param blocks the blocks to read from - * @param buffer the buffer to write the data into - * @param offset the offset into the array of blocks to read from - */ - - public static void read(final DocumentBlock [] blocks, - final byte [] buffer, final int offset) - { - int firstBlockIndex = offset / POIFSConstants.BIG_BLOCK_SIZE; - int firstBlockOffset = offset % POIFSConstants.BIG_BLOCK_SIZE; - int lastBlockIndex = (offset + buffer.length - 1) - / POIFSConstants.BIG_BLOCK_SIZE; - - if (firstBlockIndex == lastBlockIndex) - { - System.arraycopy(blocks[ firstBlockIndex ]._data, - firstBlockOffset, buffer, 0, buffer.length); + public static DataInputBlock getDataInputBlock(DocumentBlock[] blocks, int offset) { + if(blocks == null || blocks.length == 0) { + return null; } - else - { - int buffer_offset = 0; + + // Key things about the size of the block + POIFSBigBlockSize bigBlockSize = blocks[0].bigBlockSize; + int BLOCK_SHIFT = bigBlockSize.getHeaderValue(); + int BLOCK_SIZE = bigBlockSize.getBigBlockSize(); + int BLOCK_MASK = BLOCK_SIZE - 1; - System.arraycopy(blocks[ firstBlockIndex ]._data, - firstBlockOffset, buffer, buffer_offset, - POIFSConstants.BIG_BLOCK_SIZE - - firstBlockOffset); - buffer_offset += POIFSConstants.BIG_BLOCK_SIZE - firstBlockOffset; - for (int j = firstBlockIndex + 1; j < lastBlockIndex; j++) - { - System.arraycopy(blocks[ j ]._data, 0, buffer, buffer_offset, - POIFSConstants.BIG_BLOCK_SIZE); - buffer_offset += POIFSConstants.BIG_BLOCK_SIZE; - } - System.arraycopy(blocks[ lastBlockIndex ]._data, 0, buffer, - buffer_offset, buffer.length - buffer_offset); - } + // Now do the offset lookup + int firstBlockIndex = offset >> BLOCK_SHIFT; + int firstBlockOffset= offset & BLOCK_MASK; + return new DataInputBlock(blocks[firstBlockIndex]._data, firstBlockOffset); } /* ********** START extension of BigBlock ********** */ diff --git a/src/java/org/apache/poi/poifs/storage/HeaderBlock.java b/src/java/org/apache/poi/poifs/storage/HeaderBlock.java new file mode 100644 index 0000000000..5b9e071d6c --- /dev/null +++ b/src/java/org/apache/poi/poifs/storage/HeaderBlock.java @@ -0,0 +1,388 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.storage; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.Arrays; + +import org.apache.poi.poifs.common.POIFSBigBlockSize; +import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.filesystem.OfficeXmlFileException; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.IOUtils; +import org.apache.poi.util.IntegerField; +import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianConsts; +import org.apache.poi.util.LongField; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; +import org.apache.poi.util.ShortField; + +/** + * The block containing the archive header + */ +public final class HeaderBlock implements HeaderBlockConstants { + private static final POILogger _logger = + POILogFactory.getLogger(HeaderBlock.class); + + /** + * What big block size the file uses. Most files + * use 512 bytes, but a few use 4096 + */ + private final POIFSBigBlockSize bigBlockSize; + + /** + * Number of big block allocation table blocks (int). + * (Number of FAT Sectors in Microsoft parlance). + */ + private int _bat_count; + + /** + * Start of the property set block (int index of the property set + * chain's first big block). + */ + private int _property_start; + + /** + * start of the small block allocation table (int index of small + * block allocation table's first big block) + */ + private int _sbat_start; + /** + * Number of small block allocation table blocks (int) + * (Number of MiniFAT Sectors in Microsoft parlance) + */ + private int _sbat_count; + + /** + * Big block index for extension to the big block allocation table + */ + private int _xbat_start; + /** + * Number of big block allocation table blocks (int) + * (Number of DIFAT Sectors in Microsoft parlance) + */ + private int _xbat_count; + + /** + * The data. Only ever 512 bytes, because 4096 byte + * files use zeros for the extra header space. + */ + private final byte[] _data; + + private static final byte _default_value = ( byte ) 0xFF; + + /** + * create a new HeaderBlockReader from an InputStream + * + * @param stream the source InputStream + * + * @exception IOException on errors or bad data + */ + public HeaderBlock(InputStream stream) throws IOException { + // Grab the first 512 bytes + // (For 4096 sized blocks, the remaining 3584 bytes are zero) + // Then, process the contents + this(readFirst512(stream)); + + // Fetch the rest of the block if needed + if(bigBlockSize.getBigBlockSize() != 512) { + int rest = bigBlockSize.getBigBlockSize() - 512; + byte[] tmp = new byte[rest]; + IOUtils.readFully(stream, tmp); + } + } + + public HeaderBlock(ByteBuffer buffer) throws IOException { + this(IOUtils.toByteArray(buffer, POIFSConstants.SMALLER_BIG_BLOCK_SIZE)); + } + + private HeaderBlock(byte[] data) throws IOException { + this._data = data; + + // verify signature + long signature = LittleEndian.getLong(_data, _signature_offset); + + if (signature != _signature) { + // Is it one of the usual suspects? + byte[] OOXML_FILE_HEADER = POIFSConstants.OOXML_FILE_HEADER; + if(_data[0] == OOXML_FILE_HEADER[0] && + _data[1] == OOXML_FILE_HEADER[1] && + _data[2] == OOXML_FILE_HEADER[2] && + _data[3] == OOXML_FILE_HEADER[3]) { + throw new OfficeXmlFileException("The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)"); + } + if ((signature & 0xFF8FFFFFFFFFFFFFL) == 0x0010000200040009L) { + // BIFF2 raw stream starts with BOF (sid=0x0009, size=0x0004, data=0x00t0) + throw new IllegalArgumentException("The supplied data appears to be in BIFF2 format. " + + "POI only supports BIFF8 format"); + } + + // Give a generic error + throw new IOException("Invalid header signature; read " + + longToHex(signature) + ", expected " + + longToHex(_signature)); + } + + + // Figure out our block size + if (_data[30] == 12) { + this.bigBlockSize = POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS; + } else if(_data[30] == 9) { + this.bigBlockSize = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; + } else { + throw new IOException("Unsupported blocksize (2^"+ _data[30] + "). Expected 2^9 or 2^12."); + } + + // Setup the fields to read and write the counts and starts + _bat_count = new IntegerField(_bat_count_offset, data).get(); + _property_start = new IntegerField(_property_start_offset,_data).get(); + _sbat_start = new IntegerField(_sbat_start_offset, _data).get(); + _sbat_count = new IntegerField(_sbat_block_count_offset, _data).get(); + _xbat_start = new IntegerField(_xbat_start_offset, _data).get(); + _xbat_count = new IntegerField(_xbat_count_offset, _data).get(); + } + + /** + * Create a single instance initialized with default values + */ + public HeaderBlock(POIFSBigBlockSize bigBlockSize) + { + this.bigBlockSize = bigBlockSize; + + // Our data is always 512 big no matter what + _data = new byte[ POIFSConstants.SMALLER_BIG_BLOCK_SIZE ]; + Arrays.fill(_data, _default_value); + + // Set all the default values + new LongField(_signature_offset, _signature, _data); + new IntegerField(0x08, 0, _data); + new IntegerField(0x0c, 0, _data); + new IntegerField(0x10, 0, _data); + new IntegerField(0x14, 0, _data); + new ShortField(0x18, ( short ) 0x3b, _data); + new ShortField(0x1a, ( short ) 0x3, _data); + new ShortField(0x1c, ( short ) -2, _data); + + new ShortField(0x1e, bigBlockSize.getHeaderValue(), _data); + new IntegerField(0x20, 0x6, _data); + new IntegerField(0x24, 0, _data); + new IntegerField(0x28, 0, _data); + new IntegerField(0x34, 0, _data); + new IntegerField(0x38, 0x1000, _data); + + // Initialise the variables + _bat_count = 0; + _sbat_count = 0; + _xbat_count = 0; + _property_start = POIFSConstants.END_OF_CHAIN; + _sbat_start = POIFSConstants.END_OF_CHAIN; + _xbat_start = POIFSConstants.END_OF_CHAIN; + } + + private static byte[] readFirst512(InputStream stream) throws IOException { + // Grab the first 512 bytes + // (For 4096 sized blocks, the remaining 3584 bytes are zero) + byte[] data = new byte[512]; + int bsCount = IOUtils.readFully(stream, data); + if(bsCount != 512) { + throw alertShortRead(bsCount, 512); + } + return data; + } + + private static String longToHex(long value) { + return new String(HexDump.longToHex(value)); + } + + private static IOException alertShortRead(int pRead, int expectedReadSize) { + int read; + if (pRead < 0) { + //Can't have -1 bytes read in the error message! + read = 0; + } else { + read = pRead; + } + String type = " byte" + (read == 1 ? (""): ("s")); + + return new IOException("Unable to read entire header; " + + read + type + " read; expected " + + expectedReadSize + " bytes"); + } + + /** + * get start of Property Table + * + * @return the index of the first block of the Property Table + */ + public int getPropertyStart() { + return _property_start; + } + /** + * Set start of Property Table + * + * @param startBlock the index of the first block of the Property Table + */ + public void setPropertyStart(final int startBlock) { + _property_start = startBlock; + } + + /** + * @return start of small block (MiniFAT) allocation table + */ + public int getSBATStart() { + return _sbat_start; + } + public int getSBATCount() { + return _sbat_count; + } + + /** + * Set start of small block allocation table + * + * @param startBlock the index of the first big block of the small + * block allocation table + */ + public void setSBATStart(final int startBlock) { + _sbat_start = startBlock; + } + /** + * Set count of SBAT blocks + * + * @param count the number of SBAT blocks + */ + public void setSBATBlockCount(final int count) + { + _sbat_count = count; + } + + /** + * @return number of BAT blocks + */ + public int getBATCount() { + return _bat_count; + } + /** + * Sets the number of BAT blocks that are used. + * This is the number used in both the BAT and XBAT. + */ + public void setBATCount(final int count) { + _bat_count = count; + } + + /** + * Returns the offsets to the first (up to) 109 + * BAT sectors. + * Any additional BAT sectors are held in the XBAT (DIFAT) + * sectors in a chain. + * @return BAT offset array + */ + public int[] getBATArray() { + // Read them in + int[] result = new int[ Math.min(_bat_count,_max_bats_in_header) ]; + int offset = _bat_array_offset; + for (int j = 0; j < result.length; j++) { + result[ j ] = LittleEndian.getInt(_data, offset); + offset += LittleEndianConsts.INT_SIZE; + } + return result; + } + /** + * Sets the offsets of the first (up to) 109 + * BAT sectors. + */ + public void setBATArray(int[] bat_array) { + int count = Math.min(bat_array.length, _max_bats_in_header); + int blank = _max_bats_in_header - count; + + int offset = _bat_array_offset; + for(int i=0; i _max_bats_in_header) { int excess_blocks = blockCount - _max_bats_in_header; @@ -131,16 +92,16 @@ public class HeaderBlockWriter excess_block_array[ j ] = startBlock + j + _max_bats_in_header; } - rvalue = BATBlock.createXBATBlocks(excess_block_array, + rvalue = BATBlock.createXBATBlocks(bigBlockSize, excess_block_array, startBlock + blockCount); - _xbat_start.set(startBlock + blockCount, _data); + _header_block.setXBATStart(startBlock + blockCount); } else { - rvalue = BATBlock.createXBATBlocks(new int[ 0 ], 0); - _xbat_start.set(POIFSConstants.END_OF_CHAIN, _data); + rvalue = BATBlock.createXBATBlocks(bigBlockSize, new int[ 0 ], 0); + _header_block.setXBATStart(POIFSConstants.END_OF_CHAIN); } - _xbat_count.set(rvalue.length, _data); + _header_block.setXBATCount(rvalue.length); return rvalue; } @@ -150,10 +111,9 @@ public class HeaderBlockWriter * @param startBlock the index of the first block of the Property * Table */ - public void setPropertyStart(final int startBlock) { - _property_start.set(startBlock, _data); + _header_block.setPropertyStart(startBlock); } /** @@ -162,10 +122,9 @@ public class HeaderBlockWriter * @param startBlock the index of the first big block of the small * block allocation table */ - public void setSBATStart(final int startBlock) { - _sbat_start.set(startBlock, _data); + _header_block.setSBATStart(startBlock); } /** @@ -173,10 +132,9 @@ public class HeaderBlockWriter * * @param count the number of SBAT blocks */ - public void setSBATBlockCount(final int count) { - _sbat_block_count.set(count, _data); + _header_block.setSBATBlockCount(count); } /** @@ -188,11 +146,11 @@ public class HeaderBlockWriter * @return number of XBAT blocks needed */ - static int calculateXBATStorageRequirements(final int blockCount) + static int calculateXBATStorageRequirements(POIFSBigBlockSize bigBlockSize, final int blockCount) { return (blockCount > _max_bats_in_header) - ? BATBlock.calculateXBATStorageRequirements(blockCount - - _max_bats_in_header) + ? BATBlock.calculateXBATStorageRequirements( + bigBlockSize, blockCount - _max_bats_in_header) : 0; } @@ -207,11 +165,29 @@ public class HeaderBlockWriter * @exception IOException on problems writing to the specified * stream */ - - void writeData(final OutputStream stream) + public void writeBlocks(final OutputStream stream) throws IOException { - doWriteData(stream, _data); + _header_block.writeData(stream); + } + + /** + * Write the block's data to an existing block + * + * @param block the ByteBuffer of the block to which the + * stored data should be written + * + * @exception IOException on problems writing to the block + */ + public void writeBlock(ByteBuffer block) + throws IOException + { + ByteArrayOutputStream baos = new ByteArrayOutputStream( + _header_block.getBigBlockSize().getBigBlockSize() + ); + _header_block.writeData(baos); + + block.put(baos.toByteArray()); } /* ********** END extension of BigBlock ********** */ diff --git a/src/java/org/apache/poi/poifs/storage/PropertyBlock.java b/src/java/org/apache/poi/poifs/storage/PropertyBlock.java index 5dfaac5b76..c824166bf5 100644 --- a/src/java/org/apache/poi/poifs/storage/PropertyBlock.java +++ b/src/java/org/apache/poi/poifs/storage/PropertyBlock.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,31 +14,22 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; -import java.util.*; - -import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.property.Property; -import org.apache.poi.util.IntegerField; -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.LittleEndianConsts; /** * A block of Property instances * * @author Marc Johnson (mjohnson at apache dot org) */ - -public class PropertyBlock - extends BigBlock -{ - private static final int _properties_per_block = - POIFSConstants.BIG_BLOCK_SIZE / POIFSConstants.PROPERTY_SIZE; +public final class PropertyBlock extends BigBlock { private Property[] _properties; /** @@ -49,10 +39,12 @@ public class PropertyBlock * @param offset the offset into the properties array */ - private PropertyBlock(final Property [] properties, final int offset) + private PropertyBlock(final POIFSBigBlockSize bigBlockSize, final Property [] properties, final int offset) { - _properties = new Property[ _properties_per_block ]; - for (int j = 0; j < _properties_per_block; j++) + super(bigBlockSize); + + _properties = new Property[ bigBlockSize.getPropertiesPerBlock() ]; + for (int j = 0; j < _properties.length; j++) { _properties[ j ] = properties[ j + offset ]; } @@ -70,8 +62,9 @@ public class PropertyBlock */ public static BlockWritable [] createPropertyBlockArray( - final List properties) + final POIFSBigBlockSize bigBlockSize, final List properties) { + int _properties_per_block = bigBlockSize.getPropertiesPerBlock(); int block_count = (properties.size() + _properties_per_block - 1) / _properties_per_block; @@ -101,7 +94,7 @@ public class PropertyBlock for (int j = 0; j < block_count; j++) { - rvalue[ j ] = new PropertyBlock(to_be_written, + rvalue[ j ] = new PropertyBlock(bigBlockSize, to_be_written, j * _properties_per_block); } return rvalue; @@ -122,6 +115,7 @@ public class PropertyBlock void writeData(final OutputStream stream) throws IOException { + int _properties_per_block = bigBlockSize.getPropertiesPerBlock(); for (int j = 0; j < _properties_per_block; j++) { _properties[ j ].writeData(stream); diff --git a/src/java/org/apache/poi/poifs/storage/RawDataBlock.java b/src/java/org/apache/poi/poifs/storage/RawDataBlock.java index 5ca1781d07..018ee8ff2e 100644 --- a/src/java/org/apache/poi/poifs/storage/RawDataBlock.java +++ b/src/java/org/apache/poi/poifs/storage/RawDataBlock.java @@ -51,13 +51,14 @@ public class RawDataBlock */ public RawDataBlock(final InputStream stream) throws IOException { - this(stream, POIFSConstants.BIG_BLOCK_SIZE); + this(stream, POIFSConstants.SMALLER_BIG_BLOCK_SIZE); } /** * Constructor RawDataBlock * * @param stream the InputStream from which the data will be read - * @param blockSize the size of the POIFS blocks, normally 512 bytes {@link POIFSConstants#BIG_BLOCK_SIZE} + * @param blockSize the size of the POIFS blocks, normally 512 bytes + * {@link org.apache.poi.poifs.common.POIFSConstants#SMALLER_BIG_BLOCK_SIZE} * * @exception IOException on I/O errors, and if an insufficient * amount of data is read (the InputStream must @@ -111,6 +112,10 @@ public class RawDataBlock public boolean hasData() { return _hasData; } + + public String toString() { + return "RawDataBlock of size " + _data.length; + } /* ********** START implementation of ListManagedBlock ********** */ @@ -130,6 +135,13 @@ public class RawDataBlock } return _data; } + + /** + * What's the big block size? + */ + public int getBigBlockSize() { + return _data.length; + } /* ********** END implementation of ListManagedBlock ********** */ } // end public class RawDataBlock diff --git a/src/java/org/apache/poi/poifs/storage/RawDataBlockList.java b/src/java/org/apache/poi/poifs/storage/RawDataBlockList.java index 66eb237a8e..eb8bcc085c 100644 --- a/src/java/org/apache/poi/poifs/storage/RawDataBlockList.java +++ b/src/java/org/apache/poi/poifs/storage/RawDataBlockList.java @@ -23,6 +23,8 @@ import java.io.*; import java.util.*; +import org.apache.poi.poifs.common.POIFSBigBlockSize; + /** * A list of RawDataBlocks instances, and methods to manage the list * @@ -43,14 +45,14 @@ public class RawDataBlockList * block is read */ - public RawDataBlockList(final InputStream stream, int bigBlockSize) + public RawDataBlockList(final InputStream stream, POIFSBigBlockSize bigBlockSize) throws IOException { - List blocks = new ArrayList(); + List blocks = new ArrayList(); while (true) { - RawDataBlock block = new RawDataBlock(stream, bigBlockSize); + RawDataBlock block = new RawDataBlock(stream, bigBlockSize.getBigBlockSize()); // If there was data, add the block to the list if(block.hasData()) { @@ -62,7 +64,7 @@ public class RawDataBlockList break; } } - setBlocks(( RawDataBlock [] ) blocks.toArray(new RawDataBlock[ 0 ])); + setBlocks( blocks.toArray(new RawDataBlock[ blocks.size() ]) ); } } // end public class RawDataBlockList diff --git a/src/java/org/apache/poi/poifs/storage/SmallBlockTableReader.java b/src/java/org/apache/poi/poifs/storage/SmallBlockTableReader.java index e70774aa16..8b6efd36e8 100644 --- a/src/java/org/apache/poi/poifs/storage/SmallBlockTableReader.java +++ b/src/java/org/apache/poi/poifs/storage/SmallBlockTableReader.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,25 +14,21 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; +import java.io.IOException; + +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.property.RootProperty; -import java.util.*; - -import java.io.*; - /** * This class implements reading the small document block list from an * existing file * * @author Marc Johnson (mjohnson at apache dot org) */ - -public class SmallBlockTableReader -{ +public final class SmallBlockTableReader { /** * fetch the small document block list from an existing file @@ -48,17 +43,23 @@ public class SmallBlockTableReader * * @exception IOException */ - public static BlockList getSmallDocumentBlocks( + final POIFSBigBlockSize bigBlockSize, final RawDataBlockList blockList, final RootProperty root, final int sbatStart) throws IOException { - BlockList list = - new SmallDocumentBlockList(SmallDocumentBlock - .extract(blockList.fetchBlocks(root.getStartBlock()))); + // Fetch the blocks which hold the Small Blocks stream + ListManagedBlock [] smallBlockBlocks = + blockList.fetchBlocks(root.getStartBlock(), -1); + + // Turn that into a list + BlockList list =new SmallDocumentBlockList( + SmallDocumentBlock.extract(bigBlockSize, smallBlockBlocks)); - new BlockAllocationTableReader(blockList.fetchBlocks(sbatStart), + // Process + new BlockAllocationTableReader(bigBlockSize, + blockList.fetchBlocks(sbatStart, -1), list); return list; } diff --git a/src/java/org/apache/poi/poifs/storage/SmallBlockTableWriter.java b/src/java/org/apache/poi/poifs/storage/SmallBlockTableWriter.java index 4f89af1545..2db7bf4c73 100644 --- a/src/java/org/apache/poi/poifs/storage/SmallBlockTableWriter.java +++ b/src/java/org/apache/poi/poifs/storage/SmallBlockTableWriter.java @@ -19,6 +19,7 @@ package org.apache.poi.poifs.storage; +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.filesystem.BATManaged; import org.apache.poi.poifs.filesystem.POIFSDocument; @@ -50,10 +51,11 @@ public class SmallBlockTableWriter * @param root the Filesystem's root property */ - public SmallBlockTableWriter(final List documents, + public SmallBlockTableWriter(final POIFSBigBlockSize bigBlockSize, + final List documents, final RootProperty root) { - _sbat = new BlockAllocationTableWriter(); + _sbat = new BlockAllocationTableWriter(bigBlockSize); _small_blocks = new ArrayList(); _root = root; Iterator iter = documents.iterator(); @@ -76,7 +78,7 @@ public class SmallBlockTableWriter } _sbat.simpleCreateBlocks(); _root.setSize(_small_blocks.size()); - _big_block_count = SmallDocumentBlock.fill(_small_blocks); + _big_block_count = SmallDocumentBlock.fill(bigBlockSize,_small_blocks); } /** diff --git a/src/java/org/apache/poi/poifs/storage/SmallDocumentBlock.java b/src/java/org/apache/poi/poifs/storage/SmallDocumentBlock.java index dabf280e70..e7762ffbf6 100644 --- a/src/java/org/apache/poi/poifs/storage/SmallDocumentBlock.java +++ b/src/java/org/apache/poi/poifs/storage/SmallDocumentBlock.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,14 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; - -import java.util.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; /** @@ -31,26 +33,34 @@ import org.apache.poi.poifs.common.POIFSConstants; * * @author Marc Johnson (mjohnson at apache dot org) */ +public final class SmallDocumentBlock implements BlockWritable, ListManagedBlock { + private static final int BLOCK_SHIFT = 6; -public class SmallDocumentBlock - implements BlockWritable, ListManagedBlock -{ private byte[] _data; private static final byte _default_fill = ( byte ) 0xff; - private static final int _block_size = 64; - private static final int _blocks_per_big_block = - POIFSConstants.BIG_BLOCK_SIZE / _block_size; + private static final int _block_size = 1 << BLOCK_SHIFT; + private static final int BLOCK_MASK = _block_size-1; - private SmallDocumentBlock(final byte [] data, final int index) + private final int _blocks_per_big_block; + private final POIFSBigBlockSize _bigBlockSize; + + private SmallDocumentBlock(final POIFSBigBlockSize bigBlockSize, final byte [] data, final int index) { - this(); + this(bigBlockSize); System.arraycopy(data, index * _block_size, _data, 0, _block_size); } - private SmallDocumentBlock() + private SmallDocumentBlock(final POIFSBigBlockSize bigBlockSize) { + _bigBlockSize = bigBlockSize; + _blocks_per_big_block = getBlocksPerBigBlock(bigBlockSize); _data = new byte[ _block_size ]; } + + private static int getBlocksPerBigBlock(final POIFSBigBlockSize bigBlockSize) + { + return bigBlockSize.getBigBlockSize() / _block_size; + } /** * convert a single long array into an array of SmallDocumentBlock @@ -62,9 +72,9 @@ public class SmallDocumentBlock * @return an array of SmallDocumentBlock instances, filled from * the array */ - - public static SmallDocumentBlock [] convert(final byte [] array, - final int size) + public static SmallDocumentBlock [] convert(POIFSBigBlockSize bigBlockSize, + byte [] array, + int size) { SmallDocumentBlock[] rval = new SmallDocumentBlock[ (size + _block_size - 1) / _block_size ]; @@ -72,7 +82,7 @@ public class SmallDocumentBlock for (int k = 0; k < rval.length; k++) { - rval[ k ] = new SmallDocumentBlock(); + rval[ k ] = new SmallDocumentBlock(bigBlockSize); if (offset < array.length) { int length = Math.min(_block_size, array.length - offset); @@ -101,9 +111,10 @@ public class SmallDocumentBlock * * @return number of big blocks the list encompasses */ - - public static int fill(final List blocks) + public static int fill(POIFSBigBlockSize bigBlockSize, List blocks) { + int _blocks_per_big_block = getBlocksPerBigBlock(bigBlockSize); + int count = blocks.size(); int big_block_count = (count + _blocks_per_big_block - 1) / _blocks_per_big_block; @@ -111,7 +122,7 @@ public class SmallDocumentBlock for (; count < full_count; count++) { - blocks.add(makeEmptySmallDocumentBlock()); + blocks.add(makeEmptySmallDocumentBlock(bigBlockSize)); } return big_block_count; } @@ -128,9 +139,9 @@ public class SmallDocumentBlock * @exception ArrayIndexOutOfBoundsException if, somehow, the store * contains less data than size indicates */ - - public static SmallDocumentBlock [] convert(final BlockWritable [] store, - final int size) + public static SmallDocumentBlock [] convert(POIFSBigBlockSize bigBlockSize, + BlockWritable [] store, + int size) throws IOException, ArrayIndexOutOfBoundsException { ByteArrayOutputStream stream = new ByteArrayOutputStream(); @@ -145,7 +156,7 @@ public class SmallDocumentBlock for (int index = 0; index < rval.length; index++) { - rval[ index ] = new SmallDocumentBlock(data, index); + rval[ index ] = new SmallDocumentBlock(bigBlockSize, data, index); } return rval; } @@ -157,13 +168,12 @@ public class SmallDocumentBlock * data * * @return a List of SmallDocumentBlock's extracted from the input - * - * @exception IOException */ - - public static List extract(ListManagedBlock [] blocks) + public static List extract(POIFSBigBlockSize bigBlockSize, ListManagedBlock [] blocks) throws IOException { + int _blocks_per_big_block = getBlocksPerBigBlock(bigBlockSize); + List sdbs = new ArrayList(); for (int j = 0; j < blocks.length; j++) @@ -172,52 +182,16 @@ public class SmallDocumentBlock for (int k = 0; k < _blocks_per_big_block; k++) { - sdbs.add(new SmallDocumentBlock(data, k)); + sdbs.add(new SmallDocumentBlock(bigBlockSize, data, k)); } } return sdbs; } - /** - * read data from an array of SmallDocumentBlocks - * - * @param blocks the blocks to read from - * @param buffer the buffer to write the data into - * @param offset the offset into the array of blocks to read from - */ - - public static void read(final BlockWritable [] blocks, - final byte [] buffer, final int offset) - { - int firstBlockIndex = offset / _block_size; - int firstBlockOffset = offset % _block_size; - int lastBlockIndex = (offset + buffer.length - 1) / _block_size; - - if (firstBlockIndex == lastBlockIndex) - { - System.arraycopy( - (( SmallDocumentBlock ) blocks[ firstBlockIndex ])._data, - firstBlockOffset, buffer, 0, buffer.length); - } - else - { - int buffer_offset = 0; - - System.arraycopy( - (( SmallDocumentBlock ) blocks[ firstBlockIndex ])._data, - firstBlockOffset, buffer, buffer_offset, - _block_size - firstBlockOffset); - buffer_offset += _block_size - firstBlockOffset; - for (int j = firstBlockIndex + 1; j < lastBlockIndex; j++) - { - System.arraycopy((( SmallDocumentBlock ) blocks[ j ])._data, - 0, buffer, buffer_offset, _block_size); - buffer_offset += _block_size; - } - System.arraycopy( - (( SmallDocumentBlock ) blocks[ lastBlockIndex ])._data, 0, - buffer, buffer_offset, buffer.length - buffer_offset); - } + public static DataInputBlock getDataInputBlock(SmallDocumentBlock[] blocks, int offset) { + int firstBlockIndex = offset >> BLOCK_SHIFT; + int firstBlockOffset= offset & BLOCK_MASK; + return new DataInputBlock(blocks[firstBlockIndex]._data, firstBlockOffset); } /** @@ -227,27 +201,24 @@ public class SmallDocumentBlock * * @return total size */ - public static int calcSize(int size) { return size * _block_size; } - private static SmallDocumentBlock makeEmptySmallDocumentBlock() + private static SmallDocumentBlock makeEmptySmallDocumentBlock(POIFSBigBlockSize bigBlockSize) { - SmallDocumentBlock block = new SmallDocumentBlock(); + SmallDocumentBlock block = new SmallDocumentBlock(bigBlockSize); Arrays.fill(block._data, _default_fill); return block; } - private static int convertToBlockCount(final int size) + private static int convertToBlockCount(int size) { return (size + _block_size - 1) / _block_size; } - /* ********** START implementation of BlockWritable ********** */ - /** * Write the storage to an OutputStream * @@ -257,16 +228,12 @@ public class SmallDocumentBlock * @exception IOException on problems writing to the specified * stream */ - - public void writeBlocks(final OutputStream stream) + public void writeBlocks(OutputStream stream) throws IOException { stream.write(_data); } - /* ********** END implementation of BlockWritable ********** */ - /* ********** START implementation of ListManagedBlock ********** */ - /** * Get the data from the block * @@ -274,13 +241,11 @@ public class SmallDocumentBlock * * @exception IOException if there is no data */ - - public byte [] getData() - throws IOException - { + public byte [] getData() { return _data; } - - /* ********** END implementation of ListManagedBlock ********** */ -} // end public class SmallDocumentBlock - + + public POIFSBigBlockSize getBigBlockSize() { + return _bigBlockSize; + } +} diff --git a/src/java/org/apache/poi/poifs/storage/SmallDocumentBlockList.java b/src/java/org/apache/poi/poifs/storage/SmallDocumentBlockList.java index b83ac224f4..a510f8e8f7 100644 --- a/src/java/org/apache/poi/poifs/storage/SmallDocumentBlockList.java +++ b/src/java/org/apache/poi/poifs/storage/SmallDocumentBlockList.java @@ -40,7 +40,7 @@ public class SmallDocumentBlockList public SmallDocumentBlockList(final List blocks) { setBlocks(( SmallDocumentBlock [] ) blocks - .toArray(new SmallDocumentBlock[ 0 ])); + .toArray(new SmallDocumentBlock[ blocks.size() ])); } } // end public class SmallDocumentBlockList diff --git a/src/java/org/apache/poi/util/ArrayUtil.java b/src/java/org/apache/poi/util/ArrayUtil.java index a4000d29ec..be2b49999d 100644 --- a/src/java/org/apache/poi/util/ArrayUtil.java +++ b/src/java/org/apache/poi/util/ArrayUtil.java @@ -21,7 +21,6 @@ package org.apache.poi.util; * Utility classes for dealing with arrays. * * @author Glen Stampoultzis - * @version $Id$ */ public class ArrayUtil { diff --git a/src/java/org/apache/poi/util/BinaryTree.java b/src/java/org/apache/poi/util/BinaryTree.java index 58d7820b4f..551d588789 100644 --- a/src/java/org/apache/poi/util/BinaryTree.java +++ b/src/java/org/apache/poi/util/BinaryTree.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.util; @@ -89,34 +87,20 @@ import java.util.*; * * @author Marc Johnson (mjohnson at apache dot org) */ -public final class BinaryTree // final for performance - - extends AbstractMap -{ - private Node[] _root = new Node[] - { - null, null - }; - private int _size = 0; - private int _modifications = 0; - private Set[] _key_set = new Set[] - { - null, null - }; - private Set[] _entry_set = new Set[] - { - null, null - }; - private Collection[] _value_collection = new Collection[] - { - null, null - }; - private static final int _KEY = 0; - private static final int _VALUE = 1; - private static final int _INDEX_SUM = _KEY + _VALUE; - private static final int _MINIMUM_INDEX = 0; - private static final int _INDEX_COUNT = 2; - private static final String[] _data_name = new String[] +//for performance +public class BinaryTree extends AbstractMap { + final Node[] _root; + int _size = 0; + int _modifications = 0; + private final Set[] _key_set = new Set[] { null, null }; + private final Set[] _entry_set = new Set[] { null, null }; + private final Collection[] _value_collection = new Collection[] { null, null }; + static int _KEY = 0; + static int _VALUE = 1; + private static int _INDEX_SUM = _KEY + _VALUE; + private static int _MINIMUM_INDEX = 0; + private static int _INDEX_COUNT = 2; + private static String[] _data_name = new String[] { "key", "value" }; @@ -124,9 +108,8 @@ public final class BinaryTree // final for performance /** * Construct a new BinaryTree */ - - public BinaryTree() - { + public BinaryTree() { + _root = new Node[]{ null, null, }; } /** @@ -146,11 +129,11 @@ public final class BinaryTree // final for performance * or duplicate values in the * map */ - - public BinaryTree(final Map map) + public BinaryTree(Map map) throws ClassCastException, NullPointerException, IllegalArgumentException { + this(); putAll(map); } @@ -167,8 +150,7 @@ public final class BinaryTree // final for performance * inappropriate type for this map. * @exception NullPointerException if the value is null */ - - public Object getKeyForValue(final Object value) + public Object getKeyForValue(Object value) throws ClassCastException, NullPointerException { return doGet(( Comparable ) value, _VALUE); @@ -182,8 +164,7 @@ public final class BinaryTree // final for performance * @return previous key associated with specified value, or null * if there was no mapping for value. */ - - public Object removeValue(final Object value) + public Object removeValue(Object value) { return doRemove(( Comparable ) value, _VALUE); } @@ -207,7 +188,6 @@ public final class BinaryTree // final for performance * * @return a set view of the mappings contained in this map. */ - public Set entrySetByValue() { if (_entry_set[ _VALUE ] == null) @@ -423,8 +403,7 @@ public final class BinaryTree // final for performance * key. null if the specified key or value could not be * found */ - - private Object doRemove(final Comparable o, final int index) + private Object doRemove(Comparable o, int index) { Node node = lookup(o, index); Object rval = null; @@ -447,8 +426,7 @@ public final class BinaryTree // final for performance * key was mapped); null if we couldn't find the specified * object */ - - private Object doGet(final Comparable o, final int index) + private Object doGet(Comparable o, int index) { checkNonNullComparable(o, index); Node node = lookup(o, index); @@ -464,8 +442,7 @@ public final class BinaryTree // final for performance * * @return _VALUE (if _KEY was specified), else _KEY */ - - private int oppositeIndex(final int index) + private int oppositeIndex(int index) { // old trick ... to find the opposite of a value, m or n, @@ -483,8 +460,7 @@ public final class BinaryTree // final for performance * @return the desired Node, or null if there is no mapping of the * specified data */ - - private Node lookup(final Comparable data, final int index) + public Node lookup(Comparable data, int index) { Node rval = null; Node node = _root[ index ]; @@ -498,11 +474,8 @@ public final class BinaryTree // final for performance rval = node; break; } - else - { - node = (cmp < 0) ? node.getLeft(index) - : node.getRight(index); - } + node = (cmp < 0) ? node.getLeft(index) + : node.getRight(index); } return rval; } @@ -516,10 +489,9 @@ public final class BinaryTree // final for performance * @return negative value if o1 < o2; 0 if o1 == o2; positive * value if o1 > o2 */ - - private static int compare(final Comparable o1, final Comparable o2) + private static int compare(Comparable o1, Comparable o2) { - return (( Comparable ) o1).compareTo(o2); + return o1.compareTo(o2); } /** @@ -532,8 +504,7 @@ public final class BinaryTree // final for performance * @return the smallest node, from the specified node, in the * specified mapping */ - - private static Node leastNode(final Node node, final int index) + static Node leastNode(Node node, int index) { Node rval = node; @@ -555,8 +526,7 @@ public final class BinaryTree // final for performance * * @return the specified node */ - - private Node nextGreater(final Node node, final int index) + static Node nextGreater(Node node, int index) { Node rval = null; @@ -601,9 +571,7 @@ public final class BinaryTree // final for performance * @param to the node whose color we're changing; may be null * @param index _KEY or _VALUE */ - - private static void copyColor(final Node from, final Node to, - final int index) + private static void copyColor(Node from, Node to, int index) { if (to != null) { @@ -627,11 +595,9 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static boolean isRed(final Node node, final int index) + private static boolean isRed(Node node, int index) { - return ((node == null) ? false - : node.isRed(index)); + return node == null ? false : node.isRed(index); } /** @@ -641,11 +607,9 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static boolean isBlack(final Node node, final int index) + private static boolean isBlack(Node node, int index) { - return ((node == null) ? true - : node.isBlack(index)); + return node == null ? true : node.isBlack(index); } /** @@ -654,8 +618,7 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static void makeRed(final Node node, final int index) + private static void makeRed(Node node, int index) { if (node != null) { @@ -669,8 +632,7 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static void makeBlack(final Node node, final int index) + private static void makeBlack(Node node, int index) { if (node != null) { @@ -685,8 +647,7 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static Node getGrandParent(final Node node, final int index) + private static Node getGrandParent(Node node, int index) { return getParent(getParent(node, index), index); } @@ -698,8 +659,7 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static Node getParent(final Node node, final int index) + private static Node getParent(Node node, int index) { return ((node == null) ? null : node.getParent(index)); @@ -712,8 +672,7 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static Node getRightChild(final Node node, final int index) + private static Node getRightChild(Node node, int index) { return (node == null) ? null : node.getRight(index); @@ -726,8 +685,7 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static Node getLeftChild(final Node node, final int index) + private static Node getLeftChild(Node node, int index) { return (node == null) ? null : node.getLeft(index); @@ -744,15 +702,14 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static boolean isLeftChild(final Node node, final int index) - { - return (node == null) ? true - : ((node.getParent(index) == null) ? false - : (node - == node.getParent( - index).getLeft( - index))); + private static boolean isLeftChild(Node node, int index) { + if (node == null) { + return true; + } + if (node.getParent(index) == null) { + return false; + } + return node == node.getParent(index).getLeft(index); } /** @@ -766,15 +723,15 @@ public final class BinaryTree // final for performance * @param node the node (may be null) in question * @param index _KEY or _VALUE */ - - private static boolean isRightChild(final Node node, final int index) + private static boolean isRightChild(Node node, int index) { - return (node == null) ? true - : ((node.getParent(index) == null) ? false - : (node - == node.getParent( - index).getRight( - index))); + if (node == null) { + return true; + } + if (node.getParent(index) == null) { + return false; + } + return node == node.getParent(index).getRight(index); } /** @@ -783,8 +740,7 @@ public final class BinaryTree // final for performance * @param node the node to be rotated * @param index _KEY or _VALUE */ - - private void rotateLeft(final Node node, final int index) + private void rotateLeft(Node node, int index) { Node right_child = node.getRight(index); @@ -818,8 +774,7 @@ public final class BinaryTree // final for performance * @param node the node to be rotated * @param index _KEY or _VALUE */ - - private void rotateRight(final Node node, final int index) + private void rotateRight(Node node, int index) { Node left_child = node.getLeft(index); @@ -854,8 +809,7 @@ public final class BinaryTree // final for performance * @param inserted_node the node to be inserted * @param index _KEY or _VALUE */ - - private void doRedBlackInsert(final Node inserted_node, final int index) + private void doRedBlackInsert(Node inserted_node, int index) { Node current_node = inserted_node; @@ -931,8 +885,7 @@ public final class BinaryTree // final for performance * * @param deleted_node the node to be deleted */ - - private void doRedBlackDelete(final Node deleted_node) + void doRedBlackDelete(Node deleted_node) { for (int index = _MINIMUM_INDEX; index < _INDEX_COUNT; index++) { @@ -1023,9 +976,8 @@ public final class BinaryTree // final for performance * @param replacement_node the node being replaced * @param index _KEY or _VALUE */ - - private void doRedBlackDeleteFixup(final Node replacement_node, - final int index) + private void doRedBlackDeleteFixup(Node replacement_node, + int index) { Node current_node = replacement_node; @@ -1121,8 +1073,7 @@ public final class BinaryTree // final for performance * @param y another node * @param index _KEY or _VALUE */ - - private void swapPosition(final Node x, final Node y, final int index) + private void swapPosition(Node x, Node y, int index) { // Save initial values. @@ -1244,9 +1195,8 @@ public final class BinaryTree // final for performance * @exception NullPointerException if o is null * @exception ClassCastException if o is not Comparable */ - - private static void checkNonNullComparable(final Object o, - final int index) + private static void checkNonNullComparable(Object o, + int index) { if (o == null) { @@ -1268,8 +1218,7 @@ public final class BinaryTree // final for performance * @exception NullPointerException if key is null * @exception ClassCastException if key is not Comparable */ - - private static void checkKey(final Object key) + private static void checkKey(Object key) { checkNonNullComparable(key, _KEY); } @@ -1282,8 +1231,7 @@ public final class BinaryTree // final for performance * @exception NullPointerException if value is null * @exception ClassCastException if value is not Comparable */ - - private static void checkValue(final Object value) + private static void checkValue(Object value) { checkNonNullComparable(value, _VALUE); } @@ -1298,8 +1246,7 @@ public final class BinaryTree // final for performance * @exception NullPointerException if key or value is null * @exception ClassCastException if key or value is not Comparable */ - - private static void checkKeyAndValue(final Object key, final Object value) + private static void checkKeyAndValue(Object key, Object value) { checkKey(key); checkValue(value); @@ -1310,7 +1257,6 @@ public final class BinaryTree // final for performance * concurrent modification of the map through the map and through * an Iterator from one of its Set or Collection views */ - private void modify() { _modifications++; @@ -1319,7 +1265,6 @@ public final class BinaryTree // final for performance /** * bump up the size and note that the map has changed */ - private void grow() { modify(); @@ -1329,7 +1274,6 @@ public final class BinaryTree // final for performance /** * decrement the size and note that the map has changed */ - private void shrink() { modify(); @@ -1344,8 +1288,7 @@ public final class BinaryTree // final for performance * @exception IllegalArgumentException if the node already exists * in the value mapping */ - - private void insertValue(final Node newNode) + private void insertValue(Node newNode) throws IllegalArgumentException { Node node = _root[ _VALUE ]; @@ -1400,7 +1343,6 @@ public final class BinaryTree // final for performance * * @return the number of key-value mappings in this map. */ - public int size() { return _size; @@ -1419,8 +1361,7 @@ public final class BinaryTree // final for performance * type for this map. * @exception NullPointerException if the key is null */ - - public boolean containsKey(final Object key) + public boolean containsKey(Object key) throws ClassCastException, NullPointerException { checkKey(key); @@ -1436,8 +1377,7 @@ public final class BinaryTree // final for performance * @return true if this map maps one or more keys to the specified * value. */ - - public boolean containsValue(final Object value) + public boolean containsValue(Object value) { checkValue(value); return lookup(( Comparable ) value, _VALUE) != null; @@ -1456,8 +1396,7 @@ public final class BinaryTree // final for performance * type for this map. * @exception NullPointerException if the key is null */ - - public Object get(final Object key) + public Object get(Object key) throws ClassCastException, NullPointerException { return doGet(( Comparable ) key, _KEY); @@ -1483,8 +1422,7 @@ public final class BinaryTree // final for performance * value duplicates an * existing value */ - - public Object put(final Object key, final Object value) + public Object put(Object key, Object value) throws ClassCastException, NullPointerException, IllegalArgumentException { @@ -1562,8 +1500,7 @@ public final class BinaryTree // final for performance * @return previous value associated with specified key, or null * if there was no mapping for key. */ - - public Object remove(final Object key) + public Object remove(Object key) { return doRemove(( Comparable ) key, _KEY); } @@ -1571,7 +1508,6 @@ public final class BinaryTree // final for performance /** * Removes all mappings from this map */ - public void clear() { modify(); @@ -1592,7 +1528,6 @@ public final class BinaryTree // final for performance * * @return a set view of the keys contained in this map. */ - public Set keySet() { if (_key_set[ _KEY ] == null) @@ -1650,7 +1585,6 @@ public final class BinaryTree // final for performance * * @return a collection view of the values contained in this map. */ - public Collection values() { if (_value_collection[ _KEY ] == null) @@ -1723,7 +1657,6 @@ public final class BinaryTree // final for performance * * @return a set view of the mappings contained in this map. */ - public Set entrySet() { if (_entry_set[ _KEY ] == null) @@ -1803,8 +1736,7 @@ public final class BinaryTree // final for performance * * @param type */ - - BinaryTreeIterator(final int type) + BinaryTreeIterator(int type) { _type = type; _expected_modifications = BinaryTree.this._modifications; @@ -1825,7 +1757,7 @@ public final class BinaryTree // final for performance * @return true if the iterator has more elements. */ - public final boolean hasNext() + public boolean hasNext() { return _next_node != null; } @@ -1842,7 +1774,7 @@ public final class BinaryTree // final for performance * back */ - public final Object next() + public Object next() throws NoSuchElementException, ConcurrentModificationException { if (_next_node == null) @@ -1878,7 +1810,7 @@ public final class BinaryTree // final for performance * back */ - public final void remove() + public void remove() throws IllegalStateException, ConcurrentModificationException { if (_last_returned_node == null) @@ -1897,7 +1829,7 @@ public final class BinaryTree // final for performance /* ********** END implementation of Iterator ********** */ } // end private abstract class BinaryTreeIterator - // final for performance + // for performance private static final class Node implements Map.Entry { @@ -1917,7 +1849,7 @@ public final class BinaryTree // final for performance * @param value */ - Node(final Comparable key, final Comparable value) + Node(Comparable key, Comparable value) { _data = new Comparable[] { @@ -1949,8 +1881,7 @@ public final class BinaryTree // final for performance * * @return the key or value */ - - private Comparable getData(final int index) + public Comparable getData(int index) { return _data[ index ]; } @@ -1961,8 +1892,7 @@ public final class BinaryTree // final for performance * @param node the new left node * @param index _KEY or _VALUE */ - - private void setLeft(final Node node, final int index) + public void setLeft(Node node, int index) { _left[ index ] = node; } @@ -1975,7 +1905,7 @@ public final class BinaryTree // final for performance * @return the left node -- may be null */ - private Node getLeft(final int index) + public Node getLeft(int index) { return _left[ index ]; } @@ -1986,8 +1916,7 @@ public final class BinaryTree // final for performance * @param node the new right node * @param index _KEY or _VALUE */ - - private void setRight(final Node node, final int index) + public void setRight(Node node, int index) { _right[ index ] = node; } @@ -2000,7 +1929,7 @@ public final class BinaryTree // final for performance * @return the right node -- may be null */ - private Node getRight(final int index) + public Node getRight(int index) { return _right[ index ]; } @@ -2011,8 +1940,7 @@ public final class BinaryTree // final for performance * @param node the new parent node * @param index _KEY or _VALUE */ - - private void setParent(final Node node, final int index) + public void setParent(Node node, int index) { _parent[ index ] = node; } @@ -2024,8 +1952,7 @@ public final class BinaryTree // final for performance * * @return the parent node -- may be null */ - - private Node getParent(final int index) + public Node getParent(int index) { return _parent[ index ]; } @@ -2036,8 +1963,7 @@ public final class BinaryTree // final for performance * @param node the node to swap with * @param index _KEY or _VALUE */ - - private void swapColors(final Node node, final int index) + public void swapColors(Node node, int index) { // Swap colors -- old hacker's trick @@ -2053,8 +1979,7 @@ public final class BinaryTree // final for performance * * @return true if black (which is represented as a true boolean) */ - - private boolean isBlack(final int index) + public boolean isBlack(int index) { return _black[ index ]; } @@ -2066,8 +1991,7 @@ public final class BinaryTree // final for performance * * @return true if non-black */ - - private boolean isRed(final int index) + public boolean isRed(int index) { return !_black[ index ]; } @@ -2077,8 +2001,7 @@ public final class BinaryTree // final for performance * * @param index _KEY or _VALUE */ - - private void setBlack(final int index) + public void setBlack(int index) { _black[ index ] = true; } @@ -2088,8 +2011,7 @@ public final class BinaryTree // final for performance * * @param index _KEY or _VALUE */ - - private void setRed(final int index) + public void setRed(int index) { _black[ index ] = false; } @@ -2100,8 +2022,7 @@ public final class BinaryTree // final for performance * @param node the node whose color we're adopting * @param index _KEY or _VALUE */ - - private void copyColor(final Node node, final int index) + public void copyColor(Node node, int index) { _black[ index ] = node._black[ index ]; } @@ -2111,7 +2032,6 @@ public final class BinaryTree // final for performance /** * @return the key corresponding to this entry. */ - public Object getKey() { return _data[ _KEY ]; @@ -2120,7 +2040,6 @@ public final class BinaryTree // final for performance /** * @return the value corresponding to this entry. */ - public Object getValue() { return _data[ _VALUE ]; @@ -2133,10 +2052,7 @@ public final class BinaryTree // final for performance * @param ignored * * @return does not return - * - * @exception UnsupportedOperationException */ - public Object setValue(Object ignored) throws UnsupportedOperationException { @@ -2154,7 +2070,6 @@ public final class BinaryTree // final for performance * @return true if the specified object is equal to this map * entry. */ - public boolean equals(Object o) { if (this == o) @@ -2188,5 +2103,4 @@ public final class BinaryTree // final for performance /* ********** END implementation of Map.Entry ********** */ } -} // end public class BinaryTree - +} diff --git a/src/java/org/apache/poi/util/BitFieldFactory.java b/src/java/org/apache/poi/util/BitFieldFactory.java index a0da1fedd6..d022ee66ce 100755 --- a/src/java/org/apache/poi/util/BitFieldFactory.java +++ b/src/java/org/apache/poi/util/BitFieldFactory.java @@ -15,7 +15,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.util; @@ -27,18 +26,15 @@ import java.util.*; * @author Jason Height (jheight at apache dot org) */ -public class BitFieldFactory -{ +public class BitFieldFactory { private static Map instances = new HashMap(); - - public static BitField getInstance(final int mask) { - BitField f = (BitField)instances.get(new Integer(mask)); + + public static BitField getInstance(int mask) { + BitField f = (BitField)instances.get(Integer.valueOf(mask)); if (f == null) { f = new BitField(mask); - instances.put(new Integer(mask), f); + instances.put(Integer.valueOf(mask), f); } return f; } - -} // end public class BitFieldFactory - +} diff --git a/src/java/org/apache/poi/util/CloseIgnoringInputStream.java b/src/java/org/apache/poi/util/CloseIgnoringInputStream.java new file mode 100644 index 0000000000..f4896a8312 --- /dev/null +++ b/src/java/org/apache/poi/util/CloseIgnoringInputStream.java @@ -0,0 +1,41 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; + +import java.io.FilterInputStream; +import java.io.InputStream; + +import org.apache.poi.poifs.filesystem.POIFSFileSystem; + +/** + * A wrapper around an {@link InputStream}, which + * ignores close requests made to it. + * + * Useful with {@link POIFSFileSystem}, where you want + * to control the close yourself. + */ +public class CloseIgnoringInputStream extends FilterInputStream { + public CloseIgnoringInputStream(InputStream in) { + super(in); + } + + public void close() { + // Does nothing and ignores you + return; + } +} diff --git a/src/java/org/apache/poi/util/DelayableLittleEndianOutput.java b/src/java/org/apache/poi/util/DelayableLittleEndianOutput.java new file mode 100644 index 0000000000..13282ac378 --- /dev/null +++ b/src/java/org/apache/poi/util/DelayableLittleEndianOutput.java @@ -0,0 +1,34 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; +/** + * Implementors of this interface allow client code to 'delay' writing to a certain section of a + * data output stream.
    + * A typical application is for writing BIFF records when the size is not known until well after + * the header has been written. The client code can call {@link #createDelayedOutput(int)} + * to reserve two bytes of the output for the 'ushort size' header field. The delayed output can + * be written at any stage. + * + * @author Josh Micich + */ +public interface DelayableLittleEndianOutput extends LittleEndianOutput { + /** + * Creates an output stream intended for outputting a sequence of size bytes. + */ + LittleEndianOutput createDelayedOutput(int size); +} diff --git a/src/java/org/apache/poi/util/FontMetricsDumper.java b/src/java/org/apache/poi/util/FontMetricsDumper.java new file mode 100644 index 0000000000..c974c1e160 --- /dev/null +++ b/src/java/org/apache/poi/util/FontMetricsDumper.java @@ -0,0 +1,84 @@ + +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; + +import java.awt.*; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Properties; + +@SuppressWarnings("deprecation") +public class FontMetricsDumper +{ + public static void main( String[] args ) throws IOException + { + + Properties props = new Properties(); + + Font[] allFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); + for ( int i = 0; i < allFonts.length; i++ ) + { + String fontName = allFonts[i].getFontName(); + + Font font = new Font(fontName, Font.BOLD, 10); + FontMetrics fontMetrics = Toolkit.getDefaultToolkit().getFontMetrics(font); + int fontHeight = fontMetrics.getHeight(); + + props.setProperty("font." + fontName + ".height", fontHeight+""); + StringBuffer characters = new StringBuffer(); + for (char c = 'a'; c <= 'z'; c++) + { + characters.append( c + ", " ); + } + for (char c = 'A'; c <= 'Z'; c++) + { + characters.append( c + ", " ); + } + for (char c = '0'; c <= '9'; c++) + { + characters.append( c + ", " ); + } + StringBuffer widths = new StringBuffer(); + for (char c = 'a'; c <= 'z'; c++) + { + widths.append( fontMetrics.getWidths()[c] + ", " ); + } + for (char c = 'A'; c <= 'Z'; c++) + { + widths.append( fontMetrics.getWidths()[c] + ", " ); + } + for (char c = '0'; c <= '9'; c++) + { + widths.append( fontMetrics.getWidths()[c] + ", " ); + } + props.setProperty("font." + fontName + ".characters", characters.toString()); + props.setProperty("font." + fontName + ".widths", widths.toString()); + } + + FileOutputStream fileOut = new FileOutputStream("font_metrics.properties"); + try + { + props.store(fileOut, "Font Metrics"); + } + finally + { + fileOut.close(); + } + } +} diff --git a/src/java/org/apache/poi/util/HexDump.java b/src/java/org/apache/poi/util/HexDump.java index c5ebab30a7..66c47f387f 100644 --- a/src/java/org/apache/poi/util/HexDump.java +++ b/src/java/org/apache/poi/util/HexDump.java @@ -169,7 +169,7 @@ public class HexDump { * outside the data array's bounds * @return output string */ - + public static String dump(final byte [] data, final long offset, final int index) { StringBuffer buffer; @@ -216,10 +216,10 @@ public class HexDump { } buffer.append(EOL); display_offset += chars_read; - } + } return buffer.toString(); } - + private static String dump(final long value) { @@ -399,10 +399,10 @@ public class HexDump { while (bytesRemaining-- > 0) { int c = in.read(); - if (c == -1) + if (c == -1) { break; - else - buf.write(c); + } + buf.write(c); } } @@ -417,13 +417,13 @@ public class HexDump { // The return type is char array because most callers will probably append the value to a // StringBuffer, or write it to a Stream / Writer so there is no need to create a String; char[] result = new char[charPos]; - + long value = pValue; do { result[--charPos] = _hexcodes[(int) (value & 0x0F)]; value >>>= 4; } while (charPos > 1); - + // Prefix added to avoid ambiguity result[0] = '0'; result[1] = 'x'; @@ -456,7 +456,7 @@ public class HexDump { public static void main(String[] args) throws Exception { File file = new File(args[0]); - InputStream in = new BufferedInputStream(new FileInputStream(file)); + InputStream in = new BufferedInputStream(new FileInputStream(file)); byte[] b = new byte[(int)file.length()]; in.read(b); System.out.println(HexDump.dump(b, 0, 0)); diff --git a/src/java/org/apache/poi/util/HexRead.java b/src/java/org/apache/poi/util/HexRead.java index 91632e8fc5..fa7ecb5c4b 100644 --- a/src/java/org/apache/poi/util/HexRead.java +++ b/src/java/org/apache/poi/util/HexRead.java @@ -62,7 +62,7 @@ public class HexRead * @see #readData(String) */ public static byte[] readData(InputStream stream, String section ) throws IOException { - + try { StringBuffer sectionText = new StringBuffer(); @@ -128,7 +128,7 @@ public class HexRead characterCount++; if ( characterCount == 2 ) { - bytes.add( new Byte( b ) ); + bytes.add( Byte.valueOf( b ) ); characterCount = 0; b = (byte) 0; } @@ -151,7 +151,7 @@ public class HexRead characterCount++; if ( characterCount == 2 ) { - bytes.add( new Byte( b ) ); + bytes.add( Byte.valueOf( b ) ); characterCount = 0; b = (byte) 0; } diff --git a/src/java/org/apache/poi/util/IOUtils.java b/src/java/org/apache/poi/util/IOUtils.java index c3aa8695e2..c3c8fa1ac9 100644 --- a/src/java/org/apache/poi/util/IOUtils.java +++ b/src/java/org/apache/poi/util/IOUtils.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,73 +14,119 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; -public class IOUtils -{ - private IOUtils() - { - } +public final class IOUtils { + private IOUtils() { + // no instances of this class + } - /** - * Reads all the data from the input stream, and returns - * the bytes read. - */ - public static byte[] toByteArray(InputStream stream) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - byte[] buffer = new byte[4096]; - int read = 0; - while(read != -1) { - read = stream.read(buffer); - if(read > 0) { - baos.write(buffer, 0, read); - } - } - - return baos.toByteArray(); - } + /** + * Reads all the data from the input stream, and returns the bytes read. + */ + public static byte[] toByteArray(InputStream stream) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); - /** - * Helper method, just calls readFully(in, b, 0, b.length) - */ - public static int readFully(InputStream in, byte[] b) - throws IOException - { - return readFully(in, b, 0, b.length); - } + byte[] buffer = new byte[4096]; + int read = 0; + while (read != -1) { + read = stream.read(buffer); + if (read > 0) { + baos.write(buffer, 0, read); + } + } - /** - * Same as the normal in.read(b, off, len), but - * tries to ensure that the entire len number of bytes - * is read. - *

    - * If the end of file is reached before any bytes - * are read, returns -1. - * If the end of the file is reached after some bytes are - * read, returns the number of bytes read. - * If the end of the file isn't reached before len - * bytes have been read, will return len bytes. - */ - public static int readFully(InputStream in, byte[] b, int off, int len) - throws IOException - { - int total = 0; - for (;;) { - int got = in.read(b, off + total, len - total); - if (got < 0) { - return (total == 0) ? -1 : total; - } else { - total += got; - if (total == len) - return total; - } - } - } -} \ No newline at end of file + return baos.toByteArray(); + } + + /** + * Returns an array (that shouldn't be written to!) of the + * ByteBuffer. Will be of the requested length, or possibly + * longer if that's easier. + */ + public static byte[] toByteArray(ByteBuffer buffer, int length) { + if(buffer.hasArray() && buffer.arrayOffset() == 0) { + // The backing array should work out fine for us + return buffer.array(); + } + + byte[] data = new byte[length]; + buffer.get(data); + return data; + } + + /** + * Helper method, just calls readFully(in, b, 0, b.length) + */ + public static int readFully(InputStream in, byte[] b) throws IOException { + return readFully(in, b, 0, b.length); + } + + /** + * Same as the normal in.read(b, off, len), but tries to ensure + * that the entire len number of bytes is read. + *

    + * If the end of file is reached before any bytes are read, returns -1. If + * the end of the file is reached after some bytes are read, returns the + * number of bytes read. If the end of the file isn't reached before len + * bytes have been read, will return len bytes. + */ + public static int readFully(InputStream in, byte[] b, int off, int len) throws IOException { + int total = 0; + while (true) { + int got = in.read(b, off + total, len - total); + if (got < 0) { + return (total == 0) ? -1 : total; + } + total += got; + if (total == len) { + return total; + } + } + } + + /** + * Same as the normal channel.read(b), but tries to ensure + * that the entire len number of bytes is read. + *

    + * If the end of file is reached before any bytes are read, returns -1. If + * the end of the file is reached after some bytes are read, returns the + * number of bytes read. If the end of the file isn't reached before len + * bytes have been read, will return len bytes. + */ + public static int readFully(ReadableByteChannel channel, ByteBuffer b) throws IOException { + int total = 0; + while (true) { + int got = channel.read(b); + if (got < 0) { + return (total == 0) ? -1 : total; + } + total += got; + if (total == b.capacity()) { + return total; + } + } + } + + /** + * Copies all the data from the given InputStream to the OutputStream. It + * leaves both streams open, so you will still need to close them once done. + */ + public static void copy(InputStream inp, OutputStream out) throws IOException { + byte[] buff = new byte[4096]; + int count; + while ((count = inp.read(buff)) != -1) { + if (count > 0) { + out.write(buff, 0, count); + } + } + } +} diff --git a/src/java/org/apache/poi/util/IntList.java b/src/java/org/apache/poi/util/IntList.java index 30498cf439..08f024082e 100644 --- a/src/java/org/apache/poi/util/IntList.java +++ b/src/java/org/apache/poi/util/IntList.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,12 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.util; -import java.util.*; - /** * A List of int's; as full an implementation of the java.util.List * interface as possible, with an eye toward minimal creation of @@ -47,7 +43,6 @@ import java.util.*; * * @author Marc Johnson */ - public class IntList { private int[] _array; @@ -62,14 +57,14 @@ public class IntList public IntList() { this(_default_size); - } + } public IntList(final int initialCapacity) { this(initialCapacity,0); } - - + + /** * create a copy of an existing IntList * @@ -94,17 +89,17 @@ public class IntList _array = new int[ initialCapacity ]; if (fillval != 0) { fillval = fillvalue; - fillArray(fillval, _array, 0); + fillArray(fillval, _array, 0); } _limit = 0; } private void fillArray(int val, int[] array, int index) { for (int k = index; k < array.length; k++) { - array[k] = val; + array[k] = val; } } - + /** * add the specfied value at the specified index * @@ -348,7 +343,9 @@ public class IntList { if (index >= _limit) { - throw new IndexOutOfBoundsException(); + throw new IndexOutOfBoundsException( + index + " not accessible in a list of length " + _limit + ); } return _array[ index ]; } @@ -653,11 +650,11 @@ public class IntList int size = (new_size == _array.length) ? new_size + 1 : new_size; int[] new_array = new int[ size ]; - + if (fillval != 0) { - fillArray(fillval, new_array, _array.length); + fillArray(fillval, new_array, _array.length); } - + System.arraycopy(_array, 0, new_array, 0, _limit); _array = new_array; } diff --git a/src/java/org/apache/poi/util/IntMapper.java b/src/java/org/apache/poi/util/IntMapper.java index 89ae28c631..d5cdc7b67b 100755 --- a/src/java/org/apache/poi/util/IntMapper.java +++ b/src/java/org/apache/poi/util/IntMapper.java @@ -34,10 +34,10 @@ import java.util.*; * @author Jason Height */ -public class IntMapper +public class IntMapper { - private List elements; - private Map valueKeyMap; + private List elements; + private Map valueKeyMap; private static final int _default_size = 10; @@ -52,8 +52,8 @@ public class IntMapper public IntMapper(final int initialCapacity) { - elements = new ArrayList(initialCapacity); - valueKeyMap = new HashMap(initialCapacity); + elements = new ArrayList(initialCapacity); + valueKeyMap = new HashMap(initialCapacity); } /** @@ -64,12 +64,11 @@ public class IntMapper * @return true (as per the general contract of the Collection.add * method). */ - - public boolean add(final Object value) + public boolean add(final T value) { int index = elements.size(); elements.add(value); - valueKeyMap.put(value, new Integer(index)); + valueKeyMap.put(value, index); return true; } @@ -77,18 +76,18 @@ public class IntMapper return elements.size(); } - public Object get(int index) { + public T get(int index) { return elements.get(index); } - public int getIndex(Object o) { - Integer i = ((Integer)valueKeyMap.get(o)); + public int getIndex(T o) { + Integer i = valueKeyMap.get(o); if (i == null) return -1; return i.intValue(); } - public Iterator iterator() { + public Iterator iterator() { return elements.iterator(); } } // end public class IntMapper diff --git a/src/java/org/apache/poi/util/Internal.java b/src/java/org/apache/poi/util/Internal.java new file mode 100644 index 0000000000..2177e09dd2 --- /dev/null +++ b/src/java/org/apache/poi/util/Internal.java @@ -0,0 +1,38 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; + +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Retention; +import java.lang.annotation.Documented; + + +/** + * Program elements annotated @Internal are intended for + * POI internal use only. Such elements are not public by design + * and likely to be removed in future versions of POI or access + * to such elements will be changed from 'public' to 'default' or less. + * + * @author Yegor Kozlov + * @since POI-3.6 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +public @interface Internal { + String value() default ""; +} diff --git a/src/java/org/apache/poi/util/LZWDecompresser.java b/src/java/org/apache/poi/util/LZWDecompresser.java new file mode 100644 index 0000000000..f172a01db4 --- /dev/null +++ b/src/java/org/apache/poi/util/LZWDecompresser.java @@ -0,0 +1,178 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * This class provides common functionality for the + * various LZW implementations in the different file + * formats. + * It's currently used by HDGF and HMEF. + * + * Two good resources on LZW are: + * http://en.wikipedia.org/wiki/LZW + * http://marknelson.us/1989/10/01/lzw-data-compression/ + */ +public abstract class LZWDecompresser { + /** + * Does the mask bit mean it's compressed or uncompressed? + */ + private boolean maskMeansCompressed; + + protected LZWDecompresser(boolean maskMeansCompressed) { + this.maskMeansCompressed = maskMeansCompressed; + } + + /** + * Populates the dictionary. May not need + * to do anything if all zeros is fine. + */ + protected abstract void populateDictionary(byte[] dict); + + /** + * Adjusts the position offset if needed when looking + * something up in the dictionary. + */ + protected abstract int adjustDictionaryOffset(int offset); + + /** + * Decompresses the given input stream, returning the array of bytes + * of the decompressed input. + */ + public byte[] decompress(InputStream src) throws IOException { + ByteArrayOutputStream res = new ByteArrayOutputStream(); + decompress(src,res); + return res.toByteArray(); + } + + /** + * Perform a streaming decompression of the input. + * Works by: + * 1) Reading a flag byte, the 8 bits of which tell you if the + * following 8 codes are compressed our un-compressed + * 2) Consider the 8 bits in turn + * 3) If the bit is set, the next code is un-compressed, so + * add it to the dictionary and output it + * 4) If the bit isn't set, then read in the length and start + * position in the dictionary, and output the bytes there + * 5) Loop until we've done all 8 bits, then read in the next + * flag byte + */ + public void decompress(InputStream src, OutputStream res) throws IOException { + // We use 12 bit codes: + // * 0-255 are real bytes + // * 256-4095 are the substring codes + // Java handily initialises our buffer / dictionary + // to all zeros + byte[] buffer = new byte[4096]; + populateDictionary(buffer); + + // How far through the output we've got + // (This is normally used &4095, so it nicely wraps) + int pos = 0; + // The flag byte is treated as its 8 individual + // bits, which tell us if the following 8 codes + // are compressed or un-compressed + int flag; + // The mask, between 1 and 255, which is used when + // processing each bit of the flag byte in turn + int mask; + + // These are bytes as looked up in the dictionary + // It needs to be signed, as it'll get passed on to + // the output stream + byte[] dataB = new byte[19]; + // This is an unsigned byte read from the stream + // It needs to be unsigned, so that bit stuff works + int dataI; + // The compressed code sequence is held over 2 bytes + int dataIPt1, dataIPt2; + // How long a code sequence is, and where in the + // dictionary to start at + int len, pntr; + + while( (flag = src.read()) != -1 ) { + // Compare each bit in our flag byte in turn: + for(mask = 1; mask < 256 ; mask <<= 1) { + // Is this a new code (un-compressed), or + // the use of existing codes (compressed)? + boolean isMaskSet = (flag & mask) > 0; + if( isMaskSet && !maskMeansCompressed ) { + // Retrieve the un-compressed code + if( (dataI = src.read()) != -1) { + // Save the byte into the dictionary + buffer[(pos&4095)] = fromInt(dataI); + pos++; + // And output the byte + res.write( new byte[] {fromInt(dataI)} ); + } + } else { + // We have a compressed sequence + // Grab the next 16 bits of data + dataIPt1 = src.read(); + dataIPt2 = src.read(); + if(dataIPt1 == -1 || dataIPt2 == -1) break; + + // Build up how long the code sequence is, and + // what position of the code to start at + // (The position is the first 12 bits, the + // length is the last 4 bits) + len = (dataIPt2 & 15) + 3; + pntr = (dataIPt2 & 240)*16 + dataIPt1; + + // Adjust the pointer as needed + pntr = adjustDictionaryOffset(pntr); + + // Loop over the codes, outputting what they correspond to + for(int i=0; i= 0) { + return b; + } + return b + 256; + } +} diff --git a/src/java/org/apache/poi/util/LittleEndian.java b/src/java/org/apache/poi/util/LittleEndian.java index 373710b47a..abc494c3dc 100644 --- a/src/java/org/apache/poi/util/LittleEndian.java +++ b/src/java/org/apache/poi/util/LittleEndian.java @@ -28,13 +28,12 @@ import java.io.InputStream; *@author Marc Johnson (mjohnson at apache dot org) *@author Andrew Oliver (acoliver at apache dot org) */ -public final class LittleEndian implements LittleEndianConsts { +public class LittleEndian implements LittleEndianConsts { private LittleEndian() { - // no instances of this class + // no instances of this class } - /** * get a short value from a byte array * @@ -42,9 +41,10 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@return the short (16-bit) value */ - - public static short getShort(final byte[] data, final int offset) { - return (short) getNumber(data, offset, SHORT_SIZE); + public static short getShort(byte[] data, int offset) { + int b0 = data[offset] & 0xFF; + int b1 = data[offset+1] & 0xFF; + return (short) ((b1 << 8) + (b0 << 0)); } @@ -55,73 +55,32 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@return the unsigned short (16-bit) value in an integer */ - public static int getUShort(final byte[] data, final int offset) { - short num = (short) getNumber(data, offset, SHORT_SIZE); - int retNum; - if (num < 0) { - retNum = (Short.MAX_VALUE + 1) * 2 + num; - } else { - retNum = num; - } - return retNum; + public static int getUShort(byte[] data, int offset) { + int b0 = data[offset] & 0xFF; + int b1 = data[offset+1] & 0xFF; + return (b1 << 8) + (b0 << 0); } - - /** - * get a short array from a byte array. - * - *@param data Description of the Parameter - *@param offset Description of the Parameter - *@param size Description of the Parameter - *@return The simpleShortArray value - */ - public static short[] getSimpleShortArray(final byte[] data, final int offset, final int size) { - short[] results = new short[size]; - for (int i = 0; i < size; i++) { - results[i] = getShort(data, offset + 2 + (i * 2)); - } - return results; - } - - - /** - * get a short array from a byte array. The short array is assumed to start - * with a word describing the length of the array. - * - *@param data Description of the Parameter - *@param offset Description of the Parameter - *@return The shortArray value - */ - public static short[] getShortArray(final byte[] data, final int offset) { - int size = (int) getNumber(data, offset, SHORT_SIZE); - short[] results = getSimpleShortArray(data, offset, size); - return results; - } - - /** * get a short value from the beginning of a byte array * *@param data the byte array *@return the short (16-bit) value */ - - public static short getShort(final byte[] data) { + public static short getShort(byte[] data) { return getShort(data, 0); } - /** * get an unsigned short value from the beginning of a byte array * *@param data the byte array *@return the unsigned short (16-bit) value in an int */ - public static int getUShort(final byte[] data) { + public static int getUShort(byte[] data) { return getUShort(data, 0); } - /** * get an int value from a byte array * @@ -129,9 +88,13 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@return the int (32-bit) value */ - - public static int getInt(final byte[] data, final int offset) { - return (int) getNumber(data, offset, INT_SIZE); + public static int getInt(byte[] data, int offset) { + int i=offset; + int b0 = data[i++] & 0xFF; + int b1 = data[i++] & 0xFF; + int b2 = data[i++] & 0xFF; + int b3 = data[i++] & 0xFF; + return (b3 << 24) + (b2 << 16) + (b1 << 8) + (b0 << 0); } @@ -139,10 +102,9 @@ public final class LittleEndian implements LittleEndianConsts { * get an int value from the beginning of a byte array * *@param data the byte array - *@return the int (32-bit) value + *@return the int (32-bit) value */ - - public static int getInt(final byte[] data) { + public static int getInt(byte[] data) { return getInt(data, 0); } @@ -154,15 +116,9 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@return the unsigned int (32-bit) value in a long */ - public static long getUInt(final byte[] data, final int offset) { - int num = (int) getNumber(data, offset, INT_SIZE); - long retNum; - if (num < 0) { - retNum = ((long) Integer.MAX_VALUE + 1) * 2 + num; - } else { - retNum = num; - } - return retNum; + public static long getUInt(byte[] data, int offset) { + long retNum = getInt(data, offset); + return retNum & 0x00FFFFFFFF; } /** @@ -171,8 +127,8 @@ public final class LittleEndian implements LittleEndianConsts { *@param data the byte array *@return the unsigned int (32-bit) value in a long */ - public static long getUInt(final byte[] data) { - return getUInt(data,0); + public static long getUInt(byte[] data) { + return getUInt(data,0); } /** @@ -182,24 +138,16 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@return the long (64-bit) value */ - - public static long getLong(final byte[] data, final int offset) { - return getNumber(data, offset, LONG_SIZE); + public static long getLong(byte[] data, int offset) { + long result = 0; + + for (int j = offset + LONG_SIZE - 1; j >= offset; j--) { + result <<= 8; + result |= 0xff & data[j]; + } + return result; } - - /** - * get a long value from the beginning of a byte array - * - *@param data the byte array - *@return the long (64-bit) value - */ - - public static long getLong(final byte[] data) { - return getLong(data, 0); - } - - /** * get a double value from a byte array, reads it in little endian format * then converts the resulting revolting IEEE 754 (curse them) floating @@ -209,24 +157,10 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@return the double (64-bit) value */ - - public static double getDouble(final byte[] data, final int offset) { - return Double.longBitsToDouble(getNumber(data, offset, DOUBLE_SIZE)); + public static double getDouble(byte[] data, int offset) { + return Double.longBitsToDouble(getLong(data, offset)); } - - /** - * get a double value from the beginning of a byte array - * - *@param data the byte array - *@return the double (64-bit) value - */ - - public static double getDouble(final byte[] data) { - return getDouble(data, 0); - } - - /** * put a short value into a byte array * @@ -234,9 +168,10 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@param value the short (16-bit) value */ - public static void putShort(final byte[] data, final int offset, - final short value) { - putNumber(data, offset, value, SHORT_SIZE); + public static void putShort(byte[] data, int offset, short value) { + int i = offset; + data[i++] = (byte)((value >>> 0) & 0xFF); + data[i++] = (byte)((value >>> 8) & 0xFF); } /** @@ -247,7 +182,7 @@ public final class LittleEndian implements LittleEndianConsts { * Added for consistency with other put~() methods */ public static void putByte(byte[] data, int offset, int value) { - putNumber(data, offset, value, LittleEndianConsts.BYTE_SIZE); + data[offset] = (byte) value; } /** @@ -259,10 +194,10 @@ public final class LittleEndian implements LittleEndianConsts { * * @exception ArrayIndexOutOfBoundsException may be thrown */ - public static void putUShort(final byte[] data, final int offset, - final int value) - { - putNumber(data, offset, value, SHORT_SIZE); + public static void putUShort(byte[] data, int offset, int value) { + int i = offset; + data[i++] = (byte)((value >>> 0) & 0xFF); + data[i++] = (byte)((value >>> 8) & 0xFF); } /** @@ -271,8 +206,7 @@ public final class LittleEndian implements LittleEndianConsts { *@param data the byte array *@param value the short (16-bit) value */ - - public static void putShort(final byte[] data, final short value) { + public static void putShort(byte[] data, short value) { putShort(data, 0, value); } @@ -284,10 +218,12 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@param value the int (32-bit) value */ - - public static void putInt(final byte[] data, final int offset, - final int value) { - putNumber(data, offset, value, INT_SIZE); + public static void putInt(byte[] data, int offset, int value) { + int i = offset; + data[i++] = (byte)((value >>> 0) & 0xFF); + data[i++] = (byte)((value >>> 8) & 0xFF); + data[i++] = (byte)((value >>> 16) & 0xFF); + data[i++] = (byte)((value >>> 24) & 0xFF); } @@ -297,8 +233,7 @@ public final class LittleEndian implements LittleEndianConsts { *@param data the byte array *@param value the int (32-bit) value */ - - public static void putInt(final byte[] data, final int value) { + public static void putInt(byte[] data, int value) { putInt(data, 0, value); } @@ -310,22 +245,14 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@param value the long (64-bit) value */ - - public static void putLong(final byte[] data, final int offset, - final long value) { - putNumber(data, offset, value, LONG_SIZE); - } - - - /** - * put a long value into beginning of a byte array - * - *@param data the byte array - *@param value the long (64-bit) value - */ - - public static void putLong(final byte[] data, final long value) { - putLong(data, 0, value); + public static void putLong(byte[] data, int offset, long value) { + int limit = LONG_SIZE + offset; + long v = value; + + for (int j = offset; j < limit; j++) { + data[j] = (byte) (v & 0xFF); + v >>= 8; + } } @@ -336,26 +263,8 @@ public final class LittleEndian implements LittleEndianConsts { *@param offset a starting offset into the byte array *@param value the double (64-bit) value */ - - public static void putDouble(final byte[] data, final int offset, - final double value) { - // Excel likes NaN to be a specific value. - if (Double.isNaN(value)) - putNumber(data, offset, -276939487313920L, DOUBLE_SIZE); - else - putNumber(data, offset, Double.doubleToLongBits(value), DOUBLE_SIZE); - } - - - /** - * put a double value into beginning of a byte array - * - *@param data the byte array - *@param value the double (64-bit) value - */ - - public static void putDouble(final byte[] data, final double value) { - putDouble(data, 0, value); + public static void putDouble(byte[] data, int offset, double value) { + putLong(data, offset, Double.doubleToLongBits(value)); } @@ -364,7 +273,6 @@ public final class LittleEndian implements LittleEndianConsts { * *@author Marc Johnson (mjohnson at apache dot org) */ - public static final class BufferUnderrunException extends IOException { BufferUnderrunException() { @@ -376,79 +284,72 @@ public final class LittleEndian implements LittleEndianConsts { /** * get a short value from an InputStream * - *@param stream the InputStream from which the short - * is to be read + *@param stream the InputStream from which the short is to be read *@return the short (16-bit) value *@exception IOException will be propagated back to the caller - *@exception BufferUnderrunException if the stream cannot provide enough - * bytes + *@exception BufferUnderrunException if the stream cannot provide enough bytes */ public static short readShort(InputStream stream) throws IOException, BufferUnderrunException { - return (short) readUShort(stream); - } + return (short) readUShort(stream); + } - public static int readUShort(InputStream stream) throws IOException, BufferUnderrunException { + public static int readUShort(InputStream stream) throws IOException, BufferUnderrunException { - int ch1 = stream.read(); - int ch2 = stream.read(); - if ((ch1 | ch2) < 0) { - throw new BufferUnderrunException(); - } - return ((ch2 << 8) + (ch1 << 0)); - } + int ch1 = stream.read(); + int ch2 = stream.read(); + if ((ch1 | ch2) < 0) { + throw new BufferUnderrunException(); + } + return (ch2 << 8) + (ch1 << 0); + } /** * get an int value from an InputStream * - *@param stream the InputStream from which the int is - * to be read - *@return the int (32-bit) value - *@exception IOException will be propagated back to the caller - *@exception BufferUnderrunException if the stream cannot provide enough - * bytes + *@param stream the InputStream from which the int is to be read + * @return the int (32-bit) value + * @exception IOException will be propagated back to the caller + * @exception BufferUnderrunException if the stream cannot provide enough bytes */ - public static int readInt(final InputStream stream) + public static int readInt(InputStream stream) throws IOException, BufferUnderrunException { - int ch1 = stream.read(); - int ch2 = stream.read(); - int ch3 = stream.read(); - int ch4 = stream.read(); - if ((ch1 | ch2 | ch3 | ch4) < 0) { - throw new BufferUnderrunException(); - } - return ((ch4 << 24) + (ch3<<16) + (ch2 << 8) + (ch1 << 0)); + int ch1 = stream.read(); + int ch2 = stream.read(); + int ch3 = stream.read(); + int ch4 = stream.read(); + if ((ch1 | ch2 | ch3 | ch4) < 0) { + throw new BufferUnderrunException(); + } + return (ch4 << 24) + (ch3<<16) + (ch2 << 8) + (ch1 << 0); } /** * get a long value from an InputStream * - *@param stream the InputStream from which the long - * is to be read - *@return the long (64-bit) value - *@exception IOException will be propagated back to the caller - *@exception BufferUnderrunException if the stream cannot provide enough - * bytes + * @param stream the InputStream from which the long is to be read + * @return the long (64-bit) value + * @exception IOException will be propagated back to the caller + * @exception BufferUnderrunException if the stream cannot provide enough bytes */ - - public static long readLong(final InputStream stream) + public static long readLong(InputStream stream) throws IOException, BufferUnderrunException { - int ch1 = stream.read(); - int ch2 = stream.read(); - int ch3 = stream.read(); - int ch4 = stream.read(); - int ch5 = stream.read(); - int ch6 = stream.read(); - int ch7 = stream.read(); - int ch8 = stream.read(); - if ((ch1 | ch2 | ch3 | ch4 | ch5 | ch6 | ch7 | ch8) < 0) { - throw new BufferUnderrunException(); - } - - return - ((long)ch8 << 56) + + int ch1 = stream.read(); + int ch2 = stream.read(); + int ch3 = stream.read(); + int ch4 = stream.read(); + int ch5 = stream.read(); + int ch6 = stream.read(); + int ch7 = stream.read(); + int ch8 = stream.read(); + if ((ch1 | ch2 | ch3 | ch4 | ch5 | ch6 | ch7 | ch8) < 0) { + throw new BufferUnderrunException(); + } + + return + ((long)ch8 << 56) + ((long)ch7 << 48) + ((long)ch6 << 40) + ((long)ch5 << 32) + @@ -458,114 +359,44 @@ public final class LittleEndian implements LittleEndianConsts { (ch1 << 0); } - /** - * Gets the number attribute of the LittleEndian class - * - *@param data Description of the Parameter - *@param offset Description of the Parameter - *@param size Description of the Parameter - *@return The number value - */ - private static long getNumber(final byte[] data, final int offset, - final int size) { - long result = 0; - - for (int j = offset + size - 1; j >= offset; j--) { - result <<= 8; - result |= 0xff & data[j]; - } - return result; - } - - - /** - * Description of the Method - * - *@param data Description of the Parameter - *@param offset Description of the Parameter - *@param value Description of the Parameter - *@param size Description of the Parameter - */ - private static void putNumber(final byte[] data, final int offset, - final long value, final int size) { - int limit = size + offset; - long v = value; - - for (int j = offset; j < limit; j++) { - data[j] = (byte) (v & 0xFF); - v >>= 8; - } - } - - /** * Convert an 'unsigned' byte to an integer. ie, don't carry across the * sign. * - *@param b Description of the Parameter - *@return Description of the Return Value + * @param b Description of the Parameter + * @return Description of the Return Value */ public static int ubyteToInt(byte b) { - return ((b & 0x80) == 0 ? (int) b : (b & (byte) 0x7f) + 0x80); + return b & 0xFF; } /** * get the unsigned value of a byte. * - *@param data the byte array. - *@param offset a starting offset into the byte array. - *@return the unsigned value of the byte as a 32 bit integer + * @param data the byte array. + * @param offset a starting offset into the byte array. + * @return the unsigned value of the byte as a 32 bit integer */ - public static int getUnsignedByte(final byte[] data, final int offset) { - return (int) getNumber(data, offset, BYTE_SIZE); - } - - - /** - * get the unsigned value of a byte. - * - *@param data the byte array - *@return the unsigned value of the byte as a 32 bit integer - */ - public static int getUnsignedByte(final byte[] data) { - return getUnsignedByte(data, 0); + public static int getUnsignedByte(byte[] data, int offset) { + return data[offset] & 0xFF; } /** * Copy a portion of a byte array * - *@param data the original byte array - *@param offset Where to start copying from. - *@param size Number of bytes to copy. - *@return The byteArray value - *@throws IndexOutOfBoundsException - if copying would cause access of + * @param data the original byte array + * @param offset Where to start copying from. + * @param size Number of bytes to copy. + * @return The byteArray value + * @throws IndexOutOfBoundsException - if copying would cause access of * data outside array bounds. */ - public static byte[] getByteArray(final byte[] data, int offset, int size) { + public static byte[] getByteArray(byte[] data, int offset, int size) { byte[] copy = new byte[size]; System.arraycopy(data, offset, copy, 0, size); return copy; } - - /** - *

    Gets an unsigned int value (8 bytes) from a byte array.

    - * - * @param data the byte array - * @param offset a starting offset into the byte array - * @return the unsigned int (32-bit) value in a long - */ - public static long getULong(final byte[] data, final int offset) - { - int num = (int) getNumber(data, offset, LONG_SIZE); - long retNum; - if (num < 0) - retNum = ((long) Integer.MAX_VALUE + 1) * 2 + num; - else - retNum = num; - return retNum; - } - } diff --git a/src/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java b/src/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java new file mode 100644 index 0000000000..7f509396a6 --- /dev/null +++ b/src/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java @@ -0,0 +1,119 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; + +/** + * Adapts a plain byte array to {@link LittleEndianInput} + * + * @author Josh Micich + */ +public final class LittleEndianByteArrayInputStream implements LittleEndianInput { + private final byte[] _buf; + private final int _endIndex; + private int _readIndex; + + public LittleEndianByteArrayInputStream(byte[] buf, int startOffset, int maxReadLen) { + _buf = buf; + _readIndex = startOffset; + _endIndex = startOffset + maxReadLen; + } + public LittleEndianByteArrayInputStream(byte[] buf, int startOffset) { + this(buf, startOffset, buf.length - startOffset); + } + public LittleEndianByteArrayInputStream(byte[] buf) { + this(buf, 0, buf.length); + } + + public int available() { + return _endIndex - _readIndex; + } + private void checkPosition(int i) { + if (i > _endIndex - _readIndex) { + throw new RuntimeException("Buffer overrun"); + } + } + + public int getReadIndex() { + return _readIndex; + } + public byte readByte() { + checkPosition(1); + return _buf[_readIndex++]; + } + + public int readInt() { + checkPosition(4); + int i = _readIndex; + + int b0 = _buf[i++] & 0xFF; + int b1 = _buf[i++] & 0xFF; + int b2 = _buf[i++] & 0xFF; + int b3 = _buf[i++] & 0xFF; + _readIndex = i; + return (b3 << 24) + (b2 << 16) + (b1 << 8) + (b0 << 0); + } + public long readLong() { + checkPosition(8); + int i = _readIndex; + + int b0 = _buf[i++] & 0xFF; + int b1 = _buf[i++] & 0xFF; + int b2 = _buf[i++] & 0xFF; + int b3 = _buf[i++] & 0xFF; + int b4 = _buf[i++] & 0xFF; + int b5 = _buf[i++] & 0xFF; + int b6 = _buf[i++] & 0xFF; + int b7 = _buf[i++] & 0xFF; + _readIndex = i; + return (((long)b7 << 56) + + ((long)b6 << 48) + + ((long)b5 << 40) + + ((long)b4 << 32) + + ((long)b3 << 24) + + (b2 << 16) + + (b1 << 8) + + (b0 << 0)); + } + public short readShort() { + return (short)readUShort(); + } + public int readUByte() { + checkPosition(1); + return _buf[_readIndex++] & 0xFF; + } + public int readUShort() { + checkPosition(2); + int i = _readIndex; + + int b0 = _buf[i++] & 0xFF; + int b1 = _buf[i++] & 0xFF; + _readIndex = i; + return (b1 << 8) + (b0 << 0); + } + public void readFully(byte[] buf, int off, int len) { + checkPosition(len); + System.arraycopy(_buf, _readIndex, buf, off, len); + _readIndex+=len; + } + public void readFully(byte[] buf) { + readFully(buf, 0, buf.length); + } + public double readDouble() { + return Double.longBitsToDouble(readLong()); + } +} diff --git a/src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java b/src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java new file mode 100644 index 0000000000..0320734b2d --- /dev/null +++ b/src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java @@ -0,0 +1,106 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; + + +/** + * Adapts a plain byte array to {@link LittleEndianOutput} + * + * + * @author Josh Micich + */ +public final class LittleEndianByteArrayOutputStream implements LittleEndianOutput, DelayableLittleEndianOutput { + private final byte[] _buf; + private final int _endIndex; + private int _writeIndex; + + public LittleEndianByteArrayOutputStream(byte[] buf, int startOffset, int maxWriteLen) { + if (startOffset < 0 || startOffset > buf.length) { + throw new IllegalArgumentException("Specified startOffset (" + startOffset + + ") is out of allowable range (0.." + buf.length + ")"); + } + _buf = buf; + _writeIndex = startOffset; + _endIndex = startOffset + maxWriteLen; + if (_endIndex < startOffset || _endIndex > buf.length) { + throw new IllegalArgumentException("calculated end index (" + _endIndex + + ") is out of allowable range (" + _writeIndex + ".." + buf.length + ")"); + } + } + public LittleEndianByteArrayOutputStream(byte[] buf, int startOffset) { + this(buf, startOffset, buf.length - startOffset); + } + + private void checkPosition(int i) { + if (i > _endIndex - _writeIndex) { + throw new RuntimeException("Buffer overrun"); + } + } + + public void writeByte(int v) { + checkPosition(1); + _buf[_writeIndex++] = (byte)v; + } + + public void writeDouble(double v) { + writeLong(Double.doubleToLongBits(v)); + } + + public void writeInt(int v) { + checkPosition(4); + int i = _writeIndex; + _buf[i++] = (byte)((v >>> 0) & 0xFF); + _buf[i++] = (byte)((v >>> 8) & 0xFF); + _buf[i++] = (byte)((v >>> 16) & 0xFF); + _buf[i++] = (byte)((v >>> 24) & 0xFF); + _writeIndex = i; + } + + public void writeLong(long v) { + writeInt((int)(v >> 0)); + writeInt((int)(v >> 32)); + } + + public void writeShort(int v) { + checkPosition(2); + int i = _writeIndex; + _buf[i++] = (byte)((v >>> 0) & 0xFF); + _buf[i++] = (byte)((v >>> 8) & 0xFF); + _writeIndex = i; + } + public void write(byte[] b) { + int len = b.length; + checkPosition(len); + System.arraycopy(b, 0, _buf, _writeIndex, len); + _writeIndex += len; + } + public void write(byte[] b, int offset, int len) { + checkPosition(len); + System.arraycopy(b, offset, _buf, _writeIndex, len); + _writeIndex += len; + } + public int getWriteIndex() { + return _writeIndex; + } + public LittleEndianOutput createDelayedOutput(int size) { + checkPosition(size); + LittleEndianOutput result = new LittleEndianByteArrayOutputStream(_buf, _writeIndex, size); + _writeIndex += size; + return result; + } +} diff --git a/src/java/org/apache/poi/util/LittleEndianInput.java b/src/java/org/apache/poi/util/LittleEndianInput.java new file mode 100644 index 0000000000..d8db24797f --- /dev/null +++ b/src/java/org/apache/poi/util/LittleEndianInput.java @@ -0,0 +1,34 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; +/** + * + * @author Josh Micich + */ +public interface LittleEndianInput { + int available(); + byte readByte(); + int readUByte(); + short readShort(); + int readUShort(); + int readInt(); + long readLong(); + double readDouble(); + void readFully(byte[] buf); + void readFully(byte[] buf, int off, int len); +} diff --git a/src/java/org/apache/poi/util/LittleEndianInputStream.java b/src/java/org/apache/poi/util/LittleEndianInputStream.java new file mode 100644 index 0000000000..1a37964a8f --- /dev/null +++ b/src/java/org/apache/poi/util/LittleEndianInputStream.java @@ -0,0 +1,144 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Wraps an {@link InputStream} providing {@link LittleEndianInput}

    + * + * This class does not buffer any input, so the stream read position maintained + * by this class is consistent with that of the inner stream. + * + * @author Josh Micich + */ +public class LittleEndianInputStream extends FilterInputStream implements LittleEndianInput { + public LittleEndianInputStream(InputStream is) { + super(is); + } + public int available() { + try { + return super.available(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + public byte readByte() { + return (byte)readUByte(); + } + public int readUByte() { + int ch; + try { + ch = in.read(); + } catch (IOException e) { + throw new RuntimeException(e); + } + checkEOF(ch); + return ch; + } + public double readDouble() { + return Double.longBitsToDouble(readLong()); + } + public int readInt() { + int ch1; + int ch2; + int ch3; + int ch4; + try { + ch1 = in.read(); + ch2 = in.read(); + ch3 = in.read(); + ch4 = in.read(); + } catch (IOException e) { + throw new RuntimeException(e); + } + checkEOF(ch1 | ch2 | ch3 | ch4); + return (ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0); + } + public long readLong() { + int b0; + int b1; + int b2; + int b3; + int b4; + int b5; + int b6; + int b7; + try { + b0 = in.read(); + b1 = in.read(); + b2 = in.read(); + b3 = in.read(); + b4 = in.read(); + b5 = in.read(); + b6 = in.read(); + b7 = in.read(); + } catch (IOException e) { + throw new RuntimeException(e); + } + checkEOF(b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7); + return (((long)b7 << 56) + + ((long)b6 << 48) + + ((long)b5 << 40) + + ((long)b4 << 32) + + ((long)b3 << 24) + + (b2 << 16) + + (b1 << 8) + + (b0 << 0)); + } + public short readShort() { + return (short)readUShort(); + } + public int readUShort() { + int ch1; + int ch2; + try { + ch1 = in.read(); + ch2 = in.read(); + } catch (IOException e) { + throw new RuntimeException(e); + } + checkEOF(ch1 | ch2); + return (ch2 << 8) + (ch1 << 0); + } + private static void checkEOF(int value) { + if (value <0) { + throw new RuntimeException("Unexpected end-of-file"); + } + } + + public void readFully(byte[] buf) { + readFully(buf, 0, buf.length); + } + + public void readFully(byte[] buf, int off, int len) { + int max = off+len; + for(int i=off; i>> 24) & 0xFF; + int b2 = (v >>> 16) & 0xFF; + int b1 = (v >>> 8) & 0xFF; + int b0 = (v >>> 0) & 0xFF; + try { + out.write(b0); + out.write(b1); + out.write(b2); + out.write(b3); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void writeLong(long v) { + writeInt((int)(v >> 0)); + writeInt((int)(v >> 32)); + } + + public void writeShort(int v) { + int b1 = (v >>> 8) & 0xFF; + int b0 = (v >>> 0) & 0xFF; + try { + out.write(b0); + out.write(b1); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + public void write(byte[] b) { + // suppress IOException for interface method + try { + super.write(b); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + public void write(byte[] b, int off, int len) { + // suppress IOException for interface method + try { + super.write(b, off, len); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/java/org/apache/poi/util/NullLogger.java b/src/java/org/apache/poi/util/NullLogger.java index d58c9789ec..a2cdbf7866 100644 --- a/src/java/org/apache/poi/util/NullLogger.java +++ b/src/java/org/apache/poi/util/NullLogger.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,12 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.util; -import java.util.*; - /** * A logger class that strives to make it as easy as possible for * developers to write log calls, while simultaneously making those @@ -31,14 +27,13 @@ import java.util.*; * @author Glen Stampoultzis (glens at apache.org) * @author Nicola Ken Barozzi (nicolaken at apache.org) */ - public class NullLogger extends POILogger { public void initialize(final String cat) { - //do nothing + //do nothing } - + /** * Log a message * @@ -462,5 +457,5 @@ public class NullLogger extends POILogger //do nothing } -} +} diff --git a/src/java/org/apache/poi/util/POILogFactory.java b/src/java/org/apache/poi/util/POILogFactory.java index a9ce66f36b..3d446c85dd 100644 --- a/src/java/org/apache/poi/util/POILogFactory.java +++ b/src/java/org/apache/poi/util/POILogFactory.java @@ -36,7 +36,7 @@ public class POILogFactory /** * Map of POILogger instances, with classes as keys */ - private static Map _loggers = new HashMap();; + private static Map _loggers = new HashMap();; /** * A common instance of NullLogger, as it does nothing @@ -108,11 +108,12 @@ public class POILogFactory // Fetch the right logger for them, creating // it if that's required if (_loggers.containsKey(cat)) { - logger = ( POILogger ) _loggers.get(cat); + logger = _loggers.get(cat); } else { try { - Class loggerClass = Class.forName(_loggerClassName); - logger = ( POILogger ) loggerClass.newInstance(); + Class loggerClass = + (Class)Class.forName(_loggerClassName); + logger = loggerClass.newInstance(); logger.initialize(cat); } catch(Exception e) { // Give up and use the null logger diff --git a/src/java/org/apache/poi/util/POILogger.java b/src/java/org/apache/poi/util/POILogger.java index 514edf90ca..cf722c4653 100644 --- a/src/java/org/apache/poi/util/POILogger.java +++ b/src/java/org/apache/poi/util/POILogger.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.util; @@ -31,34 +29,32 @@ import java.util.*; * @author Glen Stampoultzis (glens at apache.org) * @author Nicola Ken Barozzi (nicolaken at apache.org) */ +public abstract class POILogger { -public abstract class POILogger -{ - - public static final int DEBUG = 1; - public static final int INFO = 3; - public static final int WARN = 5; - public static final int ERROR = 7; - public static final int FATAL = 9; + public static int DEBUG = 1; + public static int INFO = 3; + public static int WARN = 5; + public static int ERROR = 7; + public static int FATAL = 9; /** * package scope so it cannot be instantiated outside of the util * package. You need a POILogger? Go to the POILogFactory for one - * */ - POILogger() - {} - - abstract public void initialize(final String cat); - + POILogger() { + // no fields to initialise + } + + abstract public void initialize(String cat); + /** * Log a message * * @param level One of DEBUG, INFO, WARN, ERROR, FATAL * @param obj1 The object to log. This is converted to a string. */ - abstract public void log(final int level, final Object obj1); - + abstract public void log(int level, Object obj1); + /** * Log a message * @@ -66,7 +62,7 @@ public abstract class POILogger * @param obj1 The object to log. This is converted to a string. * @param exception An exception to be logged */ - abstract public void log(final int level, final Object obj1, + abstract public void log(int level, Object obj1, final Throwable exception); @@ -75,15 +71,7 @@ public abstract class POILogger * * @param level One of DEBUG, INFO, WARN, ERROR, FATAL */ - abstract public boolean check(final int level); - - /** - * Log a message. Lazily appends Object parameters together. - * - * @param level One of DEBUG, INFO, WARN, ERROR, FATAL - * @param obj1 first object to place in the message - * @param obj2 second object to place in the message - */ + abstract public boolean check(int level); /** * Log a message. Lazily appends Object parameters together. @@ -92,8 +80,7 @@ public abstract class POILogger * @param obj1 first object to place in the message * @param obj2 second object to place in the message */ - - public void log(final int level, final Object obj1, final Object obj2) + public void log(int level, Object obj1, Object obj2) { if (check(level)) { @@ -109,11 +96,10 @@ public abstract class POILogger * @param obj2 second Object to place in the message * @param obj3 third Object to place in the message */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3) + public void log(int level, Object obj1, Object obj2, + Object obj3) { - + if (check(level)) { @@ -132,11 +118,10 @@ public abstract class POILogger * @param obj3 third Object to place in the message * @param obj4 fourth Object to place in the message */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4) + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4) { - + if (check(level)) { @@ -156,11 +141,10 @@ public abstract class POILogger * @param obj4 fourth Object to place in the message * @param obj5 fifth Object to place in the message */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4, final Object obj5) + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4, Object obj5) { - + if (check(level)) { @@ -181,12 +165,11 @@ public abstract class POILogger * @param obj5 fifth Object to place in the message * @param obj6 sixth Object to place in the message */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4, final Object obj5, - final Object obj6) + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4, Object obj5, + Object obj6) { - + if (check(level)) { @@ -208,12 +191,11 @@ public abstract class POILogger * @param obj6 sixth Object to place in the message * @param obj7 seventh Object to place in the message */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4, final Object obj5, - final Object obj6, final Object obj7) + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4, Object obj5, + Object obj6, Object obj7) { - + if (check(level)) { @@ -237,12 +219,11 @@ public abstract class POILogger * @param obj7 seventh Object to place in the message * @param obj8 eighth Object to place in the message */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4, final Object obj5, - final Object obj6, final Object obj7, final Object obj8) + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4, Object obj5, + Object obj6, Object obj7, Object obj8) { - + if (check(level)) { @@ -259,8 +240,7 @@ public abstract class POILogger * @param level One of DEBUG, INFO, WARN, ERROR, FATAL * @param exception An exception to be logged */ - - public void log(final int level, final Throwable exception) + public void log(int level, final Throwable exception) { log(level, null, exception); } @@ -273,11 +253,10 @@ public abstract class POILogger * @param obj2 second Object to place in the message * @param exception An exception to be logged */ - - public void log(final int level, final Object obj1, final Object obj2, + public void log(int level, Object obj1, Object obj2, final Throwable exception) { - + if (check(level)) { @@ -295,11 +274,10 @@ public abstract class POILogger * @param obj3 third object to place in the message * @param exception An error message to be logged */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Throwable exception) + public void log(int level, Object obj1, Object obj2, + Object obj3, final Throwable exception) { - + if (check(level)) { @@ -318,12 +296,11 @@ public abstract class POILogger * @param obj4 fourth object to place in the message * @param exception An exception to be logged */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4, + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4, final Throwable exception) { - + if (check(level)) { @@ -343,12 +320,11 @@ public abstract class POILogger * @param obj5 fifth object to place in the message * @param exception An exception to be logged */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4, final Object obj5, + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4, Object obj5, final Throwable exception) { - + if (check(level)) { @@ -369,12 +345,11 @@ public abstract class POILogger * @param obj6 sixth object to place in the message * @param exception An exception to be logged */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4, final Object obj5, - final Object obj6, final Throwable exception) + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4, Object obj5, + Object obj6, final Throwable exception) { - + if (check(level)) { @@ -397,13 +372,12 @@ public abstract class POILogger * @param obj7 seventh object to place in the message * @param exception An exception to be logged */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4, final Object obj5, - final Object obj6, final Object obj7, + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4, Object obj5, + Object obj6, Object obj7, final Throwable exception) { - + if (check(level)) { @@ -427,13 +401,12 @@ public abstract class POILogger * @param obj8 eighth object to place in the message * @param exception An exception to be logged */ - - public void log(final int level, final Object obj1, final Object obj2, - final Object obj3, final Object obj4, final Object obj5, - final Object obj6, final Object obj7, final Object obj8, + public void log(int level, Object obj1, Object obj2, + Object obj3, Object obj4, Object obj5, + Object obj6, Object obj7, Object obj8, final Throwable exception) { - + if (check(level)) { @@ -467,9 +440,8 @@ public abstract class POILogger * @param message The message to log. * @param obj1 The first object to match against. */ - - public void logFormatted(final int level, final String message, - final Object obj1) + public void logFormatted(int level, String message, + Object obj1) { commonLogFormatted(level, message, new Object[] { @@ -502,9 +474,8 @@ public abstract class POILogger * @param obj1 The first object to match against. * @param obj2 The second object to match against. */ - - public void logFormatted(final int level, final String message, - final Object obj1, final Object obj2) + public void logFormatted(int level, String message, + Object obj1, Object obj2) { commonLogFormatted(level, message, new Object[] { @@ -538,10 +509,9 @@ public abstract class POILogger * @param obj2 The second object to match against. * @param obj3 The third object to match against. */ - - public void logFormatted(final int level, final String message, - final Object obj1, final Object obj2, - final Object obj3) + public void logFormatted(int level, String message, + Object obj1, Object obj2, + Object obj3) { commonLogFormatted(level, message, new Object[] { @@ -576,21 +546,20 @@ public abstract class POILogger * @param obj3 The third object to match against. * @param obj4 The forth object to match against. */ - - public void logFormatted(final int level, final String message, - final Object obj1, final Object obj2, - final Object obj3, final Object obj4) + public void logFormatted(int level, String message, + Object obj1, Object obj2, + Object obj3, Object obj4) { commonLogFormatted(level, message, new Object[] { obj1, obj2, obj3, obj4 }); - } + } - private void commonLogFormatted(final int level, final String message, - final Object [] unflatParams) + private void commonLogFormatted(int level, String message, + Object [] unflatParams) { - + if (check(level)) { @@ -611,21 +580,20 @@ public abstract class POILogger /** * Flattens any contained objects. Only tranverses one level deep. */ - - private Object [] flattenArrays(final Object [] objects) + private Object [] flattenArrays(Object [] objects) { - List results = new ArrayList(); + List results = new ArrayList(); for (int i = 0; i < objects.length; i++) { results.addAll(objectToObjectArray(objects[ i ])); } - return ( Object [] ) results.toArray(new Object[ results.size() ]); + return results.toArray(new Object[ results.size() ]); } - private List objectToObjectArray(Object object) + private List objectToObjectArray(Object object) { - List results = new ArrayList(); + List results = new ArrayList(); if (object instanceof byte []) { @@ -633,7 +601,7 @@ public abstract class POILogger for (int j = 0; j < array.length; j++) { - results.add(new Byte(array[ j ])); + results.add(Byte.valueOf(array[ j ])); } } if (object instanceof char []) @@ -642,7 +610,7 @@ public abstract class POILogger for (int j = 0; j < array.length; j++) { - results.add(new Character(array[ j ])); + results.add(Character.valueOf(array[ j ])); } } else if (object instanceof short []) @@ -651,7 +619,7 @@ public abstract class POILogger for (int j = 0; j < array.length; j++) { - results.add(new Short(array[ j ])); + results.add(Short.valueOf(array[ j ])); } } else if (object instanceof int []) @@ -660,7 +628,7 @@ public abstract class POILogger for (int j = 0; j < array.length; j++) { - results.add(new Integer(array[ j ])); + results.add(Integer.valueOf(array[ j ])); } } else if (object instanceof long []) @@ -669,7 +637,7 @@ public abstract class POILogger for (int j = 0; j < array.length; j++) { - results.add(new Long(array[ j ])); + results.add(Long.valueOf(array[ j ])); } } else if (object instanceof float []) @@ -705,6 +673,4 @@ public abstract class POILogger } return results; } - -} // end package scope abstract class POILogger - +} diff --git a/src/java/org/apache/poi/util/RecordFormatException.java b/src/java/org/apache/poi/util/RecordFormatException.java new file mode 100644 index 0000000000..d1643b8be0 --- /dev/null +++ b/src/java/org/apache/poi/util/RecordFormatException.java @@ -0,0 +1,42 @@ + +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + + +package org.apache.poi.util; + +/** + * A common exception thrown by our binary format parsers + * (especially HSSF and DDF), when they hit invalid + * format or data when processing a record. + */ +public class RecordFormatException + extends RuntimeException +{ + public RecordFormatException(String exception) + { + super(exception); + } + + public RecordFormatException(String exception, Throwable thr) { + super(exception, thr); + } + + public RecordFormatException(Throwable thr) { + super(thr); + } +} diff --git a/src/java/org/apache/poi/util/ShortList.java b/src/java/org/apache/poi/util/ShortList.java index c06a9c714b..3a6cfb8d96 100644 --- a/src/java/org/apache/poi/util/ShortList.java +++ b/src/java/org/apache/poi/util/ShortList.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,12 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.util; -import java.util.*; - /** * A List of short's; as full an implementation of the java.util.List * interface as possible, with an eye toward minimal creation of diff --git a/src/java/org/apache/poi/util/StringUtil.java b/src/java/org/apache/poi/util/StringUtil.java index 957068a673..81568fe9c0 100644 --- a/src/java/org/apache/poi/util/StringUtil.java +++ b/src/java/org/apache/poi/util/StringUtil.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,49 +14,52 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.util; import java.io.UnsupportedEncodingException; import java.text.FieldPosition; import java.text.NumberFormat; -/** - * Title: String Utility Description: Collection of string handling utilities - * - * - *@author Andrew C. Oliver - *@author Sergei Kozello (sergeikozello at mail.ru) - *@author Toshiaki Kamoshida (kamoshida.toshiaki at future dot co dot jp) - *@since May 10, 2002 - *@version 1.0 +import java.util.Iterator; + +import org.apache.poi.hssf.record.RecordInputStream; +/** + * Title: String Utility Description: Collection of string handling utilities

    + * + * Note - none of the methods in this class deals with {@link org.apache.poi.hssf.record.ContinueRecord}s. For such + * functionality, consider using {@link RecordInputStream +} * + * + *@author Andrew C. Oliver + *@author Sergei Kozello (sergeikozello at mail.ru) + *@author Toshiaki Kamoshida (kamoshida.toshiaki at future dot co dot jp) */ public class StringUtil { - private final static String ENCODING = "ISO-8859-1"; - /** - * Constructor for the StringUtil object - */ + private static final String ENCODING_ISO_8859_1 = "ISO-8859-1"; + private StringUtil() { + // no instances of this class } - /** + /** * Given a byte array of 16-bit unicode characters in Little Endian * format (most important byte last), return a Java String representation - * of it. - * - * { 0x16, 0x00 } -0x16 - * + * of it. + * + * { 0x16, 0x00 } -0x16 + * * @param string the byte array to be converted * @param offset the initial offset into the * byte array. it is assumed that string[ offset ] and string[ offset + * 1 ] contain the first 16-bit unicode character * @param len the length of the final string - * @return the converted string + * @return the converted string, never null. * @exception ArrayIndexOutOfBoundsException if offset is out of bounds for - * the byte array (i.e., is negative or is greater than or equal to - * string.length) + * the byte array (i.e., is negative or is greater than or equal to + * string.length) * @exception IllegalArgumentException if len is too large (i.e., - * there is not enough data in string to create a String of that - * length) + * there is not enough data in string to create a String of that + * length) */ public static String getFromUnicodeLE( final byte[] string, @@ -65,7 +67,7 @@ public class StringUtil { final int len) throws ArrayIndexOutOfBoundsException, IllegalArgumentException { if ((offset < 0) || (offset >= string.length)) { - throw new ArrayIndexOutOfBoundsException("Illegal offset"); + throw new ArrayIndexOutOfBoundsException("Illegal offset " + offset + " (String data is of length " + string.length + ")"); } if ((len < 0) || (((string.length - offset) / 2) < len)) { throw new IllegalArgumentException("Illegal length " + len); @@ -74,87 +76,34 @@ public class StringUtil { try { return new String(string, offset, len * 2, "UTF-16LE"); } catch (UnsupportedEncodingException e) { - throw new InternalError(); /*unreachable*/ + throw new RuntimeException(e); } } - /** + /** * Given a byte array of 16-bit unicode characters in little endian * format (most important byte last), return a Java String representation - * of it. - * - * { 0x16, 0x00 } -0x16 - * - *@param string the byte array to be converted - *@return the converted string + * of it. + * + * { 0x16, 0x00 } -0x16 + * + * @param string the byte array to be converted + * @return the converted string, never null */ - public static String getFromUnicodeLE(final byte[] string) { + public static String getFromUnicodeLE(byte[] string) { if(string.length == 0) { return ""; } return getFromUnicodeLE(string, 0, string.length / 2); } - /** - * Given a byte array of 16-bit unicode characters in big endian - * format (most important byte first), return a Java String representation - * of it. - * - * { 0x00, 0x16 } -0x16 - * - *@param string the byte array to be converted - **@param offset the initial offset into the - * byte array. it is assumed that string[ offset ] and string[ offset + - * 1 ] contain the first 16-bit unicode character - *@param len the length of the final string - *@return the converted string - *@exception ArrayIndexOutOfBoundsException if offset is out of bounds for - * the byte array (i.e., is negative or is greater than or equal to - * string.length) - *@exception IllegalArgumentException if len is too large (i.e., - * there is not enough data in string to create a String of that - * length) - */ - public static String getFromUnicodeBE( - final byte[] string, - final int offset, - final int len) - throws ArrayIndexOutOfBoundsException, IllegalArgumentException { - if ((offset < 0) || (offset >= string.length)) { - throw new ArrayIndexOutOfBoundsException("Illegal offset"); - } - if ((len < 0) || (((string.length - offset) / 2) < len)) { - throw new IllegalArgumentException("Illegal length"); - } - try { - return new String(string, offset, len * 2, "UTF-16BE"); - } catch (UnsupportedEncodingException e) { - throw new InternalError(); /*unreachable*/ - } - } - - /** - * Given a byte array of 16-bit unicode characters in big endian - * format (most important byte first), return a Java String representation - * of it. - * - * { 0x00, 0x16 } -0x16 - * - *@param string the byte array to be converted - *@return the converted string - */ - public static String getFromUnicodeBE(final byte[] string) { - if(string.length == 0) { return ""; } - return getFromUnicodeBE(string, 0, string.length / 2); - } - - /** + /** * Read 8 bit data (in ISO-8859-1 codepage) into a (unicode) Java * String and return. * (In Excel terms, read compressed 8 bit unicode as a string) - * - * @param string byte array to read - * @param offset offset to read byte array - * @param len length to read byte array - * @return String generated String instance by reading byte array + * + * @param string byte array to read + * @param offset offset to read byte array + * @param len length to read byte array + * @return String generated String instance by reading byte array */ public static String getFromCompressedUnicode( final byte[] string, @@ -162,83 +111,181 @@ public class StringUtil { final int len) { try { int len_to_use = Math.min(len, string.length - offset); - return new String(string, offset, len_to_use, "ISO-8859-1"); + return new String(string, offset, len_to_use, ENCODING_ISO_8859_1); } catch (UnsupportedEncodingException e) { - throw new InternalError(); /* unreachable */ + throw new RuntimeException(e); + } + } + public static String readCompressedUnicode(LittleEndianInput in, int nChars) { + char[] buf = new char[nChars]; + for (int i = 0; i < buf.length; i++) { + buf[i] = (char) in.readUByte(); + } + return new String(buf); + } + /** + * InputStream in is expected to contain: + *

      + *
    1. ushort nChars
    2. + *
    3. byte is16BitFlag
    4. + *
    5. byte[]/char[] characterData
    6. + *
    + * For this encoding, the is16BitFlag is always present even if nChars==0. + * + * This structure is also known as a XLUnicodeString. + */ + public static String readUnicodeString(LittleEndianInput in) { + + int nChars = in.readUShort(); + byte flag = in.readByte(); + if ((flag & 0x01) == 0) { + return readCompressedUnicode(in, nChars); + } + return readUnicodeLE(in, nChars); + } + /** + * InputStream in is expected to contain: + *
      + *
    1. byte is16BitFlag
    2. + *
    3. byte[]/char[] characterData
    4. + *
    + * For this encoding, the is16BitFlag is always present even if nChars==0. + *
    + * This method should be used when the nChars field is not stored + * as a ushort immediately before the is16BitFlag. Otherwise, {@link + * #readUnicodeString(LittleEndianInput)} can be used. + */ + public static String readUnicodeString(LittleEndianInput in, int nChars) { + byte is16Bit = in.readByte(); + if ((is16Bit & 0x01) == 0) { + return readCompressedUnicode(in, nChars); + } + return readUnicodeLE(in, nChars); + } + /** + * OutputStream out will get: + *
      + *
    1. ushort nChars
    2. + *
    3. byte is16BitFlag
    4. + *
    5. byte[]/char[] characterData
    6. + *
    + * For this encoding, the is16BitFlag is always present even if nChars==0. + */ + public static void writeUnicodeString(LittleEndianOutput out, String value) { + + int nChars = value.length(); + out.writeShort(nChars); + boolean is16Bit = hasMultibyte(value); + out.writeByte(is16Bit ? 0x01 : 0x00); + if (is16Bit) { + putUnicodeLE(value, out); + } else { + putCompressedUnicode(value, out); + } + } + /** + * OutputStream out will get: + *
      + *
    1. byte is16BitFlag
    2. + *
    3. byte[]/char[] characterData
    4. + *
    + * For this encoding, the is16BitFlag is always present even if nChars==0. + *
    + * This method should be used when the nChars field is not stored + * as a ushort immediately before the is16BitFlag. Otherwise, {@link + * #writeUnicodeString(LittleEndianOutput, String)} can be used. + */ + public static void writeUnicodeStringFlagAndData(LittleEndianOutput out, String value) { + boolean is16Bit = hasMultibyte(value); + out.writeByte(is16Bit ? 0x01 : 0x00); + if (is16Bit) { + putUnicodeLE(value, out); + } else { + putCompressedUnicode(value, out); } } - /** - * Takes a unicode (java) string, and returns it as 8 bit data (in ISO-8859-1 + /** + * @return the number of bytes that would be written by {@link #writeUnicodeString(LittleEndianOutput, String)} + */ + public static int getEncodedSize(String value) { + int result = 2 + 1; + result += value.length() * (StringUtil.hasMultibyte(value) ? 2 : 1); + return result; + } + + /** + * Takes a unicode (java) string, and returns it as 8 bit data (in ISO-8859-1 * codepage). * (In Excel terms, write compressed 8 bit unicode) - * - *@param input the String containing the data to be written - *@param output the byte array to which the data is to be written - *@param offset an offset into the byte arrat at which the data is start - * when written + * + * @param input the String containing the data to be written + * @param output the byte array to which the data is to be written + * @param offset an offset into the byte arrat at which the data is start + * when written */ - public static void putCompressedUnicode( - final String input, - final byte[] output, - final int offset) { + public static void putCompressedUnicode(String input, byte[] output, int offset) { + byte[] bytes; try { - byte[] bytes = input.getBytes("ISO-8859-1"); - System.arraycopy(bytes, 0, output, offset, bytes.length); + bytes = input.getBytes(ENCODING_ISO_8859_1); } catch (UnsupportedEncodingException e) { - throw new InternalError(); /*unreachable*/ + throw new RuntimeException(e); } + System.arraycopy(bytes, 0, output, offset, bytes.length); + } + public static void putCompressedUnicode(String input, LittleEndianOutput out) { + byte[] bytes; + try { + bytes = input.getBytes(ENCODING_ISO_8859_1); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + out.write(bytes); } - /** - * Takes a unicode string, and returns it as little endian (most + /** + * Takes a unicode string, and returns it as little endian (most * important byte last) bytes in the supplied byte array. * (In Excel terms, write uncompressed unicode) - * - *@param input the String containing the unicode data to be written - *@param output the byte array to hold the uncompressed unicode, should be twice the length of the String - *@param offset the offset to start writing into the byte array + * + * @param input the String containing the unicode data to be written + * @param output the byte array to hold the uncompressed unicode, should be twice the length of the String + * @param offset the offset to start writing into the byte array */ - public static void putUnicodeLE( - final String input, - final byte[] output, - final int offset) { + public static void putUnicodeLE(String input, byte[] output, int offset) { + byte[] bytes; try { - byte[] bytes = input.getBytes("UTF-16LE"); - System.arraycopy(bytes, 0, output, offset, bytes.length); + bytes = input.getBytes("UTF-16LE"); } catch (UnsupportedEncodingException e) { - throw new InternalError(); /*unreachable*/ + throw new RuntimeException(e); } + System.arraycopy(bytes, 0, output, offset, bytes.length); + } + public static void putUnicodeLE(String input, LittleEndianOutput out) { + byte[] bytes; + try { + bytes = input.getBytes("UTF-16LE"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + out.write(bytes); } - /** - * Takes a unicode string, and returns it as big endian (most - * important byte first) bytes in the supplied byte array. - * (In Excel terms, write uncompressed unicode) - * - *@param input the String containing the unicode data to be written - *@param output the byte array to hold the uncompressed unicode, should be twice the length of the String - *@param offset the offset to start writing into the byte array - */ - public static void putUnicodeBE( - final String input, - final byte[] output, - final int offset) { - try { - byte[] bytes = input.getBytes("UTF-16BE"); - System.arraycopy(bytes, 0, output, offset, bytes.length); - } catch (UnsupportedEncodingException e) { - throw new InternalError(); /*unreachable*/ + public static String readUnicodeLE(LittleEndianInput in, int nChars) { + char[] buf = new char[nChars]; + for (int i = 0; i < buf.length; i++) { + buf[i] = (char) in.readUShort(); } + return new String(buf); } - /** - * Apply printf() like formatting to a string. - * Primarily used for logging. - *@param message the string with embedded formatting info - * eg. "This is a test %2.2" - *@param params array of values to format into the string - *@return The formatted string + /** + * Apply printf() like formatting to a string. + * Primarily used for logging. + * @param message the string with embedded formatting info + * eg. "This is a test %2.2" + * @param params array of values to format into the string + * @return The formatted string */ public static String format(String message, Object[] params) { int currentParamNumber = 0; @@ -307,39 +354,69 @@ public class StringUtil { return 1; } - /** - * @return the encoding we want to use, currently hardcoded to ISO-8859-1 + /** + * @return the encoding we want to use, currently hardcoded to ISO-8859-1 */ public static String getPreferredEncoding() { - return ENCODING; + return ENCODING_ISO_8859_1; } /** * check the parameter has multibyte character * - * @param value string to check - * @return boolean result - * true:string has at least one multibyte character + * @param value string to check + * @return boolean result true:string has at least one multibyte character */ - public static boolean hasMultibyte(String value){ - if( value == null )return false; - for(int i = 0 ; i < value.length() ; i++ ){ - char c = value.charAt(i); - if(c > 0xFF )return true; - } - return false; + public static boolean hasMultibyte(String value) { + if (value == null) + return false; + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + if (c > 0xFF) { + return true; + } + } + return false; } - + /** * Checks to see if a given String needs to be represented as Unicode - * @param value + * + * @param value * @return true if string needs Unicode to be represented. */ - public static boolean isUnicodeString(final String value) { - try { - return !value.equals(new String(value.getBytes("ISO-8859-1"), "ISO-8859-1")); - } catch (UnsupportedEncodingException e) { - return true; - } - } + public static boolean isUnicodeString(final String value) { + try { + return !value.equals(new String(value.getBytes(ENCODING_ISO_8859_1), + ENCODING_ISO_8859_1)); + } catch (UnsupportedEncodingException e) { + return true; + } + } + + /** + * An Iterator over an array of Strings. + */ + public static class StringsIterator implements Iterator { + private String[] strings; + private int position = 0; + public StringsIterator(String[] strings) { + if(strings != null) { + this.strings = strings; + } else { + this.strings = new String[0]; + } + } + + public boolean hasNext() { + return position < strings.length; + } + public String next() { + int ourPos = position++; + if(ourPos >= strings.length) + throw new ArrayIndexOutOfBoundsException(ourPos); + return strings[ourPos]; + } + public void remove() {} + } } diff --git a/src/java/org/apache/poi/util/SystemOutLogger.java b/src/java/org/apache/poi/util/SystemOutLogger.java index af678e186a..bf88036f31 100644 --- a/src/java/org/apache/poi/util/SystemOutLogger.java +++ b/src/java/org/apache/poi/util/SystemOutLogger.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.util; @@ -33,11 +31,11 @@ package org.apache.poi.util; */ public class SystemOutLogger extends POILogger { - private String cat; + private String _cat; public void initialize(final String cat) { - this.cat=cat; + this._cat=cat; } /** @@ -51,7 +49,7 @@ public class SystemOutLogger extends POILogger { log(level, obj1, null); } - + /** * Log a message * @@ -62,7 +60,7 @@ public class SystemOutLogger extends POILogger public void log(final int level, final Object obj1, final Throwable exception) { if (check(level)) { - System.out.println("["+cat+"] "+obj1); + System.out.println("["+_cat+"] "+obj1); if(exception != null) { exception.printStackTrace(System.out); } @@ -88,10 +86,10 @@ public class SystemOutLogger extends POILogger currentLevel = POILogger.DEBUG; } - if (level >= currentLevel) + if (level >= currentLevel) { return true; - else - return false; + } + return false; } diff --git a/src/java/org/apache/poi/util/TempFile.java b/src/java/org/apache/poi/util/TempFile.java index 751847c054..d9489fb8ad 100644 --- a/src/java/org/apache/poi/util/TempFile.java +++ b/src/java/org/apache/poi/util/TempFile.java @@ -14,10 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ + package org.apache.poi.util; import java.io.File; -import java.io.IOException; import java.util.Random; /** @@ -25,20 +25,18 @@ import java.util.Random; * * @author Glen Stampoultzis */ -public class TempFile -{ - static File dir; - static Random rnd = new Random(); +public final class TempFile { + private static File dir; + private static final Random rnd = new Random(); /** * Creates a temporary file. Files are collected into one directory and by default are * deleted on exit from the VM. Files can be kept by defining the system property * poi.keep.tmp.files. *

    - * Dont forget to close all files or it might not be possible to delete them. + * Don't forget to close all files or it might not be possible to delete them. */ - public static File createTempFile(String prefix, String suffix) throws IOException - { + public static File createTempFile(String prefix, String suffix) { if (dir == null) { dir = new File(System.getProperty("java.io.tmpdir"), "poifiles"); @@ -52,7 +50,4 @@ public class TempFile newFile.deleteOnExit(); return newFile; } - - - } diff --git a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java index 217ab7bc88..c024b47eee 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java @@ -76,7 +76,7 @@ public final class HSLFSlideShow extends POIDocument { * that is open. */ protected POIFSFileSystem getPOIFSFileSystem() { - return filesystem; + return directory.getFileSystem(); } /** @@ -467,7 +467,7 @@ public final class HSLFSlideShow extends POIDocument { // If requested, write out any other streams we spot if(preserveNodes) { - copyNodes(filesystem, outFS, writtenEntries); + copyNodes(directory.getFileSystem(), outFS, writtenEntries); } // Send the POIFSFileSystem object out to the underlying stream diff --git a/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java b/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java index f1898c082b..4186071bc8 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java @@ -215,7 +215,7 @@ public class HWPFDocument extends POIDocument DocumentEntry dataProps = (DocumentEntry)directory.getEntry("Data"); _dataStream = new byte[dataProps.getSize()]; - filesystem.createDocumentInputStream("Data").read(_dataStream); + directory.createDocumentInputStream("Data").read(_dataStream); } catch(java.io.FileNotFoundException e) { diff --git a/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java index 520409fcac..8629fa8532 100644 --- a/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java +++ b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java @@ -113,7 +113,7 @@ public class TestPOIDocumentScratchpad extends TestCase { POIFSFileSystem inFS = new POIFSFileSystem(bais); // Check they're still there - doc.filesystem = inFS; + doc.directory = inFS.getRoot(); doc.readProperties(); // Delegate test diff --git a/src/testcases/org/apache/poi/POIDataSamples.java b/src/testcases/org/apache/poi/POIDataSamples.java new file mode 100644 index 0000000000..4bac559382 --- /dev/null +++ b/src/testcases/org/apache/poi/POIDataSamples.java @@ -0,0 +1,245 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi; + +import java.io.*; + +/** + * Centralises logic for finding/opening sample files + */ +public final class POIDataSamples { + + private static POIDataSamples _instSlideshow; + private static POIDataSamples _instSpreadsheet; + private static POIDataSamples _instDocument; + private static POIDataSamples _instDiagram; + private static POIDataSamples _instOpenxml4j; + private static POIDataSamples _instPOIFS; + private static POIDataSamples _instDDF; + private static POIDataSamples _instHPSF; + private static POIDataSamples _instHPBF; + private static POIDataSamples _instHSMF; + + private File _resolvedDataDir; + /** true if standard system propery is not set, + * but the data is available on the test runtime classpath */ + private boolean _sampleDataIsAvaliableOnClassPath; + private String _moduleName; + + /** + * + * @param moduleDir the name of the directory containing the test files + */ + private POIDataSamples(String moduleName){ + _moduleName = moduleName; + initialise(); + } + + public static POIDataSamples getSpreadSheetInstance(){ + if(_instSpreadsheet == null) _instSpreadsheet = new POIDataSamples("HSSF"); + return _instSpreadsheet; + } + + public static POIDataSamples getDocumentInstance(){ + if(_instDocument == null) _instDocument = new POIDataSamples("HWPF"); + return _instDocument; + } + + public static POIDataSamples getSlideShowInstance(){ + if(_instSlideshow == null) _instSlideshow = new POIDataSamples("slideshow"); + return _instSlideshow; + } + + public static POIDataSamples getDiagramInstance(){ + if(_instOpenxml4j == null) _instOpenxml4j = new POIDataSamples("diagram"); + return _instOpenxml4j; + } + + public static POIDataSamples getOpenXML4JInstance(){ + if(_instDiagram == null) _instDiagram = new POIDataSamples("openxml4j"); + return _instDiagram; + } + + public static POIDataSamples getPOIFSInstance(){ + if(_instPOIFS == null) _instPOIFS = new POIDataSamples("POIFS"); + return _instPOIFS; + } + + public static POIDataSamples getDDFInstance(){ + if(_instDDF == null) _instDDF = new POIDataSamples("ddf"); + return _instDDF; + } + + public static POIDataSamples getHPSFInstance(){ + if(_instHPSF == null) _instHPSF = new POIDataSamples("hpsf"); + return _instHPSF; + } + + public static POIDataSamples getPublisherInstance(){ + if(_instHPBF == null) _instHPBF = new POIDataSamples("publisher"); + return _instHPBF; + } + + public static POIDataSamples getHSMFInstance(){ + if(_instHSMF == null) _instHSMF = new POIDataSamples("hsmf"); + return _instHSMF; + } + /** + * Opens a sample file from the test data directory + * + * @param sampleFileName the file to open + * @return an open InputStream for the specified sample file + */ + public InputStream openResourceAsStream(String sampleFileName) { + + if (_sampleDataIsAvaliableOnClassPath) { + InputStream result = sampleFileName == null ? null : + openClasspathResource(sampleFileName); + if(result == null) { + throw new RuntimeException("specified test sample file '" + sampleFileName + + "' not found on the classpath"); + } + // wrap to avoid temp warning method about auto-closing input stream + return new NonSeekableInputStream(result); + } + if (_resolvedDataDir == null) { + throw new RuntimeException("Must set system property for '" + + _moduleName + + "' properly before running tests"); + } + + File f = getFile(sampleFileName); + try { + return new FileInputStream(f); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } + + /** + * + * @param sampleFileName the name of the test file + * @return + * @throws RuntimeException if the file was not found + */ + public File getFile(String sampleFileName) { + File f = new File(_resolvedDataDir, sampleFileName); + if (!f.exists()) { + throw new RuntimeException("Sample file '" + sampleFileName + + "' not found in data dir '" + _resolvedDataDir.getAbsolutePath() + "'"); + } + try { + if(sampleFileName.length() > 0 && !sampleFileName.equals(f.getCanonicalFile().getName())){ + throw new RuntimeException("File name is case-sensitive: requested '" + sampleFileName + + "' but actual file is '" + f.getCanonicalFile().getName() + "'"); + } + } catch (IOException e){ + throw new RuntimeException(e); + } + return f; + } + + private void initialise() { + String TEST_PROPERTY = _moduleName+".testdata.path"; + String dataDirName = System.getProperty(TEST_PROPERTY); + if (dataDirName == null) { + // check to see if we can just get the resources from the classpath + InputStream is = openClasspathResource(""); + if (is != null) { + try { + is.close(); // be nice + } catch (IOException e) { + throw new RuntimeException(e); + } + _sampleDataIsAvaliableOnClassPath = true; + return; + } + + throw new RuntimeException("Must set system property '" + + TEST_PROPERTY + "' before running tests"); + } + File dataDir = new File(dataDirName); + if (!dataDir.exists()) { + throw new RuntimeException("Data dir '" + _moduleName + " does not exist"); + } + // convert to canonical file, to make any subsequent error messages + // clearer. + try { + _resolvedDataDir = dataDir.getCanonicalFile(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Opens a test sample file from the 'data' sub-package of this class's package. + * + * @param sampleFileName the file to open + * @return null if the sample file is not deployed on the classpath. + */ + private InputStream openClasspathResource(String sampleFileName) { + return getClass().getResourceAsStream("/" + sampleFileName); + } + + private static final class NonSeekableInputStream extends InputStream { + + private final InputStream _is; + + public NonSeekableInputStream(InputStream is) { + _is = is; + } + + public int read() throws IOException { + return _is.read(); + } + public int read(byte[] b, int off, int len) throws IOException { + return _is.read(b, off, len); + } + public boolean markSupported() { + return false; + } + public void close() throws IOException { + _is.close(); + } + } + + /** + * @param fileName the file to open + * @return byte array of sample file content from file found in standard hssf test data dir + */ + public byte[] readFile(String fileName) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + try { + InputStream fis = openResourceAsStream(fileName); + + byte[] buf = new byte[512]; + while (true) { + int bytesRead = fis.read(buf); + if (bytesRead < 1) { + break; + } + bos.write(buf, 0, bytesRead); + } + fis.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + return bos.toByteArray(); + } + +} diff --git a/src/testcases/org/apache/poi/TestPOIDocumentMain.java b/src/testcases/org/apache/poi/TestPOIDocumentMain.java index 2e877acf12..ef4d891745 100644 --- a/src/testcases/org/apache/poi/TestPOIDocumentMain.java +++ b/src/testcases/org/apache/poi/TestPOIDocumentMain.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -21,16 +20,18 @@ package org.apache.poi; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; import junit.framework.TestCase; import org.apache.poi.hssf.HSSFTestDataSamples; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * Tests that POIDocument correctly loads and saves the common * (hspf) Document Properties. - * + * * This is part 1 of 2 of the tests - it only does the POIDocuments * which are part of the Main (not scratchpad) * @@ -45,26 +46,26 @@ public final class TestPOIDocumentMain extends TestCase { * Set things up, two spreadsheets for our testing */ public void setUp() { - + doc = HSSFTestDataSamples.openSampleWorkbook("DateFormats.xls"); doc2 = HSSFTestDataSamples.openSampleWorkbook("StringFormulas.xls"); } - - public void testReadProperties() throws Exception { + + public void testReadProperties() { // We should have both sets assertNotNull(doc.getDocumentSummaryInformation()); assertNotNull(doc.getSummaryInformation()); - + // Check they are as expected for the test doc assertEquals("Administrator", doc.getSummaryInformation().getAuthor()); assertEquals(0, doc.getDocumentSummaryInformation().getByteCount()); } - - public void testReadProperties2() throws Exception { + + public void testReadProperties2() { // Check again on the word one assertNotNull(doc2.getDocumentSummaryInformation()); assertNotNull(doc2.getSummaryInformation()); - + assertEquals("Avik Sengupta", doc2.getSummaryInformation().getAuthor()); assertEquals(null, doc2.getSummaryInformation().getKeywords()); assertEquals(0, doc2.getDocumentSummaryInformation().getByteCount()); @@ -75,7 +76,7 @@ public final class TestPOIDocumentMain extends TestCase { POIFSFileSystem outFS = new POIFSFileSystem(); doc.readProperties(); doc.writeProperties(outFS); - + // Should now hold them assertNotNull( outFS.createDocumentInputStream("\005SummaryInformation") @@ -87,22 +88,86 @@ public final class TestPOIDocumentMain extends TestCase { public void testWriteReadProperties() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - + // Write them out POIFSFileSystem outFS = new POIFSFileSystem(); doc.readProperties(); doc.writeProperties(outFS); outFS.writeFilesystem(baos); - + // Create a new version ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); POIFSFileSystem inFS = new POIFSFileSystem(bais); - + // Check they're still there - doc.filesystem = inFS; + doc.directory = inFS.getRoot(); doc.readProperties(); - + // Delegate test testReadProperties(); } + + public void testCreateNewProperties() throws IOException { + POIDocument doc = new HSSFWorkbook(); + + // New document won't have them + assertNull(doc.getSummaryInformation()); + assertNull(doc.getDocumentSummaryInformation()); + + // Add them in + doc.createInformationProperties(); + assertNotNull(doc.getSummaryInformation()); + assertNotNull(doc.getDocumentSummaryInformation()); + + // Write out and back in again, no change + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + doc.write(baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + + doc = new HSSFWorkbook(bais); + + assertNotNull(doc.getSummaryInformation()); + assertNotNull(doc.getDocumentSummaryInformation()); + } + + public void testCreateNewPropertiesOnExistingFile() throws IOException { + POIDocument doc = new HSSFWorkbook(); + + // New document won't have them + assertNull(doc.getSummaryInformation()); + assertNull(doc.getDocumentSummaryInformation()); + + // Write out and back in again, no change + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + doc.write(baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + doc = new HSSFWorkbook(bais); + + assertNull(doc.getSummaryInformation()); + assertNull(doc.getDocumentSummaryInformation()); + + // Create, and change + doc.createInformationProperties(); + doc.getSummaryInformation().setAuthor("POI Testing"); + doc.getDocumentSummaryInformation().setCompany("ASF"); + + // Save and re-load + baos = new ByteArrayOutputStream(); + doc.write(baos); + bais = new ByteArrayInputStream(baos.toByteArray()); + doc = new HSSFWorkbook(bais); + + // Check + assertNotNull(doc.getSummaryInformation()); + assertNotNull(doc.getDocumentSummaryInformation()); + assertEquals("POI Testing", doc.getSummaryInformation().getAuthor()); + assertEquals("ASF", doc.getDocumentSummaryInformation().getCompany()); + + // Asking to re-create will make no difference now + doc.createInformationProperties(); + assertNotNull(doc.getSummaryInformation()); + assertNotNull(doc.getDocumentSummaryInformation()); + assertEquals("POI Testing", doc.getSummaryInformation().getAuthor()); + assertEquals("ASF", doc.getDocumentSummaryInformation().getCompany()); + } } diff --git a/src/testcases/org/apache/poi/poifs/data/BlockSize4096.zvi b/src/testcases/org/apache/poi/poifs/data/BlockSize4096.zvi new file mode 100644 index 0000000000000000000000000000000000000000..6379a042ee99278851b1124c8cbc93db42481dd6 GIT binary patch literal 65536 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 WbiMBD{$JPD`+xoUe_Vgm?f(L>WiU1X literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/poifs/data/Notes.ole2 b/src/testcases/org/apache/poi/poifs/data/Notes.ole2 new file mode 100644 index 0000000000000000000000000000000000000000..9aaed99d3d01f78ce8376deea1f7fdcaa82ac57c GIT binary patch literal 8192 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 bSG&{7)am8wj0$yTg*v0WJF8NC;nx2ET_Vws literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/poifs/data/ReferencesInvalidSectors.mpp b/src/testcases/org/apache/poi/poifs/data/ReferencesInvalidSectors.mpp new file mode 100644 index 0000000000000000000000000000000000000000..583a0a1191fdde279eea96361ee8abe24ad12ac0 GIT binary patch literal 356169 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 literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/poifs/data/protect.xlsx b/src/testcases/org/apache/poi/poifs/data/protect.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1767b14377539d30c5111fd616a612c87867fa9c GIT binary patch literal 12968 zcmeHrWk4Ni((b|CgS)#s0fIw-00Dx#O9<|+!JVMNg9NwW1cyM7;2wfoaM#->JG0;H z%r;b7#CnXfWhbdMgQ+cKpA8Ue4IdJAW6_GKstcjfvo*;!U4hj z9rJ(h4gc)&WE<(j?g0oWU|$6M1rXS(@eiwZfOSj2msg;t0Gk1$KSCrR$RFo{dl5Lw zf8-jl&hk%+|7hP7WCBtG83G8`c4;e@qsAN$06Hpwf8e;i0^<3P`hV-AzwIo*MZY4oANS@6 z+$H#&KTqgD|NSKz{>Ta7_YL`<6o2dEvmcf5N6rE35CHbU=Yii_zjvsp7AO+yOKZ?uWtNq{e^=F)dB{)~2k}72E9DF}|4KM|P z>*)VC`fZ&4bp8MR{R8}4;rB?yMd3%?SI(*Z>H7bzfB$HK>nHqyu@8Pv`91pCK8X3n zZ|uYVc=lKVwQLAf_n&+B1>3^>H}D6J)9CLx`fsj*@BL@`vqvQS^d6cN4`;NY5~fuc z#0eeTGnc5CtFFF=PjQP&_!%dKjCqNYxdHkJM%V023jWejH za)rT0Rm`s@mV0^R)H$ikV)#^fD;3+)06HL`Mo#Tj%Bhgjrz$$~mp&R^Mp_SP0td}g zm0W#fk{(Mm$tv=rj@kUiX521Y7zA1+WjEoDO9!rsJ&LHk^ru!7}!pBmGhIHm6w>R#X5Av%p2LDl2jB z15Q7rAI&(vqQ=l`M^EfQ3a5ue@_JVpD?-PLZIrzFcV2mE!j-Kop$6AH15-K#*+^rd z^z_&?k4>02e%;I>J(mCuM?lY@b#aCuV3eD z$feAZ`?85rkDLX4Jij{p6+*oijdgFhCRgws5`W$bbiCI@OndL!kw?_WQ9(zD%^agl z;nUth?Klx1O|emLEPIdci&-~Ca{8sy1jPhM&nyvJh5bB{V=K@N-m6Hb zjs2*6-=6SLM+;TwU(vtZFDy70p>>87j#!S;m9e#pCTPRL9K8P#4`v2IZVYLSQvxgT z1*eh7lU~N>tq+f%4ct(i%WD?Y;TZ|qxfm5zo%Cw^Xh5)vM44qHX+HmM3YnTW*3mPA z=`jKI))5!N*M2&+R6A91jy8p=$VH$@>A8(Ve!AU|2}xdB8pw#Tn%h`8VQi4B&o4jb zCHKB&`psamOY*qdMlqA&*r?!K0S=Xtz<^1Kg1xp;R&QazIis1sSNrodv(+9#1 zZGIiw^F(~7R5*9lEIySf%KfOZGI`auSV59R#Ktf3795&-qN*J$Sh}d3*JY!_=>C=- z_qM?)_%{IyFxgO9xS4({(yEK}A*bjkr@L|f${68&v?x29)zBF(yoT(#b(NQrF;S;(r(q3+glm-UCKW-&Xz5%nBO+MM#=5LG+TP8eAslo# zgZ;u2)nD7X#)_YFbGm)p$3Jt{(fL#w9s-Ut4sJGnq>G}tZeM)04`0FhlSS4-0ydIq zjs^np8Dp5+Inzf_Gyn0>O$zK(*i-UPA~tv~!|F2?`Dk(RF$Dy@&}fD!Iq|2fqppv& z62_0)`V@(^M&{R++2;)eon7%!O81y*dgN3S?6DX-SI-H!2VTP>f69?!qj8F?Y$41= zxK%=NmonS!E{~wLkKPzoToh?4n@uncmv_q<>X3c(yuL_;Hu5Ia=1! zh2GTm`zLyNX+0@(!+|+jt~QM7 zk+rUmI|Z6xk<~0;W&PZ1G#UKj<|*N-#XWL_6uzO?7uw=p!oe{SIED<^8qiXD-iO43 z%?Z|I%0w4eC;f+N{hMwpR|pyrZ4RZ`AH8nF*xT^fhppMCIL2QxCEe7<`1irrz+F1nHd175Y-S2>0Gtv<)`unF%s0yo8@Y6KzV9D8^{L4?Vjcv{Av zK8q&zs*C&Z9HknLYI79ZSU_dRK4wzQt$VQ(Qx5s=>{!0#L&A1oYd|@loLRv7Gko*LhaNg6#Xi~Rzb(sub;blmsR2WZ`c<^Q zC&P_|;-FQFE7p0AhP6mHdnn%e@U*QXrmqN@3{EcCS=D3OlkEt~D{yUhP1yOfpgU^$ zI0}pSbBWU;Y(xJYxwWS?4Scr<2ucY`gg2UB9Y|c613zlf`K-Qd*f}zHu!yUJ%tIR0 zYsrBl}LU^k^rZZTdfbdiO-<%ULYKizS_>?sz0Hg6I6yiVk=P*d;vJPA9)9&^)t!VpAz%-OK_yfvdIfKE zUenIZa$FF(AJ#-fb8g2>3&%I~{nTj|lQ}6#LR}|gfv5yUn}Ij7|7rsL^qO3$ZS7Y$83XoU6(dc*LgT_cQEpgfWfuC5QK{Czpa$OdD~!^g5v+ZNP1u48SVO<%ayO4udguz zx>1lL=Pd;4*SUsmGmsC6~)?H(LUWR&i5qn2G}SINY0o)-6N&+PHMR+*_JX@Pt> z@VzuY=9;3MM^-?&cLt&2^rJ@<1v*Kal6ey8aG*s;chV`l@LMnM>5w%HXN50OW@5DA zX!E-6*)yCr3W~g$vGm`E>1Z27gcYZ)(E7t16@>hg<9#Xyjoj%-!Ar73pZlNnu@@#h2V?kJPuJyPe(@%T`i~_Pfg}-4MA3aBj0;w`VueX6#$7 zWV8+9rfLo$SCv*;QL-I&jId%usF369_cvN>T+S~Tqb!p3ZU?PgmOyj3%Qh-nscsVl z)F)TWFBTBe<(@HCpEtiIQu);5ZoUp_QlXD+L>3Yhed%bFXA4KCUXy{r?2^aE)x7x4 zQb%6fo_1>=MaI7Pq;Ag^#Cj=h{kVofW*Y~#AOGU;OO3QI8b3_K8h?AOI$>LLny@<) z)U74cw92$hcfBAN4Ze2FF-j1NhgHsRxMND0w5d1ng@Xw94FjXkHYUSg zCiRVdT`03V%suTH)Gu&P6m-9kwl_JF)^CvFpx?*u)%Mu)%$vlDH}jG-g1xh+V_m|D zoqUpQGYSXCSBl1sy*#MAvlb(IRa`@&rWANSQEGuRoq2;r6{-<|ABz{*Sh<*ne!){V zX$ui2Ec#Z$)7G};YfmL9q;^JR=Qjs}!%)A@vjj}tD0+{{IO)^0C7A=!kKZSJ#7tb4 zQjuFO)3gU(DjHRjxxML&#_1x3(0${p18spa?XnO+;H;LnPlf)?O*7N1A-iSQ4dy8# z8FcWV1RwTgooL%PlbPIIrq@^aIj`;`(tU@&N(WY$62E^T`C#$IkvX<}<*wT0&9ez8 z=B86KB=;)PW#%b16Uu5STX2Cn`BxFfrRTXj9z^d@G^KKo2 z%!D!TXJyO>vvs%%(ibMdMReDidSpwgdK64)kTgN76iMn1^JTfacKG7Gq!q^Vg3sv^ zM3)3VOlZ$di8x-tQUHLLH~erjL(xENNen!yw#Sm2U0zGn3zJ3>&eTLNQpI#r@)x{g_O>Wpnk0mT z&Zb1U6;hubd;8M{X25m7d;69d6(%U;a8h{NIYxs*pwYGzN<{}o9MOPJa_=w%Z6VVD zOPc`)Z?r)oALB#RBmK_Y!IZwpmGp+k31v{ae8!&Z^2F!ol!r5+`}|et>}WKn&?8sk zJc8qExBag@U%2Z?DBsmo2{gV+kRqP%Bk-%$(14*-h@_v%OqnE9QqI~6N7%6}V-T<% z`*?16ssD{ht!_nQ_1I1?a=fKp=}s1PnRnKx+RBD1u5`U;j9tjGfoy5|nH{YsE-e=+ z%y2@S6%Fo41~vlf$voNMMEyimuu0q0jR{A&_x3ScS4827oQsC0C3MfoI}&wC=zObf zZ3y~_iyXZI3T&Q3dU-70Db3lH+t*pKTgOPSS^4vI5`3yjjovc>#gT|~beHFBimk~N zUxnk6X-6G0?N5qaXj3=R74#ECsjN9Fm|2ZphktR7mTkY&U6FvteVWdF_2TBr*GwUF zH-#tb`ws7-BJ{+uU0B@YdX16BWEllCgSI0ukZ5Rl3y<@4~y%D%oY|C~0OS zII)>Xt{~gGBU{Z}Z=#m;?=54L!`^N#?v_k0H*wz_ac>R8#|%%H)ZwD4 zCNvk!&Y-<=cx?v#KpK9y`%hjmb*dAZhb9_`Ro$AMeTs}MZ_CqWZ76<~95DfP^~jql zDF9Karzc7eu1z%AGGIHc(2kX)dSCvI8Fd`LzkMT}`co!*)If&l^_Wcy^r7y$NR`^uyASb`?qKV!1 zOIHWGCpM_AO?;ANBOrec(P7?J>~^ph-?lfuF>WzCDMDw4Rq;TOQtW+byJ@&U<69^c zL5qk(bzLkjRWhNOa?LfalXz`$0gE#w7sV|Q;%i{b=u4=!Mr7QPh{xbVb`<+Vn{fsO{?AM9Ji6AWy0hG62#lf|pW(kM0UCnvB?=5~_7}Dfna==($sV%#R$#*WcbD&XaCfe}~^WB57 z!FGx~*BX2K4m@!j(6!1~>*yIep4h)s4~r+-%`MES?fC3ZK{+Oi*Gy?+g=K|};a(66 z4Lc|qow)<&pp{@r9lT~7X!PXyph?N3V81*9yaKWN>T*WG2VFZwXM|LVG?)+~?v#p! zindkJ(#iu;q0kgum4oynk)b4rXC%#20Y!|QfgicI-jj4BPQn^{-n5i;H%(xvWGb|> zKq%+!77g|xg-2z0Uaeqk`}hvJr)4SR6eTF7>S^oT6P`W5QPj;$Lp#oxR?QC;h*XzH z-_aa)AVCIxzSZ>`9Bj>0?nXa8WR2%YHe=P&ml2oA$TQ1+TrQt)Y}M211FL~K=~{A{ z@y?79=_6ssZI;i48rK&iI*5Xg_w}3v@s>El;|V7x%bVC`OE8U!C?kc=&WIJ|C^GV; zf?+w73fcF=-;o4k#c@PO>Ve7Et~6&mioRPsGa`Ar}`6k zP!*Gs!M-PhoyYnskw}H>dmGHeA}SjGFDm`4-do)~tqE>8jj8TmPiyoKLh7)S&@>+G zi?V2$8o>sYR zjEt{@HH3I#zF*%=#{`0RG@qHk5|cms-6Ekz;;3FD}#i)0c zhY&Tq-pgw~X_4LBf(wV{0ZnUde!cK9!!Fuc^U!|0rXLVV7bkdqxz(Xela2TeK~!L; zl)&`Oq5QEdf?Hg5X3Dj3me~`T0wb5UW=9B(66vd1`J5`~c1JvQ?_B5U;E6{KcpPa) z<)z!vPfRwihPLXSY?9~)#h|0yc~xmaXui~g*BmAE@21rb!&ns_91}uVTQ}A(zdgygkc8GPoJTFPqWlH{JqN)_ab(7R8OEAc z^N_#`-5d0xU)eLKR&&Haz5Vb~oV`sjwU1Y}%Wqn2)PZrC^&*qyVX>z?nrW5BeX!)* zj&eV=CoWj|m_*X_9+i5VQCO(cL`SF>43X+&nWNGuA4Aysf0!A(cXz(=Y&Jw>GKYlirQK*eJ@A6`GKZe9ty z$RdfDYpR9+fn?JZ@vc`z@l3rumI=7o2Tm z4nwp(ANu_V&)#y=*oLso8h0YlDf6oWk)0{m|e0+4-r&F}c zdu-c6Rw&;f+E7Qvp(e{_(J~T7lqC{4KFPz%uUOp19xYHhV_Tf-tA`JQ|nA0Kaap68IufHUfdzgU~ zL+eJJr)A~Yn%z)fR-wLA2CY)o#an;Q6+=>y3nF`@d#jXVzdUV|V+;#T&RG%!wQ4u1 z`Nc{Evl|}wBtV8TUo?IHu;;J^4_}tm`qWEix693eANAG>jBj=o>_h zc$EeCrcLML-*k9O+AN)&JEOxXYg!S2kERh6@Z(p%__~;mh@F5H5tQE-FlAT#96!>Tj ze=yaq2~KFyp+T(l+Uy-W1c63Ak7GQ4A};Q^bR^Xi(TL_jKjo5@Z9F(ulh3no^+1!? z(U_`0(r-AG3BMJHAh)M(sZ5_8mi+yGGPs5f<;5I#K+9A7EM3fs<#@3c8hS?bTbZ~I zgYQ)iMy_v&qJ&e;#SF06$o3WOovZ29KD3{gM z;oPS%Gjeieh*!IwtY4a29xt%igSl(N2;1iG?q>Ur8qHKJDvkz{l(&Zyg!HDiT+@L! z#Pk%7vXp7En}R(QjnOVMtfhyFBX4@Sk2R5B*VynYjTluv%lu~|hJI94V)(;Otes*d zBtv2Hp{vr5<2>@pwoPmNun27?21g^tEQhbjjharfobzOK3yVtHdD$JU+qw_6j+ETJ zH&o5YVCVKk*oeRHvMZBNOf=1C7Ytzu2<4LPJnbmyaa_F&e=?lmP5EM^CnRHi(1)SS zvH~|r$zYdwQFUzti=O5cg~L64g+Mecv1`n0`&_<;`ISnsVC2ZD@6_@xyzZAxA*ux1 zr$p6>J)Hj5W^rO4PSZzY(gMAAy7-IGYPdEZLv9sLkg*SA?s)A@N;4zVDMjD)|2iMs zTm~QQQT@a&2gANF8St(p6LI@{*K3Pwjfp*39#glaT!%`oa@Q=l_t$E!`)HYwsy&9+ zB7uSA%Il3xN*uFj0h4c6$~h1uKpF@aX!RaqGsDUPNiLVG$m;u?x(A=^TPV}w09QgS gPmvKrYFfYV+wXO<92fhTs@@&dVVFYl{klK@AGEeGVgLXD literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/poifs/eventfilesystem/TestPOIFSReaderRegistry.java b/src/testcases/org/apache/poi/poifs/eventfilesystem/TestPOIFSReaderRegistry.java index c0453918a9..858032ebbd 100644 --- a/src/testcases/org/apache/poi/poifs/eventfilesystem/TestPOIFSReaderRegistry.java +++ b/src/testcases/org/apache/poi/poifs/eventfilesystem/TestPOIFSReaderRegistry.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,13 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.eventfilesystem; -import junit.framework.*; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; -import java.util.*; +import junit.framework.TestCase; import org.apache.poi.poifs.filesystem.POIFSDocumentPath; @@ -30,10 +30,7 @@ import org.apache.poi.poifs.filesystem.POIFSDocumentPath; * * @author Marc Johnson */ - -public class TestPOIFSReaderRegistry - extends TestCase -{ +public final class TestPOIFSReaderRegistry extends TestCase { private POIFSReaderListener[] listeners = { new Listener(), new Listener(), new Listener(), new Listener() @@ -56,23 +53,10 @@ public class TestPOIFSReaderRegistry "a0", "a1", "a2", "a3" }; - /** - * Constructor TestPOIFSReaderRegistry - * - * @param name - */ - - public TestPOIFSReaderRegistry(String name) - { - super(name); - } - /** * Test empty registry */ - - public void testEmptyRegistry() - { + public void testEmptyRegistry() { POIFSReaderRegistry registry = new POIFSReaderRegistry(); for (int j = 0; j < paths.length; j++) @@ -90,9 +74,7 @@ public class TestPOIFSReaderRegistry /** * Test mixed registration operations */ - - public void testMixedRegistrationOperations() - { + public void testMixedRegistrationOperations() { POIFSReaderRegistry registry = new POIFSReaderRegistry(); for (int j = 0; j < listeners.length; j++) @@ -172,17 +154,4 @@ public class TestPOIFSReaderRegistry } } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.eventfilesystem.POIFSReaderRegistry"); - junit.textui.TestRunner.run(TestPOIFSReaderRegistry.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/AllPOIFSFileSystemTests.java b/src/testcases/org/apache/poi/poifs/filesystem/AllPOIFSFileSystemTests.java index 2a0319afee..bc46e17c9a 100755 --- a/src/testcases/org/apache/poi/poifs/filesystem/AllPOIFSFileSystemTests.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/AllPOIFSFileSystemTests.java @@ -22,7 +22,7 @@ import junit.framework.TestSuite; /** * Tests for org.apache.poi.poifs.filesystem
    - * + * * @author Josh Micich */ public final class AllPOIFSFileSystemTests { @@ -38,7 +38,10 @@ public final class AllPOIFSFileSystemTests { result.addTestSuite(TestEmptyDocument.class); result.addTestSuite(TestOffice2007XMLException.class); result.addTestSuite(TestPOIFSDocumentPath.class); + result.addTestSuite(TestPOIFSFileSystem.class); + result.addTestSuite(TestNPOIFSFileSystem.class); result.addTestSuite(TestPropertySorter.class); + result.addTestSuite(TestOle10Native.class); return result; } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDirectoryNode.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDirectoryNode.java index 8af60334ce..78e6bee9c1 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDirectoryNode.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDirectoryNode.java @@ -15,7 +15,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; @@ -33,31 +32,12 @@ import org.apache.poi.poifs.property.DocumentProperty; * * @author Marc Johnson */ - -public class TestDirectoryNode - extends TestCase -{ - - /** - * Constructor TestDirectoryNode - * - * @param name - */ - - public TestDirectoryNode(String name) - { - super(name); - } +public final class TestDirectoryNode extends TestCase { /** * test trivial constructor (a DirectoryNode with no children) - * - * @exception IOException */ - - public void testEmptyConstructor() - throws IOException - { + public void testEmptyConstructor() { POIFSFileSystem fs = new POIFSFileSystem(); DirectoryProperty property1 = new DirectoryProperty("parent"); DirectoryProperty property2 = new DirectoryProperty("child"); @@ -113,13 +93,8 @@ public class TestDirectoryNode /** * test non-trivial constructor (a DirectoryNode with children) - * - * @exception IOException */ - - public void testNonEmptyConstructor() - throws IOException - { + public void testNonEmptyConstructor() throws IOException { DirectoryProperty property1 = new DirectoryProperty("parent"); DirectoryProperty property2 = new DirectoryProperty("child1"); @@ -177,49 +152,49 @@ public class TestDirectoryNode /** * test deletion methods - * - * @exception IOException */ - - public void testDeletion() - throws IOException - { + public void testDeletion() throws IOException { POIFSFileSystem fs = new POIFSFileSystem(); DirectoryEntry root = fs.getRoot(); // verify cannot delete the root directory - assertTrue(!root.delete()); + assertFalse(root.delete()); + assertTrue(root.isEmpty()); + DirectoryEntry dir = fs.createDirectory("myDir"); - assertTrue(!root.isEmpty()); + assertFalse(root.isEmpty()); + assertTrue(dir.isEmpty()); // verify can delete empty directory + assertFalse(root.delete()); assertTrue(dir.delete()); + + // Now look at a non-empty one dir = fs.createDirectory("NextDir"); DocumentEntry doc = dir.createDocument("foo", new ByteArrayInputStream(new byte[ 1 ])); - assertTrue(!dir.isEmpty()); + assertFalse(root.isEmpty()); + assertFalse(dir.isEmpty()); - // verify cannot delete empty directory - assertTrue(!dir.delete()); + // verify cannot delete non-empty directory + assertFalse(dir.delete()); + + // but we can delete it if we remove the document assertTrue(doc.delete()); - - // verify now we can delete it + assertTrue(dir.isEmpty()); assertTrue(dir.delete()); + + // It's really gone! assertTrue(root.isEmpty()); } /** * test change name methods - * - * @exception IOException */ - - public void testRename() - throws IOException - { + public void testRename() throws IOException { POIFSFileSystem fs = new POIFSFileSystem(); DirectoryEntry root = fs.getRoot(); @@ -237,17 +212,4 @@ public class TestDirectoryNode assertTrue(dir2.renameTo("foo")); assertEquals("foo", dir2.getName()); } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.filesystem.DirectoryNode"); - junit.textui.TestRunner.run(TestDirectoryNode.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDocument.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDocument.java index 82dabc7465..e216ed9a88 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDocument.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDocument.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,18 +14,15 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; -import java.util.*; +import junit.framework.TestCase; -import junit.framework.*; - -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.LittleEndianConsts; import org.apache.poi.poifs.property.DocumentProperty; import org.apache.poi.poifs.storage.RawDataBlock; import org.apache.poi.poifs.storage.SmallDocumentBlock; @@ -36,31 +32,12 @@ import org.apache.poi.poifs.storage.SmallDocumentBlock; * * @author Marc Johnson */ - -public class TestDocument - extends TestCase -{ - - /** - * Constructor TestDocument - * - * @param name - */ - - public TestDocument(String name) - { - super(name); - } +public final class TestDocument extends TestCase { /** * Integration test -- really about all we can do - * - * @exception IOException */ - - public void testPOIFSDocument() - throws IOException - { + public void testPOIFSDocument() throws IOException { // verify correct number of blocks get created for document // that is exact multituple of block size @@ -158,10 +135,8 @@ public class TestDocument } } - private POIFSDocument makeCopy(POIFSDocument document, byte [] input, - byte [] data) - throws IOException - { + private static POIFSDocument makeCopy(POIFSDocument document, byte[] input, byte[] data) + throws IOException { POIFSDocument copy = null; if (input.length >= 4096) @@ -194,10 +169,8 @@ public class TestDocument return copy; } - private void checkDocument(final POIFSDocument document, - final byte [] input) - throws IOException - { + private static void checkDocument(final POIFSDocument document, final byte[] input) + throws IOException { int big_blocks = 0; int small_blocks = 0; int total_output = 0; @@ -221,11 +194,8 @@ public class TestDocument input)), input); } - private byte [] checkValues(int big_blocks, int small_blocks, - int total_output, POIFSDocument document, - byte [] input) - throws IOException - { + private static byte[] checkValues(int big_blocks, int small_blocks, int total_output, + POIFSDocument document, byte[] input) throws IOException { assertEquals(document, document.getDocumentProperty().getDocument()); int increment = ( int ) Math.sqrt(input.length); @@ -267,17 +237,4 @@ public class TestDocument } return output; } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.filesystem.POIFSDocument"); - junit.textui.TestRunner.run(TestDocument.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentDescriptor.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentDescriptor.java index 7272e4223c..9b69b1a2cb 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentDescriptor.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentDescriptor.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,53 +14,30 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; -import junit.framework.*; +import junit.framework.TestCase; /** * Class to test DocumentDescriptor functionality * * @author Marc Johnson */ - -public class TestDocumentDescriptor - extends TestCase -{ - - /** - * Constructor TestDocumentDescriptor - * - * @param name - */ - - public TestDocumentDescriptor(String name) - { - super(name); - } +public final class TestDocumentDescriptor extends TestCase { /** * test equality */ - - public void testEquality() - { - String[] names = - { - "c1", "c2", "c3", "c4", "c5" - }; + public void testEquality() { + String[] names = { "c1", "c2", "c3", "c4", "c5" }; POIFSDocumentPath a1 = new POIFSDocumentPath(); POIFSDocumentPath a2 = new POIFSDocumentPath(null); POIFSDocumentPath a3 = new POIFSDocumentPath(new String[ 0 ]); POIFSDocumentPath a4 = new POIFSDocumentPath(a1, null); POIFSDocumentPath a5 = new POIFSDocumentPath(a1, new String[ 0 ]); - POIFSDocumentPath[] paths = - { - a1, a2, a3, a4, a5 - }; + POIFSDocumentPath[] paths = { a1, a2, a3, a4, a5 }; for (int j = 0; j < paths.length; j++) { @@ -196,17 +172,4 @@ public class TestDocumentDescriptor } } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.eventfilesystem.DocumentDescriptor"); - junit.textui.TestRunner.run(TestDocumentDescriptor.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java index b42f7ef71a..0b1b6b096a 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,18 +14,16 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Arrays; -import java.util.*; - -import junit.framework.*; +import junit.framework.TestCase; import org.apache.poi.poifs.property.DirectoryProperty; -import org.apache.poi.poifs.property.DocumentProperty; import org.apache.poi.poifs.storage.RawDataBlock; /** @@ -35,22 +32,9 @@ import org.apache.poi.poifs.storage.RawDataBlock; * @author Marc Johnson */ -public class TestDocumentInputStream - extends TestCase -{ +public final class TestDocumentInputStream extends TestCase { - /** - * Constructor TestDocumentInputStream - * - * @param name - * - * @exception IOException - */ - - public TestDocumentInputStream(String name) - throws IOException - { - super(name); + protected void setUp() throws Exception { int blocks = (_workbook_size + 511) / 512; _workbook_data = new byte[ 512 * blocks ]; @@ -73,7 +57,7 @@ public class TestDocumentInputStream _workbook = new DocumentNode( document.getDocumentProperty(), new DirectoryNode( - new DirectoryProperty("Root Entry"), null, null)); + new DirectoryProperty("Root Entry"), (POIFSFileSystem)null, null)); } private DocumentNode _workbook; @@ -86,13 +70,8 @@ public class TestDocumentInputStream /** * test constructor - * - * @exception IOException */ - - public void testConstructor() - throws IOException - { + public void testConstructor() throws IOException { DocumentInputStream stream = new DocumentInputStream(_workbook); assertEquals(_workbook_size, stream.available()); @@ -100,13 +79,8 @@ public class TestDocumentInputStream /** * test available() behavior - * - * @exception IOException */ - - public void testAvailable() - throws IOException - { + public void testAvailable() throws IOException { DocumentInputStream stream = new DocumentInputStream(_workbook); assertEquals(_workbook_size, stream.available()); @@ -115,9 +89,7 @@ public class TestDocumentInputStream { stream.available(); fail("Should have caught IOException"); - } - catch (IOException ignored) - { + } catch (IllegalStateException ignored) { // as expected } @@ -125,13 +97,8 @@ public class TestDocumentInputStream /** * test mark/reset/markSupported. - * - * @exception IOException */ - - public void testMarkFunctions() - throws IOException - { + public void testMarkFunctions() throws IOException { DocumentInputStream stream = new DocumentInputStream(_workbook); byte[] buffer = new byte[ _workbook_size / 5 ]; @@ -169,13 +136,8 @@ public class TestDocumentInputStream /** * test simple read method - * - * @exception IOException */ - - public void testReadSingleByte() - throws IOException - { + public void testReadSingleByte() throws IOException { DocumentInputStream stream = new DocumentInputStream(_workbook); int remaining = _workbook_size; @@ -205,13 +167,8 @@ public class TestDocumentInputStream /** * Test buffered read - * - * @exception IOException */ - - public void testBufferRead() - throws IOException - { + public void testBufferRead() throws IOException { DocumentInputStream stream = new DocumentInputStream(_workbook); try @@ -275,23 +232,14 @@ public class TestDocumentInputStream /** * Test complex buffered read - * - * @exception IOException */ - - public void testComplexBufferRead() - throws IOException - { + public void testComplexBufferRead() throws IOException { DocumentInputStream stream = new DocumentInputStream(_workbook); - try - { + try { stream.read(null, 0, 1); fail("Should have caught NullPointerException"); - } - catch (NullPointerException ignored) - { - + } catch (IllegalArgumentException ignored) { // as expected } @@ -391,13 +339,8 @@ public class TestDocumentInputStream /** * test skip - * - * @exception IOException */ - - public void testSkip() - throws IOException - { + public void testSkip() throws IOException { DocumentInputStream stream = new DocumentInputStream(_workbook); assertEquals(_workbook_size, stream.available()); @@ -422,17 +365,4 @@ public class TestDocumentInputStream stream.skip(2 + ( long ) Integer.MAX_VALUE)); assertEquals(0, stream.available()); } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.filesystem.DocumentInputStream"); - junit.textui.TestRunner.run(TestDocumentInputStream.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentNode.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentNode.java index 211c300898..6101494a07 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentNode.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentNode.java @@ -15,7 +15,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; @@ -32,31 +31,12 @@ import org.apache.poi.poifs.storage.RawDataBlock; * * @author Marc Johnson */ - -public class TestDocumentNode - extends TestCase -{ - - /** - * Constructor TestDocumentNode - * - * @param name - */ - - public TestDocumentNode(String name) - { - super(name); - } +public final class TestDocumentNode extends TestCase { /** * test constructor - * - * @exception IOException */ - - public void testConstructor() - throws IOException - { + public void testConstructor() throws IOException { DirectoryProperty property1 = new DirectoryProperty("directory"); RawDataBlock[] rawBlocks = new RawDataBlock[ 4 ]; ByteArrayInputStream stream = @@ -69,7 +49,7 @@ public class TestDocumentNode POIFSDocument document = new POIFSDocument("document", rawBlocks, 2000); DocumentProperty property2 = document.getDocumentProperty(); - DirectoryNode parent = new DirectoryNode(property1, null, null); + DirectoryNode parent = new DirectoryNode(property1, (POIFSFileSystem)null, null); DocumentNode node = new DocumentNode(property2, parent); // verify we can retrieve the document @@ -90,17 +70,4 @@ public class TestDocumentNode // verify getParent behaves correctly assertEquals(parent, node.getParent()); } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.filesystem.DocumentNode"); - junit.textui.TestRunner.run(TestDocumentNode.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentOutputStream.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentOutputStream.java index 7fa9471aa4..4218367d27 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentOutputStream.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentOutputStream.java @@ -15,53 +15,26 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; -import java.util.*; - -import junit.framework.*; - -import org.apache.poi.poifs.property.DirectoryProperty; -import org.apache.poi.poifs.property.DocumentProperty; -import org.apache.poi.poifs.storage.RawDataBlock; +import junit.framework.TestCase; /** * Class to test DocumentOutputStream functionality * * @author Marc Johnson */ - -public class TestDocumentOutputStream - extends TestCase -{ - - /** - * Constructor TestDocumentOutputStream - * - * @param name - * - * @exception IOException - */ - - public TestDocumentOutputStream(String name) - throws IOException - { - super(name); - } +public final class TestDocumentOutputStream extends TestCase { /** * test write(int) behavior - * - * @exception IOException */ - - public void testWrite1() - throws IOException - { + public void testWrite1() throws IOException { ByteArrayOutputStream stream = new ByteArrayOutputStream(); DocumentOutputStream dstream = new DocumentOutputStream(stream, 25); @@ -89,13 +62,8 @@ public class TestDocumentOutputStream /** * test write(byte[]) behavior - * - * @exception IOException */ - - public void testWrite2() - throws IOException - { + public void testWrite2() throws IOException { ByteArrayOutputStream stream = new ByteArrayOutputStream(); DocumentOutputStream dstream = new DocumentOutputStream(stream, 25); @@ -133,13 +101,8 @@ public class TestDocumentOutputStream /** * test write(byte[], int, int) behavior - * - * @exception IOException */ - - public void testWrite3() - throws IOException - { + public void testWrite3() throws IOException { ByteArrayOutputStream stream = new ByteArrayOutputStream(); DocumentOutputStream dstream = new DocumentOutputStream(stream, 25); byte[] array = new byte[ 50 ]; @@ -169,13 +132,8 @@ public class TestDocumentOutputStream /** * test writeFiller() - * - * @exception IOException */ - - public void testWriteFiller() - throws IOException - { + public void testWriteFiller() throws IOException { ByteArrayOutputStream stream = new ByteArrayOutputStream(); DocumentOutputStream dstream = new DocumentOutputStream(stream, 25); @@ -205,17 +163,4 @@ public class TestDocumentOutputStream } stream.close(); } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.filesystem.DocumentOutputStream"); - junit.textui.TestRunner.run(TestDocumentOutputStream.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestEmptyDocument.java b/src/testcases/org/apache/poi/poifs/filesystem/TestEmptyDocument.java index 870d752522..36886af982 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestEmptyDocument.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestEmptyDocument.java @@ -30,143 +30,88 @@ import org.apache.poi.poifs.filesystem.POIFSWriterEvent; import org.apache.poi.poifs.filesystem.POIFSWriterListener; import org.apache.poi.poifs.filesystem.DirectoryEntry; -public class TestEmptyDocument extends TestCase { +public final class TestEmptyDocument extends TestCase { - public static void main(String[] args) { - TestEmptyDocument driver = new TestEmptyDocument(); + public void testSingleEmptyDocument() throws IOException { + POIFSFileSystem fs = new POIFSFileSystem(); + DirectoryEntry dir = fs.getRoot(); + dir.createDocument("Foo", new ByteArrayInputStream(new byte[] {})); - System.out.println(); - System.out.println("As only file..."); - System.out.println(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + fs.writeFilesystem(out); + new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); + } - System.out.print("Trying using createDocument(String,InputStream): "); - try { - driver.testSingleEmptyDocument(); - System.out.println("Worked!"); - } catch (IOException exception) { - System.out.println("failed! "); - System.out.println(exception.toString()); - } - System.out.println(); + public void testSingleEmptyDocumentEvent() throws IOException { + POIFSFileSystem fs = new POIFSFileSystem(); + DirectoryEntry dir = fs.getRoot(); + dir.createDocument("Foo", 0, new POIFSWriterListener() { + public void processPOIFSWriterEvent(POIFSWriterEvent event) { + System.out.println("written"); + } + }); - System.out.print - ("Trying using createDocument(String,int,POIFSWriterListener): "); - try { - driver.testSingleEmptyDocumentEvent(); - System.out.println("Worked!"); - } catch (IOException exception) { - System.out.println("failed!"); - System.out.println(exception.toString()); - } - System.out.println(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + fs.writeFilesystem(out); + new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); + } - System.out.println(); - System.out.println("After another file..."); - System.out.println(); + public void testEmptyDocumentWithFriend() throws IOException { + POIFSFileSystem fs = new POIFSFileSystem(); + DirectoryEntry dir = fs.getRoot(); + dir.createDocument("Bar", new ByteArrayInputStream(new byte[] { 0 })); + dir.createDocument("Foo", new ByteArrayInputStream(new byte[] {})); - System.out.print("Trying using createDocument(String,InputStream): "); - try { - driver.testEmptyDocumentWithFriend(); - System.out.println("Worked!"); - } catch (IOException exception) { - System.out.println("failed! "); - System.out.println(exception.toString()); - } - System.out.println(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + fs.writeFilesystem(out); + new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); + } - System.out.print - ("Trying using createDocument(String,int,POIFSWriterListener): "); - try { - driver.testEmptyDocumentWithFriend(); - System.out.println("Worked!"); - } catch (IOException exception) { - System.out.println("failed!"); - System.out.println(exception.toString()); - } - System.out.println(); - } + public void testEmptyDocumentEventWithFriend() throws IOException { + POIFSFileSystem fs = new POIFSFileSystem(); + DirectoryEntry dir = fs.getRoot(); + dir.createDocument("Bar", 1, new POIFSWriterListener() { + public void processPOIFSWriterEvent(POIFSWriterEvent event) { + try { + event.getStream().write(0); + } catch (IOException exception) { + throw new RuntimeException("exception on write: " + exception); + } + } + }); + dir.createDocument("Foo", 0, new POIFSWriterListener() { + public void processPOIFSWriterEvent(POIFSWriterEvent event) { + } + }); - public void testSingleEmptyDocument() throws IOException { - POIFSFileSystem fs = new POIFSFileSystem(); - DirectoryEntry dir = fs.getRoot(); - dir.createDocument("Foo", new ByteArrayInputStream(new byte[] { })); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - fs.writeFilesystem(out); - new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); - } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + fs.writeFilesystem(out); + new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); + } - public void testSingleEmptyDocumentEvent() throws IOException { - POIFSFileSystem fs = new POIFSFileSystem(); - DirectoryEntry dir = fs.getRoot(); - dir.createDocument("Foo", 0, new POIFSWriterListener() { - public void processPOIFSWriterEvent(POIFSWriterEvent event) { - System.out.println("written"); - } - }); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - fs.writeFilesystem(out); - new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); - } + public void testEmptyDocumentBug11744() throws Exception { + byte[] testData = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - public void testEmptyDocumentWithFriend() throws IOException { - POIFSFileSystem fs = new POIFSFileSystem(); - DirectoryEntry dir = fs.getRoot(); - dir.createDocument("Bar", new ByteArrayInputStream(new byte[] { 0 })); - dir.createDocument("Foo", new ByteArrayInputStream(new byte[] { })); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - fs.writeFilesystem(out); - new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); - } + POIFSFileSystem fs = new POIFSFileSystem(); + fs.createDocument(new ByteArrayInputStream(new byte[0]), "Empty"); + fs.createDocument(new ByteArrayInputStream(testData), "NotEmpty"); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + fs.writeFilesystem(out); + out.toByteArray(); - public void testEmptyDocumentEventWithFriend() throws IOException { - POIFSFileSystem fs = new POIFSFileSystem(); - DirectoryEntry dir = fs.getRoot(); - dir.createDocument("Bar", 1, new POIFSWriterListener() { - public void processPOIFSWriterEvent(POIFSWriterEvent event) { - try { - event.getStream().write(0); - } catch (IOException exception) { - throw new RuntimeException("exception on write: " + exception); - } - } - }); - dir.createDocument("Foo", 0, new POIFSWriterListener() { - public void processPOIFSWriterEvent(POIFSWriterEvent event) { - } - }); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - fs.writeFilesystem(out); - new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); - } + // This line caused the error. + fs = new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); - public void testEmptyDocumentBug11744() throws Exception { - byte[] testData = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + DocumentEntry entry = (DocumentEntry) fs.getRoot().getEntry("Empty"); + assertEquals("Expected zero size", 0, entry.getSize()); + byte[] actualReadbackData; + actualReadbackData = IOUtils.toByteArray(new DocumentInputStream(entry)); + assertEquals("Expected zero read from stream", 0, actualReadbackData.length); - POIFSFileSystem fs = new POIFSFileSystem(); - fs.createDocument(new ByteArrayInputStream(new byte[0]), "Empty"); - fs.createDocument(new ByteArrayInputStream(testData), "NotEmpty"); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - fs.writeFilesystem(out); - out.toByteArray(); - - // This line caused the error. - fs = new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray())); - - DocumentEntry entry = (DocumentEntry) fs.getRoot().getEntry("Empty"); - assertEquals("Expected zero size", 0, entry.getSize()); - byte[] actualReadbackData; - actualReadbackData = IOUtils.toByteArray(new DocumentInputStream(entry)); - assertEquals("Expected zero read from stream", 0, - actualReadbackData.length); - - entry = (DocumentEntry) fs.getRoot().getEntry("NotEmpty"); - actualReadbackData = IOUtils.toByteArray(new DocumentInputStream(entry)); - assertEquals("Expected size was wrong", testData.length, entry.getSize()); - assertTrue("Expected different data read from stream", - Arrays.equals(testData, actualReadbackData)); - } + entry = (DocumentEntry) fs.getRoot().getEntry("NotEmpty"); + actualReadbackData = IOUtils.toByteArray(new DocumentInputStream(entry)); + assertEquals("Expected size was wrong", testData.length, entry.getSize()); + assertTrue("Expected different data read from stream", Arrays.equals(testData, + actualReadbackData)); + } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java b/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java new file mode 100644 index 0000000000..a375be1665 --- /dev/null +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java @@ -0,0 +1,475 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.filesystem; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +import junit.framework.TestCase; + +import org.apache.poi.POIDataSamples; +import org.apache.poi.hpsf.PropertySet; +import org.apache.poi.hpsf.PropertySetFactory; +import org.apache.poi.hpsf.SummaryInformation; +import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.property.NPropertyTable; +import org.apache.poi.poifs.property.Property; +import org.apache.poi.poifs.property.RootProperty; + +/** + * Tests for the new NIO POIFSFileSystem implementation + */ +public final class TestNPOIFSFileSystem extends TestCase { + private static final POIDataSamples _inst = POIDataSamples.getPOIFSInstance(); + + public void testBasicOpen() throws Exception { + NPOIFSFileSystem fsA, fsB; + + // With a simple 512 block file + fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB}) { + assertEquals(512, fs.getBigBlockSize()); + } + + // Now with a simple 4096 block file + fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize4096.zvi")); + fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize4096.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB}) { + assertEquals(4096, fs.getBigBlockSize()); + } + } + + public void testPropertiesAndFatOnRead() throws Exception { + NPOIFSFileSystem fsA, fsB; + + // With a simple 512 block file + fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB}) { + // Check the FAT was properly processed: + // Verify we only got one block + fs.getBATBlockAndIndex(0); + fs.getBATBlockAndIndex(1); + try { + fs.getBATBlockAndIndex(140); + fail("Should only be one BAT, but a 2nd was found"); + } catch(IndexOutOfBoundsException e) {} + + // Verify a few next offsets + // 97 -> 98 -> END + assertEquals(98, fs.getNextBlock(97)); + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(98)); + + + // Check the properties + NPropertyTable props = fs._get_property_table(); + assertEquals(90, props.getStartBlock()); + assertEquals(7, props.countBlocks()); + + // Root property tells us about the Mini Stream + RootProperty root = props.getRoot(); + assertEquals("Root Entry", root.getName()); + assertEquals(11564, root.getSize()); + assertEquals(0, root.getStartBlock()); + + // Check its children too + Property prop; + Iterator pi = root.getChildren(); + prop = pi.next(); + assertEquals("Thumbnail", prop.getName()); + prop = pi.next(); + assertEquals("\u0005DocumentSummaryInformation", prop.getName()); + prop = pi.next(); + assertEquals("\u0005SummaryInformation", prop.getName()); + prop = pi.next(); + assertEquals("Image", prop.getName()); + prop = pi.next(); + assertEquals("Tags", prop.getName()); + assertEquals(false, pi.hasNext()); + + + // Check the SBAT (Small Blocks FAT) was properly processed + NPOIFSMiniStore ministore = fs.getMiniStore(); + + // Verify we only got two SBAT blocks + ministore.getBATBlockAndIndex(0); + ministore.getBATBlockAndIndex(128); + try { + ministore.getBATBlockAndIndex(256); + fail("Should only be two SBATs, but a 3rd was found"); + } catch(IndexOutOfBoundsException e) {} + + // Verify a few offsets: 0->50 is a stream + for(int i=0; i<50; i++) { + assertEquals(i+1, ministore.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(50)); + } + + // Now with a simple 4096 block file + fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize4096.zvi")); + fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize4096.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB}) { + // Check the FAT was properly processed + // Verify we only got one block + fs.getBATBlockAndIndex(0); + fs.getBATBlockAndIndex(1); + try { + fs.getBATBlockAndIndex(1040); + fail("Should only be one BAT, but a 2nd was found"); + } catch(IndexOutOfBoundsException e) {} + + // Verify a few next offsets + // 0 -> 1 -> 2 -> END + assertEquals(1, fs.getNextBlock(0)); + assertEquals(2, fs.getNextBlock(1)); + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2)); + + + // Check the properties + NPropertyTable props = fs._get_property_table(); + assertEquals(12, props.getStartBlock()); + assertEquals(1, props.countBlocks()); + + // Root property tells us about the Mini Stream + RootProperty root = props.getRoot(); + assertEquals("Root Entry", root.getName()); + assertEquals(11564, root.getSize()); + assertEquals(0, root.getStartBlock()); + + // Check its children too + Property prop; + Iterator pi = root.getChildren(); + prop = pi.next(); + assertEquals("Thumbnail", prop.getName()); + prop = pi.next(); + assertEquals("\u0005DocumentSummaryInformation", prop.getName()); + prop = pi.next(); + assertEquals("\u0005SummaryInformation", prop.getName()); + prop = pi.next(); + assertEquals("Image", prop.getName()); + prop = pi.next(); + assertEquals("Tags", prop.getName()); + assertEquals(false, pi.hasNext()); + + + // Check the SBAT (Small Blocks FAT) was properly processed + NPOIFSMiniStore ministore = fs.getMiniStore(); + + // Verify we only got one SBAT block + ministore.getBATBlockAndIndex(0); + ministore.getBATBlockAndIndex(128); + ministore.getBATBlockAndIndex(1023); + try { + ministore.getBATBlockAndIndex(1024); + fail("Should only be one SBAT, but a 2nd was found"); + } catch(IndexOutOfBoundsException e) {} + + // Verify a few offsets: 0->50 is a stream + for(int i=0; i<50; i++) { + assertEquals(i+1, ministore.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(50)); + } + } + + /** + * Check that for a given block, we can correctly figure + * out what the next one is + */ + public void testNextBlock() throws Exception { + NPOIFSFileSystem fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + NPOIFSFileSystem fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB}) { + // 0 -> 21 are simple + for(int i=0; i<21; i++) { + assertEquals(i+1, fs.getNextBlock(i)); + } + // 21 jumps to 89, then ends + assertEquals(89, fs.getNextBlock(21)); + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(89)); + + // 22 -> 88 simple sequential stream + for(int i=22; i<88; i++) { + assertEquals(i+1, fs.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(88)); + + // 90 -> 96 is another stream + for(int i=90; i<96; i++) { + assertEquals(i+1, fs.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(96)); + + // 97+98 is another + assertEquals(98, fs.getNextBlock(97)); + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(98)); + + // 99 is our FAT block + assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(99)); + + // 100 onwards is free + for(int i=100; i 1 -> 2 -> end + assertEquals(1, fs.getNextBlock(0)); + assertEquals(2, fs.getNextBlock(1)); + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2)); + + // 4 -> 11 then end + for(int i=4; i<11; i++) { + assertEquals(i+1, fs.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(11)); + } + } + + /** + * Check we get the right data back for each block + */ + public void testGetBlock() throws Exception { + NPOIFSFileSystem fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + NPOIFSFileSystem fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB}) { + ByteBuffer b; + + // The 0th block is the first data block + b = fs.getBlockAt(0); + assertEquals((byte)0x9e, b.get()); + assertEquals((byte)0x75, b.get()); + assertEquals((byte)0x97, b.get()); + assertEquals((byte)0xf6, b.get()); + + // And the next block + b = fs.getBlockAt(1); + assertEquals((byte)0x86, b.get()); + assertEquals((byte)0x09, b.get()); + assertEquals((byte)0x22, b.get()); + assertEquals((byte)0xfb, b.get()); + + // Check the final block too + b = fs.getBlockAt(99); + assertEquals((byte)0x01, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x02, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + } + + // Quick check on 4096 byte blocks too + fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize4096.zvi")); + fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize4096.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB}) { + ByteBuffer b; + + // The 0th block is the first data block + b = fs.getBlockAt(0); + assertEquals((byte)0x9e, b.get()); + assertEquals((byte)0x75, b.get()); + assertEquals((byte)0x97, b.get()); + assertEquals((byte)0xf6, b.get()); + + // And the next block + b = fs.getBlockAt(1); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x03, b.get()); + assertEquals((byte)0x00, b.get()); + + // The 14th block is the FAT + b = fs.getBlockAt(14); + assertEquals((byte)0x01, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x02, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + } + } + + /** + * Ask for free blocks where there are some already + * to be had from the FAT + */ + public void testGetFreeBlockWithSpare() throws Exception { + NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + + // Our first BAT block has spares + assertEquals(true, fs.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); + + // First free one is 100 + assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(100)); + assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(101)); + assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(102)); + assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(103)); + + // Ask, will get 100 + assertEquals(100, fs.getFreeBlock()); + + // Ask again, will still get 100 as not written to + assertEquals(100, fs.getFreeBlock()); + + // Allocate it, then ask again + fs.setNextBlock(100, POIFSConstants.END_OF_CHAIN); + assertEquals(101, fs.getFreeBlock()); + } + + /** + * Ask for free blocks where no free ones exist, and so the + * file needs to be extended and another BAT/XBAT added + */ + public void testGetFreeBlockWithNoneSpare() throws Exception { + NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + + // We have one BAT at block 99 + assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(99)); + + // We've spare ones from 100 to 128 + for(int i=100; i<128; i++) { + assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(i)); + } + + // Check our BAT knows it's free + assertEquals(true, fs.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); + + // Allocate all the spare ones + for(int i=100; i<128; i++) { + fs.setNextBlock(i, POIFSConstants.END_OF_CHAIN); + } + + // BAT is now full, but there's only the one + assertEquals(false, fs.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); + try { + assertEquals(false, fs.getBATBlockAndIndex(128).getBlock().hasFreeSectors()); + fail("Should only be one BAT"); + } catch(IndexOutOfBoundsException e) {} + + // Now ask for a free one, will need to extend the file + assertEquals(129, fs.getFreeBlock()); + + assertEquals(false, fs.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); + assertEquals(true, fs.getBATBlockAndIndex(128).getBlock().hasFreeSectors()); + assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(128)); + assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(129)); + + + // Fill up to hold 109 BAT blocks + // TODO + + // Ask for another, will get our first XBAT + // TODO + + // Fill the XBAT + // TODO + + // Ask for another, will get our 2nd XBAT + // TODO + + // Write it out and read it back in again + // Ensure it's correct + // TODO + } + + /** + * Test that we can correctly get the list of directory + * entries, and the details on the files in them + */ + public void testListEntries() throws Exception { + NPOIFSFileSystem fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + NPOIFSFileSystem fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + NPOIFSFileSystem fsC = new NPOIFSFileSystem(_inst.getFile("BlockSize4096.zvi")); + NPOIFSFileSystem fsD = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize4096.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB,fsC,fsD}) { + DirectoryEntry root = fs.getRoot(); + assertEquals(5, root.getEntryCount()); + + // Check by the names + Entry thumbnail = root.getEntry("Thumbnail"); + Entry dsi = root.getEntry("\u0005DocumentSummaryInformation"); + Entry si = root.getEntry("\u0005SummaryInformation"); + Entry image = root.getEntry("Image"); + Entry tags = root.getEntry("Tags"); + + assertEquals(false, thumbnail.isDirectoryEntry()); + assertEquals(false, dsi.isDirectoryEntry()); + assertEquals(false, si.isDirectoryEntry()); + assertEquals(true, image.isDirectoryEntry()); + assertEquals(false, tags.isDirectoryEntry()); + + // Check via the iterator + Iterator it = root.getEntries(); + assertEquals(thumbnail.getName(), it.next().getName()); + assertEquals(dsi.getName(), it.next().getName()); + assertEquals(si.getName(), it.next().getName()); + assertEquals(image.getName(), it.next().getName()); + assertEquals(tags.getName(), it.next().getName()); + + // Look inside another + DirectoryEntry imageD = (DirectoryEntry)image; + assertEquals(7, imageD.getEntryCount()); + } + } + + /** + * Tests that we can get the correct contents for + * a document in the filesystem + */ + public void testGetDocumentEntry() throws Exception { + NPOIFSFileSystem fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + NPOIFSFileSystem fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + NPOIFSFileSystem fsC = new NPOIFSFileSystem(_inst.getFile("BlockSize4096.zvi")); + NPOIFSFileSystem fsD = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize4096.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB,fsC,fsD}) { + DirectoryEntry root = fs.getRoot(); + Entry si = root.getEntry("\u0005SummaryInformation"); + + assertEquals(true, si.isDocumentEntry()); + DocumentNode doc = (DocumentNode)si; + + // Check we can read it + NDocumentInputStream inp = new NDocumentInputStream(doc); + byte[] contents = new byte[doc.getSize()]; + assertEquals(doc.getSize(), inp.read(contents)); + + // Now try to build the property set + inp = new NDocumentInputStream(doc); + PropertySet ps = PropertySetFactory.create(inp); + SummaryInformation inf = (SummaryInformation)ps; + + // Check some bits in it + assertEquals(null, inf.getApplicationName()); + assertEquals(null, inf.getAuthor()); + assertEquals(null, inf.getSubject()); + } + } + + // TODO Directory/Document write tests +} diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSMiniStore.java b/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSMiniStore.java new file mode 100644 index 0000000000..8f495903b7 --- /dev/null +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSMiniStore.java @@ -0,0 +1,251 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.filesystem; + +import java.nio.ByteBuffer; + +import junit.framework.TestCase; + +import org.apache.poi.POIDataSamples; +import org.apache.poi.poifs.common.POIFSConstants; + +/** + * Tests for the Mini Store in the NIO POIFS + */ +public final class TestNPOIFSMiniStore extends TestCase { + private static final POIDataSamples _inst = POIDataSamples.getPOIFSInstance(); + + /** + * Check that for a given mini block, we can correctly figure + * out what the next one is + */ + public void testNextBlock() throws Exception { + // It's the same on 512 byte and 4096 byte block files! + NPOIFSFileSystem fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + NPOIFSFileSystem fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + NPOIFSFileSystem fsC = new NPOIFSFileSystem(_inst.getFile("BlockSize4096.zvi")); + NPOIFSFileSystem fsD = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize4096.zvi")); + for(NPOIFSFileSystem fs : new NPOIFSFileSystem[] {fsA,fsB,fsC,fsD}) { + NPOIFSMiniStore ministore = fs.getMiniStore(); + + // 0 -> 51 is one stream + for(int i=0; i<50; i++) { + assertEquals(i+1, ministore.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(50)); + + // 51 -> 103 is the next + for(int i=51; i<103; i++) { + assertEquals(i+1, ministore.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(103)); + + // Then there are 3 one block ones + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(104)); + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(105)); + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(106)); + + // 107 -> 154 is the next + for(int i=107; i<154; i++) { + assertEquals(i+1, ministore.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(154)); + + // 155 -> 160 is the next + for(int i=155; i<160; i++) { + assertEquals(i+1, ministore.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(160)); + + // 161 -> 166 is the next + for(int i=161; i<166; i++) { + assertEquals(i+1, ministore.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(166)); + + // 167 -> 172 is the next + for(int i=167; i<172; i++) { + assertEquals(i+1, ministore.getNextBlock(i)); + } + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(172)); + + // Now some short ones + assertEquals(174 , ministore.getNextBlock(173)); + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(174)); + + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(175)); + + assertEquals(177 , ministore.getNextBlock(176)); + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(177)); + + assertEquals(179 , ministore.getNextBlock(178)); + assertEquals(180 , ministore.getNextBlock(179)); + assertEquals(POIFSConstants.END_OF_CHAIN, ministore.getNextBlock(180)); + + // 181 onwards is free + for(int i=181; i i = stream.getBlockIterator(); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + ByteBuffer b = i.next(); + assertEquals(false, i.hasNext()); + assertEquals(false, i.hasNext()); + assertEquals(false, i.hasNext()); + + // Check the contents + assertEquals((byte)0x81, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x82, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + assertEquals((byte)0x00, b.get()); + } + + /** + * Read a stream with only two blocks in it + */ + public void testReadShortStream() throws Exception { + NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + + // 97 -> 98 -> end + NPOIFSStream stream = new NPOIFSStream(fs, 97); + Iterator i = stream.getBlockIterator(); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + ByteBuffer b97 = i.next(); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + ByteBuffer b98 = i.next(); + assertEquals(false, i.hasNext()); + assertEquals(false, i.hasNext()); + assertEquals(false, i.hasNext()); + + // Check the contents of the 1st block + assertEquals((byte)0x01, b97.get()); + assertEquals((byte)0x00, b97.get()); + assertEquals((byte)0x00, b97.get()); + assertEquals((byte)0x00, b97.get()); + assertEquals((byte)0x02, b97.get()); + assertEquals((byte)0x00, b97.get()); + assertEquals((byte)0x00, b97.get()); + assertEquals((byte)0x00, b97.get()); + + // Check the contents of the 2nd block + assertEquals((byte)0x81, b98.get()); + assertEquals((byte)0x00, b98.get()); + assertEquals((byte)0x00, b98.get()); + assertEquals((byte)0x00, b98.get()); + assertEquals((byte)0x82, b98.get()); + assertEquals((byte)0x00, b98.get()); + assertEquals((byte)0x00, b98.get()); + assertEquals((byte)0x00, b98.get()); + } + + /** + * Read a stream with many blocks + */ + public void testReadLongerStream() throws Exception { + NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + + ByteBuffer b0 = null; + ByteBuffer b1 = null; + ByteBuffer b22 = null; + + // The stream at 0 has 23 blocks in it + NPOIFSStream stream = new NPOIFSStream(fs, 0); + Iterator i = stream.getBlockIterator(); + int count = 0; + while(i.hasNext()) { + ByteBuffer b = i.next(); + if(count == 0) { + b0 = b; + } + if(count == 1) { + b1 = b; + } + if(count == 22) { + b22 = b; + } + + count++; + } + assertEquals(23, count); + + // Check the contents + // 1st block is at 0 + assertEquals((byte)0x9e, b0.get()); + assertEquals((byte)0x75, b0.get()); + assertEquals((byte)0x97, b0.get()); + assertEquals((byte)0xf6, b0.get()); + + // 2nd block is at 1 + assertEquals((byte)0x86, b1.get()); + assertEquals((byte)0x09, b1.get()); + assertEquals((byte)0x22, b1.get()); + assertEquals((byte)0xfb, b1.get()); + + // last block is at 89 + assertEquals((byte)0xfe, b22.get()); + assertEquals((byte)0xff, b22.get()); + assertEquals((byte)0x00, b22.get()); + assertEquals((byte)0x00, b22.get()); + assertEquals((byte)0x05, b22.get()); + assertEquals((byte)0x01, b22.get()); + assertEquals((byte)0x02, b22.get()); + assertEquals((byte)0x00, b22.get()); + } + + /** + * Read a stream with several blocks in a 4096 byte block file + */ + public void testReadStream4096() throws Exception { + NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.getFile("BlockSize4096.zvi")); + + // 0 -> 1 -> 2 -> end + NPOIFSStream stream = new NPOIFSStream(fs, 0); + Iterator i = stream.getBlockIterator(); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + ByteBuffer b0 = i.next(); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + ByteBuffer b1 = i.next(); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + ByteBuffer b2 = i.next(); + assertEquals(false, i.hasNext()); + assertEquals(false, i.hasNext()); + assertEquals(false, i.hasNext()); + + // Check the contents of the 1st block + assertEquals((byte)0x9E, b0.get()); + assertEquals((byte)0x75, b0.get()); + assertEquals((byte)0x97, b0.get()); + assertEquals((byte)0xF6, b0.get()); + assertEquals((byte)0xFF, b0.get()); + assertEquals((byte)0x21, b0.get()); + assertEquals((byte)0xD2, b0.get()); + assertEquals((byte)0x11, b0.get()); + + // Check the contents of the 2nd block + assertEquals((byte)0x00, b1.get()); + assertEquals((byte)0x00, b1.get()); + assertEquals((byte)0x03, b1.get()); + assertEquals((byte)0x00, b1.get()); + assertEquals((byte)0x00, b1.get()); + assertEquals((byte)0x00, b1.get()); + assertEquals((byte)0x00, b1.get()); + assertEquals((byte)0x00, b1.get()); + + // Check the contents of the 3rd block + assertEquals((byte)0x6D, b2.get()); + assertEquals((byte)0x00, b2.get()); + assertEquals((byte)0x00, b2.get()); + assertEquals((byte)0x00, b2.get()); + assertEquals((byte)0x03, b2.get()); + assertEquals((byte)0x00, b2.get()); + assertEquals((byte)0x46, b2.get()); + assertEquals((byte)0x00, b2.get()); + } + + /** + * Craft a nasty file with a loop, and ensure we don't get stuck + */ + public void testReadFailsOnLoop() throws Exception { + NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); + + // Hack the FAT so that it goes 0->1->2->0 + fs.setNextBlock(0, 1); + fs.setNextBlock(1, 2); + fs.setNextBlock(2, 0); + + // Now try to read + NPOIFSStream stream = new NPOIFSStream(fs, 0); + Iterator i = stream.getBlockIterator(); + assertEquals(true, i.hasNext()); + + // 1st read works + i.next(); + assertEquals(true, i.hasNext()); + + // 2nd read works + i.next(); + assertEquals(true, i.hasNext()); + + // 3rd read works + i.next(); + assertEquals(true, i.hasNext()); + + // 4th read blows up as it loops back to 0 + try { + i.next(); + fail("Loop should have been detected but wasn't!"); + } catch(RuntimeException e) { + // Good, it was detected + } + assertEquals(true, i.hasNext()); + } + + /** + * Tests that we can load some streams that are + * stored in the mini stream. + */ + public void testReadMiniStreams() throws Exception { + NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + NPOIFSMiniStore ministore = fs.getMiniStore(); + + // 178 -> 179 -> 180 -> end + NPOIFSStream stream = new NPOIFSStream(ministore, 178); + Iterator i = stream.getBlockIterator(); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + ByteBuffer b178 = i.next(); + assertEquals(true, i.hasNext()); + assertEquals(true, i.hasNext()); + ByteBuffer b179 = i.next(); + assertEquals(true, i.hasNext()); + ByteBuffer b180 = i.next(); + assertEquals(false, i.hasNext()); + assertEquals(false, i.hasNext()); + assertEquals(false, i.hasNext()); + + // Check the contents of the 1st block + assertEquals((byte)0xfe, b178.get()); + assertEquals((byte)0xff, b178.get()); + assertEquals((byte)0x00, b178.get()); + assertEquals((byte)0x00, b178.get()); + assertEquals((byte)0x05, b178.get()); + assertEquals((byte)0x01, b178.get()); + assertEquals((byte)0x02, b178.get()); + assertEquals((byte)0x00, b178.get()); + + // And the 2nd + assertEquals((byte)0x6c, b179.get()); + assertEquals((byte)0x00, b179.get()); + assertEquals((byte)0x00, b179.get()); + assertEquals((byte)0x00, b179.get()); + assertEquals((byte)0x28, b179.get()); + assertEquals((byte)0x00, b179.get()); + assertEquals((byte)0x00, b179.get()); + assertEquals((byte)0x00, b179.get()); + + // And the 3rd + assertEquals((byte)0x30, b180.get()); + assertEquals((byte)0x00, b180.get()); + assertEquals((byte)0x00, b180.get()); + assertEquals((byte)0x00, b180.get()); + assertEquals((byte)0x00, b180.get()); + assertEquals((byte)0x00, b180.get()); + assertEquals((byte)0x00, b180.get()); + assertEquals((byte)0x80, b180.get()); + } + + /** + * Writing the same amount of data as before + */ + public void testReplaceStream() throws Exception { + NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); + + byte[] data = new byte[512]; + for(int i=0; i it = stream.getBlockIterator(); + assertEquals(true, it.hasNext()); + ByteBuffer b = it.next(); + assertEquals(false, it.hasNext()); + + // Now check the contents + data = new byte[512]; + b.get(data); + for(int i=0; i 98 -> end + assertEquals(98, fs.getNextBlock(97)); + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(98)); + + // Create a 2 block stream, will become a 1 block one + NPOIFSStream stream = new NPOIFSStream(fs, 97); + stream.updateContents(data); + + // 97 should now be the end, and 98 free + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(97)); + assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(98)); + + // Check the reading of blocks + Iterator it = stream.getBlockIterator(); + assertEquals(true, it.hasNext()); + ByteBuffer b = it.next(); + assertEquals(false, it.hasNext()); + + // Now check the contents + data = new byte[512]; + b.get(data); + for(int i=0; i 98 -> end + assertEquals(98, fs.getNextBlock(97)); + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(98)); + + // 100 is our first free one + assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(99)); + assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(100)); + + // Create a 2 block stream, will become a 3 block one + NPOIFSStream stream = new NPOIFSStream(fs, 97); + stream.updateContents(data); + + // 97 -> 98 -> 100 -> end + assertEquals(98, fs.getNextBlock(97)); + assertEquals(100, fs.getNextBlock(98)); + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(100)); + + // Check the reading of blocks + Iterator it = stream.getBlockIterator(); + int count = 0; + while(it.hasNext()) { + ByteBuffer b = it.next(); + data = new byte[512]; + b.get(data); + for(int i=0; i it = stream.getBlockIterator(); + int count = 0; + while(it.hasNext()) { + ByteBuffer b = it.next(); + data = new byte[512]; + b.get(data); + for(int i=0; i 1 -> 2 -> end + assertEquals(1, fs.getNextBlock(0)); + assertEquals(2, fs.getNextBlock(1)); + assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2)); + assertEquals(4, fs.getNextBlock(3)); + + // First free one is at 15 + assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(14)); + assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(15)); + + + // Write a 5 block file + byte[] data = new byte[4096*5]; + for(int i=0; i it = stream.getBlockIterator(); + int count = 0; + while(it.hasNext()) { + ByteBuffer b = it.next(); + data = new byte[512]; + b.get(data); + for(int i=0; i1->2->0 + fs.setNextBlock(0, 1); + fs.setNextBlock(1, 2); + fs.setNextBlock(2, 0); + + // Try to write a large amount, should fail on the write + byte[] data = new byte[512*4]; + NPOIFSStream stream = new NPOIFSStream(fs, 0); + try { + stream.updateContents(data); + fail("Loop should have been detected but wasn't!"); + } catch(IllegalStateException e) {} + + // Now reset, and try on a small bit + // Should fail during the freeing set + fs.setNextBlock(0, 1); + fs.setNextBlock(1, 2); + fs.setNextBlock(2, 0); + + data = new byte[512]; + stream = new NPOIFSStream(fs, 0); + try { + stream.updateContents(data); + fail("Loop should have been detected but wasn't!"); + } catch(IllegalStateException e) {} + } +} diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestOffice2007XMLException.java b/src/testcases/org/apache/poi/poifs/filesystem/TestOffice2007XMLException.java index 8080b3ec79..7de2841d4d 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestOffice2007XMLException.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestOffice2007XMLException.java @@ -41,7 +41,8 @@ public class TestOffice2007XMLException extends TestCase { fail("expected exception was not thrown"); } catch(OfficeXmlFileException e) { // expected during successful test - assertTrue(e.getMessage().indexOf("POI only supports OLE2 Office documents") > 0); + assertTrue(e.getMessage().indexOf("The supplied data appears to be in the Office 2007+ XML") > -1); + assertTrue(e.getMessage().indexOf("You are calling the part of POI that deals with OLE2 Office Documents") > -1); } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestOle10Native.java b/src/testcases/org/apache/poi/poifs/filesystem/TestOle10Native.java new file mode 100644 index 0000000000..1ff45be73f --- /dev/null +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestOle10Native.java @@ -0,0 +1,36 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.filesystem; + +import junit.framework.TestCase; +import org.apache.poi.POIDataSamples; + +import java.io.IOException; + +public class TestOle10Native extends TestCase { + private static final POIDataSamples dataSamples = POIDataSamples.getPOIFSInstance(); + + public void testOleNative() throws IOException, Ole10NativeException { + POIFSFileSystem fs = new POIFSFileSystem(dataSamples.openResourceAsStream("oleObject1.bin")); + + Ole10Native ole = Ole10Native.createFromEmbeddedOleObject(fs); + + assertEquals("File1.svg", ole.getLabel()); + assertEquals("D:\\Documents and Settings\\rsc\\My Documents\\file1.svg", ole.getCommand()); + } +} diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSDocumentPath.java b/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSDocumentPath.java index 5c8ea8874b..fef200fdcb 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSDocumentPath.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSDocumentPath.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,39 +14,23 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.filesystem; -import junit.framework.*; +import junit.framework.TestCase; /** * Class to test POIFSDocumentPath functionality * * @author Marc Johnson */ +public final class TestPOIFSDocumentPath extends TestCase { -public class TestPOIFSDocumentPath - extends TestCase -{ - - /** - * Constructor TestPOIFSDocumentPath - * - * @param name - */ - - public TestPOIFSDocumentPath(String name) - { - super(name); - } /** * Test default constructor */ - - public void testDefaultConstructor() - { + public void testDefaultConstructor() { POIFSDocumentPath path = new POIFSDocumentPath(); assertEquals(0, path.length()); @@ -56,9 +39,7 @@ public class TestPOIFSDocumentPath /** * Test full path constructor */ - - public void testFullPathConstructor() - { + public void testFullPathConstructor() { String[] components = { "foo", "bar", "foobar", "fubar" @@ -125,9 +106,7 @@ public class TestPOIFSDocumentPath /** * Test relative path constructor */ - - public void testRelativePathConstructor() - { + public void testRelativePathConstructor() { String[] initialComponents = { "a", "b", "c" @@ -186,24 +165,40 @@ public class TestPOIFSDocumentPath } } - // test weird variants + // Test weird variants + + // This one is allowed, even if it's really odd assertEquals(n, new POIFSDocumentPath(base, null).length()); + new POIFSDocumentPath(base, new String[] + { + "fu", "" + }); + + // This one is allowed too + new POIFSDocumentPath(base, new String[] + { + "", "fu" + }); + + // This one shouldn't be allowed try { new POIFSDocumentPath(base, new String[] { - "fu", "" + "fu", null }); fail("should have caught IllegalArgumentException"); } catch (IllegalArgumentException ignored) { } + + // Ditto try { new POIFSDocumentPath(base, new String[] { - "fu", null + null, "fu" }); fail("should have caught IllegalArgumentException"); } @@ -216,9 +211,7 @@ public class TestPOIFSDocumentPath /** * test equality */ - - public void testEquality() - { + public void testEquality() { POIFSDocumentPath a1 = new POIFSDocumentPath(); POIFSDocumentPath a2 = new POIFSDocumentPath(null); POIFSDocumentPath a3 = new POIFSDocumentPath(new String[ 0 ]); @@ -318,17 +311,4 @@ public class TestPOIFSDocumentPath } } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.eventfilesystem.POIFSDocumentPath"); - junit.textui.TestRunner.run(TestPOIFSDocumentPath.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java b/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java index 4a948ba8c6..aa610bce65 100755 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java @@ -17,22 +17,32 @@ package org.apache.poi.poifs.filesystem; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.Iterator; import junit.framework.TestCase; +import org.apache.poi.POIDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples; +import org.apache.poi.poifs.common.POIFSBigBlockSize; +import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.storage.BATBlock; +import org.apache.poi.poifs.storage.BlockAllocationTableReader; +import org.apache.poi.poifs.storage.HeaderBlock; +import org.apache.poi.poifs.storage.RawDataBlockList; /** * Tests for POIFSFileSystem - * + * * @author Josh Micich */ public final class TestPOIFSFileSystem extends TestCase { + private POIDataSamples _samples = POIDataSamples.getPOIFSInstance(); + /** * Mock exception used to ensure correct error handling @@ -44,7 +54,7 @@ public final class TestPOIFSFileSystem extends TestCase { } /** * Helps facilitate testing. Keeps track of whether close() was called. - * Also can throw an exception at a specific point in the stream. + * Also can throw an exception at a specific point in the stream. */ private static final class TestIS extends InputStream { @@ -87,15 +97,14 @@ public final class TestPOIFSFileSystem extends TestCase { return _isClosed; } } - + /** * Test for undesired behaviour observable as of svn revision 618865 (5-Feb-2008). * POIFSFileSystem was not closing the input stream. */ public void testAlwaysClose() { - TestIS testIS; - + // Normal case - read until EOF and close testIS = new TestIS(openSampleStream("13224.xls"), -1); try { @@ -104,7 +113,7 @@ public final class TestPOIFSFileSystem extends TestCase { throw new RuntimeException(e); } assertTrue("input stream was not closed", testIS.isClosed()); - + // intended to crash after reading 10000 bytes testIS = new TestIS(openSampleStream("13224.xls"), 10000); try { @@ -116,14 +125,13 @@ public final class TestPOIFSFileSystem extends TestCase { // expected } assertTrue("input stream was not closed", testIS.isClosed()); // but still should close - } - + /** * Test for bug # 48898 - problem opening an OLE2 * file where the last block is short (i.e. not a full * multiple of 512 bytes) - * + * * As yet, this problem remains. One school of thought is * not not issue an EOF when we discover the last block * is short, but this seems a bit wrong. @@ -132,26 +140,192 @@ public final class TestPOIFSFileSystem extends TestCase { */ public void testShortLastBlock() throws Exception { String[] files = new String[] { - "ShortLastBlock.qwp", "ShortLastBlock.wps" + "ShortLastBlock.qwp", "ShortLastBlock.wps" }; - String pdirname = System.getProperty("POIFS.testdata.path"); for(int i=0; i 3); + + // Check we can get at all the contents + checkAllDirectoryContents(fs.getRoot()); + + + // Finally, check we can do a similar 512byte one too + fs = new POIFSFileSystem( + _samples.openResourceAsStream("BlockSize512.zvi") + ); + assertTrue(fs.getRoot().getEntryCount() > 3); + checkAllDirectoryContents(fs.getRoot()); + } + private void checkAllDirectoryContents(DirectoryEntry dir) throws IOException { + for(Entry entry : dir) { + if(entry instanceof DirectoryEntry) { + checkAllDirectoryContents((DirectoryEntry)entry); + } else { + DocumentNode doc = (DocumentNode) entry; + DocumentInputStream dis = new DocumentInputStream(doc); + int numBytes = dis.available(); + byte[] data = new byte [numBytes]; + dis.read(data); + } + } + } + + /** + * Test that we can open files that come via Lotus notes. + * These have a top level directory without a name.... + */ + public void testNotesOLE2Files() throws Exception { + POIDataSamples _samples = POIDataSamples.getPOIFSInstance(); + + // Open the file up + POIFSFileSystem fs = new POIFSFileSystem( + _samples.openResourceAsStream("Notes.ole2") + ); + + // Check the contents + assertEquals(1, fs.getRoot().getEntryCount()); + + Entry entry = fs.getRoot().getEntries().next(); + assertTrue(entry.isDirectoryEntry()); + assertTrue(entry instanceof DirectoryEntry); + + // The directory lacks a name! + DirectoryEntry dir = (DirectoryEntry)entry; + assertEquals("", dir.getName()); + + // Has two children + assertEquals(2, dir.getEntryCount()); + + // Check them + Iterator it = dir.getEntries(); + entry = it.next(); + assertEquals(true, entry.isDocumentEntry()); + assertEquals("\u0001Ole10Native", entry.getName()); + + entry = it.next(); + assertEquals(true, entry.isDocumentEntry()); + assertEquals("\u0001CompObj", entry.getName()); + } private static InputStream openSampleStream(String sampleFileName) { return HSSFTestDataSamples.openSampleFileStream(sampleFileName); diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestPropertySorter.java b/src/testcases/org/apache/poi/poifs/filesystem/TestPropertySorter.java index ecff6778a3..2c30d1b12d 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestPropertySorter.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestPropertySorter.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -20,14 +19,13 @@ package org.apache.poi.poifs.filesystem; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; +import java.util.List; import junit.framework.ComparisonFailure; import junit.framework.TestCase; @@ -62,7 +60,7 @@ public final class TestPropertySorter extends TestCase { throw new RuntimeException(e); } } - + /** * Test sorting of properties in DirectoryProperty */ @@ -125,22 +123,22 @@ public final class TestPropertySorter extends TestCase { DirectoryNode vba = (DirectoryNode)vba_project.getEntry(VBA); DirectoryProperty p = (DirectoryProperty)vba.getProperty(); - ArrayList lst = new ArrayList(); - for (Iterator it = p.getChildren(); it.hasNext();){ - Property ch = (Property)it.next(); + List lst = new ArrayList(); + for (Iterator it = p.getChildren(); it.hasNext();){ + Property ch = it.next(); lst.add(ch); } - return (Property [])lst.toArray(new Property[ 0 ]); + return lst.toArray(new Property[ 0 ]); } /** * Old version of case-sensitive PropertyComparator to demonstrate the problem */ - private static final Comparator OldCaseSensitivePropertyComparator = new Comparator() { + private static final Comparator OldCaseSensitivePropertyComparator = new Comparator() { - public int compare(Object o1, Object o2) { - String name1 = (( Property ) o1).getName(); - String name2 = (( Property ) o2).getName(); + public int compare(Property o1, Property o2) { + String name1 = o1.getName(); + String name2 = o2.getName(); int result = name1.length() - name2.length(); if (result == 0) { diff --git a/src/testcases/org/apache/poi/poifs/property/AllPOIFSPropertyTests.java b/src/testcases/org/apache/poi/poifs/property/AllPOIFSPropertyTests.java index a5459ed76f..99d4c99be5 100755 --- a/src/testcases/org/apache/poi/poifs/property/AllPOIFSPropertyTests.java +++ b/src/testcases/org/apache/poi/poifs/property/AllPOIFSPropertyTests.java @@ -1,3 +1,20 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + package org.apache.poi.poifs.property; import junit.framework.Test; @@ -11,7 +28,7 @@ import junit.framework.TestSuite; public final class AllPOIFSPropertyTests { public static Test suite() { - TestSuite result = new TestSuite("Tests for org.apache.poi.poifs.property"); + TestSuite result = new TestSuite(AllPOIFSPropertyTests.class.getName()); result.addTestSuite(TestDirectoryProperty.class); result.addTestSuite(TestDocumentProperty.class); result.addTestSuite(TestPropertyFactory.class); diff --git a/src/testcases/org/apache/poi/poifs/property/TestDirectoryProperty.java b/src/testcases/org/apache/poi/poifs/property/TestDirectoryProperty.java index 20605a7a84..9569de1d4b 100644 --- a/src/testcases/org/apache/poi/poifs/property/TestDirectoryProperty.java +++ b/src/testcases/org/apache/poi/poifs/property/TestDirectoryProperty.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,63 +14,41 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.property; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; -import java.util.*; +import org.apache.poi.poifs.storage.RawDataUtil; -import junit.framework.*; - -import org.apache.poi.poifs.common.POIFSConstants; +import junit.framework.TestCase; /** * Class to test DirectoryProperty functionality * * @author Marc Johnson */ - -public class TestDirectoryProperty - extends TestCase -{ +public final class TestDirectoryProperty extends TestCase { private DirectoryProperty _property; private byte[] _testblock; - /** - * Constructor TestDirectoryProperty - * - * @param name - */ - - public TestDirectoryProperty(String name) - { - super(name); - } - /** * Test constructing DirectoryProperty - * - * @exception IOException */ - - public void testConstructor() - throws IOException - { + public void testConstructor() throws IOException { createBasicDirectoryProperty(); verifyProperty(); } /** * Test pre-write functionality - * - * @exception IOException */ - - public void testPreWrite() - throws IOException - { + public void testPreWrite() throws IOException { createBasicDirectoryProperty(); _property.preWrite(); @@ -119,9 +96,7 @@ public class TestDirectoryProperty } } - private void verifyChildren(int count) - throws IOException - { + private void verifyChildren(int count) { Iterator iter = _property.getChildren(); List children = new ArrayList(); @@ -175,8 +150,7 @@ public class TestDirectoryProperty } } - private void createBasicDirectoryProperty() - { + private void createBasicDirectoryProperty() { String name = "MyDirectory"; _property = new DirectoryProperty(name); @@ -209,9 +183,7 @@ public class TestDirectoryProperty } } - private void verifyProperty() - throws IOException - { + private void verifyProperty() throws IOException { ByteArrayOutputStream stream = new ByteArrayOutputStream(512); _property.writeData(stream); @@ -225,15 +197,7 @@ public class TestDirectoryProperty } } - /** - * Test addChild - * - * @exception IOException - */ - - public void testAddChild() - throws IOException - { + public void testAddChild() throws IOException { createBasicDirectoryProperty(); _property.addChild(new LocalProperty(1)); _property.addChild(new LocalProperty(2)); @@ -260,15 +224,7 @@ public class TestDirectoryProperty _property.addChild(new LocalProperty(3)); } - /** - * Test deleteChild - * - * @exception IOException - */ - - public void testDeleteChild() - throws IOException - { + public void testDeleteChild() throws IOException { createBasicDirectoryProperty(); Property p1 = new LocalProperty(1); @@ -288,15 +244,7 @@ public class TestDirectoryProperty _property.addChild(new LocalProperty(1)); } - /** - * Test changeName - * - * @exception IOException - */ - - public void testChangeName() - throws IOException - { + public void testChangeName() throws IOException { createBasicDirectoryProperty(); Property p1 = new LocalProperty(1); String originalName = p1.getName(); @@ -314,88 +262,35 @@ public class TestDirectoryProperty assertTrue(_property.changeName(p1, originalName)); } - /** - * Test reading constructor - * - * @exception IOException - */ - - public void testReadingConstructor() - throws IOException - { - byte[] input = - { - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x45, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x08, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xC0, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x46, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xC0, ( byte ) 0x5C, ( byte ) 0xE8, ( byte ) 0x23, - ( byte ) 0x9E, ( byte ) 0x6B, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00 + public void testReadingConstructor() { + String[] input = { + "42 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 01 01 FF FF FF FF FF FF FF FF 02 00 00 00 20 08 02 00 00 00 00 00 C0 00 00 00 00 00 00 46", + "00 00 00 00 00 00 00 00 00 00 00 00 C0 5C E8 23 9E 6B C1 01 FE FF FF FF 00 00 00 00 00 00 00 00", }; - - verifyReadingProperty(0, input, 0, "Boot Entry"); + verifyReadingProperty(0, RawDataUtil.decode(input), 0, "Boot Entry"); } - private void verifyReadingProperty(int index, byte [] input, int offset, - String name) - throws IOException - { - DirectoryProperty property = new DirectoryProperty(index, input, - offset); - ByteArrayOutputStream stream = new ByteArrayOutputStream(128); - byte[] expected = new byte[ 128 ]; + private static void verifyReadingProperty(int index, byte[] input, int offset, String name) { + DirectoryProperty property = new DirectoryProperty(index, input, offset); + ByteArrayOutputStream stream = new ByteArrayOutputStream(128); + byte[] expected = new byte[128]; System.arraycopy(input, offset, expected, 0, 128); - property.writeData(stream); + try { + property.writeData(stream); + } catch (IOException e) { + throw new RuntimeException(e); + } byte[] output = stream.toByteArray(); assertEquals(128, output.length); - for (int j = 0; j < 128; j++) - { - assertEquals("mismatch at offset " + j, expected[ j ], - output[ j ]); + for (int j = 0; j < 128; j++) { + assertEquals("mismatch at offset " + j, expected[j], output[j]); } assertEquals(index, property.getIndex()); assertEquals(name, property.getName()); assertTrue(!property.getChildren().hasNext()); } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.property.DirectoryProperty"); - junit.textui.TestRunner.run(TestDirectoryProperty.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/property/TestDocumentProperty.java b/src/testcases/org/apache/poi/poifs/property/TestDocumentProperty.java index 8bf8d00ae8..41acc760bc 100644 --- a/src/testcases/org/apache/poi/poifs/property/TestDocumentProperty.java +++ b/src/testcases/org/apache/poi/poifs/property/TestDocumentProperty.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,49 +14,24 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.property; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; -import java.util.*; +import org.apache.poi.poifs.storage.RawDataUtil; -import junit.framework.*; - -import org.apache.poi.poifs.property.DocumentProperty; +import junit.framework.TestCase; /** * Class to test DocumentProperty functionality * * @author Marc Johnson */ +public final class TestDocumentProperty extends TestCase { -public class TestDocumentProperty - extends TestCase -{ - - /** - * Constructor TestDocumentProperty - * - * @param name - */ - - public TestDocumentProperty(String name) - { - super(name); - } - - /** - * Test constructing DocumentPropertys - * - * @exception IOException - */ - - public void testConstructor() - throws IOException - { - + public void testConstructor() throws IOException { // test with short name, small file verifyProperty("foo", 1234); @@ -71,160 +45,34 @@ public class TestDocumentProperty verifyProperty("A.really.long.long.long.name123", 4096); } - /** - * Test reading constructor - * - * @exception IOException - */ - - public void testReadingConstructor() - throws IOException - { - byte[] input = - { - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x45, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x08, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xC0, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x46, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xC0, ( byte ) 0x5C, ( byte ) 0xE8, ( byte ) 0x23, - ( byte ) 0x9E, ( byte ) 0x6B, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - - ( byte ) 0x57, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6B, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6B, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x38, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00 + public void testReadingConstructor() throws IOException { + String[] hexData = { + "52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 05 01 FF FF FF FF FF FF FF FF 02 00 00 00 20 08 02 00 00 00 00 00 C0 00 00 00 00 00 00 46", + "00 00 00 00 00 00 00 00 00 00 00 00 C0 5C E8 23 9E 6B C1 01 FE FF FF FF 00 00 00 00 00 00 00 00", + "57 00 6F 00 72 00 6B 00 62 00 6F 00 6F 00 6B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "12 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00", + "05 00 53 00 75 00 6D 00 6D 00 61 00 72 00 79 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00", + "69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 01 00 00 00 03 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 10 00 00 00 00 00 00", + "05 00 44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 53 00 75 00 6D 00 6D 00 61 00 72 00 79 00", + "49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00", + "38 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 10 00 00 00 00 00 00", }; + byte[] input = RawDataUtil.decode(hexData); verifyReadingProperty(1, input, 128, "Workbook"); verifyReadingProperty(2, input, 256, "\005SummaryInformation"); - verifyReadingProperty(3, input, 384, - "\005DocumentSummaryInformation"); + verifyReadingProperty(3, input, 384, "\005DocumentSummaryInformation"); } - private void verifyReadingProperty(int index, byte [] input, int offset, - String name) - throws IOException - { + private void verifyReadingProperty(int index, byte[] input, int offset, String name) + throws IOException { DocumentProperty property = new DocumentProperty(index, input, offset); ByteArrayOutputStream stream = new ByteArrayOutputStream(128); @@ -244,9 +92,7 @@ public class TestDocumentProperty assertEquals(name, property.getName()); } - private void verifyProperty(String name, int size) - throws IOException - { + private void verifyProperty(String name, int size) throws IOException { DocumentProperty property = new DocumentProperty(name, size); if (size >= 4096) @@ -309,17 +155,4 @@ public class TestDocumentProperty output[ j ]); } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.property.DocumentProperty"); - junit.textui.TestRunner.run(TestDocumentProperty.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/property/TestPropertyFactory.java b/src/testcases/org/apache/poi/poifs/property/TestPropertyFactory.java index 20ff82e9bf..e6d2c656a6 100644 --- a/src/testcases/org/apache/poi/poifs/property/TestPropertyFactory.java +++ b/src/testcases/org/apache/poi/poifs/property/TestPropertyFactory.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,2225 +14,383 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.property; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; -import java.util.*; - -import junit.framework.*; +import junit.framework.TestCase; import org.apache.poi.poifs.storage.RawDataBlock; +import org.apache.poi.poifs.storage.RawDataUtil; /** * Class to test PropertyFactory functionality * * @author Marc Johnson */ +public final class TestPropertyFactory extends TestCase { -public class TestPropertyFactory - extends TestCase -{ + public void testConvertToProperties() throws IOException { - /** - * Constructor TestPropertyFactory - * - * @param name - */ + // real data from a real file! + String[] hexData = { + "52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 05 00 FF FF FF FF FF FF FF FF 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 C0 47 A4 DE EC 65 C1 01 03 00 00 00 40 0C 00 00 00 00 00 00", + "44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 20 00 44 00 65 00 74 00 61 00 69 00 6C 00 73 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 A0 7F 29 08 59 56 C1 01 C0 20 31 08 59 56 C1 01 00 00 00 00 00 00 00 00 00 00 00 00", + "43 00 72 00 65 00 61 00 74 00 69 00 6F 00 6E 00 20 00 4E 00 61 00 6D 00 65 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1C 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 2C 00 00 00 00 00 00 00", + "43 00 72 00 65 00 61 00 74 00 69 00 6F 00 6E 00 20 00 44 00 61 00 74 00 65 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1C 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 0A 00 00 00 00 00 00 00", + "4C 00 61 00 73 00 74 00 20 00 53 00 61 00 76 00 65 00 64 00 20 00 44 00 61 00 74 00 65 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "20 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 0A 00 00 00 00 00 00 00", + "44 00 61 00 74 00 65 00 20 00 46 00 69 00 6C 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 0A 00 00 00 00 00 00 00", + "44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 20 00 56 00 65 00 72 00 73 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 04 00 00 00 00 00 00 00", + "42 00 61 00 63 00 63 00 68 00 75 00 73 00 20 00 44 00 65 00 61 00 6C 00 20 00 4E 00 75 00 6D 00", + "62 00 65 00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 04 00 00 00 00 00 00 00", + "44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 20 00 4C 00 6F 00 63 00 6B 00 65 00 64 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "20 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 04 00 00 00 00 00 00 00", + "44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 20 00 44 00 65 00 61 00 6C 00 20 00 54 00 79 00", + "70 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "26 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 06 00 00 00 00 00 00 00", + "44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 20 00 41 00 75 00 64 00 69 00 74 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1E 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 C0 20 31 08 59 56 C1 01 80 48 3A 08 59 56 C1 01 00 00 00 00 00 00 00 00 00 00 00 00", + "55 00 73 00 65 00 72 00 20 00 41 00 75 00 64 00 69 00 74 00 20 00 54 00 72 00 61 00 69 00 6C 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 42 00 00 00 00 00 00 00", + "43 00 6F 00 6E 00 74 00 72 00 61 00 63 00 74 00 20 00 47 00 65 00 6E 00 65 00 72 00 61 00 74 00", + "69 00 6F 00 6E 00 20 00 49 00 6E 00 66 00 6F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "32 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 80 48 3A 08 59 56 C1 01 80 48 3A 08 59 56 C1 01 00 00 00 00 00 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 01 01 FF FF FF FF FF FF FF FF 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 80 48 3A 08 59 56 C1 01 80 B2 52 08 59 56 C1 01 00 00 00 00 00 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 44 00 65 00 73 00 63 00 72 00 69 00 70 00 74 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 00 16 00 00 00 26 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 09 00 00 00 00 00 00 00", + "53 00 61 00 6C 00 65 00 73 00 20 00 41 00 72 00 65 00 61 00 20 00 43 00 6F 00 64 00 65 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "20 00 02 01 12 00 00 00 2A 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 00 00 00 04 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 43 00 75 00 72 00 72 00 65 00 6E 00 63 00 79 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1C 00 02 01 1B 00 00 00 20 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00 00 07 00 00 00 00 00 00 00", + "4F 00 75 00 74 00 62 00 6F 00 75 00 6E 00 64 00 20 00 54 00 72 00 61 00 76 00 65 00 6C 00 20 00", + "44 00 61 00 74 00 65 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2C 00 02 01 25 00 00 00 27 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0D 00 00 00 21 00 00 00 00 00 00 00", + "4D 00 61 00 78 00 69 00 6D 00 75 00 6D 00 20 00 53 00 74 00 61 00 79 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1A 00 02 01 14 00 00 00 10 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00 00 00 05 00 00 00 00 00 00 00", + "4D 00 61 00 78 00 69 00 6D 00 75 00 6D 00 20 00 53 00 74 00 61 00 79 00 20 00 50 00 65 00 72 00", + "69 00 6F 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 00 18 00 00 00 23 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F 00 00 00 04 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 54 00 79 00 70 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 00 15 00 00 00 28 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 04 00 00 00 00 00 00 00", + "53 00 75 00 62 00 20 00 44 00 65 00 61 00 6C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "12 00 02 01 2E 00 00 00 1F 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00 00 04 00 00 00 00 00 00 00", + "43 00 6F 00 6D 00 6D 00 69 00 73 00 73 00 69 00 6F 00 6E 00 20 00 56 00 61 00 6C 00 75 00 65 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 00 00 04 00 00 00 00 00 00 00", + "46 00 61 00 72 00 65 00 20 00 54 00 79 00 70 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 00 00 00 04 00 00 00 00 00 00 00", + "46 00 55 00 44 00 20 00 47 00 72 00 69 00 64 00 20 00 44 00 69 00 6D 00 65 00 6E 00 73 00 69 00", + "6F 00 6E 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 04 00 00 00 00 00 00 00", + "46 00 55 00 44 00 20 00 47 00 72 00 69 00 64 00 20 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00", + "74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2A 00 02 01 0F 00 00 00 1A 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "44 00 6F 00 75 00 62 00 6C 00 65 00 20 00 44 00 65 00 61 00 6C 00 69 00 6E 00 67 00 20 00 49 00", + "6E 00 64 00 69 00 63 00 61 00 74 00 6F 00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "32 00 02 01 11 00 00 00 21 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 00 00 00 04 00 00 00 00 00 00 00", + "42 00 75 00 73 00 69 00 6E 00 65 00 73 00 73 00 20 00 54 00 79 00 70 00 65 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1C 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 16 00 00 00 04 00 00 00 00 00 00 00", + "55 00 6D 00 62 00 72 00 65 00 6C 00 6C 00 61 00 20 00 4C 00 69 00 6E 00 6B 00 73 00 20 00 61 00", + "6E 00 64 00 20 00 50 00 61 00 73 00 73 00 65 00 6E 00 67 00 65 00 72 00 73 00 00 00 00 00 00 00", + "3C 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "41 00 67 00 65 00 6E 00 74 00 73 00 20 00 4E 00 61 00 6D 00 65 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "18 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 04 00 00 00 00 00 00 00", + "4E 00 75 00 6D 00 62 00 65 00 72 00 20 00 6F 00 66 00 20 00 50 00 61 00 73 00 73 00 65 00 6E 00", + "67 00 65 00 72 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2A 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 04 00 00 00 00 00 00 00", + "41 00 4C 00 43 00 20 00 43 00 6F 00 64 00 65 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "43 00 6F 00 6E 00 73 00 6F 00 72 00 74 00 69 00 61 00 20 00 43 00 6F 00 64 00 65 00 73 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "20 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "43 00 68 00 69 00 6C 00 64 00 20 00 50 00 65 00 72 00 63 00 65 00 6E 00 74 00 61 00 67 00 65 00", + "20 00 50 00 65 00 72 00 6D 00 69 00 74 00 74 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00", + "36 00 02 01 24 00 00 00 2C 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 19 00 00 00 04 00 00 00 00 00 00 00", + "50 00 65 00 72 00 63 00 65 00 6E 00 74 00 61 00 67 00 65 00 20 00 6F 00 66 00 20 00 59 00 69 00", + "65 00 6C 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1A 00 00 00 04 00 00 00 00 00 00 00", + "4E 00 65 00 74 00 20 00 52 00 65 00 6D 00 69 00 74 00 20 00 50 00 65 00 72 00 6D 00 69 00 74 00", + "74 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 29 00 00 00 22 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 00 00 00 04 00 00 00 00 00 00 00", + "49 00 6E 00 66 00 61 00 6E 00 74 00 20 00 44 00 69 00 73 00 63 00 6F 00 75 00 6E 00 74 00 20 00", + "50 00 65 00 72 00 6D 00 69 00 74 00 74 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "34 00 02 01 2D 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1C 00 00 00 04 00 00 00 00 00 00 00", + "49 00 6E 00 66 00 61 00 6E 00 74 00 20 00 44 00 69 00 73 00 63 00 6F 00 75 00 6E 00 74 00 20 00", + "56 00 61 00 6C 00 75 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2C 00 02 01 1E 00 00 00 2F 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1D 00 00 00 04 00 00 00 00 00 00 00", + "54 00 52 00 56 00 41 00 20 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 30 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1E 00 00 00 04 00 00 00 00 00 00 00", + "42 00 75 00 73 00 69 00 6E 00 65 00 73 00 73 00 20 00 4A 00 75 00 73 00 74 00 69 00 66 00 69 00", + "63 00 61 00 74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2E 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1F 00 00 00 04 00 00 00 00 00 00 00", + "53 00 75 00 72 00 63 00 68 00 61 00 72 00 67 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 01 17 00 00 00 1D 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 04 00 00 00 00 00 00 00", + "4E 00 61 00 74 00 75 00 72 00 65 00 20 00 6F 00 66 00 20 00 56 00 61 00 72 00 69 00 61 00 74 00", + "69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 21 00 00 00 50 00 00 00 00 00 00 00", + "4F 00 74 00 68 00 65 00 72 00 20 00 52 00 65 00 66 00 75 00 6E 00 64 00 20 00 54 00 65 00 78 00", + "74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "24 00 02 01 0E 00 00 00 13 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 23 00 00 00 04 00 00 00 00 00 00 00", + "43 00 61 00 6E 00 63 00 65 00 6C 00 6C 00 61 00 74 00 69 00 6F 00 6E 00 20 00 46 00 65 00 65 00", + "20 00 50 00 65 00 72 00 63 00 65 00 6E 00 74 00 61 00 67 00 65 00 00 00 00 00 00 00 00 00 00 00", + "38 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 00 00 00 04 00 00 00 00 00 00 00", + "43 00 61 00 6E 00 63 00 65 00 6C 00 6C 00 61 00 74 00 69 00 6F 00 6E 00 20 00 46 00 65 00 65 00", + "20 00 46 00 69 00 78 00 65 00 64 00 20 00 56 00 61 00 6C 00 75 00 65 00 00 00 00 00 00 00 00 00", + "3A 00 02 01 2B 00 00 00 1C 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 25 00 00 00 04 00 00 00 00 00 00 00", + "43 00 61 00 6E 00 63 00 65 00 6C 00 6C 00 61 00 74 00 69 00 6F 00 6E 00 20 00 46 00 65 00 65 00", + "20 00 43 00 75 00 72 00 72 00 65 00 6E 00 63 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "34 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 26 00 00 00 07 00 00 00 00 00 00 00", + "52 00 65 00 6D 00 61 00 72 00 6B 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "10 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "4F 00 74 00 68 00 65 00 72 00 20 00 43 00 61 00 72 00 72 00 69 00 65 00 72 00 20 00 53 00 65 00", + "63 00 74 00 6F 00 72 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2C 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 27 00 00 00 04 00 00 00 00 00 00 00", + "50 00 72 00 6F 00 72 00 61 00 74 00 65 00 20 00 43 00 6F 00 6D 00 6D 00 65 00 6E 00 74 00 73 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "4E 00 65 00 67 00 6F 00 74 00 69 00 61 00 74 00 69 00 6F 00 6E 00 20 00 49 00 6E 00 66 00 6F 00", + "72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "30 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 80 B2 52 08 59 56 C1 01 80 B2 52 08 59 56 C1 01 00 00 00 00 00 00 00 00 00 00 00 00", + "52 00 65 00 73 00 74 00 72 00 69 00 63 00 74 00 65 00 64 00 20 00 43 00 61 00 72 00 72 00 69 00", + "65 00 72 00 73 00 20 00 26 00 20 00 53 00 74 00 6E 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00", + "36 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 04 00 00 00 00 00 00 00", + "41 00 64 00 64 00 69 00 74 00 69 00 6F 00 6E 00 61 00 6C 00 20 00 43 00 6F 00 6D 00 6D 00 65 00", + "6E 00 74 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 04 00 00 00 00 00 00 00", + "52 00 65 00 76 00 65 00 6E 00 75 00 65 00 20 00 4D 00 61 00 6E 00 61 00 67 00 65 00 6D 00 65 00", + "6E 00 74 00 20 00 43 00 6F 00 6D 00 6D 00 65 00 6E 00 74 00 73 00 00 00 00 00 00 00 00 00 00 00", + "38 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 04 00 00 00 00 00 00 00", + "52 00 65 00 76 00 65 00 6E 00 75 00 65 00 20 00 4D 00 61 00 6E 00 61 00 67 00 65 00 6D 00 65 00", + "6E 00 74 00 20 00 52 00 65 00 66 00 65 00 72 00 65 00 6E 00 63 00 65 00 00 00 00 00 00 00 00 00", + "3A 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 04 00 00 00 00 00 00 00", + "4D 00 69 00 6E 00 69 00 6D 00 75 00 6D 00 20 00 53 00 74 00 61 00 79 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1A 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 04 00 00 00 00 00 00 00", + "43 00 72 00 65 00 61 00 74 00 65 00 64 00 20 00 42 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 1B 00 00 00 00 00 00 00", + "4F 00 6E 00 20 00 42 00 65 00 68 00 61 00 6C 00 66 00 20 00 4F 00 66 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1A 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 04 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 50 00 61 00 67 00 65 00 20 00 41 00 75 00 74 00 68 00 20 00 4C 00", + "6F 00 63 00 6B 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2A 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 10 00 00 00 00 00 00 00", + "47 00 72 00 6F 00 75 00 70 00 20 00 41 00 75 00 74 00 68 00 6F 00 72 00 69 00 73 00 61 00 74 00", + "69 00 6F 00 6E 00 20 00 49 00 6E 00 66 00 6F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "32 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 80 B2 52 08 59 56 C1 01 40 DA 5B 08 59 56 C1 01 00 00 00 00 00 00 00 00 00 00 00 00", + "4C 00 61 00 73 00 74 00 20 00 49 00 73 00 73 00 75 00 65 00 64 00 20 00 47 00 72 00 6F 00 75 00", + "70 00 20 00 4E 00 75 00 6D 00 62 00 65 00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "32 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 06 00 00 00 00 00 00 00", + "47 00 72 00 6F 00 75 00 70 00 20 00 4E 00 75 00 6D 00 62 00 65 00 72 00 73 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1C 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + }; - public TestPropertyFactory(String name) - { - super(name); - } + byte[] testdata = RawDataUtil.decode(hexData); + ByteArrayInputStream stream = new ByteArrayInputStream(testdata); + RawDataBlock[] raw_data = new RawDataBlock[testdata.length / 512]; - /** - * Test executing convertToProperties - * - * @exception IOException - */ + for (int j = 0; j < raw_data.length; j++) { + raw_data[j] = new RawDataBlock(stream); + } + List properties = PropertyFactory.convertToProperties(raw_data); - public void testConvertToProperties() - throws IOException - { + assertEquals(64, properties.size()); + String[] names = { + "Root Entry", null, null, null, null, null, null, null, null, + null, null, null, null, "Deal Information", "Deal Description", + "Sales Area Code", "Deal Currency", "Outbound Travel Dates", + "Maximum Stay", "Maximum Stay Period", "Deal Type", "Sub Deal", + "Commission Value", "Fare Type", "FUD Grid Dimensions", + "FUD Grid Information", "Double Dealing Indicator", + "Business Type", "Umbrella Links and Passengers", "Agents Name", + "Number of Passengers", "ALC Codes", "Consortia Codes", + "Child Percentage Permitted", "Percentage of Yield", + "Net Remit Permitted", "Infant Discount Permitted", + "Infant Discount Value", "TRVA Information", + "Business Justification", "Surcharge", "Nature of Variation", + "Other Refund Text", "Cancellation Fee Percentage", + "Cancellation Fee Fixed Value", "Cancellation Fee Currency", + "Remarks", "Other Carrier Sectors", "Prorate Comments", null, + null, null, null, null, null, null, null, null, null, null, null, + null, null, null + }; + assertEquals(64, names.length); - // real data from a real file! - byte[] testdata = - { - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x45, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xC0, ( byte ) 0x47, ( byte ) 0xA4, ( byte ) 0xDE, - ( byte ) 0xEC, ( byte ) 0x65, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x40, ( byte ) 0x0C, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xA0, ( byte ) 0x7F, ( byte ) 0x29, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0xC0, ( byte ) 0x20, ( byte ) 0x31, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4E, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x76, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x56, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4E, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4C, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x6B, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x54, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x70, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x26, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x41, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xC0, ( byte ) 0x20, ( byte ) 0x31, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x80, ( byte ) 0x48, ( byte ) 0x3A, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x55, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x41, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x47, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x32, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x80, ( byte ) 0x48, ( byte ) 0x3A, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x80, ( byte ) 0x48, ( byte ) 0x3A, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x19, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x80, ( byte ) 0x48, ( byte ) 0x3A, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x80, ( byte ) 0xB2, ( byte ) 0x52, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x26, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x09, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x76, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x25, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x27, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x21, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x78, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x78, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0x18, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x23, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0x15, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x2E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x11, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x56, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x46, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x13, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x46, ( byte ) 0x00, ( byte ) 0x55, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x46, ( byte ) 0x00, ( byte ) 0x55, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x0F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x32, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x11, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x21, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x15, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x55, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4C, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x6B, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4E, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x18, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x17, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x18, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x4C, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x68, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x36, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x24, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x19, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x59, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x29, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x34, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x2D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x56, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x54, ( byte ) 0x00, ( byte ) 0x52, ( byte ) 0x00, - ( byte ) 0x56, ( byte ) 0x00, ( byte ) 0x41, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x30, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4A, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2E, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x17, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x56, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x21, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x78, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x24, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x0E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x13, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x23, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x38, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x24, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x78, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x56, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x2B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x25, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x34, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x26, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6B, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x27, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x30, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x80, ( byte ) 0xB2, ( byte ) 0x52, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x80, ( byte ) 0xB2, ( byte ) 0x52, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x26, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x36, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x76, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x4D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x38, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x76, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x4D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x52, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4D, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x1B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x42, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x68, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x68, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4C, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x6B, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x70, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x68, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x32, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x80, ( byte ) 0xB2, ( byte ) 0x52, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x40, ( byte ) 0xDA, ( byte ) 0x5B, ( byte ) 0x08, - ( byte ) 0x59, ( byte ) 0x56, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x70, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x32, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x70, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00 - }; - ByteArrayInputStream stream = new ByteArrayInputStream(testdata); - RawDataBlock[] raw_data = - new RawDataBlock[ testdata.length / 512 ]; + boolean[] isRoot = { + true, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false + }; + assertEquals(64, isRoot.length); - for (int j = 0; j < raw_data.length; j++) - { - raw_data[ j ] = new RawDataBlock(stream); - } - List properties = PropertyFactory.convertToProperties(raw_data); + boolean[] isDocument = { + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, true, true, true, true, true, + true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false + }; + assertEquals(64, isDocument.length); - assertEquals(64, properties.size()); - String[] names = - { - "Root Entry", null, null, null, null, null, null, null, null, - null, null, null, null, "Deal Information", "Deal Description", - "Sales Area Code", "Deal Currency", "Outbound Travel Dates", - "Maximum Stay", "Maximum Stay Period", "Deal Type", "Sub Deal", - "Commission Value", "Fare Type", "FUD Grid Dimensions", - "FUD Grid Information", "Double Dealing Indicator", - "Business Type", "Umbrella Links and Passengers", "Agents Name", - "Number of Passengers", "ALC Codes", "Consortia Codes", - "Child Percentage Permitted", "Percentage of Yield", - "Net Remit Permitted", "Infant Discount Permitted", - "Infant Discount Value", "TRVA Information", - "Business Justification", "Surcharge", "Nature of Variation", - "Other Refund Text", "Cancellation Fee Percentage", - "Cancellation Fee Fixed Value", "Cancellation Fee Currency", - "Remarks", "Other Carrier Sectors", "Prorate Comments", null, - null, null, null, null, null, null, null, null, null, null, null, - null, null, null - }; + boolean[] isDirectory = { + false, false, false, false, false, false, false, false, false, + false, false, false, false, true, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false + }; + assertEquals(64, isDirectory.length); - assertEquals(64, names.length); - boolean[] isRoot = - { - true, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false - }; + boolean[] isNull = { + false, true, true, true, true, true, true, true, true, true, true, + true, true, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true + }; + assertEquals(64, isNull.length); - assertEquals(64, isRoot.length); - boolean[] isDocument = - { - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false - }; - - assertEquals(64, isDocument.length); - boolean[] isDirectory = - { - false, false, false, false, false, false, false, false, false, - false, false, false, false, true, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false - }; - - assertEquals(64, isDirectory.length); - boolean[] isNull = - { - false, true, true, true, true, true, true, true, true, true, true, - true, true, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true - }; - - assertEquals(64, isNull.length); - for (int j = 0; j < 64; j++) - { - if (isNull[ j ]) - { - assertNull("Checking property " + j, properties.get(j)); - } - else - { - assertNotNull("Checking property " + j, properties.get(j)); - if (isRoot[ j ]) - { - assertTrue("Checking property " + j, - properties.get(j) instanceof RootProperty); - } - if (isDirectory[ j ]) - { - assertTrue("Checking property " + j, - properties.get(j) - instanceof DirectoryProperty); - } - if (isDocument[ j ]) - { - assertTrue("Checking property " + j, - properties.get(j) instanceof DocumentProperty); - } - assertEquals("Checking property " + j, names[ j ], - (( Property ) properties.get(j)).getName()); - } - } - } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.property.PropertyFactory"); - junit.textui.TestRunner.run(TestPropertyFactory.class); - } + for (int j = 0; j < 64; j++) { + if (isNull[j]) { + assertNull("Checking property " + j, properties.get(j)); + } else { + assertNotNull("Checking property " + j, properties.get(j)); + if (isRoot[j]) { + assertTrue("Checking property " + j, properties.get(j) instanceof RootProperty); + } + if (isDirectory[j]) { + assertTrue("Checking property " + j, + properties.get(j) instanceof DirectoryProperty); + } + if (isDocument[j]) { + assertTrue("Checking property " + j, + properties.get(j) instanceof DocumentProperty); + } + assertEquals("Checking property " + j, names[j], ((Property) properties.get(j)) + .getName()); + } + } + } } diff --git a/src/testcases/org/apache/poi/poifs/property/TestPropertyTable.java b/src/testcases/org/apache/poi/poifs/property/TestPropertyTable.java index 008504fb00..52e4aafc19 100644 --- a/src/testcases/org/apache/poi/poifs/property/TestPropertyTable.java +++ b/src/testcases/org/apache/poi/poifs/property/TestPropertyTable.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,2635 +14,459 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.property; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Iterator; -import java.util.*; - -import junit.framework.*; +import junit.framework.AssertionFailedError; +import junit.framework.TestCase; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.storage.BlockAllocationTableReader; +import org.apache.poi.poifs.storage.HeaderBlock; import org.apache.poi.poifs.storage.RawDataBlockList; +import org.apache.poi.poifs.storage.RawDataUtil; /** * Class to test PropertyTable functionality * * @author Marc Johnson */ +public final class TestPropertyTable extends TestCase { -public class TestPropertyTable - extends TestCase -{ + private static void confirmBlockEncoding(String[] expectedDataHexDumpLines, PropertyTable table) { + byte[] expectedData = RawDataUtil.decode(expectedDataHexDumpLines); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + try { + table.writeBlocks(stream); + } catch (IOException e) { + throw new RuntimeException(e); + } + byte[] output = stream.toByteArray(); - /** - * Constructor TestPropertyTable - * - * @param name - */ + assertEquals("length check #1", expectedData.length, output.length); + for (int j = 0; j < expectedData.length; j++) { + assertEquals("content check #1: mismatch at offset " + j, expectedData[j], output[j]); + } + } - public TestPropertyTable(String name) - { - super(name); - } + /** + * Test PropertyTable + *

    + * Running individual tests of the PropertyTable methods, which is the + * traditional way to write unit tests (at least for me), seems somewhat + * useless in this case. Of greater relevance: if one follows the normal + * steps of creating a PropertyTable, and then checking the output, does it + * make sense? In other words, more of an integration test. + *

    + * So, the test consists of creating a PropertyTable instance, adding three + * DocumentProperty instances to it, and then getting the output (including + * the preWrite phase first), and comparing it against a real property table + * extracted from a file known to be acceptable to Excel. + */ + public void testWriterPropertyTable() throws IOException { - /** - * Test PropertyTable - *

    - * Running individual tests of the PropertyTable methods, which is - * the traditional way to write unit tests (at least for me), - * seems somewhat useless in this case. Of greater relevance: if - * one follows the normal steps of creating a PropertyTable, and - * then checking the output, does it make sense? In other words, - * more of an integration test. - *

    - * So, the test consists of creating a PropertyTable instance, - * adding three DocumentProperty instances to it, and then getting - * the output (including the preWrite phase first), and comparing - * it against a real property table extracted from a file known to - * be acceptable to Excel. - * - * @exception IOException - */ + // create the PropertyTable + HeaderBlock headerBlock = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + PropertyTable table = new PropertyTable(headerBlock); - public void testWriterPropertyTable() - throws IOException - { + // create three DocumentProperty instances and add them to the + // PropertyTable + DocumentProperty workbook = new DocumentProperty("Workbook", 0x00046777); - // create the PropertyTable - PropertyTable table = new PropertyTable(); + workbook.setStartBlock(0); + DocumentProperty summary1 = new DocumentProperty("\005SummaryInformation", 0x00001000); - // create three DocumentProperty instances and add them to the - // PropertyTable - DocumentProperty workbook = new DocumentProperty("Workbook", - 0x00046777); + summary1.setStartBlock(0x00000234); + DocumentProperty summary2 = new DocumentProperty("\005DocumentSummaryInformation", + 0x00001000); - workbook.setStartBlock(0); - DocumentProperty summary1 = - new DocumentProperty("\005SummaryInformation", 0x00001000); + summary2.setStartBlock(0x0000023C); + table.addProperty(workbook); + RootProperty root = table.getRoot(); - summary1.setStartBlock(0x00000234); - DocumentProperty summary2 = - new DocumentProperty("\005DocumentSummaryInformation", - 0x00001000); + root.addChild(workbook); + table.addProperty(summary1); + root = table.getRoot(); + root.addChild(summary1); + table.addProperty(summary2); + root = table.getRoot(); + root.addChild(summary2); + table.preWrite(); - summary2.setStartBlock(0x0000023C); - table.addProperty(workbook); - RootProperty root = table.getRoot(); + String[] testblock = { + "52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 05 01 FF FF FF FF FF FF FF FF 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "57 00 6F 00 72 00 6B 00 62 00 6F 00 6F 00 6B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "12 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 77 67 04 00 00 00 00 00", + "05 00 53 00 75 00 6D 00 6D 00 61 00 72 00 79 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00", + "69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 01 00 00 00 03 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 34 02 00 00 00 10 00 00 00 00 00 00", + "05 00 44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 53 00 75 00 6D 00 6D 00 61 00 72 00 79 00", + "49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00", + "38 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 02 00 00 00 10 00 00 00 00 00 00", + }; + confirmBlockEncoding(testblock, table); - root.addChild(workbook); - table.addProperty(summary1); - root = table.getRoot(); - root.addChild(summary1); - table.addProperty(summary2); - root = table.getRoot(); - root.addChild(summary2); - table.preWrite(); - ByteArrayOutputStream stream = new ByteArrayOutputStream(512); - byte[] testblock = - { - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6f, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x45, ( byte ) 0x00, - ( byte ) 0x6e, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x01, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xfe, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x57, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6b, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6f, ( byte ) 0x00, ( byte ) 0x6b, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x77, ( byte ) 0x67, ( byte ) 0x04, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x6d, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6e, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6e, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x34, ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x6f, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6e, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x6d, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6e, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6e, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x38, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3c, ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00 - }; + table.removeProperty(summary1); + root = table.getRoot(); + root.deleteChild(summary1); + table.preWrite(); - table.writeBlocks(stream); - byte[] output = stream.toByteArray(); + String[] testblock2 = { + "52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 05 01 FF FF FF FF FF FF FF FF 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "57 00 6F 00 72 00 6B 00 62 00 6F 00 6F 00 6B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "12 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 77 67 04 00 00 00 00 00", + "05 00 44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 53 00 75 00 6D 00 6D 00 61 00 72 00 79 00", + "49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00", + "38 00 02 01 01 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 02 00 00 00 10 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + }; + confirmBlockEncoding(testblock2, table); - assertEquals("length check #1", testblock.length, output.length); - for (int j = 0; j < testblock.length; j++) - { - assertEquals("content check #1: mismatch at offset " + j, - testblock[ j ], output[ j ]); - } - table.removeProperty(summary1); - root = table.getRoot(); - root.deleteChild(summary1); - table.preWrite(); - stream = new ByteArrayOutputStream(512); - byte[] testblock2 = - { - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6f, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x45, ( byte ) 0x00, - ( byte ) 0x6e, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x01, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xfe, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x57, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6b, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6f, ( byte ) 0x00, ( byte ) 0x6b, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x77, ( byte ) 0x67, ( byte ) 0x04, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x6f, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6e, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x6d, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6e, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6e, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x38, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3c, ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00 - }; + table.addProperty(summary1); + root = table.getRoot(); + root.addChild(summary1); + table.preWrite(); - table.writeBlocks(stream); - output = stream.toByteArray(); - assertEquals("length check #2", testblock2.length, output.length); - for (int j = 0; j < testblock2.length; j++) - { - assertEquals("content check #2: mismatch at offset " + j, - testblock2[ j ], output[ j ]); - } - table.addProperty(summary1); - root = table.getRoot(); - root.addChild(summary1); - table.preWrite(); - stream = new ByteArrayOutputStream(512); - byte[] testblock3 = - { - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6f, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x45, ( byte ) 0x00, - ( byte ) 0x6e, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x01, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xfe, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x57, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6b, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6f, ( byte ) 0x00, ( byte ) 0x6b, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x77, ( byte ) 0x67, ( byte ) 0x04, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x6f, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6e, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x6d, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6e, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6e, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x38, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3c, ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x6d, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6e, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6d, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6f, ( byte ) 0x00, - ( byte ) 0x6e, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, ( byte ) 0xff, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x34, ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00 - }; + String[] testblock3 = { + "52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 05 01 FF FF FF FF FF FF FF FF 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00", + "57 00 6F 00 72 00 6B 00 62 00 6F 00 6F 00 6B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "12 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 77 67 04 00 00 00 00 00", + "05 00 44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 53 00 75 00 6D 00 6D 00 61 00 72 00 79 00", + "49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00", + "38 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 02 00 00 00 10 00 00 00 00 00 00", + "05 00 53 00 75 00 6D 00 6D 00 61 00 72 00 79 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00", + "69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 01 00 00 00 02 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 34 02 00 00 00 10 00 00 00 00 00 00", + }; + confirmBlockEncoding(testblock3, table); + } - table.writeBlocks(stream); - output = stream.toByteArray(); - assertEquals("length check #3", testblock3.length, output.length); - for (int j = 0; j < testblock3.length; j++) - { - assertEquals("content check #3: mismatch at offset " + j, - testblock3[ j ], output[ j ]); - } - } + public void testReadingConstructor() throws IOException { - /** - * test reading constructor - * - * @exception IOException - */ + // first, we need the raw data blocks + String[] raw_data_array = { + "52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 05 01 FF FF FF FF FF FF FF FF 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 80 07 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 01 01 FF FF FF FF FF FF FF FF 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "46 00 55 00 44 00 20 00 47 00 72 00 69 00 64 00 20 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00", + "74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2A 00 02 01 FF FF FF FF 0E 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "44 00 6F 00 75 00 62 00 6C 00 65 00 20 00 44 00 65 00 61 00 6C 00 69 00 6E 00 67 00 20 00 49 00", + "6E 00 64 00 69 00 63 00 61 00 74 00 6F 00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "32 00 02 01 FF FF FF FF 09 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00", + "43 00 68 00 69 00 6C 00 64 00 20 00 50 00 65 00 72 00 63 00 65 00 6E 00 74 00 61 00 67 00 65 00", + "20 00 50 00 65 00 72 00 6D 00 69 00 74 00 74 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00", + "36 00 02 01 FF FF FF FF 07 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 00 00 00 00", + "43 00 61 00 6E 00 63 00 65 00 6C 00 6C 00 61 00 74 00 69 00 6F 00 6E 00 20 00 46 00 65 00 65 00", + "20 00 46 00 69 00 78 00 65 00 64 00 20 00 56 00 61 00 6C 00 75 00 65 00 00 00 00 00 00 00 00 00", + "3A 00 02 01 FF FF FF FF 06 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00", + "55 00 6D 00 62 00 72 00 65 00 6C 00 6C 00 61 00 20 00 4C 00 69 00 6E 00 6B 00 73 00 20 00 61 00", + "6E 00 64 00 20 00 50 00 61 00 73 00 73 00 65 00 6E 00 67 00 65 00 72 00 73 00 00 00 00 00 00 00", + "3C 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "43 00 61 00 6E 00 63 00 65 00 6C 00 6C 00 61 00 74 00 69 00 6F 00 6E 00 20 00 46 00 65 00 65 00", + "20 00 50 00 65 00 72 00 63 00 65 00 6E 00 74 00 61 00 67 00 65 00 00 00 00 00 00 00 00 00 00 00", + "38 00 02 01 FF FF FF FF 05 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00", + "49 00 6E 00 66 00 61 00 6E 00 74 00 20 00 44 00 69 00 73 00 63 00 6F 00 75 00 6E 00 74 00 20 00", + "50 00 65 00 72 00 6D 00 69 00 74 00 74 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "34 00 02 01 FF FF FF FF 04 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00", + "43 00 61 00 6E 00 63 00 65 00 6C 00 6C 00 61 00 74 00 69 00 6F 00 6E 00 20 00 46 00 65 00 65 00", + "20 00 43 00 75 00 72 00 72 00 65 00 6E 00 63 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "34 00 02 01 FF FF FF FF 08 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 07 00 00 00 00 00 00 00", + "4F 00 75 00 74 00 62 00 6F 00 75 00 6E 00 64 00 20 00 54 00 72 00 61 00 76 00 65 00 6C 00 20 00", + "44 00 61 00 74 00 65 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2C 00 02 01 FF FF FF FF 0B 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 21 00 00 00 00 00 00 00", + "42 00 75 00 73 00 69 00 6E 00 65 00 73 00 73 00 20 00 4A 00 75 00 73 00 74 00 69 00 66 00 69 00", + "63 00 61 00 74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2E 00 02 01 FF FF FF FF 03 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 04 00 00 00 00 00 00 00", + "49 00 6E 00 66 00 61 00 6E 00 74 00 20 00 44 00 69 00 73 00 63 00 6F 00 75 00 6E 00 74 00 20 00", + "56 00 61 00 6C 00 75 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2C 00 02 01 FF FF FF FF 0D 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 04 00 00 00 00 00 00 00", + "4F 00 74 00 68 00 65 00 72 00 20 00 43 00 61 00 72 00 72 00 69 00 65 00 72 00 20 00 53 00 65 00", + "63 00 74 00 6F 00 72 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2C 00 02 01 FF FF FF FF 0A 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00 00 04 00 00 00 00 00 00 00", + "4E 00 75 00 6D 00 62 00 65 00 72 00 20 00 6F 00 66 00 20 00 50 00 61 00 73 00 73 00 65 00 6E 00", + "67 00 65 00 72 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2A 00 02 01 FF FF FF FF 0C 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 04 00 00 00 00 00 00 00", + "53 00 61 00 6C 00 65 00 73 00 20 00 41 00 72 00 65 00 61 00 20 00 43 00 6F 00 64 00 65 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "20 00 02 01 1C 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 00 00 00 04 00 00 00 00 00 00 00", + "4F 00 74 00 68 00 65 00 72 00 20 00 52 00 65 00 66 00 75 00 6E 00 64 00 20 00 54 00 65 00 78 00", + "74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "24 00 02 01 17 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00 00 04 00 00 00 00 00 00 00", + "4D 00 61 00 78 00 69 00 6D 00 75 00 6D 00 20 00 53 00 74 00 61 00 79 00 20 00 50 00 65 00 72 00", + "69 00 6F 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 FF FF FF FF 14 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0D 00 00 00 04 00 00 00 00 00 00 00", + "4E 00 65 00 74 00 20 00 52 00 65 00 6D 00 69 00 74 00 20 00 50 00 65 00 72 00 6D 00 69 00 74 00", + "74 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 FF FF FF FF 13 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00 00 00 04 00 00 00 00 00 00 00", + "50 00 65 00 72 00 63 00 65 00 6E 00 74 00 61 00 67 00 65 00 20 00 6F 00 66 00 20 00 59 00 69 00", + "65 00 6C 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 FF FF FF FF 02 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F 00 00 00 04 00 00 00 00 00 00 00", + "4E 00 61 00 74 00 75 00 72 00 65 00 20 00 6F 00 66 00 20 00 56 00 61 00 72 00 69 00 61 00 74 00", + "69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 FF FF FF FF 12 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 50 00 00 00 00 00 00 00", + "46 00 55 00 44 00 20 00 47 00 72 00 69 00 64 00 20 00 44 00 69 00 6D 00 65 00 6E 00 73 00 69 00", + "6F 00 6E 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 10 00 00 00 11 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 00 00 04 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 44 00 65 00 73 00 63 00 72 00 69 00 70 00 74 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 19 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 00 00 00 09 00 00 00 00 00 00 00", + "54 00 52 00 56 00 41 00 20 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 18 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 04 00 00 00 00 00 00 00", + "50 00 72 00 6F 00 72 00 61 00 74 00 65 00 20 00 43 00 6F 00 6D 00 6D 00 65 00 6E 00 74 00 73 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 16 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "43 00 6F 00 6D 00 6D 00 69 00 73 00 73 00 69 00 6F 00 6E 00 20 00 56 00 61 00 6C 00 75 00 65 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 0F 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 00 00 00 04 00 00 00 00 00 00 00", + "4D 00 61 00 78 00 69 00 6D 00 75 00 6D 00 20 00 53 00 74 00 61 00 79 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1A 00 02 01 20 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 16 00 00 00 05 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 43 00 75 00 72 00 72 00 65 00 6E 00 63 00 79 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1C 00 02 01 1D 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 07 00 00 00 00 00 00 00", + "43 00 6F 00 6E 00 73 00 6F 00 72 00 74 00 69 00 61 00 20 00 43 00 6F 00 64 00 65 00 73 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "20 00 02 01 1B 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "42 00 75 00 73 00 69 00 6E 00 65 00 73 00 73 00 20 00 54 00 79 00 70 00 65 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1C 00 02 01 1A 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 04 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 54 00 79 00 70 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 01 23 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 19 00 00 00 04 00 00 00 00 00 00 00", + "53 00 75 00 72 00 63 00 68 00 61 00 72 00 67 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 01 21 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1A 00 00 00 04 00 00 00 00 00 00 00", + "41 00 67 00 65 00 6E 00 74 00 73 00 20 00 4E 00 61 00 6D 00 65 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "18 00 02 01 1F 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 00 00 00 04 00 00 00 00 00 00 00", + "46 00 61 00 72 00 65 00 20 00 54 00 79 00 70 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 01 1E 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1C 00 00 00 04 00 00 00 00 00 00 00", + "53 00 75 00 62 00 20 00 44 00 65 00 61 00 6C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "12 00 02 01 24 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1D 00 00 00 04 00 00 00 00 00 00 00", + "41 00 4C 00 43 00 20 00 43 00 6F 00 64 00 65 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 01 22 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "52 00 65 00 6D 00 61 00 72 00 6B 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "10 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 03 00 47 42 50 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 1D 00 28 41 29 31 36 2D 4F 63 74 2D 32 30 30 31 20 74 6F 20 31 36 2D 4F 63 74 2D 32 30 30", + "31 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 01 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00", + "02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00", + "02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 18 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 05 00 6A 61 6D 65 73 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 01 00 31 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 03 00 47 42 50 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "11 00 00 00 FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00", + "09 00 00 00 FE FF FF FF 0B 00 00 00 0C 00 00 00 0D 00 00 00 FE FF FF FF FE FF FF FF FE FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + }; - public void testReadingConstructor() - throws IOException - { + RawDataBlockList data_blocks = new RawDataBlockList(new ByteArrayInputStream(RawDataUtil + .decode(raw_data_array)), POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + int[] bat_array = { 15 }; - // first, we need the raw data blocks - byte[] raw_data_array = - { - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x45, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x80, ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x15, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x46, ( byte ) 0x00, ( byte ) 0x55, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x32, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x09, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x68, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x36, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x78, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x56, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x55, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4C, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x6B, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x38, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x34, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x34, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x76, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x21, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4A, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2E, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x56, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x09, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x78, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x24, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x17, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x78, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x13, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x59, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x56, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x46, ( byte ) 0x00, ( byte ) 0x55, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x11, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x19, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x13, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x09, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x54, ( byte ) 0x00, ( byte ) 0x52, ( byte ) 0x00, - ( byte ) 0x56, ( byte ) 0x00, ( byte ) 0x41, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x18, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x56, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x0F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x15, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x78, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x17, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x18, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x23, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x19, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x21, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4E, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x18, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x46, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x24, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x4C, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6B, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x42, ( byte ) 0x50, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x1D, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x41, ( byte ) 0x29, ( byte ) 0x31, - ( byte ) 0x36, ( byte ) 0x2D, ( byte ) 0x4F, ( byte ) 0x63, - ( byte ) 0x74, ( byte ) 0x2D, ( byte ) 0x32, ( byte ) 0x30, - ( byte ) 0x30, ( byte ) 0x31, ( byte ) 0x20, ( byte ) 0x74, - ( byte ) 0x6F, ( byte ) 0x20, ( byte ) 0x31, ( byte ) 0x36, - ( byte ) 0x2D, ( byte ) 0x4F, ( byte ) 0x63, ( byte ) 0x74, - ( byte ) 0x2D, ( byte ) 0x32, ( byte ) 0x30, ( byte ) 0x30, - ( byte ) 0x31, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x18, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x00, - ( byte ) 0x6A, ( byte ) 0x61, ( byte ) 0x6D, ( byte ) 0x65, - ( byte ) 0x73, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x00, - ( byte ) 0x31, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x42, ( byte ) 0x50, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x11, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x09, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF - }; - RawDataBlockList data_blocks = - new RawDataBlockList(new ByteArrayInputStream(raw_data_array), POIFSConstants.BIG_BLOCK_SIZE); - int[] bat_array = - { - 15 - }; + // need to initialize the block list with a block allocation + // table + new BlockAllocationTableReader( + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 1, bat_array, 0, -2, data_blocks); - // need to initialize the block list with a block allocation - // table - new BlockAllocationTableReader(1, bat_array, 0, -2, data_blocks); + // Fake up a header + HeaderBlock header_block = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + header_block.setPropertyStart(0); + + // get property table from the document + PropertyTable table = new PropertyTable(header_block, data_blocks); - // get property table from the document - PropertyTable table = new PropertyTable(0, data_blocks); + assertEquals(30 * 64, table.getRoot().getSize()); + int count = 0; + Property child = null; + Iterator iter = table.getRoot().getChildren(); - assertEquals(30 * 64, table.getRoot().getSize()); - int count = 0; - Property child = null; - Iterator iter = table.getRoot().getChildren(); - - while (iter.hasNext()) - { - child = ( Property ) iter.next(); - ++count; - } - assertEquals(1, count); - assertTrue(child.isDirectory()); - iter = (( DirectoryProperty ) child).getChildren(); - count = 0; - while (iter.hasNext()) - { - iter.next(); - ++count; - } - assertEquals(35, count); - } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.property.PropertyTable"); - junit.textui.TestRunner.run(TestPropertyTable.class); - } + while (iter.hasNext()) { + child = (Property) iter.next(); + ++count; + } + if (child == null) { + throw new AssertionFailedError("no children found"); + } + assertEquals(1, count); + assertTrue(child.isDirectory()); + iter = ((DirectoryProperty) child).getChildren(); + count = 0; + while (iter.hasNext()) { + iter.next(); + ++count; + } + assertEquals(35, count); + } } diff --git a/src/testcases/org/apache/poi/poifs/property/TestRootProperty.java b/src/testcases/org/apache/poi/poifs/property/TestRootProperty.java index 6ba5da07a5..46c073096b 100644 --- a/src/testcases/org/apache/poi/poifs/property/TestRootProperty.java +++ b/src/testcases/org/apache/poi/poifs/property/TestRootProperty.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,210 +14,118 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.property; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; -import java.util.*; - -import junit.framework.*; +import junit.framework.TestCase; import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.storage.RawDataUtil; /** * Class to test RootProperty functionality * * @author Marc Johnson */ +public final class TestRootProperty extends TestCase { + private RootProperty _property; + private byte[] _testblock; -public class TestRootProperty - extends TestCase -{ - private RootProperty _property; - private byte[] _testblock; + public void testConstructor() throws IOException { + createBasicRootProperty(); + verifyProperty(); + } - /** - * Constructor TestRootProperty - * - * @param name - */ + private void createBasicRootProperty() { + _property = new RootProperty(); + _testblock = new byte[128]; + int index = 0; - public TestRootProperty(String name) - { - super(name); - } + for (; index < 0x40; index++) { + _testblock[index] = (byte) 0; + } + String name = "Root Entry"; + int limit = Math.min(31, name.length()); - /** - * Test constructing RootProperty - * - * @exception IOException - */ + _testblock[index++] = (byte) (2 * (limit + 1)); + _testblock[index++] = (byte) 0; + _testblock[index++] = (byte) 5; + _testblock[index++] = (byte) 1; + for (; index < 0x50; index++) { + _testblock[index] = (byte) 0xff; + } + for (; index < 0x74; index++) { + _testblock[index] = (byte) 0; + } + _testblock[index++] = (byte) POIFSConstants.END_OF_CHAIN; + for (; index < 0x78; index++) { + _testblock[index] = (byte) 0xff; + } + for (; index < 0x80; index++) { + _testblock[index] = (byte) 0; + } + byte[] name_bytes = name.getBytes(); - public void testConstructor() - throws IOException - { - createBasicRootProperty(); - verifyProperty(); - } + for (index = 0; index < limit; index++) { + _testblock[index * 2] = name_bytes[index]; + } + } - private void createBasicRootProperty() - { - _property = new RootProperty(); - _testblock = new byte[ 128 ]; - int index = 0; + private void verifyProperty() throws IOException { + ByteArrayOutputStream stream = new ByteArrayOutputStream(512); - for (; index < 0x40; index++) - { - _testblock[ index ] = ( byte ) 0; - } - String name = "Root Entry"; - int limit = Math.min(31, name.length()); + _property.writeData(stream); + byte[] output = stream.toByteArray(); - _testblock[ index++ ] = ( byte ) (2 * (limit + 1)); - _testblock[ index++ ] = ( byte ) 0; - _testblock[ index++ ] = ( byte ) 5; - _testblock[ index++ ] = ( byte ) 1; - for (; index < 0x50; index++) - { - _testblock[ index ] = ( byte ) 0xff; - } - for (; index < 0x74; index++) - { - _testblock[ index ] = ( byte ) 0; - } - _testblock[ index++ ] = ( byte ) POIFSConstants.END_OF_CHAIN; - for (; index < 0x78; index++) - { - _testblock[ index ] = ( byte ) 0xff; - } - for (; index < 0x80; index++) - { - _testblock[ index ] = ( byte ) 0; - } - byte[] name_bytes = name.getBytes(); + assertEquals(_testblock.length, output.length); + for (int j = 0; j < _testblock.length; j++) { + assertEquals("mismatch at offset " + j, _testblock[j], output[j]); + } + } - for (index = 0; index < limit; index++) - { - _testblock[ index * 2 ] = name_bytes[ index ]; - } - } + public void testSetSize() { + for (int j = 0; j < 10; j++) { + createBasicRootProperty(); + _property.setSize(j); + assertEquals("trying block count of " + j, j * 64, _property.getSize()); + } + } - private void verifyProperty() - throws IOException - { - ByteArrayOutputStream stream = new ByteArrayOutputStream(512); + public void testReadingConstructor() { + String[] input = { + "52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 05 01 FF FF FF FF FF FF FF FF 02 00 00 00 20 08 02 00 00 00 00 00 C0 00 00 00 00 00 00 46", + "00 00 00 00 00 00 00 00 00 00 00 00 C0 5C E8 23 9E 6B C1 01 FE FF FF FF 00 00 00 00 00 00 00 00", + }; + verifyReadingProperty(0, RawDataUtil.decode(input), 0, "Root Entry", + "{00020820-0000-0000-C000-000000000046}"); + } - _property.writeData(stream); - byte[] output = stream.toByteArray(); + private void verifyReadingProperty(int index, byte[] input, int offset, String name, + String sClsId) { + RootProperty property = new RootProperty(index, input, offset); + ByteArrayOutputStream stream = new ByteArrayOutputStream(128); + byte[] expected = new byte[128]; - assertEquals(_testblock.length, output.length); - for (int j = 0; j < _testblock.length; j++) - { - assertEquals("mismatch at offset " + j, _testblock[ j ], - output[ j ]); - } - } + System.arraycopy(input, offset, expected, 0, 128); + try { + property.writeData(stream); + } catch (IOException e) { + throw new RuntimeException(e); + } + byte[] output = stream.toByteArray(); - /** - * test setSize - */ - - public void testSetSize() - { - for (int j = 0; j < 10; j++) - { - createBasicRootProperty(); - _property.setSize(j); - assertEquals("trying block count of " + j, j * 64, - _property.getSize()); - } - } - - /** - * Test reading constructor - * - * @exception IOException - */ - - public void testReadingConstructor() - throws IOException - { - byte[] input = - { - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x45, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x08, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xC0, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x46, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xC0, ( byte ) 0x5C, ( byte ) 0xE8, ( byte ) 0x23, - ( byte ) 0x9E, ( byte ) 0x6B, ( byte ) 0xC1, ( byte ) 0x01, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00 - }; - - verifyReadingProperty(0, input, 0, "Root Entry", "{00020820-0000-0000-C000-000000000046}"); - } - - private void verifyReadingProperty(int index, byte [] input, int offset, - String name, String sClsId) - throws IOException - { - RootProperty property = new RootProperty(index, input, - offset); - ByteArrayOutputStream stream = new ByteArrayOutputStream(128); - byte[] expected = new byte[ 128 ]; - - System.arraycopy(input, offset, expected, 0, 128); - property.writeData(stream); - byte[] output = stream.toByteArray(); - - assertEquals(128, output.length); - for (int j = 0; j < 128; j++) - { - assertEquals("mismatch at offset " + j, expected[ j ], - output[ j ]); - } - assertEquals(index, property.getIndex()); - assertEquals(name, property.getName()); - assertTrue(!property.getChildren().hasNext()); - assertEquals(property.getStorageClsid().toString(), sClsId); - } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.property.RootProperty"); - junit.textui.TestRunner.run(TestRootProperty.class); - } + assertEquals(128, output.length); + for (int j = 0; j < 128; j++) { + assertEquals("mismatch at offset " + j, expected[j], output[j]); + } + assertEquals(index, property.getIndex()); + assertEquals(name, property.getName()); + assertTrue(!property.getChildren().hasNext()); + assertEquals(property.getStorageClsid().toString(), sClsId); + } } diff --git a/src/testcases/org/apache/poi/poifs/storage/AllPOIFSStorageTests.java b/src/testcases/org/apache/poi/poifs/storage/AllPOIFSStorageTests.java index 8c15d389e3..46011916ee 100755 --- a/src/testcases/org/apache/poi/poifs/storage/AllPOIFSStorageTests.java +++ b/src/testcases/org/apache/poi/poifs/storage/AllPOIFSStorageTests.java @@ -26,22 +26,22 @@ import junit.framework.TestSuite; */ public final class AllPOIFSStorageTests { - public static Test suite() { - TestSuite result = new TestSuite("Tests for org.apache.poi.poifs.storage"); - result.addTestSuite(TestBATBlock.class); - result.addTestSuite(TestBlockAllocationTableReader.class); - result.addTestSuite(TestBlockAllocationTableWriter.class); - result.addTestSuite(TestBlockListImpl.class); - result.addTestSuite(TestDocumentBlock.class); - result.addTestSuite(TestHeaderBlockReader.class); - result.addTestSuite(TestHeaderBlockWriter.class); - result.addTestSuite(TestPropertyBlock.class); - result.addTestSuite(TestRawDataBlock.class); - result.addTestSuite(TestRawDataBlockList.class); - result.addTestSuite(TestSmallBlockTableReader.class); - result.addTestSuite(TestSmallBlockTableWriter.class); - result.addTestSuite(TestSmallDocumentBlock.class); - result.addTestSuite(TestSmallDocumentBlockList.class); - return result; - } + public static Test suite() { + TestSuite result = new TestSuite(AllPOIFSStorageTests.class.getName()); + result.addTestSuite(TestBATBlock.class); + result.addTestSuite(TestBlockAllocationTableReader.class); + result.addTestSuite(TestBlockAllocationTableWriter.class); + result.addTestSuite(TestBlockListImpl.class); + result.addTestSuite(TestDocumentBlock.class); + result.addTestSuite(TestHeaderBlockReading.class); + result.addTestSuite(TestHeaderBlockWriting.class); + result.addTestSuite(TestPropertyBlock.class); + result.addTestSuite(TestRawDataBlock.class); + result.addTestSuite(TestRawDataBlockList.class); + result.addTestSuite(TestSmallBlockTableReader.class); + result.addTestSuite(TestSmallBlockTableWriter.class); + result.addTestSuite(TestSmallDocumentBlock.class); + result.addTestSuite(TestSmallDocumentBlockList.class); + return result; + } } diff --git a/src/testcases/org/apache/poi/poifs/storage/LocalRawDataBlockList.java b/src/testcases/org/apache/poi/poifs/storage/LocalRawDataBlockList.java index 21049ebf18..42a9d2c5f5 100644 --- a/src/testcases/org/apache/poi/poifs/storage/LocalRawDataBlockList.java +++ b/src/testcases/org/apache/poi/poifs/storage/LocalRawDataBlockList.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,42 +14,32 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + import org.apache.poi.poifs.common.POIFSConstants; -import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianConsts; -import java.io.*; - -import java.util.*; - /** * Class LocalRawDataBlockList * * @author Marc Johnson(mjohnson at apache dot org) */ - -public class LocalRawDataBlockList - extends RawDataBlockList -{ - private List _list; +public final class LocalRawDataBlockList extends RawDataBlockList { + private List _list; private RawDataBlock[] _array; - /** - * Constructor LocalRawDataBlockList - * - * @exception IOException - */ - public LocalRawDataBlockList() throws IOException { - super(new ByteArrayInputStream(new byte[ 0 ]), POIFSConstants.BIG_BLOCK_SIZE); - _list = new ArrayList(); + super(new ByteArrayInputStream(new byte[ 0 ]), POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + _list = new ArrayList(); _array = null; } @@ -60,10 +49,7 @@ public class LocalRawDataBlockList * @param start index of first BAT block * @param end index of last BAT block * @param chain index of next XBAT block - * - * @exception IOException */ - public void createNewXBATBlock(final int start, final int end, final int chain) throws IOException @@ -89,10 +75,7 @@ public class LocalRawDataBlockList * create a BAT block and add it to the list * * @param start_index initial index for the block list - * - * @exception IOException */ - public void createNewBATBlock(final int start_index) throws IOException { @@ -124,10 +107,7 @@ public class LocalRawDataBlockList * fill the list with dummy blocks * * @param count of blocks - * - * @exception IOException */ - public void fill(final int count) throws IOException { @@ -144,7 +124,6 @@ public class LocalRawDataBlockList * * @param block new block to add */ - public void add(RawDataBlock block) { _list.add(block); @@ -156,10 +135,7 @@ public class LocalRawDataBlockList * @param index of block to be removed * * @return desired block - * - * @exception IOException */ - public ListManagedBlock remove(final int index) throws IOException { @@ -189,7 +165,6 @@ public class LocalRawDataBlockList * @param index the index of the specified block; if the index is * out of range, that's ok */ - public void zap(final int index) { ensureArrayExists(); @@ -203,7 +178,11 @@ public class LocalRawDataBlockList { if (_array == null) { - _array = ( RawDataBlock [] ) _list.toArray(new RawDataBlock[ 0 ]); + _array = _list.toArray(new RawDataBlock[ 0 ]); } } + + public int blockCount() { + return _list.size(); + } } diff --git a/src/testcases/org/apache/poi/poifs/storage/RawDataUtil.java b/src/testcases/org/apache/poi/poifs/storage/RawDataUtil.java new file mode 100644 index 0000000000..d69fd681cf --- /dev/null +++ b/src/testcases/org/apache/poi/poifs/storage/RawDataUtil.java @@ -0,0 +1,86 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.poifs.storage; + +import java.io.ByteArrayOutputStream; +import java.util.Arrays; + +import org.apache.poi.util.HexDump; +import org.apache.poi.util.HexRead; + +/** + * Test utility class.
    + * + * Creates raw byte[] data from hex-dump String arrays. + * + * @author Josh Micich + */ +public final class RawDataUtil { + + public static byte[] decode(String[] hexDataLines) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(hexDataLines.length * 32 + 32); + + for (int i = 0; i < hexDataLines.length; i++) { + byte[] lineData = HexRead.readFromString(hexDataLines[i]); + baos.write(lineData, 0, lineData.length); + } + return baos.toByteArray(); + } + + /** + * Development time utility method.
    + * Transforms a byte array into hex-dump String lines in java source code format. + */ + public static void dumpData(byte[] data) { + int i=0; + System.out.println("String[] hexDataLines = {"); + System.out.print("\t\""); + while(true) { + char[] cc = HexDump.byteToHex(data[i]); + System.out.print(cc[2]); + System.out.print(cc[3]); + i++; + if (i>=data.length) { + break; + } + if (i % 32 == 0) { + System.out.println("\","); + System.out.print("\t\""); + } else { + System.out.print(" "); + } + } + System.out.println("\","); + System.out.println("};"); + } + + /** + * Development time utility method.
    + * Confirms that the specified byte array is equivalent to the hex-dump String lines. + */ + public static void confirmEqual(byte[] expected, String[] hexDataLines) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(hexDataLines.length * 32 + 32); + + for (int i = 0; i < hexDataLines.length; i++) { + byte[] lineData = HexRead.readFromString(hexDataLines[i]); + baos.write(lineData, 0, lineData.length); + } + if (!Arrays.equals(expected, baos.toByteArray())) { + throw new RuntimeException("different"); + } + } +} diff --git a/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java b/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java index c39454d54a..758d559542 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,78 +14,62 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -import java.util.*; +import org.apache.poi.poifs.common.POIFSConstants; -import junit.framework.*; +import junit.framework.TestCase; /** * Class to test BATBlock functionality * * @author Marc Johnson */ - -public class TestBATBlock - extends TestCase -{ - - /** - * Constructor TestBATBlock - * - * @param name - */ - - public TestBATBlock(String name) - { - super(name); - } +public final class TestBATBlock extends TestCase { /** * Test the createBATBlocks method. The test involves setting up * various arrays of int's and ensuring that the correct number of * BATBlocks is created for each array, and that the data from * each array is correctly written to the BATBlocks. - * - * @exception IOException */ - - public void testCreateBATBlocks() - throws IOException - { + public void testCreateBATBlocks() throws IOException { // test 0 length array (basic sanity) - BATBlock[] rvalue = BATBlock.createBATBlocks(createTestArray(0)); + BATBlock[] rvalue = BATBlock.createBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(0)); assertEquals(0, rvalue.length); // test array of length 1 - rvalue = BATBlock.createBATBlocks(createTestArray(1)); + rvalue = BATBlock.createBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(1)); assertEquals(1, rvalue.length); verifyContents(rvalue, 1); // test array of length 127 - rvalue = BATBlock.createBATBlocks(createTestArray(127)); + rvalue = BATBlock.createBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(127)); assertEquals(1, rvalue.length); verifyContents(rvalue, 127); // test array of length 128 - rvalue = BATBlock.createBATBlocks(createTestArray(128)); + rvalue = BATBlock.createBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(128)); assertEquals(1, rvalue.length); verifyContents(rvalue, 128); // test array of length 129 - rvalue = BATBlock.createBATBlocks(createTestArray(129)); + rvalue = BATBlock.createBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(129)); assertEquals(2, rvalue.length); verifyContents(rvalue, 129); } - private int [] createTestArray(int count) - { + private static int[] createTestArray(int count) { int[] rvalue = new int[ count ]; for (int j = 0; j < count; j++) @@ -96,9 +79,7 @@ public class TestBATBlock return rvalue; } - private void verifyContents(BATBlock [] blocks, int entries) - throws IOException - { + private static void verifyContents(BATBlock[] blocks, int entries) throws IOException { byte[] expected = new byte[ 512 * blocks.length ]; Arrays.fill(expected, ( byte ) 0xFF); @@ -127,51 +108,40 @@ public class TestBATBlock } } - /** - * test createXBATBlocks - * - * @exception IOException - */ - - public void testCreateXBATBlocks() - throws IOException - { - + public void testCreateXBATBlocks() throws IOException { // test 0 length array (basic sanity) - BATBlock[] rvalue = BATBlock.createXBATBlocks(createTestArray(0), 1); + BATBlock[] rvalue = BATBlock.createXBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(0), 1); assertEquals(0, rvalue.length); // test array of length 1 - rvalue = BATBlock.createXBATBlocks(createTestArray(1), 1); + rvalue = BATBlock.createXBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(1), 1); assertEquals(1, rvalue.length); verifyXBATContents(rvalue, 1, 1); // test array of length 127 - rvalue = BATBlock.createXBATBlocks(createTestArray(127), 1); + rvalue = BATBlock.createXBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(127), 1); assertEquals(1, rvalue.length); verifyXBATContents(rvalue, 127, 1); // test array of length 128 - rvalue = BATBlock.createXBATBlocks(createTestArray(128), 1); + rvalue = BATBlock.createXBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(128), 1); assertEquals(2, rvalue.length); verifyXBATContents(rvalue, 128, 1); // test array of length 254 - rvalue = BATBlock.createXBATBlocks(createTestArray(254), 1); + rvalue = BATBlock.createXBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(254), 1); assertEquals(2, rvalue.length); verifyXBATContents(rvalue, 254, 1); // test array of length 255 - rvalue = BATBlock.createXBATBlocks(createTestArray(255), 1); + rvalue = BATBlock.createXBATBlocks(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, createTestArray(255), 1); assertEquals(3, rvalue.length); verifyXBATContents(rvalue, 255, 1); } - private void verifyXBATContents(BATBlock [] blocks, int entries, - int start_block) - throws IOException - { + private static void verifyXBATContents(BATBlock[] blocks, int entries, int start_block) + throws IOException { byte[] expected = new byte[ 512 * blocks.length ]; Arrays.fill(expected, ( byte ) 0xFF); @@ -220,65 +190,197 @@ public class TestBATBlock } } - /** - * test calculateXBATStorageRequirements - */ - - public void testCalculateXBATStorageRequirements() - { - int[] blockCounts = - { - 0, 1, 127, 128 - }; - int[] requirements = - { - 0, 1, 1, 2 - }; + public void testCalculateXBATStorageRequirements() { + int[] blockCounts = { 0, 1, 127, 128 }; + int[] requirements = { 0, 1, 1, 2 }; for (int j = 0; j < blockCounts.length; j++) { assertEquals( "requirement for " + blockCounts[ j ], requirements[ j ], - BATBlock.calculateXBATStorageRequirements(blockCounts[ j ])); + BATBlock.calculateXBATStorageRequirements(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, blockCounts[ j ])); } } - /** - * test entriesPerBlock - */ - - public void testEntriesPerBlock() - { - assertEquals(128, BATBlock.entriesPerBlock()); + public void testEntriesPerBlock() { + assertEquals(128, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS.getBATEntriesPerBlock()); } - - /** - * test entriesPerXBATBlock - */ - - public void testEntriesPerXBATBlock() - { - assertEquals(127, BATBlock.entriesPerXBATBlock()); + public void testEntriesPerXBATBlock() { + assertEquals(127, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS.getXBATEntriesPerBlock()); } - - /** - * test getXBATChainOffset - */ - - public void testGetXBATChainOffset() - { - assertEquals(508, BATBlock.getXBATChainOffset()); + public void testGetXBATChainOffset() { + assertEquals(508, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS.getNextXBATChainOffset()); } + + public void testCalculateMaximumSize() throws Exception { + // Zero fat blocks isn't technically valid, but it'd be header only + assertEquals( + 512, + BATBlock.calculateMaximumSize(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 0) + ); + assertEquals( + 4096, + BATBlock.calculateMaximumSize(POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS, 0) + ); + + // A single FAT block can address 128/1024 blocks + assertEquals( + 512 + 512*128, + BATBlock.calculateMaximumSize(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 1) + ); + assertEquals( + 4096 + 4096*1024, + BATBlock.calculateMaximumSize(POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS, 1) + ); + + assertEquals( + 512 + 4*512*128, + BATBlock.calculateMaximumSize(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 4) + ); + assertEquals( + 4096 + 4*4096*1024, + BATBlock.calculateMaximumSize(POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS, 4) + ); + + // One XBAT block holds 127/1023 individual BAT blocks, so they can address + // a fairly hefty amount of space themselves + // However, the BATs continue as before + assertEquals( + 512 + 109*512*128, + BATBlock.calculateMaximumSize(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 109) + ); + assertEquals( + 4096 + 109*4096*1024, + BATBlock.calculateMaximumSize(POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS, 109) + ); + + assertEquals( + 512 + 110*512*128, + BATBlock.calculateMaximumSize(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 110) + ); + assertEquals( + 4096 + 110*4096*1024, + BATBlock.calculateMaximumSize(POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS, 110) + ); + + assertEquals( + 512 + 112*512*128, + BATBlock.calculateMaximumSize(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 112) + ); + assertEquals( + 4096 + 112*4096*1024, + BATBlock.calculateMaximumSize(POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS, 112) + ); + } + + public void testGetBATBlockAndIndex() throws Exception { + HeaderBlock header = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + List blocks = new ArrayList(); + int offset; + + + // First, try a one BAT block file + header.setBATCount(1); + blocks.add( + BATBlock.createBATBlock(header.getBigBlockSize(), ByteBuffer.allocate(512)) + ); + + offset = 0; + assertEquals(0, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 1; + assertEquals(1, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 127; + assertEquals(127, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + + // Now go for one with multiple BAT blocks + header.setBATCount(2); + blocks.add( + BATBlock.createBATBlock(header.getBigBlockSize(), ByteBuffer.allocate(512)) + ); + + offset = 0; + assertEquals(0, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 127; + assertEquals(127, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 128; + assertEquals(0, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(1, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 129; + assertEquals(1, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(1, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + + // The XBAT count makes no difference, as we flatten in memory + header.setBATCount(1); + header.setXBATCount(1); + offset = 0; + assertEquals(0, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 126; + assertEquals(126, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 127; + assertEquals(127, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 128; + assertEquals(0, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(1, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 129; + assertEquals(1, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(1, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + + // Check with the bigger block size too + header = new HeaderBlock(POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS); + + offset = 0; + assertEquals(0, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 1022; + assertEquals(1022, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 1023; + assertEquals(1023, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 1024; + assertEquals(0, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(1, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println("Testing org.apache.poi.poifs.storage.BATBlock"); - junit.textui.TestRunner.run(TestBATBlock.class); + // Biggr block size, back to real BATs + header.setBATCount(2); + + offset = 0; + assertEquals(0, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 1022; + assertEquals(1022, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 1023; + assertEquals(1023, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(0, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); + + offset = 1024; + assertEquals(0, BATBlock.getBATBlockAndIndex(offset, header, blocks).getIndex()); + assertEquals(1, blocks.indexOf( BATBlock.getBATBlockAndIndex(offset, header, blocks).getBlock() )); } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestBlockAllocationTableReader.java b/src/testcases/org/apache/poi/poifs/storage/TestBlockAllocationTableReader.java index a209de6c8d..6a249afc1a 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestBlockAllocationTableReader.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestBlockAllocationTableReader.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -7,7 +6,7 @@ (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -15,17 +14,20 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; -import java.util.*; - -import junit.framework.*; +import junit.framework.AssertionFailedError; +import junit.framework.TestCase; +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.util.HexRead; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianConsts; @@ -34,1333 +36,394 @@ import org.apache.poi.util.LittleEndianConsts; * * @author Marc Johnson */ +public final class TestBlockAllocationTableReader extends TestCase { -public class TestBlockAllocationTableReader - extends TestCase -{ + /** + * Test small block allocation table constructor + */ + public void testSmallBATConstructor() throws IOException { - /** - * Constructor TestBlockAllocationTableReader - * - * @param name - */ + // need to create an array of raw blocks containing the SBAT, + // and a small document block list + String[] sbat_data = { + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "FE FF FF FF 22 00 00 00 FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + }; - public TestBlockAllocationTableReader(String name) - { - super(name); - } + RawDataBlock[] sbats = { new RawDataBlock(makeDataStream(sbat_data)) }; - /** - * Test small block allocation table constructor - * - * @exception IOException - */ + String[] sbt_data = { + "08 00 28 00 6A 61 6D 65 73 2D 55 37 37 32 37 39 32 2D 28 31 36 2D 4F 63 74 2D 32 30 30 31 40 31", + "36 2D 34 31 2D 33 33 29 2E 5A 44 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "07 00 00 00 00 00 80 27 E2 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "07 00 00 00 00 00 80 27 E2 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "03 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 02 00 20 31 08 00 05 00 53 61 76 65 64 08 00 17 00 53 2E 48 55 53 53 41 49 4E 20 41 20 44", + "45 56 20 4F 46 46 52 20 55 4B 08 00 0B 00 31 36 2D 4F 63 74 2D 32 30 30 31 08 00 05 00 35 2E 33", + "2E 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 05 00 6A 61 6D 65 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 03 00 47 42 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 1D 00 28 41 29 31 36 2D 4F 63 74 2D 32 30 30 31 20 74 6F 20 31 36 2D 4F 63 74 2D 32 30 30", + "31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 01 00 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00", + "02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00", + "02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 03 00 47 42 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 17 00 53 2E 48 55 53 53 41 49 4E 20 41 20 44 45 56 20 4F 46 46 52 20 55 4B 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 02 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + }; - public void testSmallBATConstructor() - throws IOException - { + RawDataBlock[] sbts = new RawDataBlock[7]; + InputStream sbt_input = makeDataStream(sbt_data); - // need to create an array of raw blocks containing the SBAT, - // and a small document block list - byte[] sbat_data = - { - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF - }; - RawDataBlock[] sbats = - { - new RawDataBlock(new ByteArrayInputStream(sbat_data)) - }; - byte[] sbt_data = - { - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x28, ( byte ) 0x00, - ( byte ) 0x6A, ( byte ) 0x61, ( byte ) 0x6D, ( byte ) 0x65, - ( byte ) 0x73, ( byte ) 0x2D, ( byte ) 0x55, ( byte ) 0x37, - ( byte ) 0x37, ( byte ) 0x32, ( byte ) 0x37, ( byte ) 0x39, - ( byte ) 0x32, ( byte ) 0x2D, ( byte ) 0x28, ( byte ) 0x31, - ( byte ) 0x36, ( byte ) 0x2D, ( byte ) 0x4F, ( byte ) 0x63, - ( byte ) 0x74, ( byte ) 0x2D, ( byte ) 0x32, ( byte ) 0x30, - ( byte ) 0x30, ( byte ) 0x31, ( byte ) 0x40, ( byte ) 0x31, - ( byte ) 0x36, ( byte ) 0x2D, ( byte ) 0x34, ( byte ) 0x31, - ( byte ) 0x2D, ( byte ) 0x33, ( byte ) 0x33, ( byte ) 0x29, - ( byte ) 0x2E, ( byte ) 0x5A, ( byte ) 0x44, ( byte ) 0x46, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x80, ( byte ) 0x27, - ( byte ) 0xE2, ( byte ) 0x40, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x80, ( byte ) 0x27, - ( byte ) 0xE2, ( byte ) 0x40, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x31, ( byte ) 0x08, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x53, ( byte ) 0x61, - ( byte ) 0x76, ( byte ) 0x65, ( byte ) 0x64, ( byte ) 0x08, - ( byte ) 0x00, ( byte ) 0x17, ( byte ) 0x00, ( byte ) 0x53, - ( byte ) 0x2E, ( byte ) 0x48, ( byte ) 0x55, ( byte ) 0x53, - ( byte ) 0x53, ( byte ) 0x41, ( byte ) 0x49, ( byte ) 0x4E, - ( byte ) 0x20, ( byte ) 0x41, ( byte ) 0x20, ( byte ) 0x44, - ( byte ) 0x45, ( byte ) 0x56, ( byte ) 0x20, ( byte ) 0x4F, - ( byte ) 0x46, ( byte ) 0x46, ( byte ) 0x52, ( byte ) 0x20, - ( byte ) 0x55, ( byte ) 0x4B, ( byte ) 0x08, ( byte ) 0x00, - ( byte ) 0x0B, ( byte ) 0x00, ( byte ) 0x31, ( byte ) 0x36, - ( byte ) 0x2D, ( byte ) 0x4F, ( byte ) 0x63, ( byte ) 0x74, - ( byte ) 0x2D, ( byte ) 0x32, ( byte ) 0x30, ( byte ) 0x30, - ( byte ) 0x31, ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x05, - ( byte ) 0x00, ( byte ) 0x35, ( byte ) 0x2E, ( byte ) 0x33, - ( byte ) 0x2E, ( byte ) 0x32, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x00, - ( byte ) 0x6A, ( byte ) 0x61, ( byte ) 0x6D, ( byte ) 0x65, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x42, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x1D, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x41, ( byte ) 0x29, ( byte ) 0x31, - ( byte ) 0x36, ( byte ) 0x2D, ( byte ) 0x4F, ( byte ) 0x63, - ( byte ) 0x74, ( byte ) 0x2D, ( byte ) 0x32, ( byte ) 0x30, - ( byte ) 0x30, ( byte ) 0x31, ( byte ) 0x20, ( byte ) 0x74, - ( byte ) 0x6F, ( byte ) 0x20, ( byte ) 0x31, ( byte ) 0x36, - ( byte ) 0x2D, ( byte ) 0x4F, ( byte ) 0x63, ( byte ) 0x74, - ( byte ) 0x2D, ( byte ) 0x32, ( byte ) 0x30, ( byte ) 0x30, - ( byte ) 0x31, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x00, - ( byte ) 0x31, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x18, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x42, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x17, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x2E, ( byte ) 0x48, ( byte ) 0x55, - ( byte ) 0x53, ( byte ) 0x53, ( byte ) 0x41, ( byte ) 0x49, - ( byte ) 0x4E, ( byte ) 0x20, ( byte ) 0x41, ( byte ) 0x20, - ( byte ) 0x44, ( byte ) 0x45, ( byte ) 0x56, ( byte ) 0x20, - ( byte ) 0x4F, ( byte ) 0x46, ( byte ) 0x46, ( byte ) 0x52, - ( byte ) 0x20, ( byte ) 0x55, ( byte ) 0x4B, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00 - }; - RawDataBlock[] sbts = new RawDataBlock[ 7 ]; - ByteArrayInputStream sbt_input = new ByteArrayInputStream(sbt_data); + for (int j = 0; j < 7; j++) { + sbts[j] = new RawDataBlock(sbt_input); + } + SmallDocumentBlockList small_blocks = new SmallDocumentBlockList(SmallDocumentBlock + .extract(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, sbts)); + BlockAllocationTableReader sbat = new BlockAllocationTableReader( + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, sbats, small_blocks); + boolean[] isUsed = { + false, false, false, false, false, false, false, false, false, + false, true, true, true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, true, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false + }; + int[] nextIndex = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, 34, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + }; - for (int j = 0; j < 7; j++) - { - sbts[ j ] = new RawDataBlock(sbt_input); - } - SmallDocumentBlockList small_blocks = - new SmallDocumentBlockList(SmallDocumentBlock.extract(sbts)); - BlockAllocationTableReader sbat = - new BlockAllocationTableReader(sbats, small_blocks); - boolean[] isUsed = - { - false, false, false, false, false, false, false, false, false, - false, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false - }; - int[] nextIndex = - { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, 34, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 - }; + for (int j = 0; j < 128; j++) { + if (isUsed[j]) { + assertTrue("checking usage of block " + j, sbat.isUsed(j)); + assertEquals("checking usage of block " + j, nextIndex[j], sbat + .getNextBlockIndex(j)); + small_blocks.remove(j); + } else { + assertTrue("checking usage of block " + j, !sbat.isUsed(j)); + try { + small_blocks.remove(j); + fail("removing block " + j + " should have failed"); + } catch (IOException ignored) { + // expected during successful test + } + } + } + } - for (int j = 0; j < 128; j++) - { - if (isUsed[ j ]) - { - assertTrue("checking usage of block " + j, sbat.isUsed(j)); - assertEquals("checking usage of block " + j, nextIndex[ j ], - sbat.getNextBlockIndex(j)); - small_blocks.remove(j); - } - else - { - assertTrue("checking usage of block " + j, !sbat.isUsed(j)); - try - { - small_blocks.remove(j); - fail("removing block " + j + " should have failed"); - } - catch (IOException ignored) - { - } - } - } - } + private static InputStream makeDataStream(String[] hexDataLines) { + return new ByteArrayInputStream(RawDataUtil.decode(hexDataLines)); + } - /** - * Test reading constructor - * - * @exception IOException - */ + public void testReadingConstructor() throws IOException { - public void testReadingConstructor() - throws IOException - { + // create a document, minus the header block, and use that to + // create a RawDataBlockList. The document will exist entire + // of BATBlocks and XBATBlocks + // + // we will create two XBAT blocks, which will encompass 128 + // BAT blocks between them, and two extra BAT blocks which + // will be in the block array passed to the constructor. This + // makes a total of 130 BAT blocks, which will encompass + // 16,640 blocks, for a file size of some 8.5 megabytes. + // + // Naturally, we'll fake that out ... + // + // map of blocks: + // block 0: xbat block 0 + // block 1: xbat block 1 + // block 2: bat block 0 + // block 3: bat block 1 + // blocks 4-130: bat blocks 2-128, contained in xbat block 0 + // block 131: bat block 129, contained in xbat block 1 + // blocks 132-16639: fictitious blocks, faked out. All blocks + // whose index is evenly divisible by 256 + // will be unused + LocalRawDataBlockList list = new LocalRawDataBlockList(); - // create a document, minus the header block, and use that to - // create a RawDataBlockList. The document will exist entire - // of BATBlocks and XBATBlocks - // - // we will create two XBAT blocks, which will encompass 128 - // BAT blocks between them, and two extra BAT blocks which - // will be in the block array passed to the constructor. This - // makes a total of 130 BAT blocks, which will encompass - // 16,640 blocks, for a file size of some 8.5 megabytes. - // - // Naturally, we'll fake that out ... - // - // map of blocks: - // block 0: xbat block 0 - // block 1: xbat block 1 - // block 2: bat block 0 - // block 3: bat block 1 - // blocks 4-130: bat blocks 2-128, contained in xbat block 0 - // block 131: bat block 129, contained in xbat block 1 - // blocks 132-16639: fictitious blocks, faked out. All blocks - // whose index is evenly divisible by 256 - // will be unused - LocalRawDataBlockList list = new LocalRawDataBlockList(); + list.createNewXBATBlock(4, 130, 1); + list.createNewXBATBlock(131, 131, -2); + for (int j = 0; j < 130; j++) { + list.createNewBATBlock(j * 128); + } + list.fill(132); + int[] blocks = { 2, 3 }; + BlockAllocationTableReader table = new BlockAllocationTableReader( + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 130, blocks, 2, 0, list); - list.createNewXBATBlock(4, 130, 1); - list.createNewXBATBlock(131, 131, -2); - for (int j = 0; j < 130; j++) - { - list.createNewBATBlock(j * 128); - } - list.fill(132); - int[] blocks = - { - 2, 3 - }; - BlockAllocationTableReader table = - new BlockAllocationTableReader(130, blocks, 2, 0, list); + for (int i = 0; i < (130 * 128); i++) { + if (i % 256 == 0) { + assertTrue("verifying block " + i + " is unused", !table.isUsed(i)); + } else if (i % 256 == 255) { + assertEquals("Verify end of chain for block " + i, POIFSConstants.END_OF_CHAIN, + table.getNextBlockIndex(i)); + } else { + assertEquals("Verify next index for block " + i, i + 1, table.getNextBlockIndex(i)); + } + } + } - for (int i = 0; i < (130 * 128); i++) - { - if (i % 256 == 0) - { - assertTrue("verifying block " + i + " is unused", - !table.isUsed(i)); - } - else if (i % 256 == 255) - { - assertEquals("Verify end of chain for block " + i, - POIFSConstants.END_OF_CHAIN, - table.getNextBlockIndex(i)); - } - else - { - assertEquals("Verify next index for block " + i, i + 1, - table.getNextBlockIndex(i)); - } - } - } + public void testFetchBlocks() throws IOException { - /** - * Test fetchBlocks - * - * @exception IOException - */ + // strategy: + // + // 1. set up a single BAT block from which to construct a + // BAT. create nonsense blocks in the raw data block list + // corresponding to the indices in the BAT block. + // 2. The indices will include very short documents (0 and 1 + // block in length), longer documents, and some screwed up + // documents (one with a loop, one that will peek into + // another document's data, one that includes an unused + // document, one that includes a reserved (BAT) block, one + // that includes a reserved (XBAT) block, and one that + // points off into space somewhere + LocalRawDataBlockList list = new LocalRawDataBlockList(); + byte[] data = new byte[512]; + int offset = 0; - public void testFetchBlocks() - throws IOException - { + LittleEndian.putInt(data, offset, -3); // for the BAT block itself + offset += LittleEndianConsts.INT_SIZE; - // strategy: - // - // 1. set up a single BAT block from which to construct a - // BAT. create nonsense blocks in the raw data block list - // corresponding to the indices in the BAT block. - // 2. The indices will include very short documents (0 and 1 - // block in length), longer documents, and some screwed up - // documents (one with a loop, one that will peek into - // another document's data, one that includes an unused - // document, one that includes a reserved (BAT) block, one - // that includes a reserved (XBAT) block, and one that - // points off into space somewhere - LocalRawDataBlockList list = new LocalRawDataBlockList(); - byte[] data = new byte[ 512 ]; - int offset = 0; + // document 1: is at end of file already; start block = -2 + // document 2: has only one block; start block = 1 + LittleEndian.putInt(data, offset, -2); + offset += LittleEndianConsts.INT_SIZE; - LittleEndian.putInt(data, offset, -3); // for the BAT block itself - offset += LittleEndianConsts.INT_SIZE; + // document 3: has a loop in it; start block = 2 + LittleEndian.putInt(data, offset, 2); + offset += LittleEndianConsts.INT_SIZE; - // document 1: is at end of file already; start block = -2 - // document 2: has only one block; start block = 1 - LittleEndian.putInt(data, offset, -2); - offset += LittleEndianConsts.INT_SIZE; + // document 4: peeks into document 2's data; start block = 3 + LittleEndian.putInt(data, offset, 4); + offset += LittleEndianConsts.INT_SIZE; + LittleEndian.putInt(data, offset, 1); + offset += LittleEndianConsts.INT_SIZE; - // document 3: has a loop in it; start block = 2 - LittleEndian.putInt(data, offset, 2); - offset += LittleEndianConsts.INT_SIZE; + // document 5: includes an unused block; start block = 5 + LittleEndian.putInt(data, offset, 6); + offset += LittleEndianConsts.INT_SIZE; + LittleEndian.putInt(data, offset, -1); + offset += LittleEndianConsts.INT_SIZE; - // document 4: peeks into document 2's data; start block = 3 - LittleEndian.putInt(data, offset, 4); - offset += LittleEndianConsts.INT_SIZE; - LittleEndian.putInt(data, offset, 1); - offset += LittleEndianConsts.INT_SIZE; + // document 6: includes a BAT block; start block = 7 + LittleEndian.putInt(data, offset, 8); + offset += LittleEndianConsts.INT_SIZE; + LittleEndian.putInt(data, offset, 0); + offset += LittleEndianConsts.INT_SIZE; - // document 5: includes an unused block; start block = 5 - LittleEndian.putInt(data, offset, 6); - offset += LittleEndianConsts.INT_SIZE; - LittleEndian.putInt(data, offset, -1); - offset += LittleEndianConsts.INT_SIZE; + // document 7: includes an XBAT block; start block = 9 + LittleEndian.putInt(data, offset, 10); + offset += LittleEndianConsts.INT_SIZE; + LittleEndian.putInt(data, offset, -4); + offset += LittleEndianConsts.INT_SIZE; - // document 6: includes a BAT block; start block = 7 - LittleEndian.putInt(data, offset, 8); - offset += LittleEndianConsts.INT_SIZE; - LittleEndian.putInt(data, offset, 0); - offset += LittleEndianConsts.INT_SIZE; + // document 8: goes off into space; start block = 11; + LittleEndian.putInt(data, offset, 1000); + offset += LittleEndianConsts.INT_SIZE; - // document 7: includes an XBAT block; start block = 9 - LittleEndian.putInt(data, offset, 10); - offset += LittleEndianConsts.INT_SIZE; - LittleEndian.putInt(data, offset, -4); - offset += LittleEndianConsts.INT_SIZE; + // document 9: no screw ups; start block = 12; + int index = 13; - // document 8: goes off into space; start block = 11; - LittleEndian.putInt(data, offset, 1000); - offset += LittleEndianConsts.INT_SIZE; + for (; offset < 508; offset += LittleEndianConsts.INT_SIZE) { + LittleEndian.putInt(data, offset, index++); + } + LittleEndian.putInt(data, offset, -2); + list.add(new RawDataBlock(new ByteArrayInputStream(data))); + list.fill(1); + int[] blocks = { 0 }; + BlockAllocationTableReader table = new BlockAllocationTableReader( + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 1, blocks, 0, -2, list); + int[] start_blocks = { -2, 1, 2, 3, 5, 7, 9, 11, 12 }; + int[] expected_length = { 0, 1, -1, -1, -1, -1, -1, -1, 116 }; - // document 9: no screw ups; start block = 12; - int index = 13; + for (int j = 0; j < start_blocks.length; j++) { + try { + ListManagedBlock[] dataBlocks = table.fetchBlocks(start_blocks[j], -1, list); - for (; offset < 508; offset += LittleEndianConsts.INT_SIZE) - { - LittleEndian.putInt(data, offset, index++); - } - LittleEndian.putInt(data, offset, -2); - list.add(new RawDataBlock(new ByteArrayInputStream(data))); - list.fill(1); - int[] blocks = - { - 0 - }; - BlockAllocationTableReader table = - new BlockAllocationTableReader(1, blocks, 0, -2, list); - int[] start_blocks = - { - -2, 1, 2, 3, 5, 7, 9, 11, 12 - }; - int[] expected_length = - { - 0, 1, -1, -1, -1, -1, -1, -1, 116 - }; + if (expected_length[j] == -1) { + fail("document " + j + " should have failed, but found a length of " + + dataBlocks.length); + } else { + assertEquals(expected_length[j], dataBlocks.length); + } + } catch (IOException e) { + if (expected_length[j] == -1) { - for (int j = 0; j < start_blocks.length; j++) - { - try - { - ListManagedBlock[] dataBlocks = - table.fetchBlocks(start_blocks[ j ], list); + // no problem, we expected a failure here + } else { + throw e; + } + } + } + } - if (expected_length[ j ] == -1) - { - fail("document " + j + " should have failed"); - } - else - { - assertEquals(expected_length[ j ], dataBlocks.length); - } - } - catch (IOException e) - { - if (expected_length[ j ] == -1) - { + /** + * Bugzilla 48085 describes an error where a corrupted Excel file causes POI to throw an + * {@link OutOfMemoryError}. + */ + public void testBadSectorAllocationTableSize_bug48085() { + int BLOCK_SIZE = 512; + POIFSBigBlockSize bigBlockSize = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; + assertEquals(BLOCK_SIZE, bigBlockSize.getBigBlockSize()); + + // 512 bytes take from the start of bugzilla attachment 24444 + byte[] initData = HexRead.readFromString( - // no problem, we expected a failure here - } - else - { - throw e; - } - } - } - } + "D0 CF 11 E0 A1 B1 1A E1 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3E 20 03 20 FE FF 09 20" + + "06 20 20 20 20 20 20 20 20 20 20 20 01 20 20 20 01 20 20 20 20 20 20 20 20 10 20 20 02 20 20 20" + + "02 20 20 20 FE FF FF FF 20 20 20 20 20 20 20 20 " + ); + // the rest of the block is 'FF' + byte[] data = new byte[BLOCK_SIZE]; + Arrays.fill(data, (byte)0xFF); + System.arraycopy(initData, 0, data, 0, initData.length); - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.storage.BlockAllocationTableReader"); - junit.textui.TestRunner.run(TestBlockAllocationTableReader.class); - } + // similar code to POIFSFileSystem.: + InputStream stream = new ByteArrayInputStream(data); + HeaderBlock hb; + RawDataBlockList dataBlocks; + try { + hb = new HeaderBlock(stream); + dataBlocks = new RawDataBlockList(stream, bigBlockSize); + } catch (IOException e) { + throw new RuntimeException(e); + } + try { + new BlockAllocationTableReader(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, + hb.getBATCount(), hb.getBATArray(), hb.getXBATCount(), + hb.getXBATIndex(), dataBlocks); + } catch (IOException e) { + // expected during successful test + assertEquals("Block count 538976257 is too high. POI maximum is 65535.", e.getMessage()); + } catch (OutOfMemoryError e) { + if (e.getStackTrace()[1].getMethodName().equals("testBadSectorAllocationTableSize")) { + throw new AssertionFailedError("Identified bug 48085"); + } + } + } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestBlockAllocationTableWriter.java b/src/testcases/org/apache/poi/poifs/storage/TestBlockAllocationTableWriter.java index e13191a7f0..4539c60b3c 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestBlockAllocationTableWriter.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestBlockAllocationTableWriter.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,15 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; -import java.util.*; - -import junit.framework.*; +import junit.framework.TestCase; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.util.LittleEndian; @@ -34,30 +32,11 @@ import org.apache.poi.util.LittleEndianConsts; * * @author Marc Johnson */ +public final class TestBlockAllocationTableWriter extends TestCase { -public class TestBlockAllocationTableWriter - extends TestCase -{ - - /** - * Constructor TestBlockAllocationTableWriter - * - * @param name - */ - - public TestBlockAllocationTableWriter(String name) - { - super(name); - } - - /** - * Test the allocateSpace method. - */ - - public void testAllocateSpace() - { + public void testAllocateSpace() { BlockAllocationTableWriter table = - new BlockAllocationTableWriter(); + new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); int[] blockSizes = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 @@ -71,45 +50,37 @@ public class TestBlockAllocationTableWriter } } - /** - * Test the createBlocks method - * - * @exception IOException - */ - - public void testCreateBlocks() - throws IOException - { - BlockAllocationTableWriter table = new BlockAllocationTableWriter(); + public void testCreateBlocks() { + BlockAllocationTableWriter table = new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); table.allocateSpace(127); table.createBlocks(); verifyBlocksCreated(table, 1); - table = new BlockAllocationTableWriter(); + table = new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); table.allocateSpace(128); table.createBlocks(); verifyBlocksCreated(table, 2); - table = new BlockAllocationTableWriter(); + table = new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); table.allocateSpace(254); table.createBlocks(); verifyBlocksCreated(table, 2); - table = new BlockAllocationTableWriter(); + table = new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); table.allocateSpace(255); table.createBlocks(); verifyBlocksCreated(table, 3); - table = new BlockAllocationTableWriter(); + table = new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); table.allocateSpace(13843); table.createBlocks(); verifyBlocksCreated(table, 109); - table = new BlockAllocationTableWriter(); + table = new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); table.allocateSpace(13844); table.createBlocks(); verifyBlocksCreated(table, 110); - table = new BlockAllocationTableWriter(); + table = new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); table.allocateSpace(13969); table.createBlocks(); verifyBlocksCreated(table, 110); - table = new BlockAllocationTableWriter(); + table = new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); table.allocateSpace(13970); table.createBlocks(); verifyBlocksCreated(table, 111); @@ -117,14 +88,9 @@ public class TestBlockAllocationTableWriter /** * Test content produced by BlockAllocationTableWriter - * - * @exception IOException */ - - public void testProduct() - throws IOException - { - BlockAllocationTableWriter table = new BlockAllocationTableWriter(); + public void testProduct() throws IOException { + BlockAllocationTableWriter table = new BlockAllocationTableWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); for (int k = 1; k <= 22; k++) { @@ -168,28 +134,16 @@ public class TestBlockAllocationTableWriter } } - private void verifyBlocksCreated(BlockAllocationTableWriter table, - int count) - throws IOException - { + private static void verifyBlocksCreated(BlockAllocationTableWriter table, int count){ ByteArrayOutputStream stream = new ByteArrayOutputStream(); - table.writeBlocks(stream); + try { + table.writeBlocks(stream); + } catch (IOException e) { + throw new RuntimeException(e); + } byte[] output = stream.toByteArray(); assertEquals(count * 512, output.length); } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.storage.BlockAllocationTableWriter"); - junit.textui.TestRunner.run(TestBlockAllocationTableWriter.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestBlockListImpl.java b/src/testcases/org/apache/poi/poifs/storage/TestBlockListImpl.java index 6b8d091a50..2a36dd0a46 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestBlockListImpl.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestBlockListImpl.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,16 +14,18 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -import java.util.*; - -import junit.framework.*; +import junit.framework.TestCase; +import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianConsts; @@ -33,32 +34,18 @@ import org.apache.poi.util.LittleEndianConsts; * * @author Marc Johnson */ - -public class TestBlockListImpl - extends TestCase -{ - - /** - * Constructor TestBlockListImpl - * - * @param name - */ - - public TestBlockListImpl(String name) - { - super(name); +public final class TestBlockListImpl extends TestCase { + private static final class BlockListTestImpl extends BlockListImpl { + public BlockListTestImpl() { + // no extra initialisation + } + } + private static BlockListImpl create() { + return new BlockListTestImpl(); } - /** - * test zap method - * - * @exception IOException - */ - - public void testZap() - throws IOException - { - BlockListImpl list = new BlockListImpl(); + public void testZap() throws IOException { + BlockListImpl list = create(); // verify that you can zap anything for (int j = -2; j < 10; j++) @@ -92,16 +79,9 @@ public class TestBlockListImpl } } - /** - * test remove method - * - * @exception IOException - */ - public void testRemove() - throws IOException - { - BlockListImpl list = new BlockListImpl(); + public void testRemove() throws IOException { + BlockListImpl list = create(); RawDataBlock[] blocks = new RawDataBlock[ 5 ]; byte[] data = new byte[ 512 * 5 ]; @@ -159,22 +139,14 @@ public class TestBlockListImpl } } - /** - * test setBAT - * - * @exception IOException - */ - - public void testSetBAT() - throws IOException - { - BlockListImpl list = new BlockListImpl(); + public void testSetBAT() throws IOException { + BlockListImpl list = create(); list.setBAT(null); - list.setBAT(new BlockAllocationTableReader()); + list.setBAT(new BlockAllocationTableReader(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS)); try { - list.setBAT(new BlockAllocationTableReader()); + list.setBAT(new BlockAllocationTableReader(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS)); fail("second attempt should have failed"); } catch (IOException ignored) @@ -182,18 +154,10 @@ public class TestBlockListImpl } } - /** - * Test fetchBlocks - * - * @exception IOException - */ - - public void testFetchBlocks() - throws IOException - { + public void testFetchBlocks() throws IOException { // strategy: - // + // // 1. set up a single BAT block from which to construct a // BAT. create nonsense blocks in the raw data block list // corresponding to the indices in the BAT block. @@ -204,7 +168,7 @@ public class TestBlockListImpl // document, one that includes a reserved (BAT) block, one // that includes a reserved (XBAT) block, and one that // points off into space somewhere - BlockListImpl list = new BlockListImpl(); + BlockListImpl list = create(); List raw_blocks = new ArrayList(); byte[] data = new byte[ 512 ]; int offset = 0; @@ -270,7 +234,7 @@ public class TestBlockListImpl 0 }; BlockAllocationTableReader table = - new BlockAllocationTableReader(1, blocks, 0, -2, list); + new BlockAllocationTableReader(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 1, blocks, 0, -2, list); int[] start_blocks = { -2, 1, 2, 3, 5, 7, 9, 11, 12 @@ -285,7 +249,7 @@ public class TestBlockListImpl try { ListManagedBlock[] dataBlocks = - list.fetchBlocks(start_blocks[ j ]); + list.fetchBlocks(start_blocks[ j ], -1); if (expected_length[ j ] == -1) { @@ -310,17 +274,4 @@ public class TestBlockListImpl } } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.storage.BlockListImpl"); - junit.textui.TestRunner.run(TestBlockListImpl.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestDocumentBlock.java b/src/testcases/org/apache/poi/poifs/storage/TestDocumentBlock.java index bb0ca8cd6c..313d92cb4d 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestDocumentBlock.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestDocumentBlock.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,25 +14,23 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; -import java.util.*; +import org.apache.poi.poifs.common.POIFSConstants; -import junit.framework.*; +import junit.framework.TestCase; /** * Class to test DocumentBlock functionality * * @author Marc Johnson */ - -public class TestDocumentBlock - extends TestCase -{ +public final class TestDocumentBlock extends TestCase { static final private byte[] _testdata; static @@ -44,25 +41,10 @@ public class TestDocumentBlock _testdata[ j ] = ( byte ) j; } } - ; - - /** - * Constructor TestDocumentBlock - * - * @param name - */ - - public TestDocumentBlock(String name) - { - super(name); - } /** * Test the writing DocumentBlock constructor. - * - * @exception IOException */ - public void testConstructor() throws IOException { @@ -75,7 +57,7 @@ public class TestDocumentBlock byte[] data = new byte[ Math.min(_testdata.length - index, 512) ]; System.arraycopy(_testdata, index, data, 0, data.length); - DocumentBlock block = new DocumentBlock(input); + DocumentBlock block = new DocumentBlock(input, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); verifyOutput(block, data); size += block.size(); @@ -88,46 +70,10 @@ public class TestDocumentBlock assertEquals(_testdata.length, size); } - /** - * test static read method - * - * @exception IOException - */ - - public void testRead() - throws IOException - { - DocumentBlock[] blocks = new DocumentBlock[ 4 ]; - ByteArrayInputStream input = new ByteArrayInputStream(_testdata); - - for (int j = 0; j < 4; j++) - { - blocks[ j ] = new DocumentBlock(input); - } - for (int j = 1; j <= 2000; j += 17) - { - byte[] buffer = new byte[ j ]; - int offset = 0; - - for (int k = 0; k < (2000 / j); k++) - { - DocumentBlock.read(blocks, buffer, offset); - for (int n = 0; n < buffer.length; n++) - { - assertEquals("checking byte " + (k * j) + n, - _testdata[ (k * j) + n ], buffer[ n ]); - } - offset += j; - } - } - } /** * Test 'reading' constructor - * - * @exception IOException */ - public void testReadingConstructor() throws IOException { @@ -164,17 +110,4 @@ public class TestDocumentBlock assertEquals(( byte ) 0xFF, copy[ j ]); } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.storage.DocumentBlock"); - junit.textui.TestRunner.run(TestDocumentBlock.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockReader.java b/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockReader.java deleted file mode 100644 index 738aeb11cd..0000000000 --- a/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockReader.java +++ /dev/null @@ -1,247 +0,0 @@ - -/* ==================================================================== - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -==================================================================== */ - - -package org.apache.poi.poifs.storage; - -import java.io.*; - -import java.util.*; - -import junit.framework.*; - -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.LittleEndianConsts; - -/** - * Class to test HeaderBlockReader functionality - * - * @author Marc Johnson - */ - -public class TestHeaderBlockReader - extends TestCase -{ - - /** - * Constructor TestHeaderBlockReader - * - * @param name - */ - - public TestHeaderBlockReader(String name) - { - super(name); - } - - /** - * Test creating a HeaderBlockReader - * - * @exception IOException - */ - - public void testConstructors() - throws IOException - { - byte[] content = - { - ( byte ) 0xD0, ( byte ) 0xCF, ( byte ) 0x11, ( byte ) 0xE0, - ( byte ) 0xA1, ( byte ) 0xB1, ( byte ) 0x1A, ( byte ) 0xE1, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3B, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0x09, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF - }; - HeaderBlockReader block = - new HeaderBlockReader(new ByteArrayInputStream(content)); - - assertEquals(-2, block.getPropertyStart()); - - // verify we can't read a short block - byte[] shortblock = new byte[ 511 ]; - - System.arraycopy(content, 0, shortblock, 0, 511); - try - { - block = - new HeaderBlockReader(new ByteArrayInputStream(shortblock)); - fail("Should have caught IOException reading a short block"); - } - catch (IOException ignored) - { - - // as expected - } - - // try various forms of corruption - for (int index = 0; index < 8; index++) - { - content[ index ] = ( byte ) (content[ index ] - 1); - try - { - block = - new HeaderBlockReader(new ByteArrayInputStream(content)); - fail("Should have caught IOException corrupting byte " - + index); - } - catch (IOException ignored) - { - - // as expected - } - - // restore byte value - content[ index ] = ( byte ) (content[ index ] + 1); - } - } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.storage.HeaderBlockReader"); - junit.textui.TestRunner.run(TestHeaderBlockReader.class); - } -} diff --git a/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockReading.java b/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockReading.java new file mode 100644 index 0000000000..15077c4fba --- /dev/null +++ b/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockReading.java @@ -0,0 +1,83 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.storage; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import junit.framework.TestCase; + +/** + * Class to test HeaderBlockReader functionality + * + * @author Marc Johnson + */ +public final class TestHeaderBlockReading extends TestCase { + + public void testConstructors() throws IOException { + String[] hexData = { + "D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00", + "06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 10 00 00 FE FF FF FF", + "01 00 00 00 FE FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + }; + byte[] content = RawDataUtil.decode(hexData); + HeaderBlock block = new HeaderBlock(new ByteArrayInputStream(content)); + + assertEquals(-2, block.getPropertyStart()); + + // verify we can't read a short block + byte[] shortblock = new byte[511]; + + System.arraycopy(content, 0, shortblock, 0, 511); + try { + block = new HeaderBlock(new ByteArrayInputStream(shortblock)); + fail("Should have caught IOException reading a short block"); + } catch (IOException ignored) { + + // as expected + } + + // try various forms of corruption + for (int index = 0; index < 8; index++) { + content[index] = (byte) (content[index] - 1); + try { + block = new HeaderBlock(new ByteArrayInputStream(content)); + fail("Should have caught IOException corrupting byte " + index); + } catch (IOException ignored) { + + // as expected + } + + // restore byte value + content[index] = (byte) (content[index] + 1); + } + } +} diff --git a/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockWriter.java b/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockWriter.java deleted file mode 100644 index 9fe75beca4..0000000000 --- a/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockWriter.java +++ /dev/null @@ -1,1025 +0,0 @@ - -/* ==================================================================== - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -==================================================================== */ - - -package org.apache.poi.poifs.storage; - -import java.io.*; - -import java.util.*; - -import junit.framework.*; - -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.LittleEndianConsts; - -/** - * Class to test HeaderBlockWriter functionality - * - * @author Marc Johnson - */ - -public class TestHeaderBlockWriter - extends TestCase -{ - - /** - * Constructor TestHeaderBlockWriter - * - * @param name - */ - - public TestHeaderBlockWriter(String name) - { - super(name); - } - - /** - * Test creating a HeaderBlockWriter - * - * @exception IOException - */ - - public void testConstructors() - throws IOException - { - HeaderBlockWriter block = new HeaderBlockWriter(); - ByteArrayOutputStream output = new ByteArrayOutputStream(512); - - block.writeBlocks(output); - byte[] copy = output.toByteArray(); - byte[] expected = - { - ( byte ) 0xD0, ( byte ) 0xCF, ( byte ) 0x11, ( byte ) 0xE0, - ( byte ) 0xA1, ( byte ) 0xB1, ( byte ) 0x1A, ( byte ) 0xE1, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3B, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0x09, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF - }; - - assertEquals(expected.length, copy.length); - for (int j = 0; j < 512; j++) - { - assertEquals("testing byte " + j, expected[ j ], copy[ j ]); - } - - // verify we can read a 'good' HeaderBlockWriter (also test - // getPropertyStart) - block.setPropertyStart(0x87654321); - output = new ByteArrayOutputStream(512); - block.writeBlocks(output); - assertEquals(0x87654321, - new HeaderBlockReader(new ByteArrayInputStream(output - .toByteArray())).getPropertyStart()); - } - - /** - * Test setting the SBAT start block - * - * @exception IOException - */ - - public void testSetSBATStart() - throws IOException - { - HeaderBlockWriter block = new HeaderBlockWriter(); - - block.setSBATStart(0x01234567); - ByteArrayOutputStream output = new ByteArrayOutputStream(512); - - block.writeBlocks(output); - byte[] copy = output.toByteArray(); - byte[] expected = - { - ( byte ) 0xD0, ( byte ) 0xCF, ( byte ) 0x11, ( byte ) 0xE0, - ( byte ) 0xA1, ( byte ) 0xB1, ( byte ) 0x1A, ( byte ) 0xE1, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3B, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0x09, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF - }; - - assertEquals(expected.length, copy.length); - for (int j = 0; j < 512; j++) - { - assertEquals("testing byte " + j, expected[ j ], copy[ j ]); - } - } - - /** - * test setPropertyStart and getPropertyStart - * - * @exception IOException - */ - - public void testSetPropertyStart() - throws IOException - { - HeaderBlockWriter block = new HeaderBlockWriter(); - - block.setPropertyStart(0x01234567); - ByteArrayOutputStream output = new ByteArrayOutputStream(512); - - block.writeBlocks(output); - byte[] copy = output.toByteArray(); - byte[] expected = - { - ( byte ) 0xD0, ( byte ) 0xCF, ( byte ) 0x11, ( byte ) 0xE0, - ( byte ) 0xA1, ( byte ) 0xB1, ( byte ) 0x1A, ( byte ) 0xE1, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3B, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0x09, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF - }; - - assertEquals(expected.length, copy.length); - for (int j = 0; j < 512; j++) - { - assertEquals("testing byte " + j, expected[ j ], copy[ j ]); - } - } - - /** - * test setting the BAT blocks; also tests getBATCount, - * getBATArray, getXBATCount - * - * @exception IOException - */ - - public void testSetBATBlocks() - throws IOException - { - - // first, a small set of blocks - HeaderBlockWriter block = new HeaderBlockWriter(); - BATBlock[] xbats = block.setBATBlocks(5, 0x01234567); - - assertEquals(0, xbats.length); - assertEquals(0, HeaderBlockWriter - .calculateXBATStorageRequirements(5)); - ByteArrayOutputStream output = new ByteArrayOutputStream(512); - - block.writeBlocks(output); - byte[] copy = output.toByteArray(); - byte[] expected = - { - ( byte ) 0xD0, ( byte ) 0xCF, ( byte ) 0x11, ( byte ) 0xE0, - ( byte ) 0xA1, ( byte ) 0xB1, ( byte ) 0x1A, ( byte ) 0xE1, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3B, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0x09, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x68, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x69, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6A, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6B, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF - }; - - assertEquals(expected.length, copy.length); - for (int j = 0; j < 512; j++) - { - assertEquals("testing byte " + j, expected[ j ], copy[ j ]); - } - - // second, a full set of blocks (109 blocks) - block = new HeaderBlockWriter(); - xbats = block.setBATBlocks(109, 0x01234567); - assertEquals(0, xbats.length); - assertEquals(0, HeaderBlockWriter - .calculateXBATStorageRequirements(109)); - output = new ByteArrayOutputStream(512); - block.writeBlocks(output); - copy = output.toByteArray(); - byte[] expected2 = - { - ( byte ) 0xD0, ( byte ) 0xCF, ( byte ) 0x11, ( byte ) 0xE0, - ( byte ) 0xA1, ( byte ) 0xB1, ( byte ) 0x1A, ( byte ) 0xE1, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3B, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0x09, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x68, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x69, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6A, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6B, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6C, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6D, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6E, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6F, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x70, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x71, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x72, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x73, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x74, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x75, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x76, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x77, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x78, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x79, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7A, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7B, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7C, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7D, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7E, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7F, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x80, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x81, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x82, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x83, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x84, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x85, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x86, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x87, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x88, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x89, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8A, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8B, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8C, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8D, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8E, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8F, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x90, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x91, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x92, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x93, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x94, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x95, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x96, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x97, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x98, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x99, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9A, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9B, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9C, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9D, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9E, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9F, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA0, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA1, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA2, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA3, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA4, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA5, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA6, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA7, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA8, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA9, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAA, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAB, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAC, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAD, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAE, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAF, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB0, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB1, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB2, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB3, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB4, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB5, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB6, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB7, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB8, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB9, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBA, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBB, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBC, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBD, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBE, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBF, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC0, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC1, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC2, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC3, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC4, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC5, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC6, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC7, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC8, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC9, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCA, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCB, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCC, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCD, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCE, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCF, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xD0, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xD1, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xD2, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xD3, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01 - }; - - assertEquals(expected2.length, copy.length); - for (int j = 0; j < 512; j++) - { - assertEquals("testing byte " + j, expected2[ j ], copy[ j ]); - } - - // finally, a really large set of blocks (256 blocks) - block = new HeaderBlockWriter(); - xbats = block.setBATBlocks(256, 0x01234567); - assertEquals(2, xbats.length); - assertEquals(2, HeaderBlockWriter - .calculateXBATStorageRequirements(256)); - output = new ByteArrayOutputStream(512); - block.writeBlocks(output); - copy = output.toByteArray(); - byte[] expected3 = - { - ( byte ) 0xD0, ( byte ) 0xCF, ( byte ) 0x11, ( byte ) 0xE0, - ( byte ) 0xA1, ( byte ) 0xB1, ( byte ) 0x1A, ( byte ) 0xE1, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3B, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0x09, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x46, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x68, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x69, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6A, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6B, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6C, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6D, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6E, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x6F, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x70, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x71, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x72, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x73, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x74, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x75, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x76, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x77, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x78, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x79, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7A, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7B, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7C, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7D, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7E, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x7F, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x80, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x81, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x82, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x83, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x84, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x85, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x86, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x87, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x88, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x89, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8A, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8B, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8C, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8D, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8E, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x8F, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x90, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x91, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x92, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x93, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x94, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x95, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x96, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x97, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x98, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x99, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9A, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9B, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9C, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9D, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9E, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0x9F, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA0, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA1, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA2, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA3, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA4, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA5, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA6, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA7, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA8, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xA9, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAA, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAB, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAC, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAD, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAE, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xAF, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB0, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB1, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB2, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB3, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB4, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB5, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB6, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB7, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB8, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xB9, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBA, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBB, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBC, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBD, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBE, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xBF, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC0, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC1, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC2, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC3, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC4, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC5, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC6, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC7, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC8, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xC9, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCA, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCB, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCC, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCD, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCE, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xCF, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xD0, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xD1, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xD2, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01, - ( byte ) 0xD3, ( byte ) 0x45, ( byte ) 0x23, ( byte ) 0x01 - }; - - assertEquals(expected3.length, copy.length); - for (int j = 0; j < 512; j++) - { - assertEquals("testing byte " + j, expected3[ j ], copy[ j ]); - } - output = new ByteArrayOutputStream(1028); - xbats[ 0 ].writeBlocks(output); - xbats[ 1 ].writeBlocks(output); - copy = output.toByteArray(); - int correct = 0x012345D4; - int offset = 0; - int k = 0; - - for (; k < 127; k++) - { - assertEquals("XBAT entry " + k, correct, - LittleEndian.getInt(copy, offset)); - correct++; - offset += LittleEndianConsts.INT_SIZE; - } - assertEquals("XBAT Chain", 0x01234567 + 257, - LittleEndian.getInt(copy, offset)); - offset += LittleEndianConsts.INT_SIZE; - k++; - for (; k < 148; k++) - { - assertEquals("XBAT entry " + k, correct, - LittleEndian.getInt(copy, offset)); - correct++; - offset += LittleEndianConsts.INT_SIZE; - } - for (; k < 255; k++) - { - assertEquals("XBAT entry " + k, -1, - LittleEndian.getInt(copy, offset)); - offset += LittleEndianConsts.INT_SIZE; - } - assertEquals("XBAT End of chain", -2, - LittleEndian.getInt(copy, offset)); - } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.storage.HeaderBlockWriter"); - junit.textui.TestRunner.run(TestHeaderBlockWriter.class); - } -} diff --git a/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockWriting.java b/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockWriting.java new file mode 100644 index 0000000000..e01c7885be --- /dev/null +++ b/src/testcases/org/apache/poi/poifs/storage/TestHeaderBlockWriting.java @@ -0,0 +1,270 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.poifs.storage; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import junit.framework.TestCase; + +import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianConsts; + +/** + * Class to test HeaderBlockWriter functionality + * + * @author Marc Johnson + */ +public final class TestHeaderBlockWriting extends TestCase { + + private static void confirmEqual(String[] expectedDataHexDumpLines, byte[] actual) { + byte[] expected = RawDataUtil.decode(expectedDataHexDumpLines); + + assertEquals(expected.length, actual.length); + for (int j = 0; j < expected.length; j++) { + assertEquals("testing byte " + j, expected[j], actual[j]); + } + } + + /** + * Test creating a HeaderBlockWriter + */ + public void testConstructors() throws IOException { + HeaderBlockWriter block = new HeaderBlockWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + ByteArrayOutputStream output = new ByteArrayOutputStream(512); + + block.writeBlocks(output); + byte[] copy = output.toByteArray(); + String[] expected = { + "D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00", + "06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 10 00 00 FE FF FF FF", + "00 00 00 00 FE FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + }; + + confirmEqual(expected, copy); + + // verify we can read a 'good' HeaderBlockWriter (also test + // getPropertyStart) + block.setPropertyStart(0x87654321); + output = new ByteArrayOutputStream(512); + block.writeBlocks(output); + assertEquals(0x87654321, new HeaderBlock( + new ByteArrayInputStream(output.toByteArray())).getPropertyStart()); + } + + /** + * Test setting the SBAT start block + */ + public void testSetSBATStart() throws IOException { + HeaderBlockWriter block = new HeaderBlockWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + + block.setSBATStart(0x01234567); + ByteArrayOutputStream output = new ByteArrayOutputStream(512); + + block.writeBlocks(output); + byte[] copy = output.toByteArray(); + String[] expected = { + "D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00", + "06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 10 00 00 67 45 23 01", + "00 00 00 00 FE FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + }; + confirmEqual(expected, copy); + } + + /** + * test setPropertyStart and getPropertyStart + */ + public void testSetPropertyStart() throws IOException { + HeaderBlockWriter block = new HeaderBlockWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + + block.setPropertyStart(0x01234567); + ByteArrayOutputStream output = new ByteArrayOutputStream(512); + + block.writeBlocks(output); + byte[] copy = output.toByteArray(); + String[] expected = { + "D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00", + "06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 45 23 01 00 00 00 00 00 10 00 00 FE FF FF FF", + "00 00 00 00 FE FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + }; + confirmEqual(expected, copy); + } + + /** + * test setting the BAT blocks; also tests getBATCount, getBATArray, + * getXBATCount + */ + public void testSetBATBlocks() throws IOException { + + // first, a small set of blocks + HeaderBlockWriter block = new HeaderBlockWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + BATBlock[] xbats = block.setBATBlocks(5, 0x01234567); + + assertEquals(0, xbats.length); + assertEquals(0, HeaderBlockWriter.calculateXBATStorageRequirements(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,5)); + ByteArrayOutputStream output = new ByteArrayOutputStream(512); + + block.writeBlocks(output); + byte[] copy = output.toByteArray(); + String[] expected = { + "D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00", + "06 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 FE FF FF FF 00 00 00 00 00 10 00 00 FE FF FF FF", + "00 00 00 00 FE FF FF FF 00 00 00 00 67 45 23 01 68 45 23 01 69 45 23 01 6A 45 23 01 6B 45 23 01", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + }; + + confirmEqual(expected, copy); + + // second, a full set of blocks (109 blocks) + block = new HeaderBlockWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + xbats = block.setBATBlocks(109, 0x01234567); + assertEquals(0, xbats.length); + assertEquals(0, HeaderBlockWriter.calculateXBATStorageRequirements(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,109)); + output = new ByteArrayOutputStream(512); + block.writeBlocks(output); + copy = output.toByteArray(); + String[] expected2 = { + "D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00", + "06 00 00 00 00 00 00 00 00 00 00 00 6D 00 00 00 FE FF FF FF 00 00 00 00 00 10 00 00 FE FF FF FF", + "00 00 00 00 FE FF FF FF 00 00 00 00 67 45 23 01 68 45 23 01 69 45 23 01 6A 45 23 01 6B 45 23 01", + "6C 45 23 01 6D 45 23 01 6E 45 23 01 6F 45 23 01 70 45 23 01 71 45 23 01 72 45 23 01 73 45 23 01", + "74 45 23 01 75 45 23 01 76 45 23 01 77 45 23 01 78 45 23 01 79 45 23 01 7A 45 23 01 7B 45 23 01", + "7C 45 23 01 7D 45 23 01 7E 45 23 01 7F 45 23 01 80 45 23 01 81 45 23 01 82 45 23 01 83 45 23 01", + "84 45 23 01 85 45 23 01 86 45 23 01 87 45 23 01 88 45 23 01 89 45 23 01 8A 45 23 01 8B 45 23 01", + "8C 45 23 01 8D 45 23 01 8E 45 23 01 8F 45 23 01 90 45 23 01 91 45 23 01 92 45 23 01 93 45 23 01", + "94 45 23 01 95 45 23 01 96 45 23 01 97 45 23 01 98 45 23 01 99 45 23 01 9A 45 23 01 9B 45 23 01", + "9C 45 23 01 9D 45 23 01 9E 45 23 01 9F 45 23 01 A0 45 23 01 A1 45 23 01 A2 45 23 01 A3 45 23 01", + "A4 45 23 01 A5 45 23 01 A6 45 23 01 A7 45 23 01 A8 45 23 01 A9 45 23 01 AA 45 23 01 AB 45 23 01", + "AC 45 23 01 AD 45 23 01 AE 45 23 01 AF 45 23 01 B0 45 23 01 B1 45 23 01 B2 45 23 01 B3 45 23 01", + "B4 45 23 01 B5 45 23 01 B6 45 23 01 B7 45 23 01 B8 45 23 01 B9 45 23 01 BA 45 23 01 BB 45 23 01", + "BC 45 23 01 BD 45 23 01 BE 45 23 01 BF 45 23 01 C0 45 23 01 C1 45 23 01 C2 45 23 01 C3 45 23 01", + "C4 45 23 01 C5 45 23 01 C6 45 23 01 C7 45 23 01 C8 45 23 01 C9 45 23 01 CA 45 23 01 CB 45 23 01", + "CC 45 23 01 CD 45 23 01 CE 45 23 01 CF 45 23 01 D0 45 23 01 D1 45 23 01 D2 45 23 01 D3 45 23 01", + }; + confirmEqual(expected2, copy); + + // finally, a really large set of blocks (256 blocks) + block = new HeaderBlockWriter(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + xbats = block.setBATBlocks(256, 0x01234567); + assertEquals(2, xbats.length); + assertEquals(2, HeaderBlockWriter.calculateXBATStorageRequirements(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,256)); + output = new ByteArrayOutputStream(512); + block.writeBlocks(output); + copy = output.toByteArray(); + String[] expected3 = { + "D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00", + "06 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 FE FF FF FF 00 00 00 00 00 10 00 00 FE FF FF FF", + "00 00 00 00 67 46 23 01 02 00 00 00 67 45 23 01 68 45 23 01 69 45 23 01 6A 45 23 01 6B 45 23 01", + "6C 45 23 01 6D 45 23 01 6E 45 23 01 6F 45 23 01 70 45 23 01 71 45 23 01 72 45 23 01 73 45 23 01", + "74 45 23 01 75 45 23 01 76 45 23 01 77 45 23 01 78 45 23 01 79 45 23 01 7A 45 23 01 7B 45 23 01", + "7C 45 23 01 7D 45 23 01 7E 45 23 01 7F 45 23 01 80 45 23 01 81 45 23 01 82 45 23 01 83 45 23 01", + "84 45 23 01 85 45 23 01 86 45 23 01 87 45 23 01 88 45 23 01 89 45 23 01 8A 45 23 01 8B 45 23 01", + "8C 45 23 01 8D 45 23 01 8E 45 23 01 8F 45 23 01 90 45 23 01 91 45 23 01 92 45 23 01 93 45 23 01", + "94 45 23 01 95 45 23 01 96 45 23 01 97 45 23 01 98 45 23 01 99 45 23 01 9A 45 23 01 9B 45 23 01", + "9C 45 23 01 9D 45 23 01 9E 45 23 01 9F 45 23 01 A0 45 23 01 A1 45 23 01 A2 45 23 01 A3 45 23 01", + "A4 45 23 01 A5 45 23 01 A6 45 23 01 A7 45 23 01 A8 45 23 01 A9 45 23 01 AA 45 23 01 AB 45 23 01", + "AC 45 23 01 AD 45 23 01 AE 45 23 01 AF 45 23 01 B0 45 23 01 B1 45 23 01 B2 45 23 01 B3 45 23 01", + "B4 45 23 01 B5 45 23 01 B6 45 23 01 B7 45 23 01 B8 45 23 01 B9 45 23 01 BA 45 23 01 BB 45 23 01", + "BC 45 23 01 BD 45 23 01 BE 45 23 01 BF 45 23 01 C0 45 23 01 C1 45 23 01 C2 45 23 01 C3 45 23 01", + "C4 45 23 01 C5 45 23 01 C6 45 23 01 C7 45 23 01 C8 45 23 01 C9 45 23 01 CA 45 23 01 CB 45 23 01", + "CC 45 23 01 CD 45 23 01 CE 45 23 01 CF 45 23 01 D0 45 23 01 D1 45 23 01 D2 45 23 01 D3 45 23 01", + }; + + confirmEqual(expected3, copy); + + output = new ByteArrayOutputStream(1028); + xbats[0].writeBlocks(output); + xbats[1].writeBlocks(output); + copy = output.toByteArray(); + int correct = 0x012345D4; + int offset = 0; + int k = 0; + + for (; k < 127; k++) { + assertEquals("XBAT entry " + k, correct, LittleEndian.getInt(copy, offset)); + correct++; + offset += LittleEndianConsts.INT_SIZE; + } + assertEquals("XBAT Chain", 0x01234567 + 257, LittleEndian.getInt(copy, offset)); + offset += LittleEndianConsts.INT_SIZE; + k++; + for (; k < 148; k++) { + assertEquals("XBAT entry " + k, correct, LittleEndian.getInt(copy, offset)); + correct++; + offset += LittleEndianConsts.INT_SIZE; + } + for (; k < 255; k++) { + assertEquals("XBAT entry " + k, -1, LittleEndian.getInt(copy, offset)); + offset += LittleEndianConsts.INT_SIZE; + } + assertEquals("XBAT End of chain", -2, LittleEndian.getInt(copy, offset)); + } +} diff --git a/src/testcases/org/apache/poi/poifs/storage/TestPropertyBlock.java b/src/testcases/org/apache/poi/poifs/storage/TestPropertyBlock.java index 64750b13e3..0cf8398ab7 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestPropertyBlock.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestPropertyBlock.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,59 +14,37 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; -import java.util.*; +import org.apache.poi.poifs.common.POIFSConstants; -import junit.framework.*; - -import org.apache.poi.poifs.property.Property; +import junit.framework.TestCase; /** * Class to test PropertyBlock functionality * * @author Marc Johnson */ +public final class TestPropertyBlock extends TestCase { -public class TestPropertyBlock - extends TestCase -{ - - /** - * Constructor TestPropertyBlock - * - * @param name - */ - - public TestPropertyBlock(String name) - { - super(name); - } - - /** - * Test constructing PropertyBlocks - * - * @exception IOException - */ - - public void testCreatePropertyBlocks() - throws IOException - { + public void testCreatePropertyBlocks() { // test with 0 properties List properties = new ArrayList(); BlockWritable[] blocks = - PropertyBlock.createPropertyBlockArray(properties); + PropertyBlock.createPropertyBlockArray(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,properties); assertEquals(0, blocks.length); // test with 1 property properties.add(new LocalProperty("Root Entry")); - blocks = PropertyBlock.createPropertyBlockArray(properties); + blocks = PropertyBlock.createPropertyBlockArray(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,properties); assertEquals(1, blocks.length); byte[] testblock = new byte[ 512 ]; @@ -91,7 +68,7 @@ public class TestPropertyBlock // test with 3 properties properties.add(new LocalProperty("workbook")); properties.add(new LocalProperty("summary")); - blocks = PropertyBlock.createPropertyBlockArray(properties); + blocks = PropertyBlock.createPropertyBlockArray(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,properties); assertEquals(1, blocks.length); testblock[ 0x0080 ] = ( byte ) 'w'; testblock[ 0x0082 ] = ( byte ) 'o'; @@ -114,7 +91,7 @@ public class TestPropertyBlock // test with 4 properties properties.add(new LocalProperty("wintery")); - blocks = PropertyBlock.createPropertyBlockArray(properties); + blocks = PropertyBlock.createPropertyBlockArray(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,properties); assertEquals(1, blocks.length); testblock[ 0x0180 ] = ( byte ) 'w'; testblock[ 0x0182 ] = ( byte ) 'i'; @@ -128,7 +105,7 @@ public class TestPropertyBlock // test with 5 properties properties.add(new LocalProperty("foo")); - blocks = PropertyBlock.createPropertyBlockArray(properties); + blocks = PropertyBlock.createPropertyBlockArray(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,properties); assertEquals(2, blocks.length); testblock = new byte[ 1024 ]; for (int j = 0; j < 8; j++) @@ -178,7 +155,7 @@ public class TestPropertyBlock verifyCorrect(blocks, testblock); } - private void setDefaultBlock(byte [] testblock, int j) + private static void setDefaultBlock(byte [] testblock, int j) { int base = j * 128; int index = 0; @@ -204,15 +181,16 @@ public class TestPropertyBlock } } - private void verifyCorrect(BlockWritable [] blocks, byte [] testblock) - throws IOException - { + private static void verifyCorrect(BlockWritable[] blocks, byte[] testblock) { ByteArrayOutputStream stream = new ByteArrayOutputStream(512 * blocks.length); - for (int j = 0; j < blocks.length; j++) - { - blocks[ j ].writeBlocks(stream); + for (int j = 0; j < blocks.length; j++) { + try { + blocks[ j ].writeBlocks(stream); + } catch (IOException e) { + throw new RuntimeException(e); + } } byte[] output = stream.toByteArray(); @@ -223,17 +201,4 @@ public class TestPropertyBlock output[ j ]); } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.storage.PropertyBlock"); - junit.textui.TestRunner.run(TestPropertyBlock.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java b/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java index a4cdb734a6..5b632ce833 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,233 +14,212 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; import java.util.Random; -import org.apache.poi.util.DummyPOILogger; -import org.apache.poi.util.POILogFactory; +import junit.framework.TestCase; -import junit.framework.*; +import org.apache.poi.util.DummyPOILogger; /** * Class to test RawDataBlock functionality * * @author Marc Johnson */ - -public class TestRawDataBlock - extends TestCase -{ +public final class TestRawDataBlock extends TestCase { static { - // We always want to use our own - // logger - System.setProperty( - "org.apache.poi.util.POILogger", - "org.apache.poi.util.DummyPOILogger" - ); + // We always want to use our own + // logger + System.setProperty( + "org.apache.poi.util.POILogger", + "org.apache.poi.util.DummyPOILogger" + ); } - /** - * Constructor TestRawDataBlock - * - * @param name - */ - public TestRawDataBlock(String name) - { - super(name); - } + /** + * Test creating a normal RawDataBlock + */ + public void testNormalConstructor() throws IOException { + byte[] data = new byte[ 512 ]; - /** - * Test creating a normal RawDataBlock - * - * @exception IOException - */ + for (int j = 0; j < 512; j++) + { + data[ j ] = ( byte ) j; + } + RawDataBlock block = new RawDataBlock(new ByteArrayInputStream(data)); - public void testNormalConstructor() - throws IOException - { - byte[] data = new byte[ 512 ]; + assertTrue("Should not be at EOF", !block.eof()); + byte[] out_data = block.getData(); - for (int j = 0; j < 512; j++) - { - data[ j ] = ( byte ) j; - } - RawDataBlock block = new RawDataBlock(new ByteArrayInputStream(data)); + assertEquals("Should be same length", data.length, out_data.length); + for (int j = 0; j < 512; j++) + { + assertEquals("Should be same value at offset " + j, data[ j ], + out_data[ j ]); + } + } - assertTrue("Should not be at EOF", !block.eof()); - byte[] out_data = block.getData(); + /** + * Test creating an empty RawDataBlock + */ + public void testEmptyConstructor() throws IOException { + byte[] data = new byte[ 0 ]; + RawDataBlock block = new RawDataBlock(new ByteArrayInputStream(data)); - assertEquals("Should be same length", data.length, out_data.length); - for (int j = 0; j < 512; j++) - { - assertEquals("Should be same value at offset " + j, data[ j ], - out_data[ j ]); - } - } + assertTrue("Should be at EOF", block.eof()); + try + { + block.getData(); + } + catch (IOException ignored) + { - /** - * Test creating an empty RawDataBlock - * - * @exception IOException - */ + // as expected + } + } - public void testEmptyConstructor() - throws IOException - { - byte[] data = new byte[ 0 ]; - RawDataBlock block = new RawDataBlock(new ByteArrayInputStream(data)); + /** + * Test creating a short RawDataBlock + * Will trigger a warning, but no longer an IOException, + * as people seem to have "valid" truncated files + */ + public void testShortConstructor() throws Exception { + // Get the logger to be used + DummyPOILogger logger = new DummyPOILogger(); + Field fld = RawDataBlock.class.getDeclaredField("log"); + fld.setAccessible(true); + fld.set(null, logger); + assertEquals(0, logger.logged.size()); - assertTrue("Should be at EOF", block.eof()); - try - { - block.getData(); - } - catch (IOException ignored) - { + // Test for various data sizes + for (int k = 1; k <= 512; k++) + { + byte[] data = new byte[ k ]; - // as expected - } - } + for (int j = 0; j < k; j++) + { + data[ j ] = ( byte ) j; + } + RawDataBlock block = null; - /** - * Test creating a short RawDataBlock - * Will trigger a warning, but no longer an IOException, - * as people seem to have "valid" truncated files - */ - public void testShortConstructor() throws Exception - { - // Get the logger to be used - DummyPOILogger logger = (DummyPOILogger)POILogFactory.getLogger( - RawDataBlock.class - ); - assertEquals(0, logger.logged.size()); - - // Test for various data sizes - for (int k = 1; k <= 512; k++) - { - byte[] data = new byte[ k ]; + logger.reset(); + assertEquals(0, logger.logged.size()); - for (int j = 0; j < k; j++) - { - data[ j ] = ( byte ) j; - } - RawDataBlock block = null; - - logger.reset(); - assertEquals(0, logger.logged.size()); - - // Have it created - block = new RawDataBlock(new ByteArrayInputStream(data)); - assertNotNull(block); - - // Check for the warning is there for <512 - if(k < 512) { - assertEquals( - "Warning on " + k + " byte short block", - 1, logger.logged.size() - ); - - // Build the expected warning message, and check - String bts = k + " byte"; - if(k > 1) { - bts += "s"; - } - - assertEquals( - "7 - Unable to read entire block; "+bts+" read before EOF; expected 512 bytes. Your document was either written by software that ignores the spec, or has been truncated!", - (String)(logger.logged.get(0)) - ); - } else { - assertEquals(0, logger.logged.size()); - } - } - } - - /** - * Tests that when using a slow input stream, which - * won't return a full block at a time, we don't - * incorrectly think that there's not enough data - */ - public void testSlowInputStream() throws Exception { - // Get the logger to be used - DummyPOILogger logger = (DummyPOILogger)POILogFactory.getLogger( - RawDataBlock.class - ); - assertEquals(0, logger.logged.size()); - - // Test for various ok data sizes - for (int k = 1; k < 512; k++) { - byte[] data = new byte[ 512 ]; - for (int j = 0; j < data.length; j++) { - data[j] = (byte) j; - } - - // Shouldn't complain, as there is enough data, - // even if it dribbles through - RawDataBlock block = - new RawDataBlock(new SlowInputStream(data, k)); - assertFalse(block.eof()); - } - - // But if there wasn't enough data available, will - // complain - for (int k = 1; k < 512; k++) { - byte[] data = new byte[ 511 ]; - for (int j = 0; j < data.length; j++) { - data[j] = (byte) j; - } - - logger.reset(); - assertEquals(0, logger.logged.size()); - - // Should complain, as there isn't enough data - RawDataBlock block = - new RawDataBlock(new SlowInputStream(data, k)); - assertNotNull(block); - assertEquals( - "Warning on " + k + " byte short block", - 1, logger.logged.size() - ); - } - } - - /** - * An input stream which will return a maximum of - * a given number of bytes to read, and often claims - * not to have any data - */ - public static class SlowInputStream extends InputStream { - private Random rnd = new Random(); - private byte[] data; - private int chunkSize; - private int pos = 0; - - public SlowInputStream(byte[] data, int chunkSize) { - this.chunkSize = chunkSize; - this.data = data; - } - - /** - * 75% of the time, claim there's no data available - */ - private boolean claimNoData() { - if(rnd.nextFloat() < 0.25f) { - return false; - } - return true; - } - - public int read() throws IOException { + // Have it created + block = new RawDataBlock(new ByteArrayInputStream(data)); + assertNotNull(block); + + // Check for the warning is there for <512 + if(k < 512) { + assertEquals( + "Warning on " + k + " byte short block", + 1, logger.logged.size() + ); + + // Build the expected warning message, and check + String bts = k + " byte"; + if(k > 1) { + bts += "s"; + } + + assertEquals( + "7 - Unable to read entire block; "+bts+" read before EOF; expected 512 bytes. Your document was either written by software that ignores the spec, or has been truncated!", + (String)(logger.logged.get(0)) + ); + } else { + assertEquals(0, logger.logged.size()); + } + } + } + + /** + * Tests that when using a slow input stream, which + * won't return a full block at a time, we don't + * incorrectly think that there's not enough data + */ + public void testSlowInputStream() throws Exception { + // Get the logger to be used + DummyPOILogger logger = new DummyPOILogger(); + Field fld = RawDataBlock.class.getDeclaredField("log"); + fld.setAccessible(true); + fld.set(null, logger); + assertEquals(0, logger.logged.size()); + + // Test for various ok data sizes + for (int k = 1; k < 512; k++) { + byte[] data = new byte[ 512 ]; + for (int j = 0; j < data.length; j++) { + data[j] = (byte) j; + } + + // Shouldn't complain, as there is enough data, + // even if it dribbles through + RawDataBlock block = + new RawDataBlock(new SlowInputStream(data, k)); + assertFalse(block.eof()); + } + + // But if there wasn't enough data available, will + // complain + for (int k = 1; k < 512; k++) { + byte[] data = new byte[ 511 ]; + for (int j = 0; j < data.length; j++) { + data[j] = (byte) j; + } + + logger.reset(); + assertEquals(0, logger.logged.size()); + + // Should complain, as there isn't enough data + RawDataBlock block = + new RawDataBlock(new SlowInputStream(data, k)); + assertNotNull(block); + assertEquals( + "Warning on " + k + " byte short block", + 1, logger.logged.size() + ); + } + } + + /** + * An input stream which will return a maximum of + * a given number of bytes to read, and often claims + * not to have any data + */ + public static class SlowInputStream extends InputStream { + private Random rnd = new Random(); + private byte[] data; + private int chunkSize; + private int pos = 0; + + public SlowInputStream(byte[] data, int chunkSize) { + this.chunkSize = chunkSize; + this.data = data; + } + + /** + * 75% of the time, claim there's no data available + */ + private boolean claimNoData() { + if(rnd.nextFloat() < 0.25f) { + return false; + } + return true; + } + + public int read() { if(pos >= data.length) { return -1; } int ret = data[pos]; pos++; - + if(ret < 0) ret += 256; return ret; } @@ -251,7 +229,7 @@ public class TestRawDataBlock * size, whichever is lower. * Quite often will simply claim to have no data */ - public int read(byte[] b, int off, int len) throws IOException { + public int read(byte[] b, int off, int len) { // Keep the length within the chunk size if(len > chunkSize) { len = chunkSize; @@ -259,40 +237,26 @@ public class TestRawDataBlock // Don't read off the end of the data if(pos + len > data.length) { len = data.length - pos; - + // Spot when we're out of data if(len == 0) { return -1; } } - + // 75% of the time, claim there's no data if(claimNoData()) { return 0; } - + // Copy, and return what we read System.arraycopy(data, pos, b, off, len); pos += len; return len; } - public int read(byte[] b) throws IOException { + public int read(byte[] b) { return read(b, 0, b.length); } - - } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.storage.RawDataBlock"); - junit.textui.TestRunner.run(TestRawDataBlock.class); - } + } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java b/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java index 0f65c0e8a4..6dabfc0430 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,27 +14,24 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.lang.reflect.Field; + +import junit.framework.TestCase; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.util.DummyPOILogger; -import org.apache.poi.util.POILogFactory; - -import junit.framework.*; /** * Class to test RawDataBlockList functionality * * @author Marc Johnson */ - -public class TestRawDataBlockList - extends TestCase -{ +public final class TestRawDataBlockList extends TestCase { static { // We always want to use our own // logger @@ -45,57 +41,37 @@ public class TestRawDataBlockList ); } - /** - * Constructor TestRawDataBlockList - * - * @param name - */ - public TestRawDataBlockList(String name) - { - super(name); - } - /** * Test creating a normal RawDataBlockList - * - * @exception IOException */ - public void testNormalConstructor() - throws IOException - { + public void testNormalConstructor() throws IOException { byte[] data = new byte[ 2560 ]; for (int j = 0; j < 2560; j++) { data[ j ] = ( byte ) j; } - new RawDataBlockList(new ByteArrayInputStream(data), POIFSConstants.BIG_BLOCK_SIZE); + new RawDataBlockList(new ByteArrayInputStream(data), POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); } /** * Test creating an empty RawDataBlockList - * - * @exception IOException */ - - public void testEmptyConstructor() - throws IOException - { - new RawDataBlockList(new ByteArrayInputStream(new byte[ 0 ]), POIFSConstants.BIG_BLOCK_SIZE); + public void testEmptyConstructor() throws IOException { + new RawDataBlockList(new ByteArrayInputStream(new byte[ 0 ]), POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); } /** * Test creating a short RawDataBlockList */ - - public void testShortConstructor() throws Exception - { + public void testShortConstructor() throws Exception { // Get the logger to be used - DummyPOILogger logger = (DummyPOILogger)POILogFactory.getLogger( - RawDataBlock.class - ); + DummyPOILogger logger = new DummyPOILogger(); + Field fld = RawDataBlock.class.getDeclaredField("log"); + fld.setAccessible(true); + fld.set(null, logger); assertEquals(0, logger.logged.size()); - + // Test for various short sizes for (int k = 2049; k < 2560; k++) { @@ -108,21 +84,8 @@ public class TestRawDataBlockList // Check we logged the error logger.reset(); - new RawDataBlockList(new ByteArrayInputStream(data), POIFSConstants.BIG_BLOCK_SIZE); + new RawDataBlockList(new ByteArrayInputStream(data), POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); assertEquals(1, logger.logged.size()); } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out - .println("Testing org.apache.poi.poifs.storage.RawDataBlockList"); - junit.textui.TestRunner.run(TestRawDataBlockList.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableReader.java b/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableReader.java index 4d4254a91e..ee8ac39d59 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableReader.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableReader.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,15 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; -import java.util.*; - -import junit.framework.*; +import junit.framework.TestCase; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.property.PropertyTable; @@ -34,2113 +31,287 @@ import org.apache.poi.poifs.property.RootProperty; * * @author Marc Johnson */ +public final class TestSmallBlockTableReader extends TestCase { -public class TestSmallBlockTableReader - extends TestCase -{ + public void testReadingConstructor() throws IOException { - /** - * Constructor TestSmallBlockTableReader - * - * @param name - */ + // first, we need the raw data blocks + String[] raw_data_array = { + "52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "16 00 05 01 FF FF FF FF FF FF FF FF 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 80 07 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 01 01 FF FF FF FF FF FF FF FF 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "46 00 55 00 44 00 20 00 47 00 72 00 69 00 64 00 20 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00", + "74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2A 00 02 01 FF FF FF FF 0E 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "44 00 6F 00 75 00 62 00 6C 00 65 00 20 00 44 00 65 00 61 00 6C 00 69 00 6E 00 67 00 20 00 49 00", + "6E 00 64 00 69 00 63 00 61 00 74 00 6F 00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "32 00 02 01 FF FF FF FF 09 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00", + "43 00 68 00 69 00 6C 00 64 00 20 00 50 00 65 00 72 00 63 00 65 00 6E 00 74 00 61 00 67 00 65 00", + "20 00 50 00 65 00 72 00 6D 00 69 00 74 00 74 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00", + "36 00 02 01 FF FF FF FF 07 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 00 00 00 00", + "43 00 61 00 6E 00 63 00 65 00 6C 00 6C 00 61 00 74 00 69 00 6F 00 6E 00 20 00 46 00 65 00 65 00", + "20 00 46 00 69 00 78 00 65 00 64 00 20 00 56 00 61 00 6C 00 75 00 65 00 00 00 00 00 00 00 00 00", + "3A 00 02 01 FF FF FF FF 06 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00", + "55 00 6D 00 62 00 72 00 65 00 6C 00 6C 00 61 00 20 00 4C 00 69 00 6E 00 6B 00 73 00 20 00 61 00", + "6E 00 64 00 20 00 50 00 61 00 73 00 73 00 65 00 6E 00 67 00 65 00 72 00 73 00 00 00 00 00 00 00", + "3C 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "43 00 61 00 6E 00 63 00 65 00 6C 00 6C 00 61 00 74 00 69 00 6F 00 6E 00 20 00 46 00 65 00 65 00", + "20 00 50 00 65 00 72 00 63 00 65 00 6E 00 74 00 61 00 67 00 65 00 00 00 00 00 00 00 00 00 00 00", + "38 00 02 01 FF FF FF FF 05 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00", + "49 00 6E 00 66 00 61 00 6E 00 74 00 20 00 44 00 69 00 73 00 63 00 6F 00 75 00 6E 00 74 00 20 00", + "50 00 65 00 72 00 6D 00 69 00 74 00 74 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "34 00 02 01 FF FF FF FF 04 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00", + "43 00 61 00 6E 00 63 00 65 00 6C 00 6C 00 61 00 74 00 69 00 6F 00 6E 00 20 00 46 00 65 00 65 00", + "20 00 43 00 75 00 72 00 72 00 65 00 6E 00 63 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "34 00 02 01 FF FF FF FF 08 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 07 00 00 00 00 00 00 00", + "4F 00 75 00 74 00 62 00 6F 00 75 00 6E 00 64 00 20 00 54 00 72 00 61 00 76 00 65 00 6C 00 20 00", + "44 00 61 00 74 00 65 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2C 00 02 01 FF FF FF FF 0B 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 21 00 00 00 00 00 00 00", + "42 00 75 00 73 00 69 00 6E 00 65 00 73 00 73 00 20 00 4A 00 75 00 73 00 74 00 69 00 66 00 69 00", + "63 00 61 00 74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2E 00 02 01 FF FF FF FF 03 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 04 00 00 00 00 00 00 00", + "49 00 6E 00 66 00 61 00 6E 00 74 00 20 00 44 00 69 00 73 00 63 00 6F 00 75 00 6E 00 74 00 20 00", + "56 00 61 00 6C 00 75 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2C 00 02 01 FF FF FF FF 0D 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 04 00 00 00 00 00 00 00", + "4F 00 74 00 68 00 65 00 72 00 20 00 43 00 61 00 72 00 72 00 69 00 65 00 72 00 20 00 53 00 65 00", + "63 00 74 00 6F 00 72 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2C 00 02 01 FF FF FF FF 0A 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00 00 04 00 00 00 00 00 00 00", + "4E 00 75 00 6D 00 62 00 65 00 72 00 20 00 6F 00 66 00 20 00 50 00 61 00 73 00 73 00 65 00 6E 00", + "67 00 65 00 72 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "2A 00 02 01 FF FF FF FF 0C 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 04 00 00 00 00 00 00 00", + "53 00 61 00 6C 00 65 00 73 00 20 00 41 00 72 00 65 00 61 00 20 00 43 00 6F 00 64 00 65 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "20 00 02 01 1C 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 00 00 00 04 00 00 00 00 00 00 00", + "4F 00 74 00 68 00 65 00 72 00 20 00 52 00 65 00 66 00 75 00 6E 00 64 00 20 00 54 00 65 00 78 00", + "74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "24 00 02 01 17 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00 00 04 00 00 00 00 00 00 00", + "4D 00 61 00 78 00 69 00 6D 00 75 00 6D 00 20 00 53 00 74 00 61 00 79 00 20 00 50 00 65 00 72 00", + "69 00 6F 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 FF FF FF FF 14 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0D 00 00 00 04 00 00 00 00 00 00 00", + "4E 00 65 00 74 00 20 00 52 00 65 00 6D 00 69 00 74 00 20 00 50 00 65 00 72 00 6D 00 69 00 74 00", + "74 00 65 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 FF FF FF FF 13 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00 00 00 04 00 00 00 00 00 00 00", + "50 00 65 00 72 00 63 00 65 00 6E 00 74 00 61 00 67 00 65 00 20 00 6F 00 66 00 20 00 59 00 69 00", + "65 00 6C 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 FF FF FF FF 02 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F 00 00 00 04 00 00 00 00 00 00 00", + "4E 00 61 00 74 00 75 00 72 00 65 00 20 00 6F 00 66 00 20 00 56 00 61 00 72 00 69 00 61 00 74 00", + "69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 FF FF FF FF 12 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 50 00 00 00 00 00 00 00", + "46 00 55 00 44 00 20 00 47 00 72 00 69 00 64 00 20 00 44 00 69 00 6D 00 65 00 6E 00 73 00 69 00", + "6F 00 6E 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "28 00 02 01 10 00 00 00 11 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 00 00 04 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 44 00 65 00 73 00 63 00 72 00 69 00 70 00 74 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 19 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 00 00 00 09 00 00 00 00 00 00 00", + "54 00 52 00 56 00 41 00 20 00 49 00 6E 00 66 00 6F 00 72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 18 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 04 00 00 00 00 00 00 00", + "50 00 72 00 6F 00 72 00 61 00 74 00 65 00 20 00 43 00 6F 00 6D 00 6D 00 65 00 6E 00 74 00 73 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 16 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "43 00 6F 00 6D 00 6D 00 69 00 73 00 73 00 69 00 6F 00 6E 00 20 00 56 00 61 00 6C 00 75 00 65 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "22 00 02 01 0F 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 00 00 00 04 00 00 00 00 00 00 00", + "4D 00 61 00 78 00 69 00 6D 00 75 00 6D 00 20 00 53 00 74 00 61 00 79 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1A 00 02 01 20 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 16 00 00 00 05 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 43 00 75 00 72 00 72 00 65 00 6E 00 63 00 79 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1C 00 02 01 1D 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 07 00 00 00 00 00 00 00", + "43 00 6F 00 6E 00 73 00 6F 00 72 00 74 00 69 00 61 00 20 00 43 00 6F 00 64 00 65 00 73 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "20 00 02 01 1B 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "42 00 75 00 73 00 69 00 6E 00 65 00 73 00 73 00 20 00 54 00 79 00 70 00 65 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "1C 00 02 01 1A 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 04 00 00 00 00 00 00 00", + "44 00 65 00 61 00 6C 00 20 00 54 00 79 00 70 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 01 23 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 19 00 00 00 04 00 00 00 00 00 00 00", + "53 00 75 00 72 00 63 00 68 00 61 00 72 00 67 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 01 21 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1A 00 00 00 04 00 00 00 00 00 00 00", + "41 00 67 00 65 00 6E 00 74 00 73 00 20 00 4E 00 61 00 6D 00 65 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "18 00 02 01 1F 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 00 00 00 04 00 00 00 00 00 00 00", + "46 00 61 00 72 00 65 00 20 00 54 00 79 00 70 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 01 1E 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1C 00 00 00 04 00 00 00 00 00 00 00", + "53 00 75 00 62 00 20 00 44 00 65 00 61 00 6C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "12 00 02 01 24 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1D 00 00 00 04 00 00 00 00 00 00 00", + "41 00 4C 00 43 00 20 00 43 00 6F 00 64 00 65 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 02 01 22 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "52 00 65 00 6D 00 61 00 72 00 6B 00 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "10 00 02 01 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 03 00 47 42 50 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 1D 00 28 41 29 31 36 2D 4F 63 74 2D 32 30 30 31 20 74 6F 20 31 36 2D 4F 63 74 2D 32 30 30", + "31 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 01 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00", + "02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00", + "02 00 00 00 08 00 00 00 02 00 00 00 08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 18 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 05 00 6A 61 6D 65 73 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 01 00 31 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 03 00 47 42 50 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "08 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "02 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "11 00 00 00 FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF", + "FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FE FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00", + "09 00 00 00 FE FF FF FF 0B 00 00 00 0C 00 00 00 0D 00 00 00 FE FF FF FF FE FF FF FF FE FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF", + }; - public TestSmallBlockTableReader(String name) - { - super(name); - } + RawDataBlockList data_blocks = new RawDataBlockList(new ByteArrayInputStream(RawDataUtil + .decode(raw_data_array)), POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + int[] bat_array = { 15 }; - /** - * test reading constructor - * - * @exception IOException - */ + // need to initialize the block list with a block allocation + // table + new BlockAllocationTableReader(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 1, bat_array, 0, -2, data_blocks); + + // Fake up a header + HeaderBlock header_block = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + header_block.setPropertyStart(0); - public void testReadingConstructor() - throws IOException - { - - // first, we need the raw data blocks - byte[] raw_data_array = - { - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x45, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x80, ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x15, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x46, ( byte ) 0x00, ( byte ) 0x55, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x32, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x09, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x68, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x36, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x78, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x56, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x55, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4C, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x6B, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x3C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x38, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x34, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x46, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x34, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x76, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x21, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4A, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2E, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x49, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x56, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x09, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x62, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x2A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x6C, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4F, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x78, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x24, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x17, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x78, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x50, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x13, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x67, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x59, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4E, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x66, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x56, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x46, ( byte ) 0x00, ( byte ) 0x55, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x64, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x11, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x44, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x63, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x19, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x13, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x09, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x54, ( byte ) 0x00, ( byte ) 0x52, ( byte ) 0x00, - ( byte ) 0x56, ( byte ) 0x00, ( byte ) 0x41, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x49, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x66, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x18, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x50, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x69, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x56, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x0F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x15, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x4D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x78, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x74, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x79, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x16, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x43, ( byte ) 0x00, - ( byte ) 0x75, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x17, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x6F, ( byte ) 0x00, ( byte ) 0x72, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x42, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x69, ( byte ) 0x00, - ( byte ) 0x6E, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x18, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x23, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x19, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x63, ( byte ) 0x00, - ( byte ) 0x68, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x21, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1A, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x67, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x6E, ( byte ) 0x00, - ( byte ) 0x74, ( byte ) 0x00, ( byte ) 0x73, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x4E, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6D, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x18, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1F, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x46, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x20, ( byte ) 0x00, ( byte ) 0x54, ( byte ) 0x00, - ( byte ) 0x79, ( byte ) 0x00, ( byte ) 0x70, ( byte ) 0x00, - ( byte ) 0x65, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x1E, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x53, ( byte ) 0x00, ( byte ) 0x75, ( byte ) 0x00, - ( byte ) 0x62, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x44, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x61, ( byte ) 0x00, ( byte ) 0x6C, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x12, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x24, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x1D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x41, ( byte ) 0x00, ( byte ) 0x4C, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x20, ( byte ) 0x00, - ( byte ) 0x43, ( byte ) 0x00, ( byte ) 0x6F, ( byte ) 0x00, - ( byte ) 0x64, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x14, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0x22, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x52, ( byte ) 0x00, ( byte ) 0x65, ( byte ) 0x00, - ( byte ) 0x6D, ( byte ) 0x00, ( byte ) 0x61, ( byte ) 0x00, - ( byte ) 0x72, ( byte ) 0x00, ( byte ) 0x6B, ( byte ) 0x00, - ( byte ) 0x73, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x10, ( byte ) 0x00, ( byte ) 0x02, ( byte ) 0x01, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x42, ( byte ) 0x50, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x1D, ( byte ) 0x00, - ( byte ) 0x28, ( byte ) 0x41, ( byte ) 0x29, ( byte ) 0x31, - ( byte ) 0x36, ( byte ) 0x2D, ( byte ) 0x4F, ( byte ) 0x63, - ( byte ) 0x74, ( byte ) 0x2D, ( byte ) 0x32, ( byte ) 0x30, - ( byte ) 0x30, ( byte ) 0x31, ( byte ) 0x20, ( byte ) 0x74, - ( byte ) 0x6F, ( byte ) 0x20, ( byte ) 0x31, ( byte ) 0x36, - ( byte ) 0x2D, ( byte ) 0x4F, ( byte ) 0x63, ( byte ) 0x74, - ( byte ) 0x2D, ( byte ) 0x32, ( byte ) 0x30, ( byte ) 0x30, - ( byte ) 0x31, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x18, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x05, ( byte ) 0x00, - ( byte ) 0x6A, ( byte ) 0x61, ( byte ) 0x6D, ( byte ) 0x65, - ( byte ) 0x73, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x01, ( byte ) 0x00, - ( byte ) 0x31, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x03, ( byte ) 0x00, - ( byte ) 0x47, ( byte ) 0x42, ( byte ) 0x50, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x11, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x01, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x02, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x03, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x04, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x05, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x06, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x07, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x08, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x09, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0x0B, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0C, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0x0D, ( byte ) 0x00, ( byte ) 0x00, ( byte ) 0x00, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFE, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, - ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF, ( byte ) 0xFF - }; - RawDataBlockList data_blocks = - new RawDataBlockList(new ByteArrayInputStream(raw_data_array), POIFSConstants.BIG_BLOCK_SIZE); - int[] bat_array = - { - 15 - }; - - // need to initialize the block list with a block allocation - // table - new BlockAllocationTableReader(1, bat_array, 0, -2, data_blocks); - - // get property table from the document - PropertyTable properties = new PropertyTable(0, data_blocks); - RootProperty root = properties.getRoot(); - BlockList bl = - SmallBlockTableReader.getSmallDocumentBlocks(data_blocks, root, - 14); - } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.storage.SmallBlockTableReader"); - junit.textui.TestRunner.run(TestSmallBlockTableReader.class); - } + // get property table from the document + PropertyTable properties = new PropertyTable(header_block, data_blocks); + RootProperty root = properties.getRoot(); + BlockList bl = SmallBlockTableReader.getSmallDocumentBlocks( + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, data_blocks, root, 14); + assertNotNull(bl); + } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableWriter.java b/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableWriter.java index 981b244102..f10576a4aa 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableWriter.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableWriter.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,16 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; -import java.util.*; - -import junit.framework.*; +import junit.framework.TestCase; +import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.filesystem.POIFSDocument; import org.apache.poi.poifs.property.PropertyTable; import org.apache.poi.poifs.property.RootProperty; @@ -34,32 +34,10 @@ import org.apache.poi.poifs.property.RootProperty; * * @author Marc Johnson */ +public final class TestSmallBlockTableWriter extends TestCase { -public class TestSmallBlockTableWriter - extends TestCase -{ - - /** - * Constructor TestSmallBlockTableWriter - * - * @param name - */ - - public TestSmallBlockTableWriter(String name) - { - super(name); - } - - /** - * test writing constructor - * - * @exception IOException - */ - - public void testWritingConstructor() - throws IOException - { - List documents = new ArrayList(); + public void testWritingConstructor() throws IOException { + List documents = new ArrayList(); documents.add( new POIFSDocument( @@ -97,9 +75,11 @@ public class TestSmallBlockTableWriter documents .add(new POIFSDocument("doc9", new ByteArrayInputStream(new byte[ 9 ]))); - RootProperty root = new PropertyTable().getRoot(); - SmallBlockTableWriter sbtw = new SmallBlockTableWriter(documents, - root); + + HeaderBlock header = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + RootProperty root = new PropertyTable(header).getRoot(); + SmallBlockTableWriter sbtw = new SmallBlockTableWriter( + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, documents,root); BlockAllocationTableWriter bat = sbtw.getSBAT(); // 15 small blocks: 6 for doc340, 0 for doc5000 (too big), 0 @@ -113,17 +93,4 @@ public class TestSmallBlockTableWriter sbtw.setStartBlock(start_block); assertEquals(start_block, root.getStartBlock()); } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.storage.SmallBlockTableWriter"); - junit.textui.TestRunner.run(TestSmallBlockTableWriter.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestSmallDocumentBlock.java b/src/testcases/org/apache/poi/poifs/storage/TestSmallDocumentBlock.java index 05e51974f8..b061483c69 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestSmallDocumentBlock.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestSmallDocumentBlock.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,25 +14,26 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; -import java.util.*; +import org.apache.poi.poifs.common.POIFSConstants; -import junit.framework.*; +import junit.framework.TestCase; /** * Class to test SmallDocumentBlock functionality * * @author Marc Johnson */ - -public class TestSmallDocumentBlock - extends TestCase -{ +public final class TestSmallDocumentBlock extends TestCase { static final private byte[] _testdata; static final private int _testdata_size = 2999; @@ -45,25 +45,10 @@ public class TestSmallDocumentBlock _testdata[ j ] = ( byte ) j; } } - ; - - /** - * constructor - * - * @param name - */ - - public TestSmallDocumentBlock(String name) - { - super(name); - } /** * Test conversion from DocumentBlocks - * - * @exception IOException */ - public void testConvert1() throws IOException { @@ -72,7 +57,7 @@ public class TestSmallDocumentBlock while (true) { - DocumentBlock block = new DocumentBlock(stream); + DocumentBlock block = new DocumentBlock(stream,POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); documents.add(block); if (block.partiallyRead()) @@ -82,7 +67,7 @@ public class TestSmallDocumentBlock } SmallDocumentBlock[] results = SmallDocumentBlock - .convert(( BlockWritable [] ) documents + .convert(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,( BlockWritable [] ) documents .toArray(new DocumentBlock[ 0 ]), _testdata_size); assertEquals("checking correct result size: ", @@ -113,12 +98,7 @@ public class TestSmallDocumentBlock /** * Test conversion from byte array - * - * @exception IOException; - * - * @exception IOException */ - public void testConvert2() throws IOException { @@ -130,8 +110,8 @@ public class TestSmallDocumentBlock { array[ k ] = ( byte ) k; } - SmallDocumentBlock[] blocks = SmallDocumentBlock.convert(array, - 319); + SmallDocumentBlock[] blocks = SmallDocumentBlock.convert( + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, array, 319); assertEquals(5, blocks.length); ByteArrayOutputStream stream = new ByteArrayOutputStream(); @@ -154,57 +134,9 @@ public class TestSmallDocumentBlock } } - /** - * Test read method - * - * @exception IOException - */ - - public void testRead() - throws IOException - { - ByteArrayInputStream stream = new ByteArrayInputStream(_testdata); - List documents = new ArrayList(); - - while (true) - { - DocumentBlock block = new DocumentBlock(stream); - - documents.add(block); - if (block.partiallyRead()) - { - break; - } - } - SmallDocumentBlock[] blocks = - SmallDocumentBlock - .convert(( BlockWritable [] ) documents - .toArray(new DocumentBlock[ 0 ]), _testdata_size); - - for (int j = 1; j <= _testdata_size; j += 38) - { - byte[] buffer = new byte[ j ]; - int offset = 0; - - for (int k = 0; k < (_testdata_size / j); k++) - { - SmallDocumentBlock.read(blocks, buffer, offset); - for (int n = 0; n < buffer.length; n++) - { - assertEquals("checking byte " + (k * j) + n, - _testdata[ (k * j) + n ], buffer[ n ]); - } - offset += j; - } - } - } - /** * test fill - * - * @exception IOException */ - public void testFill() throws IOException { @@ -216,7 +148,7 @@ public class TestSmallDocumentBlock { foo.add(new Object()); } - int result = SmallDocumentBlock.fill(foo); + int result = SmallDocumentBlock.fill(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,foo); assertEquals("correct big block count: ", (j + 7) / 8, result); assertEquals("correct small block count: ", 8 * result, @@ -276,7 +208,7 @@ public class TestSmallDocumentBlock { new RawDataBlock(new ByteArrayInputStream(data)) }; - List output = SmallDocumentBlock.extract(blocks); + List output = SmallDocumentBlock.extract(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,blocks); Iterator iter = output.iterator(); offset = 0; @@ -294,17 +226,4 @@ public class TestSmallDocumentBlock } } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.storage.SmallDocumentBlock"); - junit.textui.TestRunner.run(TestSmallDocumentBlock.class); - } } diff --git a/src/testcases/org/apache/poi/poifs/storage/TestSmallDocumentBlockList.java b/src/testcases/org/apache/poi/poifs/storage/TestSmallDocumentBlockList.java index 6901112f96..5301214e91 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestSmallDocumentBlockList.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestSmallDocumentBlockList.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,44 +14,24 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.poifs.storage; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; -import junit.framework.*; +import org.apache.poi.poifs.common.POIFSConstants; + +import junit.framework.TestCase; /** * Class to test SmallDocumentBlockList functionality * * @author Marc Johnson */ +public final class TestSmallDocumentBlockList extends TestCase { -public class TestSmallDocumentBlockList - extends TestCase -{ - - /** - * Constructor TestSmallDocumentBlockList - * - * @param name - */ - - public TestSmallDocumentBlockList(String name) - { - super(name); - } - - /** - * Test creating a SmallDocumentBlockList - * - * @exception IOException - */ - - public void testConstructor() - throws IOException - { + public void testConstructor() throws IOException { byte[] data = new byte[ 2560 ]; for (int j = 0; j < 2560; j++) @@ -67,7 +46,7 @@ public class TestSmallDocumentBlockList blocks[ j ] = new RawDataBlock(stream); } SmallDocumentBlockList sdbl = - new SmallDocumentBlockList(SmallDocumentBlock.extract(blocks)); + new SmallDocumentBlockList(SmallDocumentBlock.extract(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS,blocks)); // proof we added the blocks for (int j = 0; j < 40; j++) @@ -85,17 +64,4 @@ public class TestSmallDocumentBlockList // it better have thrown one!! } } - - /** - * main method to run the unit tests - * - * @param ignored_args - */ - - public static void main(String [] ignored_args) - { - System.out.println( - "Testing org.apache.poi.poifs.storage.SmallDocumentBlockList"); - junit.textui.TestRunner.run(TestSmallDocumentBlockList.class); - } } diff --git a/src/testcases/org/apache/poi/util/AllPOIUtilTests.java b/src/testcases/org/apache/poi/util/AllPOIUtilTests.java index bb6d382047..686aa549d1 100755 --- a/src/testcases/org/apache/poi/util/AllPOIUtilTests.java +++ b/src/testcases/org/apache/poi/util/AllPOIUtilTests.java @@ -27,17 +27,14 @@ import junit.framework.TestSuite; public final class AllPOIUtilTests { public static Test suite() { - TestSuite result = new TestSuite("Tests for org.apache.poi.util"); + TestSuite result = new TestSuite(AllPOIUtilTests.class.getName()); result.addTestSuite(TestArrayUtil.class); result.addTestSuite(TestBinaryTree.class); result.addTestSuite(TestBitField.class); result.addTestSuite(TestByteField.class); - result.addTestSuite(TestDoubleList2d.class); result.addTestSuite(TestHexDump.class); result.addTestSuite(TestIntegerField.class); result.addTestSuite(TestIntList.class); - result.addTestSuite(TestIntList2d.class); - result.addTestSuite(TestList2d.class); result.addTestSuite(TestLittleEndian.class); result.addTestSuite(TestLongField.class); result.addTestSuite(TestPOILogFactory.class); diff --git a/src/testcases/org/apache/poi/util/DummyPOILogger.java b/src/testcases/org/apache/poi/util/DummyPOILogger.java index 7efbfac293..f72e37b512 100644 --- a/src/testcases/org/apache/poi/util/DummyPOILogger.java +++ b/src/testcases/org/apache/poi/util/DummyPOILogger.java @@ -37,10 +37,10 @@ public class DummyPOILogger extends POILogger { public void initialize(String cat) {} public void log(int level, Object obj1) { - logged.add(new String(level + " - " + obj1)); + logged.add(level + " - " + obj1); } public void log(int level, Object obj1, Throwable exception) { - logged.add(new String(level + " - " + obj1 + " - " + exception)); + logged.add(level + " - " + obj1 + " - " + exception); } } diff --git a/src/testcases/org/apache/poi/util/LocalTestNode.java b/src/testcases/org/apache/poi/util/LocalTestNode.java index 2f1ae62649..6eaaed5901 100644 --- a/src/testcases/org/apache/poi/util/LocalTestNode.java +++ b/src/testcases/org/apache/poi/util/LocalTestNode.java @@ -15,7 +15,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.util; @@ -33,7 +32,7 @@ class LocalTestNode LocalTestNode(final int key) { - _key = new Integer(key); + _key = Integer.valueOf(key); _value = String.valueOf(key); } @@ -118,7 +117,6 @@ class LocalTestNode /** * @return hash code */ - public int hashCode() { return getKey().hashCode() ^ getValue().hashCode(); diff --git a/src/testcases/org/apache/poi/util/TestArrayUtil.java b/src/testcases/org/apache/poi/util/TestArrayUtil.java index 7a517e3c6b..2af0481513 100644 --- a/src/testcases/org/apache/poi/util/TestArrayUtil.java +++ b/src/testcases/org/apache/poi/util/TestArrayUtil.java @@ -15,261 +15,264 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.util; -import junit.framework.*; +import junit.framework.TestCase; /** * Unit test for ArrayUtil * * @author Nick Burch */ -public class TestArrayUtil extends TestCase -{ +public class TestArrayUtil extends TestCase { /** * Test to ensure that our own arraycopy behaves as it should do */ public void testarraycopy() { byte[] bytes = new byte[] { 0x01, 0x02, 0x03, 0x04 }; - + // Test copy whole thing byte[] dest = new byte[4]; ArrayUtil.arraycopy(bytes, 0, dest, 0, 4); - + assertEquals(dest.length, bytes.length); for(int i=0; i