// Path: src/com/metamolecular/mx/model/Atom.java
// public interface Atom
// {
//   public String getSymbol();
//   
//   public void setSymbol(String newSymbol);
//   
//   public int getIndex();
//   
//   public void setIsotope(int isotope);
//   
//   public int getIsotope();
//   
//   public boolean hasSingleIsotope();
//   
//   public void setCharge(int charge);
//   
//   public int getCharge();
//   
//   public void setRadical(int radical);
//   
//   public int getRadical();
//   
//   public Atom[] getNeighbors();
//   
//   public Bond[] getBonds();
//   
//   public Bond getBond(Atom neighbor);
//   
//   public int countNeighbors();
//   
//   public boolean isConnectedTo(Atom atom);
//   
//   public int countVirtualHydrogens();
//   
//   public double getX();
//   
//   public double getY();
//   
//   public double getZ();
//   
//   public void move(double x, double y, double z);
//   
//   public int getValence();
//   
//   public Molecule getMolecule();
// }
// 
// Path: src/com/metamolecular/mx/model/Molecule.java
// public interface Molecule
// {
//   public int countAtoms();
//   
//   public int countBonds();
// 
//   public int countSuperatoms();
// 
//   public Atom getAtom(int index);
//   
//   public Bond getBond(int index);
//   
//   public Bond getBond(Atom source, Atom target);
// 
//   public Superatom getSuperatom(int index);
// 
//   public Superatom addSuperatom();
// 
//   public Atom addAtom(String symbol, double x, double y, double z);
//   
//   public Atom addAtom(String symbol);
//   
//   public void removeAtom(Atom atom);
//   
//   public Bond connect(Atom source, Atom target, int type, int stereo);
//   
//   public Bond connect(Atom source, Atom target, int type);
//                                      
//   public void removeBond(Bond bond);
//   
//   public void disconnect(Atom source, Atom target);
// 
//   public void removeSuperatom(Superatom substructure);
//   
//   public void clear();
//   
//   public void beginModify();
//   
//   public void endModify();
// 
//   public void addChangeListener(ChangeListener listener);
// 
//   public void removeChangeListener(ChangeListener listener);
//   
//   public Molecule copy();
//   
//   public void copy(Molecule molecule);
// }
// 
// Path: src/com/metamolecular/mx/model/Superatom.java
// public interface Superatom
// {
//   public String getLabel();
// 
//   public void setLabel(String label);
// 
//   public int countAtoms();
// 
//   public int countCrossingBonds();
// 
//   public Atom getAtom(int index);
// 
//   public Bond getCrossingBond(int index);
// 
//   public boolean contains(Atom atom);
// 
//   public boolean contains(Bond bond);
// 
//   public void addAtom(Atom atom);
// 
//   public void removeAtom(Atom atom);
// 
//   public void addCrossingBond(Bond bond);
// 
//   public void removeCrossingBond(Bond bond);
// 
//   public void setCrossingVector(Bond bond, double x, double y);
// 
//   public double getCrossingVectorX(Bond bond);
// 
//   public double getCrossingVectorY(Bond bond);
// 
//   public int getIndex();
// 
//   public Molecule getMolecule();
// }


import java.util.List;
import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Molecule;
import com.metamolecular.mx.model.Superatom;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.io.IOException;
import java.util.ArrayList;
    if ("M  STY".equals(property))
    {
      int entryCount = MDLStringKit.extractInt(line, 6, 9);
      for (int i = 0; i < entryCount; i++)
      {
        int offset = i * 8;
        int sgroupIndex = MDLStringKit.extractInt(line, offset + 10, offset + 13);
        String sgroupType = MDLStringKit.extractString(line, offset + 14, offset + 17);
        if (!"SUP".equals(sgroupType))
        {
          throw new RuntimeException("Error parsing Substructure, only Superatom is supported.");
        }
        mol.addSuperatom();
      }
    }
    else if ("M  SLB".equals(property))
    {//        Ignore Identifier

//          int entryCount = MDLStringKit.extractInt(line, 6, 9);
//          for (int i = 0; i < entryCount; i++)
//          {
//            int offset = i * 8;
//            int sgroupIndex = MDLStringKit.extractInt(line, offset + 10, offset + 13);
//            int sgroupIdentifier = MDLStringKit.extractInt(line, offset + 14, offset + 17);
//            Substructure substructure = mol.getSubstructure(sgroupIndex-1);
//          }
      }
    else if ("M  SAL".equals(property))
    {
      int sgroupIndex = MDLStringKit.extractInt(line, 6, 10);
// Path: src/com/metamolecular/mx/model/Atom.java
// public interface Atom
// {
//   public String getSymbol();
//   
//   public void setSymbol(String newSymbol);
//   
//   public int getIndex();
//   
//   public void setIsotope(int isotope);
//   
//   public int getIsotope();
//   
//   public boolean hasSingleIsotope();
//   
//   public void setCharge(int charge);
//   
//   public int getCharge();
//   
//   public void setRadical(int radical);
//   
//   public int getRadical();
//   
//   public Atom[] getNeighbors();
//   
//   public Bond[] getBonds();
//   
//   public Bond getBond(Atom neighbor);
//   
//   public int countNeighbors();
//   
//   public boolean isConnectedTo(Atom atom);
//   
//   public int countVirtualHydrogens();
//   
//   public double getX();
//   
//   public double getY();
//   
//   public double getZ();
//   
//   public void move(double x, double y, double z);
//   
//   public int getValence();
//   
//   public Molecule getMolecule();
// }
// 
// Path: src/com/metamolecular/mx/model/Molecule.java
// public interface Molecule
// {
//   public int countAtoms();
//   
//   public int countBonds();
// 
//   public int countSuperatoms();
// 
//   public Atom getAtom(int index);
//   
//   public Bond getBond(int index);
//   
//   public Bond getBond(Atom source, Atom target);
// 
//   public Superatom getSuperatom(int index);
// 
//   public Superatom addSuperatom();
// 
//   public Atom addAtom(String symbol, double x, double y, double z);
//   
//   public Atom addAtom(String symbol);
//   
//   public void removeAtom(Atom atom);
//   
//   public Bond connect(Atom source, Atom target, int type, int stereo);
//   
//   public Bond connect(Atom source, Atom target, int type);
//                                      
//   public void removeBond(Bond bond);
//   
//   public void disconnect(Atom source, Atom target);
// 
//   public void removeSuperatom(Superatom substructure);
//   
//   public void clear();
//   
//   public void beginModify();
//   
//   public void endModify();
// 
//   public void addChangeListener(ChangeListener listener);
// 
//   public void removeChangeListener(ChangeListener listener);
//   
//   public Molecule copy();
//   
//   public void copy(Molecule molecule);
// }
// 
// Path: src/com/metamolecular/mx/model/Superatom.java
// public interface Superatom
// {
//   public String getLabel();
// 
//   public void setLabel(String label);
// 
//   public int countAtoms();
// 
//   public int countCrossingBonds();
// 
//   public Atom getAtom(int index);
// 
//   public Bond getCrossingBond(int index);
// 
//   public boolean contains(Atom atom);
// 
//   public boolean contains(Bond bond);
// 
//   public void addAtom(Atom atom);
// 
//   public void removeAtom(Atom atom);
// 
//   public void addCrossingBond(Bond bond);
// 
//   public void removeCrossingBond(Bond bond);
// 
//   public void setCrossingVector(Bond bond, double x, double y);
// 
//   public double getCrossingVectorX(Bond bond);
// 
//   public double getCrossingVectorY(Bond bond);
// 
//   public int getIndex();
// 
//   public Molecule getMolecule();
// }


// Path: src/com/metamolecular/mx/io/mdl/MolfileReader.java
import java.util.List;
import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Molecule;
import com.metamolecular.mx.model.Superatom;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.io.IOException;
import java.util.ArrayList;

    if ("M  STY".equals(property))
    {
      int entryCount = MDLStringKit.extractInt(line, 6, 9);
      for (int i = 0; i < entryCount; i++)
      {
        int offset = i * 8;
        int sgroupIndex = MDLStringKit.extractInt(line, offset + 10, offset + 13);
        String sgroupType = MDLStringKit.extractString(line, offset + 14, offset + 17);
        if (!"SUP".equals(sgroupType))
        {
          throw new RuntimeException("Error parsing Substructure, only Superatom is supported.");
        }
        mol.addSuperatom();
      }
    }
    else if ("M  SLB".equals(property))
    {//        Ignore Identifier

//          int entryCount = MDLStringKit.extractInt(line, 6, 9);
//          for (int i = 0; i < entryCount; i++)
//          {
//            int offset = i * 8;
//            int sgroupIndex = MDLStringKit.extractInt(line, offset + 10, offset + 13);
//            int sgroupIdentifier = MDLStringKit.extractInt(line, offset + 14, offset + 17);
//            Substructure substructure = mol.getSubstructure(sgroupIndex-1);
//          }
      }
    else if ("M  SAL".equals(property))
    {
      int sgroupIndex = MDLStringKit.extractInt(line, 6, 10);
      Superatom substructure = mol.getSuperatom(sgroupIndex - 1);