// Path: src/main/java/org/tinspin/data/hdf5/HDF5BlockSNOD.java
// 	static class SymbolTableEntry extends HDF5Block {
// 		static final int SIZE = 40;
// 		
// 		//Link Name OffsetO
// 		long l0LinkNameOffsetO;
// 
// 		//Object Header AddressO
// 		int l8ObjectHeaderAddressO;
// 
// 		//Cache Type
// 		long i16CachedType;
// 		
// 		//Reserved (zero)
// 		long i20Zero;
// 
// 		//Scratch-pad Space (16 bytes)
// 		
// 		//CT 1: Address of B-treeO
// 		long l24ct1addressBTreeO;
// 
// 		//CT 1: Address of Name HeapO
// 		long l32ct1addressNameHeapO;
// 
// 		//CT 2: Offset to Link Value (4 bytes)
// 		long i24ct2offsetToLink;
// 		
// 		public SymbolTableEntry(int offset, int version) {
// 			super(offset, version);
// 		}
// 		
// 		@Override
// 		public String toString() {
// 			String ret =  
// 					"SymTE(" + getOffset() + ")" + Reader.L + 
// 					//Link Name OffsetO
// 					"LinkNameOffset=" + l0LinkNameOffsetO + Reader.L +
// 
// 					//Object Header AddressO
// 					"ObjectHeaderAddress=" + l8ObjectHeaderAddressO + Reader.L +
// 
// 					//Cache Type
// 					"CachedType=" + i16CachedType + Reader.L;
// 
// 			//Reserved (zero)
// 			//"Zero=" + i12Zero + Reader.L;
// 
// 			//Scratch-pad Space (16 bytes)
// 
// 			if (i16CachedType == 1) {
// 				ret +=
// 						//CT 1: Address of B-treeO
// 						"ct1addressBTreeO=" + l24ct1addressBTreeO + Reader.L + 
// 
// 						//CT 1: Address of Name HeapO
// 						"ct1addressNameHeapO=" + l32ct1addressNameHeapO;
// 			} else if (i16CachedType == 2) {
// 				ret +=
// 						//CT 2: Offset to Link Value (4 bytes)
// 						"ct2offsetToLink=" + i24ct2offsetToLink;
// 			}
// 			return ret;
// 		}
// 
// 		public int getOffsetTREE() {
// 			if (i16CachedType == 1) {
// 				return (int) l24ct1addressBTreeO;
// 			} else if (i16CachedType == 2) {
// //				ret +=
// //						//CT 2: Offset to Link Value (4 bytes)
// //						"ct2offsetToLink=" + i24ct2offsetToLink;
// 			}
// 			throw new UnsupportedOperationException();
// 		}
// 
// 		public int getOffsetHEAP() {
// 			if (i16CachedType == 1) {
// 				return (int) l32ct1addressNameHeapO;
// 			} else if (i16CachedType == 2) {
// //				ret +=
// //						//CT 2: Offset to Link Value (4 bytes)
// //						"ct2offsetToLink=" + i24ct2offsetToLink;
// 			}
// 			throw new UnsupportedOperationException();
// 		}
// 	}


import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.Objects;
import org.tinspin.data.hdf5.HDF5BlockSNOD.SymbolTableEntry;
		
		sb.rootGroupSymbolTableEntry = readSymbolTableEntry(bb, sLen, sOffs);
		//sb.i60rootGSTE = read4(bb);
		//sb.rootGroupSymbolTableEntryHEADER = readDOHeaderPrefix(bb, sb.rootGroupSymbolTableEntry.l8ObjectHeaderAddressO);
		skipTo(bb, sb.rootGroupSymbolTableEntry.l8ObjectHeaderAddressO);
		sb.rootGroupSymbolTableEntryHEADER = readDOHeaderPrefix(bb, sb);
		
		//Not specified, but appears to be the case...
		alignPos8(bb);
				
		Group rootGroup = new Group();
		
		skipTo(bb, sb.rootGroupSymbolTableEntry.getOffsetTREE());
		readSignature(bb, BLOCK_ID_TREE);
		rootGroup.tree = readTREE(bb, sLen, sOffs, sb);

		skipTo(bb, sb.rootGroupSymbolTableEntry.getOffsetHEAP());
		readSignature(bb, BLOCK_ID_HEAP);
		rootGroup.heap = readHEAP(bb, sLen, sOffs);

		alignPos8(bb);
		
//		readAny(bb, sb, 1_200);
		
		//read B-Tree SNOD
		skipTo(bb, (int) rootGroup.tree.childPointers[0]);
		readSignature(bb, BLOCK_ID_SNOD);
		HDF5BlockSNOD rootSNOD = readSNOD(bb, sLen, sOffs, sb);
		ArrayList<HDF5Dataset> data = new ArrayList<>();
		for (int i = 0; i < rootSNOD.symbols.length; i++) {
// Path: src/main/java/org/tinspin/data/hdf5/HDF5BlockSNOD.java
// 	static class SymbolTableEntry extends HDF5Block {
// 		static final int SIZE = 40;
// 		
// 		//Link Name OffsetO
// 		long l0LinkNameOffsetO;
// 
// 		//Object Header AddressO
// 		int l8ObjectHeaderAddressO;
// 
// 		//Cache Type
// 		long i16CachedType;
// 		
// 		//Reserved (zero)
// 		long i20Zero;
// 
// 		//Scratch-pad Space (16 bytes)
// 		
// 		//CT 1: Address of B-treeO
// 		long l24ct1addressBTreeO;
// 
// 		//CT 1: Address of Name HeapO
// 		long l32ct1addressNameHeapO;
// 
// 		//CT 2: Offset to Link Value (4 bytes)
// 		long i24ct2offsetToLink;
// 		
// 		public SymbolTableEntry(int offset, int version) {
// 			super(offset, version);
// 		}
// 		
// 		@Override
// 		public String toString() {
// 			String ret =  
// 					"SymTE(" + getOffset() + ")" + Reader.L + 
// 					//Link Name OffsetO
// 					"LinkNameOffset=" + l0LinkNameOffsetO + Reader.L +
// 
// 					//Object Header AddressO
// 					"ObjectHeaderAddress=" + l8ObjectHeaderAddressO + Reader.L +
// 
// 					//Cache Type
// 					"CachedType=" + i16CachedType + Reader.L;
// 
// 			//Reserved (zero)
// 			//"Zero=" + i12Zero + Reader.L;
// 
// 			//Scratch-pad Space (16 bytes)
// 
// 			if (i16CachedType == 1) {
// 				ret +=
// 						//CT 1: Address of B-treeO
// 						"ct1addressBTreeO=" + l24ct1addressBTreeO + Reader.L + 
// 
// 						//CT 1: Address of Name HeapO
// 						"ct1addressNameHeapO=" + l32ct1addressNameHeapO;
// 			} else if (i16CachedType == 2) {
// 				ret +=
// 						//CT 2: Offset to Link Value (4 bytes)
// 						"ct2offsetToLink=" + i24ct2offsetToLink;
// 			}
// 			return ret;
// 		}
// 
// 		public int getOffsetTREE() {
// 			if (i16CachedType == 1) {
// 				return (int) l24ct1addressBTreeO;
// 			} else if (i16CachedType == 2) {
// //				ret +=
// //						//CT 2: Offset to Link Value (4 bytes)
// //						"ct2offsetToLink=" + i24ct2offsetToLink;
// 			}
// 			throw new UnsupportedOperationException();
// 		}
// 
// 		public int getOffsetHEAP() {
// 			if (i16CachedType == 1) {
// 				return (int) l32ct1addressNameHeapO;
// 			} else if (i16CachedType == 2) {
// //				ret +=
// //						//CT 2: Offset to Link Value (4 bytes)
// //						"ct2offsetToLink=" + i24ct2offsetToLink;
// 			}
// 			throw new UnsupportedOperationException();
// 		}
// 	}


// Path: src/main/java/org/tinspin/data/hdf5/Reader.java
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.Objects;
import org.tinspin.data.hdf5.HDF5BlockSNOD.SymbolTableEntry;

		
		sb.rootGroupSymbolTableEntry = readSymbolTableEntry(bb, sLen, sOffs);
		//sb.i60rootGSTE = read4(bb);
		//sb.rootGroupSymbolTableEntryHEADER = readDOHeaderPrefix(bb, sb.rootGroupSymbolTableEntry.l8ObjectHeaderAddressO);
		skipTo(bb, sb.rootGroupSymbolTableEntry.l8ObjectHeaderAddressO);
		sb.rootGroupSymbolTableEntryHEADER = readDOHeaderPrefix(bb, sb);
		
		//Not specified, but appears to be the case...
		alignPos8(bb);
				
		Group rootGroup = new Group();
		
		skipTo(bb, sb.rootGroupSymbolTableEntry.getOffsetTREE());
		readSignature(bb, BLOCK_ID_TREE);
		rootGroup.tree = readTREE(bb, sLen, sOffs, sb);

		skipTo(bb, sb.rootGroupSymbolTableEntry.getOffsetHEAP());
		readSignature(bb, BLOCK_ID_HEAP);
		rootGroup.heap = readHEAP(bb, sLen, sOffs);

		alignPos8(bb);
		
//		readAny(bb, sb, 1_200);
		
		//read B-Tree SNOD
		skipTo(bb, (int) rootGroup.tree.childPointers[0]);
		readSignature(bb, BLOCK_ID_SNOD);
		HDF5BlockSNOD rootSNOD = readSNOD(bb, sLen, sOffs, sb);
		ArrayList<HDF5Dataset> data = new ArrayList<>();
		for (int i = 0; i < rootSNOD.symbols.length; i++) {
			SymbolTableEntry ste = rootSNOD.symbols[i];