From 3838fccdc97eaf4efbb839eccf376e2360e7dce7 Mon Sep 17 00:00:00 2001 From: Jonas Nyrup Date: Thu, 4 Apr 2019 14:56:47 +0200 Subject: [PATCH 1/3] Fix two typos --- ChangeLog.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog.rst b/ChangeLog.rst index 8212b11..7d04cdd 100644 --- a/ChangeLog.rst +++ b/ChangeLog.rst @@ -36,9 +36,9 @@ New Features to allow disabling of messages to stdout during calculation. - The graph interface on :cpp:any:`dg::DG`/:py:obj:`DG` can now be used before and during calculation. -- Added include of the PGFPlots package in the summary preable. +- Added include of the PGFPlots package in the summary preamble. - Added :cpp:any:`AtomId::symbol`/:py:obj:`AtomId.symbol`. -- Adeed an ``add`` parameter to :py:obj:`graphGMLString`, :py:obj:`graphGML`, +- Added an ``add`` parameter to :py:obj:`graphGMLString`, :py:obj:`graphGML`, :py:obj:`graphDFS`, :py:obj:`smiles`, :py:obj:`ruleGMLString`, and :py:obj:`ruleGML`. It controls whether the graph/rule is appended to :py:obj:`inputGraphs`/:py:obj:`inputRules` or not. It defaults to ``True``. From 96dff2c07275a34beac78e23a468f8fff8f10bf1 Mon Sep 17 00:00:00 2001 From: Jakob Lykke Andersen Date: Thu, 1 Aug 2019 11:25:31 +0200 Subject: [PATCH 2/3] Update for new version --- .clang-format | 115 + .drone.jsonnet | 99 + .drone.yml | 1600 ++++++ .gitignore | 53 +- .gitmodules | 3 + AUTHORS | 1 - CMakeLists.txt | 297 ++ ChangeLog.rst | 69 +- INSTALL | 365 -- Makefile.am | 41 - NB_compile.sh | 10 - NB_mod/Makefile | 155 - NB_mod/nbproject/Makefile-Debug.mk | 605 --- NB_mod/nbproject/Makefile-impl.mk | 133 - NB_mod/nbproject/Makefile-variables.mk | 27 - NB_mod/nbproject/Package-Debug.bash | 76 - NB_mod/nbproject/configurations.xml | 1329 ----- NB_mod/nbproject/project.xml | 31 - NB_mod/srcExtra/mod/BuildConfig.h | 8 - NB_pymod/Makefile | 129 - NB_pymod/nbproject/Makefile-Debug.mk | 201 - NB_pymod/nbproject/Makefile-impl.mk | 133 - NB_pymod/nbproject/Makefile-variables.mk | 27 - NB_pymod/nbproject/Package-Debug.bash | 76 - NB_pymod/nbproject/configurations.xml | 168 - NB_pymod/nbproject/project.xml | 31 - NEWS | 0 README.rst | 16 +- bootstrap.sh | 178 +- cmake/Coverage.cmake | 117 + cmake/CoverageBuild.sh | 28 + cmake/FindBoost.cmake | 2164 ++++++++ cmake/FindOpenBabel2.cmake | 98 + cmake/FindPackageHandleStandardArgs.cmake | 386 ++ cmake/FindPackageMessage.cmake | 48 + cmake/FindPkgConfig.cmake | 716 +++ cmake/FindPython/Support.cmake | 1267 +++++ cmake/FindPython3.cmake | 171 + cmake/SelectLibraryConfigurations.cmake | 80 + configure.ac | 469 -- doc/CMakeLists.txt | 17 + doc/makeDocs.sh | 41 +- .../ignore_missing_refs/__init__.py | 2 +- doc/source/installation.rst | 122 +- doc/source/libmod/examples/using/Makefile | 7 - doc/source/libmod/usage.rst | 25 +- doc/source/modWrapper/modWrapper.rst | 5 +- doc/source/pymod/api.rst | 2 - doc/source/pymod/examples/extension/Makefile | 16 - doc/source/pymod/examples/extension/stuff.cpp | 11 - doc/source/pymod/examples/extension/stuff.h | 12 - doc/source/pymod/extensions.rst | 30 +- doc/source/pymod/pymod.rst | 1 - examples/CMakeLists.txt | 48 + examples/cmake/FindBoost.cmake | 2164 ++++++++ examples/cmake/FindPython.cmake | 206 + examples/cmake/FindPython/Support.cmake | 1267 +++++ examples/cmake/FindPython3.cmake | 171 + examples/libmod_cmake/CMakeLists.txt | 8 + examples/libmod_cmake/main.cpp | 8 + examples/pymod_extension/CMakeLists.txt | 45 + .../pymod_extension}/pyModule.cpp | 4 +- examples/pymod_extension/stuff.cpp | 11 + examples/pymod_extension/stuff.hpp | 12 + .../pymod_extension}/test.py | 0 external/graph_canon | 1 + jla_build.sh | 55 + libs/gml/CMakeLists.txt | 59 + {src => libs/gml/include}/gml/ast.hpp | 0 .../gml/include}/gml/attr_handler.hpp | 0 {src => libs/gml/include}/gml/converter.hpp | 0 .../gml/include}/gml/converter_edsl.hpp | 0 .../include}/gml/converter_expressions.hpp | 0 {src => libs/gml/include}/gml/parser.hpp | 0 {src => libs/gml/include}/gml/value_type.hpp | 0 {src/gml => libs/gml/src}/parser.cpp | 2 +- libs/gml/test/test_gml.cpp | 159 + libs/jla_boost/CMakeLists.txt | 58 + .../include}/jla_boost/Functional.hpp | 0 .../include}/jla_boost/TaggedList.hpp | 0 .../jla_boost/graph/AdaptorTraits.hpp | 0 .../include}/jla_boost/graph/Concepts.hpp | 0 .../graph/EdgeIndexedAdjacencyList.hpp | 0 .../jla_boost/graph/FilteredWrapper.hpp | 46 +- .../jla_boost/graph/PairToRangeAdaptor.hpp | 4 +- .../include}/jla_boost/graph/UnionGraph.hpp | 0 .../graph/dpo/FilteredGraphProjection.hpp | 0 .../include}/jla_boost/graph/dpo/IO.hpp | 0 .../include}/jla_boost/graph/dpo/Rule.hpp | 0 .../graph/morphism/AsPropertyMap.hpp | 0 .../jla_boost/graph/morphism/Predicates.hpp | 0 .../jla_boost/graph/morphism/PropertyTags.hpp | 0 .../jla_boost/graph/morphism/Traits.hpp | 0 .../jla_boost/graph/morphism/VertexMap.hpp | 4 +- .../graph/morphism/VertexOrderByMult.hpp | 0 .../graph/morphism/callbacks/Filter.hpp | 0 .../graph/morphism/callbacks/Limit.hpp | 0 .../graph/morphism/callbacks/Print.hpp | 0 .../graph/morphism/callbacks/SliceProps.hpp | 0 .../graph/morphism/callbacks/Store.hpp | 0 .../graph/morphism/callbacks/Transform.hpp | 0 .../graph/morphism/callbacks/Unwrapper.hpp | 0 .../graph/morphism/finders/CommonSubgraph.hpp | 0 .../morphism/finders/InjectiveEnumeration.hpp | 0 .../jla_boost/graph/morphism/finders/vf2.hpp | 0 .../graph/morphism/models/Inverted.hpp | 0 .../morphism/models/InvertibleAdaptor.hpp | 0 .../graph/morphism/models/PropertyMap.hpp | 0 .../morphism/models/PropertyVertexMap.hpp | 0 .../graph/morphism/models/Reinterpreted.hpp | 0 .../graph/morphism/models/Vector.hpp | 0 .../jla_boost/src}/graph/dpo/IO.cpp | 0 {src => libs}/jla_boost/test/vf2.cpp | 24 +- libs/libmod/BuildConfig.hpp.in | 15 + libs/libmod/CMakeLists.txt | 104 + libs/libmod/lib/pkgconfig/mod.pc.in | 13 + libs/libmod/modConfig.cmake | 7 + {src => libs/libmod/src}/mod/Chem.cpp | 6 +- .../Chem.h => libs/libmod/src/mod/Chem.hpp | 287 +- {src => libs/libmod/src}/mod/Config.cpp | 2 +- .../libmod/src/mod/Config.hpp | 76 +- {src => libs/libmod/src}/mod/Derivation.cpp | 6 +- .../libmod/src/mod/Derivation.hpp | 11 +- {src => libs/libmod/src}/mod/Error.cpp | 2 +- .../Error.h => libs/libmod/src/mod/Error.hpp | 23 +- {src => libs/libmod/src}/mod/Function.cpp | 2 +- .../libmod/src/mod/Function.hpp | 0 libs/libmod/src/mod/Misc.cpp | 45 + libs/libmod/src/mod/Misc.hpp | 32 + {src => libs/libmod/src}/mod/Term.cpp | 10 +- .../Term.h => libs/libmod/src/mod/Term.hpp | 4 +- {src => libs/libmod/src}/mod/dg/DG.cpp | 46 +- .../dg/DG.h => libs/libmod/src/mod/dg/DG.hpp | 21 +- .../libmod/src/mod/dg/ForwardDecl.hpp | 0 .../libmod/src}/mod/dg/GraphInterface.cpp | 48 +- .../libmod/src/mod/dg/GraphInterface.hpp | 57 +- {src => libs/libmod/src}/mod/dg/Printer.cpp | 18 +- .../libmod/src/mod/dg/Printer.hpp | 7 +- .../libmod/src}/mod/dg/Strategies.cpp | 34 +- .../libmod/src/mod/dg/Strategies.hpp | 13 +- .../libmod/src}/mod/graph/Automorphism.cpp | 6 +- .../libmod/src/mod/graph/Automorphism.hpp | 7 +- .../libmod/src/mod/graph/ForwardDecl.hpp | 0 {src => libs/libmod/src}/mod/graph/Graph.cpp | 37 +- .../libmod/src/mod/graph/Graph.hpp | 15 +- .../libmod/src}/mod/graph/GraphInterface.cpp | 20 +- .../libmod/src/mod/graph/GraphInterface.hpp | 49 +- .../libmod/src}/mod/graph/Printer.cpp | 4 +- .../libmod/src/mod/graph/Printer.hpp | 5 +- .../libmod/src/mod/lib/Algorithm.hpp | 2 +- .../libmod/src}/mod/lib/Chem/Mass.cpp | 4 +- .../libmod/src}/mod/lib/Chem/MoleculeUtil.cpp | 6 +- .../libmod/src/mod/lib/Chem/MoleculeUtil.hpp | 8 +- .../libmod/src}/mod/lib/Chem/OBabel.cpp | 24 +- .../libmod/src/mod/lib/Chem/OBabel.hpp | 8 +- .../libmod/src}/mod/lib/Chem/Smiles.cpp | 8 +- .../libmod/src/mod/lib/Chem/Smiles.hpp | 2 +- .../libmod/src}/mod/lib/Chem/SmilesRead.cpp | 22 +- .../libmod/src}/mod/lib/Chem/SmilesWrite.cpp | 10 +- {src => libs/libmod/src}/mod/lib/DG/Dump.cpp | 206 +- libs/libmod/src/mod/lib/DG/Dump.hpp | 29 + .../libmod/src/mod/lib/DG/GraphDecl.hpp | 39 +- {src => libs/libmod/src}/mod/lib/DG/Hyper.cpp | 185 +- .../libmod/src/mod/lib/DG/Hyper.hpp | 35 +- .../libmod/src}/mod/lib/DG/NonHyper.cpp | 237 +- .../libmod/src/mod/lib/DG/NonHyper.hpp | 74 +- .../src}/mod/lib/DG/NonHyperDerivations.cpp | 16 +- .../src/mod/lib/DG/NonHyperDerivations.hpp | 2 +- .../src}/mod/lib/DG/NonHyperRuleComp.cpp | 118 +- .../src/mod/lib/DG/NonHyperRuleComp.hpp | 4 +- .../src/mod/lib/DG/RuleApplicationUtils.hpp | 12 +- .../libmod/src}/mod/lib/DG/Strategies/Add.cpp | 12 +- .../libmod/src/mod/lib/DG/Strategies/Add.hpp | 2 +- .../DG/Strategies/DerivationPredicates.cpp | 8 +- .../DG/Strategies/DerivationPredicates.hpp | 4 +- .../src}/mod/lib/DG/Strategies/Execute.cpp | 10 +- .../src/mod/lib/DG/Strategies/Execute.hpp | 4 +- .../src}/mod/lib/DG/Strategies/Filter.cpp | 10 +- .../src/mod/lib/DG/Strategies/Filter.hpp | 4 +- .../src}/mod/lib/DG/Strategies/GraphState.cpp | 6 +- .../src/mod/lib/DG/Strategies/GraphState.hpp | 0 .../src}/mod/lib/DG/Strategies/Parallel.cpp | 10 +- .../src/mod/lib/DG/Strategies/Parallel.hpp | 2 +- .../src}/mod/lib/DG/Strategies/Repeat.cpp | 6 +- .../src/mod/lib/DG/Strategies/Repeat.hpp | 2 +- .../src}/mod/lib/DG/Strategies/Revive.cpp | 8 +- .../src/mod/lib/DG/Strategies/Revive.hpp | 2 +- .../src}/mod/lib/DG/Strategies/Rule.cpp | 24 +- .../libmod/src/mod/lib/DG/Strategies/Rule.hpp | 14 +- .../src}/mod/lib/DG/Strategies/Sequence.cpp | 4 +- .../src/mod/lib/DG/Strategies/Sequence.hpp | 2 +- .../src}/mod/lib/DG/Strategies/Sort.cpp | 10 +- .../libmod/src/mod/lib/DG/Strategies/Sort.hpp | 4 +- .../src}/mod/lib/DG/Strategies/Strategy.cpp | 8 +- .../src/mod/lib/DG/Strategies/Strategy.hpp | 11 +- .../src}/mod/lib/DG/Strategies/Take.cpp | 6 +- .../libmod/src/mod/lib/DG/Strategies/Take.hpp | 2 +- .../src}/mod/lib/Graph/Canonicalisation.cpp | 170 +- .../src/mod/lib/Graph/Canonicalisation.hpp | 2 +- libs/libmod/src/mod/lib/Graph/Collection.cpp | 121 + libs/libmod/src/mod/lib/Graph/Collection.hpp | 76 + .../libmod/src}/mod/lib/Graph/DFSEncoding.cpp | 18 +- .../libmod/src/mod/lib/Graph/DFSEncoding.hpp | 2 +- .../libmod/src/mod/lib/Graph/GraphDecl.hpp | 0 .../src}/mod/lib/Graph/LabelledGraph.cpp | 14 +- .../src/mod/lib/Graph/LabelledGraph.hpp | 2 +- .../libmod/src/mod/lib/Graph/Multiset.hpp | 16 +- .../libmod/src/mod/lib/Graph/MultisetIO.hpp | 2 +- .../mod/lib/Graph/Properties/Depiction.cpp | 20 +- .../mod/lib/Graph/Properties/Depiction.hpp | 6 +- .../mod/lib/Graph/Properties/Molecule.cpp | 12 +- .../src/mod/lib/Graph/Properties/Molecule.hpp | 8 +- .../src/mod/lib/Graph/Properties/Property.hpp | 8 +- .../src/mod/lib/Graph/Properties/Stereo.hpp | 6 +- .../src/mod/lib/Graph/Properties/String.hpp | 2 +- .../src}/mod/lib/Graph/Properties/Term.cpp | 12 +- .../src/mod/lib/Graph/Properties/Term.hpp | 4 +- .../libmod/src}/mod/lib/Graph/Single.cpp | 46 +- .../libmod/src/mod/lib/Graph/Single.hpp | 10 +- .../GraphMorphism/Constraints/AllVisitor.hpp | 6 +- .../Constraints/CheckVisitor.hpp | 2 +- .../GraphMorphism/Constraints/Constraint.hpp | 2 +- .../Constraints/ShortestPath.hpp | 6 +- .../Constraints/VertexAdjacency.hpp | 8 +- .../lib/GraphMorphism/Constraints/Visitor.hpp | 0 .../src}/mod/lib/GraphMorphism/Finder.hpp | 0 .../lib/GraphMorphism/LabelledMorphism.hpp | 10 +- .../GraphMorphism/McGregorCommonFinder.hpp | 0 .../mod/lib/GraphMorphism/StereoVertexMap.hpp | 175 +- .../mod/lib/GraphMorphism/TermVertexMap.hpp | 10 +- .../src}/mod/lib/GraphMorphism/VF2Finder.hpp | 0 libs/libmod/src/mod/lib/GraphPimpl.hpp | 301 ++ .../DG.h => libs/libmod/src/mod/lib/IO/DG.hpp | 180 +- .../libmod/src}/mod/lib/IO/DGRead.cpp | 64 +- .../libmod/src}/mod/lib/IO/DGWrite.cpp | 274 +- .../libmod/src/mod/lib/IO/DGWriteDetail.hpp | 9 +- .../libmod/src}/mod/lib/IO/Derivation.cpp | 50 +- .../libmod/src/mod/lib/IO/Derivation.hpp | 2 +- .../libmod/src}/mod/lib/IO/FileHandle.cpp | 6 +- .../libmod/src/mod/lib/IO/FileHandle.hpp | 0 .../libmod/src}/mod/lib/IO/GMLUtil.cpp | 2 +- .../libmod/src/mod/lib/IO/GMLUtils.hpp | 2 +- .../libmod/src/mod/lib/IO/Graph.hpp | 2 +- .../libmod/src}/mod/lib/IO/GraphRead.cpp | 20 +- .../libmod/src}/mod/lib/IO/GraphWrite.cpp | 28 +- .../src/mod/lib/IO/GraphWriteDetail.hpp | 8 +- {src => libs/libmod/src}/mod/lib/IO/IO.cpp | 4 +- .../IO.h => libs/libmod/src/mod/lib/IO/IO.hpp | 0 .../src/mod/lib/IO/MorphismConstraints.hpp | 6 +- .../libmod/src/mod/lib/IO/ParsingUtil.hpp | 0 {src => libs/libmod/src}/mod/lib/IO/RC.cpp | 18 +- .../RC.h => libs/libmod/src/mod/lib/IO/RC.hpp | 2 +- .../libmod/src/mod/lib/IO/Rule.hpp | 6 +- .../libmod/src}/mod/lib/IO/RuleRead.cpp | 14 +- .../libmod/src}/mod/lib/IO/RuleWrite.cpp | 33 +- .../libmod/src/mod/lib/IO/Stereo.hpp | 4 +- .../libmod/src}/mod/lib/IO/StereoRead.cpp | 4 +- .../libmod/src}/mod/lib/IO/StereoWrite.cpp | 30 +- {src => libs/libmod/src}/mod/lib/IO/Term.cpp | 12 +- .../libmod/src/mod/lib/IO/Term.hpp | 4 +- .../libmod/src/mod/lib/LabelledGraph.hpp | 0 .../libmod/src/mod/lib/LabelledUnionGraph.hpp | 2 +- .../libmod/src/mod/lib/RC/Compose.hpp | 6 +- .../src}/mod/lib/RC/ComposeRuleReal.cpp | 12 +- .../libmod/src/mod/lib/RC/ComposeRuleReal.hpp | 2 +- .../src/mod/lib/RC/ComposeRuleRealGeneric.hpp | 18 +- .../libmod/src}/mod/lib/RC/Evaluator.cpp | 34 +- .../libmod/src/mod/lib/RC/Evaluator.hpp | 4 +- .../src/mod/lib/RC/LabelledComposition.hpp | 16 +- .../src/mod/lib/RC/MatchMaker/Common.hpp | 8 +- .../lib/RC/MatchMaker/ComponentWiseUtil.hpp | 8 +- .../mod/lib/RC/MatchMaker/LabelledMatch.hpp | 37 +- .../src/mod/lib/RC/MatchMaker/Parallel.hpp | 4 +- .../libmod/src/mod/lib/RC/MatchMaker/Sub.hpp | 21 +- .../src/mod/lib/RC/MatchMaker/Super.hpp | 43 +- .../libmod/src/mod/lib/RC/Result.hpp | 0 .../src/mod/lib/RC/Visitor/Compound.hpp | 4 +- .../mod/lib/RC/Visitor/MatchConstraints.hpp | 4 +- .../libmod/src/mod/lib/RC/Visitor/Stereo.hpp | 22 +- .../libmod/src/mod/lib/RC/Visitor/String.hpp | 4 +- .../libmod/src/mod/lib/RC/Visitor/Term.hpp | 12 +- .../mod/lib/RC/detail/CompositionHelper.hpp | 7 +- {src => libs/libmod/src}/mod/lib/Random.cpp | 4 +- .../libmod/src/mod/lib/Random.hpp | 0 .../src/mod/lib/Rules/ConnectedComponent.hpp | 0 .../libmod/src/mod/lib/Rules/GraphDecl.hpp | 0 .../libmod/src/mod/lib/Rules/GraphToRule.hpp | 4 +- .../src}/mod/lib/Rules/LabelledRule.cpp | 8 +- .../libmod/src/mod/lib/Rules/LabelledRule.hpp | 14 +- .../mod/lib/Rules/Properties/Depiction.cpp | 20 +- .../mod/lib/Rules/Properties/Depiction.hpp | 8 +- .../mod/lib/Rules/Properties/Molecule.cpp | 10 +- .../src/mod/lib/Rules/Properties/Molecule.hpp | 6 +- .../src/mod/lib/Rules/Properties/Property.hpp | 6 +- .../src/mod/lib/Rules/Properties/Stereo.hpp | 8 +- .../src}/mod/lib/Rules/Properties/String.cpp | 10 +- .../src/mod/lib/Rules/Properties/String.hpp | 6 +- .../src}/mod/lib/Rules/Properties/Term.cpp | 12 +- .../src/mod/lib/Rules/Properties/Term.hpp | 8 +- .../libmod/src}/mod/lib/Rules/Real.cpp | 34 +- .../libmod/src/mod/lib/Rules/Real.hpp | 10 +- .../libmod/src/mod/lib/Stereo/CloneUtil.hpp | 2 +- .../src}/mod/lib/Stereo/Configuration/Any.cpp | 4 +- .../src/mod/lib/Stereo/Configuration/Any.hpp | 2 +- .../Stereo/Configuration/Configuration.cpp | 4 +- .../Stereo/Configuration/Configuration.hpp | 4 +- .../mod/lib/Stereo/Configuration/Linear.cpp | 4 +- .../mod/lib/Stereo/Configuration/Linear.hpp | 2 +- .../lib/Stereo/Configuration/Tetrahedral.cpp | 6 +- .../lib/Stereo/Configuration/Tetrahedral.hpp | 2 +- .../Stereo/Configuration/TrigonalPlanar.cpp | 4 +- .../Stereo/Configuration/TrigonalPlanar.hpp | 2 +- .../src}/mod/lib/Stereo/EdgeCategory.cpp | 6 +- .../src/mod/lib/Stereo/EdgeCategory.hpp | 2 +- .../src}/mod/lib/Stereo/EmbeddingEdge.cpp | 2 +- .../src/mod/lib/Stereo/EmbeddingEdge.hpp | 2 +- .../src}/mod/lib/Stereo/GeometryGraph.cpp | 24 +- .../src/mod/lib/Stereo/GeometryGraph.hpp | 4 +- .../libmod/src}/mod/lib/Stereo/Inference.cpp | 2 +- .../libmod/src/mod/lib/Stereo/Inference.hpp | 10 +- .../libmod/src}/mod/lib/StringStore.cpp | 2 +- .../libmod/src/mod/lib/StringStore.hpp | 0 .../libmod/src}/mod/lib/Term/RawTerm.cpp | 10 +- .../libmod/src/mod/lib/Term/RawTerm.hpp | 0 {src => libs/libmod/src}/mod/lib/Term/WAM.cpp | 4 +- .../libmod/src/mod/lib/Term/WAM.hpp | 9 +- .../libmod/src}/mod/rule/Composer.cpp | 4 +- .../libmod/src/mod/rule/Composer.hpp | 18 +- .../libmod/src}/mod/rule/CompositionExpr.cpp | 8 +- .../libmod/src/mod/rule/CompositionExpr.hpp | 55 +- .../libmod/src/mod/rule/ForwardDecl.hpp | 0 .../libmod/src}/mod/rule/GraphInterface.cpp | 18 +- .../libmod/src/mod/rule/GraphInterface.hpp | 66 +- {src => libs/libmod/src}/mod/rule/Rule.cpp | 29 +- .../libmod/src/mod/rule/Rule.hpp | 13 +- libs/post_mod/CMakeLists.txt | 34 + {src => libs/post_mod}/bin/mod_post | 70 +- .../post_mod}/share/mod/commonPreamble.tex | 0 .../post_mod}/share/mod/figureTemplate.tex | 0 {src => libs/post_mod}/share/mod/mod.mk | 0 {src => libs/post_mod}/share/mod/mod.sty | 0 {src => libs/post_mod}/share/mod/summary.tex | 0 libs/pymod/CMakeLists.txt | 77 + src/bin/mod => libs/pymod/bin/mod.in | 13 +- {src => libs/pymod}/lib/mod/__init__.py | 64 +- {src => libs/pymod}/lib/mod/latex.py | 0 {src => libs/pymod}/share/mod/obabel.supp | 0 libs/pymod/share/mod/plugins/00_mod.in | 2 + {src => libs/pymod}/share/mod/python.supp | 410 +- .../mod/Py => libs/pymod/src/mod/py}/Chem.cpp | 4 +- .../pymod/src/mod/py}/Collections.cpp | 16 +- .../pymod/src/mod/py/Common.hpp | 0 .../Py => libs/pymod/src/mod/py}/Config.cpp | 4 +- .../pymod/src/mod/py}/Derivation.cpp | 6 +- .../Py => libs/pymod/src/mod/py}/Error.cpp | 4 +- .../Py => libs/pymod/src/mod/py}/Function.cpp | 14 +- .../pymod/src/mod/py/Function.hpp | 2 +- libs/pymod/src/mod/py/Misc.cpp | 101 + .../Py => libs/pymod/src/mod/py}/Module.cpp | 4 +- .../mod/Py => libs/pymod/src/mod/py}/Term.cpp | 4 +- .../Py => libs/pymod/src/mod/py}/dg/DG.cpp | 20 +- .../pymod/src/mod/py}/dg/GraphInterface.cpp | 10 +- .../pymod/src/mod/py}/dg/Printer.cpp | 12 +- .../pymod/src/mod/py}/dg/Strategies.cpp | 6 +- .../pymod/src/mod/py}/graph/Automorphism.cpp | 6 +- libs/pymod/src/mod/py/graph/Graph.cpp | 324 ++ .../src/mod/py}/graph/GraphInterface.cpp | 8 +- .../pymod/src/mod/py}/graph/Printer.cpp | 4 +- .../pymod/src/mod/py}/rule/Composition.cpp | 6 +- .../pymod/src/mod/py}/rule/GraphInterface.cpp | 10 +- .../pymod/src/mod/py}/rule/Rule.cpp | 8 +- m4/ax_boost_base.m4 | 258 - m4/ax_prefix_config_h.m4 | 209 - src/bin/main.cpp | 20 - src/bin/mod_fetchKEGGrewrite | 28 - src/bin/mod_genSummaryMakefile | 187 - src/jla_boost/test/vf2.hpp | 12 - src/lib/pkgconfig/mod.pc.in | 16 - src/mod/Misc.cpp | 67 - src/mod/Misc.h | 29 - src/mod/Py/Misc.cpp | 60 - src/mod/Py/graph/Graph.cpp | 312 -- src/mod/lib/DG/Dump.h | 25 - src/mod/lib/GraphPimpl.h | 303 -- src/mod/lib/Rules/LabelledRule.cpp.orig | 388 -- src/mod/lib/Rules/LabelledRule.h.orig | 171 - src/share/mod/plugins/00_mod.in | 2 - test/CMakeLists.txt | 20 + test/cmake_add_subdirectory/CMakeLists.txt | 20 + .../project/CMakeLists.txt | 9 + test/cmake_add_subdirectory/project/main.cpp | 8 + test/cmake_import/CMakeLists.txt | 15 + test/cmake_import/project/CMakeLists.txt | 8 + test/cmake_import/project/main.cpp | 8 + test/py/DGSmilesProblem.py | 135 + test/py/chem.py | 44 + test/py/derivation.py | 7 + test/py/dg/DGDump.dg | 205 + test/py/dg/abstract/test.py | 16 + test/py/dg/dg.py | 132 + test/py/dg/dgDepiction.py | 21 + test/py/dg/dgDiff.py | 34 + test/py/dg/dgInlineGraphs.py | 15 + test/py/dg/dgPrintDPO.py | 11 + test/py/dg/dgPrintData.py | 26 + test/py/dg/dgPrinter.py | 56 + test/py/dg/dpoPrinting.py | 32 + test/py/dg/dupGraphs.py | 35 + test/py/dgStrat/add.py | 30 + test/py/dgStrat/common.py | 8 + test/py/dgStrat/derivationPredicates.py | 28 + test/py/dgStrat/execute.py | 10 + test/py/dgStrat/filter.py | 35 + test/py/dgStrat/parallel.py | 17 + test/py/dgStrat/repeat.py | 11 + test/py/dgStrat/revive.py | 11 + test/py/dgStrat/rule.py | 4 + test/py/dgStrat/sequence.py | 11 + test/py/dgStrat/sort.py | 17 + test/py/dgStrat/splitToIsomorphs.gml | 10 + test/py/dgStrat/take.py | 16 + test/py/dgStrat/testSplitToIsomorphs.py | 8 + .../formoseCommon/aldol_addition_backward.gml | 37 + .../aldol_addition_backward_H.gml | 41 + .../formoseCommon/aldol_addition_forward.gml | 37 + .../aldol_addition_forward_H.gml | 41 + test/py/formoseCommon/grammar.py | 6 + test/py/formoseCommon/grammar_H.py | 6 + test/py/formoseCommon/keto_enol_backward.gml | 26 + test/py/formoseCommon/keto_enol_forward.gml | 26 + test/py/function.py | 30 + test/py/graph/graph.gml | 6 + test/py/graph/graph.py | 123 + test/py/graph/graphDFS.py | 53 + test/py/graph/graphExtId.py | 35 + test/py/graph/graphPerm.py | 44 + test/py/graph/smilesId.py | 6 + test/py/graph/topo.py | 19 + test/py/isotopeDepict.py | 36 + test/py/matchConstraints/loadInvert.py | 22 + test/py/matchConstraints/shortestPath.py | 70 + .../vertexAdjacency/coreInsteadOfComponent.py | 24 + .../matchConstraints/vertexAdjacency/main.py | 106 + .../vertexAdjacency/termConversion.py | 47 + .../vertexAdjacency/vertexAndEdge.py | 18 + test/py/molDepiction.py | 64 + test/py/parseReactionSmiles.py | 41 + test/py/pppCommon/aldo_keto_backward.gml | 32 + test/py/pppCommon/aldo_keto_forward.gml | 32 + test/py/pppCommon/aldolase.gml | 38 + test/py/pppCommon/dgStrict.py | 10 + test/py/pppCommon/dhap_aldolase.gml | 53 + test/py/pppCommon/grammar.py | 26 + test/py/pppCommon/phosphohydrolase.gml | 36 + test/py/pppCommon/transaldolase.gml | 56 + test/py/pppCommon/transketolase.gml | 46 + test/py/radical.py | 19 + test/py/rc/checks.py | 356 ++ test/py/rc/rules.py | 361 ++ test/py/rc/test.py | 56 + test/py/rc/unification.py | 20 + test/py/rcEval/common.py | 20 + test/py/rcEval/composeCommon.py | 10 + test/py/rcEval/composeParallel.py | 10 + test/py/rcEval/composeSub.py | 10 + test/py/rcEval/composeSuper.py | 10 + test/py/rcEval/constraints/rFirstTransfer.py | 9 + .../rcEval/constraints/rFirstTransfer_r1.gml | 20 + .../rcEval/constraints/rFirstTransfer_r2.gml | 14 + test/py/rcEval/constraints/rSecondDelete.py | 9 + .../rcEval/constraints/rSecondDelete_r1.gml | 11 + .../rcEval/constraints/rSecondDelete_r2.gml | 17 + test/py/rcEval/constraints/rSecondInLeft.py | 9 + .../rcEval/constraints/rSecondInLeft_r1.gml | 14 + .../rcEval/constraints/rSecondInLeft_r2.gml | 20 + .../rcEval/constraints/rSecondToRightSide.py | 9 + .../constraints/rSecondToRightSide_r1.gml | 11 + .../constraints/rSecondToRightSide_r2.gml | 20 + test/py/rcEval/constraints/rSecondTransfer.py | 9 + .../rcEval/constraints/rSecondTransfer_r1.gml | 14 + .../rcEval/constraints/rSecondTransfer_r2.gml | 22 + test/py/rcEval/convertGraph.py | 14 + test/py/rcEval/rule.py | 7 + test/py/rcEval/testFull.py | 26 + test/py/rcEval/union.py | 10 + test/py/rule/labelType.py | 30 + test/py/rule/rule.gml | 27 + test/py/rule/rule.py | 77 + test/py/rule/ruleExtId.py | 24 + test/py/rule/ruleGML.py | 27 + test/py/rule/ruleInterface.py | 99 + test/py/rule/topo.py | 24 + test/py/runAll.sh | 36 + test/py/smiles/cansmi-roundtrip.smi | 4372 ++++++++++++++++ test/py/smiles/doOBabelTests.sh | 84 + test/py/smiles/genSymbolJumpTable.py | 155 + test/py/smiles/nci.smi | 1044 ++++ test/py/smiles/notes.txt | 1 + test/py/smiles/problematic.py | 22 + test/py/smiles/rhea.py | 4305 ++++++++++++++++ test/py/smiles/smiles.py | 52 + test/py/smiles/smilesToDimacs.py | 27 + test/py/smiles/smiles_cansmi_roundtrip.py | 4454 +++++++++++++++++ test/py/smiles/smiles_nci.py | 1042 ++++ test/py/stereo/00_geometryAndEmbedding.py | 25 + test/py/stereo/01_geometry.py | 38 + test/py/stereo/02_embedding.py | 41 + test/py/stereo/03_completeDeduce.py | 31 + test/py/stereo/04_graphFix.py | 35 + test/py/stereo/10_errors.py | 28 + test/py/stereo/20_morphismGraph.py | 136 + test/py/stereo/30_morphismRule.py | 21 + test/py/stereo/common.py | 30 + test/py/stereo/graphDepiction.py | 124 + test/py/stereo/ruleDepiction.py | 168 + test/py/stereo/ruleGML.py | 124 + test/py/stereo/smiles.py | 37 + test/py/stereo/smilesAll.py | 15 + test/py/stereo/testTetraRule.py | 46 + test/py/term/counter.py | 34 + test/py/term/makeVars.py | 46 + test/py/term/parsing.py | 33 + test/py/term/relations.py | 84 + test/py/term/unification/atomDelete.py | 2 + test/py/term/unification/decomposition.py | 4 + test/py/term/unification/eliminate.py | 4 + test/py/term/unification/swapEliminate.py | 3 + test/py/util/boltzmann.py | 17 + testJLA.sh | 134 - 529 files changed, 36284 insertions(+), 8757 deletions(-) create mode 100644 .clang-format create mode 100644 .drone.jsonnet create mode 100644 .drone.yml create mode 100644 .gitmodules delete mode 100644 AUTHORS create mode 100644 CMakeLists.txt delete mode 100644 INSTALL delete mode 100644 Makefile.am delete mode 100755 NB_compile.sh delete mode 100644 NB_mod/Makefile delete mode 100644 NB_mod/nbproject/Makefile-Debug.mk delete mode 100644 NB_mod/nbproject/Makefile-impl.mk delete mode 100644 NB_mod/nbproject/Makefile-variables.mk delete mode 100644 NB_mod/nbproject/Package-Debug.bash delete mode 100644 NB_mod/nbproject/configurations.xml delete mode 100644 NB_mod/nbproject/project.xml delete mode 100644 NB_mod/srcExtra/mod/BuildConfig.h delete mode 100644 NB_pymod/Makefile delete mode 100644 NB_pymod/nbproject/Makefile-Debug.mk delete mode 100644 NB_pymod/nbproject/Makefile-impl.mk delete mode 100644 NB_pymod/nbproject/Makefile-variables.mk delete mode 100644 NB_pymod/nbproject/Package-Debug.bash delete mode 100644 NB_pymod/nbproject/configurations.xml delete mode 100644 NB_pymod/nbproject/project.xml delete mode 100644 NEWS create mode 100644 cmake/Coverage.cmake create mode 100755 cmake/CoverageBuild.sh create mode 100644 cmake/FindBoost.cmake create mode 100644 cmake/FindOpenBabel2.cmake create mode 100644 cmake/FindPackageHandleStandardArgs.cmake create mode 100644 cmake/FindPackageMessage.cmake create mode 100644 cmake/FindPkgConfig.cmake create mode 100644 cmake/FindPython/Support.cmake create mode 100644 cmake/FindPython3.cmake create mode 100644 cmake/SelectLibraryConfigurations.cmake delete mode 100644 configure.ac create mode 100644 doc/CMakeLists.txt delete mode 100644 doc/source/libmod/examples/using/Makefile delete mode 100644 doc/source/pymod/examples/extension/Makefile delete mode 100644 doc/source/pymod/examples/extension/stuff.cpp delete mode 100644 doc/source/pymod/examples/extension/stuff.h create mode 100644 examples/CMakeLists.txt create mode 100644 examples/cmake/FindBoost.cmake create mode 100644 examples/cmake/FindPython.cmake create mode 100644 examples/cmake/FindPython/Support.cmake create mode 100644 examples/cmake/FindPython3.cmake create mode 100644 examples/libmod_cmake/CMakeLists.txt create mode 100644 examples/libmod_cmake/main.cpp create mode 100644 examples/pymod_extension/CMakeLists.txt rename {doc/source/pymod/examples/extension => examples/pymod_extension}/pyModule.cpp (88%) create mode 100644 examples/pymod_extension/stuff.cpp create mode 100644 examples/pymod_extension/stuff.hpp rename {doc/source/pymod/examples/extension => examples/pymod_extension}/test.py (100%) create mode 160000 external/graph_canon create mode 100755 jla_build.sh create mode 100644 libs/gml/CMakeLists.txt rename {src => libs/gml/include}/gml/ast.hpp (100%) rename {src => libs/gml/include}/gml/attr_handler.hpp (100%) rename {src => libs/gml/include}/gml/converter.hpp (100%) rename {src => libs/gml/include}/gml/converter_edsl.hpp (100%) rename {src => libs/gml/include}/gml/converter_expressions.hpp (100%) rename {src => libs/gml/include}/gml/parser.hpp (100%) rename {src => libs/gml/include}/gml/value_type.hpp (100%) rename {src/gml => libs/gml/src}/parser.cpp (99%) create mode 100644 libs/gml/test/test_gml.cpp create mode 100644 libs/jla_boost/CMakeLists.txt rename {src => libs/jla_boost/include}/jla_boost/Functional.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/TaggedList.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/AdaptorTraits.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/Concepts.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/EdgeIndexedAdjacencyList.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/FilteredWrapper.hpp (88%) rename {src => libs/jla_boost/include}/jla_boost/graph/PairToRangeAdaptor.hpp (88%) rename {src => libs/jla_boost/include}/jla_boost/graph/UnionGraph.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/dpo/FilteredGraphProjection.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/dpo/IO.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/dpo/Rule.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/AsPropertyMap.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/Predicates.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/PropertyTags.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/Traits.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/VertexMap.hpp (98%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/VertexOrderByMult.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/callbacks/Filter.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/callbacks/Limit.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/callbacks/Print.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/callbacks/SliceProps.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/callbacks/Store.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/callbacks/Transform.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/callbacks/Unwrapper.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/finders/CommonSubgraph.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/finders/InjectiveEnumeration.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/finders/vf2.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/models/Inverted.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/models/InvertibleAdaptor.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/models/PropertyMap.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/models/PropertyVertexMap.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/models/Reinterpreted.hpp (100%) rename {src => libs/jla_boost/include}/jla_boost/graph/morphism/models/Vector.hpp (100%) rename {src/jla_boost => libs/jla_boost/src}/graph/dpo/IO.cpp (100%) rename {src => libs}/jla_boost/test/vf2.cpp (95%) create mode 100644 libs/libmod/BuildConfig.hpp.in create mode 100644 libs/libmod/CMakeLists.txt create mode 100644 libs/libmod/lib/pkgconfig/mod.pc.in create mode 100644 libs/libmod/modConfig.cmake rename {src => libs/libmod/src}/mod/Chem.cpp (94%) rename src/mod/Chem.h => libs/libmod/src/mod/Chem.hpp (61%) rename {src => libs/libmod/src}/mod/Config.cpp (97%) rename src/mod/Config.h => libs/libmod/src/mod/Config.hpp (82%) rename {src => libs/libmod/src}/mod/Derivation.cpp (79%) rename src/mod/Derivation.h => libs/libmod/src/mod/Derivation.hpp (81%) rename {src => libs/libmod/src}/mod/Error.cpp (99%) rename src/mod/Error.h => libs/libmod/src/mod/Error.hpp (93%) rename {src => libs/libmod/src}/mod/Function.cpp (90%) rename src/mod/Function.h => libs/libmod/src/mod/Function.hpp (100%) create mode 100644 libs/libmod/src/mod/Misc.cpp create mode 100644 libs/libmod/src/mod/Misc.hpp rename {src => libs/libmod/src}/mod/Term.cpp (92%) rename src/mod/Term.h => libs/libmod/src/mod/Term.hpp (63%) rename {src => libs/libmod/src}/mod/dg/DG.cpp (89%) rename src/mod/dg/DG.h => libs/libmod/src/mod/dg/DG.hpp (94%) rename src/mod/dg/ForwardDecl.h => libs/libmod/src/mod/dg/ForwardDecl.hpp (100%) rename {src => libs/libmod/src}/mod/dg/GraphInterface.cpp (93%) rename src/mod/dg/GraphInterface.h => libs/libmod/src/mod/dg/GraphInterface.hpp (90%) rename {src => libs/libmod/src}/mod/dg/Printer.cpp (97%) rename src/mod/dg/Printer.h => libs/libmod/src/mod/dg/Printer.hpp (98%) rename {src => libs/libmod/src}/mod/dg/Strategies.cpp (90%) rename src/mod/dg/Strategies.h => libs/libmod/src/mod/dg/Strategies.hpp (96%) rename {src => libs/libmod/src}/mod/graph/Automorphism.cpp (96%) rename src/mod/graph/Automorphism.h => libs/libmod/src/mod/graph/Automorphism.hpp (91%) rename src/mod/graph/ForwardDecl.h => libs/libmod/src/mod/graph/ForwardDecl.hpp (100%) rename {src => libs/libmod/src}/mod/graph/Graph.cpp (93%) rename src/mod/graph/Graph.h => libs/libmod/src/mod/graph/Graph.hpp (96%) rename {src => libs/libmod/src}/mod/graph/GraphInterface.cpp (91%) rename src/mod/graph/GraphInterface.h => libs/libmod/src/mod/graph/GraphInterface.hpp (90%) rename {src => libs/libmod/src}/mod/graph/Printer.cpp (98%) rename src/mod/graph/Printer.h => libs/libmod/src/mod/graph/Printer.hpp (98%) rename src/mod/lib/Algorithm.h => libs/libmod/src/mod/lib/Algorithm.hpp (99%) rename {src => libs/libmod/src}/mod/lib/Chem/Mass.cpp (99%) rename {src => libs/libmod/src}/mod/lib/Chem/MoleculeUtil.cpp (99%) rename src/mod/lib/Chem/MoleculeUtil.h => libs/libmod/src/mod/lib/Chem/MoleculeUtil.hpp (88%) rename {src => libs/libmod/src}/mod/lib/Chem/OBabel.cpp (96%) rename src/mod/lib/Chem/OBabel.h => libs/libmod/src/mod/lib/Chem/OBabel.hpp (94%) rename {src => libs/libmod/src}/mod/lib/Chem/Smiles.cpp (96%) rename src/mod/lib/Chem/Smiles.h => libs/libmod/src/mod/lib/Chem/Smiles.hpp (96%) rename {src => libs/libmod/src}/mod/lib/Chem/SmilesRead.cpp (98%) rename {src => libs/libmod/src}/mod/lib/Chem/SmilesWrite.cpp (99%) rename {src => libs/libmod/src}/mod/lib/DG/Dump.cpp (63%) create mode 100644 libs/libmod/src/mod/lib/DG/Dump.hpp rename src/mod/lib/DG/GraphDecl.h => libs/libmod/src/mod/lib/DG/GraphDecl.hpp (62%) rename {src => libs/libmod/src}/mod/lib/DG/Hyper.cpp (70%) rename src/mod/lib/DG/Hyper.h => libs/libmod/src/mod/lib/DG/Hyper.hpp (67%) rename {src => libs/libmod/src}/mod/lib/DG/NonHyper.cpp (57%) rename src/mod/lib/DG/NonHyper.h => libs/libmod/src/mod/lib/DG/NonHyper.hpp (61%) rename {src => libs/libmod/src}/mod/lib/DG/NonHyperDerivations.cpp (77%) rename src/mod/lib/DG/NonHyperDerivations.h => libs/libmod/src/mod/lib/DG/NonHyperDerivations.hpp (94%) rename {src => libs/libmod/src}/mod/lib/DG/NonHyperRuleComp.cpp (55%) rename src/mod/lib/DG/NonHyperRuleComp.h => libs/libmod/src/mod/lib/DG/NonHyperRuleComp.hpp (93%) rename src/mod/lib/DG/RuleApplicationUtils.h => libs/libmod/src/mod/lib/DG/RuleApplicationUtils.hpp (96%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Add.cpp (90%) rename src/mod/lib/DG/Strategies/Add.h => libs/libmod/src/mod/lib/DG/Strategies/Add.hpp (95%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/DerivationPredicates.cpp (96%) rename src/mod/lib/DG/Strategies/DerivationPredicates.h => libs/libmod/src/mod/lib/DG/Strategies/DerivationPredicates.hpp (96%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Execute.cpp (89%) rename src/mod/lib/DG/Strategies/Execute.h => libs/libmod/src/mod/lib/DG/Strategies/Execute.hpp (91%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Filter.cpp (95%) rename src/mod/lib/DG/Strategies/Filter.h => libs/libmod/src/mod/lib/DG/Strategies/Filter.hpp (92%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/GraphState.cpp (98%) rename src/mod/lib/DG/Strategies/GraphState.h => libs/libmod/src/mod/lib/DG/Strategies/GraphState.hpp (100%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Parallel.cpp (94%) rename src/mod/lib/DG/Strategies/Parallel.h => libs/libmod/src/mod/lib/DG/Strategies/Parallel.hpp (94%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Repeat.cpp (96%) rename src/mod/lib/DG/Strategies/Repeat.h => libs/libmod/src/mod/lib/DG/Strategies/Repeat.hpp (94%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Revive.cpp (92%) rename src/mod/lib/DG/Strategies/Revive.h => libs/libmod/src/mod/lib/DG/Strategies/Revive.hpp (94%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Rule.cpp (95%) rename src/mod/lib/DG/Strategies/Rule.h => libs/libmod/src/mod/lib/DG/Strategies/Rule.hpp (55%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Sequence.cpp (97%) rename src/mod/lib/DG/Strategies/Sequence.h => libs/libmod/src/mod/lib/DG/Strategies/Sequence.hpp (94%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Sort.cpp (92%) rename src/mod/lib/DG/Strategies/Sort.h => libs/libmod/src/mod/lib/DG/Strategies/Sort.hpp (92%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Strategy.cpp (94%) rename src/mod/lib/DG/Strategies/Strategy.h => libs/libmod/src/mod/lib/DG/Strategies/Strategy.hpp (89%) rename {src => libs/libmod/src}/mod/lib/DG/Strategies/Take.cpp (96%) rename src/mod/lib/DG/Strategies/Take.h => libs/libmod/src/mod/lib/DG/Strategies/Take.hpp (94%) rename {src => libs/libmod/src}/mod/lib/Graph/Canonicalisation.cpp (80%) rename src/mod/lib/Graph/Canonicalisation.h => libs/libmod/src/mod/lib/Graph/Canonicalisation.hpp (93%) create mode 100644 libs/libmod/src/mod/lib/Graph/Collection.cpp create mode 100644 libs/libmod/src/mod/lib/Graph/Collection.hpp rename {src => libs/libmod/src}/mod/lib/Graph/DFSEncoding.cpp (98%) rename src/mod/lib/Graph/DFSEncoding.h => libs/libmod/src/mod/lib/Graph/DFSEncoding.hpp (94%) rename src/mod/lib/Graph/GraphDecl.h => libs/libmod/src/mod/lib/Graph/GraphDecl.hpp (100%) rename {src => libs/libmod/src}/mod/lib/Graph/LabelledGraph.cpp (91%) rename src/mod/lib/Graph/LabelledGraph.h => libs/libmod/src/mod/lib/Graph/LabelledGraph.hpp (97%) rename src/mod/lib/Graph/Multiset.h => libs/libmod/src/mod/lib/Graph/Multiset.hpp (67%) rename src/mod/lib/Graph/MultisetIO.h => libs/libmod/src/mod/lib/Graph/MultisetIO.hpp (92%) rename {src => libs/libmod/src}/mod/lib/Graph/Properties/Depiction.cpp (95%) rename src/mod/lib/Graph/Properties/Depiction.h => libs/libmod/src/mod/lib/Graph/Properties/Depiction.hpp (95%) rename {src => libs/libmod/src}/mod/lib/Graph/Properties/Molecule.cpp (92%) rename src/mod/lib/Graph/Properties/Molecule.h => libs/libmod/src/mod/lib/Graph/Properties/Molecule.hpp (86%) rename src/mod/lib/Graph/Properties/Property.h => libs/libmod/src/mod/lib/Graph/Properties/Property.hpp (96%) rename src/mod/lib/Graph/Properties/Stereo.h => libs/libmod/src/mod/lib/Graph/Properties/Stereo.hpp (87%) rename src/mod/lib/Graph/Properties/String.h => libs/libmod/src/mod/lib/Graph/Properties/String.hpp (91%) rename {src => libs/libmod/src}/mod/lib/Graph/Properties/Term.cpp (90%) rename src/mod/lib/Graph/Properties/Term.h => libs/libmod/src/mod/lib/Graph/Properties/Term.hpp (90%) rename {src => libs/libmod/src}/mod/lib/Graph/Single.cpp (94%) rename src/mod/lib/Graph/Single.h => libs/libmod/src/mod/lib/Graph/Single.hpp (95%) rename src/mod/lib/GraphMorphism/Constraints/AllVisitor.h => libs/libmod/src/mod/lib/GraphMorphism/Constraints/AllVisitor.hpp (82%) rename src/mod/lib/GraphMorphism/Constraints/CheckVisitor.h => libs/libmod/src/mod/lib/GraphMorphism/Constraints/CheckVisitor.hpp (97%) rename src/mod/lib/GraphMorphism/Constraints/Constraint.h => libs/libmod/src/mod/lib/GraphMorphism/Constraints/Constraint.hpp (96%) rename src/mod/lib/GraphMorphism/Constraints/ShortestPath.h => libs/libmod/src/mod/lib/GraphMorphism/Constraints/ShortestPath.hpp (96%) rename src/mod/lib/GraphMorphism/Constraints/VertexAdjacency.h => libs/libmod/src/mod/lib/GraphMorphism/Constraints/VertexAdjacency.hpp (96%) rename src/mod/lib/GraphMorphism/Constraints/Visitor.h => libs/libmod/src/mod/lib/GraphMorphism/Constraints/Visitor.hpp (100%) rename {src => libs/libmod/src}/mod/lib/GraphMorphism/Finder.hpp (100%) rename src/mod/lib/GraphMorphism/LabelledMorphism.h => libs/libmod/src/mod/lib/GraphMorphism/LabelledMorphism.hpp (98%) rename {src => libs/libmod/src}/mod/lib/GraphMorphism/McGregorCommonFinder.hpp (100%) rename src/mod/lib/GraphMorphism/StereoVertexMap.h => libs/libmod/src/mod/lib/GraphMorphism/StereoVertexMap.hpp (69%) rename src/mod/lib/GraphMorphism/TermVertexMap.h => libs/libmod/src/mod/lib/GraphMorphism/TermVertexMap.hpp (98%) rename {src => libs/libmod/src}/mod/lib/GraphMorphism/VF2Finder.hpp (100%) create mode 100644 libs/libmod/src/mod/lib/GraphPimpl.hpp rename src/mod/lib/IO/DG.h => libs/libmod/src/mod/lib/IO/DG.hpp (61%) rename {src => libs/libmod/src}/mod/lib/IO/DGRead.cpp (76%) rename {src => libs/libmod/src}/mod/lib/IO/DGWrite.cpp (78%) rename src/mod/lib/IO/DGWriteDetail.h => libs/libmod/src/mod/lib/IO/DGWriteDetail.hpp (96%) rename {src => libs/libmod/src}/mod/lib/IO/Derivation.cpp (90%) rename src/mod/lib/IO/Derivation.h => libs/libmod/src/mod/lib/IO/Derivation.hpp (95%) rename {src => libs/libmod/src}/mod/lib/IO/FileHandle.cpp (84%) rename src/mod/lib/IO/FileHandle.h => libs/libmod/src/mod/lib/IO/FileHandle.hpp (100%) rename {src => libs/libmod/src}/mod/lib/IO/GMLUtil.cpp (92%) rename src/mod/lib/IO/GMLUtils.h => libs/libmod/src/mod/lib/IO/GMLUtils.hpp (98%) rename src/mod/lib/IO/Graph.h => libs/libmod/src/mod/lib/IO/Graph.hpp (99%) rename {src => libs/libmod/src}/mod/lib/IO/GraphRead.cpp (95%) rename {src => libs/libmod/src}/mod/lib/IO/GraphWrite.cpp (96%) rename src/mod/lib/IO/GraphWriteDetail.h => libs/libmod/src/mod/lib/IO/GraphWriteDetail.hpp (99%) rename {src => libs/libmod/src}/mod/lib/IO/IO.cpp (97%) rename src/mod/lib/IO/IO.h => libs/libmod/src/mod/lib/IO/IO.hpp (100%) rename src/mod/lib/IO/MorphismConstraints.h => libs/libmod/src/mod/lib/IO/MorphismConstraints.hpp (97%) rename src/mod/lib/IO/ParsingUtil.h => libs/libmod/src/mod/lib/IO/ParsingUtil.hpp (100%) rename {src => libs/libmod/src}/mod/lib/IO/RC.cpp (96%) rename src/mod/lib/IO/RC.h => libs/libmod/src/mod/lib/IO/RC.hpp (97%) rename src/mod/lib/IO/Rule.h => libs/libmod/src/mod/lib/IO/Rule.hpp (95%) rename {src => libs/libmod/src}/mod/lib/IO/RuleRead.cpp (98%) rename {src => libs/libmod/src}/mod/lib/IO/RuleWrite.cpp (97%) rename src/mod/lib/IO/Stereo.h => libs/libmod/src/mod/lib/IO/Stereo.hpp (94%) rename {src => libs/libmod/src}/mod/lib/IO/StereoRead.cpp (97%) rename {src => libs/libmod/src}/mod/lib/IO/StereoWrite.cpp (97%) rename {src => libs/libmod/src}/mod/lib/IO/Term.cpp (97%) rename src/mod/lib/IO/Term.h => libs/libmod/src/mod/lib/IO/Term.hpp (94%) rename src/mod/lib/LabelledGraph.h => libs/libmod/src/mod/lib/LabelledGraph.hpp (100%) rename src/mod/lib/LabelledUnionGraph.h => libs/libmod/src/mod/lib/LabelledUnionGraph.hpp (98%) rename src/mod/lib/RC/Compose.h => libs/libmod/src/mod/lib/RC/Compose.hpp (92%) rename {src => libs/libmod/src}/mod/lib/RC/ComposeRuleReal.cpp (72%) rename src/mod/lib/RC/ComposeRuleReal.h => libs/libmod/src/mod/lib/RC/ComposeRuleReal.hpp (97%) rename src/mod/lib/RC/ComposeRuleRealGeneric.h => libs/libmod/src/mod/lib/RC/ComposeRuleRealGeneric.hpp (90%) rename {src => libs/libmod/src}/mod/lib/RC/Evaluator.cpp (92%) rename src/mod/lib/RC/Evaluator.h => libs/libmod/src/mod/lib/RC/Evaluator.hpp (97%) rename src/mod/lib/RC/LabelledComposition.h => libs/libmod/src/mod/lib/RC/LabelledComposition.hpp (85%) rename src/mod/lib/RC/MatchMaker/Common.h => libs/libmod/src/mod/lib/RC/MatchMaker/Common.hpp (82%) rename src/mod/lib/RC/MatchMaker/ComponentWiseUtil.h => libs/libmod/src/mod/lib/RC/MatchMaker/ComponentWiseUtil.hpp (97%) rename src/mod/lib/RC/MatchMaker/LabelledMatch.h => libs/libmod/src/mod/lib/RC/MatchMaker/LabelledMatch.hpp (77%) rename src/mod/lib/RC/MatchMaker/Parallel.h => libs/libmod/src/mod/lib/RC/MatchMaker/Parallel.hpp (91%) rename src/mod/lib/RC/MatchMaker/Sub.h => libs/libmod/src/mod/lib/RC/MatchMaker/Sub.hpp (90%) rename src/mod/lib/RC/MatchMaker/Super.h => libs/libmod/src/mod/lib/RC/MatchMaker/Super.hpp (81%) rename src/mod/lib/RC/Result.h => libs/libmod/src/mod/lib/RC/Result.hpp (100%) rename src/mod/lib/RC/Visitor/Compound.h => libs/libmod/src/mod/lib/RC/Visitor/Compound.hpp (99%) rename src/mod/lib/RC/Visitor/MatchConstraints.h => libs/libmod/src/mod/lib/RC/Visitor/MatchConstraints.hpp (98%) rename src/mod/lib/RC/Visitor/Stereo.h => libs/libmod/src/mod/lib/RC/Visitor/Stereo.hpp (98%) rename src/mod/lib/RC/Visitor/String.h => libs/libmod/src/mod/lib/RC/Visitor/String.hpp (98%) rename src/mod/lib/RC/Visitor/Term.h => libs/libmod/src/mod/lib/RC/Visitor/Term.hpp (97%) rename src/mod/lib/RC/detail/CompositionHelper.h => libs/libmod/src/mod/lib/RC/detail/CompositionHelper.hpp (99%) rename {src => libs/libmod/src}/mod/lib/Random.cpp (94%) rename src/mod/lib/Random.h => libs/libmod/src/mod/lib/Random.hpp (100%) rename src/mod/lib/Rules/ConnectedComponent.h => libs/libmod/src/mod/lib/Rules/ConnectedComponent.hpp (100%) rename src/mod/lib/Rules/GraphDecl.h => libs/libmod/src/mod/lib/Rules/GraphDecl.hpp (100%) rename src/mod/lib/Rules/GraphToRule.h => libs/libmod/src/mod/lib/Rules/GraphToRule.hpp (97%) rename {src => libs/libmod/src}/mod/lib/Rules/LabelledRule.cpp (98%) rename src/mod/lib/Rules/LabelledRule.h => libs/libmod/src/mod/lib/Rules/LabelledRule.hpp (95%) rename {src => libs/libmod/src}/mod/lib/Rules/Properties/Depiction.cpp (98%) rename src/mod/lib/Rules/Properties/Depiction.h => libs/libmod/src/mod/lib/Rules/Properties/Depiction.hpp (95%) rename {src => libs/libmod/src}/mod/lib/Rules/Properties/Molecule.cpp (91%) rename src/mod/lib/Rules/Properties/Molecule.h => libs/libmod/src/mod/lib/Rules/Properties/Molecule.hpp (84%) rename src/mod/lib/Rules/Properties/Property.h => libs/libmod/src/mod/lib/Rules/Properties/Property.hpp (99%) rename src/mod/lib/Rules/Properties/Stereo.h => libs/libmod/src/mod/lib/Rules/Properties/Stereo.hpp (97%) rename {src => libs/libmod/src}/mod/lib/Rules/Properties/String.cpp (92%) rename src/mod/lib/Rules/Properties/String.h => libs/libmod/src/mod/lib/Rules/Properties/String.hpp (83%) rename {src => libs/libmod/src}/mod/lib/Rules/Properties/Term.cpp (95%) rename src/mod/lib/Rules/Properties/Term.h => libs/libmod/src/mod/lib/Rules/Properties/Term.hpp (89%) rename {src => libs/libmod/src}/mod/lib/Rules/Real.cpp (90%) rename src/mod/lib/Rules/Real.h => libs/libmod/src/mod/lib/Rules/Real.hpp (94%) rename src/mod/lib/Stereo/CloneUtil.h => libs/libmod/src/mod/lib/Stereo/CloneUtil.hpp (97%) rename {src => libs/libmod/src}/mod/lib/Stereo/Configuration/Any.cpp (96%) rename src/mod/lib/Stereo/Configuration/Any.h => libs/libmod/src/mod/lib/Stereo/Configuration/Any.hpp (95%) rename {src => libs/libmod/src}/mod/lib/Stereo/Configuration/Configuration.cpp (98%) rename src/mod/lib/Stereo/Configuration/Configuration.h => libs/libmod/src/mod/lib/Stereo/Configuration/Configuration.hpp (98%) rename {src => libs/libmod/src}/mod/lib/Stereo/Configuration/Linear.cpp (95%) rename src/mod/lib/Stereo/Configuration/Linear.h => libs/libmod/src/mod/lib/Stereo/Configuration/Linear.hpp (95%) rename {src => libs/libmod/src}/mod/lib/Stereo/Configuration/Tetrahedral.cpp (98%) rename src/mod/lib/Stereo/Configuration/Tetrahedral.h => libs/libmod/src/mod/lib/Stereo/Configuration/Tetrahedral.hpp (96%) rename {src => libs/libmod/src}/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp (97%) rename src/mod/lib/Stereo/Configuration/TrigonalPlanar.h => libs/libmod/src/mod/lib/Stereo/Configuration/TrigonalPlanar.hpp (96%) rename {src => libs/libmod/src}/mod/lib/Stereo/EdgeCategory.cpp (98%) rename src/mod/lib/Stereo/EdgeCategory.h => libs/libmod/src/mod/lib/Stereo/EdgeCategory.hpp (98%) rename {src => libs/libmod/src}/mod/lib/Stereo/EmbeddingEdge.cpp (91%) rename src/mod/lib/Stereo/EmbeddingEdge.h => libs/libmod/src/mod/lib/Stereo/EmbeddingEdge.hpp (95%) rename {src => libs/libmod/src}/mod/lib/Stereo/GeometryGraph.cpp (96%) rename src/mod/lib/Stereo/GeometryGraph.h => libs/libmod/src/mod/lib/Stereo/GeometryGraph.hpp (97%) rename {src => libs/libmod/src}/mod/lib/Stereo/Inference.cpp (85%) rename src/mod/lib/Stereo/Inference.h => libs/libmod/src/mod/lib/Stereo/Inference.hpp (98%) rename {src => libs/libmod/src}/mod/lib/StringStore.cpp (97%) rename src/mod/lib/StringStore.h => libs/libmod/src/mod/lib/StringStore.hpp (100%) rename {src => libs/libmod/src}/mod/lib/Term/RawTerm.cpp (95%) rename src/mod/lib/Term/RawTerm.h => libs/libmod/src/mod/lib/Term/RawTerm.hpp (100%) rename {src => libs/libmod/src}/mod/lib/Term/WAM.cpp (78%) rename src/mod/lib/Term/WAM.h => libs/libmod/src/mod/lib/Term/WAM.hpp (98%) rename {src => libs/libmod/src}/mod/rule/Composer.cpp (95%) rename src/mod/rule/Composer.h => libs/libmod/src/mod/rule/Composer.hpp (88%) rename {src => libs/libmod/src}/mod/rule/CompositionExpr.cpp (97%) rename src/mod/rule/CompositionExpr.h => libs/libmod/src/mod/rule/CompositionExpr.hpp (81%) rename src/mod/rule/ForwardDecl.h => libs/libmod/src/mod/rule/ForwardDecl.hpp (100%) rename {src => libs/libmod/src}/mod/rule/GraphInterface.cpp (98%) rename src/mod/rule/GraphInterface.h => libs/libmod/src/mod/rule/GraphInterface.hpp (95%) rename {src => libs/libmod/src}/mod/rule/Rule.cpp (94%) rename src/mod/rule/Rule.h => libs/libmod/src/mod/rule/Rule.hpp (97%) create mode 100644 libs/post_mod/CMakeLists.txt rename {src => libs/post_mod}/bin/mod_post (89%) rename {src => libs/post_mod}/share/mod/commonPreamble.tex (100%) rename {src => libs/post_mod}/share/mod/figureTemplate.tex (100%) rename {src => libs/post_mod}/share/mod/mod.mk (100%) rename {src => libs/post_mod}/share/mod/mod.sty (100%) rename {src => libs/post_mod}/share/mod/summary.tex (100%) create mode 100644 libs/pymod/CMakeLists.txt rename src/bin/mod => libs/pymod/bin/mod.in (97%) rename {src => libs/pymod}/lib/mod/__init__.py (94%) rename {src => libs/pymod}/lib/mod/latex.py (100%) rename {src => libs/pymod}/share/mod/obabel.supp (100%) create mode 100644 libs/pymod/share/mod/plugins/00_mod.in rename {src => libs/pymod}/share/mod/python.supp (73%) rename {src/mod/Py => libs/pymod/src/mod/py}/Chem.cpp (99%) rename {src/mod/Py => libs/pymod/src/mod/py}/Collections.cpp (89%) rename src/mod/Py/Common.h => libs/pymod/src/mod/py/Common.hpp (100%) rename {src/mod/Py => libs/pymod/src/mod/py}/Config.cpp (99%) rename {src/mod/Py => libs/pymod/src/mod/py}/Derivation.cpp (93%) rename {src/mod/Py => libs/pymod/src/mod/py}/Error.cpp (97%) rename {src/mod/Py => libs/pymod/src/mod/py}/Function.cpp (89%) rename src/mod/Py/Function.h => libs/pymod/src/mod/py/Function.hpp (99%) create mode 100644 libs/pymod/src/mod/py/Misc.cpp rename {src/mod/Py => libs/pymod/src/mod/py}/Module.cpp (95%) rename {src/mod/Py => libs/pymod/src/mod/py}/Term.cpp (71%) rename {src/mod/Py => libs/pymod/src/mod/py}/dg/DG.cpp (95%) rename {src/mod/Py => libs/pymod/src/mod/py}/dg/GraphInterface.cpp (98%) rename {src/mod/Py => libs/pymod/src/mod/py}/dg/Printer.cpp (98%) rename {src/mod/Py => libs/pymod/src/mod/py}/dg/Strategies.cpp (99%) rename {src/mod/Py => libs/pymod/src/mod/py}/graph/Automorphism.cpp (93%) create mode 100644 libs/pymod/src/mod/py/graph/Graph.cpp rename {src/mod/Py => libs/pymod/src/mod/py}/graph/GraphInterface.cpp (98%) rename {src/mod/Py => libs/pymod/src/mod/py}/graph/Printer.cpp (98%) rename {src/mod/Py => libs/pymod/src/mod/py}/rule/Composition.cpp (98%) rename {src/mod/Py => libs/pymod/src/mod/py}/rule/GraphInterface.cpp (99%) rename {src/mod/Py => libs/pymod/src/mod/py}/rule/Rule.cpp (98%) delete mode 100644 m4/ax_boost_base.m4 delete mode 100644 m4/ax_prefix_config_h.m4 delete mode 100644 src/bin/main.cpp delete mode 100755 src/bin/mod_fetchKEGGrewrite delete mode 100755 src/bin/mod_genSummaryMakefile delete mode 100644 src/jla_boost/test/vf2.hpp delete mode 100644 src/lib/pkgconfig/mod.pc.in delete mode 100644 src/mod/Misc.cpp delete mode 100644 src/mod/Misc.h delete mode 100644 src/mod/Py/Misc.cpp delete mode 100644 src/mod/Py/graph/Graph.cpp delete mode 100644 src/mod/lib/DG/Dump.h delete mode 100644 src/mod/lib/GraphPimpl.h delete mode 100644 src/mod/lib/Rules/LabelledRule.cpp.orig delete mode 100644 src/mod/lib/Rules/LabelledRule.h.orig delete mode 100644 src/share/mod/plugins/00_mod.in create mode 100644 test/CMakeLists.txt create mode 100644 test/cmake_add_subdirectory/CMakeLists.txt create mode 100644 test/cmake_add_subdirectory/project/CMakeLists.txt create mode 100644 test/cmake_add_subdirectory/project/main.cpp create mode 100644 test/cmake_import/CMakeLists.txt create mode 100644 test/cmake_import/project/CMakeLists.txt create mode 100644 test/cmake_import/project/main.cpp create mode 100644 test/py/DGSmilesProblem.py create mode 100644 test/py/chem.py create mode 100644 test/py/derivation.py create mode 100644 test/py/dg/DGDump.dg create mode 100644 test/py/dg/abstract/test.py create mode 100644 test/py/dg/dg.py create mode 100644 test/py/dg/dgDepiction.py create mode 100644 test/py/dg/dgDiff.py create mode 100644 test/py/dg/dgInlineGraphs.py create mode 100644 test/py/dg/dgPrintDPO.py create mode 100644 test/py/dg/dgPrintData.py create mode 100644 test/py/dg/dgPrinter.py create mode 100644 test/py/dg/dpoPrinting.py create mode 100644 test/py/dg/dupGraphs.py create mode 100644 test/py/dgStrat/add.py create mode 100644 test/py/dgStrat/common.py create mode 100644 test/py/dgStrat/derivationPredicates.py create mode 100644 test/py/dgStrat/execute.py create mode 100644 test/py/dgStrat/filter.py create mode 100644 test/py/dgStrat/parallel.py create mode 100644 test/py/dgStrat/repeat.py create mode 100644 test/py/dgStrat/revive.py create mode 100644 test/py/dgStrat/rule.py create mode 100644 test/py/dgStrat/sequence.py create mode 100644 test/py/dgStrat/sort.py create mode 100644 test/py/dgStrat/splitToIsomorphs.gml create mode 100644 test/py/dgStrat/take.py create mode 100644 test/py/dgStrat/testSplitToIsomorphs.py create mode 100644 test/py/formoseCommon/aldol_addition_backward.gml create mode 100644 test/py/formoseCommon/aldol_addition_backward_H.gml create mode 100644 test/py/formoseCommon/aldol_addition_forward.gml create mode 100644 test/py/formoseCommon/aldol_addition_forward_H.gml create mode 100644 test/py/formoseCommon/grammar.py create mode 100644 test/py/formoseCommon/grammar_H.py create mode 100644 test/py/formoseCommon/keto_enol_backward.gml create mode 100644 test/py/formoseCommon/keto_enol_forward.gml create mode 100644 test/py/function.py create mode 100644 test/py/graph/graph.gml create mode 100644 test/py/graph/graph.py create mode 100644 test/py/graph/graphDFS.py create mode 100644 test/py/graph/graphExtId.py create mode 100644 test/py/graph/graphPerm.py create mode 100644 test/py/graph/smilesId.py create mode 100644 test/py/graph/topo.py create mode 100644 test/py/isotopeDepict.py create mode 100644 test/py/matchConstraints/loadInvert.py create mode 100644 test/py/matchConstraints/shortestPath.py create mode 100644 test/py/matchConstraints/vertexAdjacency/coreInsteadOfComponent.py create mode 100644 test/py/matchConstraints/vertexAdjacency/main.py create mode 100644 test/py/matchConstraints/vertexAdjacency/termConversion.py create mode 100644 test/py/matchConstraints/vertexAdjacency/vertexAndEdge.py create mode 100644 test/py/molDepiction.py create mode 100644 test/py/parseReactionSmiles.py create mode 100644 test/py/pppCommon/aldo_keto_backward.gml create mode 100644 test/py/pppCommon/aldo_keto_forward.gml create mode 100644 test/py/pppCommon/aldolase.gml create mode 100644 test/py/pppCommon/dgStrict.py create mode 100644 test/py/pppCommon/dhap_aldolase.gml create mode 100644 test/py/pppCommon/grammar.py create mode 100644 test/py/pppCommon/phosphohydrolase.gml create mode 100644 test/py/pppCommon/transaldolase.gml create mode 100644 test/py/pppCommon/transketolase.gml create mode 100644 test/py/radical.py create mode 100644 test/py/rc/checks.py create mode 100644 test/py/rc/rules.py create mode 100644 test/py/rc/test.py create mode 100644 test/py/rc/unification.py create mode 100644 test/py/rcEval/common.py create mode 100644 test/py/rcEval/composeCommon.py create mode 100644 test/py/rcEval/composeParallel.py create mode 100644 test/py/rcEval/composeSub.py create mode 100644 test/py/rcEval/composeSuper.py create mode 100644 test/py/rcEval/constraints/rFirstTransfer.py create mode 100644 test/py/rcEval/constraints/rFirstTransfer_r1.gml create mode 100644 test/py/rcEval/constraints/rFirstTransfer_r2.gml create mode 100644 test/py/rcEval/constraints/rSecondDelete.py create mode 100644 test/py/rcEval/constraints/rSecondDelete_r1.gml create mode 100644 test/py/rcEval/constraints/rSecondDelete_r2.gml create mode 100644 test/py/rcEval/constraints/rSecondInLeft.py create mode 100644 test/py/rcEval/constraints/rSecondInLeft_r1.gml create mode 100644 test/py/rcEval/constraints/rSecondInLeft_r2.gml create mode 100644 test/py/rcEval/constraints/rSecondToRightSide.py create mode 100644 test/py/rcEval/constraints/rSecondToRightSide_r1.gml create mode 100644 test/py/rcEval/constraints/rSecondToRightSide_r2.gml create mode 100644 test/py/rcEval/constraints/rSecondTransfer.py create mode 100644 test/py/rcEval/constraints/rSecondTransfer_r1.gml create mode 100644 test/py/rcEval/constraints/rSecondTransfer_r2.gml create mode 100644 test/py/rcEval/convertGraph.py create mode 100644 test/py/rcEval/rule.py create mode 100644 test/py/rcEval/testFull.py create mode 100644 test/py/rcEval/union.py create mode 100644 test/py/rule/labelType.py create mode 100644 test/py/rule/rule.gml create mode 100644 test/py/rule/rule.py create mode 100644 test/py/rule/ruleExtId.py create mode 100644 test/py/rule/ruleGML.py create mode 100644 test/py/rule/ruleInterface.py create mode 100644 test/py/rule/topo.py create mode 100755 test/py/runAll.sh create mode 100644 test/py/smiles/cansmi-roundtrip.smi create mode 100755 test/py/smiles/doOBabelTests.sh create mode 100644 test/py/smiles/genSymbolJumpTable.py create mode 100644 test/py/smiles/nci.smi create mode 100644 test/py/smiles/notes.txt create mode 100644 test/py/smiles/problematic.py create mode 100644 test/py/smiles/rhea.py create mode 100644 test/py/smiles/smiles.py create mode 100644 test/py/smiles/smilesToDimacs.py create mode 100644 test/py/smiles/smiles_cansmi_roundtrip.py create mode 100644 test/py/smiles/smiles_nci.py create mode 100644 test/py/stereo/00_geometryAndEmbedding.py create mode 100644 test/py/stereo/01_geometry.py create mode 100644 test/py/stereo/02_embedding.py create mode 100644 test/py/stereo/03_completeDeduce.py create mode 100644 test/py/stereo/04_graphFix.py create mode 100644 test/py/stereo/10_errors.py create mode 100644 test/py/stereo/20_morphismGraph.py create mode 100644 test/py/stereo/30_morphismRule.py create mode 100644 test/py/stereo/common.py create mode 100644 test/py/stereo/graphDepiction.py create mode 100644 test/py/stereo/ruleDepiction.py create mode 100644 test/py/stereo/ruleGML.py create mode 100644 test/py/stereo/smiles.py create mode 100644 test/py/stereo/smilesAll.py create mode 100644 test/py/stereo/testTetraRule.py create mode 100644 test/py/term/counter.py create mode 100644 test/py/term/makeVars.py create mode 100644 test/py/term/parsing.py create mode 100644 test/py/term/relations.py create mode 100644 test/py/term/unification/atomDelete.py create mode 100644 test/py/term/unification/decomposition.py create mode 100644 test/py/term/unification/eliminate.py create mode 100644 test/py/term/unification/swapEliminate.py create mode 100644 test/py/util/boltzmann.py delete mode 100755 testJLA.sh diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..90ac797 --- /dev/null +++ b/.clang-format @@ -0,0 +1,115 @@ +Do not use this yet! +--- +Language: Cpp +BasedOnStyle: LLVM +#AccessModifierOffset: -2 +#AlignAfterOpenBracket: Align +#AlignConsecutiveAssignments: false +#AlignConsecutiveDeclarations: false +#AlignEscapedNewlines: Right +#AlignOperands: true +#AlignTrailingComments: true +#AllowAllParametersOfDeclarationOnNextLine: true +#AllowShortBlocksOnASingleLine: false +#AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty +#AllowShortIfStatementsOnASingleLine: false +AllowShortLambdasOnASingleLine: Empty +#AllowShortLoopsOnASingleLine: false +#AlwaysBreakAfterDefinitionReturnType: None +#AlwaysBreakAfterReturnType: None +#AlwaysBreakBeforeMultilineStrings: false +#AlwaysBreakTemplateDeclarations: false +#BinPackArguments: true +#BinPackParameters: true +#BraceWrapping: +# AfterClass: false +# AfterControlStatement: false +# AfterEnum: false +# AfterFunction: false +# AfterNamespace: false +# AfterObjCDeclaration: false +# AfterStruct: false +# AfterUnion: false +# AfterExternBlock: false +# BeforeCatch: false +# BeforeElse: false +# IndentBraces: false +# SplitEmptyFunction: true +# SplitEmptyRecord: true +# SplitEmptyNamespace: true +#BreakBeforeBinaryOperators: None +#BreakBeforeBraces: Attach +#BreakBeforeInheritanceComma: false +#BreakBeforeTernaryOperators: true +#BreakConstructorInitializersBeforeComma: false +#BreakConstructorInitializers: BeforeColon +#BreakAfterJavaFieldAnnotations: false +#BreakStringLiterals: true +ColumnLimit: 120 +#CommentPragmas: '^ IWYU pragma:' +#CompactNamespaces: false +#ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 6 +ContinuationIndentWidth: 6 +#Cpp11BracedListStyle: true +#DerivePointerAlignment: false +#DisableFormat: false +#ExperimentalAutoDetectBinPacking: false +#FixNamespaceComments: true +#ForEachMacros: +# - foreach +# - Q_FOREACH +# - BOOST_FOREACH +#IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^") + + +set(CMAKE_CXX_FLAGS_OPTDEBUG "-g -O3") +set(CMAKE_C_FLAGS_OPTDEBUG "-g -O3") +set(CMAKE_EXE_LINKER_FLAGS_OPTDEBUG "") +set(CMAKE_SHARED_LINKER_FLAGS_OPTDEBUG "") +mark_as_advanced(CMAKE_CXX_FLAGS_OPTDEBUG CMAKE_C_FLAGS_OPTDEBUG CMAKE_EXE_LINKER_FLAGS_OPTDEBUG CMAKE_SHARED_LINKER_FLAGS_OPTDEBUG) +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING + "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel OptDebug." + FORCE) +endif() + + +########################################################################### +# Options +########################################################################### +option(BUILD_DOC "Enable documentation building." ON) +option(BUILD_POST_MOD "Enable building of the post processor." ON) +option(BUILD_PY_MOD "Enable building of the Python bindings." ON) +option(BUILD_EXAMPLES "Enable example building." OFF) +option(BUILD_TESTING "Enable test building." OFF) +option(BUILD_TESTING_SANITIZERS "Compile tests with sanitizers." ON) +option(BUILD_COVERAGE "Enable code coverage." OFF) + +option(ENABLE_SYMBOL_HIDING "Hide internal symbols in the library." ON) +option(ENABLE_DEP_SYMBOL_HIDING "Hide symbols provided by library dependencies." ON) +option(ENABLE_IPO "Using link-time optimization." ON) +include(CheckIPOSupported) + +option(USE_NESTED_GRAPH_CANON "Use the GraphCanon version in external/graph_canon." ON) +option(WITH_OPENBABEL "Whether features depending on Open Babel are enabled or not." ON) + + +get_directory_property(hasParent PARENT_DIRECTORY) +if(hasParent) + set(BUILD_DOC 0) + set(BUILD_EXAMPLES 0) + set(BUILD_TESTING 0) + set(BUILD_COVERAGE 0) +endif() +if(NOT BUILD_TESTING) + set(BUILD_EXAMPLES OFF) +endif() + +enable_testing() # should be included here to add the targets in the top-level folder + +########################################################################### +# Individual checks +########################################################################### +set(CMAKE_CXX_STANDARD 14) + +set(libmod_config_dependencies "") +set(libmod_config_find_files "FindPackageHandleStandardArgs.cmake;FindPackageMessage.cmake;FindPkgConfig.cmake;SelectLibraryConfigurations.cmake") + + +# Boost +# ------------------------------------------------------------------------- +set(v 1.64.0) +if(BUILD_PY_MOD) + foreach(PY 3 34 35 36 37 38 39) + set(lib "python${PY}") + find_package(Boost ${v} QUIET COMPONENTS ${lib}) + if(Boost_FOUND) + find_package(Boost ${v} COMPONENTS ${lib}) + set(PYTHON_TARGET ${lib}) + break() + endif() + endforeach() + if(NOT Boost_FOUND) + find_package(Boost ${v} REQUIRED COMPONENTS python3) + message(FATAL_ERROR "Could not find Boost.Python for Python 3. Tried 'python' wih suffixes 3, 34, 35, 36, 37, 38, and 39.") + endif() +endif() +find_package(Boost ${v} REQUIRED COMPONENTS iostreams regex system) +string(APPEND libmod_config_dependencies "set(BOOST_FOUND 0)\n") # TODO: remove with CMake 3.15 is required https://gitlab.kitware.com/cmake/cmake/issues/18590 +string(APPEND libmod_config_dependencies "find_dependency(Boost ${v} COMPONENTS iostreams regex system)\n") +list(APPEND libmod_config_find_files "FindBoost.cmake") + + +# GraphCanon +# ------------------------------------------------------------------------- +set(v 0.4) +if(USE_NESTED_GRAPH_CANON) + message(STATUS "GraphCanon: using external/graph_canon") + add_subdirectory(external/graph_canon) + if(GraphCanon_VERSION VERSION_LESS v) + message(FATAL_ERROR "Nested GraphCanon version not new enough: is ${GraphCanon_VERSION}, needs ${v}." + " Try again after 'git submodule update --init --recursive; ./bootstrap.sh'." + " Otherwise please report as bug.") + endif() +else() + find_package(GraphCanon ${v} REQUIRED) + string(APPEND libmod_config_dependencies "find_dependency(GraphCanon ${v})\n") + message(STATUS "GraphCanon version: ${GraphCanon_VERSION}") +endif() + + +# Graphviz +# ------------------------------------------------------------------------- +if(BUILD_POST_MOD) + find_program(DOT dot) + if(NOT DOT) + message(FATAL_ERROR "Could not find the dot executable (from Graphviz) required for PostMØD.\n" + "Disable with -DBUILD_POST_MOD=no, or add the folder of the executable to PATH.")# or give with -DCMAKE_PROGRAM_PATH=paths (currently '${CMAKE_PROGRAM_PATH}').") + endif() + message(STATUS "Found dot: ${DOT}") + + execute_process( + COMMAND ${DOT} -P + COMMAND grep "cairo_device_svg -> output_svg" + RESULT_VARIABLE res + OUTPUT_QUIET ERROR_QUIET) + if(${res} EQUAL 0) + message(STATUS "Found dot to support cairo svg output.") + else() + message(FATAL_ERROR "The dot command does not seem to support cairo svg output, which is needed for PostMØD." + " Disable with -DBUILD_POST_MOD=no\n") + endif() + execute_process( + COMMAND ${DOT} -P + COMMAND grep "cairo_device_pdf -> output_pdf" + RESULT_VARIABLE res + OUTPUT_QUIET ERROR_QUIET) + if(${res} EQUAL 0) + message(STATUS "Found dot to support cairo pdf output.") + else() + message(FATAL_ERROR "The dot command does not seem to support cairo pdf output, which is needed for PostMØD." + " Disable with -DBUILD_POST_MOD=no\n") + endif() + execute_process( + COMMAND ${DOT} -P + COMMAND grep "rsvg_loadimage_svg -> render_cairo" + RESULT_VARIABLE res + OUTPUT_QUIET ERROR_QUIET) + if(${res} EQUAL 0) + message(STATUS "Found dot to support svg to cairo conversion.") + else() + message(FATAL_ERROR "The dot command does not seem to support svg to cairo conversion, which is needed for PostMØD." + " Disable with -DBUILD_POST_MOD=no\n") + endif() +endif() + + +# Open Babel +# ------------------------------------------------------------------------- +if(WITH_OPENBABEL) + find_package(OpenBabel2 2.3.2 REQUIRED) + string(APPEND libmod_config_dependencies "set(OpenBabel2_FOUND 0)\n") # TODO: remove with CMake 3.15 is required https://gitlab.kitware.com/cmake/cmake/issues/18590 + string(APPEND libmod_config_dependencies "find_dependency(OpenBabel2 2.3.2)\n") + list(APPEND libmod_config_find_files "FindOpenBabel2.cmake") + set(MOD_HAVE_OPENBABEL TRUE) +endif() + + +if(BUILD_POST_MOD) + # pdf2svg + # --------------------------------------------------------------------- + find_program(PDF2SVG pdf2svg) + if(NOT PDF2SVG) + message(FATAL_ERROR "Could not find pdf2svg program, required for post_mod.") + else() + message(STATUS "Found pdf2svg: ${PDF2SVG}") + endif() + + # pdflatex + # --------------------------------------------------------------------- + find_package(LATEX REQUIRED COMPONENTS PDFLATEX) +endif() + + + string(APPEND libmod_config_dependencies "set(PNAPI_FOUND 0)\n") # TODO: remove with CMake 3.15 is required https://gitlab.kitware.com/cmake/cmake/issues/18590 +# Python +# ------------------------------------------------------------------------- +if(BUILD_PY_MOD) + find_package(Python3 REQUIRED COMPONENTS Interpreter Development) +endif() + + +# Sphinx +# ------------------------------------------------------------------------- +if(BUILD_DOC) + find_program(SPHINX NAMES sphinx-build sphinx-build3 sphinx-build-3 sphinx-build2) + if(SPHINX) + message(STATUS "Sphinx: ${SPHINX}") + else() + message(FATAL_ERROR "Sphinx not found, required for building the documentation. Use --DBUILD_DOC=off to disable.") + endif() +endif() + + +# Threads +# ------------------------------------------------------------------------- +find_package(Threads REQUIRED) +string(APPEND libmod_config_dependencies "find_dependency(Threads)\n") + + +########################################################################### +# Targets and Artefacts +########################################################################### +include(CMakeFiles.txt) +include(Coverage) +include(GNUInstallDirs) + +if(NOT hasParent) + set(CMAKE_NO_BUILTIN_CHRPATH TRUE) # + # https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling + set(CMAKE_SKIP_BUILD_RPATH FALSE) # use RPATH in the build tree + set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) # but not the RPATH used in installation + set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}:${CMAKE_INSTALL_FULL_LIBDIR}/mod") # instead, add this one + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # in addition to those deduced automatically +endif() + +add_subdirectory(libs/gml) +add_subdirectory(libs/jla_boost) +add_subdirectory(libs/libmod) +add_subdirectory(libs/pymod) +add_subdirectory(libs/post_mod) +add_subdirectory(doc) +add_subdirectory(examples) +add_subdirectory(test) + + +# Packaging +# ------------------------------------------------------------------------- +string(TOUPPER ${PROJECT_NAME} PNAME_UPPER) +set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) # because the default doesn't include the tweak number +set(CPACK_GENERATOR "DEB") +#set(CPACK_GENERATOR "DEB" "RPM") +set(CPACK_DEB_COMPONENT_INSTALL ON) +#set(CPACK_RPM_COMPONENT_INSTALL ON) +set(CPACK_DEBIAN_ENABLE_COMPONENT_DEPENDS ON) +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) + +# we use CACHE INTERNAL to make it work when in a subproject +set(CPACK_DEBIAN_${PNAME_UPPER}_RUN_PACKAGE_SHLIBDEPS ON CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_LIB_PACKAGE_SHLIBDEPS ON CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_DEV_PACKAGE_SHLIBDEPS ON CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_DOC_PACKAGE_SHLIBDEPS ON CACHE INTERNAL "") + +set(CPACK_COMPONENT_${PNAME_UPPER}_RUN_DEPENDS ${PNAME_UPPER}_LIB CACHE INTERNAL "") +set(CPACK_COMPONENT_${PNAME_UPPER}_DEV_DEPENDS ${PNAME_UPPER}_LIB CACHE INTERNAL "") + +set(CPACK_DEBIAN_${PNAME_UPPER}_RUN_PACKAGE_NAME "${PNAME_FILE}" CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_LIB_PACKAGE_NAME "lib${PNAME_FILE}" CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_DEV_PACKAGE_NAME "lib${PNAME_FILE}-dev" CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_DOC_PACKAGE_NAME "${PNAME_FILE}-doc" CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_RUN_FILE_NAME "${PNAME_FILE}_${PROJECT_VERSION}.deb" CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_LIB_FILE_NAME "lib${PNAME_FILE}_${PROJECT_VERSION}.deb" CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_DEV_FILE_NAME "lib${PNAME_FILE}-dev_${PROJECT_VERSION}.deb" CACHE INTERNAL "") +set(CPACK_DEBIAN_${PNAME_UPPER}_DOC_FILE_NAME "${PNAME_FILE}-doc_${PROJECT_VERSION}.deb" CACHE INTERNAL "") + +#set(CPACK_RPM_${PNAME_UPPER}_RUN_PACKAGE_NAME "${PNAME_FILE}" CACHE INTERNAL "") +#set(CPACK_RPM_${PNAME_UPPER}_LIB_PACKAGE_NAME "lib${PNAME_FILE}" CACHE INTERNAL "") +#set(CPACK_RPM_${PNAME_UPPER}_DEV_PACKAGE_NAME "lib${PNAME_FILE}-devel" CACHE INTERNAL "") +#set(CPACK_RPM_${PNAME_UPPER}_DOC_PACKAGE_NAME "${PNAME_FILE}-doc" CACHE INTERNAL "") +#set(CPACK_RPM_${PNAME_UPPER}_RUN_FILE_NAME "${PNAME_FILE}-${PROJECT_VERSION}.rpm" CACHE INTERNAL "") +#set(CPACK_RPM_${PNAME_UPPER}_LIB_FILE_NAME "lib${PNAME_FILE}-${PROJECT_VERSION}.rpm" CACHE INTERNAL "") +#set(CPACK_RPM_${PNAME_UPPER}_DEV_FILE_NAME "lib${PNAME_FILE}-devel-${PROJECT_VERSION}.rpm" CACHE INTERNAL "") +#set(CPACK_RPM_${PNAME_UPPER}_DOC_FILE_NAME "${PNAME_FILE}-doc-${PROJECT_VERSION}.rpm" CACHE INTERNAL "") + +if(NOT hasParent) + set(CPACK_SOURCE_PACKAGE_FILE_NAME + "${PNAME_FILE}-${CPACK_PACKAGE_VERSION}") + set(CPACK_SOURCE_GENERATOR "TGZ") + set(CPACK_SOURCE_IGNORE_FILES + ".swp$" + "~$" + "__pycache__" + "*.pyc$" + "/.git" + "/.idea" + "/build" + "/stage" + "/test/py/.*/out/" + "/test/py/.*/summary/" + "/test/py/.*/.gdb_history" + "/test/py/graph/myGraph.gml" + "/test/py/rule/myRule.gml" + "/bootstrap.sh" + "/external") + add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source) + include(CPack) +endif() diff --git a/ChangeLog.rst b/ChangeLog.rst index 7d04cdd..1f692d8 100644 --- a/ChangeLog.rst +++ b/ChangeLog.rst @@ -1,15 +1,66 @@ .. cpp:namespace:: mod -.. py:module:: mod +.. py:currentmodule:: mod Changes ####### -Release 0.8.0 (2019-04-04) -========================== +v0.9.0 (2019-08-02) +=================== Incompatible Changes -------------------- +- Change to CMake as build system. + See :ref:`installation` for how to build the package, + or used it as a submodule in another CMake project. +- Now requires v0.4 of + `GraphCanon `__ + (and `PermGroup `__). +- :cpp:func:`DG::getGraphDatabase` now returns a :cpp:any:`std::vector` + instead of a :cpp:any:`std::unordered_set`. +- Hide internal symbols in the library to increase optimization opportunities, + and hide symbols in library dependencies. + Libraries linking against libmod may stop linking, but configuration options + has been added to disable symbol hiding. + + +New Features +------------ + +- :py:func:`dgDump`/:cpp:func:`dg::DG::dump` should now be much, much faster + in parsing the input file and loading the contained derivation graph. +- :py:func:`dgRulecomp`/:cpp:func:`dg::DG::ruleComp` should now be much faster + during calculation. +- Added :py:func:`Graph.instantiateStereo`/:cpp:func:`graph::Graph::instantiateStereo`. +- Added :py:func:`rngReseed`/:cpp:func:`rngReseed`. + + +Bugs Fixed +---------- + +- Fixed off-by-one error in DG dump loading, :py:func:`dgDump`/:cpp:func:`dg::DG::dump`. +- Fixed issues with ``auto`` in function signatures which is not yet in the C++ standard. + + +Other +----- + +- The functions :py:func:`prefixFilename`, :py:func:`pushFilePrefix`, and :py:func:`popFilePrefix` + used by the :py:func:`include` function are now documented. + A new class :py:class:`CWDPath` has been added. +- Use interprocedural/link-time optimization as default. + It can be disabled with a configuration option. + + +v0.8.0 (2019-04-04) +=================== + +Incompatible Changes +-------------------- + +- Now requires v0.3 of + `GraphCanon `__ + (and `PermGroup `__). - ``graph::Graph::getMolarMass``/``Graph.molarMass`` has been removed. - Python interface: remove auto-generated hash-functions from all classes. Note, most code broken by this was already silemtly broken. @@ -98,8 +149,8 @@ Other - The Makefile from ``mod --get-latex`` now cleans ``.vrb``, ``.snm``, and ``.nav`` files as well. -Release 0.7.0 (2018-03-08) -========================== +v0.7.0 (2018-03-08) +=================== Incompatible Changes -------------------- @@ -192,8 +243,8 @@ Other post-processing may fail if ``pdflatex`` has been upgraded after installation -Release 0.6.0 (2016-12-22) -========================== +v0.6.0 (2016-12-22) +=================== Incompatible Changes -------------------- @@ -264,7 +315,7 @@ Bugs Fixed - Properly handle empty vertex/hyperedge ranges for DGs. Thanks to Robert Haas for reporting. -Release 0.5.0 (2016-03-07) -========================== +v0.5.0 (2016-03-07) +=================== Initial public version. diff --git a/INSTALL b/INSTALL deleted file mode 100644 index 7d1c323..0000000 --- a/INSTALL +++ /dev/null @@ -1,365 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006, 2007, 2008, 2009 Free Software Foundation, Inc. - - Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. This file is offered as-is, -without warranty of any kind. - -Basic Installation -================== - - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index c11dc10..0000000 --- a/Makefile.am +++ /dev/null @@ -1,41 +0,0 @@ -SUBDIRS = src doc -EXTRA_DIST = \ - ChangeLog.rst - -dist_pkgdata_DATA = \ - VERSION - -SPHINXBUILD = @SPHINXBUILD@ -TOPSOURCEDIR = $(top_srcdir) -TOPBUILDDIR = $(top_builddir) - -clean-local: - -rm -rf doc/html - -.PHONY: doc -doc: html - -html-local: -if ENABLE_SPHINX - $(TOPSOURCEDIR)/doc/makeDocs.sh "$(SPHINXBUILD)" "$(TOPSOURCEDIR)" "$(TOPBUILDDIR)" -else - @echo "======================================================" - @echo "Skipping documentation building (see configure output)" - @echo "======================================================" -endif - -.PHONY: install-doc -install-doc: install-html - -install-html-local: html -if ENABLE_SPHINX - mkdir -p "@htmldir@" - cp -a $(TOPBUILDDIR)/doc/build/html/* "@htmldir@/" -else - @echo "==========================================================" - @echo "Skipping documentation installation (see configure output)" - @echo "==========================================================" -endif - -uninstall-local: - rm -rf @htmldir@ diff --git a/NB_compile.sh b/NB_compile.sh deleted file mode 100755 index a2ab674..0000000 --- a/NB_compile.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -export CPPFLAGS=-I/usr/include/openbabel-2.0 -export LIBRARY_PATH=/home/jla/ILOG_CPLEX/concert/lib/x86-64_linux/static_pic:/home/jla/ILOG_CPLEX/cplex/lib/x86-64_linux/static_pic -cd NB_mod -make clean -make -j 8 || exit $? -cd .. -cd NB_pymod -make clean -make -j 8 || exit $? diff --git a/NB_mod/Makefile b/NB_mod/Makefile deleted file mode 100644 index 1abcc91..0000000 --- a/NB_mod/Makefile +++ /dev/null @@ -1,155 +0,0 @@ -# -# There exist several targets which are by default empty and which can be -# used for execution of your targets. These targets are usually executed -# before and after some main targets. They are: -# -# .build-pre: called before 'build' target -# .build-post: called after 'build' target -# .clean-pre: called before 'clean' target -# .clean-post: called after 'clean' target -# .clobber-pre: called before 'clobber' target -# .clobber-post: called after 'clobber' target -# .all-pre: called before 'all' target -# .all-post: called after 'all' target -# .help-pre: called before 'help' target -# .help-post: called after 'help' target -# -# Targets beginning with '.' are not intended to be called on their own. -# -# Main targets can be executed directly, and they are: -# -# build build a specific configuration -# clean remove built files from a configuration -# clobber remove all built files -# all build all configurations -# help print help mesage -# -# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and -# .help-impl are implemented in nbproject/makefile-impl.mk. -# -# Available make variables: -# -# CND_BASEDIR base directory for relative paths -# CND_DISTDIR default top distribution directory (build artifacts) -# CND_BUILDDIR default top build directory (object files, ...) -# CONF name of current configuration -# CND_PLATFORM_${CONF} platform name (current configuration) -# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) -# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) -# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) -# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) -# CND_PACKAGE_NAME_${CONF} name of package (current configuration) -# CND_PACKAGE_PATH_${CONF} path to package (current configuration) -# -# NOCDDL - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin - - -# build -build: .build-post - cd ${CND_BASEDIR}/dist/share/mod/ && pdflatex -interaction=nonstopmode -halt-on-error -ini "&pdflatex \input{commonPreamble.tex}\usepackage{mod}\dump" &> /dev/null - -.build-pre: -# Add your pre 'build' code here... - mkdir -p ${CND_BASEDIR}/dist - mkdir -p ${CND_BASEDIR}/dist/bin - mkdir -p ${CND_BASEDIR}/dist/share/mod - mkdir -p ${CND_BASEDIR}/dist/share/mod/plugins - cp ${CND_BASEDIR}/../src/bin/mod ${CND_BASEDIR}/dist/bin/ - cp ${CND_BASEDIR}/../src/bin/mod_post ${CND_BASEDIR}/dist/bin/ - cp ${CND_BASEDIR}/../src/bin/mod_genSummaryMakefile ${CND_BASEDIR}/dist/bin/ - cp ${CND_BASEDIR}/../src/bin/mod_fetchKEGGrewrite ${CND_BASEDIR}/dist/bin/ - cp ${CND_BASEDIR}/../src/share/mod/commonPreamble.tex ${CND_BASEDIR}/dist/share/mod/ - cp ${CND_BASEDIR}/../src/share/mod/summary.tex ${CND_BASEDIR}/dist/share/mod/ - cp ${CND_BASEDIR}/../src/share/mod/figureTemplate.tex ${CND_BASEDIR}/dist/share/mod/ - cp ${CND_BASEDIR}/../src/share/mod/mod.sty ${CND_BASEDIR}/dist/share/mod/ - cp ${CND_BASEDIR}/../src/share/mod/mod.mk ${CND_BASEDIR}/dist/share/mod/ - cp ${CND_BASEDIR}/../src/share/mod/obabel.supp ${CND_BASEDIR}/dist/share/mod/ - cp ${CND_BASEDIR}/../src/share/mod/python.supp ${CND_BASEDIR}/dist/share/mod/ - echo "NB" > ${CND_BASEDIR}/dist/share/mod/VERSION - echo "name: mod" > ${CND_BASEDIR}/dist/share/mod/plugins/00_mod - echo "path: ${CND_BASEDIR}/dist/lib" >> ${CND_BASEDIR}/dist/share/mod/plugins/00_mod - -#${CND_BASEDIR}/../src/share/mod/commonPreamble.tex - -.build-post: .build-impl -# Add your post 'build' code here... - -# clean -clean: .clean-post - rm -f ${CND_BASEDIR}/dist/bin/mod - rm -f ${CND_BASEDIR}/dist/bin/mod_post - rm -f ${CND_BASEDIR}/dist/bin/mod_genSummaryMakefile - rm -f ${CND_BASEDIR}/dist/bin/mod_fetchKEGGrewrite - rm -f ${CND_BASEDIR}/dist/share/mod/commonPreamble.* - rm -f ${CND_BASEDIR}/dist/share/mod/summary.tex - rm -f ${CND_BASEDIR}/dist/share/mod/figureTemplate.tex - rm -f ${CND_BASEDIR}/dist/share/mod/obabel.supp - rm -f ${CND_BASEDIR}/dist/share/mod/python.supp - -.clean-pre: -# Add your pre 'clean' code here... - -.clean-post: .clean-impl -# Add your post 'clean' code here... - - -# clobber -clobber: .clobber-post - -.clobber-pre: -# Add your pre 'clobber' code here... - -.clobber-post: .clobber-impl -# Add your post 'clobber' code here... - - -# all -all: .all-post - -.all-pre: -# Add your pre 'all' code here... - -.all-post: .all-impl -# Add your post 'all' code here... - - -# build tests -build-tests: .build-tests-post - -.build-tests-pre: -# Add your pre 'build-tests' code here... - -.build-tests-post: .build-tests-impl -# Add your post 'build-tests' code here... - - -# run tests -test: .test-post - -.test-pre: -# Add your pre 'test' code here... - -.test-post: .test-impl -# Add your post 'test' code here... - - -# help -help: .help-post - -.help-pre: -# Add your pre 'help' code here... - -.help-post: .help-impl -# Add your post 'help' code here... - -# include project implementation makefile -include nbproject/Makefile-impl.mk - -# include project make variables -include nbproject/Makefile-variables.mk diff --git a/NB_mod/nbproject/Makefile-Debug.mk b/NB_mod/nbproject/Makefile-Debug.mk deleted file mode 100644 index e5f93b8..0000000 --- a/NB_mod/nbproject/Makefile-Debug.mk +++ /dev/null @@ -1,605 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Environment -MKDIR=mkdir -CP=cp -GREP=grep -NM=nm -CCADMIN=CCadmin -RANLIB=ranlib -CC=gcc -CCC=time g++ -CXX=time g++ -FC=gfortran -AS=as - -# Macros -CND_PLATFORM=GNU-Linux -CND_DLIB_EXT=so -CND_CONF=Debug -CND_DISTDIR=dist -CND_BUILDDIR=build - -# Include project Makefile -include Makefile - -# Object Directory -OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} - -# Object Files -OBJECTFILES= \ - ${OBJECTDIR}/_ext/27549c4c/parser.o \ - ${OBJECTDIR}/_ext/9729d8dc/IO.o \ - ${OBJECTDIR}/_ext/4d98cc98/vf2.o \ - ${OBJECTDIR}/_ext/2754b308/Chem.o \ - ${OBJECTDIR}/_ext/2754b308/Config.o \ - ${OBJECTDIR}/_ext/2754b308/Derivation.o \ - ${OBJECTDIR}/_ext/2754b308/Error.o \ - ${OBJECTDIR}/_ext/2754b308/Function.o \ - ${OBJECTDIR}/_ext/2754b308/Misc.o \ - ${OBJECTDIR}/_ext/2754b308/Term.o \ - ${OBJECTDIR}/_ext/f98eccea/DG.o \ - ${OBJECTDIR}/_ext/f98eccea/GraphInterface.o \ - ${OBJECTDIR}/_ext/f98eccea/Printer.o \ - ${OBJECTDIR}/_ext/f98eccea/Strategies.o \ - ${OBJECTDIR}/_ext/5108d387/Automorphism.o \ - ${OBJECTDIR}/_ext/5108d387/Graph.o \ - ${OBJECTDIR}/_ext/5108d387/GraphInterface.o \ - ${OBJECTDIR}/_ext/5108d387/Printer.o \ - ${OBJECTDIR}/_ext/3b7f185e/Mass.o \ - ${OBJECTDIR}/_ext/3b7f185e/MoleculeUtil.o \ - ${OBJECTDIR}/_ext/3b7f185e/OBabel.o \ - ${OBJECTDIR}/_ext/3b7f185e/Smiles.o \ - ${OBJECTDIR}/_ext/3b7f185e/SmilesRead.o \ - ${OBJECTDIR}/_ext/3b7f185e/SmilesWrite.o \ - ${OBJECTDIR}/_ext/d81a8134/Dump.o \ - ${OBJECTDIR}/_ext/d81a8134/Hyper.o \ - ${OBJECTDIR}/_ext/d81a8134/NonHyper.o \ - ${OBJECTDIR}/_ext/d81a8134/NonHyperDerivations.o \ - ${OBJECTDIR}/_ext/d81a8134/NonHyperRuleComp.o \ - ${OBJECTDIR}/_ext/da13872c/Add.o \ - ${OBJECTDIR}/_ext/da13872c/DerivationPredicates.o \ - ${OBJECTDIR}/_ext/da13872c/Execute.o \ - ${OBJECTDIR}/_ext/da13872c/Filter.o \ - ${OBJECTDIR}/_ext/da13872c/GraphState.o \ - ${OBJECTDIR}/_ext/da13872c/Parallel.o \ - ${OBJECTDIR}/_ext/da13872c/Repeat.o \ - ${OBJECTDIR}/_ext/da13872c/Revive.o \ - ${OBJECTDIR}/_ext/da13872c/Rule.o \ - ${OBJECTDIR}/_ext/da13872c/Sequence.o \ - ${OBJECTDIR}/_ext/da13872c/Sort.o \ - ${OBJECTDIR}/_ext/da13872c/Strategy.o \ - ${OBJECTDIR}/_ext/da13872c/Take.o \ - ${OBJECTDIR}/_ext/34a0cedd/Canonicalisation.o \ - ${OBJECTDIR}/_ext/34a0cedd/DFSEncoding.o \ - ${OBJECTDIR}/_ext/34a0cedd/LabelledGraph.o \ - ${OBJECTDIR}/_ext/d46a6fc5/Depiction.o \ - ${OBJECTDIR}/_ext/d46a6fc5/Molecule.o \ - ${OBJECTDIR}/_ext/d46a6fc5/Term.o \ - ${OBJECTDIR}/_ext/34a0cedd/Single.o \ - ${OBJECTDIR}/_ext/d81a81d7/DGRead.o \ - ${OBJECTDIR}/_ext/d81a81d7/DGWrite.o \ - ${OBJECTDIR}/_ext/d81a81d7/Derivation.o \ - ${OBJECTDIR}/_ext/d81a81d7/FileHandle.o \ - ${OBJECTDIR}/_ext/d81a81d7/GMLUtil.o \ - ${OBJECTDIR}/_ext/d81a81d7/GraphRead.o \ - ${OBJECTDIR}/_ext/d81a81d7/GraphWrite.o \ - ${OBJECTDIR}/_ext/d81a81d7/IO.o \ - ${OBJECTDIR}/_ext/d81a81d7/RC.o \ - ${OBJECTDIR}/_ext/d81a81d7/RuleRead.o \ - ${OBJECTDIR}/_ext/d81a81d7/RuleWrite.o \ - ${OBJECTDIR}/_ext/d81a81d7/StereoRead.o \ - ${OBJECTDIR}/_ext/d81a81d7/StereoWrite.o \ - ${OBJECTDIR}/_ext/d81a81d7/Term.o \ - ${OBJECTDIR}/_ext/d81a82e2/ComposeRuleReal.o \ - ${OBJECTDIR}/_ext/d81a82e2/Evaluator.o \ - ${OBJECTDIR}/_ext/384aeefe/Random.o \ - ${OBJECTDIR}/_ext/353d5686/LabelledRule.o \ - ${OBJECTDIR}/_ext/5cc9b47c/Depiction.o \ - ${OBJECTDIR}/_ext/5cc9b47c/Molecule.o \ - ${OBJECTDIR}/_ext/5cc9b47c/String.o \ - ${OBJECTDIR}/_ext/5cc9b47c/Term.o \ - ${OBJECTDIR}/_ext/353d5686/Real.o \ - ${OBJECTDIR}/_ext/a9543190/Any.o \ - ${OBJECTDIR}/_ext/a9543190/Configuration.o \ - ${OBJECTDIR}/_ext/a9543190/Linear.o \ - ${OBJECTDIR}/_ext/a9543190/Tetrahedral.o \ - ${OBJECTDIR}/_ext/a9543190/TrigonalPlanar.o \ - ${OBJECTDIR}/_ext/74113c49/EdgeCategory.o \ - ${OBJECTDIR}/_ext/74113c49/EmbeddingEdge.o \ - ${OBJECTDIR}/_ext/74113c49/GeometryGraph.o \ - ${OBJECTDIR}/_ext/74113c49/Inference.o \ - ${OBJECTDIR}/_ext/384aeefe/StringStore.o \ - ${OBJECTDIR}/_ext/3b86c8fd/RawTerm.o \ - ${OBJECTDIR}/_ext/3b86c8fd/WAM.o \ - ${OBJECTDIR}/_ext/d115d9a3/Composer.o \ - ${OBJECTDIR}/_ext/d115d9a3/CompositionExpr.o \ - ${OBJECTDIR}/_ext/d115d9a3/GraphInterface.o \ - ${OBJECTDIR}/_ext/d115d9a3/Rule.o - - -# C Compiler Flags -CFLAGS= - -# CC Compiler Flags -CCFLAGS=-O3 -fno-strict-aliasing -fPIC -pthread -Wall -Wextra -Wno-unused-local-typedefs -Wno-unused-parameter -Wno-comment -Wno-maybe-uninitialized -Wno-deprecated-declarations -Wno-sign-compare -Wno-ignored-attributes -ftemplate-backtrace-limit=0 -fno-stack-protector -CXXFLAGS=-O3 -fno-strict-aliasing -fPIC -pthread -Wall -Wextra -Wno-unused-local-typedefs -Wno-unused-parameter -Wno-comment -Wno-maybe-uninitialized -Wno-deprecated-declarations -Wno-sign-compare -Wno-ignored-attributes -ftemplate-backtrace-limit=0 -fno-stack-protector - -# Fortran Compiler Flags -FFLAGS= - -# Assembler Flags -ASFLAGS= - -# Link Libraries and Options -LDLIBSOPTIONS=-L${HOME}/programs/lib -Wl,-rpath,'${HOME}/programs/lib' -Wl,-Bdynamic -lboost_regex -lboost_system -lopenbabel -pthread -Wl,-Bdynamic -ldl - -# Build Targets -.build-conf: ${BUILD_SUBPROJECTS} - "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk dist/lib/libmod.${CND_DLIB_EXT} - -dist/lib/libmod.${CND_DLIB_EXT}: ${OBJECTFILES} - ${MKDIR} -p dist/lib - ${LINK.cc} -o dist/lib/libmod.${CND_DLIB_EXT} ${OBJECTFILES} ${LDLIBSOPTIONS} -rdynamic -Wl,--no-undefined -shared -fPIC - -${OBJECTDIR}/_ext/27549c4c/parser.o: ../src/gml/parser.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/27549c4c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/27549c4c/parser.o ../src/gml/parser.cpp - -${OBJECTDIR}/_ext/9729d8dc/IO.o: ../src/jla_boost/graph/dpo/IO.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/9729d8dc - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/9729d8dc/IO.o ../src/jla_boost/graph/dpo/IO.cpp - -${OBJECTDIR}/_ext/4d98cc98/vf2.o: ../src/jla_boost/test/vf2.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/4d98cc98 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/4d98cc98/vf2.o ../src/jla_boost/test/vf2.cpp - -${OBJECTDIR}/_ext/2754b308/Chem.o: ../src/mod/Chem.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/2754b308 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/2754b308/Chem.o ../src/mod/Chem.cpp - -${OBJECTDIR}/_ext/2754b308/Config.o: ../src/mod/Config.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/2754b308 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/2754b308/Config.o ../src/mod/Config.cpp - -${OBJECTDIR}/_ext/2754b308/Derivation.o: ../src/mod/Derivation.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/2754b308 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/2754b308/Derivation.o ../src/mod/Derivation.cpp - -${OBJECTDIR}/_ext/2754b308/Error.o: ../src/mod/Error.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/2754b308 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/2754b308/Error.o ../src/mod/Error.cpp - -${OBJECTDIR}/_ext/2754b308/Function.o: ../src/mod/Function.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/2754b308 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/2754b308/Function.o ../src/mod/Function.cpp - -${OBJECTDIR}/_ext/2754b308/Misc.o: ../src/mod/Misc.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/2754b308 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/2754b308/Misc.o ../src/mod/Misc.cpp - -${OBJECTDIR}/_ext/2754b308/Term.o: ../src/mod/Term.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/2754b308 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/2754b308/Term.o ../src/mod/Term.cpp - -${OBJECTDIR}/_ext/f98eccea/DG.o: ../src/mod/dg/DG.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eccea - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eccea/DG.o ../src/mod/dg/DG.cpp - -${OBJECTDIR}/_ext/f98eccea/GraphInterface.o: ../src/mod/dg/GraphInterface.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eccea - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eccea/GraphInterface.o ../src/mod/dg/GraphInterface.cpp - -${OBJECTDIR}/_ext/f98eccea/Printer.o: ../src/mod/dg/Printer.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eccea - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eccea/Printer.o ../src/mod/dg/Printer.cpp - -${OBJECTDIR}/_ext/f98eccea/Strategies.o: ../src/mod/dg/Strategies.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eccea - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eccea/Strategies.o ../src/mod/dg/Strategies.cpp - -${OBJECTDIR}/_ext/5108d387/Automorphism.o: ../src/mod/graph/Automorphism.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/5108d387 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5108d387/Automorphism.o ../src/mod/graph/Automorphism.cpp - -${OBJECTDIR}/_ext/5108d387/Graph.o: ../src/mod/graph/Graph.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/5108d387 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5108d387/Graph.o ../src/mod/graph/Graph.cpp - -${OBJECTDIR}/_ext/5108d387/GraphInterface.o: ../src/mod/graph/GraphInterface.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/5108d387 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5108d387/GraphInterface.o ../src/mod/graph/GraphInterface.cpp - -${OBJECTDIR}/_ext/5108d387/Printer.o: ../src/mod/graph/Printer.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/5108d387 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5108d387/Printer.o ../src/mod/graph/Printer.cpp - -${OBJECTDIR}/_ext/3b7f185e/Mass.o: ../src/mod/lib/Chem/Mass.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/3b7f185e - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/3b7f185e/Mass.o ../src/mod/lib/Chem/Mass.cpp - -${OBJECTDIR}/_ext/3b7f185e/MoleculeUtil.o: ../src/mod/lib/Chem/MoleculeUtil.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/3b7f185e - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/3b7f185e/MoleculeUtil.o ../src/mod/lib/Chem/MoleculeUtil.cpp - -${OBJECTDIR}/_ext/3b7f185e/OBabel.o: ../src/mod/lib/Chem/OBabel.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/3b7f185e - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/3b7f185e/OBabel.o ../src/mod/lib/Chem/OBabel.cpp - -${OBJECTDIR}/_ext/3b7f185e/Smiles.o: ../src/mod/lib/Chem/Smiles.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/3b7f185e - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/3b7f185e/Smiles.o ../src/mod/lib/Chem/Smiles.cpp - -${OBJECTDIR}/_ext/3b7f185e/SmilesRead.o: ../src/mod/lib/Chem/SmilesRead.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/3b7f185e - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/3b7f185e/SmilesRead.o ../src/mod/lib/Chem/SmilesRead.cpp - -${OBJECTDIR}/_ext/3b7f185e/SmilesWrite.o: ../src/mod/lib/Chem/SmilesWrite.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/3b7f185e - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/3b7f185e/SmilesWrite.o ../src/mod/lib/Chem/SmilesWrite.cpp - -${OBJECTDIR}/_ext/d81a8134/Dump.o: ../src/mod/lib/DG/Dump.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a8134 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a8134/Dump.o ../src/mod/lib/DG/Dump.cpp - -${OBJECTDIR}/_ext/d81a8134/Hyper.o: ../src/mod/lib/DG/Hyper.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a8134 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a8134/Hyper.o ../src/mod/lib/DG/Hyper.cpp - -${OBJECTDIR}/_ext/d81a8134/NonHyper.o: ../src/mod/lib/DG/NonHyper.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a8134 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a8134/NonHyper.o ../src/mod/lib/DG/NonHyper.cpp - -${OBJECTDIR}/_ext/d81a8134/NonHyperDerivations.o: ../src/mod/lib/DG/NonHyperDerivations.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a8134 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a8134/NonHyperDerivations.o ../src/mod/lib/DG/NonHyperDerivations.cpp - -${OBJECTDIR}/_ext/d81a8134/NonHyperRuleComp.o: ../src/mod/lib/DG/NonHyperRuleComp.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a8134 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a8134/NonHyperRuleComp.o ../src/mod/lib/DG/NonHyperRuleComp.cpp - -${OBJECTDIR}/_ext/da13872c/Add.o: ../src/mod/lib/DG/Strategies/Add.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Add.o ../src/mod/lib/DG/Strategies/Add.cpp - -${OBJECTDIR}/_ext/da13872c/DerivationPredicates.o: ../src/mod/lib/DG/Strategies/DerivationPredicates.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/DerivationPredicates.o ../src/mod/lib/DG/Strategies/DerivationPredicates.cpp - -${OBJECTDIR}/_ext/da13872c/Execute.o: ../src/mod/lib/DG/Strategies/Execute.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Execute.o ../src/mod/lib/DG/Strategies/Execute.cpp - -${OBJECTDIR}/_ext/da13872c/Filter.o: ../src/mod/lib/DG/Strategies/Filter.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Filter.o ../src/mod/lib/DG/Strategies/Filter.cpp - -${OBJECTDIR}/_ext/da13872c/GraphState.o: ../src/mod/lib/DG/Strategies/GraphState.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/GraphState.o ../src/mod/lib/DG/Strategies/GraphState.cpp - -${OBJECTDIR}/_ext/da13872c/Parallel.o: ../src/mod/lib/DG/Strategies/Parallel.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Parallel.o ../src/mod/lib/DG/Strategies/Parallel.cpp - -${OBJECTDIR}/_ext/da13872c/Repeat.o: ../src/mod/lib/DG/Strategies/Repeat.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Repeat.o ../src/mod/lib/DG/Strategies/Repeat.cpp - -${OBJECTDIR}/_ext/da13872c/Revive.o: ../src/mod/lib/DG/Strategies/Revive.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Revive.o ../src/mod/lib/DG/Strategies/Revive.cpp - -${OBJECTDIR}/_ext/da13872c/Rule.o: ../src/mod/lib/DG/Strategies/Rule.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Rule.o ../src/mod/lib/DG/Strategies/Rule.cpp - -${OBJECTDIR}/_ext/da13872c/Sequence.o: ../src/mod/lib/DG/Strategies/Sequence.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Sequence.o ../src/mod/lib/DG/Strategies/Sequence.cpp - -${OBJECTDIR}/_ext/da13872c/Sort.o: ../src/mod/lib/DG/Strategies/Sort.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Sort.o ../src/mod/lib/DG/Strategies/Sort.cpp - -${OBJECTDIR}/_ext/da13872c/Strategy.o: ../src/mod/lib/DG/Strategies/Strategy.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Strategy.o ../src/mod/lib/DG/Strategies/Strategy.cpp - -${OBJECTDIR}/_ext/da13872c/Take.o: ../src/mod/lib/DG/Strategies/Take.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/da13872c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/da13872c/Take.o ../src/mod/lib/DG/Strategies/Take.cpp - -${OBJECTDIR}/_ext/34a0cedd/Canonicalisation.o: ../src/mod/lib/Graph/Canonicalisation.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/34a0cedd - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/34a0cedd/Canonicalisation.o ../src/mod/lib/Graph/Canonicalisation.cpp - -${OBJECTDIR}/_ext/34a0cedd/DFSEncoding.o: ../src/mod/lib/Graph/DFSEncoding.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/34a0cedd - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/34a0cedd/DFSEncoding.o ../src/mod/lib/Graph/DFSEncoding.cpp - -${OBJECTDIR}/_ext/34a0cedd/LabelledGraph.o: ../src/mod/lib/Graph/LabelledGraph.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/34a0cedd - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/34a0cedd/LabelledGraph.o ../src/mod/lib/Graph/LabelledGraph.cpp - -${OBJECTDIR}/_ext/d46a6fc5/Depiction.o: ../src/mod/lib/Graph/Properties/Depiction.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d46a6fc5 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d46a6fc5/Depiction.o ../src/mod/lib/Graph/Properties/Depiction.cpp - -${OBJECTDIR}/_ext/d46a6fc5/Molecule.o: ../src/mod/lib/Graph/Properties/Molecule.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d46a6fc5 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d46a6fc5/Molecule.o ../src/mod/lib/Graph/Properties/Molecule.cpp - -${OBJECTDIR}/_ext/d46a6fc5/Term.o: ../src/mod/lib/Graph/Properties/Term.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d46a6fc5 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d46a6fc5/Term.o ../src/mod/lib/Graph/Properties/Term.cpp - -${OBJECTDIR}/_ext/34a0cedd/Single.o: ../src/mod/lib/Graph/Single.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/34a0cedd - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/34a0cedd/Single.o ../src/mod/lib/Graph/Single.cpp - -${OBJECTDIR}/_ext/d81a81d7/DGRead.o: ../src/mod/lib/IO/DGRead.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/DGRead.o ../src/mod/lib/IO/DGRead.cpp - -${OBJECTDIR}/_ext/d81a81d7/DGWrite.o: ../src/mod/lib/IO/DGWrite.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/DGWrite.o ../src/mod/lib/IO/DGWrite.cpp - -${OBJECTDIR}/_ext/d81a81d7/Derivation.o: ../src/mod/lib/IO/Derivation.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/Derivation.o ../src/mod/lib/IO/Derivation.cpp - -${OBJECTDIR}/_ext/d81a81d7/FileHandle.o: ../src/mod/lib/IO/FileHandle.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/FileHandle.o ../src/mod/lib/IO/FileHandle.cpp - -${OBJECTDIR}/_ext/d81a81d7/GMLUtil.o: ../src/mod/lib/IO/GMLUtil.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/GMLUtil.o ../src/mod/lib/IO/GMLUtil.cpp - -${OBJECTDIR}/_ext/d81a81d7/GraphRead.o: ../src/mod/lib/IO/GraphRead.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/GraphRead.o ../src/mod/lib/IO/GraphRead.cpp - -${OBJECTDIR}/_ext/d81a81d7/GraphWrite.o: ../src/mod/lib/IO/GraphWrite.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/GraphWrite.o ../src/mod/lib/IO/GraphWrite.cpp - -${OBJECTDIR}/_ext/d81a81d7/IO.o: ../src/mod/lib/IO/IO.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/IO.o ../src/mod/lib/IO/IO.cpp - -${OBJECTDIR}/_ext/d81a81d7/RC.o: ../src/mod/lib/IO/RC.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/RC.o ../src/mod/lib/IO/RC.cpp - -${OBJECTDIR}/_ext/d81a81d7/RuleRead.o: ../src/mod/lib/IO/RuleRead.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/RuleRead.o ../src/mod/lib/IO/RuleRead.cpp - -${OBJECTDIR}/_ext/d81a81d7/RuleWrite.o: ../src/mod/lib/IO/RuleWrite.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/RuleWrite.o ../src/mod/lib/IO/RuleWrite.cpp - -${OBJECTDIR}/_ext/d81a81d7/StereoRead.o: ../src/mod/lib/IO/StereoRead.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/StereoRead.o ../src/mod/lib/IO/StereoRead.cpp - -${OBJECTDIR}/_ext/d81a81d7/StereoWrite.o: ../src/mod/lib/IO/StereoWrite.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/StereoWrite.o ../src/mod/lib/IO/StereoWrite.cpp - -${OBJECTDIR}/_ext/d81a81d7/Term.o: ../src/mod/lib/IO/Term.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a81d7 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a81d7/Term.o ../src/mod/lib/IO/Term.cpp - -${OBJECTDIR}/_ext/d81a82e2/ComposeRuleReal.o: ../src/mod/lib/RC/ComposeRuleReal.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a82e2 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a82e2/ComposeRuleReal.o ../src/mod/lib/RC/ComposeRuleReal.cpp - -${OBJECTDIR}/_ext/d81a82e2/Evaluator.o: ../src/mod/lib/RC/Evaluator.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d81a82e2 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d81a82e2/Evaluator.o ../src/mod/lib/RC/Evaluator.cpp - -${OBJECTDIR}/_ext/384aeefe/Random.o: ../src/mod/lib/Random.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/384aeefe - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/384aeefe/Random.o ../src/mod/lib/Random.cpp - -${OBJECTDIR}/_ext/353d5686/LabelledRule.o: ../src/mod/lib/Rules/LabelledRule.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/353d5686 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/353d5686/LabelledRule.o ../src/mod/lib/Rules/LabelledRule.cpp - -${OBJECTDIR}/_ext/5cc9b47c/Depiction.o: ../src/mod/lib/Rules/Properties/Depiction.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/5cc9b47c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5cc9b47c/Depiction.o ../src/mod/lib/Rules/Properties/Depiction.cpp - -${OBJECTDIR}/_ext/5cc9b47c/Molecule.o: ../src/mod/lib/Rules/Properties/Molecule.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/5cc9b47c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5cc9b47c/Molecule.o ../src/mod/lib/Rules/Properties/Molecule.cpp - -${OBJECTDIR}/_ext/5cc9b47c/String.o: ../src/mod/lib/Rules/Properties/String.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/5cc9b47c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5cc9b47c/String.o ../src/mod/lib/Rules/Properties/String.cpp - -${OBJECTDIR}/_ext/5cc9b47c/Term.o: ../src/mod/lib/Rules/Properties/Term.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/5cc9b47c - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5cc9b47c/Term.o ../src/mod/lib/Rules/Properties/Term.cpp - -${OBJECTDIR}/_ext/353d5686/Real.o: ../src/mod/lib/Rules/Real.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/353d5686 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/353d5686/Real.o ../src/mod/lib/Rules/Real.cpp - -${OBJECTDIR}/_ext/a9543190/Any.o: ../src/mod/lib/Stereo/Configuration/Any.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/a9543190 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/a9543190/Any.o ../src/mod/lib/Stereo/Configuration/Any.cpp - -${OBJECTDIR}/_ext/a9543190/Configuration.o: ../src/mod/lib/Stereo/Configuration/Configuration.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/a9543190 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/a9543190/Configuration.o ../src/mod/lib/Stereo/Configuration/Configuration.cpp - -${OBJECTDIR}/_ext/a9543190/Linear.o: ../src/mod/lib/Stereo/Configuration/Linear.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/a9543190 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/a9543190/Linear.o ../src/mod/lib/Stereo/Configuration/Linear.cpp - -${OBJECTDIR}/_ext/a9543190/Tetrahedral.o: ../src/mod/lib/Stereo/Configuration/Tetrahedral.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/a9543190 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/a9543190/Tetrahedral.o ../src/mod/lib/Stereo/Configuration/Tetrahedral.cpp - -${OBJECTDIR}/_ext/a9543190/TrigonalPlanar.o: ../src/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/a9543190 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/a9543190/TrigonalPlanar.o ../src/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp - -${OBJECTDIR}/_ext/74113c49/EdgeCategory.o: ../src/mod/lib/Stereo/EdgeCategory.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/74113c49 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/74113c49/EdgeCategory.o ../src/mod/lib/Stereo/EdgeCategory.cpp - -${OBJECTDIR}/_ext/74113c49/EmbeddingEdge.o: ../src/mod/lib/Stereo/EmbeddingEdge.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/74113c49 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/74113c49/EmbeddingEdge.o ../src/mod/lib/Stereo/EmbeddingEdge.cpp - -${OBJECTDIR}/_ext/74113c49/GeometryGraph.o: ../src/mod/lib/Stereo/GeometryGraph.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/74113c49 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/74113c49/GeometryGraph.o ../src/mod/lib/Stereo/GeometryGraph.cpp - -${OBJECTDIR}/_ext/74113c49/Inference.o: ../src/mod/lib/Stereo/Inference.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/74113c49 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/74113c49/Inference.o ../src/mod/lib/Stereo/Inference.cpp - -${OBJECTDIR}/_ext/384aeefe/StringStore.o: ../src/mod/lib/StringStore.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/384aeefe - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/384aeefe/StringStore.o ../src/mod/lib/StringStore.cpp - -${OBJECTDIR}/_ext/3b86c8fd/RawTerm.o: ../src/mod/lib/Term/RawTerm.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/3b86c8fd - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/3b86c8fd/RawTerm.o ../src/mod/lib/Term/RawTerm.cpp - -${OBJECTDIR}/_ext/3b86c8fd/WAM.o: ../src/mod/lib/Term/WAM.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/3b86c8fd - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/3b86c8fd/WAM.o ../src/mod/lib/Term/WAM.cpp - -${OBJECTDIR}/_ext/d115d9a3/Composer.o: ../src/mod/rule/Composer.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d115d9a3 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d115d9a3/Composer.o ../src/mod/rule/Composer.cpp - -${OBJECTDIR}/_ext/d115d9a3/CompositionExpr.o: ../src/mod/rule/CompositionExpr.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d115d9a3 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d115d9a3/CompositionExpr.o ../src/mod/rule/CompositionExpr.cpp - -${OBJECTDIR}/_ext/d115d9a3/GraphInterface.o: ../src/mod/rule/GraphInterface.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d115d9a3 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d115d9a3/GraphInterface.o ../src/mod/rule/GraphInterface.cpp - -${OBJECTDIR}/_ext/d115d9a3/Rule.o: ../src/mod/rule/Rule.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d115d9a3 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SYSTEM_NO_DEPRECATED -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${CND_BASEDIR}/../src/mod/lib/boost/include -I${CND_BASEDIR}/../src -I${CND_BASEDIR}/srcExtra -I/usr/include/openbabel-2.0 -I${HOME}/programs/include -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d115d9a3/Rule.o ../src/mod/rule/Rule.cpp - -# Subprojects -.build-subprojects: - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r ${CND_BUILDDIR}/${CND_CONF} - -# Subprojects -.clean-subprojects: - -# Enable dependency checking -.dep.inc: .depcheck-impl - -include .dep.inc diff --git a/NB_mod/nbproject/Makefile-impl.mk b/NB_mod/nbproject/Makefile-impl.mk deleted file mode 100644 index 2021861..0000000 --- a/NB_mod/nbproject/Makefile-impl.mk +++ /dev/null @@ -1,133 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a pre- and a post- target defined where you can add customization code. -# -# This makefile implements macros and targets common to all configurations. -# -# NOCDDL - - -# Building and Cleaning subprojects are done by default, but can be controlled with the SUB -# macro. If SUB=no, subprojects will not be built or cleaned. The following macro -# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf -# and .clean-reqprojects-conf unless SUB has the value 'no' -SUB_no=NO -SUBPROJECTS=${SUB_${SUB}} -BUILD_SUBPROJECTS_=.build-subprojects -BUILD_SUBPROJECTS_NO= -BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} -CLEAN_SUBPROJECTS_=.clean-subprojects -CLEAN_SUBPROJECTS_NO= -CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} - - -# Project Name -PROJECTNAME=NB_mod - -# Active Configuration -DEFAULTCONF=Debug -CONF=${DEFAULTCONF} - -# All Configurations -ALLCONFS=Debug - - -# build -.build-impl: .build-pre .validate-impl .depcheck-impl - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf - - -# clean -.clean-impl: .clean-pre .validate-impl .depcheck-impl - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf - - -# clobber -.clobber-impl: .clobber-pre .depcheck-impl - @#echo "=> Running $@..." - for CONF in ${ALLCONFS}; \ - do \ - "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \ - done - -# all -.all-impl: .all-pre .depcheck-impl - @#echo "=> Running $@..." - for CONF in ${ALLCONFS}; \ - do \ - "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \ - done - -# build tests -.build-tests-impl: .build-impl .build-tests-pre - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf - -# run tests -.test-impl: .build-tests-impl .test-pre - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf - -# dependency checking support -.depcheck-impl: - @echo "# This code depends on make tool being used" >.dep.inc - @if [ -n "${MAKE_VERSION}" ]; then \ - echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES} \$${TESTOBJECTFILES}))" >>.dep.inc; \ - echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ - echo "include \$${DEPFILES}" >>.dep.inc; \ - echo "endif" >>.dep.inc; \ - else \ - echo ".KEEP_STATE:" >>.dep.inc; \ - echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ - fi - -# configuration validation -.validate-impl: - @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ - then \ - echo ""; \ - echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \ - echo "See 'make help' for details."; \ - echo "Current directory: " `pwd`; \ - echo ""; \ - fi - @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ - then \ - exit 1; \ - fi - - -# help -.help-impl: .help-pre - @echo "This makefile supports the following configurations:" - @echo " ${ALLCONFS}" - @echo "" - @echo "and the following targets:" - @echo " build (default target)" - @echo " clean" - @echo " clobber" - @echo " all" - @echo " help" - @echo "" - @echo "Makefile Usage:" - @echo " make [CONF=] [SUB=no] build" - @echo " make [CONF=] [SUB=no] clean" - @echo " make [SUB=no] clobber" - @echo " make [SUB=no] all" - @echo " make help" - @echo "" - @echo "Target 'build' will build a specific configuration and, unless 'SUB=no'," - @echo " also build subprojects." - @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no'," - @echo " also clean subprojects." - @echo "Target 'clobber' will remove all built files from all configurations and," - @echo " unless 'SUB=no', also from subprojects." - @echo "Target 'all' will will build all configurations and, unless 'SUB=no'," - @echo " also build subprojects." - @echo "Target 'help' prints this message." - @echo "" - diff --git a/NB_mod/nbproject/Makefile-variables.mk b/NB_mod/nbproject/Makefile-variables.mk deleted file mode 100644 index bdb4f74..0000000 --- a/NB_mod/nbproject/Makefile-variables.mk +++ /dev/null @@ -1,27 +0,0 @@ -# -# Generated - do not edit! -# -# NOCDDL -# -CND_BASEDIR=`pwd` -CND_BUILDDIR=build -CND_DISTDIR=dist -# Debug configuration -CND_PLATFORM_Debug=GNU-Linux -CND_ARTIFACT_DIR_Debug=dist/lib -CND_ARTIFACT_NAME_Debug=libmod.so -CND_ARTIFACT_PATH_Debug=dist/lib/libmod.so -CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux/package -CND_PACKAGE_NAME_Debug=libNBmod.so.tar -CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux/package/libNBmod.so.tar -# -# include compiler specific variables -# -# dmake command -ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \ - (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk) -# -# gmake command -.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)) -# -include nbproject/private/Makefile-variables.mk diff --git a/NB_mod/nbproject/Package-Debug.bash b/NB_mod/nbproject/Package-Debug.bash deleted file mode 100644 index 2b56103..0000000 --- a/NB_mod/nbproject/Package-Debug.bash +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_PLATFORM=GNU-Linux -CND_CONF=Debug -CND_DISTDIR=dist -CND_BUILDDIR=build -CND_DLIB_EXT=so -NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=dist/lib/libmod.${CND_DLIB_EXT} -OUTPUT_BASENAME=libmod.${CND_DLIB_EXT} -PACKAGE_TOP_DIR=libNBmod.so/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package -rm -rf ${NBTMPDIR} -mkdir -p ${NBTMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory "${NBTMPDIR}/libNBmod.so/lib" -copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}lib/${OUTPUT_BASENAME}" 0644 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/libNBmod.so.tar -cd ${NBTMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/libNBmod.so.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${NBTMPDIR} diff --git a/NB_mod/nbproject/configurations.xml b/NB_mod/nbproject/configurations.xml deleted file mode 100644 index 83a2eb1..0000000 --- a/NB_mod/nbproject/configurations.xml +++ /dev/null @@ -1,1329 +0,0 @@ - - - - - ../src/gml/ast.hpp - ../src/gml/attr_handler.hpp - ../src/gml/converter.hpp - ../src/gml/converter_edsl.hpp - ../src/gml/converter_expressions.hpp - ../src/gml/parser.cpp - ../src/gml/parser.hpp - ../src/gml/value_type.hpp - - - - - ../src/jla_boost/graph/dpo/FilteredGraphProjection.hpp - ../src/jla_boost/graph/dpo/IO.cpp - ../src/jla_boost/graph/dpo/IO.hpp - ../src/jla_boost/graph/dpo/Rule.hpp - - - - ../src/jla_boost/graph/morphism/callbacks/Filter.hpp - ../src/jla_boost/graph/morphism/callbacks/Limit.hpp - ../src/jla_boost/graph/morphism/callbacks/Print.hpp - ../src/jla_boost/graph/morphism/callbacks/SliceProps.hpp - ../src/jla_boost/graph/morphism/callbacks/Store.hpp - ../src/jla_boost/graph/morphism/callbacks/Transform.hpp - ../src/jla_boost/graph/morphism/callbacks/Unwrapper.hpp - - - ../src/jla_boost/graph/morphism/finders/CommonSubgraph.hpp - ../src/jla_boost/graph/morphism/finders/InjectiveEnumeration.hpp - ../src/jla_boost/graph/morphism/finders/vf2.hpp - - - ../src/jla_boost/graph/morphism/models/Inverted.hpp - ../src/jla_boost/graph/morphism/models/InvertibleAdaptor.hpp - ../src/jla_boost/graph/morphism/models/PropertyMap.hpp - ../src/jla_boost/graph/morphism/models/PropertyVertexMap.hpp - ../src/jla_boost/graph/morphism/models/Reinterpreted.hpp - ../src/jla_boost/graph/morphism/models/Vector.hpp - - ../src/jla_boost/graph/morphism/AsPropertyMap.hpp - ../src/jla_boost/graph/morphism/Predicates.hpp - ../src/jla_boost/graph/morphism/PropertyTags.hpp - ../src/jla_boost/graph/morphism/Traits.hpp - ../src/jla_boost/graph/morphism/VertexMap.hpp - ../src/jla_boost/graph/morphism/VertexOrderByMult.hpp - - ../src/jla_boost/graph/AdaptorTraits.hpp - ../src/jla_boost/graph/Concepts.hpp - ../src/jla_boost/graph/EdgeIndexedAdjacencyList.hpp - ../src/jla_boost/graph/FilteredWrapper.hpp - ../src/jla_boost/graph/PairToRangeAdaptor.hpp - ../src/jla_boost/graph/UnionGraph.hpp - - - ../src/jla_boost/test/vf2.cpp - ../src/jla_boost/test/vf2.hpp - - ../src/jla_boost/Functional.hpp - ../src/jla_boost/TaggedList.hpp - - - - - ../src/mod/dg/DG.cpp - ../src/mod/dg/DG.h - ../src/mod/dg/ForwardDecl.h - ../src/mod/dg/GraphInterface.cpp - ../src/mod/dg/GraphInterface.h - ../src/mod/dg/Printer.cpp - ../src/mod/dg/Printer.h - ../src/mod/dg/Strategies.cpp - ../src/mod/dg/Strategies.h - - - ../src/mod/graph/Automorphism.cpp - ../src/mod/graph/Automorphism.h - ../src/mod/graph/ForwardDecl.h - ../src/mod/graph/Graph.cpp - ../src/mod/graph/Graph.h - ../src/mod/graph/GraphInterface.cpp - ../src/mod/graph/GraphInterface.h - ../src/mod/graph/Printer.cpp - ../src/mod/graph/Printer.h - - - ../src/mod/rule/Composer.cpp - ../src/mod/rule/Composer.h - ../src/mod/rule/CompositionExpr.cpp - ../src/mod/rule/CompositionExpr.h - ../src/mod/rule/ForwardDecl.h - ../src/mod/rule/GraphInterface.cpp - ../src/mod/rule/GraphInterface.h - ../src/mod/rule/Rule.cpp - ../src/mod/rule/Rule.h - - srcExtra/mod/BuildConfig.h - ../src/mod/Chem.cpp - ../src/mod/Chem.h - ../src/mod/Config.cpp - ../src/mod/Config.h - ../src/mod/Derivation.cpp - ../src/mod/Derivation.h - ../src/mod/Error.cpp - ../src/mod/Error.h - ../src/mod/Function.cpp - ../src/mod/Function.h - ../src/mod/Misc.cpp - ../src/mod/Misc.h - ../src/mod/Term.cpp - ../src/mod/Term.h - - - - ../src/mod/lib/Chem/Mass.cpp - ../src/mod/lib/Chem/MoleculeUtil.cpp - ../src/mod/lib/Chem/MoleculeUtil.h - ../src/mod/lib/Chem/OBabel.cpp - ../src/mod/lib/Chem/OBabel.h - ../src/mod/lib/Chem/Smiles.cpp - ../src/mod/lib/Chem/Smiles.h - ../src/mod/lib/Chem/SmilesRead.cpp - ../src/mod/lib/Chem/SmilesWrite.cpp - - - - ../src/mod/lib/DG/Strategies/Add.cpp - ../src/mod/lib/DG/Strategies/Add.h - ../src/mod/lib/DG/Strategies/DerivationPredicates.cpp - ../src/mod/lib/DG/Strategies/DerivationPredicates.h - ../src/mod/lib/DG/Strategies/Execute.cpp - ../src/mod/lib/DG/Strategies/Execute.h - ../src/mod/lib/DG/Strategies/Filter.cpp - ../src/mod/lib/DG/Strategies/Filter.h - ../src/mod/lib/DG/Strategies/GraphState.cpp - ../src/mod/lib/DG/Strategies/GraphState.h - ../src/mod/lib/DG/Strategies/Parallel.cpp - ../src/mod/lib/DG/Strategies/Parallel.h - ../src/mod/lib/DG/Strategies/Repeat.cpp - ../src/mod/lib/DG/Strategies/Repeat.h - ../src/mod/lib/DG/Strategies/Revive.cpp - ../src/mod/lib/DG/Strategies/Revive.h - ../src/mod/lib/DG/Strategies/Rule.cpp - ../src/mod/lib/DG/Strategies/Rule.h - ../src/mod/lib/DG/Strategies/Sequence.cpp - ../src/mod/lib/DG/Strategies/Sequence.h - ../src/mod/lib/DG/Strategies/Sort.cpp - ../src/mod/lib/DG/Strategies/Sort.h - ../src/mod/lib/DG/Strategies/Strategy.cpp - ../src/mod/lib/DG/Strategies/Strategy.h - ../src/mod/lib/DG/Strategies/Take.cpp - ../src/mod/lib/DG/Strategies/Take.h - - ../src/mod/lib/DG/Dump.cpp - ../src/mod/lib/DG/Dump.h - ../src/mod/lib/DG/GraphDecl.h - ../src/mod/lib/DG/Hyper.cpp - ../src/mod/lib/DG/Hyper.h - ../src/mod/lib/DG/NonHyper.cpp - ../src/mod/lib/DG/NonHyper.h - ../src/mod/lib/DG/NonHyperDerivations.cpp - ../src/mod/lib/DG/NonHyperDerivations.h - ../src/mod/lib/DG/NonHyperRuleComp.cpp - ../src/mod/lib/DG/NonHyperRuleComp.h - - - - ../src/mod/lib/Graph/Properties/Depiction.cpp - ../src/mod/lib/Graph/Properties/Depiction.h - ../src/mod/lib/Graph/Properties/Molecule.cpp - ../src/mod/lib/Graph/Properties/Molecule.h - ../src/mod/lib/Graph/Properties/Property.h - ../src/mod/lib/Graph/Properties/Stereo.h - ../src/mod/lib/Graph/Properties/String.h - ../src/mod/lib/Graph/Properties/Term.cpp - ../src/mod/lib/Graph/Properties/Term.h - - ../src/mod/lib/Graph/Canonicalisation.cpp - ../src/mod/lib/Graph/Canonicalisation.h - ../src/mod/lib/Graph/DFSEncoding.cpp - ../src/mod/lib/Graph/DFSEncoding.h - ../src/mod/lib/Graph/GraphDecl.h - ../src/mod/lib/Graph/LabelledGraph.cpp - ../src/mod/lib/Graph/LabelledGraph.h - ../src/mod/lib/Graph/Multiset.h - ../src/mod/lib/Graph/MultisetIO.h - ../src/mod/lib/Graph/Single.cpp - ../src/mod/lib/Graph/Single.h - - - - ../src/mod/lib/GraphMorphism/Constraints/AllVisitor.h - ../src/mod/lib/GraphMorphism/Constraints/CheckVisitor.h - ../src/mod/lib/GraphMorphism/Constraints/Constraint.h - ../src/mod/lib/GraphMorphism/Constraints/ShortestPath.h - ../src/mod/lib/GraphMorphism/Constraints/VertexAdjacency.h - ../src/mod/lib/GraphMorphism/Constraints/Visitor.h - - ../src/mod/lib/GraphMorphism/Finder.hpp - ../src/mod/lib/GraphMorphism/LabelledMorphism.h - ../src/mod/lib/GraphMorphism/McGregorCommonFinder.hpp - ../src/mod/lib/GraphMorphism/StereoVertexMap.h - ../src/mod/lib/GraphMorphism/TermVertexMap.h - ../src/mod/lib/GraphMorphism/VF2Finder.hpp - - - ../src/mod/lib/IO/DG.h - ../src/mod/lib/IO/DGRead.cpp - ../src/mod/lib/IO/DGWrite.cpp - ../src/mod/lib/IO/DGWriteDetail.h - ../src/mod/lib/IO/Derivation.cpp - ../src/mod/lib/IO/Derivation.h - ../src/mod/lib/IO/FileHandle.cpp - ../src/mod/lib/IO/FileHandle.h - ../src/mod/lib/IO/GMLUtil.cpp - ../src/mod/lib/IO/GMLUtils.h - ../src/mod/lib/IO/Graph.h - ../src/mod/lib/IO/GraphRead.cpp - ../src/mod/lib/IO/GraphWrite.cpp - ../src/mod/lib/IO/GraphWriteDetail.h - ../src/mod/lib/IO/IO.cpp - ../src/mod/lib/IO/IO.h - ../src/mod/lib/IO/MorphismConstraints.h - ../src/mod/lib/IO/ParsingUtil.h - ../src/mod/lib/IO/RC.cpp - ../src/mod/lib/IO/RC.h - ../src/mod/lib/IO/Rule.h - ../src/mod/lib/IO/RuleRead.cpp - ../src/mod/lib/IO/RuleWrite.cpp - ../src/mod/lib/IO/Stereo.h - ../src/mod/lib/IO/StereoRead.cpp - ../src/mod/lib/IO/StereoWrite.cpp - ../src/mod/lib/IO/Term.cpp - ../src/mod/lib/IO/Term.h - - - - ../src/mod/lib/RC/detail/CompositionHelper.h - - - ../src/mod/lib/RC/MatchMaker/Common.h - ../src/mod/lib/RC/MatchMaker/ComponentWiseUtil.h - ../src/mod/lib/RC/MatchMaker/LabelledMatch.h - ../src/mod/lib/RC/MatchMaker/Parallel.h - ../src/mod/lib/RC/MatchMaker/Sub.h - ../src/mod/lib/RC/MatchMaker/Super.h - - - ../src/mod/lib/RC/Visitor/Compound.h - ../src/mod/lib/RC/Visitor/MatchConstraints.h - ../src/mod/lib/RC/Visitor/Stereo.h - ../src/mod/lib/RC/Visitor/String.h - ../src/mod/lib/RC/Visitor/Term.h - - ../src/mod/lib/RC/Compose.h - ../src/mod/lib/RC/ComposeRuleReal.cpp - ../src/mod/lib/RC/ComposeRuleReal.h - ../src/mod/lib/RC/ComposeRuleRealGeneric.h - ../src/mod/lib/RC/Evaluator.cpp - ../src/mod/lib/RC/Evaluator.h - ../src/mod/lib/RC/LabelledComposition.h - ../src/mod/lib/RC/Result.h - - - - ../src/mod/lib/Rules/Properties/Depiction.cpp - ../src/mod/lib/Rules/Properties/Depiction.h - ../src/mod/lib/Rules/Properties/Molecule.cpp - ../src/mod/lib/Rules/Properties/Molecule.h - ../src/mod/lib/Rules/Properties/Property.h - ../src/mod/lib/Rules/Properties/Stereo.h - ../src/mod/lib/Rules/Properties/String.cpp - ../src/mod/lib/Rules/Properties/String.h - ../src/mod/lib/Rules/Properties/Term.cpp - ../src/mod/lib/Rules/Properties/Term.h - - ../src/mod/lib/Rules/ConnectedComponent.h - ../src/mod/lib/Rules/GraphDecl.h - ../src/mod/lib/Rules/GraphToRule.h - ../src/mod/lib/Rules/LabelledRule.cpp - ../src/mod/lib/Rules/LabelledRule.h - ../src/mod/lib/Rules/Real.cpp - ../src/mod/lib/Rules/Real.h - - - - ../src/mod/lib/Stereo/Configuration/Any.cpp - ../src/mod/lib/Stereo/Configuration/Any.h - ../src/mod/lib/Stereo/CloneUtil.h - ../src/mod/lib/Stereo/Configuration/Configuration.cpp - ../src/mod/lib/Stereo/Configuration/Configuration.h - ../src/mod/lib/Stereo/Configuration/Linear.cpp - ../src/mod/lib/Stereo/Configuration/Linear.h - ../src/mod/lib/Stereo/Configuration/Tetrahedral.cpp - ../src/mod/lib/Stereo/Configuration/Tetrahedral.h - ../src/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp - ../src/mod/lib/Stereo/Configuration/TrigonalPlanar.h - - ../src/mod/lib/Stereo/EdgeCategory.cpp - ../src/mod/lib/Stereo/EdgeCategory.h - ../src/mod/lib/Stereo/EmbeddingEdge.cpp - ../src/mod/lib/Stereo/EmbeddingEdge.h - ../src/mod/lib/Stereo/GeometryGraph.cpp - ../src/mod/lib/Stereo/GeometryGraph.h - ../src/mod/lib/Stereo/Inference.cpp - ../src/mod/lib/Stereo/Inference.h - - - ../src/mod/lib/Term/RawTerm.cpp - ../src/mod/lib/Term/RawTerm.h - ../src/mod/lib/Term/WAM.cpp - ../src/mod/lib/Term/WAM.h - - ../src/mod/lib/Algorithm.h - ../src/mod/lib/GraphPimpl.h - ../src/mod/lib/LabelledGraph.h - ../src/mod/lib/LabelledUnionGraph.h - ../src/mod/lib/Random.cpp - ../src/mod/lib/Random.h - ../src/mod/lib/StringStore.cpp - ../src/mod/lib/StringStore.h - - - - - - Makefile - - - ^(nbproject|build|test|tests|Py)$ - - ../src/mod - ../src/jla_boost - ../src/gml - - Makefile - - - - default - true - false - - - - 11 - time g++ - - ${CND_BASEDIR}/../../perm_group/include - ${CND_BASEDIR}/../../graph_canon/include - ${CND_BASEDIR}/../src/mod/lib/boost/include - ${CND_BASEDIR}/../src - ${CND_BASEDIR}/srcExtra - /usr/include/openbabel-2.0 - ${HOME}/programs/include - - -O3 -fno-strict-aliasing -fPIC -pthread -Wall -Wextra -Wno-unused-local-typedefs -Wno-unused-parameter -Wno-comment -Wno-maybe-uninitialized -Wno-deprecated-declarations -Wno-sign-compare -Wno-ignored-attributes -ftemplate-backtrace-limit=0 -fno-stack-protector - - BOOST_RESULT_OF_USE_DECLTYPE - BOOST_SPIRIT_USE_PHOENIX_V3 - BOOST_SYSTEM_NO_DEPRECATED - - - - dist/lib/libmod.${CND_DLIB_EXT} - - ${HOME}/programs/lib - - - ${HOME}/programs/lib - - - -Wl,-Bdynamic - boost_regex - boost_system - openbabel - -pthread - -Wl,-Bdynamic - dl - - -rdynamic -Wl,--no-undefined - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/NB_mod/nbproject/project.xml b/NB_mod/nbproject/project.xml deleted file mode 100644 index c19ff23..0000000 --- a/NB_mod/nbproject/project.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - org.netbeans.modules.cnd.makeproject - - - mod - - cpp - h,hpp - UTF-8 - - - ../src/mod - ../src/jla_boost - ../src/gml - - - - Debug - 2 - - - - true - Default|NetBeans - Default|NetBeans - Default|NetBeans - - - - diff --git a/NB_mod/srcExtra/mod/BuildConfig.h b/NB_mod/srcExtra/mod/BuildConfig.h deleted file mode 100644 index 82caf1e..0000000 --- a/NB_mod/srcExtra/mod/BuildConfig.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef MOD_BUILDCONFIG_H -#define MOD_BUILDCONFIG_H - -#define MOD_HAVE_OPENBABEL 1 -#define MOD_VERSION "repo" -#define MOD_PACKAGE_BUGREPORT "Jakob@caput.dk" - -#endif // MOD_BUILDCONFIG_H diff --git a/NB_pymod/Makefile b/NB_pymod/Makefile deleted file mode 100644 index 3b06c79..0000000 --- a/NB_pymod/Makefile +++ /dev/null @@ -1,129 +0,0 @@ -# -# There exist several targets which are by default empty and which can be -# used for execution of your targets. These targets are usually executed -# before and after some main targets. They are: -# -# .build-pre: called before 'build' target -# .build-post: called after 'build' target -# .clean-pre: called before 'clean' target -# .clean-post: called after 'clean' target -# .clobber-pre: called before 'clobber' target -# .clobber-post: called after 'clobber' target -# .all-pre: called before 'all' target -# .all-post: called after 'all' target -# .help-pre: called before 'help' target -# .help-post: called after 'help' target -# -# Targets beginning with '.' are not intended to be called on their own. -# -# Main targets can be executed directly, and they are: -# -# build build a specific configuration -# clean remove built files from a configuration -# clobber remove all built files -# all build all configurations -# help print help mesage -# -# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and -# .help-impl are implemented in nbproject/makefile-impl.mk. -# -# Available make variables: -# -# CND_BASEDIR base directory for relative paths -# CND_DISTDIR default top distribution directory (build artifacts) -# CND_BUILDDIR default top build directory (object files, ...) -# CONF name of current configuration -# CND_PLATFORM_${CONF} platform name (current configuration) -# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) -# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) -# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) -# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) -# CND_PACKAGE_NAME_${CONF} name of package (current configuration) -# CND_PACKAGE_PATH_${CONF} path to package (current configuration) -# -# NOCDDL - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin - - -# build -build: .build-post - -.build-pre: -# Add your pre 'build' code here... - cd ${CND_BASEDIR}/../NB_mod && make -f Makefile .build-pre - mkdir -p ${CND_BASEDIR}/../NB_mod/dist/lib - cp -a ${CND_BASEDIR}/../src/lib/mod ${CND_BASEDIR}/../NB_mod/dist/lib/ - -.build-post: .build-impl -# Add your post 'build' code here... - cp ${CND_BASEDIR}/dist/lib/mod/mod_.so ${CND_BASEDIR}/../NB_mod/dist/lib/mod/ - -# clean -clean: .clean-post - -.clean-pre: -# Add your pre 'clean' code here... - -.clean-post: .clean-impl -# Add your post 'clean' code here... - - -# clobber -clobber: .clobber-post - -.clobber-pre: -# Add your pre 'clobber' code here... - -.clobber-post: .clobber-impl -# Add your post 'clobber' code here... - - -# all -all: .all-post - -.all-pre: -# Add your pre 'all' code here... - -.all-post: .all-impl -# Add your post 'all' code here... - - -# build tests -build-tests: .build-tests-post - -.build-tests-pre: -# Add your pre 'build-tests' code here... - -.build-tests-post: .build-tests-impl -# Add your post 'build-tests' code here... - - -# run tests -test: .test-post - -.test-pre: -# Add your pre 'test' code here... - -.test-post: .test-impl -# Add your post 'test' code here... - - -# help -help: .help-post - -.help-pre: -# Add your pre 'help' code here... - -.help-post: .help-impl -# Add your post 'help' code here... - -# include project implementation makefile -include nbproject/Makefile-impl.mk - -# include project make variables -include nbproject/Makefile-variables.mk diff --git a/NB_pymod/nbproject/Makefile-Debug.mk b/NB_pymod/nbproject/Makefile-Debug.mk deleted file mode 100644 index 0903846..0000000 --- a/NB_pymod/nbproject/Makefile-Debug.mk +++ /dev/null @@ -1,201 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Environment -MKDIR=mkdir -CP=cp -GREP=grep -NM=nm -CCADMIN=CCadmin -RANLIB=ranlib -CC=gcc -CCC=time g++ -CXX=time g++ -FC=gfortran -AS=as - -# Macros -CND_PLATFORM=GNU-Linux -CND_DLIB_EXT=so -CND_CONF=Debug -CND_DISTDIR=dist -CND_BUILDDIR=build - -# Include project Makefile -include Makefile - -# Object Directory -OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} - -# Object Files -OBJECTFILES= \ - ${OBJECTDIR}/_ext/f98eca90/Chem.o \ - ${OBJECTDIR}/_ext/f98eca90/Collections.o \ - ${OBJECTDIR}/_ext/f98eca90/Config.o \ - ${OBJECTDIR}/_ext/f98eca90/Derivation.o \ - ${OBJECTDIR}/_ext/f98eca90/Error.o \ - ${OBJECTDIR}/_ext/f98eca90/Function.o \ - ${OBJECTDIR}/_ext/f98eca90/Misc.o \ - ${OBJECTDIR}/_ext/f98eca90/Module.o \ - ${OBJECTDIR}/_ext/f98eca90/Term.o \ - ${OBJECTDIR}/_ext/4fc72862/DG.o \ - ${OBJECTDIR}/_ext/4fc72862/GraphInterface.o \ - ${OBJECTDIR}/_ext/4fc72862/Printer.o \ - ${OBJECTDIR}/_ext/4fc72862/Strategies.o \ - ${OBJECTDIR}/_ext/d965250f/Automorphism.o \ - ${OBJECTDIR}/_ext/d965250f/Graph.o \ - ${OBJECTDIR}/_ext/d965250f/GraphInterface.o \ - ${OBJECTDIR}/_ext/d965250f/Printer.o \ - ${OBJECTDIR}/_ext/7aa5371b/Composition.o \ - ${OBJECTDIR}/_ext/7aa5371b/GraphInterface.o \ - ${OBJECTDIR}/_ext/7aa5371b/Rule.o - - -# C Compiler Flags -CFLAGS= - -# CC Compiler Flags -CCFLAGS=-O3 -fno-strict-aliasing -fPIC -Wall -Wextra -Wno-unused-local-typedefs -Wno-comment -Wno-deprecated-declarations -CXXFLAGS=-O3 -fno-strict-aliasing -fPIC -Wall -Wextra -Wno-unused-local-typedefs -Wno-comment -Wno-deprecated-declarations - -# Fortran Compiler Flags -FFLAGS= - -# Assembler Flags -ASFLAGS= - -# Link Libraries and Options -LDLIBSOPTIONS=-L${HOME}/programs/lib -Wl,-rpath,'${HOME}/stuff/code/mod/NB_mod/dist/lib' -Wl,-rpath,'${HOME}/programs/lib' -Wl,-Bdynamic -Wl,-rpath,'../NB_mod/dist/lib' -L../NB_mod/dist/lib -lmod -lboost_python36 `pkg-config --libs python3` - -# Build Targets -.build-conf: ${BUILD_SUBPROJECTS} - "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk dist/lib/mod/mod_.so - -dist/lib/mod/mod_.so: ../NB_mod/dist/lib/libmod.so - -dist/lib/mod/mod_.so: ${OBJECTFILES} - ${MKDIR} -p dist/lib/mod - g++ -o dist/lib/mod/mod_.so ${OBJECTFILES} ${LDLIBSOPTIONS} -rdynamic -Wl,--no-undefined -shared -fPIC - -${OBJECTDIR}/_ext/f98eca90/Chem.o: ../src/mod/Py/Chem.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eca90 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eca90/Chem.o ../src/mod/Py/Chem.cpp - -${OBJECTDIR}/_ext/f98eca90/Collections.o: ../src/mod/Py/Collections.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eca90 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eca90/Collections.o ../src/mod/Py/Collections.cpp - -${OBJECTDIR}/_ext/f98eca90/Config.o: ../src/mod/Py/Config.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eca90 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eca90/Config.o ../src/mod/Py/Config.cpp - -${OBJECTDIR}/_ext/f98eca90/Derivation.o: ../src/mod/Py/Derivation.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eca90 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eca90/Derivation.o ../src/mod/Py/Derivation.cpp - -${OBJECTDIR}/_ext/f98eca90/Error.o: ../src/mod/Py/Error.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eca90 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eca90/Error.o ../src/mod/Py/Error.cpp - -${OBJECTDIR}/_ext/f98eca90/Function.o: ../src/mod/Py/Function.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eca90 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eca90/Function.o ../src/mod/Py/Function.cpp - -${OBJECTDIR}/_ext/f98eca90/Misc.o: ../src/mod/Py/Misc.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eca90 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eca90/Misc.o ../src/mod/Py/Misc.cpp - -${OBJECTDIR}/_ext/f98eca90/Module.o: ../src/mod/Py/Module.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eca90 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eca90/Module.o ../src/mod/Py/Module.cpp - -${OBJECTDIR}/_ext/f98eca90/Term.o: ../src/mod/Py/Term.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/f98eca90 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/f98eca90/Term.o ../src/mod/Py/Term.cpp - -${OBJECTDIR}/_ext/4fc72862/DG.o: ../src/mod/Py/dg/DG.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/4fc72862 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/4fc72862/DG.o ../src/mod/Py/dg/DG.cpp - -${OBJECTDIR}/_ext/4fc72862/GraphInterface.o: ../src/mod/Py/dg/GraphInterface.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/4fc72862 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/4fc72862/GraphInterface.o ../src/mod/Py/dg/GraphInterface.cpp - -${OBJECTDIR}/_ext/4fc72862/Printer.o: ../src/mod/Py/dg/Printer.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/4fc72862 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/4fc72862/Printer.o ../src/mod/Py/dg/Printer.cpp - -${OBJECTDIR}/_ext/4fc72862/Strategies.o: ../src/mod/Py/dg/Strategies.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/4fc72862 - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/4fc72862/Strategies.o ../src/mod/Py/dg/Strategies.cpp - -${OBJECTDIR}/_ext/d965250f/Automorphism.o: ../src/mod/Py/graph/Automorphism.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d965250f - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d965250f/Automorphism.o ../src/mod/Py/graph/Automorphism.cpp - -${OBJECTDIR}/_ext/d965250f/Graph.o: ../src/mod/Py/graph/Graph.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d965250f - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d965250f/Graph.o ../src/mod/Py/graph/Graph.cpp - -${OBJECTDIR}/_ext/d965250f/GraphInterface.o: ../src/mod/Py/graph/GraphInterface.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d965250f - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d965250f/GraphInterface.o ../src/mod/Py/graph/GraphInterface.cpp - -${OBJECTDIR}/_ext/d965250f/Printer.o: ../src/mod/Py/graph/Printer.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/d965250f - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/d965250f/Printer.o ../src/mod/Py/graph/Printer.cpp - -${OBJECTDIR}/_ext/7aa5371b/Composition.o: ../src/mod/Py/rule/Composition.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/7aa5371b - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7aa5371b/Composition.o ../src/mod/Py/rule/Composition.cpp - -${OBJECTDIR}/_ext/7aa5371b/GraphInterface.o: ../src/mod/Py/rule/GraphInterface.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/7aa5371b - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7aa5371b/GraphInterface.o ../src/mod/Py/rule/GraphInterface.cpp - -${OBJECTDIR}/_ext/7aa5371b/Rule.o: ../src/mod/Py/rule/Rule.cpp - ${MKDIR} -p ${OBJECTDIR}/_ext/7aa5371b - ${RM} "$@.d" - $(COMPILE.cc) -g -DBOOST_RESULT_OF_USE_DECLTYPE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -I${CND_BASEDIR}/../../perm_group/include -I${CND_BASEDIR}/../../graph_canon/include -I${HOME}/programs/include -I${CND_BASEDIR}/../NB_mod/srcExtra -I${CND_BASEDIR}/../src -I/usr/include/python3.3m -I/usr/include/python3.2mu -I/usr/include/openbabel-2.0 -I${HOME}/programs/include/openbabel-2.0 `pkg-config --cflags python3` -std=c++14 -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7aa5371b/Rule.o ../src/mod/Py/rule/Rule.cpp - -# Subprojects -.build-subprojects: - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r ${CND_BUILDDIR}/${CND_CONF} - ${RM} -r dist/lib/mod/libmod.so - ${RM} dist/lib/mod/mod_.so - -# Subprojects -.clean-subprojects: - -# Enable dependency checking -.dep.inc: .depcheck-impl - -include .dep.inc diff --git a/NB_pymod/nbproject/Makefile-impl.mk b/NB_pymod/nbproject/Makefile-impl.mk deleted file mode 100644 index de4344f..0000000 --- a/NB_pymod/nbproject/Makefile-impl.mk +++ /dev/null @@ -1,133 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a pre- and a post- target defined where you can add customization code. -# -# This makefile implements macros and targets common to all configurations. -# -# NOCDDL - - -# Building and Cleaning subprojects are done by default, but can be controlled with the SUB -# macro. If SUB=no, subprojects will not be built or cleaned. The following macro -# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf -# and .clean-reqprojects-conf unless SUB has the value 'no' -SUB_no=NO -SUBPROJECTS=${SUB_${SUB}} -BUILD_SUBPROJECTS_=.build-subprojects -BUILD_SUBPROJECTS_NO= -BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} -CLEAN_SUBPROJECTS_=.clean-subprojects -CLEAN_SUBPROJECTS_NO= -CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} - - -# Project Name -PROJECTNAME=NB_pymod - -# Active Configuration -DEFAULTCONF=Debug -CONF=${DEFAULTCONF} - -# All Configurations -ALLCONFS=Debug - - -# build -.build-impl: .build-pre .validate-impl .depcheck-impl - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf - - -# clean -.clean-impl: .clean-pre .validate-impl .depcheck-impl - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf - - -# clobber -.clobber-impl: .clobber-pre .depcheck-impl - @#echo "=> Running $@..." - for CONF in ${ALLCONFS}; \ - do \ - "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \ - done - -# all -.all-impl: .all-pre .depcheck-impl - @#echo "=> Running $@..." - for CONF in ${ALLCONFS}; \ - do \ - "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \ - done - -# build tests -.build-tests-impl: .build-impl .build-tests-pre - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf - -# run tests -.test-impl: .build-tests-impl .test-pre - @#echo "=> Running $@... Configuration=$(CONF)" - "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf - -# dependency checking support -.depcheck-impl: - @echo "# This code depends on make tool being used" >.dep.inc - @if [ -n "${MAKE_VERSION}" ]; then \ - echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES} \$${TESTOBJECTFILES}))" >>.dep.inc; \ - echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ - echo "include \$${DEPFILES}" >>.dep.inc; \ - echo "endif" >>.dep.inc; \ - else \ - echo ".KEEP_STATE:" >>.dep.inc; \ - echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ - fi - -# configuration validation -.validate-impl: - @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ - then \ - echo ""; \ - echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \ - echo "See 'make help' for details."; \ - echo "Current directory: " `pwd`; \ - echo ""; \ - fi - @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ - then \ - exit 1; \ - fi - - -# help -.help-impl: .help-pre - @echo "This makefile supports the following configurations:" - @echo " ${ALLCONFS}" - @echo "" - @echo "and the following targets:" - @echo " build (default target)" - @echo " clean" - @echo " clobber" - @echo " all" - @echo " help" - @echo "" - @echo "Makefile Usage:" - @echo " make [CONF=] [SUB=no] build" - @echo " make [CONF=] [SUB=no] clean" - @echo " make [SUB=no] clobber" - @echo " make [SUB=no] all" - @echo " make help" - @echo "" - @echo "Target 'build' will build a specific configuration and, unless 'SUB=no'," - @echo " also build subprojects." - @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no'," - @echo " also clean subprojects." - @echo "Target 'clobber' will remove all built files from all configurations and," - @echo " unless 'SUB=no', also from subprojects." - @echo "Target 'all' will will build all configurations and, unless 'SUB=no'," - @echo " also build subprojects." - @echo "Target 'help' prints this message." - @echo "" - diff --git a/NB_pymod/nbproject/Makefile-variables.mk b/NB_pymod/nbproject/Makefile-variables.mk deleted file mode 100644 index b62d844..0000000 --- a/NB_pymod/nbproject/Makefile-variables.mk +++ /dev/null @@ -1,27 +0,0 @@ -# -# Generated - do not edit! -# -# NOCDDL -# -CND_BASEDIR=`pwd` -CND_BUILDDIR=build -CND_DISTDIR=dist -# Debug configuration -CND_PLATFORM_Debug=GNU-Linux -CND_ARTIFACT_DIR_Debug=dist/lib/mod -CND_ARTIFACT_NAME_Debug=mod_.so -CND_ARTIFACT_PATH_Debug=dist/lib/mod/mod_.so -CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux/package -CND_PACKAGE_NAME_Debug=libNBpymod.so.tar -CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux/package/libNBpymod.so.tar -# -# include compiler specific variables -# -# dmake command -ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \ - (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk) -# -# gmake command -.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)) -# -include nbproject/private/Makefile-variables.mk diff --git a/NB_pymod/nbproject/Package-Debug.bash b/NB_pymod/nbproject/Package-Debug.bash deleted file mode 100644 index 061d18e..0000000 --- a/NB_pymod/nbproject/Package-Debug.bash +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_PLATFORM=GNU-Linux -CND_CONF=Debug -CND_DISTDIR=dist -CND_BUILDDIR=build -CND_DLIB_EXT=so -NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=dist/lib/mod/mod_.so -OUTPUT_BASENAME=mod_.so -PACKAGE_TOP_DIR=libNBpymod.so/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package -rm -rf ${NBTMPDIR} -mkdir -p ${NBTMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory "${NBTMPDIR}/libNBpymod.so/lib" -copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}lib/${OUTPUT_BASENAME}" 0644 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/libNBpymod.so.tar -cd ${NBTMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/libNBpymod.so.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${NBTMPDIR} diff --git a/NB_pymod/nbproject/configurations.xml b/NB_pymod/nbproject/configurations.xml deleted file mode 100644 index 00a623a..0000000 --- a/NB_pymod/nbproject/configurations.xml +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - ../src/mod/Py/dg/DG.cpp - ../src/mod/Py/dg/GraphInterface.cpp - ../src/mod/Py/dg/Printer.cpp - ../src/mod/Py/dg/Strategies.cpp - - - ../src/mod/Py/graph/Automorphism.cpp - ../src/mod/Py/graph/Graph.cpp - ../src/mod/Py/graph/GraphInterface.cpp - ../src/mod/Py/graph/Printer.cpp - - - ../src/mod/Py/rule/Composition.cpp - ../src/mod/Py/rule/GraphInterface.cpp - ../src/mod/Py/rule/Rule.cpp - - ../src/mod/Py/Chem.cpp - ../src/mod/Py/Collections.cpp - ../src/mod/Py/Common.h - ../src/mod/Py/Config.cpp - ../src/mod/Py/Derivation.cpp - ../src/mod/Py/Error.cpp - ../src/mod/Py/Function.cpp - ../src/mod/Py/Function.h - ../src/mod/Py/Misc.cpp - ../src/mod/Py/Module.cpp - ../src/mod/Py/Term.cpp - - - - - - Makefile - - - - ../src/mod/Py - - Makefile - - - - default - true - false - - - - 11 - time g++ - - ${CND_BASEDIR}/../../perm_group/include - ${CND_BASEDIR}/../../graph_canon/include - ${HOME}/programs/include - ${CND_BASEDIR}/../NB_mod/srcExtra - ${CND_BASEDIR}/../src - /usr/include/python3.3m - /usr/include/python3.2mu - /usr/include/openbabel-2.0 - ${HOME}/programs/include/openbabel-2.0 - - -O3 -fno-strict-aliasing -fPIC -Wall -Wextra -Wno-unused-local-typedefs -Wno-comment -Wno-deprecated-declarations - - BOOST_RESULT_OF_USE_DECLTYPE - BOOST_SPIRIT_USE_PHOENIX_V3=1 - - - - dist/lib/mod/mod_.so - - ${HOME}/programs/lib - - - ${HOME}/stuff/code/mod/NB_mod/dist/lib - ${HOME}/programs/lib - - g++ - - -Wl,-Bdynamic - - - - - boost_python36 - `pkg-config --libs python3` - - -rdynamic -Wl,--no-undefined - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/NB_pymod/nbproject/project.xml b/NB_pymod/nbproject/project.xml deleted file mode 100644 index 2944b31..0000000 --- a/NB_pymod/nbproject/project.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - org.netbeans.modules.cnd.makeproject - - - pymod - - cpp - h - UTF-8 - - ../NB_mod - - - ../src/mod/Py - - - - Debug - 2 - - - - true - Default|NetBeans - Default|NetBeans - Default|NetBeans - - - - diff --git a/NEWS b/NEWS deleted file mode 100644 index e69de29..0000000 diff --git a/README.rst b/README.rst index 65ae43e..e2a4916 100644 --- a/README.rst +++ b/README.rst @@ -5,16 +5,6 @@ MedØlDatschgerl (MØD) This is a software package developed for graph-based cheminformatics. For more information, see http://mod.imada.sdu.dk. - -Documentation -############# - -The documentation, including installation instructions, can be found at https://jakobandersen.github.io/mod. - - -Installation -############ - -If you have cloned the repository first install Autoconf and run ``./repo-bootstrap.sh``. -The package uses Autotool, so use ``./configure``, ``make``, and ``make install`` to compile and install it. -See https://jakobandersen.github.io/mod/installation.html for details on the package dependencies. +The documentation can be found at `here `__. +See either `here `__ +for installation instructions, or in the file ``doc/source/installation.rst``. diff --git a/bootstrap.sh b/bootstrap.sh index e59f4df..04827cc 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -7,132 +7,68 @@ function indentAndSlash { sed "\$s/\\\\//" } -function doSrc { - cat <<-EOF - CLEANFILES = - EXTRA_DIST = - pkgconfigdir = \$(libdir)/pkgconfig - pkgconfig_DATA = lib/pkgconfig/mod.pc - - bin_PROGRAMS = - dist_bin_SCRIPTS = \\ - bin/mod - pkgdata_DATA = - - dist_pkgdata_DATA = \\ - share/mod/obabel.supp \\ - share/mod/python.supp - pluginsdir = \$(pkgdatadir)/plugins - plugins_DATA = share/mod/plugins/00_mod - EXTRA_DIST += share/mod/plugins/00_mod.in - - # http://www.gnu.org/software/automake/manual/html_node/Scripts.html#Scripts - share/mod/plugins/00_mod: \$(srcdir)/share/mod/plugins/00_mod.in -EOF - echo ' mkdir -p share/mod/plugins' - echo ' $(SED) \' - echo " -e 's|[@]libdir@|\$(libdir)|g' \\" -# echo " -e 's|[@]exec_prefix@|\$(exec_prefix)|g' \\" - echo ' < "$<" > "$@"' - -cat <<-EOF - if ENABLE_POSTMOD - dist_bin_SCRIPTS += \\ - bin/mod_post \\ - bin/mod_genSummaryMakefile - dist_pkgdata_DATA += \\ - share/mod/commonPreamble.tex \\ - share/mod/figureTemplate.tex \\ - share/mod/summary.tex \\ - share/mod/mod.sty \\ - share/mod/mod.mk - pkgdata_DATA += \\ - share/mod/commonPreamble.fmt - CLEANFILES += share/mod/commonPreamble.fmt - - share/mod/commonPreamble.fmt: \$(srcdir)/share/mod/commonPreamble.tex - EOF - echo " mkdir -p \$(builddir)/share/mod" - echo " cd \$(builddir)/share/mod && pdflatex \\" - echo " -interaction=nonstopmode -halt-on-error \\" - echo " -ini \"&pdflatex \input{\$(abs_srcdir)/share/mod/commonPreamble.tex}\usepackage{\$(abs_srcdir)/share/mod/mod}\dump\"" - echo "endif" - - - cat <<-EOF - lib_LTLIBRARIES = libmod.la - - libmod_la_CPPFLAGS = \$(AM_CPPFLAGS) - libmod_la_CXXFLAGS = \$(AM_CXXFLAGS) - libmod_la_LDFLAGS = \$(AM_LDFLAGS) -no-undefined -pthread -release \$(PACKAGE_VERSION) - libmod_la_LIBADD = \$(AM_LDLIBS) -lboost_regex -lboost_system - - if HAVE_OPENBABEL - libmod_la_LIBADD += -lopenbabel - endif - libmod_la_LIBADD += -lpthread - - nobase_nodist_include_HEADERS = \\ - mod/BuildConfig.h - nobase_include_HEADERS = \\ - EOF - ( - find . -name "*.h" | grep mod/ | grep -v mod/Py/ - find . -name "*.hpp" | grep mod/ | grep -v mod/Py/ - find . -name "*.hpp" | grep jla_boost/ - find . -name "*.hpp" | grep gml/ - ) | indentAndSlash - echo "libmod_la_SOURCES = \\" - ( - find . -name "*.cpp" | grep mod/ | grep -v mod/Py/ - find . -name "*.cpp" | grep jla_boost/ - find . -name "*.cpp" | grep gml/ - ) | indentAndSlash +function indent { + cat | sort | sed 's/^/ "/' | sed 's/$/"/' +} - cat <<-EOF - # PyMOD - if ENABLE_PYMOD - pkglib_LTLIBRARIES = mod_.la - mod__la_CPPFLAGS = \$(AM_CPPFLAGS) - mod__la_CXXFLAGS = \$(AM_CXXFLAGS) - mod__la_LDFLAGS = \$(AM_LDFLAGS) -module -release \$(PACKAGE_VERSION) - mod__la_LIBADD = \$(AM_LDLIBS) - mod__la_LIBADD += libmod.la - mod__la_LIBADD += -l\$(BOOST_PYTHON_LIB_NAME) - mod__la_LIBADD += \$(PYTHON_LDLIBS) - - nobase_include_HEADERS += \\ - EOF - find . -name "*.h" | grep mod/Py/ | indentAndSlash - echo "mod__la_SOURCES = \\" - find . -name "*.cpp" | grep mod/Py/ | indentAndSlash +function indentAndDir { + if test "x$1" = "x"; then + p="" + else + p="$1/" + fi + cat | sort | sed "s!^! \"\${CMAKE_CURRENT_LIST_DIR}/$p!" | sed 's/$/"/' +} - echo "haxdir = \$(pkglibdir)" # because automake doesn't like data in lib - echo "dist_hax_DATA = \\" - find lib/mod -name "*.py" | indentAndSlash +# name incDirIfNot"include" +function doDir { + cd libs/$1 + inc=${2:-include} + echo "set(mod_$1_INCLUDE_FILES" + find $inc -iname "*.hpp" | indentAndDir libs/$1 + echo ")" + echo "" + echo "set(mod_$1_SRC_FILES" + find src -iname "*.cpp" | indentAndDir libs/$1 + echo ")" echo "" - echo "endif" + if test -d test; then + echo "set(mod_$1_TEST_FILES" + find test -iname "*.cpp" | sed "s/^test\/\(.*\)\.cpp$/\1/" | indent + echo ")" + echo "" + fi + cd ../.. } -function doDoc { - echo "EXTRA_DIST = \\" - function extraDist { - echo "./makeDocs.sh" - find "./source/" -type f - } - extraDist | indentAndSlash +function gen_file_lists { + echo "# Auto-generated by bootstrap.sh" + doDir gml + doDir jla_boost + doDir libmod src + doDir pymod src + echo "set(mod_pymod_PY_FILES" + find libs/pymod/lib -iname "*.py" | indentAndDir + echo ")" + echo "set(mod_TEST_PY_FILES" + find test/py -iname "*.py" | sed -e "s!^test/!!" -e 's!\.py$!!' | indent + echo ")" + echo "" } echo "VERSION" -git describe --tags --always > VERSION -cd src -rm -f Makefile.am -echo "src/Makefile.am" -doSrc >> Makefile.am -cd .. -cd doc -rm -rf Makefile.am -echo "doc/Makefile.am" -doDoc >> Makefile.am -cd .. -autoreconf -fi +# public versions are tagged with 'vA.B.0' and private with 'priv-A.B.0' +# these are converted into A.B.0 and A.B.1, with the commit offset as 4th component +v=$(git describe --tags --always | sed -e "s/^v//" -e 's/priv-\([0-9]*\.[0-9]*\)\.0/\1.1/' -e "s/-g.*$//" -e "s/-/./") +echo $v > VERSION +cat VERSION +echo "CMakeFiles.txt" +gen_file_lists > CMakeFiles.txt +echo "Docs" +doc/makeDocs.sh . + +echo "Recursing in external/graph_canon" +echo "---------------------------------" +cd external/graph_canon +./bootstrap.sh + diff --git a/cmake/Coverage.cmake b/cmake/Coverage.cmake new file mode 100644 index 0000000..c6e819d --- /dev/null +++ b/cmake/Coverage.cmake @@ -0,0 +1,117 @@ +# Module for enabling code coverage with gcov and recording information per test case. +# Based on: +# - https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake +# - https://swarminglogic.com/jotting/2014_05_lcov +# +# There are separate concerns: +# +# - Which libraries and executables should spit out coverage information. +# - Which commands/tests should generate coverage info as separate cases. +# +# Usage: +# +# 0. Perhaps redefine the default value of the "BUILD_COVERAGE" option. +# It defaults to OFF, which means the module reduces to "do nothing". +# 1. include(Coverage) +# 2. for each target (libraries and (test) executables), use +# target_add_coverage(targetName) +# to add compile and link flags for generating information from them. +# 3. for each target that implements a test case which should generate separate +# coverage information, use +# add_coverage_case(targetName) +# This adds a new target "targetName_cov" (the suffix can be configred with COVERAGE_TARGET_SUFFIX) +# which will reset coverage info, run the test case, and save recorded coverage data. +# The new target is added as a test with the label "coverage" (configurable through COVERAGE_TARGET_LABEL). +# In ctest, use --print-labels, -L , and -LE to view and filter by label. +# The target also has RUN_SERIAL as property. +# Note: if you don't want per-test-case coverage, simply use this on a target that depends on all tests. +option(BUILD_COVERAGE "Enable code coverage." OFF) + +if(NOT BUILD_COVERAGE) + # define our functions as doing nothing + function(target_add_coverage target) + endfunction() + function(add_coverage_case target) + endfunction() + return() +endif() + +find_program(GCOV_PATH gcov) +find_program(LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl) +find_program(GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat) +message(STATUS "Coverage:") +if(GCOV_PATH) + message(STATUS " gcov found as: ${GCOV_PATH}") +else() + message(FATAL_ERROR " gcov not found.") +endif() +if(LCOV_PATH) + message(STATUS " lcov found as: ${LCOV_PATH}") +else() + message(FATAL_ERROR " lcov not found.") +endif() +if(GENHTML_PATH) + message(STATUS " genhtml found as: ${GENHTML_PATH}") +else() + message(FATAL_ERROR " genhtml not found.") +endif() + +if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") + if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3) + message(FATAL_ERROR " Clang version must be 3.0.0 or greater.") + endif() +elseif(NOT CMAKE_COMPILER_IS_GNUCXX) + message(FATAL_ERROR " Compiler must be Clang >= 3 nor GNU GCC.") +endif() + +set(COVERAGE_COMPILE_FLAGS + -g -O0 --coverage + CACHE STRING "Flags used by the C/C++ compiler during coverage builds." + FORCE) +set(COVERAGE_LINK_FLAGS + --coverage + CACHE STRING "Flags used for linking during coverage builds." + FORCE) +set(COVERAGE_TARGET_SUFFIX + _cov + CACHE STRING "Label added to test case targets for filtering in ctest." + FORCE) +set(COVERAGE_TARGET_LABEL + coverage + CACHE STRING "Suffix added to test case targets for recording the coverage information." + FORCE) +mark_as_advanced( + COVERAGE_COMPILE_FLAGS + COVERAGE_LINK_FLAGS + COVERAGE_TARGET_SUFFIX + COVERAGE_TARGET_LABEL) + +set(COVERAGE_BUILD ${CMAKE_CURRENT_LIST_DIR}/CoverageBuild.sh) + +# The target to run all coverage test cases. +add_custom_target(coverage_collect) +# The target to build the coverage report. This does explicitly not depend on coverage_collect +# in order to allow partial results. +add_custom_target(coverage_build + COMMAND SRC=${CMAKE_SOURCE_DIR} LCOV=${LCOV_PATH} GENHTML=${GENHTML_PATH} PROJECT_NAME=${PROJECT_NAME} PROJECT_VERSION=${PROJECT_VERSION} ${COVERAGE_BUILD} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + +# Shorthand for adding compile and link flags to a target. +function(target_add_coverage target) + target_compile_options(${target} PRIVATE ${COVERAGE_COMPILE_FLAGS}) + target_link_libraries(${target} PRIVATE ${COVERAGE_LINK_FLAGS}) +endfunction() + +# Set up a target for coverage recording. +function(add_coverage_case target) + set(covTarget "${target}${COVERAGE_TARGET_SUFFIX}") + add_custom_target(${covTarget} + #DEPENDS ${target} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/cov + COMMAND ${LCOV_PATH} -z -d ${CMAKE_BINARY_DIR} + COMMAND ${CMAKE_CTEST_COMMAND} -R "^${target}\$" + COMMAND ${LCOV_PATH} -c -d ${CMAKE_BINARY_DIR} -t ${target} -o ${CMAKE_BINARY_DIR}/cov/${target}.all.cov + ) + add_dependencies(coverage_collect ${covTarget}) +endfunction() \ No newline at end of file diff --git a/cmake/CoverageBuild.sh b/cmake/CoverageBuild.sh new file mode 100755 index 0000000..ab25bc1 --- /dev/null +++ b/cmake/CoverageBuild.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# This should be executed in the build dir with the path to lcov as first arg. +for v in SRC LCOV GENHTML PROJECT_NAME PROJECT_VERSION; do + if [ "x${!v}" = "x" ]; then + echo "Missing $v variable." + exit 1 + fi +done +mkdir -p cov +cd cov +$LCOV -c -i -d ../ -o base.cov +$LCOV -e base.cov "$SRC/*" -o base.filt.cov +cp base.filt.cov merged.filt.cov +find . -iname "*.all.cov" | while read f; do + name=${f%.all.cov} + $LCOV -e $f "$SRC/*" -o $name.filt.cov + # overall merged + $LCOV -a merged.filt.cov -a $name.filt.cov -o merged2.cov + mv merged2.cov merged.filt.cov + # just this one + $LCOV -a base.filt.cov -a $name.filt.cov -o merged2.cov + mv merge2.cov $name.filt.cov + mkdir -p ${name}_html + $GENHTML --show-details --title "$PROJECT_NAME $PROJECT_VERSION, $name" \ + -o ${name}_html $name.filt.cov +done +mkdir -p html +$GENHTML --show-details --title "$PROJECT_NAME $PROJECT_VERSION" -o html merged.filt.cov diff --git a/cmake/FindBoost.cmake b/cmake/FindBoost.cmake new file mode 100644 index 0000000..ce307fa --- /dev/null +++ b/cmake/FindBoost.cmake @@ -0,0 +1,2164 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindBoost +--------- + +Find Boost include dirs and libraries + +Use this module by invoking find_package with the form:: + + find_package(Boost + [version] [EXACT] # Minimum or EXACT version e.g. 1.67.0 + [REQUIRED] # Fail with error if Boost is not found + [COMPONENTS ...] # Boost libraries by their canonical name + # e.g. "date_time" for "libboost_date_time" + [OPTIONAL_COMPONENTS ...] + # Optional Boost libraries by their canonical name) + ) # e.g. "date_time" for "libboost_date_time" + +This module finds headers and requested component libraries OR a CMake +package configuration file provided by a "Boost CMake" build. For the +latter case skip to the "Boost CMake" section below. For the former +case results are reported in variables:: + + Boost_FOUND - True if headers and requested libraries were found + Boost_INCLUDE_DIRS - Boost include directories + Boost_LIBRARY_DIRS - Link directories for Boost libraries + Boost_LIBRARIES - Boost component libraries to be linked + Boost__FOUND - True if component was found ( is upper-case) + Boost__LIBRARY - Libraries to link for component (may include + target_link_libraries debug/optimized keywords) + Boost_VERSION - BOOST_VERSION value from boost/version.hpp + Boost_LIB_VERSION - Version string appended to library filenames + Boost_MAJOR_VERSION - Boost major version number (X in X.y.z) + Boost_MINOR_VERSION - Boost minor version number (Y in x.Y.z) + Boost_SUBMINOR_VERSION - Boost subminor version number (Z in x.y.Z) + Boost_VERSION_STRING - Boost version number in x.y.z format + Boost_LIB_DIAGNOSTIC_DEFINITIONS (Windows) + - Pass to add_definitions() to have diagnostic + information about Boost's automatic linking + displayed during compilation + +Note that Boost Python components require a Python version suffix +(Boost 1.67 and later), e.g. ``python36`` or ``python27`` for the +versions built against Python 3.6 and 2.7, respectively. This also +applies to additional components using Python including +``mpi_python`` and ``numpy``. Earlier Boost releases may use +distribution-specific suffixes such as ``2``, ``3`` or ``2.7``. +These may also be used as suffixes, but note that they are not +portable. + +This module reads hints about search locations from variables:: + + BOOST_ROOT - Preferred installation prefix + (or BOOSTROOT) + BOOST_INCLUDEDIR - Preferred include directory e.g. /include + BOOST_LIBRARYDIR - Preferred library directory e.g. /lib + Boost_NO_SYSTEM_PATHS - Set to ON to disable searching in locations not + specified by these hint variables. Default is OFF. + Boost_ADDITIONAL_VERSIONS + - List of Boost versions not known to this module + (Boost install locations may contain the version) + +and saves search results persistently in CMake cache entries:: + + Boost_INCLUDE_DIR - Directory containing Boost headers + Boost_LIBRARY_DIR_RELEASE - Directory containing release Boost libraries + Boost_LIBRARY_DIR_DEBUG - Directory containing debug Boost libraries + Boost__LIBRARY_DEBUG - Component library debug variant + Boost__LIBRARY_RELEASE - Component library release variant + +The following :prop_tgt:`IMPORTED` targets are also defined:: + + Boost::boost - Target for header-only dependencies + (Boost include directory) + Boost:: - Target for specific component dependency + (shared or static library); is lower- + case + Boost::diagnostic_definitions - interface target to enable diagnostic + information about Boost's automatic linking + during compilation (adds BOOST_LIB_DIAGNOSTIC) + Boost::disable_autolinking - interface target to disable automatic + linking with MSVC (adds BOOST_ALL_NO_LIB) + Boost::dynamic_linking - interface target to enable dynamic linking + linking with MSVC (adds BOOST_ALL_DYN_LINK) + +Implicit dependencies such as Boost::filesystem requiring +Boost::system will be automatically detected and satisfied, even +if system is not specified when using find_package and if +Boost::system is not added to target_link_libraries. If using +Boost::thread, then Threads::Threads will also be added automatically. + +It is important to note that the imported targets behave differently +than variables created by this module: multiple calls to +find_package(Boost) in the same directory or sub-directories with +different options (e.g. static or shared) will not override the +values of the targets created by the first call. + +Users may set these hints or results as cache entries. Projects +should not read these entries directly but instead use the above +result variables. Note that some hint names start in upper-case +"BOOST". One may specify these as environment variables if they are +not specified as CMake variables or cache entries. + +This module first searches for the Boost header files using the above +hint variables (excluding BOOST_LIBRARYDIR) and saves the result in +Boost_INCLUDE_DIR. Then it searches for requested component libraries +using the above hints (excluding BOOST_INCLUDEDIR and +Boost_ADDITIONAL_VERSIONS), "lib" directories near Boost_INCLUDE_DIR, +and the library name configuration settings below. It saves the +library directories in Boost_LIBRARY_DIR_DEBUG and +Boost_LIBRARY_DIR_RELEASE and individual library +locations in Boost__LIBRARY_DEBUG and Boost__LIBRARY_RELEASE. +When one changes settings used by previous searches in the same build +tree (excluding environment variables) this module discards previous +search results affected by the changes and searches again. + +Boost libraries come in many variants encoded in their file name. +Users or projects may tell this module which variant to find by +setting variables:: + + Boost_USE_DEBUG_LIBS - Set to ON or OFF to specify whether to search + and use the debug libraries. Default is ON. + Boost_USE_RELEASE_LIBS - Set to ON or OFF to specify whether to search + and use the release libraries. Default is ON. + Boost_USE_MULTITHREADED - Set to OFF to use the non-multithreaded + libraries ('mt' tag). Default is ON. + Boost_USE_STATIC_LIBS - Set to ON to force the use of the static + libraries. Default is OFF. + Boost_USE_STATIC_RUNTIME - Set to ON or OFF to specify whether to use + libraries linked statically to the C++ runtime + ('s' tag). Default is platform dependent. + Boost_USE_DEBUG_RUNTIME - Set to ON or OFF to specify whether to use + libraries linked to the MS debug C++ runtime + ('g' tag). Default is ON. + Boost_USE_DEBUG_PYTHON - Set to ON to use libraries compiled with a + debug Python build ('y' tag). Default is OFF. + Boost_USE_STLPORT - Set to ON to use libraries compiled with + STLPort ('p' tag). Default is OFF. + Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS + - Set to ON to use libraries compiled with + STLPort deprecated "native iostreams" + ('n' tag). Default is OFF. + Boost_COMPILER - Set to the compiler-specific library suffix + (e.g. "-gcc43"). Default is auto-computed + for the C++ compiler in use. A list may be + used if multiple compatible suffixes should + be tested for, in decreasing order of + preference. + Boost_ARCHITECTURE - Set to the architecture-specific library suffix + (e.g. "-x64"). Default is auto-computed for the + C++ compiler in use. + Boost_THREADAPI - Suffix for "thread" component library name, + such as "pthread" or "win32". Names with + and without this suffix will both be tried. + Boost_NAMESPACE - Alternate namespace used to build boost with + e.g. if set to "myboost", will search for + myboost_thread instead of boost_thread. + +Other variables one may set to control this module are:: + + Boost_DEBUG - Set to ON to enable debug output from FindBoost. + Please enable this before filing any bug report. + Boost_DETAILED_FAILURE_MSG + - Set to ON to add detailed information to the + failure message even when the REQUIRED option + is not given to the find_package call. + Boost_REALPATH - Set to ON to resolve symlinks for discovered + libraries to assist with packaging. For example, + the "system" component library may be resolved to + "/usr/lib/libboost_system.so.1.67.0" instead of + "/usr/lib/libboost_system.so". This does not + affect linking and should not be enabled unless + the user needs this information. + Boost_LIBRARY_DIR - Default value for Boost_LIBRARY_DIR_RELEASE and + Boost_LIBRARY_DIR_DEBUG. + +On Visual Studio and Borland compilers Boost headers request automatic +linking to corresponding libraries. This requires matching libraries +to be linked explicitly or available in the link library search path. +In this case setting Boost_USE_STATIC_LIBS to OFF may not achieve +dynamic linking. Boost automatic linking typically requests static +libraries with a few exceptions (such as Boost.Python). Use:: + + add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS}) + +to ask Boost to report information about automatic linking requests. + +Example to find Boost headers only:: + + find_package(Boost 1.36.0) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + add_executable(foo foo.cc) + endif() + +Example to find Boost libraries and use imported targets:: + + find_package(Boost 1.56 REQUIRED COMPONENTS + date_time filesystem iostreams) + add_executable(foo foo.cc) + target_link_libraries(foo Boost::date_time Boost::filesystem + Boost::iostreams) + +Example to find Boost Python 3.6 libraries and use imported targets:: + + find_package(Boost 1.67 REQUIRED COMPONENTS + python36 numpy36) + add_executable(foo foo.cc) + target_link_libraries(foo Boost::python36 Boost::numpy36) + +Example to find Boost headers and some *static* (release only) libraries:: + + set(Boost_USE_STATIC_LIBS ON) # only find static libs + set(Boost_USE_DEBUG_LIBS OFF) # ignore debug libs and + set(Boost_USE_RELEASE_LIBS ON) # only find release libs + set(Boost_USE_MULTITHREADED ON) + set(Boost_USE_STATIC_RUNTIME OFF) + find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + add_executable(foo foo.cc) + target_link_libraries(foo ${Boost_LIBRARIES}) + endif() + +Boost CMake +^^^^^^^^^^^ + +If Boost was built using the boost-cmake project it provides a package +configuration file for use with find_package's Config mode. This +module looks for the package configuration file called +BoostConfig.cmake or boost-config.cmake and stores the result in cache +entry "Boost_DIR". If found, the package configuration file is loaded +and this module returns with no further action. See documentation of +the Boost CMake package configuration for details on what it provides. + +Set Boost_NO_BOOST_CMAKE to ON to disable the search for boost-cmake. +#]=======================================================================] + +# Save project's policies +cmake_policy(PUSH) +cmake_policy(SET CMP0057 NEW) # if IN_LIST + +#------------------------------------------------------------------------------- +# Before we go searching, check whether boost-cmake is available, unless the +# user specifically asked NOT to search for boost-cmake. +# +# If Boost_DIR is set, this behaves as any find_package call would. If not, +# it looks at BOOST_ROOT and BOOSTROOT to find Boost. +# +if (NOT Boost_NO_BOOST_CMAKE) + # If Boost_DIR is not set, look for BOOSTROOT and BOOST_ROOT as alternatives, + # since these are more conventional for Boost. + if ("$ENV{Boost_DIR}" STREQUAL "") + if (NOT "$ENV{BOOST_ROOT}" STREQUAL "") + set(ENV{Boost_DIR} $ENV{BOOST_ROOT}) + elseif (NOT "$ENV{BOOSTROOT}" STREQUAL "") + set(ENV{Boost_DIR} $ENV{BOOSTROOT}) + endif() + endif() + + # Do the same find_package call but look specifically for the CMake version. + # Note that args are passed in the Boost_FIND_xxxxx variables, so there is no + # need to delegate them to this find_package call. + find_package(Boost QUIET NO_MODULE) + mark_as_advanced(Boost_DIR) + + # If we found boost-cmake, then we're done. Print out what we found. + # Otherwise let the rest of the module try to find it. + if (Boost_FOUND) + message(STATUS "Boost ${Boost_FIND_VERSION} found.") + if (Boost_FIND_COMPONENTS) + message(STATUS "Found Boost components:\n ${Boost_FIND_COMPONENTS}") + endif() + # Restore project's policies + cmake_policy(POP) + return() + endif() +endif() + + +#------------------------------------------------------------------------------- +# FindBoost functions & macros +# + +############################################ +# +# Check the existence of the libraries. +# +############################################ +# This macro was taken directly from the FindQt4.cmake file that is included +# with the CMake distribution. This is NOT my work. All work was done by the +# original authors of the FindQt4.cmake file. Only minor modifications were +# made to remove references to Qt and make this file more generally applicable +# And ELSE/ENDIF pairs were removed for readability. +######################################################################### + +macro(_Boost_ADJUST_LIB_VARS basename) + if(Boost_INCLUDE_DIR ) + if(Boost_${basename}_LIBRARY_DEBUG AND Boost_${basename}_LIBRARY_RELEASE) + # if the generator is multi-config or if CMAKE_BUILD_TYPE is set for + # single-config generators, set optimized and debug libraries + get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(_isMultiConfig OR CMAKE_BUILD_TYPE) + set(Boost_${basename}_LIBRARY optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG}) + else() + # For single-config generators where CMAKE_BUILD_TYPE has no value, + # just use the release libraries + set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE} ) + endif() + # FIXME: This probably should be set for both cases + set(Boost_${basename}_LIBRARIES optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG}) + endif() + + # if only the release version was found, set the debug variable also to the release version + if(Boost_${basename}_LIBRARY_RELEASE AND NOT Boost_${basename}_LIBRARY_DEBUG) + set(Boost_${basename}_LIBRARY_DEBUG ${Boost_${basename}_LIBRARY_RELEASE}) + set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE}) + set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_RELEASE}) + endif() + + # if only the debug version was found, set the release variable also to the debug version + if(Boost_${basename}_LIBRARY_DEBUG AND NOT Boost_${basename}_LIBRARY_RELEASE) + set(Boost_${basename}_LIBRARY_RELEASE ${Boost_${basename}_LIBRARY_DEBUG}) + set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_DEBUG}) + set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_DEBUG}) + endif() + + # If the debug & release library ends up being the same, omit the keywords + if("${Boost_${basename}_LIBRARY_RELEASE}" STREQUAL "${Boost_${basename}_LIBRARY_DEBUG}") + set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE} ) + set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_RELEASE} ) + endif() + + if(Boost_${basename}_LIBRARY AND Boost_${basename}_HEADER) + set(Boost_${basename}_FOUND ON) + if("x${basename}" STREQUAL "xTHREAD" AND NOT TARGET Threads::Threads) + string(APPEND Boost_ERROR_REASON_THREAD " (missing dependency: Threads)") + set(Boost_THREAD_FOUND OFF) + endif() + endif() + + endif() + # Make variables changeable to the advanced user + mark_as_advanced( + Boost_${basename}_LIBRARY_RELEASE + Boost_${basename}_LIBRARY_DEBUG + ) +endmacro() + +# Detect changes in used variables. +# Compares the current variable value with the last one. +# In short form: +# v != v_LAST -> CHANGED = 1 +# v is defined, v_LAST not -> CHANGED = 1 +# v is not defined, but v_LAST is -> CHANGED = 1 +# otherwise -> CHANGED = 0 +# CHANGED is returned in variable named ${changed_var} +macro(_Boost_CHANGE_DETECT changed_var) + set(${changed_var} 0) + foreach(v ${ARGN}) + if(DEFINED _Boost_COMPONENTS_SEARCHED) + if(${v}) + if(_${v}_LAST) + string(COMPARE NOTEQUAL "${${v}}" "${_${v}_LAST}" _${v}_CHANGED) + else() + set(_${v}_CHANGED 1) + endif() + elseif(_${v}_LAST) + set(_${v}_CHANGED 1) + endif() + if(_${v}_CHANGED) + set(${changed_var} 1) + endif() + else() + set(_${v}_CHANGED 0) + endif() + endforeach() +endmacro() + +# +# Find the given library (var). +# Use 'build_type' to support different lib paths for RELEASE or DEBUG builds +# +macro(_Boost_FIND_LIBRARY var build_type) + + find_library(${var} ${ARGN}) + + if(${var}) + # If this is the first library found then save Boost_LIBRARY_DIR_[RELEASE,DEBUG]. + if(NOT Boost_LIBRARY_DIR_${build_type}) + get_filename_component(_dir "${${var}}" PATH) + set(Boost_LIBRARY_DIR_${build_type} "${_dir}" CACHE PATH "Boost library directory ${build_type}" FORCE) + endif() + elseif(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT) + # Try component-specific hints but do not save Boost_LIBRARY_DIR_[RELEASE,DEBUG]. + find_library(${var} HINTS ${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT} ${ARGN}) + endif() + + # If Boost_LIBRARY_DIR_[RELEASE,DEBUG] is known then search only there. + if(Boost_LIBRARY_DIR_${build_type}) + set(_boost_LIBRARY_SEARCH_DIRS_${build_type} ${Boost_LIBRARY_DIR_${build_type}} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " Boost_LIBRARY_DIR_${build_type} = ${Boost_LIBRARY_DIR_${build_type}}" + " _boost_LIBRARY_SEARCH_DIRS_${build_type} = ${_boost_LIBRARY_SEARCH_DIRS_${build_type}}") + endif() + endif() +endmacro() + +#------------------------------------------------------------------------------- + +# Convert CMAKE_CXX_COMPILER_VERSION to boost compiler suffix version. +function(_Boost_COMPILER_DUMPVERSION _OUTPUT_VERSION _OUTPUT_VERSION_MAJOR _OUTPUT_VERSION_MINOR) + string(REGEX REPLACE "([0-9]+)\\.([0-9]+)(\\.[0-9]+)?" "\\1" + _boost_COMPILER_VERSION_MAJOR "${CMAKE_CXX_COMPILER_VERSION}") + string(REGEX REPLACE "([0-9]+)\\.([0-9]+)(\\.[0-9]+)?" "\\2" + _boost_COMPILER_VERSION_MINOR "${CMAKE_CXX_COMPILER_VERSION}") + + set(_boost_COMPILER_VERSION "${_boost_COMPILER_VERSION_MAJOR}${_boost_COMPILER_VERSION_MINOR}") + + set(${_OUTPUT_VERSION} ${_boost_COMPILER_VERSION} PARENT_SCOPE) + set(${_OUTPUT_VERSION_MAJOR} ${_boost_COMPILER_VERSION_MAJOR} PARENT_SCOPE) + set(${_OUTPUT_VERSION_MINOR} ${_boost_COMPILER_VERSION_MINOR} PARENT_SCOPE) +endfunction() + +# +# Take a list of libraries with "thread" in it +# and prepend duplicates with "thread_${Boost_THREADAPI}" +# at the front of the list +# +function(_Boost_PREPEND_LIST_WITH_THREADAPI _output) + set(_orig_libnames ${ARGN}) + string(REPLACE "thread" "thread_${Boost_THREADAPI}" _threadapi_libnames "${_orig_libnames}") + set(${_output} ${_threadapi_libnames} ${_orig_libnames} PARENT_SCOPE) +endfunction() + +# +# If a library is found, replace its cache entry with its REALPATH +# +function(_Boost_SWAP_WITH_REALPATH _library _docstring) + if(${_library}) + get_filename_component(_boost_filepathreal ${${_library}} REALPATH) + unset(${_library} CACHE) + set(${_library} ${_boost_filepathreal} CACHE FILEPATH "${_docstring}") + endif() +endfunction() + +function(_Boost_CHECK_SPELLING _var) + if(${_var}) + string(TOUPPER ${_var} _var_UC) + message(FATAL_ERROR "ERROR: ${_var} is not the correct spelling. The proper spelling is ${_var_UC}.") + endif() +endfunction() + +# Guesses Boost's compiler prefix used in built library names +# Returns the guess by setting the variable pointed to by _ret +function(_Boost_GUESS_COMPILER_PREFIX _ret) + if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xIntel") + if(WIN32) + set (_boost_COMPILER "-iw") + else() + set (_boost_COMPILER "-il") + endif() + elseif (GHSMULTI) + set(_boost_COMPILER "-ghs") + elseif("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") + if(MSVC_TOOLSET_VERSION GREATER_EQUAL 141) + set(_boost_COMPILER "-vc141;-vc140") + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 80) + set(_boost_COMPILER "-vc${MSVC_TOOLSET_VERSION}") + elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.10) + set(_boost_COMPILER "-vc71") + elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13) # Good luck! + set(_boost_COMPILER "-vc7") # yes, this is correct + else() # VS 6.0 Good luck! + set(_boost_COMPILER "-vc6") # yes, this is correct + endif() + elseif (BORLAND) + set(_boost_COMPILER "-bcb") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") + set(_boost_COMPILER "-sw") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "XL") + set(_boost_COMPILER "-xlc") + elseif (MINGW) + if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) + set(_boost_COMPILER "-mgw") # no GCC version encoding prior to 1.34 + else() + _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION _boost_COMPILER_VERSION_MAJOR _boost_COMPILER_VERSION_MINOR) + set(_boost_COMPILER "-mgw${_boost_COMPILER_VERSION}") + endif() + elseif (UNIX) + _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION _boost_COMPILER_VERSION_MAJOR _boost_COMPILER_VERSION_MINOR) + if(NOT Boost_VERSION VERSION_LESS 106900) + # From GCC 5 and clang 4, versioning changes and minor becomes patch. + # For those compilers, patch is exclude from compiler tag in Boost 1.69+ library naming. + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND _boost_COMPILER_VERSION_MAJOR VERSION_GREATER 4) + set(_boost_COMPILER_VERSION "${_boost_COMPILER_VERSION_MAJOR}") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND _boost_COMPILER_VERSION_MAJOR VERSION_GREATER 3) + set(_boost_COMPILER_VERSION "${_boost_COMPILER_VERSION_MAJOR}") + endif() + endif() + + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) + set(_boost_COMPILER "-gcc") # no GCC version encoding prior to 1.34 + else() + # Determine which version of GCC we have. + if(APPLE) + if(Boost_MINOR_VERSION) + if(${Boost_MINOR_VERSION} GREATER 35) + # In Boost 1.36.0 and newer, the mangled compiler name used + # on macOS/Darwin is "xgcc". + set(_boost_COMPILER "-xgcc${_boost_COMPILER_VERSION}") + else() + # In Boost <= 1.35.0, there is no mangled compiler name for + # the macOS/Darwin version of GCC. + set(_boost_COMPILER "") + endif() + else() + # We don't know the Boost version, so assume it's + # pre-1.36.0. + set(_boost_COMPILER "") + endif() + else() + set(_boost_COMPILER "-gcc${_boost_COMPILER_VERSION}") + endif() + endif() + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + # TODO: Find out any Boost version constraints vs clang support. + set(_boost_COMPILER "-clang${_boost_COMPILER_VERSION}") + endif() + else() + # TODO at least Boost_DEBUG here? + set(_boost_COMPILER "") + endif() + set(${_ret} ${_boost_COMPILER} PARENT_SCOPE) +endfunction() + +# +# Get component dependencies. Requires the dependencies to have been +# defined for the Boost release version. +# +# component - the component to check +# _ret - list of library dependencies +# +function(_Boost_COMPONENT_DEPENDENCIES component _ret) + # Note: to add a new Boost release, run + # + # % cmake -DBOOST_DIR=/path/to/boost/source -P Utilities/Scripts/BoostScanDeps.cmake + # + # The output may be added in a new block below. If it's the same as + # the previous release, simply update the version range of the block + # for the previous release. Also check if any new components have + # been added, and add any new components to + # _Boost_COMPONENT_HEADERS. + # + # This information was originally generated by running + # BoostScanDeps.cmake against every boost release to date supported + # by FindBoost: + # + # % for version in /path/to/boost/sources/* + # do + # cmake -DBOOST_DIR=$version -P Utilities/Scripts/BoostScanDeps.cmake + # done + # + # The output was then updated by search and replace with these regexes: + # + # - Strip message(STATUS) prefix dashes + # s;^-- ;; + # - Indent + # s;^set(; set(;; + # - Add conditionals + # s;Scanning /path/to/boost/sources/boost_\(.*\)_\(.*\)_\(.*); elseif(NOT Boost_VERSION VERSION_LESS \10\20\3 AND Boost_VERSION VERSION_LESS xxxx); + # + # This results in the logic seen below, but will require the xxxx + # replacing with the following Boost release version (or the next + # minor version to be released, e.g. 1.59 was the latest at the time + # of writing, making 1.60 the next, so 106000 is the needed version + # number). Identical consecutive releases were then merged together + # by updating the end range of the first block and removing the + # following redundant blocks. + # + # Running the script against all historical releases should be + # required only if the BoostScanDeps.cmake script logic is changed. + # The addition of a new release should only require it to be run + # against the new release. + + # Handle Python version suffixes + if(component MATCHES "^(python|mpi_python|numpy)([0-9][0-9]?|[0-9]\\.[0-9])\$") + set(component "${CMAKE_MATCH_1}") + set(component_python_version "${CMAKE_MATCH_2}") + endif() + + set(_Boost_IMPORTED_TARGETS TRUE) + if(Boost_VERSION AND Boost_VERSION VERSION_LESS 103300) + message(WARNING "Imported targets and dependency information not available for Boost version ${Boost_VERSION} (all versions older than 1.33)") + set(_Boost_IMPORTED_TARGETS FALSE) + elseif(NOT Boost_VERSION VERSION_LESS 103300 AND Boost_VERSION VERSION_LESS 103500) + set(_Boost_IOSTREAMS_DEPENDENCIES regex thread) + set(_Boost_REGEX_DEPENDENCIES thread) + set(_Boost_WAVE_DEPENDENCIES filesystem thread) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 103500 AND Boost_VERSION VERSION_LESS 103600) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_WAVE_DEPENDENCIES filesystem system thread) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 103600 AND Boost_VERSION VERSION_LESS 103800) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_WAVE_DEPENDENCIES filesystem system thread) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 103800 AND Boost_VERSION VERSION_LESS 104300) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES filesystem system thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104300 AND Boost_VERSION VERSION_LESS 104400) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES filesystem system thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104400 AND Boost_VERSION VERSION_LESS 104500) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random serialization) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES serialization filesystem system thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104500 AND Boost_VERSION VERSION_LESS 104700) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104700 AND Boost_VERSION VERSION_LESS 104800) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104800 AND Boost_VERSION VERSION_LESS 105000) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105000 AND Boost_VERSION VERSION_LESS 105300) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105300 AND Boost_VERSION VERSION_LESS 105400) + set(_Boost_ATOMIC_DEPENDENCIES thread chrono system date_time) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105400 AND Boost_VERSION VERSION_LESS 105500) + set(_Boost_ATOMIC_DEPENDENCIES thread chrono system date_time) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105500 AND Boost_VERSION VERSION_LESS 105600) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105600 AND Boost_VERSION VERSION_LESS 105900) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105900 AND Boost_VERSION VERSION_LESS 106000) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106000 AND Boost_VERSION VERSION_LESS 106100) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106100 AND Boost_VERSION VERSION_LESS 106200) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106200 AND Boost_VERSION VERSION_LESS 106300) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106300 AND Boost_VERSION VERSION_LESS 106500) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_COROUTINE2_DEPENDENCIES context fiber thread chrono system date_time) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106500 AND Boost_VERSION VERSION_LESS 106700) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106700 AND Boost_VERSION VERSION_LESS 106800) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106800 AND Boost_VERSION VERSION_LESS 106900) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_CONTRACT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + else() + if(NOT Boost_VERSION VERSION_LESS 106900) + set(_Boost_CONTRACT_DEPENDENCIES thread chrono date_time) + set(_Boost_COROUTINE_DEPENDENCIES context) + set(_Boost_FIBER_DEPENDENCIES context) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) + set(_Boost_THREAD_DEPENDENCIES chrono date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + endif() + if(NOT Boost_VERSION VERSION_LESS 107000) + message(WARNING "New Boost version may have incorrect or missing dependencies and imported targets") + endif() + endif() + + string(TOUPPER ${component} uppercomponent) + set(${_ret} ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE) + set(_Boost_IMPORTED_TARGETS ${_Boost_IMPORTED_TARGETS} PARENT_SCOPE) + + string(REGEX REPLACE ";" " " _boost_DEPS_STRING "${_Boost_${uppercomponent}_DEPENDENCIES}") + if (NOT _boost_DEPS_STRING) + set(_boost_DEPS_STRING "(none)") + endif() + # message(STATUS "Dependencies for Boost::${component}: ${_boost_DEPS_STRING}") +endfunction() + +# +# Get component headers. This is the primary header (or headers) for +# a given component, and is used to check that the headers are present +# as well as the library itself as an extra sanity check of the build +# environment. +# +# component - the component to check +# _hdrs +# +function(_Boost_COMPONENT_HEADERS component _hdrs) + # Handle Python version suffixes + if(component MATCHES "^(python|mpi_python|numpy)([0-9][0-9]?|[0-9]\\.[0-9])\$") + set(component "${CMAKE_MATCH_1}") + set(component_python_version "${CMAKE_MATCH_2}") + endif() + + # Note: new boost components will require adding here. The header + # must be present in all versions of Boost providing a library. + set(_Boost_ATOMIC_HEADERS "boost/atomic.hpp") + set(_Boost_CHRONO_HEADERS "boost/chrono.hpp") + set(_Boost_CONTAINER_HEADERS "boost/container/container_fwd.hpp") + set(_Boost_CONTRACT_HEADERS "boost/contract.hpp") + if(Boost_VERSION VERSION_LESS 106100) + set(_Boost_CONTEXT_HEADERS "boost/context/all.hpp") + else() + set(_Boost_CONTEXT_HEADERS "boost/context/detail/fcontext.hpp") + endif() + set(_Boost_COROUTINE_HEADERS "boost/coroutine/all.hpp") + set(_Boost_DATE_TIME_HEADERS "boost/date_time/date.hpp") + set(_Boost_EXCEPTION_HEADERS "boost/exception/exception.hpp") + set(_Boost_FIBER_HEADERS "boost/fiber/all.hpp") + set(_Boost_FILESYSTEM_HEADERS "boost/filesystem/path.hpp") + set(_Boost_GRAPH_HEADERS "boost/graph/adjacency_list.hpp") + set(_Boost_GRAPH_PARALLEL_HEADERS "boost/graph/adjacency_list.hpp") + set(_Boost_IOSTREAMS_HEADERS "boost/iostreams/stream.hpp") + set(_Boost_LOCALE_HEADERS "boost/locale.hpp") + set(_Boost_LOG_HEADERS "boost/log/core.hpp") + set(_Boost_LOG_SETUP_HEADERS "boost/log/detail/setup_config.hpp") + set(_Boost_MATH_HEADERS "boost/math_fwd.hpp") + set(_Boost_MATH_C99_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_C99F_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_C99L_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_TR1_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_TR1F_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_TR1L_HEADERS "boost/math/tr1.hpp") + set(_Boost_MPI_HEADERS "boost/mpi.hpp") + set(_Boost_MPI_PYTHON_HEADERS "boost/mpi/python/config.hpp") + set(_Boost_NUMPY_HEADERS "boost/python/numpy.hpp") + set(_Boost_PRG_EXEC_MONITOR_HEADERS "boost/test/prg_exec_monitor.hpp") + set(_Boost_PROGRAM_OPTIONS_HEADERS "boost/program_options.hpp") + set(_Boost_PYTHON_HEADERS "boost/python.hpp") + set(_Boost_RANDOM_HEADERS "boost/random.hpp") + set(_Boost_REGEX_HEADERS "boost/regex.hpp") + set(_Boost_SERIALIZATION_HEADERS "boost/serialization/serialization.hpp") + set(_Boost_SIGNALS_HEADERS "boost/signals.hpp") + set(_Boost_STACKTRACE_ADDR2LINE_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_BACKTRACE_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_BASIC_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_NOOP_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_WINDBG_CACHED_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_WINDBG_HEADERS "boost/stacktrace.hpp") + set(_Boost_SYSTEM_HEADERS "boost/system/config.hpp") + set(_Boost_TEST_EXEC_MONITOR_HEADERS "boost/test/test_exec_monitor.hpp") + set(_Boost_THREAD_HEADERS "boost/thread.hpp") + set(_Boost_TIMER_HEADERS "boost/timer.hpp") + set(_Boost_TYPE_ERASURE_HEADERS "boost/type_erasure/config.hpp") + set(_Boost_UNIT_TEST_FRAMEWORK_HEADERS "boost/test/framework.hpp") + set(_Boost_WAVE_HEADERS "boost/wave.hpp") + set(_Boost_WSERIALIZATION_HEADERS "boost/archive/text_wiarchive.hpp") + if(WIN32) + set(_Boost_BZIP2_HEADERS "boost/iostreams/filter/bzip2.hpp") + set(_Boost_ZLIB_HEADERS "boost/iostreams/filter/zlib.hpp") + endif() + + string(TOUPPER ${component} uppercomponent) + set(${_hdrs} ${_Boost_${uppercomponent}_HEADERS} PARENT_SCOPE) + + string(REGEX REPLACE ";" " " _boost_HDRS_STRING "${_Boost_${uppercomponent}_HEADERS}") + if (NOT _boost_HDRS_STRING) + set(_boost_HDRS_STRING "(none)") + endif() + # message(STATUS "Headers for Boost::${component}: ${_boost_HDRS_STRING}") +endfunction() + +# +# Determine if any missing dependencies require adding to the component list. +# +# Sets _Boost_${COMPONENT}_DEPENDENCIES for each required component, +# plus _Boost_IMPORTED_TARGETS (TRUE if imported targets should be +# defined; FALSE if dependency information is unavailable). +# +# componentvar - the component list variable name +# extravar - the indirect dependency list variable name +# +# +function(_Boost_MISSING_DEPENDENCIES componentvar extravar) + # _boost_unprocessed_components - list of components requiring processing + # _boost_processed_components - components already processed (or currently being processed) + # _boost_new_components - new components discovered for future processing + # + list(APPEND _boost_unprocessed_components ${${componentvar}}) + + while(_boost_unprocessed_components) + list(APPEND _boost_processed_components ${_boost_unprocessed_components}) + foreach(component ${_boost_unprocessed_components}) + string(TOUPPER ${component} uppercomponent) + set(${_ret} ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE) + _Boost_COMPONENT_DEPENDENCIES("${component}" _Boost_${uppercomponent}_DEPENDENCIES) + set(_Boost_${uppercomponent}_DEPENDENCIES ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE) + set(_Boost_IMPORTED_TARGETS ${_Boost_IMPORTED_TARGETS} PARENT_SCOPE) + foreach(componentdep ${_Boost_${uppercomponent}_DEPENDENCIES}) + if (NOT ("${componentdep}" IN_LIST _boost_processed_components OR "${componentdep}" IN_LIST _boost_new_components)) + list(APPEND _boost_new_components ${componentdep}) + endif() + endforeach() + endforeach() + set(_boost_unprocessed_components ${_boost_new_components}) + unset(_boost_new_components) + endwhile() + set(_boost_extra_components ${_boost_processed_components}) + if(_boost_extra_components AND ${componentvar}) + list(REMOVE_ITEM _boost_extra_components ${${componentvar}}) + endif() + set(${componentvar} ${_boost_processed_components} PARENT_SCOPE) + set(${extravar} ${_boost_extra_components} PARENT_SCOPE) +endfunction() + +# +# Some boost libraries may require particular set of compler features. +# The very first one was `boost::fiber` introduced in Boost 1.62. +# One can check required compiler features of it in +# `${Boost_ROOT}/libs/fiber/build/Jamfile.v2`. +# +function(_Boost_COMPILER_FEATURES component _ret) + # Boost >= 1.62 and < 1.67 + if(NOT Boost_VERSION VERSION_LESS 106200 AND Boost_VERSION VERSION_LESS 106700) + set(_Boost_FIBER_COMPILER_FEATURES + cxx_alias_templates + cxx_auto_type + cxx_constexpr + cxx_defaulted_functions + cxx_final + cxx_lambdas + cxx_noexcept + cxx_nullptr + cxx_rvalue_references + cxx_thread_local + cxx_variadic_templates + ) + endif() + string(TOUPPER ${component} uppercomponent) + set(${_ret} ${_Boost_${uppercomponent}_COMPILER_FEATURES} PARENT_SCOPE) +endfunction() + +# +# Update library search directory hint variable with paths used by prebuilt boost binaries. +# +# Prebuilt windows binaries (https://sourceforge.net/projects/boost/files/boost-binaries/) +# have library directories named using MSVC compiler version and architecture. +# This function would append corresponding directories if MSVC is a current compiler, +# so having `BOOST_ROOT` would be enough to specify to find everything. +# +function(_Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS componentlibvar basedir) + if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_arch_suffix 64) + else() + set(_arch_suffix 32) + endif() + if(MSVC_TOOLSET_VERSION GREATER_EQUAL 141) + list(APPEND ${componentlibvar} ${basedir}/lib${_arch_suffix}-msvc-14.1) + list(APPEND ${componentlibvar} ${basedir}/lib${_arch_suffix}-msvc-14.0) + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 80) + math(EXPR _toolset_major_version "${MSVC_TOOLSET_VERSION} / 10") + list(APPEND ${componentlibvar} ${basedir}/lib${_arch_suffix}-msvc-${_toolset_major_version}.0) + endif() + set(${componentlibvar} ${${componentlibvar}} PARENT_SCOPE) + endif() +endfunction() + +# +# End functions/macros +# +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# main. +#------------------------------------------------------------------------------- + + +# If the user sets Boost_LIBRARY_DIR, use it as the default for both +# configurations. +if(NOT Boost_LIBRARY_DIR_RELEASE AND Boost_LIBRARY_DIR) + set(Boost_LIBRARY_DIR_RELEASE "${Boost_LIBRARY_DIR}") +endif() +if(NOT Boost_LIBRARY_DIR_DEBUG AND Boost_LIBRARY_DIR) + set(Boost_LIBRARY_DIR_DEBUG "${Boost_LIBRARY_DIR}") +endif() + +if(NOT DEFINED Boost_USE_DEBUG_LIBS) + set(Boost_USE_DEBUG_LIBS TRUE) +endif() +if(NOT DEFINED Boost_USE_RELEASE_LIBS) + set(Boost_USE_RELEASE_LIBS TRUE) +endif() +if(NOT DEFINED Boost_USE_MULTITHREADED) + set(Boost_USE_MULTITHREADED TRUE) +endif() +if(NOT DEFINED Boost_USE_DEBUG_RUNTIME) + set(Boost_USE_DEBUG_RUNTIME TRUE) +endif() + +# Check the version of Boost against the requested version. +if(Boost_FIND_VERSION AND NOT Boost_FIND_VERSION_MINOR) + message(SEND_ERROR "When requesting a specific version of Boost, you must provide at least the major and minor version numbers, e.g., 1.34") +endif() + +if(Boost_FIND_VERSION_EXACT) + # The version may appear in a directory with or without the patch + # level, even when the patch level is non-zero. + set(_boost_TEST_VERSIONS + "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}.${Boost_FIND_VERSION_PATCH}" + "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") +else() + # The user has not requested an exact version. Among known + # versions, find those that are acceptable to the user request. + # + # Note: When adding a new Boost release, also update the dependency + # information in _Boost_COMPONENT_DEPENDENCIES and + # _Boost_COMPONENT_HEADERS. See the instructions at the top of + # _Boost_COMPONENT_DEPENDENCIES. + set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS} + "1.69.0" "1.69" + "1.68.0" "1.68" "1.67.0" "1.67" "1.66.0" "1.66" "1.65.1" "1.65.0" "1.65" + "1.64.0" "1.64" "1.63.0" "1.63" "1.62.0" "1.62" "1.61.0" "1.61" "1.60.0" "1.60" + "1.59.0" "1.59" "1.58.0" "1.58" "1.57.0" "1.57" "1.56.0" "1.56" "1.55.0" "1.55" + "1.54.0" "1.54" "1.53.0" "1.53" "1.52.0" "1.52" "1.51.0" "1.51" + "1.50.0" "1.50" "1.49.0" "1.49" "1.48.0" "1.48" "1.47.0" "1.47" "1.46.1" + "1.46.0" "1.46" "1.45.0" "1.45" "1.44.0" "1.44" "1.43.0" "1.43" "1.42.0" "1.42" + "1.41.0" "1.41" "1.40.0" "1.40" "1.39.0" "1.39" "1.38.0" "1.38" "1.37.0" "1.37" + "1.36.1" "1.36.0" "1.36" "1.35.1" "1.35.0" "1.35" "1.34.1" "1.34.0" + "1.34" "1.33.1" "1.33.0" "1.33") + + set(_boost_TEST_VERSIONS) + if(Boost_FIND_VERSION) + set(_Boost_FIND_VERSION_SHORT "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") + # Select acceptable versions. + foreach(version ${_Boost_KNOWN_VERSIONS}) + if(NOT "${version}" VERSION_LESS "${Boost_FIND_VERSION}") + # This version is high enough. + list(APPEND _boost_TEST_VERSIONS "${version}") + elseif("${version}.99" VERSION_EQUAL "${_Boost_FIND_VERSION_SHORT}.99") + # This version is a short-form for the requested version with + # the patch level dropped. + list(APPEND _boost_TEST_VERSIONS "${version}") + endif() + endforeach() + else() + # Any version is acceptable. + set(_boost_TEST_VERSIONS "${_Boost_KNOWN_VERSIONS}") + endif() +endif() + +# The reason that we failed to find Boost. This will be set to a +# user-friendly message when we fail to find some necessary piece of +# Boost. +set(Boost_ERROR_REASON) + +if(Boost_DEBUG) + # Output some of their choices + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_USE_MULTITHREADED = ${Boost_USE_MULTITHREADED}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_USE_STATIC_LIBS = ${Boost_USE_STATIC_LIBS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_USE_STATIC_RUNTIME = ${Boost_USE_STATIC_RUNTIME}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_ADDITIONAL_VERSIONS = ${Boost_ADDITIONAL_VERSIONS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_NO_SYSTEM_PATHS = ${Boost_NO_SYSTEM_PATHS}") +endif() + +# Supply Boost_LIB_DIAGNOSTIC_DEFINITIONS as a convenience target. It +# will only contain any interface definitions on WIN32, but is created +# on all platforms to keep end user code free from platform dependent +# code. Also provide convenience targets to disable autolinking and +# enable dynamic linking. +if(NOT TARGET Boost::diagnostic_definitions) + add_library(Boost::diagnostic_definitions INTERFACE IMPORTED) + add_library(Boost::disable_autolinking INTERFACE IMPORTED) + add_library(Boost::dynamic_linking INTERFACE IMPORTED) +endif() +if(WIN32) + # In windows, automatic linking is performed, so you do not have + # to specify the libraries. If you are linking to a dynamic + # runtime, then you can choose to link to either a static or a + # dynamic Boost library, the default is to do a static link. You + # can alter this for a specific library "whatever" by defining + # BOOST_WHATEVER_DYN_LINK to force Boost library "whatever" to be + # linked dynamically. Alternatively you can force all Boost + # libraries to dynamic link by defining BOOST_ALL_DYN_LINK. + + # This feature can be disabled for Boost library "whatever" by + # defining BOOST_WHATEVER_NO_LIB, or for all of Boost by defining + # BOOST_ALL_NO_LIB. + + # If you want to observe which libraries are being linked against + # then defining BOOST_LIB_DIAGNOSTIC will cause the auto-linking + # code to emit a #pragma message each time a library is selected + # for linking. + set(Boost_LIB_DIAGNOSTIC_DEFINITIONS "-DBOOST_LIB_DIAGNOSTIC") + set_target_properties(Boost::diagnostic_definitions PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "BOOST_LIB_DIAGNOSTIC") + set_target_properties(Boost::disable_autolinking PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "BOOST_ALL_NO_LIB") + set_target_properties(Boost::dynamic_linking PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "BOOST_ALL_DYN_LINK") +endif() + +_Boost_CHECK_SPELLING(Boost_ROOT) +_Boost_CHECK_SPELLING(Boost_LIBRARYDIR) +_Boost_CHECK_SPELLING(Boost_INCLUDEDIR) + +# Collect environment variable inputs as hints. Do not consider changes. +foreach(v BOOSTROOT BOOST_ROOT BOOST_INCLUDEDIR BOOST_LIBRARYDIR) + set(_env $ENV{${v}}) + if(_env) + file(TO_CMAKE_PATH "${_env}" _ENV_${v}) + else() + set(_ENV_${v} "") + endif() +endforeach() +if(NOT _ENV_BOOST_ROOT AND _ENV_BOOSTROOT) + set(_ENV_BOOST_ROOT "${_ENV_BOOSTROOT}") +endif() + +# Collect inputs and cached results. Detect changes since the last run. +if(NOT BOOST_ROOT AND BOOSTROOT) + set(BOOST_ROOT "${BOOSTROOT}") +endif() +set(_Boost_VARS_DIR + BOOST_ROOT + Boost_NO_SYSTEM_PATHS + ) + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Declared as CMake or Environmental Variables:") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " BOOST_ROOT = ${BOOST_ROOT}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " BOOST_INCLUDEDIR = ${BOOST_INCLUDEDIR}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " BOOST_LIBRARYDIR = ${BOOST_LIBRARYDIR}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") +endif() + +# ------------------------------------------------------------------------ +# Search for Boost include DIR +# ------------------------------------------------------------------------ + +set(_Boost_VARS_INC BOOST_INCLUDEDIR Boost_INCLUDE_DIR Boost_ADDITIONAL_VERSIONS) +_Boost_CHANGE_DETECT(_Boost_CHANGE_INCDIR ${_Boost_VARS_DIR} ${_Boost_VARS_INC}) +# Clear Boost_INCLUDE_DIR if it did not change but other input affecting the +# location did. We will find a new one based on the new inputs. +if(_Boost_CHANGE_INCDIR AND NOT _Boost_INCLUDE_DIR_CHANGED) + unset(Boost_INCLUDE_DIR CACHE) +endif() + +if(NOT Boost_INCLUDE_DIR) + set(_boost_INCLUDE_SEARCH_DIRS "") + if(BOOST_INCLUDEDIR) + list(APPEND _boost_INCLUDE_SEARCH_DIRS ${BOOST_INCLUDEDIR}) + elseif(_ENV_BOOST_INCLUDEDIR) + list(APPEND _boost_INCLUDE_SEARCH_DIRS ${_ENV_BOOST_INCLUDEDIR}) + endif() + + if( BOOST_ROOT ) + list(APPEND _boost_INCLUDE_SEARCH_DIRS ${BOOST_ROOT}/include ${BOOST_ROOT}) + elseif( _ENV_BOOST_ROOT ) + list(APPEND _boost_INCLUDE_SEARCH_DIRS ${_ENV_BOOST_ROOT}/include ${_ENV_BOOST_ROOT}) + endif() + + if( Boost_NO_SYSTEM_PATHS) + list(APPEND _boost_INCLUDE_SEARCH_DIRS NO_CMAKE_SYSTEM_PATH NO_SYSTEM_ENVIRONMENT_PATH) + else() + if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") + foreach(ver ${_boost_TEST_VERSIONS}) + string(REPLACE "." "_" ver "${ver}") + list(APPEND _boost_INCLUDE_SEARCH_DIRS PATHS "C:/local/boost_${ver}") + endforeach() + endif() + list(APPEND _boost_INCLUDE_SEARCH_DIRS PATHS + C:/boost/include + C:/boost + /sw/local/include + ) + endif() + + # Try to find Boost by stepping backwards through the Boost versions + # we know about. + # Build a list of path suffixes for each version. + set(_boost_PATH_SUFFIXES) + foreach(_boost_VER ${_boost_TEST_VERSIONS}) + # Add in a path suffix, based on the required version, ideally + # we could read this from version.hpp, but for that to work we'd + # need to know the include dir already + set(_boost_BOOSTIFIED_VERSION) + + # Transform 1.35 => 1_35 and 1.36.0 => 1_36_0 + if(_boost_VER MATCHES "([0-9]+)\\.([0-9]+)\\.([0-9]+)") + set(_boost_BOOSTIFIED_VERSION + "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}_${CMAKE_MATCH_3}") + elseif(_boost_VER MATCHES "([0-9]+)\\.([0-9]+)") + set(_boost_BOOSTIFIED_VERSION + "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}") + endif() + + list(APPEND _boost_PATH_SUFFIXES + "boost-${_boost_BOOSTIFIED_VERSION}" + "boost_${_boost_BOOSTIFIED_VERSION}" + "boost/boost-${_boost_BOOSTIFIED_VERSION}" + "boost/boost_${_boost_BOOSTIFIED_VERSION}" + ) + + endforeach() + + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Include debugging info:") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " _boost_INCLUDE_SEARCH_DIRS = ${_boost_INCLUDE_SEARCH_DIRS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " _boost_PATH_SUFFIXES = ${_boost_PATH_SUFFIXES}") + endif() + + # Look for a standard boost header file. + find_path(Boost_INCLUDE_DIR + NAMES boost/config.hpp + HINTS ${_boost_INCLUDE_SEARCH_DIRS} + PATH_SUFFIXES ${_boost_PATH_SUFFIXES} + ) +endif() + +# ------------------------------------------------------------------------ +# Extract version information from version.hpp +# ------------------------------------------------------------------------ + +# Set Boost_FOUND based only on header location and version. +# It will be updated below for component libraries. +if(Boost_INCLUDE_DIR) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "location of version.hpp: ${Boost_INCLUDE_DIR}/boost/version.hpp") + endif() + + # Extract Boost_VERSION and Boost_LIB_VERSION from version.hpp + set(Boost_VERSION 0) + set(Boost_LIB_VERSION "") + file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ") + set(_Boost_VERSION_REGEX "([0-9]+)") + set(_Boost_LIB_VERSION_REGEX "\"([0-9_]+)\"") + foreach(v VERSION LIB_VERSION) + if("${_boost_VERSION_HPP_CONTENTS}" MATCHES "#define BOOST_${v} ${_Boost_${v}_REGEX}") + set(Boost_${v} "${CMAKE_MATCH_1}") + endif() + endforeach() + unset(_boost_VERSION_HPP_CONTENTS) + + math(EXPR Boost_MAJOR_VERSION "${Boost_VERSION} / 100000") + math(EXPR Boost_MINOR_VERSION "${Boost_VERSION} / 100 % 1000") + math(EXPR Boost_SUBMINOR_VERSION "${Boost_VERSION} % 100") + set(Boost_VERSION_STRING "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + + string(APPEND Boost_ERROR_REASON + "Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}\nBoost include path: ${Boost_INCLUDE_DIR}") + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "version.hpp reveals boost " + "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + endif() + + if(Boost_FIND_VERSION) + # Set Boost_FOUND based on requested version. + set(_Boost_VERSION "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + if("${_Boost_VERSION}" VERSION_LESS "${Boost_FIND_VERSION}") + set(Boost_FOUND 0) + set(_Boost_VERSION_AGE "old") + elseif(Boost_FIND_VERSION_EXACT AND + NOT "${_Boost_VERSION}" VERSION_EQUAL "${Boost_FIND_VERSION}") + set(Boost_FOUND 0) + set(_Boost_VERSION_AGE "new") + else() + set(Boost_FOUND 1) + endif() + if(NOT Boost_FOUND) + # State that we found a version of Boost that is too new or too old. + string(APPEND Boost_ERROR_REASON + "\nDetected version of Boost is too ${_Boost_VERSION_AGE}. Requested version was ${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") + if (Boost_FIND_VERSION_PATCH) + string(APPEND Boost_ERROR_REASON + ".${Boost_FIND_VERSION_PATCH}") + endif () + if (NOT Boost_FIND_VERSION_EXACT) + string(APPEND Boost_ERROR_REASON " (or newer)") + endif () + string(APPEND Boost_ERROR_REASON ".") + endif () + else() + # Caller will accept any Boost version. + set(Boost_FOUND 1) + endif() +else() + set(Boost_FOUND 0) + string(APPEND Boost_ERROR_REASON + "Unable to find the Boost header files. Please set BOOST_ROOT to the root directory containing Boost or BOOST_INCLUDEDIR to the directory containing Boost's headers.") +endif() + +# ------------------------------------------------------------------------ +# Prefix initialization +# ------------------------------------------------------------------------ + +set(Boost_LIB_PREFIX "") +if ( (GHSMULTI AND Boost_USE_STATIC_LIBS) OR + (WIN32 AND Boost_USE_STATIC_LIBS AND NOT CYGWIN) ) + set(Boost_LIB_PREFIX "lib") +endif() + +if ( NOT Boost_NAMESPACE ) + set(Boost_NAMESPACE "boost") +endif() + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_LIB_PREFIX = ${Boost_LIB_PREFIX}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_NAMESPACE = ${Boost_NAMESPACE}") +endif() + +# ------------------------------------------------------------------------ +# Suffix initialization and compiler suffix detection. +# ------------------------------------------------------------------------ + +set(_Boost_VARS_NAME + Boost_NAMESPACE + Boost_COMPILER + Boost_THREADAPI + Boost_USE_DEBUG_PYTHON + Boost_USE_MULTITHREADED + Boost_USE_STATIC_LIBS + Boost_USE_STATIC_RUNTIME + Boost_USE_STLPORT + Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS + ) +_Boost_CHANGE_DETECT(_Boost_CHANGE_LIBNAME ${_Boost_VARS_NAME}) + +# Setting some more suffixes for the library +if (Boost_COMPILER) + set(_boost_COMPILER ${Boost_COMPILER}) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "using user-specified Boost_COMPILER = ${_boost_COMPILER}") + endif() +else() + # Attempt to guess the compiler suffix + # NOTE: this is not perfect yet, if you experience any issues + # please report them and use the Boost_COMPILER variable + # to work around the problems. + _Boost_GUESS_COMPILER_PREFIX(_boost_COMPILER) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "guessed _boost_COMPILER = ${_boost_COMPILER}") + endif() +endif() + +set (_boost_MULTITHREADED "-mt") +if( NOT Boost_USE_MULTITHREADED ) + set (_boost_MULTITHREADED "") +endif() +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_MULTITHREADED = ${_boost_MULTITHREADED}") +endif() + +#====================== +# Systematically build up the Boost ABI tag for the 'tagged' and 'versioned' layouts +# http://boost.org/doc/libs/1_66_0/more/getting_started/windows.html#library-naming +# http://boost.org/doc/libs/1_66_0/boost/config/auto_link.hpp +# http://boost.org/doc/libs/1_66_0/tools/build/src/tools/common.jam +# http://boost.org/doc/libs/1_66_0/boostcpp.jam +set( _boost_RELEASE_ABI_TAG "-") +set( _boost_DEBUG_ABI_TAG "-") +# Key Use this library when: +# s linking statically to the C++ standard library and +# compiler runtime support libraries. +if(Boost_USE_STATIC_RUNTIME) + set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}s") + set( _boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}s") +endif() +# g using debug versions of the standard and runtime +# support libraries +if(WIN32 AND Boost_USE_DEBUG_RUNTIME) + if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC" + OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang" + OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xIntel") + string(APPEND _boost_DEBUG_ABI_TAG "g") + endif() +endif() +# y using special debug build of python +if(Boost_USE_DEBUG_PYTHON) + string(APPEND _boost_DEBUG_ABI_TAG "y") +endif() +# d using a debug version of your code +string(APPEND _boost_DEBUG_ABI_TAG "d") +# p using the STLport standard library rather than the +# default one supplied with your compiler +if(Boost_USE_STLPORT) + string(APPEND _boost_RELEASE_ABI_TAG "p") + string(APPEND _boost_DEBUG_ABI_TAG "p") +endif() +# n using the STLport deprecated "native iostreams" feature +# removed from the documentation in 1.43.0 but still present in +# boost/config/auto_link.hpp +if(Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS) + string(APPEND _boost_RELEASE_ABI_TAG "n") + string(APPEND _boost_DEBUG_ABI_TAG "n") +endif() + +# -x86 Architecture and address model tag +# First character is the architecture, then word-size, either 32 or 64 +# Only used in 'versioned' layout, added in Boost 1.66.0 +if(DEFINED Boost_ARCHITECTURE) + set(_boost_ARCHITECTURE_TAG "${Boost_ARCHITECTURE}") + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "using user-specified Boost_ARCHITECTURE = ${_boost_ARCHITECTURE_TAG}") + endif() +else() + set(_boost_ARCHITECTURE_TAG "") + # {CMAKE_CXX_COMPILER_ARCHITECTURE_ID} is not currently set for all compilers + if(NOT "x${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" STREQUAL "x" AND NOT Boost_VERSION VERSION_LESS 106600) + string(APPEND _boost_ARCHITECTURE_TAG "-") + # This needs to be kept in-sync with the section of CMakePlatformId.h.in + # inside 'defined(_WIN32) && defined(_MSC_VER)' + if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "IA64") + string(APPEND _boost_ARCHITECTURE_TAG "i") + elseif(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "X86" + OR CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "x64") + string(APPEND _boost_ARCHITECTURE_TAG "x") + elseif(CMAKE_CXX_COMPILER_ARCHITECTURE_ID MATCHES "^ARM") + string(APPEND _boost_ARCHITECTURE_TAG "a") + elseif(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "MIPS") + string(APPEND _boost_ARCHITECTURE_TAG "m") + endif() + + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + string(APPEND _boost_ARCHITECTURE_TAG "64") + else() + string(APPEND _boost_ARCHITECTURE_TAG "32") + endif() + endif() +endif() + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_RELEASE_ABI_TAG = ${_boost_RELEASE_ABI_TAG}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_DEBUG_ABI_TAG = ${_boost_DEBUG_ABI_TAG}") +endif() + +# ------------------------------------------------------------------------ +# Begin finding boost libraries +# ------------------------------------------------------------------------ + +set(_Boost_VARS_LIB "") +foreach(c DEBUG RELEASE) + set(_Boost_VARS_LIB_${c} BOOST_LIBRARYDIR Boost_LIBRARY_DIR_${c}) + list(APPEND _Boost_VARS_LIB ${_Boost_VARS_LIB_${c}}) + _Boost_CHANGE_DETECT(_Boost_CHANGE_LIBDIR_${c} ${_Boost_VARS_DIR} ${_Boost_VARS_LIB_${c}} Boost_INCLUDE_DIR) + # Clear Boost_LIBRARY_DIR_${c} if it did not change but other input affecting the + # location did. We will find a new one based on the new inputs. + if(_Boost_CHANGE_LIBDIR_${c} AND NOT _Boost_LIBRARY_DIR_${c}_CHANGED) + unset(Boost_LIBRARY_DIR_${c} CACHE) + endif() + + # If Boost_LIBRARY_DIR_[RELEASE,DEBUG] is set, prefer its value. + if(Boost_LIBRARY_DIR_${c}) + set(_boost_LIBRARY_SEARCH_DIRS_${c} ${Boost_LIBRARY_DIR_${c}} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + else() + set(_boost_LIBRARY_SEARCH_DIRS_${c} "") + if(BOOST_LIBRARYDIR) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${BOOST_LIBRARYDIR}) + elseif(_ENV_BOOST_LIBRARYDIR) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${_ENV_BOOST_LIBRARYDIR}) + endif() + + if(BOOST_ROOT) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${BOOST_ROOT}/lib ${BOOST_ROOT}/stage/lib) + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${BOOST_ROOT}") + elseif(_ENV_BOOST_ROOT) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${_ENV_BOOST_ROOT}/lib ${_ENV_BOOST_ROOT}/stage/lib) + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${_ENV_BOOST_ROOT}") + endif() + + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} + ${Boost_INCLUDE_DIR}/lib + ${Boost_INCLUDE_DIR}/../lib + ${Boost_INCLUDE_DIR}/stage/lib + ) + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${Boost_INCLUDE_DIR}/..") + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${Boost_INCLUDE_DIR}") + if( Boost_NO_SYSTEM_PATHS ) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} NO_CMAKE_SYSTEM_PATH NO_SYSTEM_ENVIRONMENT_PATH) + else() + foreach(ver ${_boost_TEST_VERSIONS}) + string(REPLACE "." "_" ver "${ver}") + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "C:/local/boost_${ver}") + endforeach() + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "C:/boost") + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} PATHS + C:/boost/lib + C:/boost + /sw/local/lib + ) + endif() + endif() +endforeach() + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_LIBRARY_SEARCH_DIRS_RELEASE = ${_boost_LIBRARY_SEARCH_DIRS_RELEASE}" + "_boost_LIBRARY_SEARCH_DIRS_DEBUG = ${_boost_LIBRARY_SEARCH_DIRS_DEBUG}") +endif() + +# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES +if( Boost_USE_STATIC_LIBS ) + set( _boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + list(INSERT CMAKE_FIND_LIBRARY_SUFFIXES 0 .lib .a) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a) + endif() +endif() + +# We want to use the tag inline below without risking double dashes +if(_boost_RELEASE_ABI_TAG) + if(${_boost_RELEASE_ABI_TAG} STREQUAL "-") + set(_boost_RELEASE_ABI_TAG "") + endif() +endif() +if(_boost_DEBUG_ABI_TAG) + if(${_boost_DEBUG_ABI_TAG} STREQUAL "-") + set(_boost_DEBUG_ABI_TAG "") + endif() +endif() + +# The previous behavior of FindBoost when Boost_USE_STATIC_LIBS was enabled +# on WIN32 was to: +# 1. Search for static libs compiled against a SHARED C++ standard runtime library (use if found) +# 2. Search for static libs compiled against a STATIC C++ standard runtime library (use if found) +# We maintain this behavior since changing it could break people's builds. +# To disable the ambiguous behavior, the user need only +# set Boost_USE_STATIC_RUNTIME either ON or OFF. +set(_boost_STATIC_RUNTIME_WORKAROUND false) +if(WIN32 AND Boost_USE_STATIC_LIBS) + if(NOT DEFINED Boost_USE_STATIC_RUNTIME) + set(_boost_STATIC_RUNTIME_WORKAROUND TRUE) + endif() +endif() + +# On versions < 1.35, remove the System library from the considered list +# since it wasn't added until 1.35. +if(Boost_VERSION AND Boost_FIND_COMPONENTS) + if(Boost_VERSION LESS 103500) + list(REMOVE_ITEM Boost_FIND_COMPONENTS system) + endif() +endif() + +# Additional components may be required via component dependencies. +# Add any missing components to the list. +_Boost_MISSING_DEPENDENCIES(Boost_FIND_COMPONENTS _Boost_EXTRA_FIND_COMPONENTS) + +# If thread is required, get the thread libs as a dependency +if("thread" IN_LIST Boost_FIND_COMPONENTS) + if(Boost_FIND_QUIETLY) + set(_Boost_find_quiet QUIET) + else() + set(_Boost_find_quiet "") + endif() + find_package(Threads ${_Boost_find_quiet}) + unset(_Boost_find_quiet) +endif() + +# If the user changed any of our control inputs flush previous results. +if(_Boost_CHANGE_LIBDIR_DEBUG OR _Boost_CHANGE_LIBDIR_RELEASE OR _Boost_CHANGE_LIBNAME) + foreach(COMPONENT ${_Boost_COMPONENTS_SEARCHED}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + foreach(c DEBUG RELEASE) + set(_var Boost_${UPPERCOMPONENT}_LIBRARY_${c}) + unset(${_var} CACHE) + set(${_var} "${_var}-NOTFOUND") + endforeach() + endforeach() + set(_Boost_COMPONENTS_SEARCHED "") +endif() + +foreach(COMPONENT ${Boost_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + + set( _boost_docstring_release "Boost ${COMPONENT} library (release)") + set( _boost_docstring_debug "Boost ${COMPONENT} library (debug)") + + # Compute component-specific hints. + set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "") + if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR + ${COMPONENT} STREQUAL "graph_parallel") + foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES}) + if(IS_ABSOLUTE "${lib}") + get_filename_component(libdir "${lib}" PATH) + string(REPLACE "\\" "/" libdir "${libdir}") + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir}) + endif() + endforeach() + endif() + + # Handle Python version suffixes + unset(COMPONENT_PYTHON_VERSION_MAJOR) + unset(COMPONENT_PYTHON_VERSION_MINOR) + if(${COMPONENT} MATCHES "^(python|mpi_python|numpy)([0-9])\$") + set(COMPONENT_UNVERSIONED "${CMAKE_MATCH_1}") + set(COMPONENT_PYTHON_VERSION_MAJOR "${CMAKE_MATCH_2}") + elseif(${COMPONENT} MATCHES "^(python|mpi_python|numpy)([0-9])\\.?([0-9])\$") + set(COMPONENT_UNVERSIONED "${CMAKE_MATCH_1}") + set(COMPONENT_PYTHON_VERSION_MAJOR "${CMAKE_MATCH_2}") + set(COMPONENT_PYTHON_VERSION_MINOR "${CMAKE_MATCH_3}") + endif() + + unset(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME) + if (COMPONENT_PYTHON_VERSION_MINOR) + # Boost >= 1.67 + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + # Debian/Ubuntu (Some versions omit the 2 and/or 3 from the suffix) + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}${COMPONENT_PYTHON_VERSION_MAJOR}-py${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}-py${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + # Gentoo + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}-${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + # RPMs + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}-${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + endif() + if (COMPONENT_PYTHON_VERSION_MAJOR AND NOT COMPONENT_PYTHON_VERSION_MINOR) + # Boost < 1.67 + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}${COMPONENT_PYTHON_VERSION_MAJOR}") + endif() + + # Consolidate and report component-specific hints. + if(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME) + list(REMOVE_DUPLICATES _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Component-specific library search names for ${COMPONENT_NAME}: " + "${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME}") + endif() + endif() + if(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT) + list(REMOVE_DUPLICATES _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Component-specific library search paths for ${COMPONENT}: " + "${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT}") + endif() + endif() + + # + # Find headers + # + _Boost_COMPONENT_HEADERS("${COMPONENT}" Boost_${UPPERCOMPONENT}_HEADER_NAME) + # Look for a standard boost header file. + if(Boost_${UPPERCOMPONENT}_HEADER_NAME) + if(EXISTS "${Boost_INCLUDE_DIR}/${Boost_${UPPERCOMPONENT}_HEADER_NAME}") + set(Boost_${UPPERCOMPONENT}_HEADER ON) + else() + set(Boost_${UPPERCOMPONENT}_HEADER OFF) + endif() + else() + set(Boost_${UPPERCOMPONENT}_HEADER ON) + message(WARNING "No header defined for ${COMPONENT}; skipping header check") + endif() + + # + # Find RELEASE libraries + # + unset(_boost_RELEASE_NAMES) + foreach(component IN LISTS _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME COMPONENT) + foreach(compiler IN LISTS _boost_COMPILER) + list(APPEND _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} ) + endforeach() + list(APPEND _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component} ) + if(_boost_STATIC_RUNTIME_WORKAROUND) + set(_boost_RELEASE_STATIC_ABI_TAG "-s${_boost_RELEASE_ABI_TAG}") + foreach(compiler IN LISTS _boost_COMPILER) + list(APPEND _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} ) + endforeach() + list(APPEND _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} ) + endif() + endforeach() + if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") + _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_RELEASE_NAMES ${_boost_RELEASE_NAMES}) + endif() + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Searching for ${UPPERCOMPONENT}_LIBRARY_RELEASE: ${_boost_RELEASE_NAMES}") + endif() + + # if Boost_LIBRARY_DIR_RELEASE is not defined, + # but Boost_LIBRARY_DIR_DEBUG is, look there first for RELEASE libs + if(NOT Boost_LIBRARY_DIR_RELEASE AND Boost_LIBRARY_DIR_DEBUG) + list(INSERT _boost_LIBRARY_SEARCH_DIRS_RELEASE 0 ${Boost_LIBRARY_DIR_DEBUG}) + endif() + + # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. + string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS_RELEASE}") + + if(Boost_USE_RELEASE_LIBS) + _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE RELEASE + NAMES ${_boost_RELEASE_NAMES} + HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} + NAMES_PER_DIR + DOC "${_boost_docstring_release}" + ) + endif() + + # + # Find DEBUG libraries + # + unset(_boost_DEBUG_NAMES) + foreach(component IN LISTS _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME COMPONENT) + foreach(compiler IN LISTS _boost_COMPILER) + list(APPEND _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} ) + endforeach() + list(APPEND _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component} ) + if(_boost_STATIC_RUNTIME_WORKAROUND) + set(_boost_DEBUG_STATIC_ABI_TAG "-s${_boost_DEBUG_ABI_TAG}") + foreach(compiler IN LISTS _boost_COMPILER) + list(APPEND _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} ) + endforeach() + list(APPEND _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} ) + endif() + endforeach() + if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") + _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_DEBUG_NAMES ${_boost_DEBUG_NAMES}) + endif() + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Searching for ${UPPERCOMPONENT}_LIBRARY_DEBUG: ${_boost_DEBUG_NAMES}") + endif() + + # if Boost_LIBRARY_DIR_DEBUG is not defined, + # but Boost_LIBRARY_DIR_RELEASE is, look there first for DEBUG libs + if(NOT Boost_LIBRARY_DIR_DEBUG AND Boost_LIBRARY_DIR_RELEASE) + list(INSERT _boost_LIBRARY_SEARCH_DIRS_DEBUG 0 ${Boost_LIBRARY_DIR_RELEASE}) + endif() + + # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. + string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS_DEBUG}") + + if(Boost_USE_DEBUG_LIBS) + _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG DEBUG + NAMES ${_boost_DEBUG_NAMES} + HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} + NAMES_PER_DIR + DOC "${_boost_docstring_debug}" + ) + endif () + + if(Boost_REALPATH) + _Boost_SWAP_WITH_REALPATH(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE "${_boost_docstring_release}") + _Boost_SWAP_WITH_REALPATH(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG "${_boost_docstring_debug}" ) + endif() + + _Boost_ADJUST_LIB_VARS(${UPPERCOMPONENT}) + + # Check if component requires some compiler features + _Boost_COMPILER_FEATURES(${COMPONENT} _Boost_${UPPERCOMPONENT}_COMPILER_FEATURES) + +endforeach() + +# Restore the original find library ordering +if( Boost_USE_STATIC_LIBS ) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${_boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) +endif() + +# ------------------------------------------------------------------------ +# End finding boost libraries +# ------------------------------------------------------------------------ + +set(Boost_INCLUDE_DIRS ${Boost_INCLUDE_DIR}) +set(Boost_LIBRARY_DIRS) +if(Boost_LIBRARY_DIR_RELEASE) + list(APPEND Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR_RELEASE}) +endif() +if(Boost_LIBRARY_DIR_DEBUG) + list(APPEND Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR_DEBUG}) +endif() +if(Boost_LIBRARY_DIRS) + list(REMOVE_DUPLICATES Boost_LIBRARY_DIRS) +endif() + +# The above setting of Boost_FOUND was based only on the header files. +# Update it for the requested component libraries. +if(Boost_FOUND) + # The headers were found. Check for requested component libs. + set(_boost_CHECKED_COMPONENT FALSE) + set(_Boost_MISSING_COMPONENTS "") + foreach(COMPONENT ${Boost_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + set(_boost_CHECKED_COMPONENT TRUE) + if(NOT Boost_${UPPERCOMPONENT}_FOUND AND Boost_FIND_REQUIRED_${COMPONENT}) + list(APPEND _Boost_MISSING_COMPONENTS ${COMPONENT}) + endif() + endforeach() + if(_Boost_MISSING_COMPONENTS AND _Boost_EXTRA_FIND_COMPONENTS) + # Optional indirect dependencies are not counted as missing. + list(REMOVE_ITEM _Boost_MISSING_COMPONENTS ${_Boost_EXTRA_FIND_COMPONENTS}) + endif() + + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] Boost_FOUND = ${Boost_FOUND}") + endif() + + if (_Boost_MISSING_COMPONENTS) + set(Boost_FOUND 0) + # We were unable to find some libraries, so generate a sensible + # error message that lists the libraries we were unable to find. + string(APPEND Boost_ERROR_REASON + "\nCould not find the following") + if(Boost_USE_STATIC_LIBS) + string(APPEND Boost_ERROR_REASON " static") + endif() + string(APPEND Boost_ERROR_REASON + " Boost libraries:\n") + foreach(COMPONENT ${_Boost_MISSING_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + string(APPEND Boost_ERROR_REASON + " ${Boost_NAMESPACE}_${COMPONENT}${Boost_ERROR_REASON_${UPPERCOMPONENT}}\n") + endforeach() + + list(LENGTH Boost_FIND_COMPONENTS Boost_NUM_COMPONENTS_WANTED) + list(LENGTH _Boost_MISSING_COMPONENTS Boost_NUM_MISSING_COMPONENTS) + if (${Boost_NUM_COMPONENTS_WANTED} EQUAL ${Boost_NUM_MISSING_COMPONENTS}) + string(APPEND Boost_ERROR_REASON + "No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") + else () + string(APPEND Boost_ERROR_REASON + "Some (but not all) of the required Boost libraries were found. You may need to install these additional Boost libraries. Alternatively, set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") + endif () + endif () + + if( NOT Boost_LIBRARY_DIRS AND NOT _boost_CHECKED_COMPONENT ) + # Compatibility Code for backwards compatibility with CMake + # 2.4's FindBoost module. + + # Look for the boost library path. + # Note that the user may not have installed any libraries + # so it is quite possible the Boost_LIBRARY_DIRS may not exist. + set(_boost_LIB_DIR ${Boost_INCLUDE_DIR}) + + if("${_boost_LIB_DIR}" MATCHES "boost-[0-9]+") + get_filename_component(_boost_LIB_DIR ${_boost_LIB_DIR} PATH) + endif() + + if("${_boost_LIB_DIR}" MATCHES "/include$") + # Strip off the trailing "/include" in the path. + get_filename_component(_boost_LIB_DIR ${_boost_LIB_DIR} PATH) + endif() + + if(EXISTS "${_boost_LIB_DIR}/lib") + string(APPEND _boost_LIB_DIR /lib) + elseif(EXISTS "${_boost_LIB_DIR}/stage/lib") + string(APPEND _boost_LIB_DIR "/stage/lib") + else() + set(_boost_LIB_DIR "") + endif() + + if(_boost_LIB_DIR AND EXISTS "${_boost_LIB_DIR}") + set(Boost_LIBRARY_DIRS ${_boost_LIB_DIR}) + endif() + + endif() +else() + # Boost headers were not found so no components were found. + foreach(COMPONENT ${Boost_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + set(Boost_${UPPERCOMPONENT}_FOUND 0) + endforeach() +endif() + +# ------------------------------------------------------------------------ +# Add imported targets +# ------------------------------------------------------------------------ + +if(Boost_FOUND) + # For header-only libraries + if(NOT TARGET Boost::boost) + add_library(Boost::boost INTERFACE IMPORTED) + if(Boost_INCLUDE_DIRS) + set_target_properties(Boost::boost PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}") + endif() + endif() + + foreach(COMPONENT ${Boost_FIND_COMPONENTS}) + if(_Boost_IMPORTED_TARGETS AND NOT TARGET Boost::${COMPONENT}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + if(Boost_${UPPERCOMPONENT}_FOUND) + if(Boost_USE_STATIC_LIBS) + add_library(Boost::${COMPONENT} STATIC IMPORTED) + else() + # Even if Boost_USE_STATIC_LIBS is OFF, we might have static + # libraries as a result. + add_library(Boost::${COMPONENT} UNKNOWN IMPORTED) + endif() + if(Boost_INCLUDE_DIRS) + set_target_properties(Boost::${COMPONENT} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}") + endif() + if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY}") + set_target_properties(Boost::${COMPONENT} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${Boost_${UPPERCOMPONENT}_LIBRARY}") + endif() + if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE}") + set_property(TARGET Boost::${COMPONENT} APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(Boost::${COMPONENT} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX" + IMPORTED_LOCATION_RELEASE "${Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE}") + endif() + if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG}") + set_property(TARGET Boost::${COMPONENT} APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(Boost::${COMPONENT} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX" + IMPORTED_LOCATION_DEBUG "${Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG}") + endif() + if(_Boost_${UPPERCOMPONENT}_DEPENDENCIES) + unset(_Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES) + foreach(dep ${_Boost_${UPPERCOMPONENT}_DEPENDENCIES}) + list(APPEND _Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES Boost::${dep}) + endforeach() + if(COMPONENT STREQUAL "thread") + list(APPEND _Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES Threads::Threads) + endif() + set_target_properties(Boost::${COMPONENT} PROPERTIES + INTERFACE_LINK_LIBRARIES "${_Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES}") + endif() + if(_Boost_${UPPERCOMPONENT}_COMPILER_FEATURES) + set_target_properties(Boost::${COMPONENT} PROPERTIES + INTERFACE_COMPILE_FEATURES "${_Boost_${UPPERCOMPONENT}_COMPILER_FEATURES}") + endif() + endif() + endif() + endforeach() +endif() + +# ------------------------------------------------------------------------ +# Notification to end user about what was found +# ------------------------------------------------------------------------ + +set(Boost_LIBRARIES "") +if(Boost_FOUND) + if(NOT Boost_FIND_QUIETLY) + message(STATUS "Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + if(Boost_FIND_COMPONENTS) + message(STATUS "Found the following Boost libraries:") + endif() + endif() + foreach( COMPONENT ${Boost_FIND_COMPONENTS} ) + string( TOUPPER ${COMPONENT} UPPERCOMPONENT ) + if( Boost_${UPPERCOMPONENT}_FOUND ) + if(NOT Boost_FIND_QUIETLY) + message (STATUS " ${COMPONENT}") + endif() + list(APPEND Boost_LIBRARIES ${Boost_${UPPERCOMPONENT}_LIBRARY}) + if(COMPONENT STREQUAL "thread") + list(APPEND Boost_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) + endif() + endif() + endforeach() +else() + if(Boost_FIND_REQUIRED) + message(SEND_ERROR "Unable to find the requested Boost libraries.\n${Boost_ERROR_REASON}") + else() + if(NOT Boost_FIND_QUIETLY) + # we opt not to automatically output Boost_ERROR_REASON here as + # it could be quite lengthy and somewhat imposing in its requests + # Since Boost is not always a required dependency we'll leave this + # up to the end-user. + if(Boost_DEBUG OR Boost_DETAILED_FAILURE_MSG) + message(STATUS "Could NOT find Boost\n${Boost_ERROR_REASON}") + else() + message(STATUS "Could NOT find Boost") + endif() + endif() + endif() +endif() + +# Configure display of cache entries in GUI. +foreach(v BOOSTROOT BOOST_ROOT ${_Boost_VARS_INC} ${_Boost_VARS_LIB}) + get_property(_type CACHE ${v} PROPERTY TYPE) + if(_type) + set_property(CACHE ${v} PROPERTY ADVANCED 1) + if("x${_type}" STREQUAL "xUNINITIALIZED") + if("x${v}" STREQUAL "xBoost_ADDITIONAL_VERSIONS") + set_property(CACHE ${v} PROPERTY TYPE STRING) + else() + set_property(CACHE ${v} PROPERTY TYPE PATH) + endif() + endif() + endif() +endforeach() + +# Record last used values of input variables so we can +# detect on the next run if the user changed them. +foreach(v + ${_Boost_VARS_INC} ${_Boost_VARS_LIB} + ${_Boost_VARS_DIR} ${_Boost_VARS_NAME} + ) + if(DEFINED ${v}) + set(_${v}_LAST "${${v}}" CACHE INTERNAL "Last used ${v} value.") + else() + unset(_${v}_LAST CACHE) + endif() +endforeach() + +# Maintain a persistent list of components requested anywhere since +# the last flush. +set(_Boost_COMPONENTS_SEARCHED "${_Boost_COMPONENTS_SEARCHED}") +list(APPEND _Boost_COMPONENTS_SEARCHED ${Boost_FIND_COMPONENTS}) +list(REMOVE_DUPLICATES _Boost_COMPONENTS_SEARCHED) +list(SORT _Boost_COMPONENTS_SEARCHED) +set(_Boost_COMPONENTS_SEARCHED "${_Boost_COMPONENTS_SEARCHED}" + CACHE INTERNAL "Components requested for this build tree.") + +# Restore project's policies +cmake_policy(POP) diff --git a/cmake/FindOpenBabel2.cmake b/cmake/FindOpenBabel2.cmake new file mode 100644 index 0000000..1d96226 --- /dev/null +++ b/cmake/FindOpenBabel2.cmake @@ -0,0 +1,98 @@ +# - Try to find OpenBabel2 +# Once done this will define +# +# OPENBABEL2_FOUND - system has OpenBabel2 +# OPENBABEL2_INCLUDE_DIR - the OpenBabel2 include directory +# OPENBABEL2_LIBRARIES - Link these to use OpenBabel2 +# +# Copyright (c) 2006, 2007 Carsten Niehaus, +# Copyright (C) 2008 Marcus D. Hanwell +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# +# Modified 2018 by Jakob Lykke Andersen, +# Defines the library target OpenBabel::OpenBabel +# Sets OpenBabel2_FOUND as this is proper case for the name. + +if(OPENBABEL2_INCLUDE_DIR AND OPENBABEL2_LIBRARIES AND OPENBABEL2_VERSION_MET) + # in cache already + set(OPENBABEL2_FOUND TRUE) +else() + if(NOT WIN32) + # Use the newer PkgConfig stuff + find_package(PkgConfig REQUIRED) + pkg_check_modules(OPENBABEL2 openbabel-2.0>=${OpenBabel2_FIND_VERSION}) + + # Maintain backwards compatibility with previous version of module + if(OPENBABEL2_FOUND STREQUAL "1") + set(OPENBABEL2_VERSION_MET TRUE) + set(OPENBABEL2_INCLUDE_DIR ${OPENBABEL2_INCLUDE_DIRS}) + endif() + else() + set(OPENBABEL2_VERSION_MET TRUE) + endif() + + if(OPENBABEL2_VERSION_MET) + if(WIN32) + if(NOT OPENBABEL2_INCLUDE_DIR) + find_path(OPENBABEL2_INCLUDE_DIR openbabel-2.0/openbabel/obconversion.h + PATHS + ${_obIncDir} + ${GNUWIN32_DIR}/include + $ENV{OPENBABEL2_INCLUDE_DIR}) + if(OPENBABEL2_INCLUDE_DIR) + set(OPENBABEL2_INCLUDE_DIR ${OPENBABEL2_INCLUDE_DIR}/openbabel-2.0) + endif() + endif() + endif() + + find_library(OPENBABEL2_LIBRARIES NAMES openbabel openbabel-2 + PATHS + ${_obLinkDir} + ${GNUWIN32_DIR}/lib + $ENV{OPENBABEL2_LIBRARIES}) + endif() + + if(OPENBABEL2_INCLUDE_DIR AND OPENBABEL2_LIBRARIES AND OPENBABEL2_VERSION_MET) + set(OPENBABEL2_FOUND TRUE) + endif() + + if(OPENBABEL2_FOUND) + if(NOT OpenBabel2_FIND_QUIETLY) + message(STATUS "Found OpenBabel ${OpenBabel2_FIND_VERSION} or later: ${OPENBABEL2_LIBRARIES}") + endif() + else(OPENBABEL2_FOUND) + if(OpenBabel2_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find OpenBabel ${OpenBabel2_FIND_VERSION} or later." + "\nAdd an appropriate pkg-config path to CMAKE_PREFIX_PATH." + "\nCMAKE_PREFIX_PATH currently is: ${CMAKE_PREFIX_PATH}") + endif() + endif() + + mark_as_advanced(OPENBABEL2_INCLUDE_DIR OPENBABEL2_LIBRARIES) +endif() + +# Search for Open Babel2 executable +if(OPENBABEL2_EXECUTABLE) + # in cache already + set(OPENBABEL2_EXECUTABLE_FOUND TRUE) +else() + find_program(OPENBABEL2_EXECUTABLE NAMES babel + PATHS + [HKEY_CURRENT_USER\\SOFTWARE\\OpenBabel\ 2.2.0] + $ENV{OPENBABEL2_EXECUTABLE}) + if(OPENBABEL2_EXECUTABLE) + set(OPENBABEL2_EXECUTABLE_FOUND TRUE) + endif() + if(OPENBABEL2_EXECUTABLE_FOUND) + message(STATUS "Found OpenBabel2 executable: ${OPENBABEL2_EXECUTABLE}") + endif() +endif() + +if(OPENBABEL2_FOUND) + add_library(OpenBabel::OpenBabel SHARED IMPORTED) + set_target_properties(OpenBabel::OpenBabel PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES ${OPENBABEL2_INCLUDE_DIR} + IMPORTED_LOCATION ${OPENBABEL2_LINK_LIBRARIES}) +endif() +set(OpenBabel2_FOUND ${OPENBABEL2_FOUND}) \ No newline at end of file diff --git a/cmake/FindPackageHandleStandardArgs.cmake b/cmake/FindPackageHandleStandardArgs.cmake new file mode 100644 index 0000000..1722d6a --- /dev/null +++ b/cmake/FindPackageHandleStandardArgs.cmake @@ -0,0 +1,386 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPackageHandleStandardArgs +----------------------------- + +This module provides a function intended to be used in :ref:`Find Modules` +implementing :command:`find_package()` calls. It handles the +``REQUIRED``, ``QUIET`` and version-related arguments of ``find_package``. +It also sets the ``_FOUND`` variable. The package is +considered found if all variables listed contain valid results, e.g. +valid filepaths. + +.. command:: find_package_handle_standard_args + + There are two signatures:: + + find_package_handle_standard_args( + (DEFAULT_MSG|) + ... + ) + + find_package_handle_standard_args( + [FOUND_VAR ] + [REQUIRED_VARS ...] + [VERSION_VAR ] + [HANDLE_COMPONENTS] + [CONFIG_MODE] + [FAIL_MESSAGE ] + ) + + The ``_FOUND`` variable will be set to ``TRUE`` if all + the variables ``...`` are valid and any optional + constraints are satisfied, and ``FALSE`` otherwise. A success or + failure message may be displayed based on the results and on + whether the ``REQUIRED`` and/or ``QUIET`` option was given to + the :command:`find_package` call. + + The options are: + + ``(DEFAULT_MSG|)`` + In the simple signature this specifies the failure message. + Use ``DEFAULT_MSG`` to ask for a default message to be computed + (recommended). Not valid in the full signature. + + ``FOUND_VAR `` + Obsolete. Specifies either ``_FOUND`` or + ``_FOUND`` as the result variable. This exists only + for compatibility with older versions of CMake and is now ignored. + Result variables of both names are always set for compatibility. + + ``REQUIRED_VARS ...`` + Specify the variables which are required for this package. + These may be named in the generated failure message asking the + user to set the missing variable values. Therefore these should + typically be cache entries such as ``FOO_LIBRARY`` and not output + variables like ``FOO_LIBRARIES``. + + ``VERSION_VAR `` + Specify the name of a variable that holds the version of the package + that has been found. This version will be checked against the + (potentially) specified required version given to the + :command:`find_package` call, including its ``EXACT`` option. + The default messages include information about the required + version and the version which has been actually found, both + if the version is ok or not. + + ``HANDLE_COMPONENTS`` + Enable handling of package components. In this case, the command + will report which components have been found and which are missing, + and the ``_FOUND`` variable will be set to ``FALSE`` + if any of the required components (i.e. not the ones listed after + the ``OPTIONAL_COMPONENTS`` option of :command:`find_package`) are + missing. + + ``CONFIG_MODE`` + Specify that the calling find module is a wrapper around a + call to ``find_package( NO_MODULE)``. This implies + a ``VERSION_VAR`` value of ``_VERSION``. The command + will automatically check whether the package configuration file + was found. + + ``FAIL_MESSAGE `` + Specify a custom failure message instead of using the default + generated message. Not recommended. + +Example for the simple signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibXml2 DEFAULT_MSG + LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) + +The ``LibXml2`` package is considered to be found if both +``LIBXML2_LIBRARY`` and ``LIBXML2_INCLUDE_DIR`` are valid. +Then also ``LibXml2_FOUND`` is set to ``TRUE``. If it is not found +and ``REQUIRED`` was used, it fails with a +:command:`message(FATAL_ERROR)`, independent whether ``QUIET`` was +used or not. If it is found, success will be reported, including +the content of the first ````. On repeated CMake runs, +the same message will not be printed again. + +Example for the full signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibArchive + REQUIRED_VARS LibArchive_LIBRARY LibArchive_INCLUDE_DIR + VERSION_VAR LibArchive_VERSION) + +In this case, the ``LibArchive`` package is considered to be found if +both ``LibArchive_LIBRARY`` and ``LibArchive_INCLUDE_DIR`` are valid. +Also the version of ``LibArchive`` will be checked by using the version +contained in ``LibArchive_VERSION``. Since no ``FAIL_MESSAGE`` is given, +the default messages will be printed. + +Another example for the full signature: + +.. code-block:: cmake + + find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4) + find_package_handle_standard_args(Automoc4 CONFIG_MODE) + +In this case, a ``FindAutmoc4.cmake`` module wraps a call to +``find_package(Automoc4 NO_MODULE)`` and adds an additional search +directory for ``automoc4``. Then the call to +``find_package_handle_standard_args`` produces a proper success/failure +message. +#]=======================================================================] + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageMessage.cmake) + +# internal helper macro +macro(_FPHSA_FAILURE_MESSAGE _msg) + if (${_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "${_msg}") + else () + if (NOT ${_NAME}_FIND_QUIETLY) + message(STATUS "${_msg}") + endif () + endif () +endmacro() + + +# internal helper macro to generate the failure message when used in CONFIG_MODE: +macro(_FPHSA_HANDLE_FAILURE_CONFIG_MODE) + # _CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found: + if(${_NAME}_CONFIG) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing:${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})") + else() + # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version. + # List them all in the error message: + if(${_NAME}_CONSIDERED_CONFIGS) + set(configsText "") + list(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount) + math(EXPR configsCount "${configsCount} - 1") + foreach(currentConfigIndex RANGE ${configsCount}) + list(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename) + list(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version) + string(APPEND configsText " ${filename} (version ${version})\n") + endforeach() + if (${_NAME}_NOT_FOUND_MESSAGE) + string(APPEND configsText " Reason given by package: ${${_NAME}_NOT_FOUND_MESSAGE}\n") + endif() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\n${configsText}") + + else() + # Simple case: No Config-file was found at all: + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}") + endif() + endif() +endmacro() + + +function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG) + +# Set up the arguments for `cmake_parse_arguments`. + set(options CONFIG_MODE HANDLE_COMPONENTS) + set(oneValueArgs FAIL_MESSAGE VERSION_VAR FOUND_VAR) + set(multiValueArgs REQUIRED_VARS) + +# Check whether we are in 'simple' or 'extended' mode: + set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} ) + list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX) + + if(${INDEX} EQUAL -1) + set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG}) + set(FPHSA_REQUIRED_VARS ${ARGN}) + set(FPHSA_VERSION_VAR) + else() + cmake_parse_arguments(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN}) + + if(FPHSA_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"") + endif() + + if(NOT FPHSA_FAIL_MESSAGE) + set(FPHSA_FAIL_MESSAGE "DEFAULT_MSG") + endif() + + # In config-mode, we rely on the variable _CONFIG, which is set by find_package() + # when it successfully found the config-file, including version checking: + if(FPHSA_CONFIG_MODE) + list(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG) + list(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS) + set(FPHSA_VERSION_VAR ${_NAME}_VERSION) + endif() + + if(NOT FPHSA_REQUIRED_VARS) + message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()") + endif() + endif() + +# now that we collected all arguments, process them + + if("x${FPHSA_FAIL_MESSAGE}" STREQUAL "xDEFAULT_MSG") + set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}") + endif() + + list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR) + + string(TOUPPER ${_NAME} _NAME_UPPER) + string(TOLOWER ${_NAME} _NAME_LOWER) + + if(FPHSA_FOUND_VAR) + if(FPHSA_FOUND_VAR MATCHES "^${_NAME}_FOUND$" OR FPHSA_FOUND_VAR MATCHES "^${_NAME_UPPER}_FOUND$") + set(_FOUND_VAR ${FPHSA_FOUND_VAR}) + else() + message(FATAL_ERROR "The argument for FOUND_VAR is \"${FPHSA_FOUND_VAR}\", but only \"${_NAME}_FOUND\" and \"${_NAME_UPPER}_FOUND\" are valid names.") + endif() + else() + set(_FOUND_VAR ${_NAME_UPPER}_FOUND) + endif() + + # collect all variables which were not found, so they can be printed, so the + # user knows better what went wrong (#6375) + set(MISSING_VARS "") + set(DETAILS "") + # check if all passed variables are valid + set(FPHSA_FOUND_${_NAME} TRUE) + foreach(_CURRENT_VAR ${FPHSA_REQUIRED_VARS}) + if(NOT ${_CURRENT_VAR}) + set(FPHSA_FOUND_${_NAME} FALSE) + string(APPEND MISSING_VARS " ${_CURRENT_VAR}") + else() + string(APPEND DETAILS "[${${_CURRENT_VAR}}]") + endif() + endforeach() + if(FPHSA_FOUND_${_NAME}) + set(${_NAME}_FOUND TRUE) + set(${_NAME_UPPER}_FOUND TRUE) + else() + set(${_NAME}_FOUND FALSE) + set(${_NAME_UPPER}_FOUND FALSE) + endif() + + # component handling + unset(FOUND_COMPONENTS_MSG) + unset(MISSING_COMPONENTS_MSG) + + if(FPHSA_HANDLE_COMPONENTS) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(${_NAME}_${comp}_FOUND) + + if(NOT DEFINED FOUND_COMPONENTS_MSG) + set(FOUND_COMPONENTS_MSG "found components: ") + endif() + string(APPEND FOUND_COMPONENTS_MSG " ${comp}") + + else() + + if(NOT DEFINED MISSING_COMPONENTS_MSG) + set(MISSING_COMPONENTS_MSG "missing components: ") + endif() + string(APPEND MISSING_COMPONENTS_MSG " ${comp}") + + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + string(APPEND MISSING_VARS " ${comp}") + endif() + + endif() + endforeach() + set(COMPONENT_MSG "${FOUND_COMPONENTS_MSG} ${MISSING_COMPONENTS_MSG}") + string(APPEND DETAILS "[c${COMPONENT_MSG}]") + endif() + + # version handling: + set(VERSION_MSG "") + set(VERSION_OK TRUE) + + # check with DEFINED here as the requested or found version may be "0" + if (DEFINED ${_NAME}_FIND_VERSION) + if(DEFINED ${FPHSA_VERSION_VAR}) + set(_FOUND_VERSION ${${FPHSA_VERSION_VAR}}) + + if(${_NAME}_FIND_VERSION_EXACT) # exact version required + # count the dots in the version string + string(REGEX REPLACE "[^.]" "" _VERSION_DOTS "${_FOUND_VERSION}") + # add one dot because there is one dot more than there are components + string(LENGTH "${_VERSION_DOTS}." _VERSION_DOTS) + if (_VERSION_DOTS GREATER ${_NAME}_FIND_VERSION_COUNT) + # Because of the C++ implementation of find_package() ${_NAME}_FIND_VERSION_COUNT + # is at most 4 here. Therefore a simple lookup table is used. + if (${_NAME}_FIND_VERSION_COUNT EQUAL 1) + set(_VERSION_REGEX "[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 2) + set(_VERSION_REGEX "[^.]*\\.[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 3) + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*") + else () + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*\\.[^.]*") + endif () + string(REGEX REPLACE "^(${_VERSION_REGEX})\\..*" "\\1" _VERSION_HEAD "${_FOUND_VERSION}") + unset(_VERSION_REGEX) + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _VERSION_HEAD) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + unset(_VERSION_HEAD) + else () + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + endif () + unset(_VERSION_DOTS) + + else() # minimum version specified: + if (${_NAME}_FIND_VERSION VERSION_GREATER _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable version \"${_FOUND_VERSION}\", minimum required is \"${${_NAME}_FIND_VERSION}\")") + endif () + endif() + + else() + + # if the package was not found, but a version was given, add that to the output: + if(${_NAME}_FIND_VERSION_EXACT) + set(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")") + else() + set(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")") + endif() + + endif() + else () + # Check with DEFINED as the found version may be 0. + if(DEFINED ${FPHSA_VERSION_VAR}) + set(VERSION_MSG "(found version \"${${FPHSA_VERSION_VAR}}\")") + endif() + endif () + + if(VERSION_OK) + string(APPEND DETAILS "[v${${FPHSA_VERSION_VAR}}(${${_NAME}_FIND_VERSION})]") + else() + set(${_NAME}_FOUND FALSE) + endif() + + + # print the result: + if (${_NAME}_FOUND) + FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG} ${COMPONENT_MSG}" "${DETAILS}") + else () + + if(FPHSA_CONFIG_MODE) + _FPHSA_HANDLE_FAILURE_CONFIG_MODE() + else() + if(NOT VERSION_OK) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})") + else() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing:${MISSING_VARS}) ${VERSION_MSG}") + endif() + endif() + + endif () + + set(${_NAME}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) + set(${_NAME_UPPER}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) +endfunction() diff --git a/cmake/FindPackageMessage.cmake b/cmake/FindPackageMessage.cmake new file mode 100644 index 0000000..0628b98 --- /dev/null +++ b/cmake/FindPackageMessage.cmake @@ -0,0 +1,48 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPackageMessage +------------------ + +.. code-block:: cmake + + find_package_message( "message for user" "find result details") + +This function is intended to be used in FindXXX.cmake modules files. +It will print a message once for each unique find result. This is +useful for telling the user where a package was found. The first +argument specifies the name (XXX) of the package. The second argument +specifies the message to display. The third argument lists details +about the find result so that if they change the message will be +displayed again. The macro also obeys the QUIET argument to the +find_package command. + +Example: + +.. code-block:: cmake + + if(X11_FOUND) + find_package_message(X11 "Found X11: ${X11_X11_LIB}" + "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]") + else() + ... + endif() +#]=======================================================================] + +function(find_package_message pkg msg details) + # Avoid printing a message repeatedly for the same find result. + if(NOT ${pkg}_FIND_QUIETLY) + string(REPLACE "\n" "" details "${details}") + set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg}) + if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}") + # The message has not yet been printed. + message(STATUS "${msg}") + + # Save the find details in the cache to avoid printing the same + # message again. + set("${DETAILS_VAR}" "${details}" + CACHE INTERNAL "Details about finding ${pkg}") + endif() + endif() +endfunction() diff --git a/cmake/FindPkgConfig.cmake b/cmake/FindPkgConfig.cmake new file mode 100644 index 0000000..06beb7d --- /dev/null +++ b/cmake/FindPkgConfig.cmake @@ -0,0 +1,716 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[========================================[.rst: +FindPkgConfig +------------- + +A ``pkg-config`` module for CMake. + +Finds the ``pkg-config`` executable and adds the :command:`pkg_get_variable`, +:command:`pkg_check_modules` and :command:`pkg_search_module` commands. The +following variables will also be set:: + + PKG_CONFIG_FOUND ... if pkg-config executable was found + PKG_CONFIG_EXECUTABLE ... pathname of the pkg-config program + PKG_CONFIG_VERSION_STRING ... the version of the pkg-config program found + (since CMake 2.8.8) + +#]========================================] + +### Common stuff #### +set(PKG_CONFIG_VERSION 1) + +# find pkg-config, use PKG_CONFIG if set +if((NOT PKG_CONFIG_EXECUTABLE) AND (NOT "$ENV{PKG_CONFIG}" STREQUAL "")) + set(PKG_CONFIG_EXECUTABLE "$ENV{PKG_CONFIG}" CACHE FILEPATH "pkg-config executable") +endif() +find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable") +mark_as_advanced(PKG_CONFIG_EXECUTABLE) + +if (PKG_CONFIG_EXECUTABLE) + execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --version + OUTPUT_VARIABLE PKG_CONFIG_VERSION_STRING + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +endif () + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +find_package_handle_standard_args(PkgConfig + REQUIRED_VARS PKG_CONFIG_EXECUTABLE + VERSION_VAR PKG_CONFIG_VERSION_STRING) + +# This is needed because the module name is "PkgConfig" but the name of +# this variable has always been PKG_CONFIG_FOUND so this isn't automatically +# handled by FPHSA. +set(PKG_CONFIG_FOUND "${PKGCONFIG_FOUND}") + +# Unsets the given variables +macro(_pkgconfig_unset var) + set(${var} "" CACHE INTERNAL "") +endmacro() + +macro(_pkgconfig_set var value) + set(${var} ${value} CACHE INTERNAL "") +endmacro() + +# Invokes pkgconfig, cleans up the result and sets variables +macro(_pkgconfig_invoke _pkglist _prefix _varname _regexp) + set(_pkgconfig_invoke_result) + + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${ARGN} ${_pkglist} + OUTPUT_VARIABLE _pkgconfig_invoke_result + RESULT_VARIABLE _pkgconfig_failed + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if (_pkgconfig_failed) + set(_pkgconfig_${_varname} "") + _pkgconfig_unset(${_prefix}_${_varname}) + else() + string(REGEX REPLACE "[\r\n]" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + + if (NOT ${_regexp} STREQUAL "") + string(REGEX REPLACE "${_regexp}" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + endif() + + separate_arguments(_pkgconfig_invoke_result) + + #message(STATUS " ${_varname} ... ${_pkgconfig_invoke_result}") + set(_pkgconfig_${_varname} ${_pkgconfig_invoke_result}) + _pkgconfig_set(${_prefix}_${_varname} "${_pkgconfig_invoke_result}") + endif() +endmacro() + +#[========================================[.rst: +.. command:: pkg_get_variable + + Retrieves the value of a pkg-config variable ``varName`` and stores it in the + result variable ``resultVar`` in the calling scope. :: + + pkg_get_variable( ) + + If ``pkg-config`` returns multiple values for the specified variable, + ``resultVar`` will contain a :ref:`;-list `. + + For example: + + .. code-block:: cmake + + pkg_get_variable(GI_GIRDIR gobject-introspection-1.0 girdir) +#]========================================] +function (pkg_get_variable result pkg variable) + _pkgconfig_invoke("${pkg}" "prefix" "result" "" "--variable=${variable}") + set("${result}" + "${prefix_result}" + PARENT_SCOPE) +endfunction () + +# Invokes pkgconfig two times; once without '--static' and once with +# '--static' +macro(_pkgconfig_invoke_dyn _pkglist _prefix _varname cleanup_regexp) + _pkgconfig_invoke("${_pkglist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN}) + _pkgconfig_invoke("${_pkglist}" ${_prefix} STATIC_${_varname} "${cleanup_regexp}" --static ${ARGN}) +endmacro() + +# Splits given arguments into options and a package list +macro(_pkgconfig_parse_options _result _is_req _is_silent _no_cmake_path _no_cmake_environment_path _imp_target _imp_target_global) + set(${_is_req} 0) + set(${_is_silent} 0) + set(${_no_cmake_path} 0) + set(${_no_cmake_environment_path} 0) + set(${_imp_target} 0) + set(${_imp_target_global} 0) + if(DEFINED PKG_CONFIG_USE_CMAKE_PREFIX_PATH) + if(NOT PKG_CONFIG_USE_CMAKE_PREFIX_PATH) + set(${_no_cmake_path} 1) + set(${_no_cmake_environment_path} 1) + endif() + elseif(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 3.1) + set(${_no_cmake_path} 1) + set(${_no_cmake_environment_path} 1) + endif() + + foreach(_pkg ${ARGN}) + if (_pkg STREQUAL "REQUIRED") + set(${_is_req} 1) + endif () + if (_pkg STREQUAL "QUIET") + set(${_is_silent} 1) + endif () + if (_pkg STREQUAL "NO_CMAKE_PATH") + set(${_no_cmake_path} 1) + endif() + if (_pkg STREQUAL "NO_CMAKE_ENVIRONMENT_PATH") + set(${_no_cmake_environment_path} 1) + endif() + if (_pkg STREQUAL "IMPORTED_TARGET") + set(${_imp_target} 1) + endif() + if (_pkg STREQUAL "GLOBAL") + set(${_imp_target_global} 1) + endif() + endforeach() + + if (${_imp_target_global} AND NOT ${_imp_target}) + message(SEND_ERROR "the argument GLOBAL may only be used together with IMPORTED_TARGET") + endif() + + set(${_result} ${ARGN}) + list(REMOVE_ITEM ${_result} "REQUIRED") + list(REMOVE_ITEM ${_result} "QUIET") + list(REMOVE_ITEM ${_result} "NO_CMAKE_PATH") + list(REMOVE_ITEM ${_result} "NO_CMAKE_ENVIRONMENT_PATH") + list(REMOVE_ITEM ${_result} "IMPORTED_TARGET") + list(REMOVE_ITEM ${_result} "GLOBAL") +endmacro() + +# Add the content of a variable or an environment variable to a list of +# paths +# Usage: +# - _pkgconfig_add_extra_path(_extra_paths VAR) +# - _pkgconfig_add_extra_path(_extra_paths ENV VAR) +function(_pkgconfig_add_extra_path _extra_paths_var _var) + set(_is_env 0) + if(ARGC GREATER 2 AND _var STREQUAL "ENV") + set(_var ${ARGV2}) + set(_is_env 1) + endif() + if(NOT _is_env) + if(NOT "${${_var}}" STREQUAL "") + list(APPEND ${_extra_paths_var} ${${_var}}) + endif() + else() + if(NOT "$ENV{${_var}}" STREQUAL "") + file(TO_CMAKE_PATH "$ENV{${_var}}" _path) + list(APPEND ${_extra_paths_var} ${_path}) + unset(_path) + endif() + endif() + set(${_extra_paths_var} ${${_extra_paths_var}} PARENT_SCOPE) +endfunction() + +# scan the LDFLAGS returned by pkg-config for library directories and +# libraries, figure out the absolute paths of that libraries in the +# given directories +function(_pkg_find_libs _prefix _no_cmake_path _no_cmake_environment_path) + unset(_libs) + unset(_find_opts) + + # set the options that are used as long as the .pc file does not provide a library + # path to look into + if(_no_cmake_path) + list(APPEND _find_opts "NO_CMAKE_PATH") + endif() + if(_no_cmake_environment_path) + list(APPEND _find_opts "NO_CMAKE_ENVIRONMENT_PATH") + endif() + + unset(_search_paths) + foreach (flag IN LISTS ${_prefix}_LDFLAGS) + if (flag MATCHES "^-L(.*)") + list(APPEND _search_paths ${CMAKE_MATCH_1}) + continue() + endif() + if (flag MATCHES "^-l(.*)") + set(_pkg_search "${CMAKE_MATCH_1}") + else() + continue() + endif() + + if(_search_paths) + # Firstly search in -L paths + find_library(pkgcfg_lib_${_prefix}_${_pkg_search} + NAMES ${_pkg_search} + HINTS ${_search_paths} NO_DEFAULT_PATH) + endif() + find_library(pkgcfg_lib_${_prefix}_${_pkg_search} + NAMES ${_pkg_search} + ${_find_opts}) + list(APPEND _libs "${pkgcfg_lib_${_prefix}_${_pkg_search}}") + endforeach() + + set(${_prefix}_LINK_LIBRARIES "${_libs}" PARENT_SCOPE) +endfunction() + +# create an imported target from all the information returned by pkg-config +function(_pkg_create_imp_target _prefix _imp_target_global) + # only create the target if it is linkable, i.e. no executables + if (NOT TARGET PkgConfig::${_prefix} + AND ( ${_prefix}_INCLUDE_DIRS OR ${_prefix}_LINK_LIBRARIES OR ${_prefix}_CFLAGS_OTHER )) + if(${_imp_target_global}) + set(_global_opt "GLOBAL") + else() + unset(_global_opt) + endif() + add_library(PkgConfig::${_prefix} INTERFACE IMPORTED ${_global_opt}) + + if(${_prefix}_INCLUDE_DIRS) + set_property(TARGET PkgConfig::${_prefix} PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${${_prefix}_INCLUDE_DIRS}") + endif() + if(${_prefix}_LINK_LIBRARIES) + set_property(TARGET PkgConfig::${_prefix} PROPERTY + INTERFACE_LINK_LIBRARIES "${${_prefix}_LINK_LIBRARIES}") + endif() + if(${_prefix}_CFLAGS_OTHER) + set_property(TARGET PkgConfig::${_prefix} PROPERTY + INTERFACE_COMPILE_OPTIONS "${${_prefix}_CFLAGS_OTHER}") + endif() + endif() +endfunction() + +# recalculate the dynamic output +# this is a macro and not a function so the result of _pkg_find_libs is automatically propagated +macro(_pkg_recalculate _prefix _no_cmake_path _no_cmake_environment_path _imp_target _imp_target_global) + _pkg_find_libs(${_prefix} ${_no_cmake_path} ${_no_cmake_environment_path}) + if(${_imp_target}) + _pkg_create_imp_target(${_prefix} ${_imp_target_global}) + endif() +endmacro() + +### +macro(_pkg_check_modules_internal _is_required _is_silent _no_cmake_path _no_cmake_environment_path _imp_target _imp_target_global _prefix) + _pkgconfig_unset(${_prefix}_FOUND) + _pkgconfig_unset(${_prefix}_VERSION) + _pkgconfig_unset(${_prefix}_PREFIX) + _pkgconfig_unset(${_prefix}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_LIBDIR) + _pkgconfig_unset(${_prefix}_LIBS) + _pkgconfig_unset(${_prefix}_LIBS_L) + _pkgconfig_unset(${_prefix}_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_CFLAGS) + _pkgconfig_unset(${_prefix}_CFLAGS_I) + _pkgconfig_unset(${_prefix}_CFLAGS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_LIBDIR) + _pkgconfig_unset(${_prefix}_STATIC_LIBS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_L) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_I) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_OTHER) + + # create a better addressable variable of the modules and calculate its size + set(_pkg_check_modules_list ${ARGN}) + list(LENGTH _pkg_check_modules_list _pkg_check_modules_cnt) + + if(PKG_CONFIG_EXECUTABLE) + # give out status message telling checked module + if (NOT ${_is_silent}) + if (_pkg_check_modules_cnt EQUAL 1) + message(STATUS "Checking for module '${_pkg_check_modules_list}'") + else() + message(STATUS "Checking for modules '${_pkg_check_modules_list}'") + endif() + endif() + + set(_pkg_check_modules_packages) + set(_pkg_check_modules_failed) + + set(_extra_paths) + + if(NOT _no_cmake_path) + _pkgconfig_add_extra_path(_extra_paths CMAKE_PREFIX_PATH) + _pkgconfig_add_extra_path(_extra_paths CMAKE_FRAMEWORK_PATH) + _pkgconfig_add_extra_path(_extra_paths CMAKE_APPBUNDLE_PATH) + endif() + + if(NOT _no_cmake_environment_path) + _pkgconfig_add_extra_path(_extra_paths ENV CMAKE_PREFIX_PATH) + _pkgconfig_add_extra_path(_extra_paths ENV CMAKE_FRAMEWORK_PATH) + _pkgconfig_add_extra_path(_extra_paths ENV CMAKE_APPBUNDLE_PATH) + endif() + + if(NOT "${_extra_paths}" STREQUAL "") + # Save the PKG_CONFIG_PATH environment variable, and add paths + # from the CMAKE_PREFIX_PATH variables + set(_pkgconfig_path_old "$ENV{PKG_CONFIG_PATH}") + set(_pkgconfig_path "${_pkgconfig_path_old}") + if(NOT "${_pkgconfig_path}" STREQUAL "") + file(TO_CMAKE_PATH "${_pkgconfig_path}" _pkgconfig_path) + endif() + + # Create a list of the possible pkgconfig subfolder (depending on + # the system + set(_lib_dirs) + if(NOT DEFINED CMAKE_SYSTEM_NAME + OR (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU)$" + AND NOT CMAKE_CROSSCOMPILING)) + if(EXISTS "/etc/debian_version") # is this a debian system ? + if(CMAKE_LIBRARY_ARCHITECTURE) + list(APPEND _lib_dirs "lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig") + endif() + else() + # not debian, check the FIND_LIBRARY_USE_LIB32_PATHS and FIND_LIBRARY_USE_LIB64_PATHS properties + get_property(uselib32 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS) + if(uselib32 AND CMAKE_SIZEOF_VOID_P EQUAL 4) + list(APPEND _lib_dirs "lib32/pkgconfig") + endif() + get_property(uselib64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS) + if(uselib64 AND CMAKE_SIZEOF_VOID_P EQUAL 8) + list(APPEND _lib_dirs "lib64/pkgconfig") + endif() + get_property(uselibx32 GLOBAL PROPERTY FIND_LIBRARY_USE_LIBX32_PATHS) + if(uselibx32 AND CMAKE_INTERNAL_PLATFORM_ABI STREQUAL "ELF X32") + list(APPEND _lib_dirs "libx32/pkgconfig") + endif() + endif() + endif() + if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" AND NOT CMAKE_CROSSCOMPILING) + list(APPEND _lib_dirs "libdata/pkgconfig") + endif() + list(APPEND _lib_dirs "lib/pkgconfig") + list(APPEND _lib_dirs "share/pkgconfig") + + # Check if directories exist and eventually append them to the + # pkgconfig path list + foreach(_prefix_dir ${_extra_paths}) + foreach(_lib_dir ${_lib_dirs}) + if(EXISTS "${_prefix_dir}/${_lib_dir}") + list(APPEND _pkgconfig_path "${_prefix_dir}/${_lib_dir}") + list(REMOVE_DUPLICATES _pkgconfig_path) + endif() + endforeach() + endforeach() + + # Prepare and set the environment variable + if(NOT "${_pkgconfig_path}" STREQUAL "") + # remove empty values from the list + list(REMOVE_ITEM _pkgconfig_path "") + file(TO_NATIVE_PATH "${_pkgconfig_path}" _pkgconfig_path) + if(UNIX) + string(REPLACE ";" ":" _pkgconfig_path "${_pkgconfig_path}") + string(REPLACE "\\ " " " _pkgconfig_path "${_pkgconfig_path}") + endif() + set(ENV{PKG_CONFIG_PATH} "${_pkgconfig_path}") + endif() + + # Unset variables + unset(_lib_dirs) + unset(_pkgconfig_path) + endif() + + # iterate through module list and check whether they exist and match the required version + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_list}) + set(_pkg_check_modules_exist_query) + + # check whether version is given + if (_pkg_check_modules_pkg MATCHES "(.*[^><])(=|[><]=?)(.*)") + set(_pkg_check_modules_pkg_name "${CMAKE_MATCH_1}") + set(_pkg_check_modules_pkg_op "${CMAKE_MATCH_2}") + set(_pkg_check_modules_pkg_ver "${CMAKE_MATCH_3}") + else() + set(_pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") + set(_pkg_check_modules_pkg_op) + set(_pkg_check_modules_pkg_ver) + endif() + + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_VERSION) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_PREFIX) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_LIBDIR) + + list(APPEND _pkg_check_modules_packages "${_pkg_check_modules_pkg_name}") + + # create the final query which is of the format: + # * > + # * >= + # * = + # * <= + # * < + # * --exists + list(APPEND _pkg_check_modules_exist_query --print-errors --short-errors) + if (_pkg_check_modules_pkg_op) + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_name} ${_pkg_check_modules_pkg_op} ${_pkg_check_modules_pkg_ver}") + else() + list(APPEND _pkg_check_modules_exist_query --exists) + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_name}") + endif() + + # execute the query + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${_pkg_check_modules_exist_query} + RESULT_VARIABLE _pkgconfig_retval + ERROR_VARIABLE _pkgconfig_error + ERROR_STRIP_TRAILING_WHITESPACE) + + # evaluate result and tell failures + if (_pkgconfig_retval) + if(NOT ${_is_silent}) + message(STATUS " ${_pkgconfig_error}") + endif() + + set(_pkg_check_modules_failed 1) + endif() + endforeach() + + if(_pkg_check_modules_failed) + # fail when requested + if (${_is_required}) + message(FATAL_ERROR "A required package was not found") + endif () + else() + # when we are here, we checked whether requested modules + # exist. Now, go through them and set variables + + _pkgconfig_set(${_prefix}_FOUND 1) + list(LENGTH _pkg_check_modules_packages pkg_count) + + # iterate through all modules again and set individual variables + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_packages}) + # handle case when there is only one package required + if (pkg_count EQUAL 1) + set(_pkg_check_prefix "${_prefix}") + else() + set(_pkg_check_prefix "${_prefix}_${_pkg_check_modules_pkg}") + endif() + + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" VERSION "" --modversion ) + pkg_get_variable("${_pkg_check_prefix}_PREFIX" ${_pkg_check_modules_pkg} "prefix") + pkg_get_variable("${_pkg_check_prefix}_INCLUDEDIR" ${_pkg_check_modules_pkg} "includedir") + pkg_get_variable("${_pkg_check_prefix}_LIBDIR" ${_pkg_check_modules_pkg} "libdir") + foreach (variable IN ITEMS PREFIX INCLUDEDIR LIBDIR) + _pkgconfig_set("${_pkg_check_prefix}_${variable}" "${${_pkg_check_prefix}_${variable}}") + endforeach () + + if (NOT ${_is_silent}) + message(STATUS " Found ${_pkg_check_modules_pkg}, version ${_pkgconfig_VERSION}") + endif () + endforeach() + + # set variables which are combined for multiple modules + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARIES "(^| )-l" --libs-only-l ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARY_DIRS "(^| )-L" --libs-only-L ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS "" --libs ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS_OTHER "" --libs-only-other ) + + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" INCLUDE_DIRS "(^| )-I" --cflags-only-I ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS "" --cflags ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS_OTHER "" --cflags-only-other ) + + _pkg_recalculate("${_prefix}" ${_no_cmake_path} ${_no_cmake_environment_path} ${_imp_target} ${_imp_target_global}) + endif() + + if(NOT "${_extra_paths}" STREQUAL "") + # Restore the environment variable + set(ENV{PKG_CONFIG_PATH} "${_pkgconfig_path_old}") + endif() + + unset(_extra_paths) + unset(_pkgconfig_path_old) + else() + if (${_is_required}) + message(SEND_ERROR "pkg-config tool not found") + endif () + endif() +endmacro() + + +#[========================================[.rst: +.. command:: pkg_check_modules + + Checks for all the given modules, setting a variety of result variables in + the calling scope. :: + + pkg_check_modules( + [REQUIRED] [QUIET] + [NO_CMAKE_PATH] + [NO_CMAKE_ENVIRONMENT_PATH] + [IMPORTED_TARGET [GLOBAL]] + [...]) + + When the ``REQUIRED`` argument is given, the command will fail with an error + if module(s) could not be found. + + When the ``QUIET`` argument is given, no status messages will be printed. + + By default, if :variable:`CMAKE_MINIMUM_REQUIRED_VERSION` is 3.1 or + later, or if :variable:`PKG_CONFIG_USE_CMAKE_PREFIX_PATH` is set to a + boolean ``True`` value, then the :variable:`CMAKE_PREFIX_PATH`, + :variable:`CMAKE_FRAMEWORK_PATH`, and :variable:`CMAKE_APPBUNDLE_PATH` cache + and environment variables will be added to the ``pkg-config`` search path. + The ``NO_CMAKE_PATH`` and ``NO_CMAKE_ENVIRONMENT_PATH`` arguments + disable this behavior for the cache variables and environment variables + respectively. + + The ``IMPORTED_TARGET`` argument will create an imported target named + ``PkgConfig::`` that can be passed directly as an argument to + :command:`target_link_libraries`. The ``GLOBAL`` argument will make the + imported target available in global scope. + + Each ```` can be either a bare module name or it can be a + module name with a version constraint (operators ``=``, ``<``, ``>``, + ``<=`` and ``>=`` are supported). The following are examples for a module + named ``foo`` with various constraints:: + + foo # Any version matches + foo<2 # Only match versions before 2 + foo>=3.1 # Match any version from 3.1 or later + foo=1.2.3 # Foo must be exactly version 1.2.3 + + The following variables may be set upon return. Two sets of values exist, + one for the common case (`` = ``) and another for the + information ``pkg-config`` provides when it is called with the ``--static`` + option (`` = _STATIC``):: + + _FOUND ... set to 1 if module(s) exist + _LIBRARIES ... only the libraries (without the '-l') + _LINK_LIBRARIES ... the libraries and their absolute paths + _LIBRARY_DIRS ... the paths of the libraries (without the '-L') + _LDFLAGS ... all required linker flags + _LDFLAGS_OTHER ... all other linker flags + _INCLUDE_DIRS ... the '-I' preprocessor flags (without the '-I') + _CFLAGS ... all required cflags + _CFLAGS_OTHER ... the other compiler flags + + All but ``_FOUND`` may be a :ref:`;-list ` if the + associated variable returned from ``pkg-config`` has multiple values. + + There are some special variables whose prefix depends on the number of + ```` given. When there is only one ````, + ```` will simply be ````, but if two or more ```` + items are given, ```` will be ``_``:: + + _VERSION ... version of the module + _PREFIX ... prefix directory of the module + _INCLUDEDIR ... include directory of the module + _LIBDIR ... lib directory of the module + + Examples + + .. code-block:: cmake + + pkg_check_modules (GLIB2 glib-2.0) + + Looks for any version of glib2. If found, the output variable + ``GLIB2_VERSION`` will hold the actual version found. + + .. code-block:: cmake + + pkg_check_modules (GLIB2 glib-2.0>=2.10) + + Looks for at least version 2.10 of glib2. If found, the output variable + ``GLIB2_VERSION`` will hold the actual version found. + + .. code-block:: cmake + + pkg_check_modules (FOO glib-2.0>=2.10 gtk+-2.0) + + Looks for both glib2-2.0 (at least version 2.10) and any version of + gtk2+-2.0. Only if both are found will ``FOO`` be considered found. + The ``FOO_glib-2.0_VERSION`` and ``FOO_gtk+-2.0_VERSION`` variables will be + set to their respective found module versions. + + .. code-block:: cmake + + pkg_check_modules (XRENDER REQUIRED xrender) + + Requires any version of ``xrender``. Example output variables set by a + successful call:: + + XRENDER_LIBRARIES=Xrender;X11 + XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp +#]========================================] +macro(pkg_check_modules _prefix _module0) + _pkgconfig_parse_options(_pkg_modules _pkg_is_required _pkg_is_silent _no_cmake_path _no_cmake_environment_path _imp_target _imp_target_global "${_module0}" ${ARGN}) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION} OR NOT ${_prefix}_FOUND OR + (NOT "${ARGN}" STREQUAL "" AND NOT "${__pkg_config_arguments_${_prefix}}" STREQUAL "${_module0};${ARGN}") OR + ( "${ARGN}" STREQUAL "" AND NOT "${__pkg_config_arguments_${_prefix}}" STREQUAL "${_module0}")) + _pkg_check_modules_internal("${_pkg_is_required}" "${_pkg_is_silent}" ${_no_cmake_path} ${_no_cmake_environment_path} ${_imp_target} ${_imp_target_global} "${_prefix}" ${_pkg_modules}) + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + if (${_prefix}_FOUND) + _pkgconfig_set(__pkg_config_arguments_${_prefix} "${_module0};${ARGN}") + endif() + else() + if (${_prefix}_FOUND) + _pkg_recalculate("${_prefix}" ${_no_cmake_path} ${_no_cmake_environment_path} ${_imp_target} ${_imp_target_global}) + endif() + endif() +endmacro() + + +#[========================================[.rst: +.. command:: pkg_search_module + + The behavior of this command is the same as :command:`pkg_check_modules`, + except that rather than checking for all the specified modules, it searches + for just the first successful match. :: + + pkg_search_module( + [REQUIRED] [QUIET] + [NO_CMAKE_PATH] + [NO_CMAKE_ENVIRONMENT_PATH] + [IMPORTED_TARGET [GLOBAL]] + [...]) + + Examples + + .. code-block:: cmake + + pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2) +#]========================================] +macro(pkg_search_module _prefix _module0) + _pkgconfig_parse_options(_pkg_modules_alt _pkg_is_required _pkg_is_silent _no_cmake_path _no_cmake_environment_path _imp_target _imp_target_global "${_module0}" ${ARGN}) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION} OR NOT ${_prefix}_FOUND) + set(_pkg_modules_found 0) + + if (NOT ${_pkg_is_silent}) + message(STATUS "Checking for one of the modules '${_pkg_modules_alt}'") + endif () + + # iterate through all modules and stop at the first working one. + foreach(_pkg_alt ${_pkg_modules_alt}) + if(NOT _pkg_modules_found) + _pkg_check_modules_internal(0 1 ${_no_cmake_path} ${_no_cmake_environment_path} ${_imp_target} ${_imp_target_global} "${_prefix}" "${_pkg_alt}") + endif() + + if (${_prefix}_FOUND) + set(_pkg_modules_found 1) + endif() + endforeach() + + if (NOT ${_prefix}_FOUND) + if(${_pkg_is_required}) + message(SEND_ERROR "None of the required '${_pkg_modules_alt}' found") + endif() + endif() + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + elseif (${_prefix}_FOUND) + _pkg_recalculate("${_prefix}" ${_no_cmake_path} ${_no_cmake_environment_path} ${_imp_target} ${_imp_target_global}) + endif() +endmacro() + + +#[========================================[.rst: +Variables Affecting Behavior +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. variable:: PKG_CONFIG_EXECUTABLE + + This can be set to the path of the pkg-config executable. If not provided, + it will be set by the module as a result of calling :command:`find_program` + internally. The ``PKG_CONFIG`` environment variable can be used as a hint. + +.. variable:: PKG_CONFIG_USE_CMAKE_PREFIX_PATH + + Specifies whether :command:`pkg_check_modules` and + :command:`pkg_search_module` should add the paths in the + :variable:`CMAKE_PREFIX_PATH`, :variable:`CMAKE_FRAMEWORK_PATH` and + :variable:`CMAKE_APPBUNDLE_PATH` cache and environment variables to the + ``pkg-config`` search path. + + If this variable is not set, this behavior is enabled by default if + :variable:`CMAKE_MINIMUM_REQUIRED_VERSION` is 3.1 or later, disabled + otherwise. +#]========================================] + + +### Local Variables: +### mode: cmake +### End: diff --git a/cmake/FindPython/Support.cmake b/cmake/FindPython/Support.cmake new file mode 100644 index 0000000..e0ebb90 --- /dev/null +++ b/cmake/FindPython/Support.cmake @@ -0,0 +1,1267 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# +# This file is a "template" file used by various FindPython modules. +# + +cmake_policy (VERSION 3.7) + +# +# Initial configuration +# +if (NOT DEFINED _PYTHON_PREFIX) + message (FATAL_ERROR "FindPython: INTERNAL ERROR") +endif() +if (NOT DEFINED _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + message (FATAL_ERROR "FindPython: INTERNAL ERROR") +endif() +if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 3) + set(_${_PYTHON_PREFIX}_VERSIONS 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0) +elseif (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 2) + set(_${_PYTHON_PREFIX}_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0) +else() + message (FATAL_ERROR "FindPython: INTERNAL ERROR") +endif() + + +# +# helper commands +# +macro (_PYTHON_DISPLAY_FAILURE _PYTHON_MSG) + if (${_PYTHON_PREFIX}_FIND_REQUIRED) + message (FATAL_ERROR "${_PYTHON_MSG}") + else() + if (NOT ${_PYTHON_PREFIX}_FIND_QUIETLY) + message(STATUS "${_PYTHON_MSG}") + endif () + endif() + + set (${_PYTHON_PREFIX}_FOUND FALSE) + string (TOUPPER "${_PYTHON_PREFIX}" _${_PYTHON_PREFIX}_UPPER_PREFIX) + set (${_PYTHON_UPPER_PREFIX}_FOUND FALSE) + return() +endmacro() + + +macro (_PYTHON_FIND_FRAMEWORKS) + set (${_PYTHON_PREFIX}_FRAMEWORKS) + if (APPLE) + set (_pff_frameworks ${CMAKE_FRAMEWORK_PATH} + $ENV{CMAKE_FRAMEWORK_PATH} + ~/Library/Frameworks + /usr/local/Frameworks + ${CMAKE_SYSTEM_FRAMEWORK_PATH}) + list (REMOVE_DUPLICATES _pff_frameworks) + foreach (_pff_framework IN LISTS _pff_frameworks) + if (EXISTS ${_pff_framework}/Python.framework) + list (APPEND ${_PYTHON_PREFIX}_FRAMEWORKS ${_pff_framework}/Python.framework) + endif() + endforeach() + unset (_pff_frameworks) + unset (_pff_framework) + endif() +endmacro() + +function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS _PYTHON_VERSION) + set (_PYTHON_FRAMEWORK_PATHS) + foreach (_PYTHON_FRAMEWORK IN LISTS ${_PYTHON_PREFIX}_FRAMEWORKS) + list (APPEND _PYTHON_FRAMEWORK_PATHS + "${_PYTHON_FRAMEWORK}/Versions/${_PYTHON_VERSION}") + endforeach() + set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${_PYTHON_FRAMEWORK_PATHS} PARENT_SCOPE) +endfunction() + + +function (_PYTHON_VALIDATE_INTERPRETER) + if (NOT ${_PYTHON_PREFIX}_EXECUTABLE) + return() + endif() + + if (ARGC EQUAL 1) + set (expected_version ${ARGV0}) + else() + unset (expected_version) + endif() + + get_filename_component (python_name "${${_PYTHON_PREFIX}_EXECUTABLE}" NAME) + + if (expected_version AND NOT python_name STREQUAL "python${expected_version}${CMAKE_EXECUTABLE_SUFFIX}") + # executable found must have a specific version + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))" + RESULT_VARIABLE result + OUTPUT_VARIABLE version + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (result OR NOT version EQUAL expected_version) + # interpreter not usable or has wrong major version + set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) + return() + endif() + else() + if (NOT python_name STREQUAL "python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}${CMAKE_EXECUTABLE_SUFFIX}") + # executable found do not have version in name + # ensure major version is OK + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; sys.stdout.write(str(sys.version_info[0]))" + RESULT_VARIABLE result + OUTPUT_VARIABLE version + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (result OR NOT version EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + # interpreter not usable or has wrong major version + set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) + return() + endif() + endif() + endif() + + if (CMAKE_SIZEOF_VOID_P AND "Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND NOT CMAKE_CROSSCOMPILING) + # In this case, interpreter must have same architecture as environment + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys, struct; sys.stdout.write(str(struct.calcsize(\"P\")))" + RESULT_VARIABLE result + OUTPUT_VARIABLE size + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (result OR NOT size EQUAL CMAKE_SIZEOF_VOID_P) + # interpreter not usable or has wrong architecture + set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) + return() + endif() + endif() +endfunction() + + +function (_PYTHON_VALIDATE_COMPILER expected_version) + if (NOT ${_PYTHON_PREFIX}_COMPILER) + return() + endif() + + # retrieve python environment version from compiler + set (working_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir") + file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))\n") + execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${working_dir}/version.py" + WORKING_DIRECTORY "${working_dir}" + OUTPUT_QUIET + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process (COMMAND "${working_dir}/version" + WORKING_DIRECTORY "${working_dir}" + RESULT_VARIABLE result + OUTPUT_VARIABLE version + ERROR_QUIET) + file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}") + + if (result OR NOT version EQUAL expected_version) + # Compiler not usable or has wrong major version + set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE) + endif() +endfunction() + + +function (_PYTHON_FIND_RUNTIME_LIBRARY _PYTHON_LIB) + string (REPLACE "_RUNTIME" "" _PYTHON_LIB "${_PYTHON_LIB}") + # look at runtime part on systems supporting it + if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR + (CMAKE_SYSTEM_NAME MATCHES "MSYS|CYGWIN" + AND ${_PYTHON_LIB} MATCHES "${CMAKE_IMPORT_LIBRARY_SUFFIX}$")) + set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX}) + # MSYS has a special syntax for runtime libraries + if (CMAKE_SYSTEM_NAME MATCHES "MSYS") + list (APPEND CMAKE_FIND_LIBRARY_PREFIXES "msys-") + endif() + find_library (${ARGV}) + endif() +endfunction() + + +function (_PYTHON_SET_LIBRARY_DIRS _PYTHON_SLD_RESULT) + unset (_PYTHON_DIRS) + set (_PYTHON_LIBS ${ARGV}) + list (REMOVE_AT _PYTHON_LIBS 0) + foreach (_PYTHON_LIB IN LISTS _PYTHON_LIBS) + if (${_PYTHON_LIB}) + get_filename_component (_PYTHON_DIR "${${_PYTHON_LIB}}" DIRECTORY) + list (APPEND _PYTHON_DIRS "${_PYTHON_DIR}") + endif() + endforeach() + if (_PYTHON_DIRS) + list (REMOVE_DUPLICATES _PYTHON_DIRS) + endif() + set (${_PYTHON_SLD_RESULT} ${_PYTHON_DIRS} PARENT_SCOPE) +endfunction() + + +# If major version is specified, it must be the same as internal major version +if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR + AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Wrong major version specified is \"${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}\", but expected major version is \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"") +endif() + + +# handle components +if (NOT ${_PYTHON_PREFIX}_FIND_COMPONENTS) + set (${_PYTHON_PREFIX}_FIND_COMPONENTS Interpreter) + set (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter TRUE) +endif() +foreach (_${_PYTHON_PREFIX}_COMPONENT IN LISTS ${_PYTHON_PREFIX}_FIND_COMPONENTS) + set (${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND FALSE) +endforeach() +unset (_${_PYTHON_PREFIX}_FIND_VERSIONS) + +# Set versions to search +## default: search any version +set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSIONS}) + +if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT GREATER 1) + if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT) + set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR}) + else() + unset (_${_PYTHON_PREFIX}_FIND_VERSIONS) + # add all compatible versions + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS) + if (_${_PYTHON_PREFIX}_VERSION VERSION_GREATER_EQUAL ${_PYTHON_PREFIX}_FIND_VERSION) + list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION}) + endif() + endforeach() + endif() +endif() + +# Python and Anaconda distributions: define which architectures can be used +if (CMAKE_SIZEOF_VOID_P) + # In this case, search only for 64bit or 32bit + math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8") + set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH}) +else() + # architecture unknown, search for both 64bit and 32bit + set (_${_PYTHON_PREFIX}_ARCH 64) + set (_${_PYTHON_PREFIX}_ARCH2 32) +endif() + +# IronPython support +if (CMAKE_SIZEOF_VOID_P) + # In this case, search only for 64bit or 32bit + math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8") + set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy${_${_PYTHON_PREFIX}_ARCH} ipy) +else() + # architecture unknown, search for natural interpreter + set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy) +endif() +set (_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES net45 net40) + +# Apple frameworks handling +_python_find_frameworks () + +# Save CMAKE_FIND_APPBUNDLE +if (DEFINED CMAKE_FIND_APPBUNDLE) + set (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE}) +else() + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE) +endif() +# To avoid app bundle lookup +set (CMAKE_FIND_APPBUNDLE "NEVER") + +# Save CMAKE_FIND_FRAMEWORK +if (DEFINED CMAKE_FIND_FRAMEWORK) + set (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) + if (CMAKE_FIND_FRAMEWORK STREQUAL "ONLY") + message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: CMAKE_FIND_FRAMEWORK: 'ONLY' value is not supported. 'FIRST' will be used instead.") + set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST") + else() + set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) + endif() +else() + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) + set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST") +endif() +# To avoid framework lookup +set (CMAKE_FIND_FRAMEWORK "NEVER") + +# Windows Registry handling +if (DEFINED ${_PYTHON_PREFIX}_FIND_REGISTRY) + if (NOT ${_PYTHON_PREFIX}_FIND_REGISTRY MATCHES "^(FIRST|LAST|NEVER)$") + message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_REGISTRY}: invalid value for '${_PYTHON_PREFIX}_FIND_REGISTRY'. 'FIRST', 'LAST' or 'NEVER' expected.") + set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST") + else() + set (_${_PYTHON_PREFIX}_FIND_REGISTRY ${${_PYTHON_PREFIX}_FIND_REGISTRY}) + endif() +else() + set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST") +endif() + + +unset (_${_PYTHON_PREFIX}_REQUIRED_VARS) +unset (_${_PYTHON_PREFIX}_CACHED_VARS) + + +# first step, search for the interpreter +if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS) + if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter) + list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE) + list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_EXECUTABLE) + endif() + + set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR) + + # look-up for various versions and locations + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) + string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION}) + + _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION}) + + # Apple frameworks handling + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST") + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + NAMES_PER_DIR + PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + PATH_SUFFIXES bin + NO_CMAKE_PATH + NO_CMAKE_ENVIRONMENT_PATH + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + # Windows registry + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + # try using HINTS + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + # try using standard paths. + if (WIN32) + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR) + else() + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + NAMES_PER_DIR) + endif() + + # Apple frameworks handling + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST") + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + NAMES_PER_DIR + PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + PATH_SUFFIXES bin + NO_DEFAULT_PATH) + endif() + + # Windows registry + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST") + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR + PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_DEFAULT_PATH) + endif() + + _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION}) + if (${_PYTHON_PREFIX}_EXECUTABLE) + break() + endif() + endforeach() + + if (NOT ${_PYTHON_PREFIX}_EXECUTABLE) + # No specific version found. Retry with generic names + # try using HINTS + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + # try using standard paths. + # NAMES_PER_DIR is not defined on purpose to have a chance to find + # expected version. + # For example, typical systems have 'python' for version 2.* and 'python3' + # for version 3.*. So looking for names per dir will find, potentially, + # systematically 'python' (i.e. version 2) even if version 3 is searched. + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}) + + _python_validate_interpreter () + endif() + + # retrieve exact version of executable found + if (${_PYTHON_PREFIX}_EXECUTABLE) + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}") + list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 1 ${_PYTHON_PREFIX}_VERSION_MINOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 2 ${_PYTHON_PREFIX}_VERSION_PATCH) + else() + # Interpreter is not usable + set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) + unset (${_PYTHON_PREFIX}_VERSION) + endif() + endif() + + if (${_PYTHON_PREFIX}_EXECUTABLE + AND ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE) + # Use interpreter version for future searches to ensure consistency + set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) + endif() + + if (${_PYTHON_PREFIX}_Interpreter_FOUND) + if (NOT CMAKE_SIZEOF_VOID_P) + # determine interpreter architecture + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.maxsize > 2**32)" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE ${_PYTHON_PREFIX}_IS64BIT + ERROR_VARIABLE ${_PYTHON_PREFIX}_IS64BIT) + if (NOT _${_PYTHON_PREFIX}_RESULT) + if (${_PYTHON_PREFIX}_IS64BIT) + set (_${_PYTHON_PREFIX}_ARCH 64) + set (_${_PYTHON_PREFIX}_ARCH2 64) + else() + set (_${_PYTHON_PREFIX}_ARCH 32) + set (_${_PYTHON_PREFIX}_ARCH2 32) + endif() + endif() + endif() + + # retrieve interpreter identity + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -V + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID + ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID) + if (NOT _${_PYTHON_PREFIX}_RESULT) + if (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Anaconda") + set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda") + elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought") + set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy") + else() + string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}") + if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python") + # try to get a more precise ID + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.copyright)" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT + ERROR_QUIET) + if (${_PYTHON_PREFIX}_COPYRIGHT MATCHES "ActiveState") + set (${_PYTHON_PREFIX}_INTERPRETER_ID "ActivePython") + endif() + endif() + endif() + else() + set (${_PYTHON_PREFIX}_INTERPRETER_ID Python) + endif() + else() + unset (${_PYTHON_PREFIX}_INTERPRETER_ID) + endif() + + # retrieve various package installation directories + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig;sys.stdout.write(';'.join([sysconfig.get_python_lib(plat_specific=False,standard_lib=True),sysconfig.get_python_lib(plat_specific=True,standard_lib=True),sysconfig.get_python_lib(plat_specific=False,standard_lib=False),sysconfig.get_python_lib(plat_specific=True,standard_lib=False)]))" + + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS + ERROR_QUIET) + if (NOT _${_PYTHON_PREFIX}_RESULT) + list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB) + list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH) + list (GET _${_PYTHON_PREFIX}_LIBPATHS 2 ${_PYTHON_PREFIX}_SITELIB) + list (GET _${_PYTHON_PREFIX}_LIBPATHS 3 ${_PYTHON_PREFIX}_SITEARCH) + else() + unset (${_PYTHON_PREFIX}_STDLIB) + unset (${_PYTHON_PREFIX}_STDARCH) + unset (${_PYTHON_PREFIX}_SITELIB) + unset (${_PYTHON_PREFIX}_SITEARCH) + endif() + + mark_as_advanced (${_PYTHON_PREFIX}_EXECUTABLE) +endif() + + +# second step, search for compiler (IronPython) +if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS) + if (${_PYTHON_PREFIX}_FIND_REQUIRED_Compiler) + list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER) + list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_COMPILER) + endif() + + # IronPython specific artifacts + # If IronPython interpreter is found, use its path + unset (_${_PYTHON_PREFIX}_IRON_ROOT) + if (${_PYTHON_PREFIX}_Interpreter_FOUND AND ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython") + get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT "${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY) + endif() + + # try using root dir and registry + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) + if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_program (${_PYTHON_PREFIX}_COMPILER + NAMES ipyc + HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS} + PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + find_program (${_PYTHON_PREFIX}_COMPILER + NAMES ipyc + HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + + if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST") + find_program (${_PYTHON_PREFIX}_COMPILER + NAMES ipyc + PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_DEFAULT_PATH) + endif() + + _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION}) + if (${_PYTHON_PREFIX}_COMPILER) + break() + endif() + endforeach() + + # no specific version found, re-try in standard paths + find_program (${_PYTHON_PREFIX}_COMPILER + NAMES ipyc + HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}) + + if (${_PYTHON_PREFIX}_COMPILER) + # retrieve python environment version from compiler + set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir") + file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n") + execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" + WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}" + OUTPUT_QUIET + ERROR_QUIET) + execute_process (COMMAND "${_${_PYTHON_PREFIX}_VERSION_DIR}/version" + WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION + ERROR_QUIET) + if (NOT _${_PYTHON_PREFIX}_RESULT) + string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}") + list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH) + + if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND) + # set public version information + set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION}) + set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR}) + set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR}) + set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH}) + endif() + else() + # compiler not usable + set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE) + endif() + file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}") + endif() + + if (${_PYTHON_PREFIX}_COMPILER) + if (${_PYTHON_PREFIX}_Interpreter_FOUND) + # Compiler must be compatible with interpreter + if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) + set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE) + endif() + elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE) + # Use compiler version for future searches to ensure consistency + set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) + endif() + endif() + + if (${_PYTHON_PREFIX}_Compiler_FOUND) + set (${_PYTHON_PREFIX}_COMPILER_ID IronPython) + else() + unset (${_PYTHON_PREFIX}_COMPILER_ID) + endif() + + mark_as_advanced (${_PYTHON_PREFIX}_COMPILER) +endif() + + +# third step, search for the development artifacts +## Development environment is not compatible with IronPython interpreter +if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython") + if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development) + list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARY + ${_PYTHON_PREFIX}_INCLUDE_DIR) + list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_LIBRARY + ${_PYTHON_PREFIX}_LIBRARY_RELEASE + ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE + ${_PYTHON_PREFIX}_LIBRARY_DEBUG + ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG + ${_PYTHON_PREFIX}_INCLUDE_DIR) + endif() + + # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES) + if (DEFINED ${_PYTHON_PREFIX}_USE_STATIC_LIBS AND NOT WIN32) + set(_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(${_PYTHON_PREFIX}_USE_STATIC_LIBS) + set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX}) + else() + list (REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX}) + endif() + else() + endif() + + # if python interpreter is found, use its location and version to ensure consistency + # between interpreter and development environment + unset (_${_PYTHON_PREFIX}_PREFIX) + if (${_PYTHON_PREFIX}_Interpreter_FOUND) + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.PREFIX)" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (_${_PYTHON_PREFIX}_RESULT) + unset (_${_PYTHON_PREFIX}_PREFIX) + endif() + endif() + set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR) + + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) + string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION}) + + # try to use pythonX.Y-config tool + set (_${_PYTHON_PREFIX}_CONFIG_NAMES) + if (DEFINED CMAKE_LIBRARY_ARCHITECTURE) + set (_${_PYTHON_PREFIX}_CONFIG_NAMES "${CMAKE_LIBRARY_ARCHITECTURE}-python${_${_PYTHON_PREFIX}_VERSION}-config") + endif() + list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES "python${_${_PYTHON_PREFIX}_VERSION}-config") + find_program (_${_PYTHON_PREFIX}_CONFIG + NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin) + unset (_${_PYTHON_PREFIX}_CONFIG_NAMES) + + if (NOT _${_PYTHON_PREFIX}_CONFIG) + continue() + endif() + if (DEFINED CMAKE_LIBRARY_ARCHITECTURE) + # check that config tool match library architecture + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (_${_PYTHON_PREFIX}_RESULT) + unset (_${_PYTHON_PREFIX}_CONFIG CACHE) + continue() + endif() + string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT) + if (_${_PYTHON_PREFIX}_RESULT EQUAL -1) + unset (_${_PYTHON_PREFIX}_CONFIG CACHE) + continue() + endif() + endif() + + # retrieve root install directory + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --prefix + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (_${_PYTHON_PREFIX}_RESULT) + # python-config is not usable + unset (_${_PYTHON_PREFIX}_CONFIG CACHE) + continue() + endif() + set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR) + + # retrieve library + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + # retrieve library directory + string (REGEX MATCHALL "-L[^ ]+" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_FLAGS}") + string (REPLACE "-L" "" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_LIB_DIRS}") + list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_DIRS) + # retrieve library name + string (REGEX MATCHALL "-lpython[^ ]+" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_FLAGS}") + string (REPLACE "-l" "" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_LIB_NAMES}") + list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_NAMES) + + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} ${_${_PYTHON_PREFIX}_LIB_DIRS} + PATH_SUFFIXES lib + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + # retrieve runtime library + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE) + get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY) + _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE + NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_PATH} ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + endif() + + # retrieve include directory + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --includes + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + # retrieve include directory + string (REGEX MATCHALL "-I[^ ]+" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_FLAGS}") + string (REPLACE "-I" "" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIRS}") + list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_DIRS) + + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h + HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_INCLUDE_DIR) + break() + endif() + endforeach() + + # Rely on HINTS and standard paths if config tool failed to locate artifacts + if (NOT (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) OR NOT ${_PYTHON_PREFIX}_INCLUDE_DIR) + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) + string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION}) + + _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION}) + + set (_${_PYTHON_PREFIX}_REGISTRY_PATHS + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]) + + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST") + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} + lib/python${_${_PYTHON_PREFIX}_VERSION}/config + NO_CMAKE_PATH + NO_CMAKE_ENVIRONMENT_PATH + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} + lib/python${_${_PYTHON_PREFIX}_VERSION}/config + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + # search in HINTS locations + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} + lib/python${_${_PYTHON_PREFIX}_VERSION}/config + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST") + set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}) + else() + unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS) + endif() + + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST") + set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}) + else() + unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS) + endif() + + # search in all default paths + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + ${__${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} + lib/python${_${_PYTHON_PREFIX}_VERSION}/config) + # retrieve runtime library + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE) + get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY) + _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin) + endif() + + if (WIN32) + # search for debug library + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE) + # use library location as a hint + get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY) + find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d + NAMES_PER_DIR + HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS} + NO_DEFAULT_PATH) + else() + # search first in known locations + if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES lib libs + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + # search in all default paths + find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${__${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES lib libs) + endif() + if (${_PYTHON_PREFIX}_LIBRARY_DEBUG) + get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY) + _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d + NAMES_PER_DIR + HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin) + endif() + endif() + + # Don't search for include dir until library location is known + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS) + + if (${_PYTHON_PREFIX}_EXECUTABLE) + # pick up include directory from configuration + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; import sysconfig; sys.stdout.write(sysconfig.get_path('include'))" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PATH + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + file (TO_CMAKE_PATH "${_${_PYTHON_PREFIX}_PATH}" _${_PYTHON_PREFIX}_PATH) + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PATH}") + endif() + endif() + + foreach (_${_PYTHON_PREFIX}_LIB IN ITEMS ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + if (${_${_PYTHON_PREFIX}_LIB}) + # Use the library's install prefix as a hint + if (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)") + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}") + elseif (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config") + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}") + elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}") + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}") + else() + # assume library is in a directory under root + get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${${_${_PYTHON_PREFIX}_LIB}}" DIRECTORY) + get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY) + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}") + endif() + endif() + endforeach() + list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_HINTS) + + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST") + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu + include/python${_${_PYTHON_PREFIX}_VERSION}m + include/python${_${_PYTHON_PREFIX}_VERSION}u + include/python${_${_PYTHON_PREFIX}_VERSION} + include + NO_CMAKE_PATH + NO_CMAKE_ENVIRONMENT_PATH + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h + HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu + include/python${_${_PYTHON_PREFIX}_VERSION}m + include/python${_${_PYTHON_PREFIX}_VERSION}u + include/python${_${_PYTHON_PREFIX}_VERSION} + include + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h + HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + ${__${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu + include/python${_${_PYTHON_PREFIX}_VERSION}m + include/python${_${_PYTHON_PREFIX}_VERSION}u + include/python${_${_PYTHON_PREFIX}_VERSION} + include + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) AND ${_PYTHON_PREFIX}_INCLUDE_DIR) + break() + endif() + endforeach() + + # search header file in standard locations + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h) + endif() + + if (${_PYTHON_PREFIX}_INCLUDE_DIR) + # retrieve version from header file + file (STRINGS "${${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" _${_PYTHON_PREFIX}_VERSION + REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"") + string (REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1" + _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_VERSION}") + string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}") + list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH) + + if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT ${_PYTHON_PREFIX}_Compiler_FOUND) + # set public version information + set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION}) + set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR}) + set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR}) + set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH}) + endif() + endif() + + # define public variables + include (${CMAKE_CURRENT_LIST_DIR}/../SelectLibraryConfigurations.cmake) + select_library_configurations (${_PYTHON_PREFIX}) + if (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE) + set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}") + elseif (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) + set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}") + else() + set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "$${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND") + endif() + + _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS + ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + if (UNIX) + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" + OR ${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$") + set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS}) + endif() + else() + _python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS + ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) + endif() + + set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${${_PYTHON_PREFIX}_INCLUDE_DIR}") + + mark_as_advanced (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE + ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG + ${_PYTHON_PREFIX}_INCLUDE_DIR) + + if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + AND ${_PYTHON_PREFIX}_INCLUDE_DIR) + if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND) + # development environment must be compatible with interpreter/compiler + if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) + set (${_PYTHON_PREFIX}_Development_FOUND TRUE) + endif() + elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + set (${_PYTHON_PREFIX}_Development_FOUND TRUE) + endif() + endif() + + # Restore the original find library ordering + if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES) + set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +# final validation +if (${_PYTHON_PREFIX}_VERSION_MAJOR AND + NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Found unsuitable major version \"${${_PYTHON_PREFIX}_VERSION_MAJOR}\", but required major version is exact version \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"") +endif() + +include (${CMAKE_CURRENT_LIST_DIR}/../FindPackageHandleStandardArgs.cmake) +find_package_handle_standard_args (${_PYTHON_PREFIX} + REQUIRED_VARS ${_${_PYTHON_PREFIX}_REQUIRED_VARS} + VERSION_VAR ${_PYTHON_PREFIX}_VERSION + HANDLE_COMPONENTS) + +# Create imported targets and helper functions +if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND ${_PYTHON_PREFIX}_Interpreter_FOUND + AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter) + add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED) + set_property (TARGET ${_PYTHON_PREFIX}::Interpreter + PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}") +endif() + +if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND ${_PYTHON_PREFIX}_Compiler_FOUND + AND NOT TARGET ${_PYTHON_PREFIX}::Compiler) + add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED) + set_property (TARGET ${_PYTHON_PREFIX}::Compiler + PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}") +endif() + +if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND ${_PYTHON_PREFIX}_Development_FOUND AND NOT TARGET ${_PYTHON_PREFIX}::Python) + + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" + OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" + OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) + set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED) + else() + set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC) + endif() + + add_library (${_PYTHON_PREFIX}::Python ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED) + + set_property (TARGET ${_PYTHON_PREFIX}::Python + PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIR}") + + if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE) + OR (${_PYTHON_PREFIX}_LIBRARY_DEBUG AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)) + # System manage shared libraries in two parts: import and runtime + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" + IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" + IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}") + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" + IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" + IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}") + else() + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARY}" + IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY}") + endif() + else() + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" + IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}") + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" + IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}") + else() + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY}") + endif() + endif() + + if (_${_PYTHON_PREFIX}_CONFIG AND _${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC") + # extend link information with dependent libraries + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + string (REGEX MATCHALL "-[Ll][^ ]+" _${_PYTHON_PREFIX}_LINK_LIBRARIES "${_${_PYTHON_PREFIX}_FLAGS}") + # remove elements relative to python library itself + list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-lpython") + foreach (_${_PYTHON_PREFIX}_DIR IN LISTS ${_PYTHON_PREFIX}_LIBRARY_DIRS) + list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-L${${_PYTHON_PREFIX}_DIR}") + endforeach() + set_property (TARGET ${_PYTHON_PREFIX}::Python + PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES}) + endif() + endif() + + # + # PYTHON_ADD_LIBRARY ( [STATIC|SHARED|MODULE] src1 src2 ... srcN) + # It is used to build modules for python. + # + function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name) + cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY + "STATIC;SHARED;MODULE" "" "") + + unset (type) + if (NOT (PYTHON_ADD_LIBRARY_STATIC + OR PYTHON_ADD_LIBRARY_SHARED + OR PYTHON_ADD_LIBRARY_MODULE)) + set (type MODULE) + endif() + add_library (${name} ${type} ${ARGN}) + target_link_libraries (${name} PRIVATE ${prefix}::Python) + + # customize library name to follow module name rules + get_property (type TARGET ${name} PROPERTY TYPE) + if (type STREQUAL "MODULE_LIBRARY") + set_property (TARGET ${name} PROPERTY PREFIX "") + if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set_property (TARGET ${name} PROPERTY SUFFIX ".pyd") + endif() + endif() + endfunction() +endif() + +# final clean-up + +# Restore CMAKE_FIND_APPBUNDLE +if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE) + set (CMAKE_FIND_APPBUNDLE ${_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE}) + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE) +else() + unset (CMAKE_FIND_APPBUNDLE) +endif() +# Restore CMAKE_FIND_FRAMEWORK +if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) + set (CMAKE_FIND_FRAMEWORK ${_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK}) + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) +else() + unset (CMAKE_FIND_FRAMEWORK) +endif() + +unset (_${_PYTHON_PREFIX}_CONFIG CACHE) diff --git a/cmake/FindPython3.cmake b/cmake/FindPython3.cmake new file mode 100644 index 0000000..2176f3f --- /dev/null +++ b/cmake/FindPython3.cmake @@ -0,0 +1,171 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPython3 +----------- + +Find Python 3 interpreter, compiler and development environment (include +directories and libraries). + +Three components are supported: + +* ``Interpreter``: search for Python 3 interpreter +* ``Compiler``: search for Python 3 compiler. Only offered by IronPython. +* ``Development``: search for development artifacts (include directories and + libraries) + +If no ``COMPONENTS`` is specified, ``Interpreter`` is assumed. + +To ensure consistent versions between components ``Interpreter``, ``Compiler`` +and ``Development``, specify all components at the same time:: + + find_package (Python3 COMPONENTS Interpreter Development) + +This module looks only for version 3 of Python. This module can be used +concurrently with :module:`FindPython2` module to use both Python versions. + +The :module:`FindPython` module can be used if Python version does not matter +for you. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module defines the following :ref:`Imported Targets `: + +``Python3::Interpreter`` + Python 3 interpreter. Target defined if component ``Interpreter`` is found. +``Python3::Compiler`` + Python 3 compiler. Target defined if component ``Compiler`` is found. +``Python3::Python`` + Python 3 library. Target defined if component ``Development`` is found. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module will set the following variables in your project +(see :ref:`Standard Variable Names `): + +``Python3_FOUND`` + System has the Python 3 requested components. +``Python3_Interpreter_FOUND`` + System has the Python 3 interpreter. +``Python3_EXECUTABLE`` + Path to the Python 3 interpreter. +``Python3_INTERPRETER_ID`` + A short string unique to the interpreter. Possible values include: + * Python + * ActivePython + * Anaconda + * Canopy + * IronPython +``Python3_STDLIB`` + Standard platform independent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``. +``Python3_STDARCH`` + Standard platform dependent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``. +``Python3_SITELIB`` + Third-party platform independent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``. +``Python3_SITEARCH`` + Third-party platform dependent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``. +``Python3_Compiler_FOUND`` + System has the Python 3 compiler. +``Python3_COMPILER`` + Path to the Python 3 compiler. Only offered by IronPython. +``Python3_COMPILER_ID`` + A short string unique to the compiler. Possible values include: + * IronPython +``Python3_Development_FOUND`` + System has the Python 3 development artifacts. +``Python3_INCLUDE_DIRS`` + The Python 3 include directories. +``Python3_LIBRARIES`` + The Python 3 libraries. +``Python3_LIBRARY_DIRS`` + The Python 3 library directories. +``Python3_RUNTIME_LIBRARY_DIRS`` + The Python 3 runtime library directories. +``Python3_VERSION`` + Python 3 version. +``Python3_VERSION_MAJOR`` + Python 3 major version. +``Python3_VERSION_MINOR`` + Python 3 minor version. +``Python3_VERSION_PATCH`` + Python 3 patch version. + +Hints +^^^^^ + +``Python3_ROOT_DIR`` + Define the root directory of a Python 3 installation. + +``Python3_USE_STATIC_LIBS`` + * If not defined, search for shared libraries and static libraries in that + order. + * If set to TRUE, search **only** for static libraries. + * If set to FALSE, search **only** for shared libraries. + +``Python3_FIND_REGISTRY`` + On Windows the ``Python3_FIND_REGISTRY`` variable determine the order + of preference between registry and environment variables. + the ``Python3_FIND_REGISTRY`` variable can be set to empty or one of the + following: + + * ``FIRST``: Try to use registry before environment variables. + This is the default. + * ``LAST``: Try to use registry after environment variables. + * ``NEVER``: Never try to use registry. + +``CMAKE_FIND_FRAMEWORK`` + On OS X the :variable:`CMAKE_FIND_FRAMEWORK` variable determine the order of + preference between Apple-style and unix-style package components. + + .. note:: + + Value ``ONLY`` is not supported so ``FIRST`` will be used instead. + +.. note:: + + If a Python virtual environment is configured, set variable + ``Python_FIND_REGISTRY`` (Windows) or ``CMAKE_FIND_FRAMEWORK`` (macOS) with + value ``LAST`` or ``NEVER`` to select it preferably. + +Commands +^^^^^^^^ + +This module defines the command ``Python3_add_library`` which have the same +semantic as :command:`add_library` but take care of Python module naming rules +(only applied if library is of type ``MODULE``) and add dependency to target +``Python3::Python``:: + + Python3_add_library (my_module MODULE src1.cpp) + +If library type is not specified, ``MODULE`` is assumed. +#]=======================================================================] + + +set (_PYTHON_PREFIX Python3) + +set (_Python3_REQUIRED_VERSION_MAJOR 3) + +include (${CMAKE_CURRENT_LIST_DIR}/FindPython/Support.cmake) + +if (COMMAND __Python3_add_library) + macro (Python3_add_library) + __Python3_add_library (Python3 ${ARGV}) + endmacro() +endif() + +unset (_PYTHON_PREFIX) diff --git a/cmake/SelectLibraryConfigurations.cmake b/cmake/SelectLibraryConfigurations.cmake new file mode 100644 index 0000000..4c0e9a8 --- /dev/null +++ b/cmake/SelectLibraryConfigurations.cmake @@ -0,0 +1,80 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +SelectLibraryConfigurations +--------------------------- + +.. code-block:: cmake + + select_library_configurations(basename) + +This macro takes a library base name as an argument, and will choose +good values for the variables + +:: + + basename_LIBRARY + basename_LIBRARIES + basename_LIBRARY_DEBUG + basename_LIBRARY_RELEASE + +depending on what has been found and set. + +If only ``basename_LIBRARY_RELEASE`` is defined, ``basename_LIBRARY`` will +be set to the release value, and ``basename_LIBRARY_DEBUG`` will be set +to ``basename_LIBRARY_DEBUG-NOTFOUND``. If only ``basename_LIBRARY_DEBUG`` +is defined, then ``basename_LIBRARY`` will take the debug value, and +``basename_LIBRARY_RELEASE`` will be set to ``basename_LIBRARY_RELEASE-NOTFOUND``. + +If the generator supports configuration types, then ``basename_LIBRARY`` +and ``basename_LIBRARIES`` will be set with debug and optimized flags +specifying the library to be used for the given configuration. If no +build type has been set or the generator in use does not support +configuration types, then ``basename_LIBRARY`` and ``basename_LIBRARIES`` +will take only the release value, or the debug value if the release one +is not set. +#]=======================================================================] + +# This macro was adapted from the FindQt4 CMake module and is maintained by Will +# Dicharry . + +macro(select_library_configurations basename) + if(NOT ${basename}_LIBRARY_RELEASE) + set(${basename}_LIBRARY_RELEASE "${basename}_LIBRARY_RELEASE-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + if(NOT ${basename}_LIBRARY_DEBUG) + set(${basename}_LIBRARY_DEBUG "${basename}_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + + get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if( ${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE AND + NOT ${basename}_LIBRARY_DEBUG STREQUAL ${basename}_LIBRARY_RELEASE AND + ( _isMultiConfig OR CMAKE_BUILD_TYPE ) ) + # if the generator is multi-config or if CMAKE_BUILD_TYPE is set for + # single-config generators, set optimized and debug libraries + set( ${basename}_LIBRARY "" ) + foreach( _libname IN LISTS ${basename}_LIBRARY_RELEASE ) + list( APPEND ${basename}_LIBRARY optimized "${_libname}" ) + endforeach() + foreach( _libname IN LISTS ${basename}_LIBRARY_DEBUG ) + list( APPEND ${basename}_LIBRARY debug "${_libname}" ) + endforeach() + elseif( ${basename}_LIBRARY_RELEASE ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_RELEASE} ) + elseif( ${basename}_LIBRARY_DEBUG ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_DEBUG} ) + else() + set( ${basename}_LIBRARY "${basename}_LIBRARY-NOTFOUND") + endif() + + set( ${basename}_LIBRARIES "${${basename}_LIBRARY}" ) + + if( ${basename}_LIBRARY ) + set( ${basename}_FOUND TRUE ) + endif() + + mark_as_advanced( ${basename}_LIBRARY_RELEASE + ${basename}_LIBRARY_DEBUG + ) +endmacro() diff --git a/configure.ac b/configure.ac deleted file mode 100644 index 0e68d44..0000000 --- a/configure.ac +++ /dev/null @@ -1,469 +0,0 @@ -AC_PREREQ([2.68]) -# http://stackoverflow.com/questions/8559456/read-a-version-number-from-a-file-in-configure-ac -AC_INIT([mod], m4_esyscmd_s([cat VERSION]), [jakob@caput.dk]) -AC_CONFIG_AUX_DIR([auxConfig]) -AC_CONFIG_SRCDIR([src/mod/Config.cpp]) -AM_INIT_AUTOMAKE([1.11 foreign silent-rules subdir-objects -Wall -Werror tar-ustar nostdinc]) -# this AM_PROG_AR call should not be needed, but see http://debbugs.gnu.org/cgi/bugreport.cgi?bug=11401%3E -AM_PROG_AR -LT_INIT([shared disable-static]) -#AC_SUBST([LIBTOOL_DEPS]) - -AC_CONFIG_MACRO_DIR([m4]) -m4_include([m4/ax_prefix_config_h.m4]) -m4_include([m4/ax_boost_base.m4]) - -AC_CONFIG_HEADERS([src/mod/BuildConfig.h_]) -AX_PREFIX_CONFIG_H([src/mod/BuildConfig.h], [MOD], [src/mod/BuildConfig.h_]) - - -########################################################################## -# Constants and Variable Information -########################################################################## -# search build-generated sources, distributed source, and our Boost files -AM_CPPFLAGS="-I\$(top_builddir)/src -I\$(top_srcdir)/src" -AM_CPPFLAGS="$AM_CPPFLAGS -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_RESULT_OF_USE_DECLTYPE $BOOST_CPPFLAGS -DBOOST_SYSTEM_NO_DEPRECATED" -AM_CXXFLAGS="-std=c++14 -Wno-unused-local-typedefs -Wno-unused-parameter -Wno-comment -Wno-maybe-uninitialized -Wno-deprecated-declarations -fno-stack-protector" -AM_LDFLAGS="-no-undefined" -AM_LDLIBS="" -# so we can restore before each test -CPPFLAGS=${CPPFLAGS:-""} -CXXFLAGS=${CXXFLAGS:-"-g -O3"} -LDFLAGS=${LDFLAGS:-""} -LDLIBS=${LDLIBS:-""} -LIBS=${LIBS:-""} -orig_CPPFLAGS=$CPPFLAGS -orig_CXXFLAGS=$CXXFLAGS -orig_LDFLAGS=$LDFLAGS -orig_LDLIBS=$LDLIBS -orig_LIBS=$LIBS - - -# Top level options -########################################################################## -# Documentation ---------------------------------------------------------- -default_enable_doc_checks="yes" -# PostMØD ---------------------------------------------------------------- -default_enable_postmod="yes" -# PyMØD ------------------------------------------------------------------ -default_enable_pymod="yes" -# ENABLE_PYMOD - -# Individual checks -########################################################################## -# Boost ------------------------------------------------------------------ -boostReqVersion="1.64.0" -# perm_group ------------------------------------------------------------- -permGroupReqVersion="v0.3" -# graph_canon ------------------------------------------------------------ -graphCanonReqVersion="v0.3" -# Graphviz -------------------------------------------------------------- -# if PostMØD checks -# Open Babel ------------------------------------------------------------- -default_with_OpenBabel="yes" -obabelReqVersion="2.3.2" -# HAVE_OPENBABEL -# pdf2svg ---------------------------------------------------------------- -# if PostMØD checks -# pdflatex --------------------------------------------------------------- -# if PostMØD checks -# Python ----------------------------------------------------------------- -# PYTHON_LDLIBS -# Sphinx ----------------------------------------------------------------- -default_enable_sphinx="yes" -# ENABLE_SPHINX -# Boost Python (depends on Boost and Python) ----------------------------- -# BOOST_PYTHON_LIB_NAME - -########################################################################## -# Top level options -########################################################################## -# PostMØD ---------------------------------------------------------------- -AC_ARG_ENABLE([postmod], - [AS_HELP_STRING([--enable-postmod=yes|no], - [Enable/disable building of the post-processor.])], - [ -if test "$enable_postmod" != "yes" -a "$enable_postmod" != "no"; then - AC_MSG_ERROR(["Invalid value '$enable_postmod' for --enable-postmod."]) -fi -], [enable_postmod=$default_enable_postmod]) -AM_CONDITIONAL([ENABLE_POSTMOD], [test "$enable_postmod" = "yes"]) - -# PyMØD ------------------------------------------------------------------ -AC_ARG_ENABLE([pymod], - [AS_HELP_STRING([--enable-pymod=yes|no], - [Enable/disable building of the Python bindings for MØD.])], - [ -if test "$enable_pymod" != "yes" -a "$enable_pymod" != "no"; then - AC_MSG_ERROR(["Invalid value '$enable_pymod' for --enable-pymod."]) -fi -], [enable_pymod=$default_enable_pymod]) -AM_CONDITIONAL([ENABLE_PYMOD], [test "$enable_pymod" = "yes"]) - -# Check documentation requirements -------------------------------------- -AC_ARG_ENABLE([doc_checks], - [AS_HELP_STRING([--enable-doc-checks=yes|no], - [Enable/disable configure checks for building the documentation.])], - [ -if test "$enable_doc_checks" != "yes" -a "$enable_doc_checks" != "no"; then - AC_MSG_ERROR(["Invalid value '$enable_doc_checks' for --enable-doc-checks."]) -fi -], [enable_doc_checks=$default_enable_doc_checks]) - -########################################################################## -# Options for individual dependencies -########################################################################## - -Ipaths=() -Lpaths=() -function printPaths { - if test ${#Ipaths[@]} > 0; then - AC_MSG_NOTICE([Specified I paths are:]) - for p in ${Ipaths[[@]]}; do - AC_MSG_NOTICE([ $p]) - done - fi - if test ${#Lpaths[@]} > 0; then - AC_MSG_NOTICE([Specified L paths are:]) - for p in ${Lpaths[[@]]}; do - AC_MSG_NOTICE([ $p]) - done - fi -} -doPathSort="no" -function restoreFlags { - CPPFLAGS=$orig_CPPFLAGS - CXXFLAGS=$orig_CXXFLAGS - LDFLAGS=$orig_LDFLAGS - LDLIBS=$orig_LDLIBS - LIBS=$orig_LIBS - if test "$doPathSort" = "yes"; then - doPathSort="no" - Ipaths=($(for p in ${Ipaths[[@]]}; do echo $p; done | sort | uniq)) - Lpaths=($(for p in ${Lpaths[[@]]}; do echo $p; done | sort | uniq)) - fi - for p in ${Ipaths[[@]]}; do - CPPFLAGS+=" -I$p" - done - for p in ${Lpaths[[@]]}; do - LDFLAGS+=" -L$p -Wl,-rpath -Wl,$p" - done -} -function addIPath { - Ipaths+=("$1") - doPathSort="yes" -} -function addLPath { - Lpaths+=("$1") - doPathSort="yes" - PKG_CONFIG_PATH+=":$1/pkgconfig" - export PKG_CONFIG_PATH -} - -function checkGivenPath { - # GCC thinks it's funny to give a hard error with a -I path that is a subfolder of a file - # (e.g., /bin/cat/foo), so check that a given path is not regular file. - if test -f "$1"; then - AC_MSG_ERROR([Path "$1" given to $2 is a regular file. It must be a folder.]) - fi -} - -# Boost ------------------------------------------------------------------ -AC_ARG_WITH([boost], - [AS_HELP_STRING([--with-boost=arg], - [yes: enable Boost, : add specified location for dependency searching, no: not an option, you need Boost.])], - [], [with_boost=yes]) -if test "$with_boost" != "yes" -a "$with_boost" != "no"; then - checkGivenPath "$with_boost" --with-boost - addIPath "$with_boost/include" - addLPath "$with_boost/lib" -fi - -# perm_group ------------------------------------------------------------- -AC_ARG_WITH([perm_group], - [AS_HELP_STRING([--with-perm_group=arg], - [yes: enable PermGroup, : add specified location for dependency searching, no: not an option, you need PermGroup.])], - [], [with_perm_group=yes]) -if test "$with_perm_group" != "yes" -a "$with_perm_group" != "no"; then - checkGivenPath "$with_perm_group" --with-perm_group - addIPath "$with_perm_group/include" - addLPath "$with_perm_group/lib" -fi - -# graph_canon ------------------------------------------------------------ -AC_ARG_WITH([graph_canon], - [AS_HELP_STRING([--with-graph_canon=arg], - [yes: enable GraphCanon, : add specified location for dependency searching, no: not an option, you need GraphCanon.])], - [], [with_graph_canon=yes]) -if test "$with_graph_canon" != "yes" -a "$with_graph_canon" != "no"; then - checkGivenPath "$with_graph_canon" --with-graph_canon - addIPath "$with_graph_canon/include" - addLPath "$with_graph_canon/lib" -fi - -# Open Babel ------------------------------------------------------------- -AC_ARG_WITH([OpenBabel], - [AS_HELP_STRING([--with-OpenBabel=prefix], - [yes: enable Open Babel, no: disable Open Babel, : use Open Babel from specified location.])], - [], [with_OpenBabel=$default_with_OpenBabel]) -if test "$with_OpenBabel" != no -a "$with_OpenBabel" != "yes"; then - checkGivenPath "$with_OpenBabel" --with-OpenBabel - addIPath "$with_OpenBabel/include" - addLPath "$with_OpenBabel/lib" -fi - -# Python ----------------------------------------------------------------- -if test "$enable_pymod" = "yes"; then - AC_CHECK_PROGS([PYTHON_CONFIG], [python3-config], [no]) - if test "$PYTHON_CONFIG" = "no"; then - AC_MSG_ERROR([python3-config could not be found.]) - fi - for p in $(python3-config --includes); do - inc="${p#-I}" - addIPath "$inc" - done -fi - -########################################################################## -# Check Stuff -########################################################################## - -# Compiler Stuff --------------------------------------------------------- -AC_PROG_CXX -AC_PROG_CXXCPP -CXXFLAGS="" -AC_LANG([C++]) - -# Boost ------------------------------------------------------------------ -restoreFlags -if test "$with_boost" = "no"; then - AC_MSG_ERROR([You have to want Boost libraries. --with-boost=no is not an option.]) -else - AC_CHECK_HEADER([boost/version.hpp], - [], - [AC_MSG_NOTICE([Boost not found.]) - printPaths - if test $with_boost != "yes"; then - AC_MSG_ERROR([Is the path "$with_boost" correct?]) - else - AC_MSG_ERROR([Use --with-boost= to specify where Boost is installed.]) - fi - ]) - - AC_MSG_CHECKING(for Boost >= $boostReqVersion) - # these checks are based on the ax_boost_base.m4 macros - expr "$boostReqVersion" : '[[0-9]]\{1,\}\.[[0-9]]\{1,\}\.[[0-9]]\{1,\}$' &> /dev/null - if test $? -ne 0; then - AC_MSG_ERROR([Boost version "$boostReqVersion" is invalid. It most be on the form MAJOR.MINOR.PATCH]) - fi - major=$(expr "$boostReqVersion" : '\([[0-9]]\{1,\}\)\.[[0-9]]\{1,\}\.[[0-9]]\{1,\}$') - minor=$(expr "$boostReqVersion" : '[[0-9]]\{1,\}\.\([[0-9]]\{1,\}\)\.[[0-9]]\{1,\}$') - patch=$(expr "$boostReqVersion" : '[[0-9]]\{1,\}\.[[0-9]]\{1,\}\.\([[0-9]]\{1,\}\)$') - reqVersion=$(expr \( $major \* 1000 \+ $minor \) \* 100 + $patch) - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ - #include - #if BOOST_VERSION >= $reqVersion - // yay - #else - #error Too old - #endif - ]])], [versionOk="yes"], [versionOk="no"]) - AC_MSG_RESULT($versionOk) - if test $versionOk = "no"; then - AC_MSG_ERROR([Boost version too old.]) - fi -fi - - -# perm_group ------------------------------------------------------------- -restoreFlags -if test "$with_perm_group" = "no"; then - AC_MSG_ERROR([You have to want the PermGroup library. --with-perm_group=no is not an option.]) -else - PKG_CHECK_MODULES([perm_group], [perm-group >= $permGroupReqVersion], [], [ - AC_MSG_NOTICE([$perm_group_PKG_ERRORS]) - AC_MSG_NOTICE([PKG_CONFIG_PATH=$PKG_CONFIG_PATH]) - printPaths - AC_MSG_ERROR([Use --with-perm_group=prefix, or set PKG_CONFIG_PATH for non-standard install prefix.])]) - addIPath "$(pkg-config perm-group --variable=pkgincludedir)" -fi - -# graph_canon ------------------------------------------------------------ -restoreFlags -if test "$with_graph_canon" = "no"; then - AC_MSG_ERROR([You have to want the GraphCanon library. --with-graph_canon=no is not an option.]) -else - PKG_CHECK_MODULES([graph_canon], [graph-canon >= $graphCanonReqVersion], [], [ - AC_MSG_NOTICE([$graph_canon_PKG_ERRORS]) - AC_MSG_NOTICE([PKG_CONFIG_PATH=$PKG_CONFIG_PATH]) - printPaths - AC_MSG_ERROR([Use --with-graph_canon=prefix, or set PKG_CONFIG_PATH for non-standard install prefix.])]) - addIPath "$(pkg-config graph-canon --variable=includedir)" -fi - -# Graphviz --------------------------------------------------------------- -restoreFlags -if test "$enable_postmod" = "yes"; then - AC_CHECK_PROGS([DOT], [dot], [no]) - if test "$DOT" = "no"; then - AC_MSG_ERROR([dot (from Graphviz) is essential for PostMØD. -$postmod_check_fail_msg]) - fi - - graphviz_format_fail_msg="Please report false positives/negatives on the Graphviz image formats checks." - - AC_MSG_CHECKING([Graphviz image format, cairo svg output]) - dot -P 2>&1 | grep "cairo_device_svg -> output_svg" &> /dev/null - if test $? -ne 0; then - AC_MSG_RESULT([not found]) - AC_MSG_ERROR([svg output of dot is essential for PostMØD. -$graphviz_format_fail_msg -$postmod_check_fail_msg]) - else - AC_MSG_RESULT([found]) - fi - - AC_MSG_CHECKING([Graphviz image format, cairo pdf output]) - dot -P 2>&1 | grep "cairo_device_pdf -> output_pdf" &> /dev/null - if test $? -ne 0; then - AC_MSG_RESULT([not found]) - AC_MSG_ERROR([pdf output of dot is essential for PostMØD. -$graphviz_format_fail_msg -$postmod_check_fail_msg]) - else - AC_MSG_RESULT([found]) - fi - - AC_MSG_CHECKING([Graphviz image format, cairo svg input via rsvg]) - dot -P 2>&1 | grep "rsvg_loadimage_svg -> render_cairo" &> /dev/null - if test $? -ne 0; then - AC_MSG_RESULT([not found]) - AC_MSG_ERROR([svg input of dot is essential for PostMØD. -$graphviz_format_fail_msg -$postmod_check_fail_msg]) - else - AC_MSG_RESULT([found]) - fi -fi - -# Open Babel ------------------------------------------------------------- -restoreFlags -if test "$with_OpenBabel" != "no"; then - AC_DEFINE(HAVE_OPENBABEL, 1, [Define if you have Open Babel available.]) - PKG_CHECK_MODULES([OpenBabel], [openbabel-2.0 >= $obabelReqVersion], [], [ - AC_MSG_NOTICE([$OpenBabel_PKG_ERRORS]) - AC_MSG_NOTICE([PKG_CONFIG_PATH=$PKG_CONFIG_PATH]) - printPaths - AC_MSG_ERROR([Use --with-OpenBabel=prefix, or set PKG_CONFIG_PATH for non-standard install prefix.])]) - addIPath "$(pkg-config openbabel-2.0 --variable=pkgincludedir)" -fi -AM_CONDITIONAL([HAVE_OPENBABEL], [test "$with_OpenBabel" != "no"]) - -# pdf2svg ---------------------------------------------------------------- -restoreFlags -if test "$enable_postmod" = "yes"; then - AC_CHECK_PROGS([PDF2SVG], [pdf2svg], [no]) - if test "$PDF2SVG" = "no"; then - AC_MSG_ERROR([pdf2svg is essential for PostMØD. -$postmod_check_fail_msg]) - fi -fi - -# pdflatex --------------------------------------------------------------- -restoreFlags -if test "$enable_postmod" = "yes"; then - AC_CHECK_PROGS([PDFLATEX], [pdflatex], [no]) - if test "$PDFLATEX" = "no"; then - AC_MSG_ERROR([pdflatex is essential for PostMØD. -$postmod_check_fail_msg]) - fi -fi - -# Python ----------------------------------------------------------------- -restoreFlags -if test "$enable_pymod" = "yes"; then - AC_CHECK_HEADER([Python.h], [], [ - printPaths - AC_MSG_ERROR([Could not find Python headers.]) - ]) - PYTHON_LDLIBS=$(python3-config --libs) - AC_SUBST([PYTHON_LDLIBS]) - PYTHON_VERSION=$(python3 -c "import sys; print(sys.version_info.minor);") -fi - -# Sphinx ----------------------------------------------------------------- -restoreFlags -AC_CHECK_PROGS([SPHINXBUILD], [sphinx-build sphinx-build3 sphinx-build-3 sphinx-build2], [no]) -if test "$SPHINXBUILD" = "no"; then - if test "$enable_doc_checks" = "yes"; then - AC_MSG_ERROR([sphinx-build is required for building the documentation. -This error can be suppressed with '--disable-doc-checks']) - else - AC_MSG_WARN([sphinx-build is required for building the documentation. -This warning will be an error without '--disable-doc-checks']) - fi -fi -AM_CONDITIONAL([ENABLE_SPHINX], [test "$SPHINXBUILD" != "no"]) - -# Boost Python ----------------------------------------------------------- -if test "$enable_pymod" = "yes"; then - AC_CHECK_HEADER([boost/python/module.hpp], - [], - [AC_MSG_ERROR([Could not find Boost.Python.])]) - # Find the proper name for the library. - # Ubuntu thinks it's great to only have the -py3X names. - # PYTHON_VERSION was set when we checked for python3 - BOOST_PYTHON_LIB_NAME="" - for libName in boost_python{3,3$PYTHON_VERSION,-py3$PYTHON_VERSION}; do - restoreFlags - LIBS+=" -l$libName $PYTHON_LDLIBS" - AC_MSG_CHECKING([for Boost.Python library, using Python 3 (lib name=$libName)]) - AC_LINK_IFELSE([ - AC_LANG_SOURCE([[ - #include - using namespace boost::python; - BOOST_PYTHON_MODULE(test) { throw "Boost::Python test."; } - int main() {}]])], - [ - AC_MSG_RESULT([yes]) - BOOST_PYTHON_LIB_NAME="$libName" - break - ], - [ - AC_MSG_RESULT([no]) - ]) - done - if test "x$BOOST_PYTHON_LIB_NAME" = "x"; then - AC_MSG_ERROR([Could not link test program using Boost.Python.]) - fi - AC_SUBST([BOOST_PYTHON_LIB_NAME]) -fi - -########################################################################## -# pkg-config file -########################################################################## -restoreFlags -PKG_INCLUDES="" -for p in ${Ipaths[[@]]}; do - PKG_INCLUDES+=" -I$p" -done -PKG_LIBS="-pthread" - -AC_SUBST([PKG_INCLUDES]) -AC_SUBST([PKG_LIBS]) - -########################################################################## -# Finalize -########################################################################## -restoreFlags -AC_SUBST([AM_CPPFLAGS]) -AC_SUBST([AM_CXXFLAGS]) -AC_SUBST([AM_LDFLAGS]) -AC_SUBST([AM_LDLIBS]) - -AC_CONFIG_FILES([ - Makefile - src/Makefile - doc/Makefile - src/lib/pkgconfig/mod.pc]) -AC_OUTPUT diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 0000000..8593406 --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,17 @@ +if(NOT BUILD_DOC) + return() +endif() + +set(output ${CMAKE_CURRENT_BINARY_DIR}/html) +set(doctrees ${CMAKE_CURRENT_BINARY_DIR}/doctrees) +add_custom_target(mod_doc + COMMAND ${SPHINX} ${CMAKE_CURRENT_SOURCE_DIR}/source -b html ${output} -d ${doctrees}) +if(TARGET doc) + add_dependencies(doc mod_doc) +else() + add_custom_target(doc ALL DEPENDS mod_doc) +endif() +set_property(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${output} ${doctrees}) +install(DIRECTORY ${output} + DESTINATION ${CMAKE_INSTALL_DOCDIR} + COMPONENT MOD_doc) \ No newline at end of file diff --git a/doc/makeDocs.sh b/doc/makeDocs.sh index 29ade6e..c1e7736 100755 --- a/doc/makeDocs.sh +++ b/doc/makeDocs.sh @@ -5,24 +5,7 @@ if [ "x$1" = "xclean" ]; then exit 0 fi -# the main logic for building is based on the auto-generated Makefile from Sphinx - -sphinxBuild=${1:-sphinx-build} -topSrcDir=${2:-..} -topBuildDir=${3:-..} - -which $sphinxBuild &> /dev/null -if [ $? -ne 0 ]; then - echo "Error: '$sphinxBuild' was not found." - exit 1 -fi - -function doBuild { - allOpts="-d $topBuildDir/doc/doctrees $topSrcDir/doc/source" - mkdir -p $topSrcDir/doc/source/_static - $sphinxBuild -b html $allOpts $topBuildDir/doc/build/html -j 8 -n - echo "$sphinxBuild -b html $allOpts $topBuildDir/doc/build/html" -} +topSrcDir=${1:-..} function outputRST { mkdir -p $topSrcDir/doc/source/$(dirname $1) @@ -138,15 +121,15 @@ BEGIN { } function getModHeaders { - find $topSrcDir/src/mod/ -iname "*.h" \ - | grep -v -e "/Py/" -e "/lib/" \ - | sed -e "s/.*\/src\/mod\///" -e "s/\.h$//" \ + find $topSrcDir/libs/libmod/src/mod/ -iname "*.hpp" \ + | grep -v -e "/lib/" \ + | sed -e "s/.*\/src\/mod\///" -e "s/\.hpp$//" \ | sort } function getPyModCPPs { - find $topSrcDir/src/mod/Py/ -iname "*.cpp" \ - | sed -e "s/.*\/src\/mod\/Py\///" -e "s/\.cpp$//" \ + find $topSrcDir/libs/pymod/src/mod/py -iname "*.cpp" \ + | sed -e "s!.*/libs/pymod/src/mod/py/!!" -e "s/\.cpp$//" \ | sort \ | grep -v Module | grep -v Collections | grep -v Function } @@ -232,7 +215,7 @@ function makeLibMod { echo ".. _cpp-$f:" echo "" echo "**********************************************************" - echo "$f.h" + echo "$f.hpp" echo "**********************************************************" cat << "EOF" .. default-domain:: cpp @@ -241,7 +224,7 @@ function makeLibMod { .. cpp:namespace:: mod EOF - fFull=$topSrcDir/src/mod/$f.h + fFull=$topSrcDir/libs/libmod/src/mod/$f.hpp cat $fFull | filterCPP if [ $? -ne 0 ]; then echo "Error in $fFull" 1>&2 @@ -304,7 +287,7 @@ function makePyMod { .. cpp:namespace:: mod EOF - fFull=$topSrcDir/src/mod/Py/$f.cpp + fFull=$topSrcDir/libs/pymod/src/mod/py/$f.cpp cat $fFull | filterCPP if [ $? -ne 0 ]; then echo "Error in $fFull" 1>&2 @@ -352,4 +335,8 @@ EOF makeIndex || exit 1 makeLibMod || exit 1 makePyMod || exit 1 -doBuild + +rm -rf $topSrcDir/doc/source/_static/examples +mkdir -p $topSrcDir/doc/source/_static/examples +cp -a $topSrcDir/examples/libmod_cmake $topSrcDir/doc/source/_static/examples/ +cp -a $topSrcDir/examples/pymod_extension $topSrcDir/doc/source/_static/examples/ diff --git a/doc/source/extensions/ignore_missing_refs/__init__.py b/doc/source/extensions/ignore_missing_refs/__init__.py index a29e513..091410b 100644 --- a/doc/source/extensions/ignore_missing_refs/__init__.py +++ b/doc/source/extensions/ignore_missing_refs/__init__.py @@ -1,5 +1,5 @@ -from sphinx.environment import NoUri +from sphinx.errors import NoUri anys = [ "ignoreRuleLabelTypes", "labelSettings", diff --git a/doc/source/installation.rst b/doc/source/installation.rst index 7d11f7c..1b38064 100644 --- a/doc/source/installation.rst +++ b/doc/source/installation.rst @@ -1,28 +1,123 @@ +.. _installation: + Installation ============ -The package is built and installed as a normal autotools project (i.e., use ``configure`` then ``make`` amd ``make install``). -The following is a list of dependencies, where relevant arguments for ``configure`` is shown in parenthesis. -Futher below are specific instructions on how to install these dependencies. -* This documentation requires `Sphinx`_, preferably in the newest development version (``--enable-doc-checks``, ``--disable-doc-checks``). -* libMØD: +From a Git Repository +--------------------- + +After a checkout of the desired version, do:: + + git submodule update --init --recursive + ./bootstrap.sh + +This is needed to first fetch certain dependencies and second +to generate build files, extract the API documentation, +and create the file ``VERSION`` based on the current commit. + +See :ref:`source-build` on how to then build the package. + + +As Dependency of Another CMake Project +-------------------------------------- + +MØD supports use via ``add_subdirectory`` in CMake. +The target ``mod::libmod`` is exported, +which can be used with ``target_link_libraries`` to link against libMØD. +The version is in the variable ``mod_VERSION``. +Note that running ``./bootstrap.sh`` is still needed if the +source is a repository clone (e.g., a Git submodule). + + +.. _source-build: + +From a Source Archive +--------------------- + +The package is build and installed from source as a CMake project. +Generally that means something like:: + + mkdir build + cd build + cmake ../ + make -j + make install + +A source archive can also be created with ``make dist``. + +The following is a list of commonly used options for ``cmake``, +and additional options specific for MØD. +See also :ref:`dependencies` for elaboration on some of them. + +- ``-DCMAKE_INSTALL_PREFIX=``, set a non-standard installation directory. + Note also that the + `GNUInstallDirs `__ + module is used. +- ``-DCMAKE_BUILD_TYPE=``, set a non-standard build type. + The default is `RelWithDebInfo `__. + An additional build type ``OptDebug`` is available which adds the compilation flags ``-g -O3``. +- ``-DCMAKE_PROGRAM_PATH=``, set a ``;``-separated list of paths used for some dependency searches. + See also https://cmake.org/cmake/help/latest/variable/CMAKE_PROGRAM_PATH.html. +- ``-DBUILD_DOC=on``, whether to build documentation or not. + This is forced to ``off`` when used via ``add_subdirectory``. +- ``-DBUILD_POST_MOD=on``, whether to build the post-processor or not. +- ``-DBUILD_PY_MOD=on``, whether to build the Python bindings or not. +- ``-DBUILD_EXAMPLES=off``, whether to build and allow running of examples as + tests or not. + This is forced to ``off`` when used via ``add_subdirectory``. + This is forced to ``off`` when ``BUILD_TESTING`` is ``off``. +- ``-DBUILD_TESTING=off``, whether to allow test building or not. + This is forced to ``off`` when used via ``add_subdirectory``. + When ``on`` the tests can be build with ``make tests`` and run with ``ctest``. +- ``-DBUILD_TESTING_SANITIZERS=on``, whether to compile tests with sanitizers or not. + This has no effect with code coverage is enabled. +- ``-DBUILD_COVERAGE=off``, whether to compile code and run tests with GCov. + When ``on`` the sanitizers on tests will be disabled. + After building the tests, execute ``make coverage_collect`` without parallel jobs to run tests. + Afterwards, execute ``make coverage_build`` to compile the code coverage report. +- ``-DENABLE_SYMBOL_HIDING=on``, whether symbols internal to the library are hidden or not. + Disabling this option may degrade performance, and should only be done while developing extensions to the C++ library. +- ``-DENABLE_DEP_SYMBOL_HIDING=on``, whether symbols from library dependencies are hidden or not. + Disabling this option may make it slower to load the library at runtime. +- ``-DENABLE_IPO=on``, whether to use link-time optimization or not. + Disabling this option may degrade performance, but speed up linking time. + As default the link-time optimizer will only use 1 thread. + To use more threads, e.g., 7, use the following options for configuration + ``-DCMAKE_MODULE_LINKER_FLAGS="-flto=7" -DCMAKE_SHARED_LINKER_FLAGS="-flto=7"``, when using GCC as the compiler. +- ``-DUSE_NESTED_GRAPH_CANON=on``, whether to use the dependency GraphCanon from the Git submodule or not. +- ``-DWITH_OPENBABEL=on``, whether to enable/disable features depending on Open Babel. + + +.. _dependencies: + +Dependencies +------------ + +- This documentation requires a supported version of `Sphinx `__ + (``-DBUILD_DOC=on``). +- libMØD: - A C++ compiler with reasonable C++14 support is needed. GCC 5.1 or later should work. - - `Boost`_ dev >= 1.64 (``--with-boost=``). - - (optional) `Open Babel`_ dev, >= 2.3.2 (``--with-OpenBabel=yes|no|``). + - `Boost `__ dev >= 1.64 + (use ``-DBOOST_ROOT=`` for non-standard locations). + - `GraphCanon `__ >= 0.4. + This is fulfilled via a Git submodule (make sure to do ``git submodule update --init --recursive``), + but if another source is needed, set ``-DUSE_NESTED_GRAPH_CANON=off``. + - (optional) `Open Babel`_ dev, >= 2.3.2 (``-DWITH_OPENBABEL=on``). -* PyMØD (``--enable-pymod``, ``--disable-pymod``): +- PyMØD (``-DBUILD_PY_MOD=on``): - Python 3 dev - Boost.Python built with Python 3 - (Optional) IPython 3 -* PostMØD (``--enable-postmod``, ``--disable-postmod``): +- PostMØD (``-DBUILD_POST_MOD=on``): - - ``pdflatex`` available in the ``PATH``, with not too old packages (Tex Live 2012 or newer should work). - - ``pdf2svg`` available in the ``PATH`` - - ``dot`` and ``neato`` from Graphviz available in the ``PATH``. + - ``pdflatex`` available in the ``PATH`` or in ``CMAKE_PROGRAM_PATH``, + with not too old packages (Tex Live 2012 or newer should work). + - ``pdf2svg`` available in the ``PATH`` or in ``CMAKE_PROGRAM_PATH``. + - ``dot`` and ``neato`` from Graphviz available in the ``PATH`` or in ``CMAKE_PROGRAM_PATH``. They must additionally be able to load SVG files and output as both SVG and PDF files (all via cairo). That is, in the output of ``dot -P`` the following edges must exist: @@ -69,6 +164,7 @@ Boost and Boost.Python with Python 3 A package with the sources of Boost can be downloaded from `http://boost.org`. + Basic Installation """""""""""""""""" @@ -83,6 +179,7 @@ After ``bootstrap.sh`` has been run, the file ``project-config.jam`` has been created, which can be edited to customise installation path and a lot of other things. All edits should be done before running ``b2``. + Non-standard Python Installation """""""""""""""""""""""""""""""" @@ -96,6 +193,7 @@ If Python is installed in a non-standard location, add the a line similar to ``project-config.jam``, where the last path is the path to the ``include``-folder of the Python-installation. + Custom GCC Version """""""""""""""""" diff --git a/doc/source/libmod/examples/using/Makefile b/doc/source/libmod/examples/using/Makefile deleted file mode 100644 index 406c22c..0000000 --- a/doc/source/libmod/examples/using/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -PKG_CONFIG_PATH := ${PKG_CONFIG_PATH}:/lib/pkgconfig -CPPFLAGS := $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --cflags mod) -CXXFLAGS := -std=c++11 -LDLIBS := $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --libs mod) - -test: test.o - $(CXX) -o test test.o $(LDLIBS) diff --git a/doc/source/libmod/usage.rst b/doc/source/libmod/usage.rst index 57a2d99..8d1d4b2 100644 --- a/doc/source/libmod/usage.rst +++ b/doc/source/libmod/usage.rst @@ -1,23 +1,16 @@ Compiling and Linking Client Code ================================= -The build system installs not only header files and the actual library, but -also a pkg-config file. -The following assumes that the path ``/lib/pkgconfig`` has been -added to the environment variable ``PKG_CONFIG_PATH``. -When compiling code using libMØD then the following scheme can be used: +The build system installs not only header files and the actual library, +but also import files that other CMake-based projects can use to link against libMØD. +The source code listed below can be found `here <../_static/examples/libmod_cmake/>`__. -.. code-block:: bash +For example, we could make a simple program from the following source: - g++ $(pkg-config --cflags mod) +.. literalinclude:: ../_static/examples/libmod_cmake/main.cpp + :language: c++ -Linking can be done in the same way: +The program can then be build as a CMake project with the following: -.. code-block:: bash - - g++ $(pkg-config --libs mod) - -And as a Makefile fragment (:download:`download `): - -.. literalinclude:: examples/using/Makefile - :language: make +.. literalinclude:: ../_static/examples/libmod_cmake/CMakeLists.txt + :language: cmake diff --git a/doc/source/modWrapper/modWrapper.rst b/doc/source/modWrapper/modWrapper.rst index 7b4c545..156f776 100644 --- a/doc/source/modWrapper/modWrapper.rst +++ b/doc/source/modWrapper/modWrapper.rst @@ -1,3 +1,5 @@ +.. default-domain:: py +.. py:currentmodule:: mod .. _mod-wrapper: @@ -136,7 +138,8 @@ The preamble has the following effects. .. py:function:: include(fName, checkDup=True, putDup=True, skipDup=True) Include the file ``fName`` in somewhat the same way that the ``#include`` directive - in the C/C++ preprocessor includes files (e.g., handling relative paths). + in the C/C++ preprocessor includes files. Paths are handled relatively using the functions + :py:func:`prefixFilename`, :py:func:`pushFilePrefix`, and :py:func:`popFilePrefix`. :param fName: the file to be included. :type fName: string diff --git a/doc/source/pymod/api.rst b/doc/source/pymod/api.rst index b7798f3..194b4eb 100644 --- a/doc/source/pymod/api.rst +++ b/doc/source/pymod/api.rst @@ -1,5 +1,3 @@ -.. py:module:: mod - API Reference ============= diff --git a/doc/source/pymod/examples/extension/Makefile b/doc/source/pymod/examples/extension/Makefile deleted file mode 100644 index ab8552b..0000000 --- a/doc/source/pymod/examples/extension/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -export PKG_CONFIG_PATH := ${PKG_CONFIG_PATH}:/lib/pkgconfig -CPPFLAGS = $$(pkg-config --cflags mod) -CPPFLAGS += -I/include -CPPFLAGS += $$(python3-config --includes) -CXXFLAGS = -std=c++11 -fpic -LDFLAGS = -Wl,--no-undefined -L/lib -LDLIBS = $$(pkg-config --libs mod) -lboost_python3 -LDLIBS += $$(python3-config --libs) - -OBJECTS = pyModule.o stuff.o - -awesome.so: $(OBJECTS) - $(CXX) -shared $(LDFLAGS) -o awesome.so $(OBJECTS) $(LDLIBS) - -clean: - rm -f awesome.so $(OBJECTS) diff --git a/doc/source/pymod/examples/extension/stuff.cpp b/doc/source/pymod/examples/extension/stuff.cpp deleted file mode 100644 index bcfdd29..0000000 --- a/doc/source/pymod/examples/extension/stuff.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "stuff.h" - -namespace awesome { - -std::shared_ptr doStuff() { - auto g = mod::Graph::smiles("CCO"); - g->setName("Ethanol"); - return g; -} - -} // namespace awesome diff --git a/doc/source/pymod/examples/extension/stuff.h b/doc/source/pymod/examples/extension/stuff.h deleted file mode 100644 index ee42d1c..0000000 --- a/doc/source/pymod/examples/extension/stuff.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef AWESOMELIB_H -#define AWESOMELIB_H - -#include - -namespace awesome { - -std::shared_ptr doStuff(); - -} // namespace awesome - -#endif // AWESOMELIB_H diff --git a/doc/source/pymod/extensions.rst b/doc/source/pymod/extensions.rst index 2dfd9ef..ff8a930 100644 --- a/doc/source/pymod/extensions.rst +++ b/doc/source/pymod/extensions.rst @@ -8,29 +8,29 @@ PyMØD is primarily Python bindings for libMØD made using `Boost.Python `_. The following shows a template for creating a Python extension with C++ functions (e.g., to extend libMØD). +The complete source code for the example can be found `here <../_static/examples/pymod_extension/>`__. Library Source and Headers -------------------------- For this examples the following C++ source with header should be exposed -in the Python module. Header (:download:`download`): +in the Python module. Header: -.. literalinclude:: examples/extension/stuff.h +.. literalinclude:: ../_static/examples/pymod_extension/stuff.hpp :language: cpp -Source (:download:`download`): +Source: -.. literalinclude:: examples/extension/stuff.cpp +.. literalinclude:: ../_static/examples/pymod_extension/stuff.cpp :language: cpp Exposing the Interface ---------------------- See the Boost.Python documentation for instructions how to expose C++ code. -Below is the code for creating our simple Python extension -(:download:`download`). +Below is the code for creating our simple Python extension. -.. literalinclude:: examples/extension/pyModule.cpp +.. literalinclude:: ../_static/examples/pymod_extension/pyModule.cpp :language: cpp The example exposes a bit of extra functionality for a sanity check. @@ -41,22 +41,22 @@ flags (setting ``RTLD_GLOBAL`` and ``RTLD_NOW``) which should prevent multiple instances of the library. The function ``magicLibraryValue`` can be used to check that this is true (see the test script below). -Makefile --------- +Building With CMake +------------------- -A Makefile fragment to build the example (:download:`download`): +We can use CMake to build the example: -.. literalinclude:: examples/extension/Makefile - :language: make +.. literalinclude:: ../_static/examples/pymod_extension/CMakeLists.txt + :language: cmake Testing the Extension --------------------- -Using the Makefile above creates the shared library ``awesome.so`` which contains +After configuring and building there should be a shared library ``awesome.so`` which contains the extension. Executing the following script using the wrapper script in the same folder -as the shared libray should now work (:download:`download`): +as the shared libray should now work: -.. literalinclude:: examples/extension/test.py +.. literalinclude:: ../_static/examples/pymod_extension/test.py :language: py Command to execute: diff --git a/doc/source/pymod/pymod.rst b/doc/source/pymod/pymod.rst index 3c5b058..e1d96e2 100644 --- a/doc/source/pymod/pymod.rst +++ b/doc/source/pymod/pymod.rst @@ -1,4 +1,3 @@ - .. py:module:: mod ***** diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..f7ef1dc --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,48 @@ +if(NOT BUILD_EXAMPLES) + return() +endif() + +# libmod_cmake +# ============================================================================= +set(workDir ${CMAKE_CURRENT_BINARY_DIR}/workDir/libmod_cmake) +file(MAKE_DIRECTORY ${workDir}) +add_test(NAME example_libmod_cmake_configure + COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" + -DBOOST_ROOT=${BOOST_ROOT} + -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} + ${CMAKE_CURRENT_SOURCE_DIR}/libmod_cmake + WORKING_DIRECTORY ${workDir}) +add_test(NAME example_libmod_cmake_build + COMMAND ${CMAKE_COMMAND} --build . + WORKING_DIRECTORY ${workDir}) +set_tests_properties(example_libmod_cmake_configure PROPERTIES + FIXTURES_SETUP example_libmod_cmake) +set_tests_properties(example_libmod_cmake_build PROPERTIES + FIXTURES_REQUIRED example_libmod_cmake) + +# pymod_extension +# ============================================================================= +set(workDir ${CMAKE_CURRENT_BINARY_DIR}/workDir/pymod_extension) +file(MAKE_DIRECTORY ${workDir}) +add_test(NAME example_pymod_extension_configure + COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" + -DBOOST_ROOT=${BOOST_ROOT} + -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} + ${CMAKE_CURRENT_SOURCE_DIR}/pymod_extension + WORKING_DIRECTORY ${workDir}) +add_test(NAME example_pymod_extension_build + COMMAND ${CMAKE_COMMAND} --build . + WORKING_DIRECTORY ${workDir}) +add_test(NAME example_pymod_extension_run + COMMAND ${CMAKE_INSTALL_FULL_BINDIR}/mod -f ${CMAKE_CURRENT_SOURCE_DIR}/pymod_extension/test.py + WORKING_DIRECTORY ${workDir}) +set_tests_properties(example_pymod_extension_configure PROPERTIES + FIXTURES_SETUP example_pymod_extension) +set_tests_properties(example_pymod_extension_build PROPERTIES + FIXTURES_REQUIRED example_pymod_extension) +set_tests_properties(example_pymod_extension_build PROPERTIES + FIXTURES_SETUP example_pymod_extension_run) +set_tests_properties(example_pymod_extension_run PROPERTIES + FIXTURES_REQUIRED example_pymod_extension_run) + + diff --git a/examples/cmake/FindBoost.cmake b/examples/cmake/FindBoost.cmake new file mode 100644 index 0000000..ce307fa --- /dev/null +++ b/examples/cmake/FindBoost.cmake @@ -0,0 +1,2164 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindBoost +--------- + +Find Boost include dirs and libraries + +Use this module by invoking find_package with the form:: + + find_package(Boost + [version] [EXACT] # Minimum or EXACT version e.g. 1.67.0 + [REQUIRED] # Fail with error if Boost is not found + [COMPONENTS ...] # Boost libraries by their canonical name + # e.g. "date_time" for "libboost_date_time" + [OPTIONAL_COMPONENTS ...] + # Optional Boost libraries by their canonical name) + ) # e.g. "date_time" for "libboost_date_time" + +This module finds headers and requested component libraries OR a CMake +package configuration file provided by a "Boost CMake" build. For the +latter case skip to the "Boost CMake" section below. For the former +case results are reported in variables:: + + Boost_FOUND - True if headers and requested libraries were found + Boost_INCLUDE_DIRS - Boost include directories + Boost_LIBRARY_DIRS - Link directories for Boost libraries + Boost_LIBRARIES - Boost component libraries to be linked + Boost__FOUND - True if component was found ( is upper-case) + Boost__LIBRARY - Libraries to link for component (may include + target_link_libraries debug/optimized keywords) + Boost_VERSION - BOOST_VERSION value from boost/version.hpp + Boost_LIB_VERSION - Version string appended to library filenames + Boost_MAJOR_VERSION - Boost major version number (X in X.y.z) + Boost_MINOR_VERSION - Boost minor version number (Y in x.Y.z) + Boost_SUBMINOR_VERSION - Boost subminor version number (Z in x.y.Z) + Boost_VERSION_STRING - Boost version number in x.y.z format + Boost_LIB_DIAGNOSTIC_DEFINITIONS (Windows) + - Pass to add_definitions() to have diagnostic + information about Boost's automatic linking + displayed during compilation + +Note that Boost Python components require a Python version suffix +(Boost 1.67 and later), e.g. ``python36`` or ``python27`` for the +versions built against Python 3.6 and 2.7, respectively. This also +applies to additional components using Python including +``mpi_python`` and ``numpy``. Earlier Boost releases may use +distribution-specific suffixes such as ``2``, ``3`` or ``2.7``. +These may also be used as suffixes, but note that they are not +portable. + +This module reads hints about search locations from variables:: + + BOOST_ROOT - Preferred installation prefix + (or BOOSTROOT) + BOOST_INCLUDEDIR - Preferred include directory e.g. /include + BOOST_LIBRARYDIR - Preferred library directory e.g. /lib + Boost_NO_SYSTEM_PATHS - Set to ON to disable searching in locations not + specified by these hint variables. Default is OFF. + Boost_ADDITIONAL_VERSIONS + - List of Boost versions not known to this module + (Boost install locations may contain the version) + +and saves search results persistently in CMake cache entries:: + + Boost_INCLUDE_DIR - Directory containing Boost headers + Boost_LIBRARY_DIR_RELEASE - Directory containing release Boost libraries + Boost_LIBRARY_DIR_DEBUG - Directory containing debug Boost libraries + Boost__LIBRARY_DEBUG - Component library debug variant + Boost__LIBRARY_RELEASE - Component library release variant + +The following :prop_tgt:`IMPORTED` targets are also defined:: + + Boost::boost - Target for header-only dependencies + (Boost include directory) + Boost:: - Target for specific component dependency + (shared or static library); is lower- + case + Boost::diagnostic_definitions - interface target to enable diagnostic + information about Boost's automatic linking + during compilation (adds BOOST_LIB_DIAGNOSTIC) + Boost::disable_autolinking - interface target to disable automatic + linking with MSVC (adds BOOST_ALL_NO_LIB) + Boost::dynamic_linking - interface target to enable dynamic linking + linking with MSVC (adds BOOST_ALL_DYN_LINK) + +Implicit dependencies such as Boost::filesystem requiring +Boost::system will be automatically detected and satisfied, even +if system is not specified when using find_package and if +Boost::system is not added to target_link_libraries. If using +Boost::thread, then Threads::Threads will also be added automatically. + +It is important to note that the imported targets behave differently +than variables created by this module: multiple calls to +find_package(Boost) in the same directory or sub-directories with +different options (e.g. static or shared) will not override the +values of the targets created by the first call. + +Users may set these hints or results as cache entries. Projects +should not read these entries directly but instead use the above +result variables. Note that some hint names start in upper-case +"BOOST". One may specify these as environment variables if they are +not specified as CMake variables or cache entries. + +This module first searches for the Boost header files using the above +hint variables (excluding BOOST_LIBRARYDIR) and saves the result in +Boost_INCLUDE_DIR. Then it searches for requested component libraries +using the above hints (excluding BOOST_INCLUDEDIR and +Boost_ADDITIONAL_VERSIONS), "lib" directories near Boost_INCLUDE_DIR, +and the library name configuration settings below. It saves the +library directories in Boost_LIBRARY_DIR_DEBUG and +Boost_LIBRARY_DIR_RELEASE and individual library +locations in Boost__LIBRARY_DEBUG and Boost__LIBRARY_RELEASE. +When one changes settings used by previous searches in the same build +tree (excluding environment variables) this module discards previous +search results affected by the changes and searches again. + +Boost libraries come in many variants encoded in their file name. +Users or projects may tell this module which variant to find by +setting variables:: + + Boost_USE_DEBUG_LIBS - Set to ON or OFF to specify whether to search + and use the debug libraries. Default is ON. + Boost_USE_RELEASE_LIBS - Set to ON or OFF to specify whether to search + and use the release libraries. Default is ON. + Boost_USE_MULTITHREADED - Set to OFF to use the non-multithreaded + libraries ('mt' tag). Default is ON. + Boost_USE_STATIC_LIBS - Set to ON to force the use of the static + libraries. Default is OFF. + Boost_USE_STATIC_RUNTIME - Set to ON or OFF to specify whether to use + libraries linked statically to the C++ runtime + ('s' tag). Default is platform dependent. + Boost_USE_DEBUG_RUNTIME - Set to ON or OFF to specify whether to use + libraries linked to the MS debug C++ runtime + ('g' tag). Default is ON. + Boost_USE_DEBUG_PYTHON - Set to ON to use libraries compiled with a + debug Python build ('y' tag). Default is OFF. + Boost_USE_STLPORT - Set to ON to use libraries compiled with + STLPort ('p' tag). Default is OFF. + Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS + - Set to ON to use libraries compiled with + STLPort deprecated "native iostreams" + ('n' tag). Default is OFF. + Boost_COMPILER - Set to the compiler-specific library suffix + (e.g. "-gcc43"). Default is auto-computed + for the C++ compiler in use. A list may be + used if multiple compatible suffixes should + be tested for, in decreasing order of + preference. + Boost_ARCHITECTURE - Set to the architecture-specific library suffix + (e.g. "-x64"). Default is auto-computed for the + C++ compiler in use. + Boost_THREADAPI - Suffix for "thread" component library name, + such as "pthread" or "win32". Names with + and without this suffix will both be tried. + Boost_NAMESPACE - Alternate namespace used to build boost with + e.g. if set to "myboost", will search for + myboost_thread instead of boost_thread. + +Other variables one may set to control this module are:: + + Boost_DEBUG - Set to ON to enable debug output from FindBoost. + Please enable this before filing any bug report. + Boost_DETAILED_FAILURE_MSG + - Set to ON to add detailed information to the + failure message even when the REQUIRED option + is not given to the find_package call. + Boost_REALPATH - Set to ON to resolve symlinks for discovered + libraries to assist with packaging. For example, + the "system" component library may be resolved to + "/usr/lib/libboost_system.so.1.67.0" instead of + "/usr/lib/libboost_system.so". This does not + affect linking and should not be enabled unless + the user needs this information. + Boost_LIBRARY_DIR - Default value for Boost_LIBRARY_DIR_RELEASE and + Boost_LIBRARY_DIR_DEBUG. + +On Visual Studio and Borland compilers Boost headers request automatic +linking to corresponding libraries. This requires matching libraries +to be linked explicitly or available in the link library search path. +In this case setting Boost_USE_STATIC_LIBS to OFF may not achieve +dynamic linking. Boost automatic linking typically requests static +libraries with a few exceptions (such as Boost.Python). Use:: + + add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS}) + +to ask Boost to report information about automatic linking requests. + +Example to find Boost headers only:: + + find_package(Boost 1.36.0) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + add_executable(foo foo.cc) + endif() + +Example to find Boost libraries and use imported targets:: + + find_package(Boost 1.56 REQUIRED COMPONENTS + date_time filesystem iostreams) + add_executable(foo foo.cc) + target_link_libraries(foo Boost::date_time Boost::filesystem + Boost::iostreams) + +Example to find Boost Python 3.6 libraries and use imported targets:: + + find_package(Boost 1.67 REQUIRED COMPONENTS + python36 numpy36) + add_executable(foo foo.cc) + target_link_libraries(foo Boost::python36 Boost::numpy36) + +Example to find Boost headers and some *static* (release only) libraries:: + + set(Boost_USE_STATIC_LIBS ON) # only find static libs + set(Boost_USE_DEBUG_LIBS OFF) # ignore debug libs and + set(Boost_USE_RELEASE_LIBS ON) # only find release libs + set(Boost_USE_MULTITHREADED ON) + set(Boost_USE_STATIC_RUNTIME OFF) + find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + add_executable(foo foo.cc) + target_link_libraries(foo ${Boost_LIBRARIES}) + endif() + +Boost CMake +^^^^^^^^^^^ + +If Boost was built using the boost-cmake project it provides a package +configuration file for use with find_package's Config mode. This +module looks for the package configuration file called +BoostConfig.cmake or boost-config.cmake and stores the result in cache +entry "Boost_DIR". If found, the package configuration file is loaded +and this module returns with no further action. See documentation of +the Boost CMake package configuration for details on what it provides. + +Set Boost_NO_BOOST_CMAKE to ON to disable the search for boost-cmake. +#]=======================================================================] + +# Save project's policies +cmake_policy(PUSH) +cmake_policy(SET CMP0057 NEW) # if IN_LIST + +#------------------------------------------------------------------------------- +# Before we go searching, check whether boost-cmake is available, unless the +# user specifically asked NOT to search for boost-cmake. +# +# If Boost_DIR is set, this behaves as any find_package call would. If not, +# it looks at BOOST_ROOT and BOOSTROOT to find Boost. +# +if (NOT Boost_NO_BOOST_CMAKE) + # If Boost_DIR is not set, look for BOOSTROOT and BOOST_ROOT as alternatives, + # since these are more conventional for Boost. + if ("$ENV{Boost_DIR}" STREQUAL "") + if (NOT "$ENV{BOOST_ROOT}" STREQUAL "") + set(ENV{Boost_DIR} $ENV{BOOST_ROOT}) + elseif (NOT "$ENV{BOOSTROOT}" STREQUAL "") + set(ENV{Boost_DIR} $ENV{BOOSTROOT}) + endif() + endif() + + # Do the same find_package call but look specifically for the CMake version. + # Note that args are passed in the Boost_FIND_xxxxx variables, so there is no + # need to delegate them to this find_package call. + find_package(Boost QUIET NO_MODULE) + mark_as_advanced(Boost_DIR) + + # If we found boost-cmake, then we're done. Print out what we found. + # Otherwise let the rest of the module try to find it. + if (Boost_FOUND) + message(STATUS "Boost ${Boost_FIND_VERSION} found.") + if (Boost_FIND_COMPONENTS) + message(STATUS "Found Boost components:\n ${Boost_FIND_COMPONENTS}") + endif() + # Restore project's policies + cmake_policy(POP) + return() + endif() +endif() + + +#------------------------------------------------------------------------------- +# FindBoost functions & macros +# + +############################################ +# +# Check the existence of the libraries. +# +############################################ +# This macro was taken directly from the FindQt4.cmake file that is included +# with the CMake distribution. This is NOT my work. All work was done by the +# original authors of the FindQt4.cmake file. Only minor modifications were +# made to remove references to Qt and make this file more generally applicable +# And ELSE/ENDIF pairs were removed for readability. +######################################################################### + +macro(_Boost_ADJUST_LIB_VARS basename) + if(Boost_INCLUDE_DIR ) + if(Boost_${basename}_LIBRARY_DEBUG AND Boost_${basename}_LIBRARY_RELEASE) + # if the generator is multi-config or if CMAKE_BUILD_TYPE is set for + # single-config generators, set optimized and debug libraries + get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(_isMultiConfig OR CMAKE_BUILD_TYPE) + set(Boost_${basename}_LIBRARY optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG}) + else() + # For single-config generators where CMAKE_BUILD_TYPE has no value, + # just use the release libraries + set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE} ) + endif() + # FIXME: This probably should be set for both cases + set(Boost_${basename}_LIBRARIES optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG}) + endif() + + # if only the release version was found, set the debug variable also to the release version + if(Boost_${basename}_LIBRARY_RELEASE AND NOT Boost_${basename}_LIBRARY_DEBUG) + set(Boost_${basename}_LIBRARY_DEBUG ${Boost_${basename}_LIBRARY_RELEASE}) + set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE}) + set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_RELEASE}) + endif() + + # if only the debug version was found, set the release variable also to the debug version + if(Boost_${basename}_LIBRARY_DEBUG AND NOT Boost_${basename}_LIBRARY_RELEASE) + set(Boost_${basename}_LIBRARY_RELEASE ${Boost_${basename}_LIBRARY_DEBUG}) + set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_DEBUG}) + set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_DEBUG}) + endif() + + # If the debug & release library ends up being the same, omit the keywords + if("${Boost_${basename}_LIBRARY_RELEASE}" STREQUAL "${Boost_${basename}_LIBRARY_DEBUG}") + set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE} ) + set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_RELEASE} ) + endif() + + if(Boost_${basename}_LIBRARY AND Boost_${basename}_HEADER) + set(Boost_${basename}_FOUND ON) + if("x${basename}" STREQUAL "xTHREAD" AND NOT TARGET Threads::Threads) + string(APPEND Boost_ERROR_REASON_THREAD " (missing dependency: Threads)") + set(Boost_THREAD_FOUND OFF) + endif() + endif() + + endif() + # Make variables changeable to the advanced user + mark_as_advanced( + Boost_${basename}_LIBRARY_RELEASE + Boost_${basename}_LIBRARY_DEBUG + ) +endmacro() + +# Detect changes in used variables. +# Compares the current variable value with the last one. +# In short form: +# v != v_LAST -> CHANGED = 1 +# v is defined, v_LAST not -> CHANGED = 1 +# v is not defined, but v_LAST is -> CHANGED = 1 +# otherwise -> CHANGED = 0 +# CHANGED is returned in variable named ${changed_var} +macro(_Boost_CHANGE_DETECT changed_var) + set(${changed_var} 0) + foreach(v ${ARGN}) + if(DEFINED _Boost_COMPONENTS_SEARCHED) + if(${v}) + if(_${v}_LAST) + string(COMPARE NOTEQUAL "${${v}}" "${_${v}_LAST}" _${v}_CHANGED) + else() + set(_${v}_CHANGED 1) + endif() + elseif(_${v}_LAST) + set(_${v}_CHANGED 1) + endif() + if(_${v}_CHANGED) + set(${changed_var} 1) + endif() + else() + set(_${v}_CHANGED 0) + endif() + endforeach() +endmacro() + +# +# Find the given library (var). +# Use 'build_type' to support different lib paths for RELEASE or DEBUG builds +# +macro(_Boost_FIND_LIBRARY var build_type) + + find_library(${var} ${ARGN}) + + if(${var}) + # If this is the first library found then save Boost_LIBRARY_DIR_[RELEASE,DEBUG]. + if(NOT Boost_LIBRARY_DIR_${build_type}) + get_filename_component(_dir "${${var}}" PATH) + set(Boost_LIBRARY_DIR_${build_type} "${_dir}" CACHE PATH "Boost library directory ${build_type}" FORCE) + endif() + elseif(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT) + # Try component-specific hints but do not save Boost_LIBRARY_DIR_[RELEASE,DEBUG]. + find_library(${var} HINTS ${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT} ${ARGN}) + endif() + + # If Boost_LIBRARY_DIR_[RELEASE,DEBUG] is known then search only there. + if(Boost_LIBRARY_DIR_${build_type}) + set(_boost_LIBRARY_SEARCH_DIRS_${build_type} ${Boost_LIBRARY_DIR_${build_type}} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " Boost_LIBRARY_DIR_${build_type} = ${Boost_LIBRARY_DIR_${build_type}}" + " _boost_LIBRARY_SEARCH_DIRS_${build_type} = ${_boost_LIBRARY_SEARCH_DIRS_${build_type}}") + endif() + endif() +endmacro() + +#------------------------------------------------------------------------------- + +# Convert CMAKE_CXX_COMPILER_VERSION to boost compiler suffix version. +function(_Boost_COMPILER_DUMPVERSION _OUTPUT_VERSION _OUTPUT_VERSION_MAJOR _OUTPUT_VERSION_MINOR) + string(REGEX REPLACE "([0-9]+)\\.([0-9]+)(\\.[0-9]+)?" "\\1" + _boost_COMPILER_VERSION_MAJOR "${CMAKE_CXX_COMPILER_VERSION}") + string(REGEX REPLACE "([0-9]+)\\.([0-9]+)(\\.[0-9]+)?" "\\2" + _boost_COMPILER_VERSION_MINOR "${CMAKE_CXX_COMPILER_VERSION}") + + set(_boost_COMPILER_VERSION "${_boost_COMPILER_VERSION_MAJOR}${_boost_COMPILER_VERSION_MINOR}") + + set(${_OUTPUT_VERSION} ${_boost_COMPILER_VERSION} PARENT_SCOPE) + set(${_OUTPUT_VERSION_MAJOR} ${_boost_COMPILER_VERSION_MAJOR} PARENT_SCOPE) + set(${_OUTPUT_VERSION_MINOR} ${_boost_COMPILER_VERSION_MINOR} PARENT_SCOPE) +endfunction() + +# +# Take a list of libraries with "thread" in it +# and prepend duplicates with "thread_${Boost_THREADAPI}" +# at the front of the list +# +function(_Boost_PREPEND_LIST_WITH_THREADAPI _output) + set(_orig_libnames ${ARGN}) + string(REPLACE "thread" "thread_${Boost_THREADAPI}" _threadapi_libnames "${_orig_libnames}") + set(${_output} ${_threadapi_libnames} ${_orig_libnames} PARENT_SCOPE) +endfunction() + +# +# If a library is found, replace its cache entry with its REALPATH +# +function(_Boost_SWAP_WITH_REALPATH _library _docstring) + if(${_library}) + get_filename_component(_boost_filepathreal ${${_library}} REALPATH) + unset(${_library} CACHE) + set(${_library} ${_boost_filepathreal} CACHE FILEPATH "${_docstring}") + endif() +endfunction() + +function(_Boost_CHECK_SPELLING _var) + if(${_var}) + string(TOUPPER ${_var} _var_UC) + message(FATAL_ERROR "ERROR: ${_var} is not the correct spelling. The proper spelling is ${_var_UC}.") + endif() +endfunction() + +# Guesses Boost's compiler prefix used in built library names +# Returns the guess by setting the variable pointed to by _ret +function(_Boost_GUESS_COMPILER_PREFIX _ret) + if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xIntel") + if(WIN32) + set (_boost_COMPILER "-iw") + else() + set (_boost_COMPILER "-il") + endif() + elseif (GHSMULTI) + set(_boost_COMPILER "-ghs") + elseif("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") + if(MSVC_TOOLSET_VERSION GREATER_EQUAL 141) + set(_boost_COMPILER "-vc141;-vc140") + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 80) + set(_boost_COMPILER "-vc${MSVC_TOOLSET_VERSION}") + elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.10) + set(_boost_COMPILER "-vc71") + elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13) # Good luck! + set(_boost_COMPILER "-vc7") # yes, this is correct + else() # VS 6.0 Good luck! + set(_boost_COMPILER "-vc6") # yes, this is correct + endif() + elseif (BORLAND) + set(_boost_COMPILER "-bcb") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") + set(_boost_COMPILER "-sw") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "XL") + set(_boost_COMPILER "-xlc") + elseif (MINGW) + if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) + set(_boost_COMPILER "-mgw") # no GCC version encoding prior to 1.34 + else() + _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION _boost_COMPILER_VERSION_MAJOR _boost_COMPILER_VERSION_MINOR) + set(_boost_COMPILER "-mgw${_boost_COMPILER_VERSION}") + endif() + elseif (UNIX) + _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION _boost_COMPILER_VERSION_MAJOR _boost_COMPILER_VERSION_MINOR) + if(NOT Boost_VERSION VERSION_LESS 106900) + # From GCC 5 and clang 4, versioning changes and minor becomes patch. + # For those compilers, patch is exclude from compiler tag in Boost 1.69+ library naming. + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND _boost_COMPILER_VERSION_MAJOR VERSION_GREATER 4) + set(_boost_COMPILER_VERSION "${_boost_COMPILER_VERSION_MAJOR}") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND _boost_COMPILER_VERSION_MAJOR VERSION_GREATER 3) + set(_boost_COMPILER_VERSION "${_boost_COMPILER_VERSION_MAJOR}") + endif() + endif() + + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) + set(_boost_COMPILER "-gcc") # no GCC version encoding prior to 1.34 + else() + # Determine which version of GCC we have. + if(APPLE) + if(Boost_MINOR_VERSION) + if(${Boost_MINOR_VERSION} GREATER 35) + # In Boost 1.36.0 and newer, the mangled compiler name used + # on macOS/Darwin is "xgcc". + set(_boost_COMPILER "-xgcc${_boost_COMPILER_VERSION}") + else() + # In Boost <= 1.35.0, there is no mangled compiler name for + # the macOS/Darwin version of GCC. + set(_boost_COMPILER "") + endif() + else() + # We don't know the Boost version, so assume it's + # pre-1.36.0. + set(_boost_COMPILER "") + endif() + else() + set(_boost_COMPILER "-gcc${_boost_COMPILER_VERSION}") + endif() + endif() + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + # TODO: Find out any Boost version constraints vs clang support. + set(_boost_COMPILER "-clang${_boost_COMPILER_VERSION}") + endif() + else() + # TODO at least Boost_DEBUG here? + set(_boost_COMPILER "") + endif() + set(${_ret} ${_boost_COMPILER} PARENT_SCOPE) +endfunction() + +# +# Get component dependencies. Requires the dependencies to have been +# defined for the Boost release version. +# +# component - the component to check +# _ret - list of library dependencies +# +function(_Boost_COMPONENT_DEPENDENCIES component _ret) + # Note: to add a new Boost release, run + # + # % cmake -DBOOST_DIR=/path/to/boost/source -P Utilities/Scripts/BoostScanDeps.cmake + # + # The output may be added in a new block below. If it's the same as + # the previous release, simply update the version range of the block + # for the previous release. Also check if any new components have + # been added, and add any new components to + # _Boost_COMPONENT_HEADERS. + # + # This information was originally generated by running + # BoostScanDeps.cmake against every boost release to date supported + # by FindBoost: + # + # % for version in /path/to/boost/sources/* + # do + # cmake -DBOOST_DIR=$version -P Utilities/Scripts/BoostScanDeps.cmake + # done + # + # The output was then updated by search and replace with these regexes: + # + # - Strip message(STATUS) prefix dashes + # s;^-- ;; + # - Indent + # s;^set(; set(;; + # - Add conditionals + # s;Scanning /path/to/boost/sources/boost_\(.*\)_\(.*\)_\(.*); elseif(NOT Boost_VERSION VERSION_LESS \10\20\3 AND Boost_VERSION VERSION_LESS xxxx); + # + # This results in the logic seen below, but will require the xxxx + # replacing with the following Boost release version (or the next + # minor version to be released, e.g. 1.59 was the latest at the time + # of writing, making 1.60 the next, so 106000 is the needed version + # number). Identical consecutive releases were then merged together + # by updating the end range of the first block and removing the + # following redundant blocks. + # + # Running the script against all historical releases should be + # required only if the BoostScanDeps.cmake script logic is changed. + # The addition of a new release should only require it to be run + # against the new release. + + # Handle Python version suffixes + if(component MATCHES "^(python|mpi_python|numpy)([0-9][0-9]?|[0-9]\\.[0-9])\$") + set(component "${CMAKE_MATCH_1}") + set(component_python_version "${CMAKE_MATCH_2}") + endif() + + set(_Boost_IMPORTED_TARGETS TRUE) + if(Boost_VERSION AND Boost_VERSION VERSION_LESS 103300) + message(WARNING "Imported targets and dependency information not available for Boost version ${Boost_VERSION} (all versions older than 1.33)") + set(_Boost_IMPORTED_TARGETS FALSE) + elseif(NOT Boost_VERSION VERSION_LESS 103300 AND Boost_VERSION VERSION_LESS 103500) + set(_Boost_IOSTREAMS_DEPENDENCIES regex thread) + set(_Boost_REGEX_DEPENDENCIES thread) + set(_Boost_WAVE_DEPENDENCIES filesystem thread) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 103500 AND Boost_VERSION VERSION_LESS 103600) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_WAVE_DEPENDENCIES filesystem system thread) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 103600 AND Boost_VERSION VERSION_LESS 103800) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_WAVE_DEPENDENCIES filesystem system thread) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 103800 AND Boost_VERSION VERSION_LESS 104300) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES filesystem system thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104300 AND Boost_VERSION VERSION_LESS 104400) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES filesystem system thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104400 AND Boost_VERSION VERSION_LESS 104500) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random serialization) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES serialization filesystem system thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104500 AND Boost_VERSION VERSION_LESS 104700) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104700 AND Boost_VERSION VERSION_LESS 104800) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 104800 AND Boost_VERSION VERSION_LESS 105000) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES date_time) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105000 AND Boost_VERSION VERSION_LESS 105300) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105300 AND Boost_VERSION VERSION_LESS 105400) + set(_Boost_ATOMIC_DEPENDENCIES thread chrono system date_time) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105400 AND Boost_VERSION VERSION_LESS 105500) + set(_Boost_ATOMIC_DEPENDENCIES thread chrono system date_time) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105500 AND Boost_VERSION VERSION_LESS 105600) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105600 AND Boost_VERSION VERSION_LESS 105900) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 105900 AND Boost_VERSION VERSION_LESS 106000) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106000 AND Boost_VERSION VERSION_LESS 106100) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106100 AND Boost_VERSION VERSION_LESS 106200) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106200 AND Boost_VERSION VERSION_LESS 106300) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106300 AND Boost_VERSION VERSION_LESS 106500) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_COROUTINE2_DEPENDENCIES context fiber thread chrono system date_time) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106500 AND Boost_VERSION VERSION_LESS 106700) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106700 AND Boost_VERSION VERSION_LESS 106800) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + elseif(NOT Boost_VERSION VERSION_LESS 106800 AND Boost_VERSION VERSION_LESS 106900) + set(_Boost_CHRONO_DEPENDENCIES system) + set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) + set(_Boost_CONTRACT_DEPENDENCIES thread chrono system date_time) + set(_Boost_COROUTINE_DEPENDENCIES context system) + set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) + set(_Boost_FILESYSTEM_DEPENDENCIES system) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) + set(_Boost_RANDOM_DEPENDENCIES system) + set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + else() + if(NOT Boost_VERSION VERSION_LESS 106900) + set(_Boost_CONTRACT_DEPENDENCIES thread chrono date_time) + set(_Boost_COROUTINE_DEPENDENCIES context) + set(_Boost_FIBER_DEPENDENCIES context) + set(_Boost_IOSTREAMS_DEPENDENCIES regex) + set(_Boost_LOG_DEPENDENCIES date_time log_setup filesystem thread regex chrono atomic) + set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) + set(_Boost_MPI_DEPENDENCIES serialization) + set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) + set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) + set(_Boost_THREAD_DEPENDENCIES chrono date_time atomic) + set(_Boost_TIMER_DEPENDENCIES chrono system) + set(_Boost_WAVE_DEPENDENCIES filesystem serialization thread chrono date_time atomic) + set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) + endif() + if(NOT Boost_VERSION VERSION_LESS 107000) + message(WARNING "New Boost version may have incorrect or missing dependencies and imported targets") + endif() + endif() + + string(TOUPPER ${component} uppercomponent) + set(${_ret} ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE) + set(_Boost_IMPORTED_TARGETS ${_Boost_IMPORTED_TARGETS} PARENT_SCOPE) + + string(REGEX REPLACE ";" " " _boost_DEPS_STRING "${_Boost_${uppercomponent}_DEPENDENCIES}") + if (NOT _boost_DEPS_STRING) + set(_boost_DEPS_STRING "(none)") + endif() + # message(STATUS "Dependencies for Boost::${component}: ${_boost_DEPS_STRING}") +endfunction() + +# +# Get component headers. This is the primary header (or headers) for +# a given component, and is used to check that the headers are present +# as well as the library itself as an extra sanity check of the build +# environment. +# +# component - the component to check +# _hdrs +# +function(_Boost_COMPONENT_HEADERS component _hdrs) + # Handle Python version suffixes + if(component MATCHES "^(python|mpi_python|numpy)([0-9][0-9]?|[0-9]\\.[0-9])\$") + set(component "${CMAKE_MATCH_1}") + set(component_python_version "${CMAKE_MATCH_2}") + endif() + + # Note: new boost components will require adding here. The header + # must be present in all versions of Boost providing a library. + set(_Boost_ATOMIC_HEADERS "boost/atomic.hpp") + set(_Boost_CHRONO_HEADERS "boost/chrono.hpp") + set(_Boost_CONTAINER_HEADERS "boost/container/container_fwd.hpp") + set(_Boost_CONTRACT_HEADERS "boost/contract.hpp") + if(Boost_VERSION VERSION_LESS 106100) + set(_Boost_CONTEXT_HEADERS "boost/context/all.hpp") + else() + set(_Boost_CONTEXT_HEADERS "boost/context/detail/fcontext.hpp") + endif() + set(_Boost_COROUTINE_HEADERS "boost/coroutine/all.hpp") + set(_Boost_DATE_TIME_HEADERS "boost/date_time/date.hpp") + set(_Boost_EXCEPTION_HEADERS "boost/exception/exception.hpp") + set(_Boost_FIBER_HEADERS "boost/fiber/all.hpp") + set(_Boost_FILESYSTEM_HEADERS "boost/filesystem/path.hpp") + set(_Boost_GRAPH_HEADERS "boost/graph/adjacency_list.hpp") + set(_Boost_GRAPH_PARALLEL_HEADERS "boost/graph/adjacency_list.hpp") + set(_Boost_IOSTREAMS_HEADERS "boost/iostreams/stream.hpp") + set(_Boost_LOCALE_HEADERS "boost/locale.hpp") + set(_Boost_LOG_HEADERS "boost/log/core.hpp") + set(_Boost_LOG_SETUP_HEADERS "boost/log/detail/setup_config.hpp") + set(_Boost_MATH_HEADERS "boost/math_fwd.hpp") + set(_Boost_MATH_C99_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_C99F_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_C99L_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_TR1_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_TR1F_HEADERS "boost/math/tr1.hpp") + set(_Boost_MATH_TR1L_HEADERS "boost/math/tr1.hpp") + set(_Boost_MPI_HEADERS "boost/mpi.hpp") + set(_Boost_MPI_PYTHON_HEADERS "boost/mpi/python/config.hpp") + set(_Boost_NUMPY_HEADERS "boost/python/numpy.hpp") + set(_Boost_PRG_EXEC_MONITOR_HEADERS "boost/test/prg_exec_monitor.hpp") + set(_Boost_PROGRAM_OPTIONS_HEADERS "boost/program_options.hpp") + set(_Boost_PYTHON_HEADERS "boost/python.hpp") + set(_Boost_RANDOM_HEADERS "boost/random.hpp") + set(_Boost_REGEX_HEADERS "boost/regex.hpp") + set(_Boost_SERIALIZATION_HEADERS "boost/serialization/serialization.hpp") + set(_Boost_SIGNALS_HEADERS "boost/signals.hpp") + set(_Boost_STACKTRACE_ADDR2LINE_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_BACKTRACE_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_BASIC_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_NOOP_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_WINDBG_CACHED_HEADERS "boost/stacktrace.hpp") + set(_Boost_STACKTRACE_WINDBG_HEADERS "boost/stacktrace.hpp") + set(_Boost_SYSTEM_HEADERS "boost/system/config.hpp") + set(_Boost_TEST_EXEC_MONITOR_HEADERS "boost/test/test_exec_monitor.hpp") + set(_Boost_THREAD_HEADERS "boost/thread.hpp") + set(_Boost_TIMER_HEADERS "boost/timer.hpp") + set(_Boost_TYPE_ERASURE_HEADERS "boost/type_erasure/config.hpp") + set(_Boost_UNIT_TEST_FRAMEWORK_HEADERS "boost/test/framework.hpp") + set(_Boost_WAVE_HEADERS "boost/wave.hpp") + set(_Boost_WSERIALIZATION_HEADERS "boost/archive/text_wiarchive.hpp") + if(WIN32) + set(_Boost_BZIP2_HEADERS "boost/iostreams/filter/bzip2.hpp") + set(_Boost_ZLIB_HEADERS "boost/iostreams/filter/zlib.hpp") + endif() + + string(TOUPPER ${component} uppercomponent) + set(${_hdrs} ${_Boost_${uppercomponent}_HEADERS} PARENT_SCOPE) + + string(REGEX REPLACE ";" " " _boost_HDRS_STRING "${_Boost_${uppercomponent}_HEADERS}") + if (NOT _boost_HDRS_STRING) + set(_boost_HDRS_STRING "(none)") + endif() + # message(STATUS "Headers for Boost::${component}: ${_boost_HDRS_STRING}") +endfunction() + +# +# Determine if any missing dependencies require adding to the component list. +# +# Sets _Boost_${COMPONENT}_DEPENDENCIES for each required component, +# plus _Boost_IMPORTED_TARGETS (TRUE if imported targets should be +# defined; FALSE if dependency information is unavailable). +# +# componentvar - the component list variable name +# extravar - the indirect dependency list variable name +# +# +function(_Boost_MISSING_DEPENDENCIES componentvar extravar) + # _boost_unprocessed_components - list of components requiring processing + # _boost_processed_components - components already processed (or currently being processed) + # _boost_new_components - new components discovered for future processing + # + list(APPEND _boost_unprocessed_components ${${componentvar}}) + + while(_boost_unprocessed_components) + list(APPEND _boost_processed_components ${_boost_unprocessed_components}) + foreach(component ${_boost_unprocessed_components}) + string(TOUPPER ${component} uppercomponent) + set(${_ret} ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE) + _Boost_COMPONENT_DEPENDENCIES("${component}" _Boost_${uppercomponent}_DEPENDENCIES) + set(_Boost_${uppercomponent}_DEPENDENCIES ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE) + set(_Boost_IMPORTED_TARGETS ${_Boost_IMPORTED_TARGETS} PARENT_SCOPE) + foreach(componentdep ${_Boost_${uppercomponent}_DEPENDENCIES}) + if (NOT ("${componentdep}" IN_LIST _boost_processed_components OR "${componentdep}" IN_LIST _boost_new_components)) + list(APPEND _boost_new_components ${componentdep}) + endif() + endforeach() + endforeach() + set(_boost_unprocessed_components ${_boost_new_components}) + unset(_boost_new_components) + endwhile() + set(_boost_extra_components ${_boost_processed_components}) + if(_boost_extra_components AND ${componentvar}) + list(REMOVE_ITEM _boost_extra_components ${${componentvar}}) + endif() + set(${componentvar} ${_boost_processed_components} PARENT_SCOPE) + set(${extravar} ${_boost_extra_components} PARENT_SCOPE) +endfunction() + +# +# Some boost libraries may require particular set of compler features. +# The very first one was `boost::fiber` introduced in Boost 1.62. +# One can check required compiler features of it in +# `${Boost_ROOT}/libs/fiber/build/Jamfile.v2`. +# +function(_Boost_COMPILER_FEATURES component _ret) + # Boost >= 1.62 and < 1.67 + if(NOT Boost_VERSION VERSION_LESS 106200 AND Boost_VERSION VERSION_LESS 106700) + set(_Boost_FIBER_COMPILER_FEATURES + cxx_alias_templates + cxx_auto_type + cxx_constexpr + cxx_defaulted_functions + cxx_final + cxx_lambdas + cxx_noexcept + cxx_nullptr + cxx_rvalue_references + cxx_thread_local + cxx_variadic_templates + ) + endif() + string(TOUPPER ${component} uppercomponent) + set(${_ret} ${_Boost_${uppercomponent}_COMPILER_FEATURES} PARENT_SCOPE) +endfunction() + +# +# Update library search directory hint variable with paths used by prebuilt boost binaries. +# +# Prebuilt windows binaries (https://sourceforge.net/projects/boost/files/boost-binaries/) +# have library directories named using MSVC compiler version and architecture. +# This function would append corresponding directories if MSVC is a current compiler, +# so having `BOOST_ROOT` would be enough to specify to find everything. +# +function(_Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS componentlibvar basedir) + if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_arch_suffix 64) + else() + set(_arch_suffix 32) + endif() + if(MSVC_TOOLSET_VERSION GREATER_EQUAL 141) + list(APPEND ${componentlibvar} ${basedir}/lib${_arch_suffix}-msvc-14.1) + list(APPEND ${componentlibvar} ${basedir}/lib${_arch_suffix}-msvc-14.0) + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 80) + math(EXPR _toolset_major_version "${MSVC_TOOLSET_VERSION} / 10") + list(APPEND ${componentlibvar} ${basedir}/lib${_arch_suffix}-msvc-${_toolset_major_version}.0) + endif() + set(${componentlibvar} ${${componentlibvar}} PARENT_SCOPE) + endif() +endfunction() + +# +# End functions/macros +# +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# main. +#------------------------------------------------------------------------------- + + +# If the user sets Boost_LIBRARY_DIR, use it as the default for both +# configurations. +if(NOT Boost_LIBRARY_DIR_RELEASE AND Boost_LIBRARY_DIR) + set(Boost_LIBRARY_DIR_RELEASE "${Boost_LIBRARY_DIR}") +endif() +if(NOT Boost_LIBRARY_DIR_DEBUG AND Boost_LIBRARY_DIR) + set(Boost_LIBRARY_DIR_DEBUG "${Boost_LIBRARY_DIR}") +endif() + +if(NOT DEFINED Boost_USE_DEBUG_LIBS) + set(Boost_USE_DEBUG_LIBS TRUE) +endif() +if(NOT DEFINED Boost_USE_RELEASE_LIBS) + set(Boost_USE_RELEASE_LIBS TRUE) +endif() +if(NOT DEFINED Boost_USE_MULTITHREADED) + set(Boost_USE_MULTITHREADED TRUE) +endif() +if(NOT DEFINED Boost_USE_DEBUG_RUNTIME) + set(Boost_USE_DEBUG_RUNTIME TRUE) +endif() + +# Check the version of Boost against the requested version. +if(Boost_FIND_VERSION AND NOT Boost_FIND_VERSION_MINOR) + message(SEND_ERROR "When requesting a specific version of Boost, you must provide at least the major and minor version numbers, e.g., 1.34") +endif() + +if(Boost_FIND_VERSION_EXACT) + # The version may appear in a directory with or without the patch + # level, even when the patch level is non-zero. + set(_boost_TEST_VERSIONS + "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}.${Boost_FIND_VERSION_PATCH}" + "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") +else() + # The user has not requested an exact version. Among known + # versions, find those that are acceptable to the user request. + # + # Note: When adding a new Boost release, also update the dependency + # information in _Boost_COMPONENT_DEPENDENCIES and + # _Boost_COMPONENT_HEADERS. See the instructions at the top of + # _Boost_COMPONENT_DEPENDENCIES. + set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS} + "1.69.0" "1.69" + "1.68.0" "1.68" "1.67.0" "1.67" "1.66.0" "1.66" "1.65.1" "1.65.0" "1.65" + "1.64.0" "1.64" "1.63.0" "1.63" "1.62.0" "1.62" "1.61.0" "1.61" "1.60.0" "1.60" + "1.59.0" "1.59" "1.58.0" "1.58" "1.57.0" "1.57" "1.56.0" "1.56" "1.55.0" "1.55" + "1.54.0" "1.54" "1.53.0" "1.53" "1.52.0" "1.52" "1.51.0" "1.51" + "1.50.0" "1.50" "1.49.0" "1.49" "1.48.0" "1.48" "1.47.0" "1.47" "1.46.1" + "1.46.0" "1.46" "1.45.0" "1.45" "1.44.0" "1.44" "1.43.0" "1.43" "1.42.0" "1.42" + "1.41.0" "1.41" "1.40.0" "1.40" "1.39.0" "1.39" "1.38.0" "1.38" "1.37.0" "1.37" + "1.36.1" "1.36.0" "1.36" "1.35.1" "1.35.0" "1.35" "1.34.1" "1.34.0" + "1.34" "1.33.1" "1.33.0" "1.33") + + set(_boost_TEST_VERSIONS) + if(Boost_FIND_VERSION) + set(_Boost_FIND_VERSION_SHORT "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") + # Select acceptable versions. + foreach(version ${_Boost_KNOWN_VERSIONS}) + if(NOT "${version}" VERSION_LESS "${Boost_FIND_VERSION}") + # This version is high enough. + list(APPEND _boost_TEST_VERSIONS "${version}") + elseif("${version}.99" VERSION_EQUAL "${_Boost_FIND_VERSION_SHORT}.99") + # This version is a short-form for the requested version with + # the patch level dropped. + list(APPEND _boost_TEST_VERSIONS "${version}") + endif() + endforeach() + else() + # Any version is acceptable. + set(_boost_TEST_VERSIONS "${_Boost_KNOWN_VERSIONS}") + endif() +endif() + +# The reason that we failed to find Boost. This will be set to a +# user-friendly message when we fail to find some necessary piece of +# Boost. +set(Boost_ERROR_REASON) + +if(Boost_DEBUG) + # Output some of their choices + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_USE_MULTITHREADED = ${Boost_USE_MULTITHREADED}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_USE_STATIC_LIBS = ${Boost_USE_STATIC_LIBS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_USE_STATIC_RUNTIME = ${Boost_USE_STATIC_RUNTIME}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_ADDITIONAL_VERSIONS = ${Boost_ADDITIONAL_VERSIONS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_NO_SYSTEM_PATHS = ${Boost_NO_SYSTEM_PATHS}") +endif() + +# Supply Boost_LIB_DIAGNOSTIC_DEFINITIONS as a convenience target. It +# will only contain any interface definitions on WIN32, but is created +# on all platforms to keep end user code free from platform dependent +# code. Also provide convenience targets to disable autolinking and +# enable dynamic linking. +if(NOT TARGET Boost::diagnostic_definitions) + add_library(Boost::diagnostic_definitions INTERFACE IMPORTED) + add_library(Boost::disable_autolinking INTERFACE IMPORTED) + add_library(Boost::dynamic_linking INTERFACE IMPORTED) +endif() +if(WIN32) + # In windows, automatic linking is performed, so you do not have + # to specify the libraries. If you are linking to a dynamic + # runtime, then you can choose to link to either a static or a + # dynamic Boost library, the default is to do a static link. You + # can alter this for a specific library "whatever" by defining + # BOOST_WHATEVER_DYN_LINK to force Boost library "whatever" to be + # linked dynamically. Alternatively you can force all Boost + # libraries to dynamic link by defining BOOST_ALL_DYN_LINK. + + # This feature can be disabled for Boost library "whatever" by + # defining BOOST_WHATEVER_NO_LIB, or for all of Boost by defining + # BOOST_ALL_NO_LIB. + + # If you want to observe which libraries are being linked against + # then defining BOOST_LIB_DIAGNOSTIC will cause the auto-linking + # code to emit a #pragma message each time a library is selected + # for linking. + set(Boost_LIB_DIAGNOSTIC_DEFINITIONS "-DBOOST_LIB_DIAGNOSTIC") + set_target_properties(Boost::diagnostic_definitions PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "BOOST_LIB_DIAGNOSTIC") + set_target_properties(Boost::disable_autolinking PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "BOOST_ALL_NO_LIB") + set_target_properties(Boost::dynamic_linking PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "BOOST_ALL_DYN_LINK") +endif() + +_Boost_CHECK_SPELLING(Boost_ROOT) +_Boost_CHECK_SPELLING(Boost_LIBRARYDIR) +_Boost_CHECK_SPELLING(Boost_INCLUDEDIR) + +# Collect environment variable inputs as hints. Do not consider changes. +foreach(v BOOSTROOT BOOST_ROOT BOOST_INCLUDEDIR BOOST_LIBRARYDIR) + set(_env $ENV{${v}}) + if(_env) + file(TO_CMAKE_PATH "${_env}" _ENV_${v}) + else() + set(_ENV_${v} "") + endif() +endforeach() +if(NOT _ENV_BOOST_ROOT AND _ENV_BOOSTROOT) + set(_ENV_BOOST_ROOT "${_ENV_BOOSTROOT}") +endif() + +# Collect inputs and cached results. Detect changes since the last run. +if(NOT BOOST_ROOT AND BOOSTROOT) + set(BOOST_ROOT "${BOOSTROOT}") +endif() +set(_Boost_VARS_DIR + BOOST_ROOT + Boost_NO_SYSTEM_PATHS + ) + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Declared as CMake or Environmental Variables:") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " BOOST_ROOT = ${BOOST_ROOT}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " BOOST_INCLUDEDIR = ${BOOST_INCLUDEDIR}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " BOOST_LIBRARYDIR = ${BOOST_LIBRARYDIR}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") +endif() + +# ------------------------------------------------------------------------ +# Search for Boost include DIR +# ------------------------------------------------------------------------ + +set(_Boost_VARS_INC BOOST_INCLUDEDIR Boost_INCLUDE_DIR Boost_ADDITIONAL_VERSIONS) +_Boost_CHANGE_DETECT(_Boost_CHANGE_INCDIR ${_Boost_VARS_DIR} ${_Boost_VARS_INC}) +# Clear Boost_INCLUDE_DIR if it did not change but other input affecting the +# location did. We will find a new one based on the new inputs. +if(_Boost_CHANGE_INCDIR AND NOT _Boost_INCLUDE_DIR_CHANGED) + unset(Boost_INCLUDE_DIR CACHE) +endif() + +if(NOT Boost_INCLUDE_DIR) + set(_boost_INCLUDE_SEARCH_DIRS "") + if(BOOST_INCLUDEDIR) + list(APPEND _boost_INCLUDE_SEARCH_DIRS ${BOOST_INCLUDEDIR}) + elseif(_ENV_BOOST_INCLUDEDIR) + list(APPEND _boost_INCLUDE_SEARCH_DIRS ${_ENV_BOOST_INCLUDEDIR}) + endif() + + if( BOOST_ROOT ) + list(APPEND _boost_INCLUDE_SEARCH_DIRS ${BOOST_ROOT}/include ${BOOST_ROOT}) + elseif( _ENV_BOOST_ROOT ) + list(APPEND _boost_INCLUDE_SEARCH_DIRS ${_ENV_BOOST_ROOT}/include ${_ENV_BOOST_ROOT}) + endif() + + if( Boost_NO_SYSTEM_PATHS) + list(APPEND _boost_INCLUDE_SEARCH_DIRS NO_CMAKE_SYSTEM_PATH NO_SYSTEM_ENVIRONMENT_PATH) + else() + if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") + foreach(ver ${_boost_TEST_VERSIONS}) + string(REPLACE "." "_" ver "${ver}") + list(APPEND _boost_INCLUDE_SEARCH_DIRS PATHS "C:/local/boost_${ver}") + endforeach() + endif() + list(APPEND _boost_INCLUDE_SEARCH_DIRS PATHS + C:/boost/include + C:/boost + /sw/local/include + ) + endif() + + # Try to find Boost by stepping backwards through the Boost versions + # we know about. + # Build a list of path suffixes for each version. + set(_boost_PATH_SUFFIXES) + foreach(_boost_VER ${_boost_TEST_VERSIONS}) + # Add in a path suffix, based on the required version, ideally + # we could read this from version.hpp, but for that to work we'd + # need to know the include dir already + set(_boost_BOOSTIFIED_VERSION) + + # Transform 1.35 => 1_35 and 1.36.0 => 1_36_0 + if(_boost_VER MATCHES "([0-9]+)\\.([0-9]+)\\.([0-9]+)") + set(_boost_BOOSTIFIED_VERSION + "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}_${CMAKE_MATCH_3}") + elseif(_boost_VER MATCHES "([0-9]+)\\.([0-9]+)") + set(_boost_BOOSTIFIED_VERSION + "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}") + endif() + + list(APPEND _boost_PATH_SUFFIXES + "boost-${_boost_BOOSTIFIED_VERSION}" + "boost_${_boost_BOOSTIFIED_VERSION}" + "boost/boost-${_boost_BOOSTIFIED_VERSION}" + "boost/boost_${_boost_BOOSTIFIED_VERSION}" + ) + + endforeach() + + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Include debugging info:") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " _boost_INCLUDE_SEARCH_DIRS = ${_boost_INCLUDE_SEARCH_DIRS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " _boost_PATH_SUFFIXES = ${_boost_PATH_SUFFIXES}") + endif() + + # Look for a standard boost header file. + find_path(Boost_INCLUDE_DIR + NAMES boost/config.hpp + HINTS ${_boost_INCLUDE_SEARCH_DIRS} + PATH_SUFFIXES ${_boost_PATH_SUFFIXES} + ) +endif() + +# ------------------------------------------------------------------------ +# Extract version information from version.hpp +# ------------------------------------------------------------------------ + +# Set Boost_FOUND based only on header location and version. +# It will be updated below for component libraries. +if(Boost_INCLUDE_DIR) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "location of version.hpp: ${Boost_INCLUDE_DIR}/boost/version.hpp") + endif() + + # Extract Boost_VERSION and Boost_LIB_VERSION from version.hpp + set(Boost_VERSION 0) + set(Boost_LIB_VERSION "") + file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ") + set(_Boost_VERSION_REGEX "([0-9]+)") + set(_Boost_LIB_VERSION_REGEX "\"([0-9_]+)\"") + foreach(v VERSION LIB_VERSION) + if("${_boost_VERSION_HPP_CONTENTS}" MATCHES "#define BOOST_${v} ${_Boost_${v}_REGEX}") + set(Boost_${v} "${CMAKE_MATCH_1}") + endif() + endforeach() + unset(_boost_VERSION_HPP_CONTENTS) + + math(EXPR Boost_MAJOR_VERSION "${Boost_VERSION} / 100000") + math(EXPR Boost_MINOR_VERSION "${Boost_VERSION} / 100 % 1000") + math(EXPR Boost_SUBMINOR_VERSION "${Boost_VERSION} % 100") + set(Boost_VERSION_STRING "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + + string(APPEND Boost_ERROR_REASON + "Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}\nBoost include path: ${Boost_INCLUDE_DIR}") + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "version.hpp reveals boost " + "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + endif() + + if(Boost_FIND_VERSION) + # Set Boost_FOUND based on requested version. + set(_Boost_VERSION "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + if("${_Boost_VERSION}" VERSION_LESS "${Boost_FIND_VERSION}") + set(Boost_FOUND 0) + set(_Boost_VERSION_AGE "old") + elseif(Boost_FIND_VERSION_EXACT AND + NOT "${_Boost_VERSION}" VERSION_EQUAL "${Boost_FIND_VERSION}") + set(Boost_FOUND 0) + set(_Boost_VERSION_AGE "new") + else() + set(Boost_FOUND 1) + endif() + if(NOT Boost_FOUND) + # State that we found a version of Boost that is too new or too old. + string(APPEND Boost_ERROR_REASON + "\nDetected version of Boost is too ${_Boost_VERSION_AGE}. Requested version was ${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") + if (Boost_FIND_VERSION_PATCH) + string(APPEND Boost_ERROR_REASON + ".${Boost_FIND_VERSION_PATCH}") + endif () + if (NOT Boost_FIND_VERSION_EXACT) + string(APPEND Boost_ERROR_REASON " (or newer)") + endif () + string(APPEND Boost_ERROR_REASON ".") + endif () + else() + # Caller will accept any Boost version. + set(Boost_FOUND 1) + endif() +else() + set(Boost_FOUND 0) + string(APPEND Boost_ERROR_REASON + "Unable to find the Boost header files. Please set BOOST_ROOT to the root directory containing Boost or BOOST_INCLUDEDIR to the directory containing Boost's headers.") +endif() + +# ------------------------------------------------------------------------ +# Prefix initialization +# ------------------------------------------------------------------------ + +set(Boost_LIB_PREFIX "") +if ( (GHSMULTI AND Boost_USE_STATIC_LIBS) OR + (WIN32 AND Boost_USE_STATIC_LIBS AND NOT CYGWIN) ) + set(Boost_LIB_PREFIX "lib") +endif() + +if ( NOT Boost_NAMESPACE ) + set(Boost_NAMESPACE "boost") +endif() + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_LIB_PREFIX = ${Boost_LIB_PREFIX}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_NAMESPACE = ${Boost_NAMESPACE}") +endif() + +# ------------------------------------------------------------------------ +# Suffix initialization and compiler suffix detection. +# ------------------------------------------------------------------------ + +set(_Boost_VARS_NAME + Boost_NAMESPACE + Boost_COMPILER + Boost_THREADAPI + Boost_USE_DEBUG_PYTHON + Boost_USE_MULTITHREADED + Boost_USE_STATIC_LIBS + Boost_USE_STATIC_RUNTIME + Boost_USE_STLPORT + Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS + ) +_Boost_CHANGE_DETECT(_Boost_CHANGE_LIBNAME ${_Boost_VARS_NAME}) + +# Setting some more suffixes for the library +if (Boost_COMPILER) + set(_boost_COMPILER ${Boost_COMPILER}) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "using user-specified Boost_COMPILER = ${_boost_COMPILER}") + endif() +else() + # Attempt to guess the compiler suffix + # NOTE: this is not perfect yet, if you experience any issues + # please report them and use the Boost_COMPILER variable + # to work around the problems. + _Boost_GUESS_COMPILER_PREFIX(_boost_COMPILER) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "guessed _boost_COMPILER = ${_boost_COMPILER}") + endif() +endif() + +set (_boost_MULTITHREADED "-mt") +if( NOT Boost_USE_MULTITHREADED ) + set (_boost_MULTITHREADED "") +endif() +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_MULTITHREADED = ${_boost_MULTITHREADED}") +endif() + +#====================== +# Systematically build up the Boost ABI tag for the 'tagged' and 'versioned' layouts +# http://boost.org/doc/libs/1_66_0/more/getting_started/windows.html#library-naming +# http://boost.org/doc/libs/1_66_0/boost/config/auto_link.hpp +# http://boost.org/doc/libs/1_66_0/tools/build/src/tools/common.jam +# http://boost.org/doc/libs/1_66_0/boostcpp.jam +set( _boost_RELEASE_ABI_TAG "-") +set( _boost_DEBUG_ABI_TAG "-") +# Key Use this library when: +# s linking statically to the C++ standard library and +# compiler runtime support libraries. +if(Boost_USE_STATIC_RUNTIME) + set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}s") + set( _boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}s") +endif() +# g using debug versions of the standard and runtime +# support libraries +if(WIN32 AND Boost_USE_DEBUG_RUNTIME) + if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC" + OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang" + OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xIntel") + string(APPEND _boost_DEBUG_ABI_TAG "g") + endif() +endif() +# y using special debug build of python +if(Boost_USE_DEBUG_PYTHON) + string(APPEND _boost_DEBUG_ABI_TAG "y") +endif() +# d using a debug version of your code +string(APPEND _boost_DEBUG_ABI_TAG "d") +# p using the STLport standard library rather than the +# default one supplied with your compiler +if(Boost_USE_STLPORT) + string(APPEND _boost_RELEASE_ABI_TAG "p") + string(APPEND _boost_DEBUG_ABI_TAG "p") +endif() +# n using the STLport deprecated "native iostreams" feature +# removed from the documentation in 1.43.0 but still present in +# boost/config/auto_link.hpp +if(Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS) + string(APPEND _boost_RELEASE_ABI_TAG "n") + string(APPEND _boost_DEBUG_ABI_TAG "n") +endif() + +# -x86 Architecture and address model tag +# First character is the architecture, then word-size, either 32 or 64 +# Only used in 'versioned' layout, added in Boost 1.66.0 +if(DEFINED Boost_ARCHITECTURE) + set(_boost_ARCHITECTURE_TAG "${Boost_ARCHITECTURE}") + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "using user-specified Boost_ARCHITECTURE = ${_boost_ARCHITECTURE_TAG}") + endif() +else() + set(_boost_ARCHITECTURE_TAG "") + # {CMAKE_CXX_COMPILER_ARCHITECTURE_ID} is not currently set for all compilers + if(NOT "x${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" STREQUAL "x" AND NOT Boost_VERSION VERSION_LESS 106600) + string(APPEND _boost_ARCHITECTURE_TAG "-") + # This needs to be kept in-sync with the section of CMakePlatformId.h.in + # inside 'defined(_WIN32) && defined(_MSC_VER)' + if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "IA64") + string(APPEND _boost_ARCHITECTURE_TAG "i") + elseif(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "X86" + OR CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "x64") + string(APPEND _boost_ARCHITECTURE_TAG "x") + elseif(CMAKE_CXX_COMPILER_ARCHITECTURE_ID MATCHES "^ARM") + string(APPEND _boost_ARCHITECTURE_TAG "a") + elseif(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "MIPS") + string(APPEND _boost_ARCHITECTURE_TAG "m") + endif() + + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + string(APPEND _boost_ARCHITECTURE_TAG "64") + else() + string(APPEND _boost_ARCHITECTURE_TAG "32") + endif() + endif() +endif() + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_RELEASE_ABI_TAG = ${_boost_RELEASE_ABI_TAG}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_DEBUG_ABI_TAG = ${_boost_DEBUG_ABI_TAG}") +endif() + +# ------------------------------------------------------------------------ +# Begin finding boost libraries +# ------------------------------------------------------------------------ + +set(_Boost_VARS_LIB "") +foreach(c DEBUG RELEASE) + set(_Boost_VARS_LIB_${c} BOOST_LIBRARYDIR Boost_LIBRARY_DIR_${c}) + list(APPEND _Boost_VARS_LIB ${_Boost_VARS_LIB_${c}}) + _Boost_CHANGE_DETECT(_Boost_CHANGE_LIBDIR_${c} ${_Boost_VARS_DIR} ${_Boost_VARS_LIB_${c}} Boost_INCLUDE_DIR) + # Clear Boost_LIBRARY_DIR_${c} if it did not change but other input affecting the + # location did. We will find a new one based on the new inputs. + if(_Boost_CHANGE_LIBDIR_${c} AND NOT _Boost_LIBRARY_DIR_${c}_CHANGED) + unset(Boost_LIBRARY_DIR_${c} CACHE) + endif() + + # If Boost_LIBRARY_DIR_[RELEASE,DEBUG] is set, prefer its value. + if(Boost_LIBRARY_DIR_${c}) + set(_boost_LIBRARY_SEARCH_DIRS_${c} ${Boost_LIBRARY_DIR_${c}} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + else() + set(_boost_LIBRARY_SEARCH_DIRS_${c} "") + if(BOOST_LIBRARYDIR) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${BOOST_LIBRARYDIR}) + elseif(_ENV_BOOST_LIBRARYDIR) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${_ENV_BOOST_LIBRARYDIR}) + endif() + + if(BOOST_ROOT) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${BOOST_ROOT}/lib ${BOOST_ROOT}/stage/lib) + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${BOOST_ROOT}") + elseif(_ENV_BOOST_ROOT) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${_ENV_BOOST_ROOT}/lib ${_ENV_BOOST_ROOT}/stage/lib) + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${_ENV_BOOST_ROOT}") + endif() + + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} + ${Boost_INCLUDE_DIR}/lib + ${Boost_INCLUDE_DIR}/../lib + ${Boost_INCLUDE_DIR}/stage/lib + ) + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${Boost_INCLUDE_DIR}/..") + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${Boost_INCLUDE_DIR}") + if( Boost_NO_SYSTEM_PATHS ) + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} NO_CMAKE_SYSTEM_PATH NO_SYSTEM_ENVIRONMENT_PATH) + else() + foreach(ver ${_boost_TEST_VERSIONS}) + string(REPLACE "." "_" ver "${ver}") + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "C:/local/boost_${ver}") + endforeach() + _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "C:/boost") + list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} PATHS + C:/boost/lib + C:/boost + /sw/local/lib + ) + endif() + endif() +endforeach() + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_LIBRARY_SEARCH_DIRS_RELEASE = ${_boost_LIBRARY_SEARCH_DIRS_RELEASE}" + "_boost_LIBRARY_SEARCH_DIRS_DEBUG = ${_boost_LIBRARY_SEARCH_DIRS_DEBUG}") +endif() + +# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES +if( Boost_USE_STATIC_LIBS ) + set( _boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + list(INSERT CMAKE_FIND_LIBRARY_SUFFIXES 0 .lib .a) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a) + endif() +endif() + +# We want to use the tag inline below without risking double dashes +if(_boost_RELEASE_ABI_TAG) + if(${_boost_RELEASE_ABI_TAG} STREQUAL "-") + set(_boost_RELEASE_ABI_TAG "") + endif() +endif() +if(_boost_DEBUG_ABI_TAG) + if(${_boost_DEBUG_ABI_TAG} STREQUAL "-") + set(_boost_DEBUG_ABI_TAG "") + endif() +endif() + +# The previous behavior of FindBoost when Boost_USE_STATIC_LIBS was enabled +# on WIN32 was to: +# 1. Search for static libs compiled against a SHARED C++ standard runtime library (use if found) +# 2. Search for static libs compiled against a STATIC C++ standard runtime library (use if found) +# We maintain this behavior since changing it could break people's builds. +# To disable the ambiguous behavior, the user need only +# set Boost_USE_STATIC_RUNTIME either ON or OFF. +set(_boost_STATIC_RUNTIME_WORKAROUND false) +if(WIN32 AND Boost_USE_STATIC_LIBS) + if(NOT DEFINED Boost_USE_STATIC_RUNTIME) + set(_boost_STATIC_RUNTIME_WORKAROUND TRUE) + endif() +endif() + +# On versions < 1.35, remove the System library from the considered list +# since it wasn't added until 1.35. +if(Boost_VERSION AND Boost_FIND_COMPONENTS) + if(Boost_VERSION LESS 103500) + list(REMOVE_ITEM Boost_FIND_COMPONENTS system) + endif() +endif() + +# Additional components may be required via component dependencies. +# Add any missing components to the list. +_Boost_MISSING_DEPENDENCIES(Boost_FIND_COMPONENTS _Boost_EXTRA_FIND_COMPONENTS) + +# If thread is required, get the thread libs as a dependency +if("thread" IN_LIST Boost_FIND_COMPONENTS) + if(Boost_FIND_QUIETLY) + set(_Boost_find_quiet QUIET) + else() + set(_Boost_find_quiet "") + endif() + find_package(Threads ${_Boost_find_quiet}) + unset(_Boost_find_quiet) +endif() + +# If the user changed any of our control inputs flush previous results. +if(_Boost_CHANGE_LIBDIR_DEBUG OR _Boost_CHANGE_LIBDIR_RELEASE OR _Boost_CHANGE_LIBNAME) + foreach(COMPONENT ${_Boost_COMPONENTS_SEARCHED}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + foreach(c DEBUG RELEASE) + set(_var Boost_${UPPERCOMPONENT}_LIBRARY_${c}) + unset(${_var} CACHE) + set(${_var} "${_var}-NOTFOUND") + endforeach() + endforeach() + set(_Boost_COMPONENTS_SEARCHED "") +endif() + +foreach(COMPONENT ${Boost_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + + set( _boost_docstring_release "Boost ${COMPONENT} library (release)") + set( _boost_docstring_debug "Boost ${COMPONENT} library (debug)") + + # Compute component-specific hints. + set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "") + if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR + ${COMPONENT} STREQUAL "graph_parallel") + foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES}) + if(IS_ABSOLUTE "${lib}") + get_filename_component(libdir "${lib}" PATH) + string(REPLACE "\\" "/" libdir "${libdir}") + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir}) + endif() + endforeach() + endif() + + # Handle Python version suffixes + unset(COMPONENT_PYTHON_VERSION_MAJOR) + unset(COMPONENT_PYTHON_VERSION_MINOR) + if(${COMPONENT} MATCHES "^(python|mpi_python|numpy)([0-9])\$") + set(COMPONENT_UNVERSIONED "${CMAKE_MATCH_1}") + set(COMPONENT_PYTHON_VERSION_MAJOR "${CMAKE_MATCH_2}") + elseif(${COMPONENT} MATCHES "^(python|mpi_python|numpy)([0-9])\\.?([0-9])\$") + set(COMPONENT_UNVERSIONED "${CMAKE_MATCH_1}") + set(COMPONENT_PYTHON_VERSION_MAJOR "${CMAKE_MATCH_2}") + set(COMPONENT_PYTHON_VERSION_MINOR "${CMAKE_MATCH_3}") + endif() + + unset(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME) + if (COMPONENT_PYTHON_VERSION_MINOR) + # Boost >= 1.67 + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + # Debian/Ubuntu (Some versions omit the 2 and/or 3 from the suffix) + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}${COMPONENT_PYTHON_VERSION_MAJOR}-py${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}-py${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + # Gentoo + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}-${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + # RPMs + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}-${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") + endif() + if (COMPONENT_PYTHON_VERSION_MAJOR AND NOT COMPONENT_PYTHON_VERSION_MINOR) + # Boost < 1.67 + list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}${COMPONENT_PYTHON_VERSION_MAJOR}") + endif() + + # Consolidate and report component-specific hints. + if(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME) + list(REMOVE_DUPLICATES _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Component-specific library search names for ${COMPONENT_NAME}: " + "${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME}") + endif() + endif() + if(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT) + list(REMOVE_DUPLICATES _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Component-specific library search paths for ${COMPONENT}: " + "${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT}") + endif() + endif() + + # + # Find headers + # + _Boost_COMPONENT_HEADERS("${COMPONENT}" Boost_${UPPERCOMPONENT}_HEADER_NAME) + # Look for a standard boost header file. + if(Boost_${UPPERCOMPONENT}_HEADER_NAME) + if(EXISTS "${Boost_INCLUDE_DIR}/${Boost_${UPPERCOMPONENT}_HEADER_NAME}") + set(Boost_${UPPERCOMPONENT}_HEADER ON) + else() + set(Boost_${UPPERCOMPONENT}_HEADER OFF) + endif() + else() + set(Boost_${UPPERCOMPONENT}_HEADER ON) + message(WARNING "No header defined for ${COMPONENT}; skipping header check") + endif() + + # + # Find RELEASE libraries + # + unset(_boost_RELEASE_NAMES) + foreach(component IN LISTS _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME COMPONENT) + foreach(compiler IN LISTS _boost_COMPILER) + list(APPEND _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} ) + endforeach() + list(APPEND _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component} ) + if(_boost_STATIC_RUNTIME_WORKAROUND) + set(_boost_RELEASE_STATIC_ABI_TAG "-s${_boost_RELEASE_ABI_TAG}") + foreach(compiler IN LISTS _boost_COMPILER) + list(APPEND _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} ) + endforeach() + list(APPEND _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} ) + endif() + endforeach() + if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") + _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_RELEASE_NAMES ${_boost_RELEASE_NAMES}) + endif() + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Searching for ${UPPERCOMPONENT}_LIBRARY_RELEASE: ${_boost_RELEASE_NAMES}") + endif() + + # if Boost_LIBRARY_DIR_RELEASE is not defined, + # but Boost_LIBRARY_DIR_DEBUG is, look there first for RELEASE libs + if(NOT Boost_LIBRARY_DIR_RELEASE AND Boost_LIBRARY_DIR_DEBUG) + list(INSERT _boost_LIBRARY_SEARCH_DIRS_RELEASE 0 ${Boost_LIBRARY_DIR_DEBUG}) + endif() + + # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. + string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS_RELEASE}") + + if(Boost_USE_RELEASE_LIBS) + _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE RELEASE + NAMES ${_boost_RELEASE_NAMES} + HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} + NAMES_PER_DIR + DOC "${_boost_docstring_release}" + ) + endif() + + # + # Find DEBUG libraries + # + unset(_boost_DEBUG_NAMES) + foreach(component IN LISTS _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME COMPONENT) + foreach(compiler IN LISTS _boost_COMPILER) + list(APPEND _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} ) + endforeach() + list(APPEND _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component} ) + if(_boost_STATIC_RUNTIME_WORKAROUND) + set(_boost_DEBUG_STATIC_ABI_TAG "-s${_boost_DEBUG_ABI_TAG}") + foreach(compiler IN LISTS _boost_COMPILER) + list(APPEND _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} ) + endforeach() + list(APPEND _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} ) + endif() + endforeach() + if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") + _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_DEBUG_NAMES ${_boost_DEBUG_NAMES}) + endif() + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Searching for ${UPPERCOMPONENT}_LIBRARY_DEBUG: ${_boost_DEBUG_NAMES}") + endif() + + # if Boost_LIBRARY_DIR_DEBUG is not defined, + # but Boost_LIBRARY_DIR_RELEASE is, look there first for DEBUG libs + if(NOT Boost_LIBRARY_DIR_DEBUG AND Boost_LIBRARY_DIR_RELEASE) + list(INSERT _boost_LIBRARY_SEARCH_DIRS_DEBUG 0 ${Boost_LIBRARY_DIR_RELEASE}) + endif() + + # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. + string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS_DEBUG}") + + if(Boost_USE_DEBUG_LIBS) + _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG DEBUG + NAMES ${_boost_DEBUG_NAMES} + HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} + NAMES_PER_DIR + DOC "${_boost_docstring_debug}" + ) + endif () + + if(Boost_REALPATH) + _Boost_SWAP_WITH_REALPATH(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE "${_boost_docstring_release}") + _Boost_SWAP_WITH_REALPATH(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG "${_boost_docstring_debug}" ) + endif() + + _Boost_ADJUST_LIB_VARS(${UPPERCOMPONENT}) + + # Check if component requires some compiler features + _Boost_COMPILER_FEATURES(${COMPONENT} _Boost_${UPPERCOMPONENT}_COMPILER_FEATURES) + +endforeach() + +# Restore the original find library ordering +if( Boost_USE_STATIC_LIBS ) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${_boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) +endif() + +# ------------------------------------------------------------------------ +# End finding boost libraries +# ------------------------------------------------------------------------ + +set(Boost_INCLUDE_DIRS ${Boost_INCLUDE_DIR}) +set(Boost_LIBRARY_DIRS) +if(Boost_LIBRARY_DIR_RELEASE) + list(APPEND Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR_RELEASE}) +endif() +if(Boost_LIBRARY_DIR_DEBUG) + list(APPEND Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR_DEBUG}) +endif() +if(Boost_LIBRARY_DIRS) + list(REMOVE_DUPLICATES Boost_LIBRARY_DIRS) +endif() + +# The above setting of Boost_FOUND was based only on the header files. +# Update it for the requested component libraries. +if(Boost_FOUND) + # The headers were found. Check for requested component libs. + set(_boost_CHECKED_COMPONENT FALSE) + set(_Boost_MISSING_COMPONENTS "") + foreach(COMPONENT ${Boost_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + set(_boost_CHECKED_COMPONENT TRUE) + if(NOT Boost_${UPPERCOMPONENT}_FOUND AND Boost_FIND_REQUIRED_${COMPONENT}) + list(APPEND _Boost_MISSING_COMPONENTS ${COMPONENT}) + endif() + endforeach() + if(_Boost_MISSING_COMPONENTS AND _Boost_EXTRA_FIND_COMPONENTS) + # Optional indirect dependencies are not counted as missing. + list(REMOVE_ITEM _Boost_MISSING_COMPONENTS ${_Boost_EXTRA_FIND_COMPONENTS}) + endif() + + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] Boost_FOUND = ${Boost_FOUND}") + endif() + + if (_Boost_MISSING_COMPONENTS) + set(Boost_FOUND 0) + # We were unable to find some libraries, so generate a sensible + # error message that lists the libraries we were unable to find. + string(APPEND Boost_ERROR_REASON + "\nCould not find the following") + if(Boost_USE_STATIC_LIBS) + string(APPEND Boost_ERROR_REASON " static") + endif() + string(APPEND Boost_ERROR_REASON + " Boost libraries:\n") + foreach(COMPONENT ${_Boost_MISSING_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + string(APPEND Boost_ERROR_REASON + " ${Boost_NAMESPACE}_${COMPONENT}${Boost_ERROR_REASON_${UPPERCOMPONENT}}\n") + endforeach() + + list(LENGTH Boost_FIND_COMPONENTS Boost_NUM_COMPONENTS_WANTED) + list(LENGTH _Boost_MISSING_COMPONENTS Boost_NUM_MISSING_COMPONENTS) + if (${Boost_NUM_COMPONENTS_WANTED} EQUAL ${Boost_NUM_MISSING_COMPONENTS}) + string(APPEND Boost_ERROR_REASON + "No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") + else () + string(APPEND Boost_ERROR_REASON + "Some (but not all) of the required Boost libraries were found. You may need to install these additional Boost libraries. Alternatively, set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") + endif () + endif () + + if( NOT Boost_LIBRARY_DIRS AND NOT _boost_CHECKED_COMPONENT ) + # Compatibility Code for backwards compatibility with CMake + # 2.4's FindBoost module. + + # Look for the boost library path. + # Note that the user may not have installed any libraries + # so it is quite possible the Boost_LIBRARY_DIRS may not exist. + set(_boost_LIB_DIR ${Boost_INCLUDE_DIR}) + + if("${_boost_LIB_DIR}" MATCHES "boost-[0-9]+") + get_filename_component(_boost_LIB_DIR ${_boost_LIB_DIR} PATH) + endif() + + if("${_boost_LIB_DIR}" MATCHES "/include$") + # Strip off the trailing "/include" in the path. + get_filename_component(_boost_LIB_DIR ${_boost_LIB_DIR} PATH) + endif() + + if(EXISTS "${_boost_LIB_DIR}/lib") + string(APPEND _boost_LIB_DIR /lib) + elseif(EXISTS "${_boost_LIB_DIR}/stage/lib") + string(APPEND _boost_LIB_DIR "/stage/lib") + else() + set(_boost_LIB_DIR "") + endif() + + if(_boost_LIB_DIR AND EXISTS "${_boost_LIB_DIR}") + set(Boost_LIBRARY_DIRS ${_boost_LIB_DIR}) + endif() + + endif() +else() + # Boost headers were not found so no components were found. + foreach(COMPONENT ${Boost_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + set(Boost_${UPPERCOMPONENT}_FOUND 0) + endforeach() +endif() + +# ------------------------------------------------------------------------ +# Add imported targets +# ------------------------------------------------------------------------ + +if(Boost_FOUND) + # For header-only libraries + if(NOT TARGET Boost::boost) + add_library(Boost::boost INTERFACE IMPORTED) + if(Boost_INCLUDE_DIRS) + set_target_properties(Boost::boost PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}") + endif() + endif() + + foreach(COMPONENT ${Boost_FIND_COMPONENTS}) + if(_Boost_IMPORTED_TARGETS AND NOT TARGET Boost::${COMPONENT}) + string(TOUPPER ${COMPONENT} UPPERCOMPONENT) + if(Boost_${UPPERCOMPONENT}_FOUND) + if(Boost_USE_STATIC_LIBS) + add_library(Boost::${COMPONENT} STATIC IMPORTED) + else() + # Even if Boost_USE_STATIC_LIBS is OFF, we might have static + # libraries as a result. + add_library(Boost::${COMPONENT} UNKNOWN IMPORTED) + endif() + if(Boost_INCLUDE_DIRS) + set_target_properties(Boost::${COMPONENT} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}") + endif() + if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY}") + set_target_properties(Boost::${COMPONENT} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${Boost_${UPPERCOMPONENT}_LIBRARY}") + endif() + if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE}") + set_property(TARGET Boost::${COMPONENT} APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(Boost::${COMPONENT} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX" + IMPORTED_LOCATION_RELEASE "${Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE}") + endif() + if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG}") + set_property(TARGET Boost::${COMPONENT} APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(Boost::${COMPONENT} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX" + IMPORTED_LOCATION_DEBUG "${Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG}") + endif() + if(_Boost_${UPPERCOMPONENT}_DEPENDENCIES) + unset(_Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES) + foreach(dep ${_Boost_${UPPERCOMPONENT}_DEPENDENCIES}) + list(APPEND _Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES Boost::${dep}) + endforeach() + if(COMPONENT STREQUAL "thread") + list(APPEND _Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES Threads::Threads) + endif() + set_target_properties(Boost::${COMPONENT} PROPERTIES + INTERFACE_LINK_LIBRARIES "${_Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES}") + endif() + if(_Boost_${UPPERCOMPONENT}_COMPILER_FEATURES) + set_target_properties(Boost::${COMPONENT} PROPERTIES + INTERFACE_COMPILE_FEATURES "${_Boost_${UPPERCOMPONENT}_COMPILER_FEATURES}") + endif() + endif() + endif() + endforeach() +endif() + +# ------------------------------------------------------------------------ +# Notification to end user about what was found +# ------------------------------------------------------------------------ + +set(Boost_LIBRARIES "") +if(Boost_FOUND) + if(NOT Boost_FIND_QUIETLY) + message(STATUS "Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + if(Boost_FIND_COMPONENTS) + message(STATUS "Found the following Boost libraries:") + endif() + endif() + foreach( COMPONENT ${Boost_FIND_COMPONENTS} ) + string( TOUPPER ${COMPONENT} UPPERCOMPONENT ) + if( Boost_${UPPERCOMPONENT}_FOUND ) + if(NOT Boost_FIND_QUIETLY) + message (STATUS " ${COMPONENT}") + endif() + list(APPEND Boost_LIBRARIES ${Boost_${UPPERCOMPONENT}_LIBRARY}) + if(COMPONENT STREQUAL "thread") + list(APPEND Boost_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) + endif() + endif() + endforeach() +else() + if(Boost_FIND_REQUIRED) + message(SEND_ERROR "Unable to find the requested Boost libraries.\n${Boost_ERROR_REASON}") + else() + if(NOT Boost_FIND_QUIETLY) + # we opt not to automatically output Boost_ERROR_REASON here as + # it could be quite lengthy and somewhat imposing in its requests + # Since Boost is not always a required dependency we'll leave this + # up to the end-user. + if(Boost_DEBUG OR Boost_DETAILED_FAILURE_MSG) + message(STATUS "Could NOT find Boost\n${Boost_ERROR_REASON}") + else() + message(STATUS "Could NOT find Boost") + endif() + endif() + endif() +endif() + +# Configure display of cache entries in GUI. +foreach(v BOOSTROOT BOOST_ROOT ${_Boost_VARS_INC} ${_Boost_VARS_LIB}) + get_property(_type CACHE ${v} PROPERTY TYPE) + if(_type) + set_property(CACHE ${v} PROPERTY ADVANCED 1) + if("x${_type}" STREQUAL "xUNINITIALIZED") + if("x${v}" STREQUAL "xBoost_ADDITIONAL_VERSIONS") + set_property(CACHE ${v} PROPERTY TYPE STRING) + else() + set_property(CACHE ${v} PROPERTY TYPE PATH) + endif() + endif() + endif() +endforeach() + +# Record last used values of input variables so we can +# detect on the next run if the user changed them. +foreach(v + ${_Boost_VARS_INC} ${_Boost_VARS_LIB} + ${_Boost_VARS_DIR} ${_Boost_VARS_NAME} + ) + if(DEFINED ${v}) + set(_${v}_LAST "${${v}}" CACHE INTERNAL "Last used ${v} value.") + else() + unset(_${v}_LAST CACHE) + endif() +endforeach() + +# Maintain a persistent list of components requested anywhere since +# the last flush. +set(_Boost_COMPONENTS_SEARCHED "${_Boost_COMPONENTS_SEARCHED}") +list(APPEND _Boost_COMPONENTS_SEARCHED ${Boost_FIND_COMPONENTS}) +list(REMOVE_DUPLICATES _Boost_COMPONENTS_SEARCHED) +list(SORT _Boost_COMPONENTS_SEARCHED) +set(_Boost_COMPONENTS_SEARCHED "${_Boost_COMPONENTS_SEARCHED}" + CACHE INTERNAL "Components requested for this build tree.") + +# Restore project's policies +cmake_policy(POP) diff --git a/examples/cmake/FindPython.cmake b/examples/cmake/FindPython.cmake new file mode 100644 index 0000000..8645a0d --- /dev/null +++ b/examples/cmake/FindPython.cmake @@ -0,0 +1,206 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPython +---------- + +Find Python interpreter, compiler and development environment (include +directories and libraries). + +Three components are supported: + +* ``Interpreter``: search for Python interpreter. +* ``Compiler``: search for Python compiler. Only offered by IronPython. +* ``Development``: search for development artifacts (include directories and + libraries). + +If no ``COMPONENTS`` is specified, ``Interpreter`` is assumed. + +To ensure consistent versions between components ``Interpreter``, ``Compiler`` +and ``Development``, specify all components at the same time:: + + find_package (Python COMPONENTS Interpreter Development) + +This module looks preferably for version 3 of Python. If not found, version 2 +is searched. +To manage concurrent versions 3 and 2 of Python, use :module:`FindPython3` and +:module:`FindPython2` modules rather than this one. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module defines the following :ref:`Imported Targets `: + +``Python::Interpreter`` + Python interpreter. Target defined if component ``Interpreter`` is found. +``Python::Compiler`` + Python compiler. Target defined if component ``Compiler`` is found. +``Python::Python`` + Python library. Target defined if component ``Development`` is found. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module will set the following variables in your project +(see :ref:`Standard Variable Names `): + +``Python_FOUND`` + System has the Python requested components. +``Python_Interpreter_FOUND`` + System has the Python interpreter. +``Python_EXECUTABLE`` + Path to the Python interpreter. +``Python_INTERPRETER_ID`` + A short string unique to the interpreter. Possible values include: + * Python + * ActivePython + * Anaconda + * Canopy + * IronPython +``Python_STDLIB`` + Standard platform independent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``. +``Python_STDARCH`` + Standard platform dependent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``. +``Python_SITELIB`` + Third-party platform independent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``. +``Python_SITEARCH`` + Third-party platform dependent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``. +``Python_Compiler_FOUND`` + System has the Python compiler. +``Python_COMPILER`` + Path to the Python compiler. Only offered by IronPython. +``Python_COMPILER_ID`` + A short string unique to the compiler. Possible values include: + * IronPython +``Python_Development_FOUND`` + System has the Python development artifacts. +``Python_INCLUDE_DIRS`` + The Python include directories. +``Python_LIBRARIES`` + The Python libraries. +``Python_LIBRARY_DIRS`` + The Python library directories. +``Python_RUNTIME_LIBRARY_DIRS`` + The Python runtime library directories. +``Python_VERSION`` + Python version. +``Python_VERSION_MAJOR`` + Python major version. +``Python_VERSION_MINOR`` + Python minor version. +``Python_VERSION_PATCH`` + Python patch version. + +Hints +^^^^^ + +``Python_ROOT_DIR`` + Define the root directory of a Python installation. + +``Python_USE_STATIC_LIBS`` + * If not defined, search for shared libraries and static libraries in that + order. + * If set to TRUE, search **only** for static libraries. + * If set to FALSE, search **only** for shared libraries. + +``Python_FIND_REGISTRY`` + On Windows the ``Python_FIND_REGISTRY`` variable determine the order + of preference between registry and environment variables. + the ``Python_FIND_REGISTRY`` variable can be set to empty or one of the + following: + + * ``FIRST``: Try to use registry before environment variables. + This is the default. + * ``LAST``: Try to use registry after environment variables. + * ``NEVER``: Never try to use registry. + +``CMAKE_FIND_FRAMEWORK`` + On OS X the :variable:`CMAKE_FIND_FRAMEWORK` variable determine the order of + preference between Apple-style and unix-style package components. + + .. note:: + + Value ``ONLY`` is not supported so ``FIRST`` will be used instead. + +.. note:: + + If a Python virtual environment is configured, set variable + ``Python_FIND_REGISTRY`` (Windows) or ``CMAKE_FIND_FRAMEWORK`` (macOS) with + value ``LAST`` or ``NEVER`` to select it preferably. + +Commands +^^^^^^^^ + +This module defines the command ``Python_add_library`` which have the same +semantic as :command:`add_library` but take care of Python module naming rules +(only applied if library is of type ``MODULE``) and add dependency to target +``Python::Python``:: + + Python_add_library (my_module MODULE src1.cpp) + +If library type is not specified, ``MODULE`` is assumed. +#]=======================================================================] + + +set (_PYTHON_PREFIX Python) + +if (DEFINED Python_FIND_VERSION) + set (_Python_REQUIRED_VERSION_MAJOR ${Python_FIND_VERSION_MAJOR}) + + include (${CMAKE_CURRENT_LIST_DIR}/FindPython/Support.cmake) +else() + # iterate over versions in quiet and NOT required modes to avoid multiple + # "Found" messages and prematurally failure. + set (_Python_QUIETLY ${Python_FIND_QUIETLY}) + set (_Python_REQUIRED ${Python_FIND_REQUIRED}) + set (Python_FIND_QUIETLY TRUE) + set (Python_FIND_REQUIRED FALSE) + + set (_Python_REQUIRED_VERSIONS 3 2) + set (_Python_REQUIRED_VERSION_LAST 2) + + foreach (_Python_REQUIRED_VERSION_MAJOR IN LISTS _Python_REQUIRED_VERSIONS) + set (Python_FIND_VERSION ${_Python_REQUIRED_VERSION_MAJOR}) + include (${CMAKE_CURRENT_LIST_DIR}/FindPython/Support.cmake) + if (Python_FOUND OR + _Python_REQUIRED_VERSION_MAJOR EQUAL _Python_REQUIRED_VERSION_LAST) + break() + endif() + # clean-up some CACHE variables to ensure look-up restart from scratch + foreach (_Python_ITEM IN LISTS _Python_CACHED_VARS) + unset (${_Python_ITEM} CACHE) + endforeach() + endforeach() + + unset (Python_FIND_VERSION) + + set (Python_FIND_QUIETLY ${_Python_QUIETLY}) + set (Python_FIND_REQUIRED ${_Python_REQUIRED}) + if (Python_FIND_REQUIRED OR NOT Python_FIND_QUIETLY) + # call again validation command to get "Found" or error message + find_package_handle_standard_args (Python HANDLE_COMPONENTS + REQUIRED_VARS ${_Python_REQUIRED_VARS} + VERSION_VAR Python_VERSION) + endif() +endif() + +if (COMMAND __Python_add_library) + macro (Python_add_library) + __Python_add_library (Python ${ARGV}) + endmacro() +endif() + +unset (_PYTHON_PREFIX) diff --git a/examples/cmake/FindPython/Support.cmake b/examples/cmake/FindPython/Support.cmake new file mode 100644 index 0000000..e0ebb90 --- /dev/null +++ b/examples/cmake/FindPython/Support.cmake @@ -0,0 +1,1267 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# +# This file is a "template" file used by various FindPython modules. +# + +cmake_policy (VERSION 3.7) + +# +# Initial configuration +# +if (NOT DEFINED _PYTHON_PREFIX) + message (FATAL_ERROR "FindPython: INTERNAL ERROR") +endif() +if (NOT DEFINED _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + message (FATAL_ERROR "FindPython: INTERNAL ERROR") +endif() +if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 3) + set(_${_PYTHON_PREFIX}_VERSIONS 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0) +elseif (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 2) + set(_${_PYTHON_PREFIX}_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0) +else() + message (FATAL_ERROR "FindPython: INTERNAL ERROR") +endif() + + +# +# helper commands +# +macro (_PYTHON_DISPLAY_FAILURE _PYTHON_MSG) + if (${_PYTHON_PREFIX}_FIND_REQUIRED) + message (FATAL_ERROR "${_PYTHON_MSG}") + else() + if (NOT ${_PYTHON_PREFIX}_FIND_QUIETLY) + message(STATUS "${_PYTHON_MSG}") + endif () + endif() + + set (${_PYTHON_PREFIX}_FOUND FALSE) + string (TOUPPER "${_PYTHON_PREFIX}" _${_PYTHON_PREFIX}_UPPER_PREFIX) + set (${_PYTHON_UPPER_PREFIX}_FOUND FALSE) + return() +endmacro() + + +macro (_PYTHON_FIND_FRAMEWORKS) + set (${_PYTHON_PREFIX}_FRAMEWORKS) + if (APPLE) + set (_pff_frameworks ${CMAKE_FRAMEWORK_PATH} + $ENV{CMAKE_FRAMEWORK_PATH} + ~/Library/Frameworks + /usr/local/Frameworks + ${CMAKE_SYSTEM_FRAMEWORK_PATH}) + list (REMOVE_DUPLICATES _pff_frameworks) + foreach (_pff_framework IN LISTS _pff_frameworks) + if (EXISTS ${_pff_framework}/Python.framework) + list (APPEND ${_PYTHON_PREFIX}_FRAMEWORKS ${_pff_framework}/Python.framework) + endif() + endforeach() + unset (_pff_frameworks) + unset (_pff_framework) + endif() +endmacro() + +function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS _PYTHON_VERSION) + set (_PYTHON_FRAMEWORK_PATHS) + foreach (_PYTHON_FRAMEWORK IN LISTS ${_PYTHON_PREFIX}_FRAMEWORKS) + list (APPEND _PYTHON_FRAMEWORK_PATHS + "${_PYTHON_FRAMEWORK}/Versions/${_PYTHON_VERSION}") + endforeach() + set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${_PYTHON_FRAMEWORK_PATHS} PARENT_SCOPE) +endfunction() + + +function (_PYTHON_VALIDATE_INTERPRETER) + if (NOT ${_PYTHON_PREFIX}_EXECUTABLE) + return() + endif() + + if (ARGC EQUAL 1) + set (expected_version ${ARGV0}) + else() + unset (expected_version) + endif() + + get_filename_component (python_name "${${_PYTHON_PREFIX}_EXECUTABLE}" NAME) + + if (expected_version AND NOT python_name STREQUAL "python${expected_version}${CMAKE_EXECUTABLE_SUFFIX}") + # executable found must have a specific version + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))" + RESULT_VARIABLE result + OUTPUT_VARIABLE version + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (result OR NOT version EQUAL expected_version) + # interpreter not usable or has wrong major version + set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) + return() + endif() + else() + if (NOT python_name STREQUAL "python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}${CMAKE_EXECUTABLE_SUFFIX}") + # executable found do not have version in name + # ensure major version is OK + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; sys.stdout.write(str(sys.version_info[0]))" + RESULT_VARIABLE result + OUTPUT_VARIABLE version + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (result OR NOT version EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + # interpreter not usable or has wrong major version + set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) + return() + endif() + endif() + endif() + + if (CMAKE_SIZEOF_VOID_P AND "Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND NOT CMAKE_CROSSCOMPILING) + # In this case, interpreter must have same architecture as environment + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys, struct; sys.stdout.write(str(struct.calcsize(\"P\")))" + RESULT_VARIABLE result + OUTPUT_VARIABLE size + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (result OR NOT size EQUAL CMAKE_SIZEOF_VOID_P) + # interpreter not usable or has wrong architecture + set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) + return() + endif() + endif() +endfunction() + + +function (_PYTHON_VALIDATE_COMPILER expected_version) + if (NOT ${_PYTHON_PREFIX}_COMPILER) + return() + endif() + + # retrieve python environment version from compiler + set (working_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir") + file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))\n") + execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${working_dir}/version.py" + WORKING_DIRECTORY "${working_dir}" + OUTPUT_QUIET + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process (COMMAND "${working_dir}/version" + WORKING_DIRECTORY "${working_dir}" + RESULT_VARIABLE result + OUTPUT_VARIABLE version + ERROR_QUIET) + file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}") + + if (result OR NOT version EQUAL expected_version) + # Compiler not usable or has wrong major version + set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE) + endif() +endfunction() + + +function (_PYTHON_FIND_RUNTIME_LIBRARY _PYTHON_LIB) + string (REPLACE "_RUNTIME" "" _PYTHON_LIB "${_PYTHON_LIB}") + # look at runtime part on systems supporting it + if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR + (CMAKE_SYSTEM_NAME MATCHES "MSYS|CYGWIN" + AND ${_PYTHON_LIB} MATCHES "${CMAKE_IMPORT_LIBRARY_SUFFIX}$")) + set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX}) + # MSYS has a special syntax for runtime libraries + if (CMAKE_SYSTEM_NAME MATCHES "MSYS") + list (APPEND CMAKE_FIND_LIBRARY_PREFIXES "msys-") + endif() + find_library (${ARGV}) + endif() +endfunction() + + +function (_PYTHON_SET_LIBRARY_DIRS _PYTHON_SLD_RESULT) + unset (_PYTHON_DIRS) + set (_PYTHON_LIBS ${ARGV}) + list (REMOVE_AT _PYTHON_LIBS 0) + foreach (_PYTHON_LIB IN LISTS _PYTHON_LIBS) + if (${_PYTHON_LIB}) + get_filename_component (_PYTHON_DIR "${${_PYTHON_LIB}}" DIRECTORY) + list (APPEND _PYTHON_DIRS "${_PYTHON_DIR}") + endif() + endforeach() + if (_PYTHON_DIRS) + list (REMOVE_DUPLICATES _PYTHON_DIRS) + endif() + set (${_PYTHON_SLD_RESULT} ${_PYTHON_DIRS} PARENT_SCOPE) +endfunction() + + +# If major version is specified, it must be the same as internal major version +if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR + AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Wrong major version specified is \"${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}\", but expected major version is \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"") +endif() + + +# handle components +if (NOT ${_PYTHON_PREFIX}_FIND_COMPONENTS) + set (${_PYTHON_PREFIX}_FIND_COMPONENTS Interpreter) + set (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter TRUE) +endif() +foreach (_${_PYTHON_PREFIX}_COMPONENT IN LISTS ${_PYTHON_PREFIX}_FIND_COMPONENTS) + set (${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND FALSE) +endforeach() +unset (_${_PYTHON_PREFIX}_FIND_VERSIONS) + +# Set versions to search +## default: search any version +set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSIONS}) + +if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT GREATER 1) + if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT) + set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR}) + else() + unset (_${_PYTHON_PREFIX}_FIND_VERSIONS) + # add all compatible versions + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS) + if (_${_PYTHON_PREFIX}_VERSION VERSION_GREATER_EQUAL ${_PYTHON_PREFIX}_FIND_VERSION) + list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION}) + endif() + endforeach() + endif() +endif() + +# Python and Anaconda distributions: define which architectures can be used +if (CMAKE_SIZEOF_VOID_P) + # In this case, search only for 64bit or 32bit + math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8") + set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH}) +else() + # architecture unknown, search for both 64bit and 32bit + set (_${_PYTHON_PREFIX}_ARCH 64) + set (_${_PYTHON_PREFIX}_ARCH2 32) +endif() + +# IronPython support +if (CMAKE_SIZEOF_VOID_P) + # In this case, search only for 64bit or 32bit + math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8") + set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy${_${_PYTHON_PREFIX}_ARCH} ipy) +else() + # architecture unknown, search for natural interpreter + set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy) +endif() +set (_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES net45 net40) + +# Apple frameworks handling +_python_find_frameworks () + +# Save CMAKE_FIND_APPBUNDLE +if (DEFINED CMAKE_FIND_APPBUNDLE) + set (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE}) +else() + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE) +endif() +# To avoid app bundle lookup +set (CMAKE_FIND_APPBUNDLE "NEVER") + +# Save CMAKE_FIND_FRAMEWORK +if (DEFINED CMAKE_FIND_FRAMEWORK) + set (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) + if (CMAKE_FIND_FRAMEWORK STREQUAL "ONLY") + message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: CMAKE_FIND_FRAMEWORK: 'ONLY' value is not supported. 'FIRST' will be used instead.") + set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST") + else() + set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) + endif() +else() + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) + set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST") +endif() +# To avoid framework lookup +set (CMAKE_FIND_FRAMEWORK "NEVER") + +# Windows Registry handling +if (DEFINED ${_PYTHON_PREFIX}_FIND_REGISTRY) + if (NOT ${_PYTHON_PREFIX}_FIND_REGISTRY MATCHES "^(FIRST|LAST|NEVER)$") + message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_REGISTRY}: invalid value for '${_PYTHON_PREFIX}_FIND_REGISTRY'. 'FIRST', 'LAST' or 'NEVER' expected.") + set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST") + else() + set (_${_PYTHON_PREFIX}_FIND_REGISTRY ${${_PYTHON_PREFIX}_FIND_REGISTRY}) + endif() +else() + set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST") +endif() + + +unset (_${_PYTHON_PREFIX}_REQUIRED_VARS) +unset (_${_PYTHON_PREFIX}_CACHED_VARS) + + +# first step, search for the interpreter +if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS) + if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter) + list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE) + list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_EXECUTABLE) + endif() + + set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR) + + # look-up for various versions and locations + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) + string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION}) + + _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION}) + + # Apple frameworks handling + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST") + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + NAMES_PER_DIR + PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + PATH_SUFFIXES bin + NO_CMAKE_PATH + NO_CMAKE_ENVIRONMENT_PATH + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + # Windows registry + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + # try using HINTS + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + # try using standard paths. + if (WIN32) + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR) + else() + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + NAMES_PER_DIR) + endif() + + # Apple frameworks handling + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST") + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + NAMES_PER_DIR + PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + PATH_SUFFIXES bin + NO_DEFAULT_PATH) + endif() + + # Windows registry + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST") + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_VERSION} + python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR + PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_DEFAULT_PATH) + endif() + + _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION}) + if (${_PYTHON_PREFIX}_EXECUTABLE) + break() + endif() + endforeach() + + if (NOT ${_PYTHON_PREFIX}_EXECUTABLE) + # No specific version found. Retry with generic names + # try using HINTS + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + # try using standard paths. + # NAMES_PER_DIR is not defined on purpose to have a chance to find + # expected version. + # For example, typical systems have 'python' for version 2.* and 'python3' + # for version 3.*. So looking for names per dir will find, potentially, + # systematically 'python' (i.e. version 2) even if version 3 is searched. + find_program (${_PYTHON_PREFIX}_EXECUTABLE + NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} + python + ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}) + + _python_validate_interpreter () + endif() + + # retrieve exact version of executable found + if (${_PYTHON_PREFIX}_EXECUTABLE) + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}") + list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 1 ${_PYTHON_PREFIX}_VERSION_MINOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 2 ${_PYTHON_PREFIX}_VERSION_PATCH) + else() + # Interpreter is not usable + set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) + unset (${_PYTHON_PREFIX}_VERSION) + endif() + endif() + + if (${_PYTHON_PREFIX}_EXECUTABLE + AND ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE) + # Use interpreter version for future searches to ensure consistency + set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) + endif() + + if (${_PYTHON_PREFIX}_Interpreter_FOUND) + if (NOT CMAKE_SIZEOF_VOID_P) + # determine interpreter architecture + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.maxsize > 2**32)" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE ${_PYTHON_PREFIX}_IS64BIT + ERROR_VARIABLE ${_PYTHON_PREFIX}_IS64BIT) + if (NOT _${_PYTHON_PREFIX}_RESULT) + if (${_PYTHON_PREFIX}_IS64BIT) + set (_${_PYTHON_PREFIX}_ARCH 64) + set (_${_PYTHON_PREFIX}_ARCH2 64) + else() + set (_${_PYTHON_PREFIX}_ARCH 32) + set (_${_PYTHON_PREFIX}_ARCH2 32) + endif() + endif() + endif() + + # retrieve interpreter identity + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -V + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID + ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID) + if (NOT _${_PYTHON_PREFIX}_RESULT) + if (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Anaconda") + set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda") + elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought") + set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy") + else() + string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}") + if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python") + # try to get a more precise ID + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.copyright)" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT + ERROR_QUIET) + if (${_PYTHON_PREFIX}_COPYRIGHT MATCHES "ActiveState") + set (${_PYTHON_PREFIX}_INTERPRETER_ID "ActivePython") + endif() + endif() + endif() + else() + set (${_PYTHON_PREFIX}_INTERPRETER_ID Python) + endif() + else() + unset (${_PYTHON_PREFIX}_INTERPRETER_ID) + endif() + + # retrieve various package installation directories + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig;sys.stdout.write(';'.join([sysconfig.get_python_lib(plat_specific=False,standard_lib=True),sysconfig.get_python_lib(plat_specific=True,standard_lib=True),sysconfig.get_python_lib(plat_specific=False,standard_lib=False),sysconfig.get_python_lib(plat_specific=True,standard_lib=False)]))" + + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS + ERROR_QUIET) + if (NOT _${_PYTHON_PREFIX}_RESULT) + list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB) + list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH) + list (GET _${_PYTHON_PREFIX}_LIBPATHS 2 ${_PYTHON_PREFIX}_SITELIB) + list (GET _${_PYTHON_PREFIX}_LIBPATHS 3 ${_PYTHON_PREFIX}_SITEARCH) + else() + unset (${_PYTHON_PREFIX}_STDLIB) + unset (${_PYTHON_PREFIX}_STDARCH) + unset (${_PYTHON_PREFIX}_SITELIB) + unset (${_PYTHON_PREFIX}_SITEARCH) + endif() + + mark_as_advanced (${_PYTHON_PREFIX}_EXECUTABLE) +endif() + + +# second step, search for compiler (IronPython) +if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS) + if (${_PYTHON_PREFIX}_FIND_REQUIRED_Compiler) + list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER) + list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_COMPILER) + endif() + + # IronPython specific artifacts + # If IronPython interpreter is found, use its path + unset (_${_PYTHON_PREFIX}_IRON_ROOT) + if (${_PYTHON_PREFIX}_Interpreter_FOUND AND ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython") + get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT "${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY) + endif() + + # try using root dir and registry + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) + if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_program (${_PYTHON_PREFIX}_COMPILER + NAMES ipyc + HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS} + PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + find_program (${_PYTHON_PREFIX}_COMPILER + NAMES ipyc + HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + + if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST") + find_program (${_PYTHON_PREFIX}_COMPILER + NAMES ipyc + PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} + NO_DEFAULT_PATH) + endif() + + _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION}) + if (${_PYTHON_PREFIX}_COMPILER) + break() + endif() + endforeach() + + # no specific version found, re-try in standard paths + find_program (${_PYTHON_PREFIX}_COMPILER + NAMES ipyc + HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}) + + if (${_PYTHON_PREFIX}_COMPILER) + # retrieve python environment version from compiler + set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir") + file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n") + execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" + WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}" + OUTPUT_QUIET + ERROR_QUIET) + execute_process (COMMAND "${_${_PYTHON_PREFIX}_VERSION_DIR}/version" + WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION + ERROR_QUIET) + if (NOT _${_PYTHON_PREFIX}_RESULT) + string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}") + list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH) + + if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND) + # set public version information + set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION}) + set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR}) + set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR}) + set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH}) + endif() + else() + # compiler not usable + set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE) + endif() + file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}") + endif() + + if (${_PYTHON_PREFIX}_COMPILER) + if (${_PYTHON_PREFIX}_Interpreter_FOUND) + # Compiler must be compatible with interpreter + if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) + set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE) + endif() + elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE) + # Use compiler version for future searches to ensure consistency + set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) + endif() + endif() + + if (${_PYTHON_PREFIX}_Compiler_FOUND) + set (${_PYTHON_PREFIX}_COMPILER_ID IronPython) + else() + unset (${_PYTHON_PREFIX}_COMPILER_ID) + endif() + + mark_as_advanced (${_PYTHON_PREFIX}_COMPILER) +endif() + + +# third step, search for the development artifacts +## Development environment is not compatible with IronPython interpreter +if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython") + if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development) + list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARY + ${_PYTHON_PREFIX}_INCLUDE_DIR) + list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_LIBRARY + ${_PYTHON_PREFIX}_LIBRARY_RELEASE + ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE + ${_PYTHON_PREFIX}_LIBRARY_DEBUG + ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG + ${_PYTHON_PREFIX}_INCLUDE_DIR) + endif() + + # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES) + if (DEFINED ${_PYTHON_PREFIX}_USE_STATIC_LIBS AND NOT WIN32) + set(_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(${_PYTHON_PREFIX}_USE_STATIC_LIBS) + set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX}) + else() + list (REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX}) + endif() + else() + endif() + + # if python interpreter is found, use its location and version to ensure consistency + # between interpreter and development environment + unset (_${_PYTHON_PREFIX}_PREFIX) + if (${_PYTHON_PREFIX}_Interpreter_FOUND) + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.PREFIX)" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (_${_PYTHON_PREFIX}_RESULT) + unset (_${_PYTHON_PREFIX}_PREFIX) + endif() + endif() + set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR) + + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) + string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION}) + + # try to use pythonX.Y-config tool + set (_${_PYTHON_PREFIX}_CONFIG_NAMES) + if (DEFINED CMAKE_LIBRARY_ARCHITECTURE) + set (_${_PYTHON_PREFIX}_CONFIG_NAMES "${CMAKE_LIBRARY_ARCHITECTURE}-python${_${_PYTHON_PREFIX}_VERSION}-config") + endif() + list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES "python${_${_PYTHON_PREFIX}_VERSION}-config") + find_program (_${_PYTHON_PREFIX}_CONFIG + NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin) + unset (_${_PYTHON_PREFIX}_CONFIG_NAMES) + + if (NOT _${_PYTHON_PREFIX}_CONFIG) + continue() + endif() + if (DEFINED CMAKE_LIBRARY_ARCHITECTURE) + # check that config tool match library architecture + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (_${_PYTHON_PREFIX}_RESULT) + unset (_${_PYTHON_PREFIX}_CONFIG CACHE) + continue() + endif() + string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT) + if (_${_PYTHON_PREFIX}_RESULT EQUAL -1) + unset (_${_PYTHON_PREFIX}_CONFIG CACHE) + continue() + endif() + endif() + + # retrieve root install directory + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --prefix + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (_${_PYTHON_PREFIX}_RESULT) + # python-config is not usable + unset (_${_PYTHON_PREFIX}_CONFIG CACHE) + continue() + endif() + set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR) + + # retrieve library + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + # retrieve library directory + string (REGEX MATCHALL "-L[^ ]+" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_FLAGS}") + string (REPLACE "-L" "" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_LIB_DIRS}") + list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_DIRS) + # retrieve library name + string (REGEX MATCHALL "-lpython[^ ]+" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_FLAGS}") + string (REPLACE "-l" "" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_LIB_NAMES}") + list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_NAMES) + + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} ${_${_PYTHON_PREFIX}_LIB_DIRS} + PATH_SUFFIXES lib + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + # retrieve runtime library + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE) + get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY) + _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE + NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_PATH} ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + endif() + + # retrieve include directory + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --includes + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + # retrieve include directory + string (REGEX MATCHALL "-I[^ ]+" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_FLAGS}") + string (REPLACE "-I" "" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIRS}") + list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_DIRS) + + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h + HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS} + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_INCLUDE_DIR) + break() + endif() + endforeach() + + # Rely on HINTS and standard paths if config tool failed to locate artifacts + if (NOT (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) OR NOT ${_PYTHON_PREFIX}_INCLUDE_DIR) + foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) + string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION}) + + _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION}) + + set (_${_PYTHON_PREFIX}_REGISTRY_PATHS + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]) + + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST") + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} + lib/python${_${_PYTHON_PREFIX}_VERSION}/config + NO_CMAKE_PATH + NO_CMAKE_ENVIRONMENT_PATH + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} + lib/python${_${_PYTHON_PREFIX}_VERSION}/config + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + # search in HINTS locations + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} + lib/python${_${_PYTHON_PREFIX}_VERSION}/config + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST") + set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}) + else() + unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS) + endif() + + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST") + set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}) + else() + unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS) + endif() + + # search in all default paths + find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + ${__${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u + lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} + lib/python${_${_PYTHON_PREFIX}_VERSION}/config) + # retrieve runtime library + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE) + get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY) + _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} + python${_${_PYTHON_PREFIX}_VERSION}mu + python${_${_PYTHON_PREFIX}_VERSION}m + python${_${_PYTHON_PREFIX}_VERSION}u + python${_${_PYTHON_PREFIX}_VERSION} + NAMES_PER_DIR + HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin) + endif() + + if (WIN32) + # search for debug library + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE) + # use library location as a hint + get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY) + find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d + NAMES_PER_DIR + HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS} + NO_DEFAULT_PATH) + else() + # search first in known locations + if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES lib libs + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + # search in all default paths + find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d + NAMES_PER_DIR + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${__${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES lib libs) + endif() + if (${_PYTHON_PREFIX}_LIBRARY_DEBUG) + get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY) + _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG + NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d + NAMES_PER_DIR + HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS} + PATH_SUFFIXES bin) + endif() + endif() + + # Don't search for include dir until library location is known + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS) + + if (${_PYTHON_PREFIX}_EXECUTABLE) + # pick up include directory from configuration + execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c + "import sys; import sysconfig; sys.stdout.write(sysconfig.get_path('include'))" + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PATH + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + file (TO_CMAKE_PATH "${_${_PYTHON_PREFIX}_PATH}" _${_PYTHON_PREFIX}_PATH) + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PATH}") + endif() + endif() + + foreach (_${_PYTHON_PREFIX}_LIB IN ITEMS ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + if (${_${_PYTHON_PREFIX}_LIB}) + # Use the library's install prefix as a hint + if (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)") + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}") + elseif (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config") + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}") + elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}") + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}") + else() + # assume library is in a directory under root + get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${${_${_PYTHON_PREFIX}_LIB}}" DIRECTORY) + get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY) + list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}") + endif() + endif() + endforeach() + list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_HINTS) + + if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST") + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h + HINTS ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu + include/python${_${_PYTHON_PREFIX}_VERSION}m + include/python${_${_PYTHON_PREFIX}_VERSION}u + include/python${_${_PYTHON_PREFIX}_VERSION} + include + NO_CMAKE_PATH + NO_CMAKE_ENVIRONMENT_PATH + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h + HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu + include/python${_${_PYTHON_PREFIX}_VERSION}m + include/python${_${_PYTHON_PREFIX}_VERSION}u + include/python${_${_PYTHON_PREFIX}_VERSION} + include + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h + HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS} + PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS} + ${__${_PYTHON_PREFIX}_REGISTRY_PATHS} + PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu + include/python${_${_PYTHON_PREFIX}_VERSION}m + include/python${_${_PYTHON_PREFIX}_VERSION}u + include/python${_${_PYTHON_PREFIX}_VERSION} + include + NO_SYSTEM_ENVIRONMENT_PATH + NO_CMAKE_SYSTEM_PATH) + endif() + + if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) AND ${_PYTHON_PREFIX}_INCLUDE_DIR) + break() + endif() + endforeach() + + # search header file in standard locations + find_path (${_PYTHON_PREFIX}_INCLUDE_DIR + NAMES Python.h) + endif() + + if (${_PYTHON_PREFIX}_INCLUDE_DIR) + # retrieve version from header file + file (STRINGS "${${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" _${_PYTHON_PREFIX}_VERSION + REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"") + string (REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1" + _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_VERSION}") + string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}") + list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR) + list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH) + + if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT ${_PYTHON_PREFIX}_Compiler_FOUND) + # set public version information + set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION}) + set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR}) + set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR}) + set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH}) + endif() + endif() + + # define public variables + include (${CMAKE_CURRENT_LIST_DIR}/../SelectLibraryConfigurations.cmake) + select_library_configurations (${_PYTHON_PREFIX}) + if (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE) + set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}") + elseif (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) + set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}") + else() + set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "$${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND") + endif() + + _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS + ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + if (UNIX) + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" + OR ${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$") + set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS}) + endif() + else() + _python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS + ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) + endif() + + set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${${_PYTHON_PREFIX}_INCLUDE_DIR}") + + mark_as_advanced (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE + ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG + ${_PYTHON_PREFIX}_INCLUDE_DIR) + + if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + AND ${_PYTHON_PREFIX}_INCLUDE_DIR) + if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND) + # development environment must be compatible with interpreter/compiler + if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) + set (${_PYTHON_PREFIX}_Development_FOUND TRUE) + endif() + elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + set (${_PYTHON_PREFIX}_Development_FOUND TRUE) + endif() + endif() + + # Restore the original find library ordering + if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES) + set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +# final validation +if (${_PYTHON_PREFIX}_VERSION_MAJOR AND + NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) + _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Found unsuitable major version \"${${_PYTHON_PREFIX}_VERSION_MAJOR}\", but required major version is exact version \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"") +endif() + +include (${CMAKE_CURRENT_LIST_DIR}/../FindPackageHandleStandardArgs.cmake) +find_package_handle_standard_args (${_PYTHON_PREFIX} + REQUIRED_VARS ${_${_PYTHON_PREFIX}_REQUIRED_VARS} + VERSION_VAR ${_PYTHON_PREFIX}_VERSION + HANDLE_COMPONENTS) + +# Create imported targets and helper functions +if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND ${_PYTHON_PREFIX}_Interpreter_FOUND + AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter) + add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED) + set_property (TARGET ${_PYTHON_PREFIX}::Interpreter + PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}") +endif() + +if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND ${_PYTHON_PREFIX}_Compiler_FOUND + AND NOT TARGET ${_PYTHON_PREFIX}::Compiler) + add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED) + set_property (TARGET ${_PYTHON_PREFIX}::Compiler + PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}") +endif() + +if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS + AND ${_PYTHON_PREFIX}_Development_FOUND AND NOT TARGET ${_PYTHON_PREFIX}::Python) + + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" + OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" + OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) + set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED) + else() + set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC) + endif() + + add_library (${_PYTHON_PREFIX}::Python ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED) + + set_property (TARGET ${_PYTHON_PREFIX}::Python + PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIR}") + + if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE) + OR (${_PYTHON_PREFIX}_LIBRARY_DEBUG AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)) + # System manage shared libraries in two parts: import and runtime + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" + IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" + IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}") + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" + IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" + IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}") + else() + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARY}" + IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY}") + endif() + else() + if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) + set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" + IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}") + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" + IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}") + else() + set_target_properties (${_PYTHON_PREFIX}::Python + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY}") + endif() + endif() + + if (_${_PYTHON_PREFIX}_CONFIG AND _${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC") + # extend link information with dependent libraries + execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags + RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT + OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT _${_PYTHON_PREFIX}_RESULT) + string (REGEX MATCHALL "-[Ll][^ ]+" _${_PYTHON_PREFIX}_LINK_LIBRARIES "${_${_PYTHON_PREFIX}_FLAGS}") + # remove elements relative to python library itself + list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-lpython") + foreach (_${_PYTHON_PREFIX}_DIR IN LISTS ${_PYTHON_PREFIX}_LIBRARY_DIRS) + list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-L${${_PYTHON_PREFIX}_DIR}") + endforeach() + set_property (TARGET ${_PYTHON_PREFIX}::Python + PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES}) + endif() + endif() + + # + # PYTHON_ADD_LIBRARY ( [STATIC|SHARED|MODULE] src1 src2 ... srcN) + # It is used to build modules for python. + # + function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name) + cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY + "STATIC;SHARED;MODULE" "" "") + + unset (type) + if (NOT (PYTHON_ADD_LIBRARY_STATIC + OR PYTHON_ADD_LIBRARY_SHARED + OR PYTHON_ADD_LIBRARY_MODULE)) + set (type MODULE) + endif() + add_library (${name} ${type} ${ARGN}) + target_link_libraries (${name} PRIVATE ${prefix}::Python) + + # customize library name to follow module name rules + get_property (type TARGET ${name} PROPERTY TYPE) + if (type STREQUAL "MODULE_LIBRARY") + set_property (TARGET ${name} PROPERTY PREFIX "") + if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set_property (TARGET ${name} PROPERTY SUFFIX ".pyd") + endif() + endif() + endfunction() +endif() + +# final clean-up + +# Restore CMAKE_FIND_APPBUNDLE +if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE) + set (CMAKE_FIND_APPBUNDLE ${_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE}) + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE) +else() + unset (CMAKE_FIND_APPBUNDLE) +endif() +# Restore CMAKE_FIND_FRAMEWORK +if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) + set (CMAKE_FIND_FRAMEWORK ${_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK}) + unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) +else() + unset (CMAKE_FIND_FRAMEWORK) +endif() + +unset (_${_PYTHON_PREFIX}_CONFIG CACHE) diff --git a/examples/cmake/FindPython3.cmake b/examples/cmake/FindPython3.cmake new file mode 100644 index 0000000..2176f3f --- /dev/null +++ b/examples/cmake/FindPython3.cmake @@ -0,0 +1,171 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPython3 +----------- + +Find Python 3 interpreter, compiler and development environment (include +directories and libraries). + +Three components are supported: + +* ``Interpreter``: search for Python 3 interpreter +* ``Compiler``: search for Python 3 compiler. Only offered by IronPython. +* ``Development``: search for development artifacts (include directories and + libraries) + +If no ``COMPONENTS`` is specified, ``Interpreter`` is assumed. + +To ensure consistent versions between components ``Interpreter``, ``Compiler`` +and ``Development``, specify all components at the same time:: + + find_package (Python3 COMPONENTS Interpreter Development) + +This module looks only for version 3 of Python. This module can be used +concurrently with :module:`FindPython2` module to use both Python versions. + +The :module:`FindPython` module can be used if Python version does not matter +for you. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module defines the following :ref:`Imported Targets `: + +``Python3::Interpreter`` + Python 3 interpreter. Target defined if component ``Interpreter`` is found. +``Python3::Compiler`` + Python 3 compiler. Target defined if component ``Compiler`` is found. +``Python3::Python`` + Python 3 library. Target defined if component ``Development`` is found. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module will set the following variables in your project +(see :ref:`Standard Variable Names `): + +``Python3_FOUND`` + System has the Python 3 requested components. +``Python3_Interpreter_FOUND`` + System has the Python 3 interpreter. +``Python3_EXECUTABLE`` + Path to the Python 3 interpreter. +``Python3_INTERPRETER_ID`` + A short string unique to the interpreter. Possible values include: + * Python + * ActivePython + * Anaconda + * Canopy + * IronPython +``Python3_STDLIB`` + Standard platform independent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``. +``Python3_STDARCH`` + Standard platform dependent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``. +``Python3_SITELIB`` + Third-party platform independent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``. +``Python3_SITEARCH`` + Third-party platform dependent installation directory. + + Information returned by + ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``. +``Python3_Compiler_FOUND`` + System has the Python 3 compiler. +``Python3_COMPILER`` + Path to the Python 3 compiler. Only offered by IronPython. +``Python3_COMPILER_ID`` + A short string unique to the compiler. Possible values include: + * IronPython +``Python3_Development_FOUND`` + System has the Python 3 development artifacts. +``Python3_INCLUDE_DIRS`` + The Python 3 include directories. +``Python3_LIBRARIES`` + The Python 3 libraries. +``Python3_LIBRARY_DIRS`` + The Python 3 library directories. +``Python3_RUNTIME_LIBRARY_DIRS`` + The Python 3 runtime library directories. +``Python3_VERSION`` + Python 3 version. +``Python3_VERSION_MAJOR`` + Python 3 major version. +``Python3_VERSION_MINOR`` + Python 3 minor version. +``Python3_VERSION_PATCH`` + Python 3 patch version. + +Hints +^^^^^ + +``Python3_ROOT_DIR`` + Define the root directory of a Python 3 installation. + +``Python3_USE_STATIC_LIBS`` + * If not defined, search for shared libraries and static libraries in that + order. + * If set to TRUE, search **only** for static libraries. + * If set to FALSE, search **only** for shared libraries. + +``Python3_FIND_REGISTRY`` + On Windows the ``Python3_FIND_REGISTRY`` variable determine the order + of preference between registry and environment variables. + the ``Python3_FIND_REGISTRY`` variable can be set to empty or one of the + following: + + * ``FIRST``: Try to use registry before environment variables. + This is the default. + * ``LAST``: Try to use registry after environment variables. + * ``NEVER``: Never try to use registry. + +``CMAKE_FIND_FRAMEWORK`` + On OS X the :variable:`CMAKE_FIND_FRAMEWORK` variable determine the order of + preference between Apple-style and unix-style package components. + + .. note:: + + Value ``ONLY`` is not supported so ``FIRST`` will be used instead. + +.. note:: + + If a Python virtual environment is configured, set variable + ``Python_FIND_REGISTRY`` (Windows) or ``CMAKE_FIND_FRAMEWORK`` (macOS) with + value ``LAST`` or ``NEVER`` to select it preferably. + +Commands +^^^^^^^^ + +This module defines the command ``Python3_add_library`` which have the same +semantic as :command:`add_library` but take care of Python module naming rules +(only applied if library is of type ``MODULE``) and add dependency to target +``Python3::Python``:: + + Python3_add_library (my_module MODULE src1.cpp) + +If library type is not specified, ``MODULE`` is assumed. +#]=======================================================================] + + +set (_PYTHON_PREFIX Python3) + +set (_Python3_REQUIRED_VERSION_MAJOR 3) + +include (${CMAKE_CURRENT_LIST_DIR}/FindPython/Support.cmake) + +if (COMMAND __Python3_add_library) + macro (Python3_add_library) + __Python3_add_library (Python3 ${ARGV}) + endmacro() +endif() + +unset (_PYTHON_PREFIX) diff --git a/examples/libmod_cmake/CMakeLists.txt b/examples/libmod_cmake/CMakeLists.txt new file mode 100644 index 0000000..ffb475c --- /dev/null +++ b/examples/libmod_cmake/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) + +project(LibmodTestProject CXX) + +find_package(mod REQUIRED) + +add_executable(doStuff main.cpp) +target_link_libraries(doStuff mod::libmod) diff --git a/examples/libmod_cmake/main.cpp b/examples/libmod_cmake/main.cpp new file mode 100644 index 0000000..d938bd4 --- /dev/null +++ b/examples/libmod_cmake/main.cpp @@ -0,0 +1,8 @@ +#include + +#include + +int main() { + auto g = mod::graph::Graph::graphDFS("[T]"); + std::cout << "Graph name: " << g->getName() << "\n"; +} \ No newline at end of file diff --git a/examples/pymod_extension/CMakeLists.txt b/examples/pymod_extension/CMakeLists.txt new file mode 100644 index 0000000..587d25d --- /dev/null +++ b/examples/pymod_extension/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.10) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) + +project(PyModTestProject CXX) + +# MØD +# ------------------------------------------------------------------------- +find_package(mod REQUIRED) + + +# Boost.Python +# ------------------------------------------------------------------------- +set(v 1.64.0) +foreach(PY 3 34 35 36 37 38 39) + set(lib "python${PY}") + find_package(Boost ${v} QUIET COMPONENTS ${lib}) + if(Boost_FOUND) + find_package(Boost ${v} COMPONENTS ${lib}) + set(PYTHON_TARGET ${lib}) + break() + endif() +endforeach() +if(NOT Boost_FOUND) + find_package(Boost ${v} REQUIRED COMPONENTS python3) + message(FATAL_ERROR "Could not find Boost.Python for Python 3. Tried 'python' wih suffixes 3, 34, 35, 36, 37, 38, and 39.") +endif() + + +# Python 3 +# ------------------------------------------------------------------------- +find_package(Python3 REQUIRED COMPONENTS Interpreter Development) + + +# Artefacts +# ------------------------------------------------------------------------- + +add_library(awesome MODULE + pyModule.cpp + stuff.cpp) +set_target_properties(awesome PROPERTIES PREFIX "") # so it doesn't get the "lib" prefix +target_link_libraries(awesome PUBLIC mod::libmod Boost::${PYTHON_TARGET} Python3::Python) +target_compile_options(awesome PRIVATE -Wall -Wextra + -Wno-unused-parameter + -Wno-comment + -Wno-unused-local-typedefs) \ No newline at end of file diff --git a/doc/source/pymod/examples/extension/pyModule.cpp b/examples/pymod_extension/pyModule.cpp similarity index 88% rename from doc/source/pymod/examples/extension/pyModule.cpp rename to examples/pymod_extension/pyModule.cpp index e2c8053..336a41f 100644 --- a/doc/source/pymod/examples/extension/pyModule.cpp +++ b/examples/pymod_extension/pyModule.cpp @@ -1,8 +1,8 @@ #include -#include "stuff.h" +#include "stuff.hpp" -#include +#include namespace py = boost::python; diff --git a/examples/pymod_extension/stuff.cpp b/examples/pymod_extension/stuff.cpp new file mode 100644 index 0000000..b7b40a9 --- /dev/null +++ b/examples/pymod_extension/stuff.cpp @@ -0,0 +1,11 @@ +#include "stuff.hpp" + +namespace awesome { + +std::shared_ptr doStuff() { + auto g = mod::graph::Graph::smiles("CCO"); + g->setName("Ethanol"); + return g; +} + +} // namespace awesome diff --git a/examples/pymod_extension/stuff.hpp b/examples/pymod_extension/stuff.hpp new file mode 100644 index 0000000..4f3840f --- /dev/null +++ b/examples/pymod_extension/stuff.hpp @@ -0,0 +1,12 @@ +#ifndef AWESOMELIB_HPP +#define AWESOMELIB_HPP + +#include + +namespace awesome { + +std::shared_ptr doStuff(); + +} // namespace awesome + +#endif // AWESOMELIB_HPP diff --git a/doc/source/pymod/examples/extension/test.py b/examples/pymod_extension/test.py similarity index 100% rename from doc/source/pymod/examples/extension/test.py rename to examples/pymod_extension/test.py diff --git a/external/graph_canon b/external/graph_canon new file mode 160000 index 0000000..3f2ef09 --- /dev/null +++ b/external/graph_canon @@ -0,0 +1 @@ +Subproject commit 3f2ef09e2fc0288bb6b323027ba976166ba7962b diff --git a/jla_build.sh b/jla_build.sh new file mode 100755 index 0000000..7b34ecb --- /dev/null +++ b/jla_build.sh @@ -0,0 +1,55 @@ +#!/bin/bash +export AS_RLIMIT=300000000 +root_PWD=$(pwd) +numThreads=2 +prefix="../stage" +type="OptDebug" +while true; do + case $1 in + -j) + if [ "x$2" = "x" ]; then + echo "Missing argument for '$1'" + exit 1 + fi + numThreads=$2 + shift + shift + ;; + "--prefix="*) + prefix=${1#--prefix=} + shift + ;; + "--type="*) + type=${1#--type=} + shift + ;; + "") + break + ;; + *) + echo "Unknown option '$1'" + exit 1 + esac +done + +args="-DCMAKE_BUILD_TYPE=$type" +args+=" -DBUILD_TESTING=on" +args+=" -DCMAKE_PREFIX_PATH=$HOME/programs" +args+=" -DBOOST_ROOT=$HOME/programs" +args+=" -DCMAKE_INSTALL_PREFIX=$prefix $@" + +./bootstrap.sh \ + && rm -rf build && mkdir build \ + && cd build && cmake ../ $args +res=$? +if [ $res -ne 0 ]; then + echo "Error during configuration" + exit $res +fi +time make -j $numThreads \ + && make install +res=$? +if [ $res -ne 0 ]; then + echo "Error during installation" + exit $res +fi diff --git a/libs/gml/CMakeLists.txt b/libs/gml/CMakeLists.txt new file mode 100644 index 0000000..0fc7cbc --- /dev/null +++ b/libs/gml/CMakeLists.txt @@ -0,0 +1,59 @@ +########################################################################### +# Targets and Artefacts +########################################################################### + +add_library(gml STATIC + ${mod_gml_INCLUDE_FILES} + ${mod_gml_SRC_FILES}) +add_library(GML::gml ALIAS gml) +target_include_directories(gml + PUBLIC + $ + $ + ${Boost_INCLUDE_DIR}) # we only use header-only libs from Boost, right? +target_link_libraries(gml PRIVATE -Wl,--no-undefined) +target_compile_options(gml PRIVATE -Wall -Wextra + -Wno-unused-parameter + -Wno-parentheses) +set_target_properties(gml PROPERTIES + POSITION_INDEPENDENT_CODE ON + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON) +target_compile_definitions(gml PRIVATE GML_SOURCE) + +target_add_coverage(gml) + +install(TARGETS gml + EXPORT PROJECT_exports + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT GML_lib + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT GML_lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT GML_lib) +install(DIRECTORY include/gml + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT GML_dev + FILES_MATCHING PATTERN "*.hpp") + + +########################################################################### +# Tests +########################################################################### + +if(BUILD_TESTING) + if(NOT TARGET tests) + add_custom_target(tests) + endif() + add_dependencies(tests ${mod_gml_TEST_FILES}) + + set(sanFlags -g -fsanitize=undefined -fsanitize=address -fsanitize=leak) + foreach(testName ${mod_gml_TEST_FILES}) + add_executable(${testName} EXCLUDE_FROM_ALL test/${testName}.cpp) + target_link_libraries(${testName} PRIVATE GML::gml) + if(BUILD_TESTING_SANITIZERS AND NOT BUILD_COVERAGE) + target_compile_options(${testName} PRIVATE ${sanFlags}) + target_link_libraries(${testName} PRIVATE ${sanFlags}) + endif() + target_add_coverage(${testName}) + add_test(${testName} ${testName}) + add_coverage_case(${testName}) + endforeach() +endif() \ No newline at end of file diff --git a/src/gml/ast.hpp b/libs/gml/include/gml/ast.hpp similarity index 100% rename from src/gml/ast.hpp rename to libs/gml/include/gml/ast.hpp diff --git a/src/gml/attr_handler.hpp b/libs/gml/include/gml/attr_handler.hpp similarity index 100% rename from src/gml/attr_handler.hpp rename to libs/gml/include/gml/attr_handler.hpp diff --git a/src/gml/converter.hpp b/libs/gml/include/gml/converter.hpp similarity index 100% rename from src/gml/converter.hpp rename to libs/gml/include/gml/converter.hpp diff --git a/src/gml/converter_edsl.hpp b/libs/gml/include/gml/converter_edsl.hpp similarity index 100% rename from src/gml/converter_edsl.hpp rename to libs/gml/include/gml/converter_edsl.hpp diff --git a/src/gml/converter_expressions.hpp b/libs/gml/include/gml/converter_expressions.hpp similarity index 100% rename from src/gml/converter_expressions.hpp rename to libs/gml/include/gml/converter_expressions.hpp diff --git a/src/gml/parser.hpp b/libs/gml/include/gml/parser.hpp similarity index 100% rename from src/gml/parser.hpp rename to libs/gml/include/gml/parser.hpp diff --git a/src/gml/value_type.hpp b/libs/gml/include/gml/value_type.hpp similarity index 100% rename from src/gml/value_type.hpp rename to libs/gml/include/gml/value_type.hpp diff --git a/src/gml/parser.cpp b/libs/gml/src/parser.cpp similarity index 99% rename from src/gml/parser.cpp rename to libs/gml/src/parser.cpp index 65eb9c2..8e5f40a 100644 --- a/src/gml/parser.cpp +++ b/libs/gml/src/parser.cpp @@ -1,4 +1,4 @@ -#include "parser.hpp" +#include #include #include diff --git a/libs/gml/test/test_gml.cpp b/libs/gml/test/test_gml.cpp new file mode 100644 index 0000000..a60c22c --- /dev/null +++ b/libs/gml/test/test_gml.cpp @@ -0,0 +1,159 @@ +#include +#include +#include + +#include +#include + +template +std::ostream &operator<<(std::ostream &s, const std::vector &v) { + s << "["; + if(!v.empty()) s << v.front(); + for(std::size_t i = 1; i < v.size(); ++i) s << ", " << v[i]; + return s << "]"; +} + +struct T { + + friend std::ostream &operator<<(std::ostream &s, const T &t) { + return s << "i = " << t.i << ", d = " << t.d << ", s = '" << t.s << "'"; + } + +public: + int i = 0; + double d = 0; + std::string s = "t"; +}; + +struct V { + + friend std::ostream &operator<<(std::ostream &s, const V &v) { + return s << "vi = " << v.vi << ", vd = " << v.vd << ", vs = " << v.vs; + } + +public: + std::vector vi; + std::vector vd; + std::vector vs; +}; + +void print(std::ostream &) { } + +template +void print(std::ostream &s, const Attr &attr) { + std::cout << "Attr: " << attr << std::endl; +} + +template +void test(std::string str, const Expression &expr, Attr &...attr) { + std::cout << "Testing: '" << str << "' with '" << asConverter(expr) << "'" << std::endl << std::string(70, '-') + << std::endl; + std::stringstream ss; + ss << str; + std::stringstream err; + gml::ast::KeyValue ast; + bool res = gml::parser::parse(ss, ast, err); + if(!res) { + std::cout << err.str() << std::endl; + std::cout << "Parsing failed." << std::endl; + std::exit(1); + } + auto iterBegin = * + auto iterEnd = iterBegin + 1; + res = gml::converter::convert(iterBegin, iterEnd, expr, err, attr...); + if(!res) { + std::cout << err.str() << std::endl << std::endl; + std::cout << "Expected success." << std::endl; + std::exit(1); + } else { + print(std::cout, attr...); + } +} + +template +void fail(std::string str, const Expression &expr, Attr &...attr) { + std::cout << "Testing for fail: '" << str << "' with '" << asConverter(expr) << "'" << std::endl + << std::string(70, '-') << std::endl; + std::stringstream ss; + ss << str; + std::stringstream err; + gml::ast::KeyValue ast; + bool res = gml::parser::parse(ss, ast, err); + if(!res) { + std::cout << err.str() << std::endl; + std::cout << "Parsing failed." << std::endl; + return; + } + auto iterBegin = * + auto iterEnd = iterBegin + 1; + res = gml::converter::convert(iterBegin, iterEnd, expr, err, attr...); + if(!res) { + std::cout << err.str() << std::endl << std::endl; + } else { + print(std::cout, attr...); + std::exit(1); + } +} + +int main() { + using namespace gml::converter::edsl; + fail("", int_("id")); + fail("a 5 a 5", int_("a")); + fail("a 5", int_("id")); + fail("id \"a\"", int_("id")); + test("w 4.5", float_("w")); + test("label \"a\"", string("label")); + test("node []", list("node")); + fail("node [ id 0 ]", list("node")); + fail("node []", list("node")(int_("id"), 1, 1)); + fail("node [ id 0 ]", list("node")(int_("id"), 0, 0)); + { + int i = 0; + double d = 0; + std::string s = "t"; + test("id 42", int_("id"), i); + test("w 3.14", float_("w"), d); + test("s \"hest\"", string("s"), s); + } + { + T t; + test("id 42", int_("id", &T::i), t); + test("w 3.14", float_("w", &T::d), t); + test("s \"hest\"", string("s", &T::s), t); + } + { + std::vector vi; + std::vector vd; + std::vector vs; + test("id 42", int_("id"), vi); + test("w 3.14", float_("w"), vd); + test("s \"hest\"", string("s"), vs); + } + { + V v; + test("id 42", int_("id", &V::vi), v); + test("w 3.14", float_("w", &V::vd), v); + test("s \"hest\"", string("s", &V::vs), v); + } + { + T t; + auto expr = list("node") + (int_("id", &T::i), 1, 1) + (string("label", &T::s), 1, 1); + test("node [ id 42 label \"hest\" ]", expr, t); + } + { + T t; + auto expr = list("node") + (int_("id", &T::i), 1, 1) + (string("label", &T::s), 1, 1); + test("node [ id 42 label \"hest\" ]", expr, t); + } + { + std::vector vt; + auto expr = list("node") + (int_("id", &T::i), 1, 1) + (string("label", &T::s), 1, 1); + test("node [ id 42 label \"hest\" ]", expr, vt); + } +} diff --git a/libs/jla_boost/CMakeLists.txt b/libs/jla_boost/CMakeLists.txt new file mode 100644 index 0000000..5a32d27 --- /dev/null +++ b/libs/jla_boost/CMakeLists.txt @@ -0,0 +1,58 @@ +########################################################################### +# Targets and Artefacts +########################################################################### + +add_library(jla_boost STATIC + ${mod_jla_boost_INCLUDE_FILES} + ${mod_jla_boost_SRC_FILES}) +add_library(JLA::boost ALIAS jla_boost) +target_include_directories(jla_boost + PUBLIC + $ + $) +target_link_libraries(jla_boost PUBLIC GraphCanon::graph_canon Boost::boost Boost::regex) +target_link_libraries(jla_boost PRIVATE -Wl,--no-undefined) +target_compile_options(jla_boost PRIVATE -Wall -Wextra + -Wno-unused-parameter) +set_target_properties(jla_boost PROPERTIES + POSITION_INDEPENDENT_CODE ON + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON) +target_compile_definitions(jla_boost PRIVATE JLA_BOOST_SOURCE) + +target_add_coverage(jla_boost) + +install(TARGETS jla_boost + EXPORT PROJECT_exports + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT JLA_BOOST_lib + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT JLA_BOOST_lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT JLA_BOOST_lib) +install(DIRECTORY include/jla_boost + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT JLA_BOOST_dev + FILES_MATCHING PATTERN "*.hpp") + + +########################################################################### +# Tests +########################################################################### + +if(BUILD_TESTING) + if(NOT TARGET tests) + add_custom_target(tests) + endif() + add_dependencies(tests ${mod_jla_boost_TEST_FILES}) + + set(sanFlags -g -fsanitize=undefined -fsanitize=address -fsanitize=leak) + foreach(testName ${mod_jla_boost_TEST_FILES}) + add_executable(${testName} EXCLUDE_FROM_ALL test/${testName}.cpp) + target_link_libraries(${testName} PRIVATE JLA::boost) + if(BUILD_TESTING_SANITIZERS AND NOT BUILD_COVERAGE) + target_compile_options(${testName} PRIVATE ${sanFlags}) + target_link_libraries(${testName} PRIVATE ${sanFlags}) + endif() + target_add_coverage(${testName}) + add_test(${testName} ${testName}) + add_coverage_case(${testName}) + endforeach() +endif() \ No newline at end of file diff --git a/src/jla_boost/Functional.hpp b/libs/jla_boost/include/jla_boost/Functional.hpp similarity index 100% rename from src/jla_boost/Functional.hpp rename to libs/jla_boost/include/jla_boost/Functional.hpp diff --git a/src/jla_boost/TaggedList.hpp b/libs/jla_boost/include/jla_boost/TaggedList.hpp similarity index 100% rename from src/jla_boost/TaggedList.hpp rename to libs/jla_boost/include/jla_boost/TaggedList.hpp diff --git a/src/jla_boost/graph/AdaptorTraits.hpp b/libs/jla_boost/include/jla_boost/graph/AdaptorTraits.hpp similarity index 100% rename from src/jla_boost/graph/AdaptorTraits.hpp rename to libs/jla_boost/include/jla_boost/graph/AdaptorTraits.hpp diff --git a/src/jla_boost/graph/Concepts.hpp b/libs/jla_boost/include/jla_boost/graph/Concepts.hpp similarity index 100% rename from src/jla_boost/graph/Concepts.hpp rename to libs/jla_boost/include/jla_boost/graph/Concepts.hpp diff --git a/src/jla_boost/graph/EdgeIndexedAdjacencyList.hpp b/libs/jla_boost/include/jla_boost/graph/EdgeIndexedAdjacencyList.hpp similarity index 100% rename from src/jla_boost/graph/EdgeIndexedAdjacencyList.hpp rename to libs/jla_boost/include/jla_boost/graph/EdgeIndexedAdjacencyList.hpp diff --git a/src/jla_boost/graph/FilteredWrapper.hpp b/libs/jla_boost/include/jla_boost/graph/FilteredWrapper.hpp similarity index 88% rename from src/jla_boost/graph/FilteredWrapper.hpp rename to libs/jla_boost/include/jla_boost/graph/FilteredWrapper.hpp index ad730e5..07e71d1 100644 --- a/src/jla_boost/graph/FilteredWrapper.hpp +++ b/libs/jla_boost/include/jla_boost/graph/FilteredWrapper.hpp @@ -57,8 +57,8 @@ struct FilteredWrapper { //graph_traits::degree_size_type public: - FilteredWrapper(const Graph & g) - : g(g), map(num_vertices(g), std::numeric_limits::max()) { + FilteredWrapper(const Graph &g) + : g(g), map(num_vertices(g), std::numeric_limits::max()) { vertices_size_type count = 0; // std::cout << "FilterWrapper" << std::endl; @@ -71,6 +71,7 @@ struct FilteredWrapper { count++; } } + public: const Graph &g; std::vector map; @@ -112,28 +113,30 @@ namespace jla_boost { template std::pair >::out_edge_iterator, -typename boost::graph_traits >::out_edge_iterator> + typename boost::graph_traits >::out_edge_iterator> out_edges(typename boost::graph_traits >::vertex_descriptor v, - const jla_boost::FilteredWrapper &g) { + const jla_boost::FilteredWrapper &g) { return out_edges(v, g.g); } template typename boost::graph_traits >::vertex_descriptor -source(typename boost::graph_traits >::edge_descriptor e, const jla_boost::FilteredWrapper &g) { +source(typename boost::graph_traits >::edge_descriptor e, + const jla_boost::FilteredWrapper &g) { return source(e, g.g); } template typename boost::graph_traits >::vertex_descriptor -target(typename boost::graph_traits >::edge_descriptor e, const jla_boost::FilteredWrapper &g) { +target(typename boost::graph_traits >::edge_descriptor e, + const jla_boost::FilteredWrapper &g) { return target(e, g.g); } template typename boost::graph_traits >::degree_size_type out_degree(typename boost::graph_traits >::vertex_descriptor v, - const jla_boost::FilteredWrapper &g) { + const jla_boost::FilteredWrapper &g) { return out_degree(v, g.g); } @@ -141,22 +144,23 @@ out_degree(typename boost::graph_traits >::ver template std::pair >::in_edge_iterator, -typename boost::graph_traits >::in_edge_iterator> -in_edges(typename boost::graph_traits >::vertex_descriptor v, const jla_boost::FilteredWrapper &g) { + typename boost::graph_traits >::in_edge_iterator> +in_edges(typename boost::graph_traits >::vertex_descriptor v, + const jla_boost::FilteredWrapper &g) { return in_edges(v, g.g); } template typename boost::graph_traits >::degree_size_type in_degree(typename boost::graph_traits >::vertex_descriptor v, - const jla_boost::FilteredWrapper &g) { + const jla_boost::FilteredWrapper &g) { return in_degree(v, g.g); } template typename boost::graph_traits >::degree_size_type degree(typename boost::graph_traits >::vertex_descriptor v, - const jla_boost::FilteredWrapper &g) { + const jla_boost::FilteredWrapper &g) { return degree(v, g.g); } @@ -167,7 +171,7 @@ degree(typename boost::graph_traits >::vertex_ template std::pair >::vertex_iterator, -typename boost::graph_traits >::vertex_iterator> + typename boost::graph_traits >::vertex_iterator> vertices(const jla_boost::FilteredWrapper &g) { return vertices(g.g); } @@ -182,7 +186,7 @@ num_vertices(const jla_boost::FilteredWrapper &g) { template std::pair >::edge_iterator, -typename boost::graph_traits >::edge_iterator> + typename boost::graph_traits >::edge_iterator> edges(const jla_boost::FilteredWrapper &g) { return edges(g.g); } @@ -198,8 +202,8 @@ num_edges(const jla_boost::FilteredWrapper &g) { template std::pair >::edge_descriptor, bool> edge(typename boost::graph_traits >::vertex_descriptor u, - typename boost::graph_traits >::vertex_descriptor v, - const jla_boost::FilteredWrapper &g) { + typename boost::graph_traits >::vertex_descriptor v, + const jla_boost::FilteredWrapper &g) { return edge(u, v, g.g); } @@ -215,15 +219,15 @@ struct property_traits > { typedef readable_property_map_tag category; }; -template +template struct vertex_property_type > : vertex_property_type { }; -template +template struct edge_property_type > : edge_property_type { }; -template +template struct graph_property_type > : graph_property_type { }; @@ -245,7 +249,7 @@ namespace jla_boost { template typename boost::property_traits >::value_type get(const jla_boost::FilteredWrapperIndexMap &map, - typename boost::property_traits >::key_type k) { + typename boost::property_traits >::key_type k) { return map[k]; } @@ -257,7 +261,7 @@ get(PropertyTag t, const jla_boost::FilteredWrapper &g) { template jla_boost::FilteredWrapperIndexMap get(boost::vertex_index_t, const jla_boost::FilteredWrapper &g) { - return jla_boost::FilteredWrapperIndexMap (g); + return jla_boost::FilteredWrapperIndexMap(g); } template @@ -271,7 +275,7 @@ get(PropertyTag t, const jla_boost::FilteredWrapper &g, VertexOrEdge ve) template inline typename boost::graph_traits >::vertex_descriptor vertex(typename boost::graph_traits >::vertices_size_type n, - const jla_boost::FilteredWrapper &g) { + const jla_boost::FilteredWrapper &g) { for(typename boost::graph_traits >::vertex_descriptor v : asRange(vertices(g))) { if(get(boost::vertex_index_t(), g, v) == n) return v; diff --git a/src/jla_boost/graph/PairToRangeAdaptor.hpp b/libs/jla_boost/include/jla_boost/graph/PairToRangeAdaptor.hpp similarity index 88% rename from src/jla_boost/graph/PairToRangeAdaptor.hpp rename to libs/jla_boost/include/jla_boost/graph/PairToRangeAdaptor.hpp index bd02494..7be3b35 100644 --- a/src/jla_boost/graph/PairToRangeAdaptor.hpp +++ b/libs/jla_boost/include/jla_boost/graph/PairToRangeAdaptor.hpp @@ -10,6 +10,8 @@ namespace jla_boost { template struct range : std::pair { + using iterator = Iter; + using const_iterator = iterator; range(const std::pair &x) : std::pair(x) { } @@ -37,4 +39,4 @@ namespace mod { // HAX! using jla_boost::asRange; } // namespace mod -#endif /* JLA_BOOST_GRAPH_PAIRTORANGEADAPTOR_H */ \ No newline at end of file +#endif /* JLA_BOOST_GRAPH_PAIRTORANGEADAPTOR_H */ diff --git a/src/jla_boost/graph/UnionGraph.hpp b/libs/jla_boost/include/jla_boost/graph/UnionGraph.hpp similarity index 100% rename from src/jla_boost/graph/UnionGraph.hpp rename to libs/jla_boost/include/jla_boost/graph/UnionGraph.hpp diff --git a/src/jla_boost/graph/dpo/FilteredGraphProjection.hpp b/libs/jla_boost/include/jla_boost/graph/dpo/FilteredGraphProjection.hpp similarity index 100% rename from src/jla_boost/graph/dpo/FilteredGraphProjection.hpp rename to libs/jla_boost/include/jla_boost/graph/dpo/FilteredGraphProjection.hpp diff --git a/src/jla_boost/graph/dpo/IO.hpp b/libs/jla_boost/include/jla_boost/graph/dpo/IO.hpp similarity index 100% rename from src/jla_boost/graph/dpo/IO.hpp rename to libs/jla_boost/include/jla_boost/graph/dpo/IO.hpp diff --git a/src/jla_boost/graph/dpo/Rule.hpp b/libs/jla_boost/include/jla_boost/graph/dpo/Rule.hpp similarity index 100% rename from src/jla_boost/graph/dpo/Rule.hpp rename to libs/jla_boost/include/jla_boost/graph/dpo/Rule.hpp diff --git a/src/jla_boost/graph/morphism/AsPropertyMap.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/AsPropertyMap.hpp similarity index 100% rename from src/jla_boost/graph/morphism/AsPropertyMap.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/AsPropertyMap.hpp diff --git a/src/jla_boost/graph/morphism/Predicates.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/Predicates.hpp similarity index 100% rename from src/jla_boost/graph/morphism/Predicates.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/Predicates.hpp diff --git a/src/jla_boost/graph/morphism/PropertyTags.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/PropertyTags.hpp similarity index 100% rename from src/jla_boost/graph/morphism/PropertyTags.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/PropertyTags.hpp diff --git a/src/jla_boost/graph/morphism/Traits.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/Traits.hpp similarity index 100% rename from src/jla_boost/graph/morphism/Traits.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/Traits.hpp diff --git a/src/jla_boost/graph/morphism/VertexMap.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/VertexMap.hpp similarity index 98% rename from src/jla_boost/graph/morphism/VertexMap.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/VertexMap.hpp index 3c1ae0a..5493156 100644 --- a/src/jla_boost/graph/morphism/VertexMap.hpp +++ b/libs/jla_boost/include/jla_boost/graph/morphism/VertexMap.hpp @@ -39,7 +39,6 @@ struct VertexMapConcept { bool storable = Storable::value; (void) storable; const M &cVertexMap = vertexMap; - VertexDom vDom; VertexCodom vCodom = get(cVertexMap, gDom, gCodom, vDom); (void) vCodom; auto mReinterpret = Traits::template reinterpret(std::move(vertexMap), gDom, gCodom, gDom, gCodom); @@ -54,6 +53,7 @@ struct VertexMapConcept { M vertexMap; GraphDom gDom; GraphCodom gCodom; + VertexDom vDom; }; // InvertibleVertexMapConcept @@ -69,7 +69,6 @@ struct InvertibleVertexMapConcept : VertexMapConcept { BOOST_CONCEPT_USAGE(InvertibleVertexMapConcept) { const M &cVertexMap = vertexMap; - VertexCodom vCodom; VertexDom vDom = get_inverse(cVertexMap, gDom, gCodom, vCodom); (void) vDom; } @@ -77,6 +76,7 @@ struct InvertibleVertexMapConcept : VertexMapConcept { M vertexMap; GraphDom gDom; GraphCodom gCodom; + VertexCodom vCodom; }; // WritableVertexMapConcept diff --git a/src/jla_boost/graph/morphism/VertexOrderByMult.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/VertexOrderByMult.hpp similarity index 100% rename from src/jla_boost/graph/morphism/VertexOrderByMult.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/VertexOrderByMult.hpp diff --git a/src/jla_boost/graph/morphism/callbacks/Filter.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Filter.hpp similarity index 100% rename from src/jla_boost/graph/morphism/callbacks/Filter.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Filter.hpp diff --git a/src/jla_boost/graph/morphism/callbacks/Limit.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Limit.hpp similarity index 100% rename from src/jla_boost/graph/morphism/callbacks/Limit.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Limit.hpp diff --git a/src/jla_boost/graph/morphism/callbacks/Print.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Print.hpp similarity index 100% rename from src/jla_boost/graph/morphism/callbacks/Print.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Print.hpp diff --git a/src/jla_boost/graph/morphism/callbacks/SliceProps.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/callbacks/SliceProps.hpp similarity index 100% rename from src/jla_boost/graph/morphism/callbacks/SliceProps.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/callbacks/SliceProps.hpp diff --git a/src/jla_boost/graph/morphism/callbacks/Store.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Store.hpp similarity index 100% rename from src/jla_boost/graph/morphism/callbacks/Store.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Store.hpp diff --git a/src/jla_boost/graph/morphism/callbacks/Transform.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Transform.hpp similarity index 100% rename from src/jla_boost/graph/morphism/callbacks/Transform.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Transform.hpp diff --git a/src/jla_boost/graph/morphism/callbacks/Unwrapper.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Unwrapper.hpp similarity index 100% rename from src/jla_boost/graph/morphism/callbacks/Unwrapper.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/callbacks/Unwrapper.hpp diff --git a/src/jla_boost/graph/morphism/finders/CommonSubgraph.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/finders/CommonSubgraph.hpp similarity index 100% rename from src/jla_boost/graph/morphism/finders/CommonSubgraph.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/finders/CommonSubgraph.hpp diff --git a/src/jla_boost/graph/morphism/finders/InjectiveEnumeration.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/finders/InjectiveEnumeration.hpp similarity index 100% rename from src/jla_boost/graph/morphism/finders/InjectiveEnumeration.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/finders/InjectiveEnumeration.hpp diff --git a/src/jla_boost/graph/morphism/finders/vf2.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/finders/vf2.hpp similarity index 100% rename from src/jla_boost/graph/morphism/finders/vf2.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/finders/vf2.hpp diff --git a/src/jla_boost/graph/morphism/models/Inverted.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/models/Inverted.hpp similarity index 100% rename from src/jla_boost/graph/morphism/models/Inverted.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/models/Inverted.hpp diff --git a/src/jla_boost/graph/morphism/models/InvertibleAdaptor.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/models/InvertibleAdaptor.hpp similarity index 100% rename from src/jla_boost/graph/morphism/models/InvertibleAdaptor.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/models/InvertibleAdaptor.hpp diff --git a/src/jla_boost/graph/morphism/models/PropertyMap.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/models/PropertyMap.hpp similarity index 100% rename from src/jla_boost/graph/morphism/models/PropertyMap.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/models/PropertyMap.hpp diff --git a/src/jla_boost/graph/morphism/models/PropertyVertexMap.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/models/PropertyVertexMap.hpp similarity index 100% rename from src/jla_boost/graph/morphism/models/PropertyVertexMap.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/models/PropertyVertexMap.hpp diff --git a/src/jla_boost/graph/morphism/models/Reinterpreted.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/models/Reinterpreted.hpp similarity index 100% rename from src/jla_boost/graph/morphism/models/Reinterpreted.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/models/Reinterpreted.hpp diff --git a/src/jla_boost/graph/morphism/models/Vector.hpp b/libs/jla_boost/include/jla_boost/graph/morphism/models/Vector.hpp similarity index 100% rename from src/jla_boost/graph/morphism/models/Vector.hpp rename to libs/jla_boost/include/jla_boost/graph/morphism/models/Vector.hpp diff --git a/src/jla_boost/graph/dpo/IO.cpp b/libs/jla_boost/src/graph/dpo/IO.cpp similarity index 100% rename from src/jla_boost/graph/dpo/IO.cpp rename to libs/jla_boost/src/graph/dpo/IO.cpp diff --git a/src/jla_boost/test/vf2.cpp b/libs/jla_boost/test/vf2.cpp similarity index 95% rename from src/jla_boost/test/vf2.cpp rename to libs/jla_boost/test/vf2.cpp index f2c6c3d..7a680ad 100644 --- a/src/jla_boost/test/vf2.cpp +++ b/libs/jla_boost/test/vf2.cpp @@ -14,17 +14,7 @@ #include -// TODO: use boost/test/minimap.hpp instead when not in a library -#define _DO_ASSERT(exp) \ - do { \ - bool res = exp; \ - if(!res) { \ - throw std::runtime_error(std::string(__func__) + " in " + std::string(__FILE__) + ":" + boost::lexical_cast(__LINE__)); \ - } \ - } while(false) - -#define BOOST_CHECK(exp) _DO_ASSERT(exp) -#define BOOST_REQUIRE(exp) _DO_ASSERT(exp) +#include #include #include @@ -464,11 +454,13 @@ void test_return_value() { } } -void vf2() { +} // namespace test +} // namespace jla_boost + +int test_main(int argc, char **argv) { + using namespace jla_boost::test; test_vf2(0, nullptr); test_empty_graph_cases(); test_return_value(); -} - -} // namespace test -} // namespace jla_boost + return 0; +} \ No newline at end of file diff --git a/libs/libmod/BuildConfig.hpp.in b/libs/libmod/BuildConfig.hpp.in new file mode 100644 index 0000000..a0e01ee --- /dev/null +++ b/libs/libmod/BuildConfig.hpp.in @@ -0,0 +1,15 @@ +#ifndef MOD_BUILDCONFIG_HPP +#define MOD_BUILDCONFIG_HPP + +#include + +#if defined(MOD_SOURCE) +# define MOD_DECL BOOST_SYMBOL_EXPORT +#else +# define MOD_DECL BOOST_SYMBOL_IMPORT +#endif + +#cmakedefine MOD_HAVE_OPENBABEL +#define MOD_VERSION "@PROJECT_VERSION@" + +#endif // MOD_BUILDCONFIG_HPP diff --git a/libs/libmod/CMakeLists.txt b/libs/libmod/CMakeLists.txt new file mode 100644 index 0000000..7785a09 --- /dev/null +++ b/libs/libmod/CMakeLists.txt @@ -0,0 +1,104 @@ +# BuildConfig.h +# ------------------------------------------------------------------------- +configure_file(BuildConfig.hpp.in include/mod/BuildConfig.hpp @ONLY) +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/mod + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT mod_dev) + + +# libmod +# ------------------------------------------------------------------------- +add_library(libmod SHARED + ${mod_libmod_INCLUDE_FILES} + ${mod_libmod_SRC_FILES}) +add_library(mod::libmod ALIAS libmod) +target_add_coverage(libmod) +target_include_directories(libmod + PUBLIC + $ + $ + $ + ${Boost_INCLUDE_DIR}) +if(ENABLE_DEP_SYMBOL_HIDING) + target_link_libraries(libmod PRIVATE + $<$:-Wl,--exclude-libs,ALL> + $<$:-Wl,--exclude-libs,ALL> + $<$:-Wl,--exclude-libs,ALL>) +endif() +target_link_libraries(libmod + PUBLIC + JLA::boost + PRIVATE + GML::gml Threads::Threads + Boost::iostreams Boost::system + GraphCanon::graph_canon + $<$:OpenBabel::OpenBabel> + ) +target_compile_options(libmod PRIVATE -Wall -Wextra + -Wno-unused-parameter + -Wno-comment + -Wno-sign-compare + -Wno-unused-local-typedefs + -Wno-unused-const-variable # gives false positive in the ILP wrapper + ) +target_compile_options(libmod PUBLIC + $<$:-Wno-mismatched-tagsL> + $<$:-Wno-mismatched-tags>) +set_target_properties(libmod PROPERTIES OUTPUT_NAME "mod") +if(ENABLE_SYMBOL_HIDING) + set_target_properties(libmod PROPERTIES + CXX_VISIBILITY_PRESET hidden + # The inlines in Open Babel needs to be visible for the plugins to work. + # GCC does fine, but not Clang, hence the generator expression. + $<$VISIBILITY_INLINES_HIDDEN ON> + ) +endif() +target_compile_definitions(libmod PRIVATE MOD_SOURCE) +if(ENABLE_IPO) + check_ipo_supported(RESULT result OUTPUT output) + if(result) + set_property(TARGET libmod PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + else() + message(FATAL_ERROR "Interprocedural optimization was requested ('ENABLE_IPO=on'), but it is not supported: ${output}") + endif() +endif() + +install(TARGETS libmod + EXPORT PROJECT_exports + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT mod_lib + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT mod_lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT mod_lib) +install(DIRECTORY src/mod + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT mod_dev + FILES_MATCHING PATTERN "*.hpp") + + +# CMake Package Support +# ------------------------------------------------------------------------- +include(CMakePackageConfigHelpers) +set(exportDir ${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/${PROJECT_NAME}) +configure_file(modConfig.cmake ${exportDir}/modConfig.cmake @ONLY) +foreach(f ${libmod_config_find_files}) + configure_file(${PROJECT_SOURCE_DIR}/cmake/${f} ${exportDir}/${f} COPYONLY) +endforeach() +write_basic_package_version_file( + ${exportDir}/${PROJECT_NAME}Config-version.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion) +install(EXPORT PROJECT_exports + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + FILE ${PROJECT_NAME}Targets.cmake) +install(DIRECTORY ${exportDir} + DESTINATION lib/cmake + COMPONENT mod_dev) + + +# pkg-config file +# ------------------------------------------------------------------------- +set(exportDir ${CMAKE_CURRENT_BINARY_DIR}/lib/pkgconfig) +configure_file(lib/pkgconfig/mod.pc.in ${exportDir}/mod.pc @ONLY) +install(FILES ${exportDir}/mod.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig + COMPONENT mod_dev) diff --git a/libs/libmod/lib/pkgconfig/mod.pc.in b/libs/libmod/lib/pkgconfig/mod.pc.in new file mode 100644 index 0000000..790bb7b --- /dev/null +++ b/libs/libmod/lib/pkgconfig/mod.pc.in @@ -0,0 +1,13 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +bindir=@CMAKE_INSTALL_FULL_BINDIR@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +datarootdir=@CMAKE_INSTALL_FULL_DATAROOTDIR@ +datadir=@CMAKE_INSTALL_FULL_DATADIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: MedØlDatschgerl +Description: MØD +Version: @PROJECT_VERSION@ +Requires: +Libs: -L${libdir} -Wl,-rpath -Wl,${libdir} -lmod @PKG_LIBS@ +Cflags: -I${includedir} @PKG_INCLUDES@ \ No newline at end of file diff --git a/libs/libmod/modConfig.cmake b/libs/libmod/modConfig.cmake new file mode 100644 index 0000000..983e9d3 --- /dev/null +++ b/libs/libmod/modConfig.cmake @@ -0,0 +1,7 @@ +get_filename_component(mod_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +include(CMakeFindDependencyMacro) +list(APPEND CMAKE_MODULE_PATH ${mod_CMAKE_DIR}) + +@libmod_config_dependencies@ + +include("${mod_CMAKE_DIR}/modTargets.cmake") \ No newline at end of file diff --git a/src/mod/Chem.cpp b/libs/libmod/src/mod/Chem.cpp similarity index 94% rename from src/mod/Chem.cpp rename to libs/libmod/src/mod/Chem.cpp index 9a3e06d..df6eaea 100644 --- a/src/mod/Chem.cpp +++ b/libs/libmod/src/mod/Chem.cpp @@ -1,7 +1,7 @@ -#include "Chem.h" +#include "Chem.hpp" -#include -#include +#include +#include #include diff --git a/src/mod/Chem.h b/libs/libmod/src/mod/Chem.hpp similarity index 61% rename from src/mod/Chem.h rename to libs/libmod/src/mod/Chem.hpp index bdac79b..8e723d3 100644 --- a/src/mod/Chem.h +++ b/libs/libmod/src/mod/Chem.hpp @@ -1,6 +1,8 @@ #ifndef MOD_CHEM_H #define MOD_CHEM_H +#include + #include #include @@ -15,7 +17,7 @@ namespace mod { // rst: Representation of the chemical element of an atom. // rst-class-start: -struct AtomId { +struct MOD_DECL AtomId { // rst: .. function:: constexpr AtomId() // rst: // rst: Construct an :cpp:var:`AtomIds::Invalid` atom id. @@ -36,7 +38,7 @@ struct AtomId { // rst: .. function:: friend std::ostream &operator<<(std::ostream &s, AtomId atomId) // rst: // rst: Inserts the `int` value of the atom id into the stream. - friend std::ostream &operator<<(std::ostream &s, AtomId atomId); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, AtomId atomId); private: unsigned char id; }; @@ -48,7 +50,7 @@ struct AtomId { // rst: // rst-class-start: -struct Isotope { +struct MOD_DECL Isotope { // rst: .. function:: constexpr Isotope() // rst: // rst: Construct a representation of the most abundant isotope. @@ -67,7 +69,7 @@ struct Isotope { // rst: .. function:: friend std::ostream &operator<<(std::ostream &s, Isotope iso) // rst: // rst: Inserts the integer value of the isotope into the stream. - friend std::ostream &operator<<(std::ostream &s, Isotope iso); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, Isotope iso); private: int i; }; @@ -78,7 +80,7 @@ struct Isotope { // rst: Representation of the charge of an atom. // rst-class-start: -struct Charge { +struct MOD_DECL Charge { // rst: .. function:: constexpr Charge() // rst: // rst: Construct a neutral charge. @@ -94,7 +96,7 @@ struct Charge { // rst: .. function:: friend std::ostream &operator<<(std::ostream &s, Charge charge) // rst: // rst: Inserts the `int` value of the charge into the stream. - friend std::ostream &operator<<(std::ostream &s, Charge charge); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, Charge charge); private: signed char c; }; @@ -105,7 +107,7 @@ struct Charge { // rst: Representation of basic data of an atom. // rst-class-start: -struct AtomData { +struct MOD_DECL AtomData { // rst: .. function:: constexpr AtomData() // rst: // rst: Construct atom data with default values: @@ -149,7 +151,7 @@ struct AtomData { // rst: Format the atom data adhering to the string encoding of atoms (see :ref:`mol-enc`). // rst: // rst: :throws: :class:`LogicError` if the atom id is :cpp:var:`AtomIds::Invalid`. - friend std::ostream &operator<<(std::ostream &s, const AtomData &data); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const AtomData &data); private: AtomId atomId; Isotope isotope; @@ -172,14 +174,14 @@ enum class BondType { // rst: .. enumerator:: Aromatic // rst: .. enumerator:: Double // rst: .. enumerator:: Triple - Invalid, Single, Aromatic, Double, Triple + Invalid, Single, Aromatic, Double, Triple }; // rst: .. function:: std::ostream &operator<<(std::ostream &s, BondType bt) // rst: // rst: Format the bond type adhering to the string encoding of bonds (see :ref:`mol-enc`). // rst: // rst: :throws: :class:`LogicError` if the bond type is :cpp:any:`BondType::Invalid`. -std::ostream &operator<<(std::ostream &s, BondType bt); +MOD_DECL std::ostream &operator<<(std::ostream &s, BondType bt); //------------------------------------------------------------------------------ // AtomIds @@ -187,124 +189,124 @@ std::ostream &operator<<(std::ostream &s, BondType bt); // BOOST_PP_SEQ(BOOST_PP_TUPLE(atomId, symbol, name)) #define MOD_CHEM_ATOM_DATA() \ - ((1, H, Hydrogen)) \ - ((2, He, Helium)) \ - ((3, Li, Lithium)) \ - ((4, Be, Beryllium)) \ - ((5, B, Boron)) \ - ((6, C, Carbon)) \ - ((7, N, Nitrogen)) \ - ((8, O, Oxygen)) \ - ((9, F, Fluorine)) \ - ((10, Ne, Neon)) \ - ((11, Na, Sodium)) \ - ((12, Mg, Magnesium)) \ - ((13, Al, Aluminium)) \ - ((14, Si, Silicon)) \ - ((15, P, Phosphorus)) \ - ((16, S, Sulfur)) \ - ((17, Cl, Chlorine)) \ - ((18, Ar, Argon)) \ - ((19, K, Potassium)) \ - ((20, Ca, Calcium)) \ - ((21, Sc, Scandium)) \ - ((22, Ti, Titanium)) \ - ((23, V, Vanadium)) \ - ((24, Cr, Chromium)) \ - ((25, Mn, Manganese)) \ - ((26, Fe, Iron)) \ - ((27, Co, Cobalt)) \ - ((28, Ni, Nickel)) \ - ((29, Cu, Copper)) \ - ((30, Zn, Zinc)) \ - ((31, Ga, Gallium)) \ - ((32, Ge, Germanium)) \ - ((33, As, Arsenic)) \ - ((34, Se, Selenium)) \ - ((35, Br, Bromine)) \ - ((36, Kr, Krypton)) \ - ((37, Rb, Rubidium)) \ - ((38, Sr, Strontium)) \ - ((39, Y, Yttrium)) \ - ((40, Zr, Zirconium)) \ - ((41, Nb, Niobium)) \ - ((42, Mo, Molybdenum)) \ - ((43, Tc, Technetium)) \ - ((44, Ru, Ruthenium)) \ - ((45, Rh, Rhodium)) \ - ((46, Pd, Palladium)) \ - ((47, Ag, Silver)) \ - ((48, Cd, Cadmium)) \ - ((49, In, Indium)) \ - ((50, Sn, Tin)) \ - ((51, Sb, Antimony)) \ - ((52, Te, Tellurium)) \ - ((53, I, Iodine)) \ - ((54, Xe, Xenon)) \ - ((55, Cs, Caesium)) \ - ((56, Ba, Barium)) \ - ((57, La, Lanthanum)) \ - ((58, Ce, Cerium)) \ - ((59, Pr, Praseodymium)) \ - ((60, Nd, Neodymium)) \ - ((61, Pm, Promethium)) \ - ((62, Sm, Samarium)) \ - ((63, Eu, Europium)) \ - ((64, Gd, Gadolinium)) \ - ((65, Tb, Terbium)) \ - ((66, Dy, Dysprosium)) \ - ((67, Ho, Holmium)) \ - ((68, Er, Erbium)) \ - ((69, Tm, Thulium)) \ - ((70, Yb, Ytterbium)) \ - ((71, Lu, Lutetium)) \ - ((72, Hf, Hafnium)) \ - ((73, Ta, Tantalum)) \ - ((74, W, Tungsten)) \ - ((75, Re, Rhenium)) \ - ((76, Os, Osmium)) \ - ((77, Ir, Iridium)) \ - ((78, Pt, Platinum)) \ - ((79, Au, Gold)) \ - ((80, Hg, Mercury)) \ - ((81, Tl, Thallium)) \ - ((82, Pb, Lead)) \ - ((83, Bi, Bismuth)) \ - ((84, Po, Polonium)) \ - ((85, At, Astatine)) \ - ((86, Rn, Radon)) \ - ((87, Fr, Francium)) \ - ((88, Ra, Radium)) \ - ((89, Ac, Actinium)) \ - ((90, Th, Thorium)) \ - ((91, Pa, Protactinium)) \ - ((92, U, Uranium)) \ - ((93, Np, Neptunium)) \ - ((94, Pu, Plutonium)) \ - ((95, Am, Americium)) \ - ((96, Cm, Curium)) \ - ((97, Bk, Berkelium)) \ - ((98, Cf, Californium)) \ - ((99, Es, Einsteinium)) \ - ((100, Fm, Fermium)) \ - ((101, Md, Mendelevium)) \ - ((102, No, Nobelium)) \ - ((103, Lr, Lawrencium)) \ - ((104, Rf, Rutherfordium)) \ - ((105, Db, Dubnium)) \ - ((106, Sg, Seaborgium)) \ - ((107, Bh, Bohrium)) \ - ((108, Hs, Hassium)) \ - ((109, Mt, Meitnerium)) \ - ((110, Ds, Darmstadtium)) \ - ((111, Rg, Roentgenium)) \ - ((112, Cn, Copernicium)) \ - ((113, Uut, Ununtrium)) \ - ((114, Fl, Flerovium)) \ - ((115, Uup, Ununpentium)) \ - ((116, Lv, Livermorium)) \ - ((117, Uus, Ununseptium)) \ - ((118, Uuo, Ununoctium)) + ((1, H, Hydrogen)) \ + ((2, He, Helium)) \ + ((3, Li, Lithium)) \ + ((4, Be, Beryllium)) \ + ((5, B, Boron)) \ + ((6, C, Carbon)) \ + ((7, N, Nitrogen)) \ + ((8, O, Oxygen)) \ + ((9, F, Fluorine)) \ + ((10, Ne, Neon)) \ + ((11, Na, Sodium)) \ + ((12, Mg, Magnesium)) \ + ((13, Al, Aluminium)) \ + ((14, Si, Silicon)) \ + ((15, P, Phosphorus)) \ + ((16, S, Sulfur)) \ + ((17, Cl, Chlorine)) \ + ((18, Ar, Argon)) \ + ((19, K, Potassium)) \ + ((20, Ca, Calcium)) \ + ((21, Sc, Scandium)) \ + ((22, Ti, Titanium)) \ + ((23, V, Vanadium)) \ + ((24, Cr, Chromium)) \ + ((25, Mn, Manganese)) \ + ((26, Fe, Iron)) \ + ((27, Co, Cobalt)) \ + ((28, Ni, Nickel)) \ + ((29, Cu, Copper)) \ + ((30, Zn, Zinc)) \ + ((31, Ga, Gallium)) \ + ((32, Ge, Germanium)) \ + ((33, As, Arsenic)) \ + ((34, Se, Selenium)) \ + ((35, Br, Bromine)) \ + ((36, Kr, Krypton)) \ + ((37, Rb, Rubidium)) \ + ((38, Sr, Strontium)) \ + ((39, Y, Yttrium)) \ + ((40, Zr, Zirconium)) \ + ((41, Nb, Niobium)) \ + ((42, Mo, Molybdenum)) \ + ((43, Tc, Technetium)) \ + ((44, Ru, Ruthenium)) \ + ((45, Rh, Rhodium)) \ + ((46, Pd, Palladium)) \ + ((47, Ag, Silver)) \ + ((48, Cd, Cadmium)) \ + ((49, In, Indium)) \ + ((50, Sn, Tin)) \ + ((51, Sb, Antimony)) \ + ((52, Te, Tellurium)) \ + ((53, I, Iodine)) \ + ((54, Xe, Xenon)) \ + ((55, Cs, Caesium)) \ + ((56, Ba, Barium)) \ + ((57, La, Lanthanum)) \ + ((58, Ce, Cerium)) \ + ((59, Pr, Praseodymium)) \ + ((60, Nd, Neodymium)) \ + ((61, Pm, Promethium)) \ + ((62, Sm, Samarium)) \ + ((63, Eu, Europium)) \ + ((64, Gd, Gadolinium)) \ + ((65, Tb, Terbium)) \ + ((66, Dy, Dysprosium)) \ + ((67, Ho, Holmium)) \ + ((68, Er, Erbium)) \ + ((69, Tm, Thulium)) \ + ((70, Yb, Ytterbium)) \ + ((71, Lu, Lutetium)) \ + ((72, Hf, Hafnium)) \ + ((73, Ta, Tantalum)) \ + ((74, W, Tungsten)) \ + ((75, Re, Rhenium)) \ + ((76, Os, Osmium)) \ + ((77, Ir, Iridium)) \ + ((78, Pt, Platinum)) \ + ((79, Au, Gold)) \ + ((80, Hg, Mercury)) \ + ((81, Tl, Thallium)) \ + ((82, Pb, Lead)) \ + ((83, Bi, Bismuth)) \ + ((84, Po, Polonium)) \ + ((85, At, Astatine)) \ + ((86, Rn, Radon)) \ + ((87, Fr, Francium)) \ + ((88, Ra, Radium)) \ + ((89, Ac, Actinium)) \ + ((90, Th, Thorium)) \ + ((91, Pa, Protactinium)) \ + ((92, U, Uranium)) \ + ((93, Np, Neptunium)) \ + ((94, Pu, Plutonium)) \ + ((95, Am, Americium)) \ + ((96, Cm, Curium)) \ + ((97, Bk, Berkelium)) \ + ((98, Cf, Californium)) \ + ((99, Es, Einsteinium)) \ + ((100, Fm, Fermium)) \ + ((101, Md, Mendelevium)) \ + ((102, No, Nobelium)) \ + ((103, Lr, Lawrencium)) \ + ((104, Rf, Rutherfordium)) \ + ((105, Db, Dubnium)) \ + ((106, Sg, Seaborgium)) \ + ((107, Bh, Bohrium)) \ + ((108, Hs, Hassium)) \ + ((109, Mt, Meitnerium)) \ + ((110, Ds, Darmstadtium)) \ + ((111, Rg, Roentgenium)) \ + ((112, Cn, Copernicium)) \ + ((113, Uut, Ununtrium)) \ + ((114, Fl, Flerovium)) \ + ((115, Uup, Ununpentium)) \ + ((116, Lv, Livermorium)) \ + ((117, Uus, Ununseptium)) \ + ((118, Uuo, Ununoctium)) #define MOD_CHEM_ATOM_DATA_ELEM_SIZE() 3 // rst: @@ -330,9 +332,9 @@ std::ostream &operator<<(std::ostream &s, BondType bt); // AtomId //------------------------------------------------------------------------------ -inline constexpr AtomId::AtomId() : id(0) { } +inline constexpr AtomId::AtomId() : id(0) {} -inline constexpr AtomId::AtomId(unsigned char id) : id(id) { } +inline constexpr AtomId::AtomId(unsigned char id) : id(id) {} inline constexpr AtomId::operator unsigned char() const { return id; @@ -344,11 +346,11 @@ inline constexpr AtomId::operator unsigned char() const { namespace AtomIds { constexpr AtomId Invalid; #define MDO_CHEM_atomIdIter(r, data, t) \ - constexpr AtomId BOOST_PP_TUPLE_ELEM(3, 2, t)(BOOST_PP_TUPLE_ELEM(MOD_CHEM_ATOM_DATA_ELEM_SIZE(), 0, t)); + constexpr AtomId BOOST_PP_TUPLE_ELEM(3, 2, t)(BOOST_PP_TUPLE_ELEM(MOD_CHEM_ATOM_DATA_ELEM_SIZE(), 0, t)); BOOST_PP_SEQ_FOR_EACH(MDO_CHEM_atomIdIter, ~, MOD_CHEM_ATOM_DATA()) #undef MDO_CHEM_atomIdIter #define MDO_CHEM_atomIdIter(r, data, t) \ - constexpr AtomId BOOST_PP_TUPLE_ELEM(3, 1, t)(BOOST_PP_TUPLE_ELEM(MOD_CHEM_ATOM_DATA_ELEM_SIZE(), 0, t)); + constexpr AtomId BOOST_PP_TUPLE_ELEM(3, 1, t)(BOOST_PP_TUPLE_ELEM(MOD_CHEM_ATOM_DATA_ELEM_SIZE(), 0, t)); BOOST_PP_SEQ_FOR_EACH(MDO_CHEM_atomIdIter, ~, MOD_CHEM_ATOM_DATA()) #undef MDO_CHEM_atomIdIter constexpr AtomId Max(BOOST_PP_SEQ_SIZE(MOD_CHEM_ATOM_DATA())); @@ -358,9 +360,9 @@ static_assert(Max == 118, "Atom ids should be contiguous."); // Charge //------------------------------------------------------------------------------ -inline constexpr Charge::Charge() : c(0) { } +inline constexpr Charge::Charge() : c(0) {} -inline constexpr Charge::Charge(signed char c) : c(c) { } +inline constexpr Charge::Charge(signed char c) : c(c) {} inline constexpr Charge::operator signed char() const { return c; @@ -369,9 +371,9 @@ inline constexpr Charge::operator signed char() const { // Isotope //------------------------------------------------------------------------------ -inline constexpr Isotope::Isotope() : i(-1) { } +inline constexpr Isotope::Isotope() : i(-1) {} -inline constexpr Isotope::Isotope(int i) : i(i) { } +inline constexpr Isotope::Isotope(int i) : i(i) {} inline constexpr Isotope::operator int() const { return i; @@ -380,13 +382,13 @@ inline constexpr Isotope::operator int() const { // AtomData //------------------------------------------------------------------------------ -inline constexpr AtomData::AtomData(AtomId atomId) : atomId(atomId) { } +inline constexpr AtomData::AtomData(AtomId atomId) : atomId(atomId) {} inline constexpr AtomData::AtomData(AtomId atomId, Charge charge, bool radical) -: atomId(atomId), charge(charge), radical(radical) { } + : atomId(atomId), charge(charge), radical(radical) {} inline constexpr AtomData::AtomData(AtomId atomId, Isotope isotope, Charge charge, bool radical) -: atomId(atomId), isotope(isotope), charge(charge), radical(radical) { } + : atomId(atomId), isotope(isotope), charge(charge), radical(radical) {} inline constexpr AtomId AtomData::getAtomId() const { return atomId; @@ -406,10 +408,9 @@ inline constexpr bool AtomData::getRadical() const { inline constexpr bool operator==(const AtomData &a1, const AtomData &a2) { return a1.getAtomId() == a2.getAtomId() - && a1.getIsotope() == a2.getIsotope() - && a1.getCharge() == a2.getCharge() - && a1.getRadical() == a2.getRadical() - ; + && a1.getIsotope() == a2.getIsotope() + && a1.getCharge() == a2.getCharge() + && a1.getRadical() == a2.getRadical(); } } // namespace mod diff --git a/src/mod/Config.cpp b/libs/libmod/src/mod/Config.cpp similarity index 97% rename from src/mod/Config.cpp rename to libs/libmod/src/mod/Config.cpp index 2bfa133..177b285 100644 --- a/src/mod/Config.cpp +++ b/libs/libmod/src/mod/Config.cpp @@ -1,4 +1,4 @@ -#include "Config.h" +#include "Config.hpp" #include diff --git a/src/mod/Config.h b/libs/libmod/src/mod/Config.hpp similarity index 82% rename from src/mod/Config.h rename to libs/libmod/src/mod/Config.hpp index 0cbced1..97c3a53 100644 --- a/src/mod/Config.h +++ b/libs/libmod/src/mod/Config.hpp @@ -10,6 +10,8 @@ // rst: output when printing figures. // rst: +#include + #include #include #include @@ -34,14 +36,14 @@ enum struct LabelType { // rst: Vertices and edges are considered to be labelled with // rst: character strings. If only first-order terms are present, // rst: then strings are generated as a serialisation of the term. - String, + String, // rst: .. enumerator:: Term // rst: // rst: Vertices and edges are considered to be labelled with // rst: first-order terms. If only strings are present, then first-order // rst: terms are generated by parsing the strings. This may result // rst: in an :cpp:class:`TermParsingError` if a string can not be parsed. - Term + Term }; std::ostream &operator<<(std::ostream &s, const LabelType <); @@ -57,19 +59,19 @@ enum class LabelRelation { // rst: Strings are considered isomorphic when they are equal. // rst: Terms are considered isomorphic when their most general unifier // rst: is a renaming. - Isomorphism, + Isomorphism, // rst: .. enumerator:: Specialisation // rst: // rst: A term :math:`t_2` is more special than, or isomorphic to, a term :math:`t_1` if there is a substitution // rst: which can be applied to :math:`t_1` to make the terms equal. // rst: This relation means that the right-hand side of a comparison is the more specialised term. - Specialisation, + Specialisation, // rst: .. enumerator:: Unification // rst: // rst: Strings unify if they are equal, i.e., the same as with :cpp:any:`Isomorphism`. // rst: Terms unify if a most general unifier (MGU) exists. The found MGU // rst: is used for substitution in some algorithms. - Unification + Unification }; // rst: .. class:: LabelSettings @@ -82,18 +84,21 @@ struct LabelSettings { // rst: // rst: Construct label settings that only uses the vertex and edge labels. - LabelSettings(LabelType type, LabelRelation relation) : LabelSettings(type, relation, false, LabelRelation::Isomorphism) { } + LabelSettings(LabelType type, LabelRelation relation) : LabelSettings(type, relation, false, + LabelRelation::Isomorphism) {} // rst: .. function:: LabelSettings(LabelType type, LabelRelation relation, LabelRelation stereoRelation) // rst: // rst: Construct label settings that include both vertex and edge labels, and stereo information. - LabelSettings(LabelType type, LabelRelation relation, LabelRelation stereoRelation) : LabelSettings(type, relation, true, stereoRelation) { } + LabelSettings(LabelType type, LabelRelation relation, LabelRelation stereoRelation) : LabelSettings(type, relation, + true, + stereoRelation) {} // rst: .. function:: LabelSettings(LabelType type, LabelRelation relation, bool withStereo, LabelRelation stereoRelation) LabelSettings(LabelType type, LabelRelation relation, bool withStereo, LabelRelation stereoRelation) - : type(type), relation(relation), withStereo(withStereo), stereoRelation(stereoRelation) { } + : type(type), relation(relation), withStereo(withStereo), stereoRelation(stereoRelation) {} friend std::ostream &operator<<(std::ostream &s, const LabelSettings &ls); public: @@ -111,7 +116,7 @@ struct LabelSettings { // rst: // rst: :returns: the singleton :cpp:class:`Config` instance used by the library. // rst: -Config &getConfig(); +MOD_DECL Config &getConfig(); // rst-class: template ConfigSetting // rst: @@ -121,7 +126,7 @@ Config &getConfig(); template struct ConfigSetting { - ConfigSetting(T value, const std::string &name) : value(value), name(name) { } + ConfigSetting(T value, const std::string &name) : value(value), name(name) {} // rst: .. function:: void set(T value) // rst: @@ -153,6 +158,7 @@ struct ConfigSetting { const std::string &getName() const { return name; } + private: T value; const std::string name; @@ -172,10 +178,8 @@ struct Config { }; Config() = default; - Config(const Config&) = delete; - Config &operator=(const Config&) = delete; - Config(Config&&) = delete; - Config &operator=(Config&&) = delete; + Config(Config &&) = delete; + Config &operator=(Config &&) = delete; // BOOST_PP_SEQ( // BOOST_PP_TUPLE(NamespaceClass, NamespaceName, @@ -262,32 +266,32 @@ struct Config { )) #define MOD_CONFIG_nsIter(rNS, dataNS, tNS) \ - struct BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS) { \ - using Self = BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS); \ - BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS)(const Self&) = delete; \ - Self &operator=(const Self&) = delete; \ - BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS)(Self&&) = delete; \ - Self &operator=(Self&&) = delete; \ - inline BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS)() : \ - BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(MOD_CONFIG_settingIterCons, \ - BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS), \ - BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 2, tNS)) \ - ) {} \ - BOOST_PP_SEQ_FOR_EACH_I(MOD_CONFIG_settingIter, \ - BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS), \ - BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 2, tNS)) \ - } BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 1, tNS); + struct BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS) { \ + using Self = BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS); \ + BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS)(const Self&) = delete; \ + Self &operator=(const Self&) = delete; \ + BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS)(Self&&) = delete; \ + Self &operator=(Self&&) = delete; \ + inline BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS)() : \ + BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(MOD_CONFIG_settingIterCons, \ + BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS), \ + BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 2, tNS)) \ + ) {} \ + BOOST_PP_SEQ_FOR_EACH_I(MOD_CONFIG_settingIter, \ + BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 0, tNS), \ + BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 2, tNS)) \ + } BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_NS_SIZE(), 1, tNS); #define MOD_CONFIG_settingIterCons(rSettting, dataSetting, tSetting) \ - BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_SETTING_SIZE(), 1, tSetting)( \ - BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_SETTING_SIZE(), 2, tSetting), \ - MOD_toString(dataSetting) "::" \ - MOD_toString(BOOST_PP_EXPAND(BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_SETTING_SIZE(), 1, tSetting))) \ - ) + BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_SETTING_SIZE(), 1, tSetting)( \ + BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_SETTING_SIZE(), 2, tSetting), \ + MOD_toString(dataSetting) "::" \ + MOD_toString(BOOST_PP_EXPAND(BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_SETTING_SIZE(), 1, tSetting))) \ + ) #define MOD_CONFIG_settingIter(rSettting, dataSetting, nSetting, tSetting) \ - ConfigSetting \ - BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_SETTING_SIZE(), 1, tSetting); + ConfigSetting \ + BOOST_PP_TUPLE_ELEM(MOD_CONFIG_DATA_SETTING_SIZE(), 1, tSetting); #define MOD_toString(s) MOD_toString1(s) #define MOD_toString1(s) #s diff --git a/src/mod/Derivation.cpp b/libs/libmod/src/mod/Derivation.cpp similarity index 79% rename from src/mod/Derivation.cpp rename to libs/libmod/src/mod/Derivation.cpp index b395159..be9344d 100644 --- a/src/mod/Derivation.cpp +++ b/libs/libmod/src/mod/Derivation.cpp @@ -1,7 +1,7 @@ -#include "Derivation.h" +#include "Derivation.hpp" -#include -#include +#include +#include #include diff --git a/src/mod/Derivation.h b/libs/libmod/src/mod/Derivation.hpp similarity index 81% rename from src/mod/Derivation.h rename to libs/libmod/src/mod/Derivation.hpp index e152b97..bc53f9a 100644 --- a/src/mod/Derivation.h +++ b/libs/libmod/src/mod/Derivation.hpp @@ -1,8 +1,9 @@ #ifndef MOD_DERIVATION_H #define MOD_DERIVATION_H -#include -#include +#include +#include +#include #include #include @@ -15,13 +16,13 @@ namespace mod { // rst: // rst-class-start: -struct Derivation { +struct MOD_DECL Derivation { // rst: .. type:: std::vector > GraphList // rst: // rst: Representation of a multiset of graphs. using GraphList = std::vector >; public: - friend std::ostream &operator<<(std::ostream &s, const Derivation &d); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Derivation &d); public: // rst: .. member:: GraphList left // rst: @@ -40,4 +41,4 @@ struct Derivation { } // namespace mod -#endif /* MOD_DERIVATION_H */ \ No newline at end of file +#endif /* MOD_DERIVATION_H */ diff --git a/src/mod/Error.cpp b/libs/libmod/src/mod/Error.cpp similarity index 99% rename from src/mod/Error.cpp rename to libs/libmod/src/mod/Error.cpp index 2ffc519..907052a 100644 --- a/src/mod/Error.cpp +++ b/libs/libmod/src/mod/Error.cpp @@ -1,4 +1,4 @@ -#include "Error.h" +#include "Error.hpp" #include diff --git a/src/mod/Error.h b/libs/libmod/src/mod/Error.hpp similarity index 93% rename from src/mod/Error.h rename to libs/libmod/src/mod/Error.hpp index 0356558..d987a65 100644 --- a/src/mod/Error.h +++ b/libs/libmod/src/mod/Error.hpp @@ -1,6 +1,8 @@ #ifndef MOD_ERROR_H #define MOD_ERROR_H +#include + #include #include #include @@ -20,7 +22,7 @@ namespace mod { // rst: Stacktraces may not be supported on all platforms. // rst-class-start: -struct Stacktrace { +struct MOD_DECL Stacktrace { // rst: .. function:: Stacktrace(unsigned int frameLimit, unsigned int numSkip) // rst: // rst: Capture a stacktrace with at most ``frameLimit`` frames and without the first ``numSkip`` frames. @@ -43,9 +45,8 @@ struct Stacktrace { // rst: The base class of all MØD exceptions. // rst-class-start: -struct Exception : public std::exception { +struct MOD_DECL Exception : public std::exception { protected: - Exception(std::string &&text, unsigned int numSkip, unsigned int frameLimit) : text(text), stacktrace(frameLimit, numSkip) { } Exception(std::string &&text, unsigned int numSkip) : Exception(std::move(text), numSkip, 20) { } @@ -82,8 +83,7 @@ struct Exception : public std::exception { // rst: // rst-class-start: -struct FatalError : public Exception { - +struct MOD_DECL FatalError : public Exception { FatalError(std::string &&text, unsigned int numSkip) : Exception(std::move(text), numSkip) { } FatalError(std::string &&text) : Exception(std::move(text)) { } @@ -102,8 +102,7 @@ struct FatalError : public Exception { // rst: // rst-class-start: -struct InputError : public Exception { - +struct MOD_DECL InputError : public Exception { InputError(std::string &&text) : Exception(std::move(text)) { } std::string getName() const { @@ -119,8 +118,7 @@ struct InputError : public Exception { // rst: // rst-class-start: -struct LogicError : public Exception { - +struct MOD_DECL LogicError : public Exception { LogicError(std::string &&text) : Exception(std::move(text)) { } std::string getName() const { @@ -137,8 +135,7 @@ struct LogicError : public Exception { // rst: // rst-class-start: -struct TermParsingError : public Exception { - +struct MOD_DECL TermParsingError : public Exception { TermParsingError(std::string &&text) : Exception(std::move(text)) { } std::string getName() const { @@ -155,8 +152,7 @@ struct TermParsingError : public Exception { // rst: // rst-class-start: -struct StereoDeductionError : public Exception { - +struct MOD_DECL StereoDeductionError : public Exception { StereoDeductionError(std::string &&text) : Exception(std::move(text)) { } std::string getName() const { @@ -165,6 +161,7 @@ struct StereoDeductionError : public Exception { }; // rst-class-end: +MOD_DECL void fatal(std::string function, std::string file, std::size_t line) __attribute__((__noreturn__)); // TODO: change to C++11 syntax at some point #define MOD_ABORT mod::fatal(__func__, __FILE__, __LINE__) diff --git a/src/mod/Function.cpp b/libs/libmod/src/mod/Function.cpp similarity index 90% rename from src/mod/Function.cpp rename to libs/libmod/src/mod/Function.cpp index c9784b6..e1b9be2 100644 --- a/src/mod/Function.cpp +++ b/libs/libmod/src/mod/Function.cpp @@ -1,4 +1,4 @@ -#include "Function.h" +#include "Function.hpp" namespace mod { namespace detail_function { diff --git a/src/mod/Function.h b/libs/libmod/src/mod/Function.hpp similarity index 100% rename from src/mod/Function.h rename to libs/libmod/src/mod/Function.hpp diff --git a/libs/libmod/src/mod/Misc.cpp b/libs/libmod/src/mod/Misc.cpp new file mode 100644 index 0000000..d92ea11 --- /dev/null +++ b/libs/libmod/src/mod/Misc.cpp @@ -0,0 +1,45 @@ +#include "Misc.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace mod { + +std::string version() { + return MOD_VERSION; +} + +void rngReseed(unsigned int seed) { + lib::Random::getInstance().reseed(seed); +} + +void post(const std::string &text) { + lib::IO::post() << text << std::endl; +} + +void postChapter(const std::string &chapterTitle) { + lib::IO::post() << "summaryChapter \"" << chapterTitle << "\"" << std::endl; +} + +void postSection(const std::string §ionTitle) { + lib::IO::post() << "summarySection \"" << sectionTitle << "\"" << std::endl; +} + +void printGeometryGraph() { + lib::IO::Stereo::Write::summary(lib::Stereo::getGeometryGraph()); +} + +} // namespace mod diff --git a/libs/libmod/src/mod/Misc.hpp b/libs/libmod/src/mod/Misc.hpp new file mode 100644 index 0000000..3891564 --- /dev/null +++ b/libs/libmod/src/mod/Misc.hpp @@ -0,0 +1,32 @@ +#ifndef MOD_MISC_H +#define MOD_MISC_H + +#include +#include +#include + +#include +#include + +namespace mod { + +// rst: .. function:: std::string version() +// rst: +// rst: :returns: the version of MØD. +MOD_DECL std::string version(); + +// rst: .. function:: void rngReseed(unsigned int seed) +// rst: +// rst: Reseed the random bit generator used in the library. +MOD_DECL void rngReseed(unsigned int seed); + +MOD_DECL void post(const std::string &text); +MOD_DECL void postChapter(const std::string &chapterTitle); +MOD_DECL void postSection(const std::string §ionTitle); + +MOD_DECL void printGeometryGraph(); + + +} // namespace mod + +#endif /* MOD_MISC_H */ diff --git a/src/mod/Term.cpp b/libs/libmod/src/mod/Term.cpp similarity index 92% rename from src/mod/Term.cpp rename to libs/libmod/src/mod/Term.cpp index 3728751..aa1b539 100644 --- a/src/mod/Term.cpp +++ b/libs/libmod/src/mod/Term.cpp @@ -1,9 +1,9 @@ -#include "Term.h" +#include "Term.hpp" -#include -#include -#include -#include +#include +#include +#include +#include namespace mod { namespace Term { diff --git a/src/mod/Term.h b/libs/libmod/src/mod/Term.hpp similarity index 63% rename from src/mod/Term.h rename to libs/libmod/src/mod/Term.hpp index d1aa318..f19d1bb 100644 --- a/src/mod/Term.h +++ b/libs/libmod/src/mod/Term.hpp @@ -1,12 +1,14 @@ #ifndef MOD_UNIFICATION_H #define MOD_UNIFICATION_H +#include + #include namespace mod { namespace Term { -void mgu(const std::string &left, const std::string &right); +MOD_DECL void mgu(const std::string &left, const std::string &right); } // namespace Term } // namespace mod diff --git a/src/mod/dg/DG.cpp b/libs/libmod/src/mod/dg/DG.cpp similarity index 89% rename from src/mod/dg/DG.cpp rename to libs/libmod/src/mod/dg/DG.cpp index e1a666d..f77be4c 100644 --- a/src/mod/dg/DG.cpp +++ b/libs/libmod/src/mod/dg/DG.cpp @@ -1,20 +1,20 @@ -#include "DG.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "DG.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -104,7 +104,6 @@ DG::HyperEdge DG::findEdge(const std::vector &sources, const std::vector vTargets.push_back(vs[v.getId()]); } const auto vInner = getNonHyper().findHyperEdge(vSources, vTargets); - if(vInner == boost::graph_traits::null_vertex()) return HyperEdge(); return getHyper().getInterfaceEdge(vInner); } @@ -125,8 +124,8 @@ void DG::calc(bool printInfo) { p->dg->calculate(printInfo); } -const std::unordered_set > &DG::getGraphDatabase() const { - return getNonHyper().getGraphDatabase(); +const std::vector> &DG::getGraphDatabase() const { + return getNonHyper().getGraphDatabase().asList(); } const std::vector > &DG::getProducts() const { @@ -208,12 +207,11 @@ std::shared_ptr DG::ruleComp(const std::vector } std::shared_ptr DG::dumpImport(const std::vector > &graphs, const std::vector > &rules, const std::string &file) { - std::string fullName = prefixFilename(file); - std::ifstream fileStream(fullName.c_str()); - if(!fileStream.is_open()) throw InputError("DG dump file not found, '" + fullName + "'\n"); + std::ifstream fileStream(file.c_str()); + if(!fileStream.is_open()) throw InputError("DG dump file not found, '" + file + "'\n"); fileStream.close(); std::ostringstream err; - std::unique_ptr dgInternal(lib::IO::DG::Read::dump(graphs, rules, fullName, err)); + std::unique_ptr dgInternal(lib::IO::DG::Read::dump(graphs, rules, file, err)); if(!dgInternal) throw InputError(err.str()); return wrapIt(new DG(std::move(dgInternal))); } diff --git a/src/mod/dg/DG.h b/libs/libmod/src/mod/dg/DG.hpp similarity index 94% rename from src/mod/dg/DG.h rename to libs/libmod/src/mod/dg/DG.hpp index 93ca671..948f1f7 100644 --- a/src/mod/dg/DG.h +++ b/libs/libmod/src/mod/dg/DG.hpp @@ -1,10 +1,11 @@ #ifndef MOD_DG_DG_H #define MOD_DG_DG_H -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include @@ -23,7 +24,7 @@ namespace dg { // rst: // rst-class-start: -struct DG { +struct MOD_DECL DG { DG(const DG&) = delete; DG &operator=(const DG&) = delete; public: @@ -51,7 +52,7 @@ struct DG { // rst: // rst: :returns: the instance identifier for the object. std::size_t getId() const; - friend std::ostream &operator<<(std::ostream &s, const DG &dg); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const DG &dg); // rst: .. function:: const lib::DG::NonHyper &getNonHyper() const // rst: const lib::DG::Hyper &getHyper() const // rst: @@ -98,11 +99,11 @@ struct DG { // rst: :throws: :class:`LogicError` if created from :cpp:any:`ruleComp` and a dynamic add strategy adds a graph // rst: isomorphic to an already known graph, but represented by a different object. void calc(bool printInfo = true); - // rst: .. function:: const std::unordered_set, graph::GraphLess> &getGraphDatabase() const + // rst: .. function:: const std::vector> &getGraphDatabase() const // rst: - // rst: :returns: the set of all graphs created by the derivation graph, + // rst: :returns: a list of all graphs created by the derivation graph, // rst: and all graphs given when constructed. - const std::unordered_set > &getGraphDatabase() const; + const std::vector> &getGraphDatabase() const; // rst: .. function:: const std::vector > &getProducts() const // rst: // rst: :returns: the list of new graphs discovered by the derivation graph. @@ -187,4 +188,4 @@ struct DG { } // namespace dg } // namespace mod -#endif /* MOD_DG_DG_H */ \ No newline at end of file +#endif /* MOD_DG_DG_H */ diff --git a/src/mod/dg/ForwardDecl.h b/libs/libmod/src/mod/dg/ForwardDecl.hpp similarity index 100% rename from src/mod/dg/ForwardDecl.h rename to libs/libmod/src/mod/dg/ForwardDecl.hpp diff --git a/src/mod/dg/GraphInterface.cpp b/libs/libmod/src/mod/dg/GraphInterface.cpp similarity index 93% rename from src/mod/dg/GraphInterface.cpp rename to libs/libmod/src/mod/dg/GraphInterface.cpp index 1a7bc55..99513dd 100644 --- a/src/mod/dg/GraphInterface.cpp +++ b/libs/libmod/src/mod/dg/GraphInterface.cpp @@ -1,11 +1,11 @@ -#include "GraphInterface.h" +#include "GraphInterface.hpp" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include namespace mod { namespace dg { @@ -145,11 +145,9 @@ DG::HyperEdge DG::HyperEdge::getInverse() const { const auto &dgHyper = g->getHyper(); const auto &dg = dgHyper.getGraph(); using boost::vertices; - auto v = *(vertices(dg).first + eId); + const auto v = *(vertices(dg).first + eId); assert(dg[v].kind == lib::DG::HyperVertexKind::Edge); - auto vInverse = dg[v].reverse; - if(vInverse == dg.null_vertex()) return HyperEdge(); - return HyperEdge(g, get(boost::vertex_index_t(), dg, vInverse)); + return dgHyper.getInterfaceEdge(dgHyper.getReverseEdge(v)); } std::vector > @@ -175,7 +173,7 @@ void DG::HyperEdge::printTransitionState(const graph::Printer &printer) const { using boost::vertices; auto v = *(vertices(dg).first + eId); assert(dg[v].kind == lib::DG::HyperVertexKind::Edge); - assert(dg[v].rules.size() == 1); + assert(dgHyper.getRulesFromEdge(v).size() == 1); lib::IO::Derivation::Write::summaryTransitionState(g->getNonHyper(), v, printer.getOptions()); } @@ -424,13 +422,14 @@ void DG::TargetIterator::increment() { //------------------------------------------------------------------------------ DG::RuleIterator::RuleIterator(std::shared_ptr g, std::size_t eId) : g(g), eId(eId), i(0) { - const auto &dg = g->getHyper().getGraph(); + const auto &dgHyper = g->getHyper(); + const auto &dg = dgHyper.getGraph(); using boost::vertices; assert(g); assert(num_vertices(g->getHyper().getGraph()) > 0); assert(g->getHyper().getGraph()[*(vertices(g->getHyper().getGraph()).first + eId)].kind == lib::DG::HyperVertexKind::Edge); auto e = vertices(dg).first[eId]; - const auto &rs = dg[e].rules; + const auto &rs = dgHyper.getRulesFromEdge(e); if(rs.empty()) { this->eId = 0; this->g = nullptr; @@ -440,13 +439,14 @@ DG::RuleIterator::RuleIterator(std::shared_ptr g, std::size_t eId) : g(g), e DG::RuleIterator::RuleIterator() : eId(0), i(0) { } std::shared_ptr DG::RuleIterator::dereference() const { - const auto &dg = g->getHyper().getGraph(); + const auto &dgHyper = g->getHyper(); + const auto &dg = dgHyper.getGraph(); using boost::vertices; assert(g); assert(num_vertices(g->getHyper().getGraph()) > 0); assert(g->getHyper().getGraph()[*(vertices(g->getHyper().getGraph()).first + eId)].kind == lib::DG::HyperVertexKind::Edge); - auto e = vertices(dg).first[eId]; - const auto &rs = dg[e].rules; + const auto e = vertices(dg).first[eId]; + const auto &rs = dgHyper.getRulesFromEdge(e); assert(i < rs.size()); return rs[i]->getAPIReference(); } @@ -457,10 +457,11 @@ bool DG::RuleIterator::equal(const RuleIterator &iter) const { void DG::RuleIterator::increment() { ++i; - const auto &dg = g->getHyper().getGraph(); + const auto &dgHyper = g->getHyper(); + const auto &dg = dgHyper.getGraph(); using boost::vertices; - auto e = vertices(dg).first[eId]; - const auto &rs = dg[e].rules; + const auto e = vertices(dg).first[eId]; + const auto &rs = dgHyper.getRulesFromEdge(e); if(i >= rs.size()) { g = nullptr; eId = 0; @@ -469,10 +470,11 @@ void DG::RuleIterator::increment() { } std::size_t DG::RuleRange::size() const { - const auto &dg = g->getHyper().getGraph(); + const auto &dgHyper = g->getHyper(); + const auto &dg = dgHyper.getGraph(); using boost::vertices; - auto e = vertices(dg).first[eId]; - const auto &rs = dg[e].rules; + const auto e = vertices(dg).first[eId]; + const auto &rs = dgHyper.getRulesFromEdge(e); return rs.size(); } diff --git a/src/mod/dg/GraphInterface.h b/libs/libmod/src/mod/dg/GraphInterface.hpp similarity index 90% rename from src/mod/dg/GraphInterface.h rename to libs/libmod/src/mod/dg/GraphInterface.hpp index 29cadce..87905a1 100644 --- a/src/mod/dg/GraphInterface.h +++ b/libs/libmod/src/mod/dg/GraphInterface.hpp @@ -4,8 +4,9 @@ // rst: This header contains the definitions for the hypergraph interface for :cpp:class:`dg::DG`. // rst: -#include -#include +#include +#include +#include #include @@ -22,7 +23,7 @@ namespace dg { // rst: A descriptor of either a vertex in a graph, or a null vertex. // rst-class-start: -class DG::Vertex { +class MOD_DECL DG::Vertex { friend class lib::DG::Hyper; Vertex(std::shared_ptr g, std::size_t vId); public: @@ -30,10 +31,10 @@ class DG::Vertex { // rst: // rst: Constructs a null descriptor. Vertex(); - friend std::ostream &operator<<(std::ostream &s, const Vertex &v); - friend bool operator==(const Vertex &v1, const Vertex &v2); - friend bool operator!=(const Vertex &v1, const Vertex &v2); - friend bool operator<(const Vertex &v1, const Vertex &v2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Vertex &v); + MOD_DECL friend bool operator==(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator!=(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator<(const Vertex &v1, const Vertex &v2); std::size_t hash() const; // rst: .. function:: explicit operator bool() const // rst: @@ -89,7 +90,7 @@ class DG::Vertex { // rst: A descriptor of either a hyperedge in a derivation graph, or a null edge. // rst-class-start: -class DG::HyperEdge { +class MOD_DECL DG::HyperEdge { friend class lib::DG::Hyper; HyperEdge(std::shared_ptr g, std::size_t eId); public: @@ -97,10 +98,10 @@ class DG::HyperEdge { // rst: // rst: Constructs a null descriptor. HyperEdge(); - friend std::ostream &operator<<(std::ostream &s, const HyperEdge &e); - friend bool operator==(const HyperEdge &e1, const HyperEdge &e2); - friend bool operator!=(const HyperEdge &e1, const HyperEdge &e2); - friend bool operator<(const HyperEdge &e1, const HyperEdge &e2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const HyperEdge &e); + MOD_DECL friend bool operator==(const HyperEdge &e1, const HyperEdge &e2); + MOD_DECL friend bool operator!=(const HyperEdge &e1, const HyperEdge &e2); + MOD_DECL friend bool operator<(const HyperEdge &e1, const HyperEdge &e2); std::size_t hash() const; // rst: .. function:: explicit operator bool() const // rst: @@ -189,7 +190,8 @@ class DG::HyperEdge { // rst: It models a forward iterator. // rst-class-start: -class DG::VertexIterator : public boost::iterator_facade { +class MOD_DECL DG::VertexIterator + : public boost::iterator_facade { friend class DG; VertexIterator(std::shared_ptr g); public: @@ -237,7 +239,8 @@ struct DG::VertexRange { // rst: It models a forward iterator. // rst-class-start: -class DG::EdgeIterator : public boost::iterator_facade { +class MOD_DECL DG::EdgeIterator + : public boost::iterator_facade { friend class DG; EdgeIterator(std::shared_ptr g); public: @@ -285,7 +288,8 @@ struct DG::EdgeRange { // rst: It models a forward iterator. // rst-class-start: -class DG::InEdgeIterator : public boost::iterator_facade { +class MOD_DECL DG::InEdgeIterator + : public boost::iterator_facade { friend class InEdgeRange; InEdgeIterator(std::shared_ptr g, std::size_t vId); public: @@ -331,7 +335,8 @@ struct DG::InEdgeRange { // rst: It models a forward iterator. // rst-class-start: -class DG::OutEdgeIterator : public boost::iterator_facade { +class MOD_DECL DG::OutEdgeIterator + : public boost::iterator_facade { friend class OutEdgeRange; OutEdgeIterator(std::shared_ptr g, std::size_t vId); public: @@ -380,7 +385,8 @@ struct DG::OutEdgeRange { // rst: It models a forward iterator. // rst-class-start: -class DG::SourceIterator : public boost::iterator_facade { +class MOD_DECL DG::SourceIterator + : public boost::iterator_facade { friend class SourceRange; SourceIterator(std::shared_ptr g, std::size_t eId); public: @@ -426,7 +432,8 @@ struct DG::SourceRange { // rst: It models a forward iterator. // rst-class-start: -class DG::TargetIterator : public boost::iterator_facade { +class MOD_DECL DG::TargetIterator + : public boost::iterator_facade { friend class TargetRange; TargetIterator(std::shared_ptr g, std::size_t eId); public: @@ -475,7 +482,8 @@ struct DG::TargetRange { // rst: It models a forward iterator. // rst-class-start: -class DG::RuleIterator : public boost::iterator_facade, std::forward_iterator_tag, std::shared_ptr > { +class MOD_DECL DG::RuleIterator + : public boost::iterator_facade, std::forward_iterator_tag, std::shared_ptr > { friend class RuleRange; RuleIterator(std::shared_ptr g, std::size_t eId); public: @@ -499,7 +507,7 @@ class DG::RuleIterator : public boost::iterator_facade -struct hash { - +struct std::hash { std::size_t operator()(const mod::dg::DG::Vertex &v) const { return v.hash(); } }; template<> -struct hash { - +struct std::hash { std::size_t operator()(const mod::dg::DG::HyperEdge &v) const { return v.hash(); } }; -} // namespace std - #endif /* MOD_DG_GRAPHINTERFACE_H */ diff --git a/src/mod/dg/Printer.cpp b/libs/libmod/src/mod/dg/Printer.cpp similarity index 97% rename from src/mod/dg/Printer.cpp rename to libs/libmod/src/mod/dg/Printer.cpp index 7c500ef..04026a5 100644 --- a/src/mod/dg/Printer.cpp +++ b/libs/libmod/src/mod/dg/Printer.cpp @@ -1,12 +1,12 @@ -#include "Printer.h" - -#include -#include -#include -#include -#include -#include -#include +#include "Printer.hpp" + +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/dg/Printer.h b/libs/libmod/src/mod/dg/Printer.hpp similarity index 98% rename from src/mod/dg/Printer.h rename to libs/libmod/src/mod/dg/Printer.hpp index a4df601..9783880 100644 --- a/src/mod/dg/Printer.h +++ b/libs/libmod/src/mod/dg/Printer.hpp @@ -1,7 +1,8 @@ #ifndef MOD_DG_PRINTER_H #define MOD_DG_PRINTER_H -#include +#include +#include #include #include @@ -16,7 +17,7 @@ namespace dg { // rst: // rst-class-start: -struct PrintData { +struct MOD_DECL PrintData { // rst: .. function:: PrintData(std::shared_ptr dg) // rst: // rst: Construct a data object where all derivations have a single version, 0, connected to version 0 of all heads and tails. @@ -59,7 +60,7 @@ struct PrintData { // rst: // rst-class-start: -struct Printer { +struct MOD_DECL Printer { Printer(); Printer(const Printer&) = delete; Printer &operator=(const Printer&) = delete; diff --git a/src/mod/dg/Strategies.cpp b/libs/libmod/src/mod/dg/Strategies.cpp similarity index 90% rename from src/mod/dg/Strategies.cpp rename to libs/libmod/src/mod/dg/Strategies.cpp index 7683e3e..db0fe7f 100644 --- a/src/mod/dg/Strategies.cpp +++ b/libs/libmod/src/mod/dg/Strategies.cpp @@ -1,20 +1,20 @@ -#include "Strategies.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Strategies.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/dg/Strategies.h b/libs/libmod/src/mod/dg/Strategies.hpp similarity index 96% rename from src/mod/dg/Strategies.h rename to libs/libmod/src/mod/dg/Strategies.hpp index 935807e..82462b9 100644 --- a/src/mod/dg/Strategies.h +++ b/libs/libmod/src/mod/dg/Strategies.hpp @@ -1,9 +1,10 @@ #ifndef MOD_DG_STRATEGIES_H #define MOD_DG_STRATEGIES_H -#include -#include -#include +#include +#include +#include +#include #include #include @@ -21,7 +22,7 @@ namespace dg { // rst: // rst-class-start: -struct Strategy { +struct MOD_DECL Strategy { Strategy(const Strategy&) = delete; Strategy &operator=(const Strategy&) = delete; public: @@ -56,7 +57,7 @@ struct Strategy { public: ~Strategy(); std::unique_ptr clone() const; - friend std::ostream &operator<<(std::ostream &s, const Strategy &strat); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Strategy &strat); lib::DG::Strategies::Strategy &getStrategy(); private: struct Pimpl; @@ -126,4 +127,4 @@ struct Strategy { } // namespace dg } // namespace mod -#endif /* MOD_DG_STRATEGIES_H */ \ No newline at end of file +#endif /* MOD_DG_STRATEGIES_H */ diff --git a/src/mod/graph/Automorphism.cpp b/libs/libmod/src/mod/graph/Automorphism.cpp similarity index 96% rename from src/mod/graph/Automorphism.cpp rename to libs/libmod/src/mod/graph/Automorphism.cpp index f073ef8..e257c93 100644 --- a/src/mod/graph/Automorphism.cpp +++ b/libs/libmod/src/mod/graph/Automorphism.cpp @@ -1,7 +1,7 @@ -#include "Automorphism.h" +#include "Automorphism.hpp" -#include -#include +#include +#include #include diff --git a/src/mod/graph/Automorphism.h b/libs/libmod/src/mod/graph/Automorphism.hpp similarity index 91% rename from src/mod/graph/Automorphism.h rename to libs/libmod/src/mod/graph/Automorphism.hpp index 4efb2b6..92b2c1d 100644 --- a/src/mod/graph/Automorphism.h +++ b/libs/libmod/src/mod/graph/Automorphism.hpp @@ -1,7 +1,8 @@ #ifndef MOD_GRAPH_AUTOMORPHISM_H #define MOD_GRAPH_AUTOMORPHISM_H -#include +#include +#include #include @@ -20,7 +21,7 @@ struct Graph::Aut { // rst: // rst: :returns: the image of the given vertex under the permutation. Vertex operator[](Vertex v) const; - friend std::ostream &operator<<(std::ostream &s, const Aut &a); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Aut &a); private: std::shared_ptr g; LabelType lt; @@ -85,7 +86,7 @@ struct Graph::AutGroup { // rst: // rst: :returns: a range of the generators for the group. Gens gens() const; - friend std::ostream &operator<<(std::ostream &s, const AutGroup &a); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const AutGroup &a); private: std::shared_ptr g; LabelType lt; diff --git a/src/mod/graph/ForwardDecl.h b/libs/libmod/src/mod/graph/ForwardDecl.hpp similarity index 100% rename from src/mod/graph/ForwardDecl.h rename to libs/libmod/src/mod/graph/ForwardDecl.hpp diff --git a/src/mod/graph/Graph.cpp b/libs/libmod/src/mod/graph/Graph.cpp similarity index 93% rename from src/mod/graph/Graph.cpp rename to libs/libmod/src/mod/graph/Graph.cpp index 1a5bc91..d7dc8e9 100644 --- a/src/mod/graph/Graph.cpp +++ b/libs/libmod/src/mod/graph/Graph.cpp @@ -1,17 +1,17 @@ -#include "Graph.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Graph.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -226,6 +226,10 @@ int Graph::getMaxExternalId() const { return (--p->externalToInternalIds->end())->first; } +void Graph::instantiateStereo() const { + get_stereo(getGraph().getLabelledGraph()); +} + //------------------------------------------------------------------------------ // Static //------------------------------------------------------------------------------ @@ -259,11 +263,10 @@ std::shared_ptr Graph::graphGMLString(const std::string &data) { } std::shared_ptr Graph::graphGML(const std::string &file) { - std::string fullFilename = prefixFilename(file); - std::ifstream ifs(fullFilename); + std::ifstream ifs(file); std::ostringstream err; if(!ifs) { - err << "Could not open graph GML file '" << file << "' ('" << fullFilename << "')." << std::endl; + err << "Could not open graph GML file '" << file << "'.\n"; throw InputError(err.str()); } auto gData = lib::IO::Graph::Read::gml(ifs, err); diff --git a/src/mod/graph/Graph.h b/libs/libmod/src/mod/graph/Graph.hpp similarity index 96% rename from src/mod/graph/Graph.h rename to libs/libmod/src/mod/graph/Graph.hpp index 7ed262e..7b38bea 100644 --- a/src/mod/graph/Graph.h +++ b/libs/libmod/src/mod/graph/Graph.hpp @@ -1,8 +1,9 @@ #ifndef MOD_GRAPH_GRAPH_H #define MOD_GRAPH_GRAPH_H -#include -#include +#include +#include +#include #include #include @@ -25,7 +26,7 @@ namespace graph { // rst: // rst-class-start: -struct Graph { +struct MOD_DECL Graph { class Vertex; class Edge; class VertexIterator; @@ -55,7 +56,7 @@ struct Graph { // rst: // rst: :returns: the unique instance id among :class:`Graph` objects. std::size_t getId() const; - friend std::ostream &operator<<(std::ostream &s, const Graph &g); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Graph &g); lib::Graph::Single &getGraph() const; public: // graph interface // rst: .. function:: std::size_t numVertices() const @@ -224,6 +225,12 @@ struct Graph { // rst: If no such minimum and maximum exists, then 0 will be returned. int getMinExternalId() const; int getMaxExternalId() const; + // rst: .. function:: void instantiateStereo() const + // rst: + // rst: Make sure that stereo data is instantiated. + // rst: + // rst: :throws: `StereoDeductionError` if the data was not instantiated and deduction failed. + void instantiateStereo() const; private: struct Pimpl; std::unique_ptr p; diff --git a/src/mod/graph/GraphInterface.cpp b/libs/libmod/src/mod/graph/GraphInterface.cpp similarity index 91% rename from src/mod/graph/GraphInterface.cpp rename to libs/libmod/src/mod/graph/GraphInterface.cpp index 548fa92..340e219 100644 --- a/src/mod/graph/GraphInterface.cpp +++ b/libs/libmod/src/mod/graph/GraphInterface.cpp @@ -1,13 +1,13 @@ -#include "GraphInterface.h" - -#include -#include -#include -#include -#include -#include -#include -#include +#include "GraphInterface.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include namespace mod { namespace graph { diff --git a/src/mod/graph/GraphInterface.h b/libs/libmod/src/mod/graph/GraphInterface.hpp similarity index 90% rename from src/mod/graph/GraphInterface.h rename to libs/libmod/src/mod/graph/GraphInterface.hpp index 83c959e..25bca5f 100644 --- a/src/mod/graph/GraphInterface.h +++ b/libs/libmod/src/mod/graph/GraphInterface.hpp @@ -4,7 +4,8 @@ // rst: This header contains the definitions for the graph interface for :cpp:class:`graph::Graph`. // rst: -#include +#include +#include #include @@ -25,17 +26,17 @@ namespace graph { // rst: A descriptor of either a vertex in a graph, or a null vertex. // rst-class-start: -struct Graph::Vertex { +struct MOD_DECL Graph::Vertex { Vertex(std::shared_ptr g, std::size_t vId); public: // rst: .. function:: Vertex() // rst: // rst: Constructs a null descriptor. Vertex(); - friend std::ostream &operator<<(std::ostream &s, const Vertex &v); - friend bool operator==(const Vertex &v1, const Vertex &v2); - friend bool operator!=(const Vertex &v1, const Vertex &v2); - friend bool operator<(const Vertex &v1, const Vertex &v2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Vertex &v); + MOD_DECL friend bool operator==(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator!=(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator<(const Vertex &v1, const Vertex &v2); std::size_t hash() const; // rst: .. function:: explicit operator bool() const // rst: @@ -110,19 +111,21 @@ struct Graph::Vertex { // rst: A descriptor of either an edge in a graph, or a null edge. // rst-class-start: -class Graph::Edge { +class MOD_DECL Graph::Edge { friend class EdgeIterator; + friend class IncidentEdgeIterator; + Edge(std::shared_ptr g, std::size_t vId, std::size_t eId); public: // rst: .. function:: Edge() // rst: // rst: Constructs a null descriptor. Edge(); - friend std::ostream &operator<<(std::ostream &s, const Edge &e); - friend bool operator==(const Edge &e1, const Edge &e2); - friend bool operator!=(const Edge &e1, const Edge &e2); - friend bool operator<(const Edge &e1, const Edge &e2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Edge &e); + MOD_DECL friend bool operator==(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator!=(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator<(const Edge &e1, const Edge &e2); // rst: .. function:: explicit operator bool() const // rst: // rst: :returns: :cpp:expr:`!isNull()` @@ -172,8 +175,10 @@ class Graph::Edge { // rst: It models a forward iterator. // rst-class-start: -class Graph::VertexIterator : public boost::iterator_facade { +class MOD_DECL Graph::VertexIterator + : public boost::iterator_facade { friend class Graph; + VertexIterator(std::shared_ptr g); public: // rst: .. function:: VertexIterator() @@ -182,6 +187,7 @@ class Graph::VertexIterator : public boost::iterator_facade g); public: VertexIterator begin() const; @@ -221,8 +228,10 @@ struct Graph::VertexRange { // rst: It models a forward iterator. // rst-class-start: -class Graph::EdgeIterator : public boost::iterator_facade { +class MOD_DECL Graph::EdgeIterator + : public boost::iterator_facade { friend class Graph; + EdgeIterator(std::shared_ptr g); public: // rst: .. function:: EdgeIterator() @@ -231,6 +240,7 @@ class Graph::EdgeIterator : public boost::iterator_facade g); public: EdgeIterator begin() const; @@ -270,8 +281,10 @@ struct Graph::EdgeRange { // rst: It models a forward iterator. // rst-class-start: -class Graph::IncidentEdgeIterator : public boost::iterator_facade { +class MOD_DECL Graph::IncidentEdgeIterator + : public boost::iterator_facade { friend class Graph; + IncidentEdgeIterator(std::shared_ptr g, std::size_t vId); public: // rst: .. function:: IncidentEdgeIterator() @@ -280,6 +293,7 @@ class Graph::IncidentEdgeIterator : public boost::iterator_facade g, std::size_t vId); public: IncidentEdgeIterator begin() const; @@ -317,7 +332,7 @@ struct Graph::IncidentEdgeRange { // VertexRange //------------------------------------------------------------------------------ -inline Graph::VertexRange::VertexRange(std::shared_ptr g) : g(g) { } +inline Graph::VertexRange::VertexRange(std::shared_ptr g) : g(g) {} inline Graph::VertexIterator Graph::VertexRange::begin() const { return VertexIterator(g); @@ -334,7 +349,7 @@ inline Graph::Vertex Graph::VertexRange::operator[](std::size_t i) const { // EdgeRange //------------------------------------------------------------------------------ -inline Graph::EdgeRange::EdgeRange(std::shared_ptr g) : g(g) { } +inline Graph::EdgeRange::EdgeRange(std::shared_ptr g) : g(g) {} inline Graph::EdgeIterator Graph::EdgeRange::begin() const { return EdgeIterator(g); @@ -347,7 +362,7 @@ inline Graph::EdgeIterator Graph::EdgeRange::end() const { // IncidentEdgeRange //------------------------------------------------------------------------------ -inline Graph::IncidentEdgeRange::IncidentEdgeRange(std::shared_ptr g, std::size_t vId) : g(g), vId(vId) { } +inline Graph::IncidentEdgeRange::IncidentEdgeRange(std::shared_ptr g, std::size_t vId) : g(g), vId(vId) {} inline Graph::IncidentEdgeIterator Graph::IncidentEdgeRange::begin() const { return IncidentEdgeIterator(g, vId); diff --git a/src/mod/graph/Printer.cpp b/libs/libmod/src/mod/graph/Printer.cpp similarity index 98% rename from src/mod/graph/Printer.cpp rename to libs/libmod/src/mod/graph/Printer.cpp index 4a40c8e..e111db9 100644 --- a/src/mod/graph/Printer.cpp +++ b/libs/libmod/src/mod/graph/Printer.cpp @@ -1,6 +1,6 @@ -#include "Printer.h" +#include "Printer.hpp" -#include +#include namespace mod { namespace graph { diff --git a/src/mod/graph/Printer.h b/libs/libmod/src/mod/graph/Printer.hpp similarity index 98% rename from src/mod/graph/Printer.h rename to libs/libmod/src/mod/graph/Printer.hpp index 61c0264..9fce1bf 100644 --- a/src/mod/graph/Printer.h +++ b/libs/libmod/src/mod/graph/Printer.hpp @@ -1,7 +1,8 @@ #ifndef MOD_GRAPH_PRINTER_H #define MOD_GRAPH_PRINTER_H -#include +#include +#include #include @@ -18,7 +19,7 @@ namespace graph { // rst: // rst-class-start: -struct Printer { +struct MOD_DECL Printer { // rst: .. function Printer() // rst: // rst: The default constructor enables edges as bonds, raised charges, and raised isotopes. diff --git a/src/mod/lib/Algorithm.h b/libs/libmod/src/mod/lib/Algorithm.hpp similarity index 99% rename from src/mod/lib/Algorithm.h rename to libs/libmod/src/mod/lib/Algorithm.hpp index 09bfe6b..47f2e2f 100644 --- a/src/mod/lib/Algorithm.h +++ b/libs/libmod/src/mod/lib/Algorithm.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_ALGORITHM_H #define MOD_LIB_ALGORITHM_H -#include +#include #include #include diff --git a/src/mod/lib/Chem/Mass.cpp b/libs/libmod/src/mod/lib/Chem/Mass.cpp similarity index 99% rename from src/mod/lib/Chem/Mass.cpp rename to libs/libmod/src/mod/lib/Chem/Mass.cpp index 04aec49..5ccefa7 100644 --- a/src/mod/lib/Chem/Mass.cpp +++ b/libs/libmod/src/mod/lib/Chem/Mass.cpp @@ -1,6 +1,6 @@ -#include "MoleculeUtil.h" +#include "MoleculeUtil.hpp" -#include +#include // This file is basically copied from Open Babel. // (elements.cpp) diff --git a/src/mod/lib/Chem/MoleculeUtil.cpp b/libs/libmod/src/mod/lib/Chem/MoleculeUtil.cpp similarity index 99% rename from src/mod/lib/Chem/MoleculeUtil.cpp rename to libs/libmod/src/mod/lib/Chem/MoleculeUtil.cpp index dd49b1f..34074e6 100644 --- a/src/mod/lib/Chem/MoleculeUtil.cpp +++ b/libs/libmod/src/mod/lib/Chem/MoleculeUtil.cpp @@ -1,7 +1,7 @@ -#include "MoleculeUtil.h" +#include "MoleculeUtil.hpp" -#include -#include +#include +#include #include diff --git a/src/mod/lib/Chem/MoleculeUtil.h b/libs/libmod/src/mod/lib/Chem/MoleculeUtil.hpp similarity index 88% rename from src/mod/lib/Chem/MoleculeUtil.h rename to libs/libmod/src/mod/lib/Chem/MoleculeUtil.hpp index 6e0d620..0745cc7 100644 --- a/src/mod/lib/Chem/MoleculeUtil.h +++ b/libs/libmod/src/mod/lib/Chem/MoleculeUtil.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_CHEM_MOLECULEUTIL_H #define MOD_LIB_CHEM_MOLECULEUTIL_H -#include +#include #include #include @@ -33,7 +33,11 @@ double exactMass(AtomId a, Isotope i); // implemented in Mass.cpp constexpr double electronMass = 0.000548580; template -bool isCollapsible(const auto v, const Graph &g, const AtomDataT &atomData, const EdgeDataT &edgeData, const HasImportantStereo &hasImportantStereo) { +bool isCollapsible(const typename boost::graph_traits::vertex_descriptor v, + const Graph &g, + const AtomDataT &atomData, + const EdgeDataT &edgeData, + const HasImportantStereo &hasImportantStereo) { if(!isCleanHydrogen(atomData(v))) return false; if(out_degree(v, g) != 1) return false; const auto e = *out_edges(v, g).first; diff --git a/src/mod/lib/Chem/OBabel.cpp b/libs/libmod/src/mod/lib/Chem/OBabel.cpp similarity index 96% rename from src/mod/lib/Chem/OBabel.cpp rename to libs/libmod/src/mod/lib/Chem/OBabel.cpp index 7753677..5128230 100644 --- a/src/mod/lib/Chem/OBabel.cpp +++ b/libs/libmod/src/mod/lib/Chem/OBabel.cpp @@ -1,18 +1,23 @@ -#include "OBabel.h" +#include "OBabel.hpp" #ifdef MOD_HAVE_OPENBABEL -#include -#include +#include +#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include +// The Open Babel plugin infrastructure needs some symbols to be visible, +// but they all seem to be declared inline in the header files, so we need to compile +// such that they are visible. +// Assuming GCC and Clang the following define seems to do the trick: +#define HAVE_GCC_VISIBILITY 1 #include #include #include @@ -199,6 +204,7 @@ void generateCoordinates(OpenBabel::OBMol &mol) { OpenBabel::OBOp *op = OpenBabel::OBOp::FindType("gen2D"); assert(op); bool res = op->Do(&mol); + (void) res; assert(res); } diff --git a/src/mod/lib/Chem/OBabel.h b/libs/libmod/src/mod/lib/Chem/OBabel.hpp similarity index 94% rename from src/mod/lib/Chem/OBabel.h rename to libs/libmod/src/mod/lib/Chem/OBabel.hpp index 35161a2..7e8f85a 100644 --- a/src/mod/lib/Chem/OBabel.h +++ b/libs/libmod/src/mod/lib/Chem/OBabel.hpp @@ -1,12 +1,12 @@ #ifndef MOD_LIB_CHEM_OBABEL_H #define MOD_LIB_CHEM_OBABEL_H -#include -#include +#include +#include #ifndef MOD_HAVE_OPENBABEL -#include +#include #else -#include +#include #include #endif diff --git a/src/mod/lib/Chem/Smiles.cpp b/libs/libmod/src/mod/lib/Chem/Smiles.cpp similarity index 96% rename from src/mod/lib/Chem/Smiles.cpp rename to libs/libmod/src/mod/lib/Chem/Smiles.cpp index 3fbbddf..e3d3aeb 100644 --- a/src/mod/lib/Chem/Smiles.cpp +++ b/libs/libmod/src/mod/lib/Chem/Smiles.cpp @@ -1,8 +1,8 @@ -#include "Smiles.h" +#include "Smiles.hpp" -#include -#include -#include +#include +#include +#include #include diff --git a/src/mod/lib/Chem/Smiles.h b/libs/libmod/src/mod/lib/Chem/Smiles.hpp similarity index 96% rename from src/mod/lib/Chem/Smiles.h rename to libs/libmod/src/mod/lib/Chem/Smiles.hpp index 6c916d8..f8fe1ee 100644 --- a/src/mod/lib/Chem/Smiles.h +++ b/libs/libmod/src/mod/lib/Chem/Smiles.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_CHEM_SMILES_H #define MOD_LIB_CHEM_SMILES_H -#include +#include #include diff --git a/src/mod/lib/Chem/SmilesRead.cpp b/libs/libmod/src/mod/lib/Chem/SmilesRead.cpp similarity index 98% rename from src/mod/lib/Chem/SmilesRead.cpp rename to libs/libmod/src/mod/lib/Chem/SmilesRead.cpp index dcb5cf3..a675331 100644 --- a/src/mod/lib/Chem/SmilesRead.cpp +++ b/libs/libmod/src/mod/lib/Chem/SmilesRead.cpp @@ -3,17 +3,17 @@ //#define BOOST_SPIRIT_X3_DEBUG //#include -#include "Smiles.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Smiles.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include diff --git a/src/mod/lib/Chem/SmilesWrite.cpp b/libs/libmod/src/mod/lib/Chem/SmilesWrite.cpp similarity index 99% rename from src/mod/lib/Chem/SmilesWrite.cpp rename to libs/libmod/src/mod/lib/Chem/SmilesWrite.cpp index 71887f4..b945ac3 100644 --- a/src/mod/lib/Chem/SmilesWrite.cpp +++ b/libs/libmod/src/mod/lib/Chem/SmilesWrite.cpp @@ -4,12 +4,12 @@ //#define DO_DEBUG -#include "Smiles.h" +#include "Smiles.hpp" -#include -#include -#include -#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/DG/Dump.cpp b/libs/libmod/src/mod/lib/DG/Dump.cpp similarity index 63% rename from src/mod/lib/DG/Dump.cpp rename to libs/libmod/src/mod/lib/DG/Dump.cpp index cb00bf7..886c25d 100644 --- a/src/mod/lib/DG/Dump.cpp +++ b/libs/libmod/src/mod/lib/DG/Dump.cpp @@ -1,19 +1,20 @@ -#include "Dump.h" +#include "Dump.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include #include #include @@ -22,7 +23,6 @@ #include #include #include -#include namespace mod { namespace lib { @@ -32,7 +32,12 @@ namespace { struct ConstructionData { const std::vector > &rules; - std::vector, std::unique_ptr > > vertices; + std::vector, + std::unique_ptr + >> vertices; const std::vector > rulesParsed; const std::vector, std::vector > > edges; }; @@ -40,10 +45,11 @@ struct ConstructionData { struct NonHyperDump : public NonHyper { NonHyperDump(const std::vector > &graphs, - ConstructionData &&constructionData) - : NonHyper(graphs,{LabelType::String, LabelRelation::Isomorphism}), constructionData(&constructionData) { + ConstructionData &&constructionData) + : NonHyper(graphs, {LabelType::String, LabelRelation::Isomorphism}), constructionData(&constructionData) { calculate(true); } + private: virtual std::string getType() const override { @@ -57,20 +63,22 @@ struct NonHyperDump : public NonHyper { const auto &edges = constructionData->edges; std::unordered_map > ruleMap; std::unordered_map > graphMap; + this->rules.reserve(rulesParsed.size()); + ruleMap.reserve(rulesParsed.size()); + graphMap.reserve(vertices.size()); for(const auto &t : rulesParsed) { - auto iter = std::find_if(begin(rules), end(rules), [&t](std::shared_ptr r) -> bool { + const auto iter = std::find_if(begin(rules), end(rules), [&t](std::shared_ptr r) -> bool { return r->getName() == get<1>(t); }); - if(iter != end(rules)) { - std::shared_ptr r = *iter; - if(printInfo) - IO::log() << "Rule linked: " << r->getName() << std::endl; - this->rules.push_back(r); - ruleMap[get<0>(t)] = r; - } else { + if(iter == end(rules)) { std::string msg = "Can not load DG dump. Rule not found: '" + get<1>(t) + "'"; throw InputError(std::move(msg)); } + std::shared_ptr r = *iter; + if(printInfo) + IO::log() << "Rule linked: " << r->getName() << std::endl; + this->rules.push_back(r); + ruleMap[get<0>(t)] = r; } // do merge of vertices and edges in order of increasing id @@ -81,14 +89,23 @@ struct NonHyperDump : public NonHyper { auto &v = vertices[iVertices]; auto gCand = std::make_unique(std::move(get<2>(v)), std::move(get<3>(v)), nullptr); auto p = checkIfNew(std::move(gCand)); - bool wasNew = addGraphAsVertex(p.first); + bool wasNew = trustAddGraphAsVertex(p.first); graphMap[id] = p.first; - if(!p.second && printInfo) IO::log() << "Graph linked: " << get<1>(v) << " -> " << p.first->getName() << std::endl; + if(!p.second && printInfo) + IO::log() << "Graph linked: " << get<1>(v) << " -> " << p.first->getName() << std::endl; if(wasNew) giveProductStatus(p.first); iVertices++; } else if(iEdges < edges.size() && get<0>(edges[iEdges]) == id) { const auto &e = edges[iEdges]; - std::vector srcGraphs, tarGraphs; + std::vector srcGraphs, tarGraphs; + int srcSize = 0, tarSize = 0; + for(int adj : get<2>(e)) { + assert(adj != 0); + if(adj < 0) ++srcSize; + else ++tarSize; + } + srcGraphs.reserve(srcSize); + tarGraphs.reserve(tarSize); for(int adj : get<2>(e)) { assert(adj != 0); unsigned int id = std::abs(adj) - 1; @@ -99,14 +116,17 @@ struct NonHyperDump : public NonHyper { } GraphMultiset gmsSrc(std::move(srcGraphs)), gmsTar(std::move(tarGraphs)); const auto &ruleIds = get<1>(e); - suggestDerivation(gmsSrc, gmsTar, nullptr); - for(const auto rId : ruleIds) { - auto rIter = ruleMap.find(rId); - assert(rIter != end(ruleMap)); - const auto *r = &rIter->second->getRule(); - suggestDerivation(gmsSrc, gmsTar, r); + if(ruleIds.empty()) { + suggestDerivation(std::move(gmsSrc), std::move(gmsTar), nullptr); + } else { + for(const auto rId : ruleIds) { + auto rIter = ruleMap.find(rId); + assert(rIter != end(ruleMap)); + const auto *r = &rIter->second->getRule(); + suggestDerivation(std::move(gmsSrc), std::move(gmsTar), r); + } } - iEdges++; + ++iEdges; } else { MOD_ABORT; } @@ -114,18 +134,25 @@ struct NonHyperDump : public NonHyper { constructionData = nullptr; } - virtual void listImpl(std::ostream &s) const override { } + virtual void listImpl(std::ostream &s) const override {} + private: std::vector > rules; ConstructionData *constructionData; }; -using BaseIteratorType = std::istream_iterator; -using IteratorType = spirit::multi_pass; -using PosIter = IO::PositionIter; +template +auto makePosIter(Iter iter) { + return IO::PositionIter(iter); +} -template -bool parse(IteratorType &textFirst, PosIter &first, const PosIter &last, const Parser &p, Attr &attr, std::ostream &err) { +template +bool parse(Iter &textFirst, + IO::PositionIter &first, + const IO::PositionIter &last, + const Parser &p, + Attr &attr, + std::ostream &err) { try { bool res = IO::detail::ParseDispatch::parse(first, last, p, attr, x3::space); if(!res) { @@ -134,7 +161,7 @@ bool parse(IteratorType &textFirst, PosIter &first, const PosIter &last, const P return false; } return res; - } catch(const x3::expectation_failure &e) { + } catch(const x3::expectation_failure> &e) { err << "Error while parsing DG dump.\n"; IO::detail::doParserExpectationError(e, textFirst, last, err); return false; @@ -143,26 +170,24 @@ bool parse(IteratorType &textFirst, PosIter &first, const PosIter &last, const P } // namespace -NonHyper *load(const std::vector > &graphs, const std::vector > &rules, std::istream &s, std::ostream &err) { +std::unique_ptr load(const std::vector > &graphs, + const std::vector > &rules, + const std::string &file, + std::ostream &err) { + boost::iostreams::mapped_file_source ifs(file); - struct FlagsHolder { - std::istream &s; - std::ios::fmtflags flags; - - FlagsHolder(std::istream &s) : s(s), flags(s.flags()) { - s.unsetf(std::ios::skipws); - } - - ~FlagsHolder() { - s.flags(flags); - } - } flagsHolder(s); - IteratorType textFirst = spirit::make_default_multi_pass(BaseIteratorType(s)); - IteratorType textLast; - PosIter first(textFirst), last(textLast); + auto textFirst = ifs.begin(); + const auto textLast = ifs.end(); + auto first = makePosIter(textFirst); + const auto last = makePosIter(textLast); unsigned int numVertices, numEdges, numRules; - std::vector, std::unique_ptr > > vertices; + std::vector, + std::unique_ptr + >> vertices; std::vector > rulesParsed; std::vector, std::vector > > edges; @@ -174,6 +199,8 @@ NonHyper *load(const std::vector > &graphs, const PARSE("numVertices:" >> x3::uint_, numVertices); PARSE("numEdges:" >> x3::uint_, numEdges); PARSE("numRules:" >> x3::uint_, numRules); + vertices.reserve(numVertices); + validVertices.reserve(numVertices); for(unsigned int i = 0; i < numVertices; i++) { unsigned int id; std::string name, dfs; @@ -186,29 +213,34 @@ NonHyper *load(const std::vector > &graphs, const return nullptr; } if(gData.pStereo) MOD_ABORT; - vertices.emplace_back(id, name, std::move(gData.g), std::move(gData.pString)); + vertices.emplace_back(id, std::move(name), std::move(gData.g), std::move(gData.pString)); validVertices.insert(id); } + rulesParsed.reserve(numRules); + validRules.reserve(numRules); for(unsigned int i = 0; i < numRules; i++) { unsigned int id; std::string name; PARSE("rule:" >> x3::uint_, id); PARSE('"' >> x3::lexeme[*(x3::char_ - '"') >> '"'], name); - rulesParsed.emplace_back(id, name); + rulesParsed.emplace_back(id, std::move(name)); if(validRules.find(id) != end(validRules)) { err << "Parsed data is corrupt, duplicate rule id, " << id << std::endl; return nullptr; } validRules.insert(id); } + edges.reserve(numEdges); + std::vector adj; + adj.reserve(numVertices); // probably a huge overestimation for(unsigned int i = 0; i < numEdges; i++) { unsigned int id; std::vector ruleIds; - std::vector adj; PARSE("edge:" >> x3::uint_, id); unsigned int numRules; if(version == 1) numRules = 1; else PARSE(x3::uint_, numRules); + ruleIds.reserve(numRules); for(std::size_t i = 0; i < numRules; ++i) { unsigned int ruleId; PARSE(x3::uint_, ruleId); @@ -217,7 +249,8 @@ NonHyper *load(const std::vector > &graphs, const PARSE(*x3::int_, adj); for(const auto rId : ruleIds) { if(validRules.find(rId) == end(validRules)) { - err << "Parsed data is corrupt, ruleId, " << rId << ", out of range [0, " << numRules << "[ for edge " << id << std::endl; + err << "Parsed data is corrupt, ruleId, " << rId << ", out of range [0, " << numRules << "[ for edge " << id + << std::endl; return nullptr; } } @@ -235,30 +268,39 @@ NonHyper *load(const std::vector > &graphs, const return nullptr; } } - edges.emplace_back(id, ruleIds, adj); + edges.emplace_back(id, std::move(ruleIds), adj); + adj.clear(); } using Vertex = decltype(vertices)::value_type; using Edge = decltype(edges)::value_type; - std::sort(begin(vertices), end(vertices), [](const Vertex &a, const Vertex & b) { + std::sort(begin(vertices), end(vertices), [](const Vertex &a, const Vertex &b) { return get<0>(a) < get<0>(b); }); - std::sort(begin(edges), end(edges), [](const Edge &a, const Edge & b) { + std::sort(begin(edges), end(edges), [](const Edge &a, const Edge &b) { return get<0>(a) < get<0>(b); }); - unsigned int n = std::max(vertices.empty() ? 0 : get<0>(vertices.back()), edges.empty() ? 0 : get<0>(edges.back())); + const auto n = vertices.size() + edges.size(); std::vector used(n, false); for(const auto &v : vertices) { - unsigned int id = get<0>(v); + const auto id = get<0>(v); + if(id >= n) { + err << "Parsed data is corrupt, vertex id " << id << " is out of range (n=" << n << ")." << std::endl; + return nullptr; + } if(used[id]) { - err << "Parsed data is corrupt, id " << id << " is duplicated." << std::endl; + err << "Parsed data is corrupt, vertex id " << id << " is duplicated." << std::endl; return nullptr; } used[id] = true; } for(const auto &e : edges) { - unsigned int id = get<0>(e); + const auto id = get<0>(e); + if(id >= n) { + err << "Parsed data is corrupt, edge id " << id << " is out of range (n=" << n << ")." << std::endl; + return nullptr; + } if(used[id]) { - err << "Parsed data is corrupt, id " << id << " is duplicated." << std::endl; + err << "Parsed data is corrupt, edge id " << id << " is duplicated." << std::endl; return nullptr; } used[id] = true; @@ -269,29 +311,33 @@ NonHyper *load(const std::vector > &graphs, const return nullptr; } } - return new NonHyperDump(graphs, ConstructionData{rules, std::move(vertices), rulesParsed, edges}); + return std::make_unique( + graphs, + ConstructionData{rules, std::move(vertices), std::move(rulesParsed), std::move(edges)}); } -void write(const NonHyper &dgNonHyper, std::ostream & s) { +void write(const NonHyper &dgNonHyper, std::ostream &s) { if(dgNonHyper.getLabelSettings().withStereo) { throw mod::LogicError("Can not yet dump DGs with stereo data."); } using Vertex = lib::DG::HyperVertex; using Edge = lib::DG::HyperEdge; using VertexKind = lib::DG::HyperVertexKind; - const lib::DG::HyperGraphType &dg = dgNonHyper.getHyper().getGraph(); - unsigned int numVertices = 0, numEdges = 0; + const auto &dgHyper = dgNonHyper.getHyper(); + const auto &dg = dgHyper.getGraph(); + int numVertices = 0, numEdges = 0; for(const auto v : asRange(vertices(dg))) { if(dg[v].kind == VertexKind::Vertex) numVertices++; else numEdges++; } - std::set rules; + std::set rules; for(const auto v : asRange(vertices(dg))) { if(dg[v].kind != VertexKind::Edge) continue; - for(const auto *r : dg[v].rules) rules.insert(r); + for(const auto *r : dgHyper.getRulesFromEdge(v)) + rules.insert(r); } s << "version:\t2\n"; @@ -312,8 +358,10 @@ void write(const NonHyper &dgNonHyper, std::ostream & s) { for(const auto v : asRange(vertices(dg))) { if(dg[v].kind != VertexKind::Edge) continue; const auto id = get(boost::vertex_index_t(), dg, v); - s << "edge:\t" << id << "\t" << dg[v].rules.size(); - for(const auto *r : dg[v].rules) s << " " << r->getId(); + const auto &rules = dgHyper.getRulesFromEdge(v); + s << "edge:\t" << id << "\t" << rules.size(); + for(const auto *r : rules) + s << " " << r->getId(); s << "\t"; std::vector coefs; @@ -337,4 +385,4 @@ void write(const NonHyper &dgNonHyper, std::ostream & s) { } // namespace Dump } // namespace DG } // namespace lib -} // namespace mod +} // namespace mod \ No newline at end of file diff --git a/libs/libmod/src/mod/lib/DG/Dump.hpp b/libs/libmod/src/mod/lib/DG/Dump.hpp new file mode 100644 index 0000000..bc23a2c --- /dev/null +++ b/libs/libmod/src/mod/lib/DG/Dump.hpp @@ -0,0 +1,29 @@ +#ifndef MOD_LIB_DG_DUMP_H +#define MOD_LIB_DG_DUMP_H + +#include +#include + +#include +#include +#include +#include + +namespace mod { +namespace lib { +namespace DG { +class NonHyper; +namespace Dump { + +std::unique_ptr load(const std::vector > &graphs, + const std::vector > &rules, + const std::string &file, + std::ostream &err); +void write(const NonHyper &dg, std::ostream &s); + +} // namespace Dump +} // namespace DG +} // namespace lib +} // namespace mod + +#endif /* MOD_LIB_DG_DUMP_H */ \ No newline at end of file diff --git a/src/mod/lib/DG/GraphDecl.h b/libs/libmod/src/mod/lib/DG/GraphDecl.hpp similarity index 62% rename from src/mod/lib/DG/GraphDecl.h rename to libs/libmod/src/mod/lib/DG/GraphDecl.hpp index b1f32f4..1cc2b8d 100644 --- a/src/mod/lib/DG/GraphDecl.h +++ b/libs/libmod/src/mod/lib/DG/GraphDecl.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_DG_GRAPHDECL_H #define MOD_LIB_DG_GRAPHDECL_H -#include +#include #include @@ -22,6 +22,13 @@ using NonHyperVertex = boost::graph_traits::vertex_descriptor using NonHyperEdge = boost::graph_traits::edge_descriptor; using GraphMultiset = lib::Graph::Multiset; +// Hyper +struct HyperVProp; +using HyperGraphType = boost::adjacency_list; +using HyperVertex = boost::graph_traits::vertex_descriptor; +using HyperEdge = boost::graph_traits::edge_descriptor; + +// NonHyper struct NonHyperVProp { NonHyperVProp() = default; public: @@ -29,30 +36,38 @@ struct NonHyperVProp { }; struct NonHyperEProp { - std::vector rules; + HyperVertex hyper // the representative of this hyperedge + = boost::graph_traits::null_vertex(); // initialized to prevent GCC warning + std::vector rules; boost::optional reverse; }; -// Hyper -struct HyperVProp; -using HyperGraphType = boost::adjacency_list; -using HyperVertex = boost::graph_traits::vertex_descriptor; -using HyperEdge = boost::graph_traits::edge_descriptor; +struct NonHyperEdgeHash { + NonHyperEdgeHash(const NonHyperGraphType &dg) : dg(&dg) {} + std::size_t operator()(NonHyperEdge e) const { + std::size_t hash = get(boost::vertex_index_t(), *dg, source(e, *dg)); + boost::hash_combine(hash, get(boost::vertex_index_t(), *dg, target(e, *dg))); + return hash; + } + +private: + const NonHyperGraphType *dg; +}; + +// Hyper enum class HyperVertexKind { Vertex, Edge }; struct HyperVProp { HyperVertexKind kind; - const lib::Graph::Single *graph; // != nullptr <=> the vertex is a hyper vertex - std::vector rules; // not empty => the vertex is a hyper edge, but it may be empty otherwise - NonHyperVertex inVertex, outVertex; // only defined for kind == Edge - HyperVertex reverse; // == null_vertex() <=> no reverse, only defined for kind == Edge + const lib::Graph::Single *graph; // only defined for kind == Vertex + NonHyperEdge edge; // only defined for kind == Edge }; } // namespace DG } // namespace lib } // namespace mod -#endif /* MOD_LIB_DG_GRAPHDECL_H */ \ No newline at end of file +#endif /* MOD_LIB_DG_GRAPHDECL_H */ diff --git a/src/mod/lib/DG/Hyper.cpp b/libs/libmod/src/mod/lib/DG/Hyper.cpp similarity index 70% rename from src/mod/lib/DG/Hyper.cpp rename to libs/libmod/src/mod/lib/DG/Hyper.cpp index 5fd68b1..fafd880 100644 --- a/src/mod/lib/DG/Hyper.cpp +++ b/libs/libmod/src/mod/lib/DG/Hyper.cpp @@ -1,15 +1,15 @@ -#include "Hyper.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Hyper.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -23,7 +23,7 @@ namespace DG { // HyperCreator //------------------------------------------------------------------------------ -HyperCreator::HyperCreator(Hyper &hyper) : owner(&hyper) { } +HyperCreator::HyperCreator(Hyper &hyper) : owner(&hyper) {} HyperCreator::HyperCreator(HyperCreator &&other) : owner(other.owner) { other.owner = nullptr; @@ -52,10 +52,7 @@ HyperVertex HyperCreator::addEdge(NonHyper::Edge eNon) { Hyper::Vertex v = add_vertex(hyper); hyper[v].kind = HyperVertexKind::Edge; hyper[v].graph = nullptr; - hyper[v].rules = dg[eNon].rules; - hyper[v].inVertex = vSrcNon; - hyper[v].outVertex = vTarNon; - hyper[v].reverse = hyper.null_vertex(); + hyper[v].edge = eNon; { // source edges for(const lib::Graph::Single *g : dg[vSrcNon].graphs) { @@ -73,33 +70,12 @@ HyperVertex HyperCreator::addEdge(NonHyper::Edge eNon) { return v; } -void HyperCreator::addRuleToEdge(NonHyper::Edge eNon, const lib::Rules::Real *r) { - assert(owner); - assert(r); - auto &hyper = owner->hyper; - const auto v = owner->getNonHyper().findHyperEdge(eNon); - assert(v != hyper.null_vertex()); - hyper[v].rules.push_back(r); -} - -void HyperCreator::setReverse(NonHyper::Edge e, NonHyper::Edge eBack) { - assert(owner); - const auto &dg = owner->nonHyper.getGraphDuringCalculation(); - auto &hyper = owner->hyper; - assert(dg[e].reverse); - const auto eHyper = owner->nonHyper.findHyperEdge(e); - const auto eBackHyper = owner->nonHyper.findHyperEdge(eBack); - assert(eHyper != hyper.null_vertex()); - assert(eBackHyper != hyper.null_vertex()); - hyper[eHyper].reverse = eBackHyper; -} - //------------------------------------------------------------------------------ // Hyper //------------------------------------------------------------------------------ Hyper::Hyper(const NonHyper &dg) -: hasCalculated(false), nonHyper(dg) { } + : hasCalculated(false), nonHyper(dg) { } std::pair, HyperCreator> Hyper::makeHyper(const NonHyper &dg) { auto hyper = std::unique_ptr(new Hyper(dg)); @@ -172,22 +148,18 @@ std::pair, HyperCreator> Hyper::makeHyper(const NonHyper void Hyper::addVertex(const lib::Graph::Single *g) { { // sanity check -#ifndef NDEBUG - std::shared_ptr gAPI = g->getAPIReference(); - const auto iter = nonHyper.getGraphDatabase().find(gAPI); - assert(iter != nonHyper.getGraphDatabase().end()); -#endif + assert(nonHyper.getGraphDatabase().contains(g->getAPIReference())); } - std::map::iterator idIter = graphToHyperVertex.find(g); + std::map::iterator idIter = graphToHyperVertex.find(g); if(idIter == graphToHyperVertex.end()) { // create the vertex Vertex vNew = add_vertex(hyper); - hyper[vNew].kind = VertexKind::Vertex; + hyper[vNew].kind = HyperVertexKind::Vertex; hyper[vNew].graph = g; graphToHyperVertex[g] = vNew; } } -Hyper::~Hyper() { } +Hyper::~Hyper() {} const NonHyper &Hyper::getNonHyper() const { return nonHyper; @@ -212,9 +184,9 @@ void Hyper::printStats(std::ostream &s) const { unsigned int projectedNumTransitCollapseNonReverse = 0; for(Vertex v : asRange(vertices(hyper))) { - if(hyper[v].kind != VertexKind::Vertex) { + if(hyper[v].kind != HyperVertexKind::Vertex) { numEdges++; - if(hyper[v].reverse != hyper.null_vertex()) numEdgePairs++; + if(getReverseEdge(v) != hyper.null_vertex()) numEdgePairs++; continue; } numVerts++; @@ -222,11 +194,17 @@ void Hyper::printStats(std::ostream &s) const { countNumIn[in_degree(v, hyper)]++; numOut += out_degree(v, hyper); countNumOut[out_degree(v, hyper)]++; - for(Edge e : asRange(out_edges(v, hyper))) if(hyper[target(e, hyper)].reverse != hyper.null_vertex()) numReverse++; + for(Edge e : asRange(out_edges(v, hyper))) + if(getReverseEdge(target(e, hyper)) != hyper.null_vertex()) + numReverse++; unsigned int numInReverse = 0; - for(Edge e : asRange(in_edges(v, hyper))) if(hyper[source(e, hyper)].reverse != hyper.null_vertex()) numInReverse++; + for(Edge e : asRange(in_edges(v, hyper))) + if(getReverseEdge(source(e, hyper)) != hyper.null_vertex()) + numInReverse++; unsigned int numOutReverse = 0; - for(Edge e : asRange(out_edges(v, hyper))) if(hyper[target(e, hyper)].reverse != hyper.null_vertex()) numOutReverse++; + for(Edge e : asRange(out_edges(v, hyper))) + if(getReverseEdge(target(e, hyper)) != hyper.null_vertex()) + numOutReverse++; if(in_degree(v, hyper) > 0) { avgInReverseRatio += numInReverse / (double) in_degree(v, hyper); } @@ -237,10 +215,10 @@ void Hyper::printStats(std::ostream &s) const { avgOutReverseRatioWithVirtual += (numOutReverse + 1) / (double) (out_degree(v, hyper) + 1); if(in_degree(v, hyper) >= 10 || out_degree(v, hyper) >= 10) { s << "DG\t|in| = " << in_degree(v, hyper) << ", |out| = " << out_degree(v, hyper) - << "\t" << hyper[v].graph->getName() << std::endl; + << "\t" << hyper[v].graph->getName() << std::endl; s << "\t" << numInReverse << " inReverse, " << numOutReverse << " outReverse" << std::endl; } - projectedNumTransit += (numInReverse + 2)*(numOutReverse + 2); + projectedNumTransit += (numInReverse + 2) * (numOutReverse + 2); auto invAdjIters = asRange(inv_adjacent_vertices(v, hyper)); std::unordered_set uniqueIn(begin(invAdjIters), end(invAdjIters)); @@ -250,10 +228,10 @@ void Hyper::printStats(std::ostream &s) const { unsigned int localNumUniqueInOnlyReverse = 1; // +1 from the virtual input/output edges unsigned int localNumUniqueOutOnlyReverse = 1; for(Vertex eIn : asRange(inv_adjacent_vertices(v, hyper))) { - if(hyper[eIn].reverse != hyper.null_vertex()) localNumUniqueInOnlyReverse++; + if(getReverseEdge(eIn) != hyper.null_vertex()) localNumUniqueInOnlyReverse++; } for(Vertex eOut : asRange(adjacent_vertices(v, hyper))) { - if(hyper[eOut].reverse != hyper.null_vertex()) localNumUniqueOutOnlyReverse++; + if(getReverseEdge(eOut) != hyper.null_vertex()) localNumUniqueOutOnlyReverse++; } assert(localNumUniqueInOnlyReverse == localNumUniqueOutOnlyReverse); // right? numUniqueInOnlyReverse += localNumUniqueInOnlyReverse; @@ -282,8 +260,8 @@ void Hyper::printStats(std::ostream &s) const { s << "Stat--------------------------------------------------------------" << std::endl; s << "numVerts:\t" << numVerts << std::endl << "numIn:\t\t" << numIn << std::endl - << "numOut:\t\t" << numOut << std::endl << "numReverse:\t" << numReverse << std::endl - << "numEdges:\t" << numEdges << std::endl << "numEdgePairs:\t" << numEdgePairs << std::endl; + << "numOut:\t\t" << numOut << std::endl << "numReverse:\t" << numReverse << std::endl + << "numEdges:\t" << numEdges << std::endl << "numEdgePairs:\t" << numEdgePairs << std::endl; s << "out/vert:\t" << (numOut / ((double) numVerts)) << std::endl; s << "in/vert:\t" << (numIn / ((double) numVerts)) << std::endl; s << "reverse/vert:\t" << (numReverse / ((double) numVerts)) << std::endl; @@ -331,95 +309,48 @@ Hyper::Vertex Hyper::getVertexFromGraph(const lib::Graph::Single *g) const { return iter->second; } +Hyper::Vertex Hyper::getReverseEdge(Vertex e) const { + assert(hyper[e].kind == HyperVertexKind::Edge); + const auto &dgNon = getNonHyper().getGraph(); + const auto eNonReverse = dgNon[hyper[e].edge].reverse; + if(eNonReverse) + return dgNon[*eNonReverse].hyper; + else + return hyper.null_vertex(); +} + +const std::vector &Hyper::getRulesFromEdge(Vertex e) const { + assert(hyper[e].kind == HyperVertexKind::Edge); + const auto &dgNon = getNonHyper().getGraph(); + return dgNon[hyper[e].edge].rules; +} + dg::DG::Vertex Hyper::getInterfaceVertex(Vertex v) const { if(v == hyper.null_vertex()) return dg::DG::Vertex(); - assert(hyper[v].kind == VertexKind::Vertex); + assert(hyper[v].kind == HyperVertexKind::Vertex); return dg::DG::Vertex(getNonHyper().getAPIReference(), get(boost::vertex_index_t(), getGraph(), v)); } dg::DG::HyperEdge Hyper::getInterfaceEdge(Vertex e) const { if(e == hyper.null_vertex()) return dg::DG::HyperEdge(); - assert(hyper[e].kind == VertexKind::Edge); + assert(hyper[e].kind == HyperVertexKind::Edge); return dg::DG::HyperEdge(getNonHyper().getAPIReference(), get(boost::vertex_index_t(), getGraph(), e)); } mod::Derivation Hyper::getDerivation(Vertex v) const { assert(v != hyper.null_vertex()); - assert(hyper[v].kind == VertexKind::Edge); + assert(hyper[v].kind == HyperVertexKind::Edge); Derivation d; for(Vertex vIn : asRange(inv_adjacent_vertices(v, hyper))) d.left.push_back(hyper[vIn].graph->getAPIReference()); - if(!hyper[v].rules.empty()) { - d.r = hyper[v].rules.front()->getAPIReference(); - } + const auto &rules = getRulesFromEdge(v); + if(!rules.empty()) + d.r = rules.front()->getAPIReference(); for(Vertex vOut : asRange(adjacent_vertices(v, hyper))) d.right.push_back(hyper[vOut].graph->getAPIReference()); return d; } -void Hyper::temp_compare(const Hyper &a, const Hyper &b) { - const auto &dgHyperA = a.getGraph(); - const auto &dgHyperB = b.getGraph(); - if(num_vertices(dgHyperA) != num_vertices(dgHyperB)) { - MOD_ABORT; - } - std::vector verticesA(vertices(dgHyperA).first, vertices(dgHyperA).second); - std::vector verticesB(vertices(dgHyperB).first, vertices(dgHyperB).second); - std::stable_partition(begin(verticesA), end(verticesA), [&dgHyperA](Vertex v) { - return dgHyperA[v].kind == VertexKind::Vertex; - }); - std::stable_partition(begin(verticesB), end(verticesB), [&dgHyperB](Vertex v) { - return dgHyperB[v].kind == VertexKind::Vertex; - }); - std::map vMapA, vMapB; - for(std::size_t i = 0; i < verticesA.size(); i++) vMapA[verticesA[i]] = i; - for(std::size_t i = 0; i < verticesB.size(); i++) vMapB[verticesB[i]] = i; - auto vIterA = begin(verticesA); - auto vIterB = begin(verticesB); - for(; vIterA != end(verticesA); vIterA++, vIterB++) { - Vertex vA = *vIterA, vB = *vIterB; - const auto &pA = dgHyperA[vA]; - const auto &pB = dgHyperB[vB]; - if(pA.kind != pB.kind) { - MOD_ABORT; - } - if(pA.graph != pB.graph) { - MOD_ABORT; - } - assert(pA.rules.size() == 1); - assert(pB.rules.size() == 1); - if(pA.rules.front() != pB.rules.front()) { - MOD_ABORT; - } - if(pA.kind == VertexKind::Edge) { - if(pA.inVertex != pB.inVertex) { - MOD_ABORT; - } - if(pA.outVertex != pB.outVertex) { - MOD_ABORT; - } - if(vMapA[pA.reverse] != vMapB[pB.reverse]) { - IO::log() << pA.reverse << " -> " << vMapA[pA.reverse] << " != " << vMapB[pB.reverse] << " <- " << pB.reverse << std::endl; - MOD_ABORT; - } - } - } - if(num_edges(dgHyperA) != num_edges(dgHyperB)) { - MOD_ABORT; - } - auto eIterA = edges(dgHyperA); - auto eIterB = edges(dgHyperB); - for(; eIterA.first != eIterA.second; eIterA.first++, eIterB.first++) { - Edge eA = *eIterA.first, eB = *eIterB.first; - if(vMapA[source(eA, dgHyperA)] != vMapB[source(eB, dgHyperB)]) { - MOD_ABORT; - } - if(vMapA[target(eA, dgHyperA)] != vMapB[target(eB, dgHyperB)]) { - MOD_ABORT; - } - } -} - } // namespace DG } // namespace lib } // namespace mod diff --git a/src/mod/lib/DG/Hyper.h b/libs/libmod/src/mod/lib/DG/Hyper.hpp similarity index 67% rename from src/mod/lib/DG/Hyper.h rename to libs/libmod/src/mod/lib/DG/Hyper.hpp index 0d2e6f8..1f52b3d 100644 --- a/src/mod/lib/DG/Hyper.h +++ b/libs/libmod/src/mod/lib/DG/Hyper.hpp @@ -1,12 +1,13 @@ #ifndef MOD_LIB_DG_HYPER_H #define MOD_LIB_DG_HYPER_H -#include -#include -#include +#include +#include +#include namespace mod { -template class Function; +template +class Function; namespace lib { namespace Graph { class Single; @@ -14,10 +15,11 @@ class Single; namespace DG { class HyperCreator { - HyperCreator(const HyperCreator&) = delete; - HyperCreator &operator=(const HyperCreator&) = delete; + HyperCreator(const HyperCreator &) = delete; + HyperCreator &operator=(const HyperCreator &) = delete; public: friend class Hyper; + private: HyperCreator() = default; explicit HyperCreator(Hyper &hyper); @@ -27,25 +29,23 @@ class HyperCreator { ~HyperCreator(); void addVertex(const lib::Graph::Single *g); HyperVertex addEdge(NonHyper::Edge eNon); - void addRuleToEdge(NonHyper::Edge eNon, const lib::Rules::Real *r); - void setReverse(NonHyper::Edge e, NonHyper::Edge eBack); private: Hyper *owner = nullptr; }; class Hyper { - Hyper(const Hyper&) = delete; - Hyper(Hyper&&) = delete; - Hyper &operator=(const Hyper&) = delete; - Hyper &operator=(Hyper&&) = delete; + Hyper(const Hyper &) = delete; + Hyper(Hyper &&) = delete; + Hyper &operator=(const Hyper &) = delete; + Hyper &operator=(Hyper &&) = delete; public: // bipartite representation using GraphType = HyperGraphType; using Vertex = HyperVertex; using Edge = HyperEdge; - using VertexKind = HyperVertexKind; private: friend class HyperCreator; + Hyper(const NonHyper &dg); public: static std::pair, HyperCreator> makeHyper(const NonHyper &dg); @@ -61,6 +61,11 @@ class Hyper { Vertex getVertexOrNullFromGraph(const lib::Graph::Single *g) const; // requires: isVertexGraph(g) Vertex getVertexFromGraph(const lib::Graph::Single *g) const; + // requires: getGraph()[e].kind == HyperVertexKind::Edge + // returns null_vertex is no reverse exists, or the data has not been initialized yet + Vertex getReverseEdge(Vertex e) const; + // requires: getGraph()[e].kind == HyperVertexKind::Edge + const std::vector &getRulesFromEdge(Vertex e) const; public: dg::DG::Vertex getInterfaceVertex(Vertex v) const; dg::DG::HyperEdge getInterfaceEdge(Vertex e) const; @@ -71,9 +76,7 @@ class Hyper { const NonHyper &nonHyper; GraphType hyper; private: - std::map graphToHyperVertex; -public: - static void temp_compare(const Hyper &a, const Hyper &b); + std::map graphToHyperVertex; }; } // namespace DG diff --git a/src/mod/lib/DG/NonHyper.cpp b/libs/libmod/src/mod/lib/DG/NonHyper.cpp similarity index 57% rename from src/mod/lib/DG/NonHyper.cpp rename to libs/libmod/src/mod/lib/DG/NonHyper.cpp index fce2ff7..c25e134 100644 --- a/src/mod/lib/DG/NonHyper.cpp +++ b/libs/libmod/src/mod/lib/DG/NonHyper.cpp @@ -1,25 +1,25 @@ -#include "NonHyper.h" +#include "NonHyper.hpp" // for debugging -#include -#include +#include +#include // end for debugging -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -36,33 +36,36 @@ std::size_t nextDGNum = 0; }// namespace NonHyper::NonHyper(const std::vector > &graphDatabase, LabelSettings labelSettings) -: id(nextDGNum++), labelSettings(labelSettings) { + : id(nextDGNum++), + labelSettings(labelSettings), + graphDatabase(labelSettings, getConfig().graph.isomorphismAlg.get()) { if(getConfig().dg.skipInitialGraphIsomorphismCheck.get()) { - for(std::shared_ptr gCand : graphDatabase) this->graphDatabase.insert(gCand); + for(const auto gCand : graphDatabase) + this->graphDatabase.trustInsert(gCand); } else { - const auto ls = LabelSettings{this->labelSettings.type, LabelRelation::Isomorphism, this->labelSettings.withStereo, LabelRelation::Isomorphism}; - for(std::shared_ptr gCand : graphDatabase) { - for(const auto &g : this->graphDatabase) { - if(g == gCand) break; - const bool equal = gCand->isomorphism(g, 1, ls); - if(equal) { - std::string msg = "Isomorphic graphs '" + g->getName() + "' and '" + gCand->getName() + "' in initial graph database."; - throw LogicError(std::move(msg)); - } - } + const auto ls = LabelSettings{this->labelSettings.type, LabelRelation::Isomorphism, + this->labelSettings.withStereo, LabelRelation::Isomorphism}; + for(const auto gCand : graphDatabase) { if(ls.type == LabelType::Term) { const auto &term = get_term(gCand->getGraph().getLabelledGraph()); if(!isValid(term)) { - std::string msg = "Parsing failed for graph '" + gCand->getName() + "' in graph database. " + term.getParsingError(); + std::string msg = "Parsing failed for graph '" + gCand->getName() + + "' in graph database. " + term.getParsingError(); throw TermParsingError(std::move(msg)); } } - this->graphDatabase.insert(gCand); + const auto gp = this->graphDatabase.tryInsert(gCand); + // we don't care if the user gives the same graph multiple times + if(gp.first != gCand) { + std::string msg = "Isomorphic graphs '" + gp.first->getName() + "' and '" + gCand->getName() + + "' in initial graph database."; + throw LogicError(std::move(msg)); + } } } } -NonHyper::~NonHyper() { } +NonHyper::~NonHyper() {} std::size_t NonHyper::getId() const { return id; @@ -98,11 +101,6 @@ void NonHyper::calculateEpilogue() { findReversiblePairs(); hyperCreator.reset(); hasCalculated = true; - // make a nicer hyper graph - // p.first = std::move(hyper); - // hyper.reset(new Hyper(*this, 0)); - // HyperCreator(std::move(p.second)); // just to lock it before compare, remove with it - // Hyper::temp_compare(*p.first, *hyper); } void NonHyper::calculate(bool printInfo) { @@ -119,69 +117,54 @@ bool NonHyper::getHasCalculated() const { return hasCalculated; } -bool NonHyper::tryAddGraph(std::shared_ptr gCand) { +void NonHyper::tryAddGraph(std::shared_ptr gCand) { if(getHasCalculated()) std::abort(); - const auto ls = LabelSettings{getLabelSettings().type, LabelRelation::Isomorphism, getLabelSettings().withStereo, LabelRelation::Isomorphism}; - for(const auto &g : getGraphDatabase()) { - if(g == gCand) break; - const bool equal = gCand->isomorphism(g, 1, ls); - if(equal) { - std::string msg = "Isomorphic graphs '" + g->getName() + "' and '" + gCand->getName() + "' in initial graph database and/or add strategies."; - throw LogicError(std::move(msg)); - } - } + const auto ls = LabelSettings{ + getLabelSettings().type, + LabelRelation::Isomorphism, + getLabelSettings().withStereo, + LabelRelation::Isomorphism}; if(ls.type == LabelType::Term) { const auto &term = get_term(gCand->getGraph().getLabelledGraph()); if(!isValid(term)) { - std::string msg = "Parsing failed for graph '" + gCand->getName() + "' in dynamic add strategy. " + term.getParsingError(); + std::string msg = "Parsing failed for graph '" + gCand->getName() + "' in dynamic add strategy. " + + term.getParsingError(); throw TermParsingError(std::move(msg)); } } - return addGraph(gCand); + const auto gp = this->graphDatabase.tryInsert(gCand); + // we don't care if the user gives the same graph multiple times + if(gp.first != gCand) { + std::string msg = "Isomorphic graphs '" + gp.first->getName() + "' and '" + gCand->getName() + + "' in initial graph database."; + throw LogicError(std::move(msg)); + } } -bool NonHyper::addGraph(std::shared_ptr g) { +bool NonHyper::trustAddGraph(std::shared_ptr g) { if(getHasCalculated()) std::abort(); - return graphDatabase.insert(g).second; + return graphDatabase.trustInsert(g); } -bool NonHyper::addGraphAsVertex(std::shared_ptr g) { +bool NonHyper::trustAddGraphAsVertex(std::shared_ptr g) { if(getHasCalculated()) std::abort(); - bool inserted = addGraph(g); + bool inserted = trustAddGraph(g); getVertex(GraphMultiset(&g->getGraph())); return inserted; } std::pair, bool> NonHyper::checkIfNew(std::unique_ptr gCand) const { assert(gCand); - const auto labelSettings = LabelSettings{this->labelSettings.type, LabelRelation::Isomorphism, this->labelSettings.withStereo, LabelRelation::Isomorphism}; - for(const std::shared_ptr &g : graphDatabase) { - const bool iso = lib::Graph::Single::isomorphic(*gCand, g->getGraph(), labelSettings); - if(iso) { - // if(getConfig().dg.calculateDetailsVerbose.get()) { - // IO::log() << "Discarding product " << gCand->getName() << ", isomorphic to " << g->getName() << std::endl; - // IO::log() << "\tLabelSettings: withStereo=" << std::boolalpha << this->labelSettings.withStereo << std::endl; - // mod::postSection("Discarded"); - // mod::lib::IO::Graph::Write::Options opts, optsGraph; - // opts.edgesAsBonds = opts.withIndex = true; - // optsGraph.collapseHydrogens = optsGraph.edgesAsBonds = optsGraph.raiseCharges = true; - // optsGraph.simpleCarbons = optsGraph.withColour = optsGraph.withIndex = true; - // mod::lib::IO::Graph::Write::summary(*gCand, optsGraph, optsGraph); - // std::shared_ptr gCandWrapped = graph::Graph::makeGraph(std::move(gCand)); - // for(auto v : gCandWrapped->vertices()) { - // if(v.getStringLabel() == "C") - // v.printStereo(); - // } - // } - return std::make_pair(g, false); - } + { + const auto g = graphDatabase.findIsomorphic(gCand.get()); + if(g) return {g, false}; } std::shared_ptr g = graph::Graph::makeGraph(std::move(gCand)); - return std::make_pair(g, true); + return {g, true}; } void NonHyper::giveProductStatus(std::shared_ptr g) { - assert(std::find(begin(graphDatabase), end(graphDatabase), g) != end(graphDatabase)); + assert(graphDatabase.contains(g)); std::string name = "p_{"; name += boost::lexical_cast(getId()); @@ -203,12 +186,14 @@ void NonHyper::giveProductStatus(std::shared_ptr g) { bool NonHyper::addProduct(std::shared_ptr g) { assert(g); - bool isNewGraph = addGraph(g); + bool isNewGraph = trustAddGraph(g); if(isNewGraph) giveProductStatus(g); return isNewGraph; } -std::pair < NonHyper::Edge, bool> NonHyper::isDerivation(const GraphMultiset &gmsSrc, const GraphMultiset &gmsTar, const lib::Rules::Real *r) const { +std::pair NonHyper::isDerivation(const GraphMultiset &gmsSrc, + const GraphMultiset &gmsTar, + const lib::Rules::Real *r) const { const auto iterLeft = multisetToVertex.find(gmsSrc); if(iterLeft == end(multisetToVertex)) return std::make_pair(Edge(), false); const auto iterRight = multisetToVertex.find(gmsTar); @@ -216,26 +201,22 @@ std::pair < NonHyper::Edge, bool> NonHyper::isDerivation(const GraphMultiset &gm return edge(iterLeft->second, iterRight->second, dg); } -std::pair NonHyper::suggestDerivation(const GraphMultiset &gmsSrc, const GraphMultiset &gmsTar, const lib::Rules::Real *r) { +std::pair NonHyper::suggestDerivation( + const GraphMultiset &gmsSrc, const GraphMultiset &gmsTar, const lib::Rules::Real *r) { // make vertices for to and from Vertex vSrc = getVertex(gmsSrc), vTar = getVertex(gmsTar); std::pair e = edge(vSrc, vTar, dg); - if(!e.second) { + if(!e.second) { // note: add_edge does not yet support rvalue refs, so we modify later e = add_edge(vSrc, vTar, dg); if(r) dg[e.first].rules.push_back(r); - const auto vHyper = hyperCreator->addEdge(e.first); - const auto inserted = edgeToHyper.emplace(e.first, vHyper); - assert(inserted.second); - (void) inserted; + dg[e.first].hyper = hyperCreator->addEdge(e.first); } else { e.second = false; if(r) { auto &rules = dg[e.first].rules; auto iter = std::find(rules.begin(), rules.end(), r); - if(iter == rules.end()) { + if(iter == rules.end()) rules.push_back(r); - hyperCreator->addRuleToEdge(e.first, r); - } } } return e; @@ -261,10 +242,8 @@ void NonHyper::findReversiblePairs() { Vertex vSource = source(e, dg); Vertex vTarget = target(e, dg); for(Edge eBack : asRange(out_edges(vTarget, dg))) { - if(target(eBack, dg) == vSource) { + if(target(eBack, dg) == vSource) dg[e].reverse = eBack; - hyperCreator->setReverse(e, eBack); - } } } } @@ -283,7 +262,7 @@ const Hyper &NonHyper::getHyper() const { return *hyper; } -const NonHyper::GraphDatabase &NonHyper::getGraphDatabase() const { +const Graph::Collection &NonHyper::getGraphDatabase() const { return graphDatabase; } @@ -297,45 +276,42 @@ void NonHyper::print() const { IO::post() << "summaryDGNonHyper \"dg_" << getId() << "\" \"" << fileNoExt << "\"" << std::endl; } -HyperVertex NonHyper::findHyperEdge(Edge e) const { - const auto iter = edgeToHyper.find(e); - return iter == end(edgeToHyper) ? HyperGraphType::null_vertex() : iter->second; +HyperVertex NonHyper::getHyperEdge(Edge e) const { + return dg[e].hyper; } -HyperVertex NonHyper::findHyperEdge(const std::vector &sources, const std::vector &targets) const { - const auto &dg = getHyper().getGraph(); - for(auto v : sources) assert(dg[v].kind == HyperVertexKind::Vertex); - for(auto v : targets) assert(dg[v].kind == HyperVertexKind::Vertex); +HyperVertex NonHyper::findHyperEdge(const std::vector &sources, + const std::vector &targets) const { + const auto &dgHyper = getHyper().getGraph(); +#ifndef NDEBUG + for(auto v : sources) assert(dgHyper[v].kind == HyperVertexKind::Vertex); + for(auto v : targets) assert(dgHyper[v].kind == HyperVertexKind::Vertex); +#endif - std::vector srcGraphs, tarGraphs; + std::vector srcGraphs, tarGraphs; srcGraphs.reserve(sources.size()); tarGraphs.reserve(targets.size()); - for(const auto v : sources) srcGraphs.push_back(dg[v].graph); - for(const auto v : targets) tarGraphs.push_back(dg[v].graph); + for(const auto v : sources) srcGraphs.push_back(dgHyper[v].graph); + for(const auto v : targets) tarGraphs.push_back(dgHyper[v].graph); GraphMultiset gmsSrc(std::move(srcGraphs)), gmsTar(std::move(tarGraphs)); const auto iterSrc = multisetToVertex.find(gmsSrc); - if(iterSrc == end(multisetToVertex)) return boost::graph_traits::null_vertex(); + if(iterSrc == end(multisetToVertex)) + return boost::graph_traits::null_vertex(); const auto iterTar = multisetToVertex.find(gmsTar); - if(iterTar == end(multisetToVertex)) return boost::graph_traits::null_vertex(); + if(iterTar == end(multisetToVertex)) + return boost::graph_traits::null_vertex(); const auto vSrc = iterSrc->second, vTar = iterTar->second; - const std::pair p = edge(vSrc, vTar, getGraph()); - if(!p.second) return boost::graph_traits::null_vertex(); - const HyperGraphType &dgHyper = getHyper().getGraph(); - for(const auto v : asRange(vertices(dgHyper))) { - if(dgHyper[v].kind != HyperVertexKind::Edge) continue; - if(dgHyper[v].inVertex == vSrc && dgHyper[v].outVertex == vTar) { - return v; - } - } - // the edge must be there by now - MOD_ABORT; + const std::pair p = edge(vSrc, vTar, dg); + if(!p.second) + return boost::graph_traits::null_vertex(); + return dg[p.first].hyper; } void NonHyper::diff(const NonHyper &dg1, const NonHyper &dg2) { std::ostream &s = IO::log(); bool headerPrinted = false; - const auto printHeader = [&headerPrinted, &dg1, &dg2, &s] () -> std::ostream& { + const auto printHeader = [&headerPrinted, &dg1, &dg2, &s]() -> std::ostream & { if(headerPrinted) return s; else headerPrinted = true; s << "--- DG " << dg1.getId() << std::endl; @@ -347,9 +323,10 @@ void NonHyper::diff(const NonHyper &dg1, const NonHyper &dg2) { for(const auto v : dg1.getAPIReference()->vertices()) vertexGraphsUnique.insert(v.getGraph()); for(const auto v : dg2.getAPIReference()->vertices()) vertexGraphsUnique.insert(v.getGraph()); std::vector > vertexGraphs(begin(vertexGraphsUnique), end(vertexGraphsUnique)); - std::sort(begin(vertexGraphs), end(vertexGraphs), [] (std::shared_ptr g1, std::shared_ptr g2) { - return g1->getName() < g2->getName(); - }); + std::sort(begin(vertexGraphs), end(vertexGraphs), + [](std::shared_ptr g1, std::shared_ptr g2) { + return g1->getName() < g2->getName(); + }); for(const auto g : vertexGraphs) { const bool in1 = dg1.getHyper().isVertexGraph(&g->getGraph()); const bool in2 = dg2.getHyper().isVertexGraph(&g->getGraph()); @@ -382,11 +359,23 @@ void NonHyper::diff(const NonHyper &dg1, const NonHyper &dg2) { std::vector ders1 = makeDers(*dg1.getAPIReference()), ders2 = makeDers(*dg2.getAPIReference()); - const auto derLess = [](const Derivation &d1, const Derivation & d2) { - if(std::lexicographical_compare(begin(d1.left), end(d1.left), begin(d2.left), end(d2.left), graph::GraphLess())) return true; - else if(std::lexicographical_compare(begin(d2.left), end(d2.left), begin(d1.left), end(d1.left), graph::GraphLess())) return false; - if(std::lexicographical_compare(begin(d1.right), end(d1.right), begin(d2.right), end(d2.right), graph::GraphLess())) return true; - else if(std::lexicographical_compare(begin(d2.right), end(d2.right), begin(d1.right), end(d1.right), graph::GraphLess())) return false; + const auto derLess = [](const Derivation &d1, const Derivation &d2) { + if(std::lexicographical_compare(begin(d1.left), end(d1.left), + begin(d2.left), end(d2.left), + graph::GraphLess())) + return true; + else if(std::lexicographical_compare(begin(d2.left), end(d2.left), + begin(d1.left), end(d1.left), + graph::GraphLess())) + return false; + if(std::lexicographical_compare(begin(d1.right), end(d1.right), + begin(d2.right), end(d2.right), + graph::GraphLess())) + return true; + else if(std::lexicographical_compare(begin(d2.right), end(d2.right), + begin(d1.right), end(d1.right), + graph::GraphLess())) + return false; return d1.r->getId() < d2.r->getId(); }; std::sort(begin(ders1), end(ders1), derLess); diff --git a/src/mod/lib/DG/NonHyper.h b/libs/libmod/src/mod/lib/DG/NonHyper.hpp similarity index 61% rename from src/mod/lib/DG/NonHyper.h rename to libs/libmod/src/mod/lib/DG/NonHyper.hpp index eac160e..bc4ce2c 100644 --- a/src/mod/lib/DG/NonHyper.h +++ b/libs/libmod/src/mod/lib/DG/NonHyper.hpp @@ -1,11 +1,11 @@ #ifndef MOD_LIB_DG_NONHYPER_H #define MOD_LIB_DG_NONHYPER_H -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include @@ -32,8 +32,6 @@ class NonHyper { using GraphType = NonHyperGraphType; using Vertex = NonHyperVertex; using Edge = NonHyperEdge; -public: - using GraphDatabase = std::unordered_set >; protected: NonHyper(const std::vector > &graphDatabase, LabelSettings labelSettings); public: // general @@ -51,35 +49,48 @@ class NonHyper { bool getHasCalculated() const; protected: // calculation virtual void calculateImpl(bool printInfo) = 0; - // Uses addGraph, but uses isomorphism to check if it was already there. + // Overall Idea + // ------------ + // For a new generated graph: + // 1. Check for a new graph, by isomorphism with checkIfNew. + // 2. Then use trustAddGraph or trustAddGraphAsVertex to add without isomorphism check (but still pointer check). + // For given graphs: + // - Use tryAddGraph to add with isomorphism check. + // - Use trustAddGraph or trustAddGraphAsVertex to trustfully add it. + // ====================================================================================== + // Insert g in the database, unless an isomorphic graph is therein already. // If so, it throws LogicError. // If we are using terms it may throw TermParsingError as well. - bool tryAddGraph(std::shared_ptr g); - // adds the graph to the graph database - // returns true iff it was a new graph - bool addGraph(std::shared_ptr g); - // adds the graph to the database if it's not there already - // makes a vertex in the DG - // returns true iff it was a new graph - bool addGraphAsVertex(std::shared_ptr g); - // searches the database for the given graph - // if found, returns the found graph and false, additionally the given graph is deleted - // if not found, returns the given wrapped given graph and true - // does NOT change the graphDatabse + void tryAddGraph(std::shared_ptr g); + // Adds the graph to the graph database without isomorphism check. + // Returns true iff the graph object was not there already. + bool trustAddGraph(std::shared_ptr g); + // Uses trustAddGraph. + // Makes a vertex in the DG with the graph. + // Returns the value from trustAddGraph. + bool trustAddGraphAsVertex(std::shared_ptr g); + // Searches the database for the given graph by isomorphism. + // If found, returns the found graph and false, additionally the given graph is deleted. + // If not found, returns the given wrapped given graph and true. + // Does NOT change the graphDatabse. std::pair, bool> checkIfNew(std::unique_ptr g) const; - // gives a graph product status, i.e., rename it, put it in the product list and maybe print a status message + // Gives a graph product status, i.e., rename it, + // put it in the product list and maybe print a status message. void giveProductStatus(std::shared_ptr g); - // adds the graph to the database if it's not there already - // if it was not there, give it product status - // returns true iff it was given product status + // trustAddGraph and then giveProductStatus if it was a new graph. + // Returns the value from trustAddGraph. bool addProduct(std::shared_ptr g); // checks if this derivation already exists // if it does then the edge descriptor of that derivation is returned, otherwise the edge descriptor is bogus - std::pair isDerivation(const GraphMultiset &gmsSrc, const GraphMultiset &gmsTar, const lib::Rules::Real *r) const; + std::pair isDerivation(const GraphMultiset &gmsSrc, + const GraphMultiset &gmsTar, + const lib::Rules::Real *r) const; // adds a derivation if it does not exist already // the edge descriptor of the derivation is returned, along with the existence status before the call // the rule may be nullptr - std::pair suggestDerivation(const GraphMultiset &gmsSrc, const GraphMultiset &gmsTar, const lib::Rules::Real *r); + std::pair suggestDerivation(const GraphMultiset &gmsSrc, + const GraphMultiset &gmsTar, + const lib::Rules::Real *r); const GraphType &getGraphDuringCalculation() const; private: // calculation // adds the graph as a vertex, if it's not there already, and returns the vertex @@ -89,10 +100,10 @@ class NonHyper { void list(std::ostream &s) const; const GraphType &getGraph() const; const Hyper &getHyper() const; - const GraphDatabase &getGraphDatabase() const; + const Graph::Collection &getGraphDatabase() const; const std::vector > &getProducts() const; void print() const; - HyperVertex findHyperEdge(Edge e) const; + HyperVertex getHyperEdge(Edge e) const; HyperVertex findHyperEdge(const std::vector &sources, const std::vector &targets) const; protected: virtual void listImpl(std::ostream &s) const = 0; @@ -100,15 +111,12 @@ class NonHyper { std::size_t id; std::weak_ptr apiReference; const LabelSettings labelSettings; - GraphDatabase graphDatabase; + Graph::Collection graphDatabase; GraphType dg; public: // TODO: make private again - std::map multisetToVertex; + std::unordered_map multisetToVertex; private: std::unique_ptr hyper; -public: // TODO: make private again - std::map edgeToHyper; -private: std::unique_ptr hyperCreator; // only valid during calculation private: // calculation bool hasStartedCalculation = false; diff --git a/src/mod/lib/DG/NonHyperDerivations.cpp b/libs/libmod/src/mod/lib/DG/NonHyperDerivations.cpp similarity index 77% rename from src/mod/lib/DG/NonHyperDerivations.cpp rename to libs/libmod/src/mod/lib/DG/NonHyperDerivations.cpp index 209cbff..da553fe 100644 --- a/src/mod/lib/DG/NonHyperDerivations.cpp +++ b/libs/libmod/src/mod/lib/DG/NonHyperDerivations.cpp @@ -1,9 +1,9 @@ -#include "NonHyperDerivations.h" +#include "NonHyperDerivations.hpp" -#include -#include -#include -#include +#include +#include +#include +#include namespace mod { namespace lib { @@ -25,12 +25,12 @@ void NonHyperDerivations::calculateImpl(bool printInfo) { assert(derivations); // add all graphs for(const auto &der : *derivations) { - for(auto g : der.left) this->addGraphAsVertex(g); - for(auto g : der.right) this->addGraphAsVertex(g); + for(auto g : der.left) this->trustAddGraphAsVertex(g); + for(auto g : der.right) this->trustAddGraphAsVertex(g); } // add derivations for(const auto &der : *derivations) { - const auto makeSide = [this](const mod::Derivation::GraphList & graphs) -> GraphMultiset { + const auto makeSide = [](const mod::Derivation::GraphList & graphs) -> GraphMultiset { std::vector gPtrs; gPtrs.reserve(graphs.size()); for(const auto &g : graphs) gPtrs.push_back(&g->getGraph()); diff --git a/src/mod/lib/DG/NonHyperDerivations.h b/libs/libmod/src/mod/lib/DG/NonHyperDerivations.hpp similarity index 94% rename from src/mod/lib/DG/NonHyperDerivations.h rename to libs/libmod/src/mod/lib/DG/NonHyperDerivations.hpp index 6ba1bcb..bdbd7f1 100644 --- a/src/mod/lib/DG/NonHyperDerivations.h +++ b/libs/libmod/src/mod/lib/DG/NonHyperDerivations.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_DG_NONHYPERDERIVATIONS_H #define MOD_LIB_DG_NONHYPERDERIVATIONS_H -#include +#include namespace mod { struct Derivation; diff --git a/src/mod/lib/DG/NonHyperRuleComp.cpp b/libs/libmod/src/mod/lib/DG/NonHyperRuleComp.cpp similarity index 55% rename from src/mod/lib/DG/NonHyperRuleComp.cpp rename to libs/libmod/src/mod/lib/DG/NonHyperRuleComp.cpp index b99d99e..0b2d157 100644 --- a/src/mod/lib/DG/NonHyperRuleComp.cpp +++ b/libs/libmod/src/mod/lib/DG/NonHyperRuleComp.cpp @@ -1,16 +1,16 @@ -#include "NonHyperRuleComp.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "NonHyperRuleComp.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -22,18 +22,18 @@ namespace DG { struct NonHyperRuleComp::ExecutionEnv : public Strategies::ExecutionEnv { ExecutionEnv(NonHyperRuleComp &owner, LabelSettings labelSettings) - : Strategies::ExecutionEnv(labelSettings), owner(owner) { } + : Strategies::ExecutionEnv(labelSettings), owner(owner) {} - bool tryAddGraph(std::shared_ptr gCand) override { - return owner.tryAddGraph(gCand); + void tryAddGraph(std::shared_ptr gCand) override { + owner.tryAddGraph(gCand); } - bool addGraph(std::shared_ptr g) override { - return owner.addGraph(g); + bool trustAddGraph(std::shared_ptr g) override { + return owner.trustAddGraph(g); } - bool addGraphAsVertex(std::shared_ptr g) override { - return owner.addGraphAsVertex(g); + bool trustAddGraphAsVertex(std::shared_ptr g) override { + return owner.trustAddGraphAsVertex(g); } bool doExit() const override { @@ -42,23 +42,23 @@ struct NonHyperRuleComp::ExecutionEnv : public Strategies::ExecutionEnv { bool checkLeftPredicate(const mod::Derivation &d) const override { - BOOST_REVERSE_FOREACH(std::shared_ptr < mod::Function > pred, leftPredicates) { - bool result = (*pred)(d); - if(!result) return false; - } + BOOST_REVERSE_FOREACH(std::shared_ptr > pred, leftPredicates) { + bool result = (*pred)(d); + if(!result) return false; + } return true; } bool checkRightPredicate(const mod::Derivation &d) const override { - BOOST_REVERSE_FOREACH(std::shared_ptr < mod::Function > pred, rightPredicates) { - bool result = (*pred)(d); - if(!result) return false; - } + BOOST_REVERSE_FOREACH(std::shared_ptr > pred, rightPredicates) { + bool result = (*pred)(d); + if(!result) return false; + } return true; } - std::shared_ptr checkIfNew(std::unique_ptr g) const { + virtual std::shared_ptr checkIfNew(std::unique_ptr g) const override { return owner.checkIfNew(std::move(g)).first; } @@ -70,25 +70,29 @@ struct NonHyperRuleComp::ExecutionEnv : public Strategies::ExecutionEnv { bool isProduct = owner.addProduct(g); if(owner.getProducts().size() >= getConfig().dg.productLimit.get()) { IO::log() << "DG::RuleComp:\tproduct limit reached, aborting rest of rule application" << std::endl - << "\t(further rule application in the strategy is skipped)" << std::endl; + << "\t(further rule application in the strategy is skipped)" << std::endl; doExit_ = true; } return isProduct; } - bool isDerivation(const GraphMultiset &gmsSrc, const GraphMultiset &gmsTar, const lib::Rules::Real *r) const override { + bool isDerivation(const GraphMultiset &gmsSrc, + const GraphMultiset &gmsTar, + const lib::Rules::Real *r) const override { return owner.isDerivation(gmsSrc, gmsTar, r).second; } - bool suggestDerivation(const GraphMultiset &gmsSrc, const GraphMultiset &gmsTar, const lib::Rules::Real *r) override { + bool suggestDerivation(const GraphMultiset &gmsSrc, + const GraphMultiset &gmsTar, + const lib::Rules::Real *r) override { return owner.suggestDerivation(gmsSrc, gmsTar, r).second; } - void pushLeftPredicate(std::shared_ptr > pred) override { + void pushLeftPredicate(std::shared_ptr > pred) override { leftPredicates.push_back(pred); } - void pushRightPredicate(std::shared_ptr > pred) override { + void pushRightPredicate(std::shared_ptr > pred) override { rightPredicates.push_back(pred); } @@ -99,45 +103,49 @@ struct NonHyperRuleComp::ExecutionEnv : public Strategies::ExecutionEnv { void popRightPredicate() override { rightPredicates.pop_back(); } + public: NonHyperRuleComp &owner; private: // state for computation - std::vector > > leftPredicates; - std::vector > > rightPredicates; + std::vector > > leftPredicates; + std::vector > > rightPredicates; bool doExit_ = false; }; NonHyperRuleComp::NonHyperRuleComp(const std::vector > &graphDatabase, - Strategies::Strategy *strategy, LabelSettings labelSettings, bool ignoreRuleLabelTypes) -: NonHyper(graphDatabase, labelSettings), strategy(strategy), input(new Strategies::GraphState()) { + Strategies::Strategy *strategy, + LabelSettings labelSettings, + bool ignoreRuleLabelTypes) + : NonHyper(graphDatabase, labelSettings), strategy(strategy), input(new Strategies::GraphState()) { env.reset(new ExecutionEnv(*this, labelSettings)); strategy->setExecutionEnv(*env); - const auto ls = LabelSettings{getLabelSettings().type, LabelRelation::Isomorphism, getLabelSettings().withStereo, LabelRelation::Isomorphism}; + const auto ls = LabelSettings{getLabelSettings().type, LabelRelation::Isomorphism, getLabelSettings().withStereo, + LabelRelation::Isomorphism}; strategy->preAddGraphs([this, ls](std::shared_ptr gCand) { - if(!getConfig().dg.skipInitialGraphIsomorphismCheck.get()) { - for(const auto &g : getGraphDatabase()) { - if(g == gCand) break; - const bool equal = gCand->isomorphism(g, 1, ls); - if(equal) { - std::string msg = "Isomorphic graphs '" + g->getName() + "' and '" + gCand->getName() + "' in initial graph database and/or add strategies."; - throw LogicError(std::move(msg)); - } - } - } if(ls.type == LabelType::Term) { const auto &term = get_term(gCand->getGraph().getLabelledGraph()); if(!isValid(term)) { - std::string msg = "Parsing failed for graph '" + gCand->getName() + "' in static add strategy. " + term.getParsingError(); + std::string msg = "Parsing failed for graph '" + gCand->getName() + "' in static add strategy. " + + term.getParsingError(); throw TermParsingError(std::move(msg)); } } - addGraph(gCand); + if(!getConfig().dg.skipInitialGraphIsomorphismCheck.get()) { + const auto g = getGraphDatabase().findIsomorphic(gCand); + if(g && g != gCand) { + std::string msg = "Isomorphic graphs '" + g->getName() + "' and '" + gCand->getName() + + "' in initial graph database and/or add strategies."; + throw LogicError(std::move(msg)); + } + } + trustAddGraph(gCand); }); if(!ignoreRuleLabelTypes) { - strategy->forEachRule([&](const lib::Rules::Real & r) { + strategy->forEachRule([&](const lib::Rules::Real &r) { if(!r.getLabelType()) return; if(*r.getLabelType() != labelSettings.type) { - std::string msg = "Rule '" + r.getName() + "' has intended label type " + boost::lexical_cast(*r.getLabelType()); + std::string msg = "Rule '" + r.getName() + "' has intended label type " + + boost::lexical_cast(*r.getLabelType()); msg += ", but the DG is using " + boost::lexical_cast(labelSettings.type) + "."; msg += " Set the ignoreRuleLabelTypes argument to true to skip this check."; throw LogicError(std::move(msg)); @@ -146,7 +154,7 @@ NonHyperRuleComp::NonHyperRuleComp(const std::vector -#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/RuleApplicationUtils.h b/libs/libmod/src/mod/lib/DG/RuleApplicationUtils.hpp similarity index 96% rename from src/mod/lib/DG/RuleApplicationUtils.h rename to libs/libmod/src/mod/lib/DG/RuleApplicationUtils.hpp index 8cc521d..c1a84c6 100644 --- a/src/mod/lib/DG/RuleApplicationUtils.h +++ b/libs/libmod/src/mod/lib/DG/RuleApplicationUtils.hpp @@ -1,12 +1,12 @@ #ifndef MOD_LIB_DG_RULEAPPLICATIONUTILS_H #define MOD_LIB_DG_RULEAPPLICATIONUTILS_H -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Add.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Add.cpp similarity index 90% rename from src/mod/lib/DG/Strategies/Add.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Add.cpp index 61ceda1..36b8cd1 100644 --- a/src/mod/lib/DG/Strategies/Add.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Add.cpp @@ -1,9 +1,9 @@ -#include "Add.h" +#include "Add.hpp" -#include -#include -#include -#include +#include +#include +#include +#include namespace mod { namespace lib { @@ -59,7 +59,7 @@ void Add::executeImpl(std::ostream &s, const GraphState &input) { } else { graphsToAdd = graphs; } - for(const std::shared_ptr g : graphsToAdd) getExecutionEnv().addGraphAsVertex(g); + for(const std::shared_ptr g : graphsToAdd) getExecutionEnv().trustAddGraphAsVertex(g); output = new GraphState(input); if(onlyUniverse) for(const std::shared_ptr g : graphsToAdd) output->addToUniverse(&g->getGraph()); else { diff --git a/src/mod/lib/DG/Strategies/Add.h b/libs/libmod/src/mod/lib/DG/Strategies/Add.hpp similarity index 95% rename from src/mod/lib/DG/Strategies/Add.h rename to libs/libmod/src/mod/lib/DG/Strategies/Add.hpp index 376ae18..1b8251f 100644 --- a/src/mod/lib/DG/Strategies/Add.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Add.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_DG_STRATEGIES_ADD_H #define MOD_LIB_DG_STRATEGIES_ADD_H -#include +#include namespace mod { template class Function; diff --git a/src/mod/lib/DG/Strategies/DerivationPredicates.cpp b/libs/libmod/src/mod/lib/DG/Strategies/DerivationPredicates.cpp similarity index 96% rename from src/mod/lib/DG/Strategies/DerivationPredicates.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/DerivationPredicates.cpp index 8741ee9..cacbe82 100644 --- a/src/mod/lib/DG/Strategies/DerivationPredicates.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/DerivationPredicates.cpp @@ -1,8 +1,8 @@ -#include "DerivationPredicates.h" +#include "DerivationPredicates.hpp" -#include -#include -#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/DerivationPredicates.h b/libs/libmod/src/mod/lib/DG/Strategies/DerivationPredicates.hpp similarity index 96% rename from src/mod/lib/DG/Strategies/DerivationPredicates.h rename to libs/libmod/src/mod/lib/DG/Strategies/DerivationPredicates.hpp index c465070..36efbde 100644 --- a/src/mod/lib/DG/Strategies/DerivationPredicates.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/DerivationPredicates.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_DG_STRATEGIES_DERIVATIONPREDICATES_H #define MOD_LIB_DG_STRATEGIES_DERIVATIONPREDICATES_H -#include -#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Execute.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Execute.cpp similarity index 89% rename from src/mod/lib/DG/Strategies/Execute.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Execute.cpp index f7c9286..bce0085 100644 --- a/src/mod/lib/DG/Strategies/Execute.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Execute.cpp @@ -1,9 +1,9 @@ -#include "Execute.h" +#include "Execute.hpp" -#include -#include -#include -#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Execute.h b/libs/libmod/src/mod/lib/DG/Strategies/Execute.hpp similarity index 91% rename from src/mod/lib/DG/Strategies/Execute.h rename to libs/libmod/src/mod/lib/DG/Strategies/Execute.hpp index 417469b..f8f8cba 100644 --- a/src/mod/lib/DG/Strategies/Execute.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Execute.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_DG_STRATEGIES_EXECUTE_H #define MOD_LIB_DG_STRATEGIES_EXECUTE_H -#include -#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Filter.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Filter.cpp similarity index 95% rename from src/mod/lib/DG/Strategies/Filter.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Filter.cpp index 4cc92b7..f6883ba 100644 --- a/src/mod/lib/DG/Strategies/Filter.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Filter.cpp @@ -1,9 +1,9 @@ -#include "Filter.h" +#include "Filter.hpp" -#include -#include -#include -#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Filter.h b/libs/libmod/src/mod/lib/DG/Strategies/Filter.hpp similarity index 92% rename from src/mod/lib/DG/Strategies/Filter.h rename to libs/libmod/src/mod/lib/DG/Strategies/Filter.hpp index 3d9d2e0..0432b3f 100644 --- a/src/mod/lib/DG/Strategies/Filter.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Filter.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_DG_STRATEGY_FILTER_H #define MOD_LIB_DG_STRATEGY_FILTER_H -#include -#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/GraphState.cpp b/libs/libmod/src/mod/lib/DG/Strategies/GraphState.cpp similarity index 98% rename from src/mod/lib/DG/Strategies/GraphState.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/GraphState.cpp index 4394462..9290c54 100644 --- a/src/mod/lib/DG/Strategies/GraphState.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/GraphState.cpp @@ -1,7 +1,7 @@ -#include "GraphState.h" +#include "GraphState.hpp" -#include -#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/GraphState.h b/libs/libmod/src/mod/lib/DG/Strategies/GraphState.hpp similarity index 100% rename from src/mod/lib/DG/Strategies/GraphState.h rename to libs/libmod/src/mod/lib/DG/Strategies/GraphState.hpp diff --git a/src/mod/lib/DG/Strategies/Parallel.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Parallel.cpp similarity index 94% rename from src/mod/lib/DG/Strategies/Parallel.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Parallel.cpp index 098a9c9..75afef4 100644 --- a/src/mod/lib/DG/Strategies/Parallel.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Parallel.cpp @@ -1,9 +1,9 @@ -#include "Parallel.h" +#include "Parallel.hpp" -#include -#include -#include -#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Parallel.h b/libs/libmod/src/mod/lib/DG/Strategies/Parallel.hpp similarity index 94% rename from src/mod/lib/DG/Strategies/Parallel.h rename to libs/libmod/src/mod/lib/DG/Strategies/Parallel.hpp index 867d94b..1bcac90 100644 --- a/src/mod/lib/DG/Strategies/Parallel.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Parallel.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_DG_STRATEGIES_PARALLEL_H #define MOD_LIB_DG_STRATEGIES_PARALLEL_H -#include +#include #include diff --git a/src/mod/lib/DG/Strategies/Repeat.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Repeat.cpp similarity index 96% rename from src/mod/lib/DG/Strategies/Repeat.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Repeat.cpp index b644c82..69f2bbb 100644 --- a/src/mod/lib/DG/Strategies/Repeat.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Repeat.cpp @@ -1,7 +1,7 @@ -#include "Repeat.h" +#include "Repeat.hpp" -#include -#include +#include +#include #include diff --git a/src/mod/lib/DG/Strategies/Repeat.h b/libs/libmod/src/mod/lib/DG/Strategies/Repeat.hpp similarity index 94% rename from src/mod/lib/DG/Strategies/Repeat.h rename to libs/libmod/src/mod/lib/DG/Strategies/Repeat.hpp index 3d1bf27..e672258 100644 --- a/src/mod/lib/DG/Strategies/Repeat.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Repeat.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_DG_STRATEGIES_REPEAT_H #define MOD_LIB_DG_STRATEGIES_REPEAT_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Revive.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Revive.cpp similarity index 92% rename from src/mod/lib/DG/Strategies/Revive.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Revive.cpp index b99094c..7c06986 100644 --- a/src/mod/lib/DG/Strategies/Revive.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Revive.cpp @@ -1,8 +1,8 @@ -#include "Revive.h" +#include "Revive.hpp" -#include -#include -#include +#include +#include +#include #include diff --git a/src/mod/lib/DG/Strategies/Revive.h b/libs/libmod/src/mod/lib/DG/Strategies/Revive.hpp similarity index 94% rename from src/mod/lib/DG/Strategies/Revive.h rename to libs/libmod/src/mod/lib/DG/Strategies/Revive.hpp index ba185c3..8759205 100644 --- a/src/mod/lib/DG/Strategies/Revive.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Revive.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_DG_STRATEGIES_REVIVE_H #define MOD_LIB_DG_STRATEGIES_REVIVE_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Rule.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Rule.cpp similarity index 95% rename from src/mod/lib/DG/Strategies/Rule.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Rule.cpp index c937265..bdb8afa 100644 --- a/src/mod/lib/DG/Strategies/Rule.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Rule.cpp @@ -1,15 +1,15 @@ -#include "Rule.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Rule.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Rule.h b/libs/libmod/src/mod/lib/DG/Strategies/Rule.hpp similarity index 55% rename from src/mod/lib/DG/Strategies/Rule.h rename to libs/libmod/src/mod/lib/DG/Strategies/Rule.hpp index d491b2d..3b6ab11 100644 --- a/src/mod/lib/DG/Strategies/Rule.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Rule.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_DG_STRATEGIES_RULE_H #define MOD_LIB_DG_STRATEGIES_RULE_H -#include +#include #include @@ -13,13 +13,13 @@ namespace Strategies { struct Rule : Strategy { Rule(std::shared_ptr r); Rule(const lib::Rules::Real *r); - Strategy *clone() const override; - void preAddGraphs(std::function) > add) const; - void forEachRule(std::function f) const; - void printInfo(std::ostream &s) const override; - bool isConsumed(const lib::Graph::Single *g) const override; + virtual Strategy *clone() const override; + virtual void preAddGraphs(std::function) > add) const override; + virtual void forEachRule(std::function f) const override; + virtual void printInfo(std::ostream &s) const override; + virtual bool isConsumed(const lib::Graph::Single *g) const override; private: - void executeImpl(std::ostream &s, const GraphState &input) override; + virtual void executeImpl(std::ostream &s, const GraphState &input) override; private: std::shared_ptr r; const lib::Rules::Real *rRaw; diff --git a/src/mod/lib/DG/Strategies/Sequence.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Sequence.cpp similarity index 97% rename from src/mod/lib/DG/Strategies/Sequence.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Sequence.cpp index 5747739..12ee94f 100644 --- a/src/mod/lib/DG/Strategies/Sequence.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Sequence.cpp @@ -1,6 +1,6 @@ -#include "Sequence.h" +#include "Sequence.hpp" -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Sequence.h b/libs/libmod/src/mod/lib/DG/Strategies/Sequence.hpp similarity index 94% rename from src/mod/lib/DG/Strategies/Sequence.h rename to libs/libmod/src/mod/lib/DG/Strategies/Sequence.hpp index 6ee9e51..902b300 100644 --- a/src/mod/lib/DG/Strategies/Sequence.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Sequence.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_DG_STRATEGIES_SEQUENCE_H #define MOD_LIB_DG_STRATEGIES_SEQUENCE_H -#include +#include #include diff --git a/src/mod/lib/DG/Strategies/Sort.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Sort.cpp similarity index 92% rename from src/mod/lib/DG/Strategies/Sort.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Sort.cpp index 0d5eac0..581919b 100644 --- a/src/mod/lib/DG/Strategies/Sort.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Sort.cpp @@ -1,9 +1,9 @@ -#include "Sort.h" +#include "Sort.hpp" -#include -#include -#include -#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Sort.h b/libs/libmod/src/mod/lib/DG/Strategies/Sort.hpp similarity index 92% rename from src/mod/lib/DG/Strategies/Sort.h rename to libs/libmod/src/mod/lib/DG/Strategies/Sort.hpp index 9bfc0ef..cc93c26 100644 --- a/src/mod/lib/DG/Strategies/Sort.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Sort.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_DG_STRATEGIES_SORT_H #define MOD_LIB_DG_STRATEGIES_SORT_H -#include -#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Strategy.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Strategy.cpp similarity index 94% rename from src/mod/lib/DG/Strategies/Strategy.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Strategy.cpp index 7b7cff1..b2f4af5 100644 --- a/src/mod/lib/DG/Strategies/Strategy.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Strategy.cpp @@ -1,8 +1,8 @@ -#include "Strategy.h" +#include "Strategy.hpp" -#include -#include -#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/DG/Strategies/Strategy.h b/libs/libmod/src/mod/lib/DG/Strategies/Strategy.hpp similarity index 89% rename from src/mod/lib/DG/Strategies/Strategy.h rename to libs/libmod/src/mod/lib/DG/Strategies/Strategy.hpp index 8e2f864..1f2743e 100644 --- a/src/mod/lib/DG/Strategies/Strategy.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Strategy.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_DG_STRATEGIES_STRATEGY_H #define MOD_LIB_DG_STRATEGIES_STRATEGY_H -#include -#include +#include +#include #include #include @@ -18,9 +18,10 @@ struct ExecutionEnv { ExecutionEnv(LabelSettings labelSettings) : labelSettings(labelSettings) { } virtual ~ExecutionEnv() { }; - virtual bool tryAddGraph(std::shared_ptr g) = 0; - virtual bool addGraph(std::shared_ptr g) = 0; - virtual bool addGraphAsVertex(std::shared_ptr g) = 0; + // May throw LogicError if exists. + virtual void tryAddGraph(std::shared_ptr g) = 0; + virtual bool trustAddGraph(std::shared_ptr g) = 0; + virtual bool trustAddGraphAsVertex(std::shared_ptr g) = 0; virtual bool doExit() const = 0; // the right side is always empty virtual bool checkLeftPredicate(const mod::Derivation &d) const = 0; diff --git a/src/mod/lib/DG/Strategies/Take.cpp b/libs/libmod/src/mod/lib/DG/Strategies/Take.cpp similarity index 96% rename from src/mod/lib/DG/Strategies/Take.cpp rename to libs/libmod/src/mod/lib/DG/Strategies/Take.cpp index 6ad7784..6b3e487 100644 --- a/src/mod/lib/DG/Strategies/Take.cpp +++ b/libs/libmod/src/mod/lib/DG/Strategies/Take.cpp @@ -1,7 +1,7 @@ -#include "Take.h" +#include "Take.hpp" -#include -#include +#include +#include #include #include diff --git a/src/mod/lib/DG/Strategies/Take.h b/libs/libmod/src/mod/lib/DG/Strategies/Take.hpp similarity index 94% rename from src/mod/lib/DG/Strategies/Take.h rename to libs/libmod/src/mod/lib/DG/Strategies/Take.hpp index 492a070..5fc8c03 100644 --- a/src/mod/lib/DG/Strategies/Take.h +++ b/libs/libmod/src/mod/lib/DG/Strategies/Take.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_DG_STRATEGIES_TAKE_H #define MOD_LIB_DG_STRATEGIES_TAKE_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Graph/Canonicalisation.cpp b/libs/libmod/src/mod/lib/Graph/Canonicalisation.cpp similarity index 80% rename from src/mod/lib/Graph/Canonicalisation.cpp rename to libs/libmod/src/mod/lib/Graph/Canonicalisation.cpp index 4085199..b61189e 100644 --- a/src/mod/lib/Graph/Canonicalisation.cpp +++ b/libs/libmod/src/mod/lib/Graph/Canonicalisation.cpp @@ -1,7 +1,7 @@ -#include "Canonicalisation.h" +#include "Canonicalisation.hpp" -#include -#include +#include +#include #include #include @@ -32,10 +32,11 @@ namespace lib { namespace Graph { namespace { -void printGraph(std::ostream &s, const auto &lg, const auto &g, const auto &idx) { +template +void printGraph(std::ostream &s, const LabelledGraph &lg, const Grpah &g, const Idx &idx) { for(const auto v : asRange(vertices(g))) { s << idx[v] << "(" << get(boost::vertex_index_t(), get_graph(lg), v) << ")(" - << get_string(lg)[v] << "):"; + << get_string(lg)[v] << "):"; for(const auto e : asRange(out_edges(v, g))) { const auto v = target(e, g); s << " " << idx[v] << "(" << get_string(lg)[e] << ")"; @@ -107,6 +108,7 @@ struct edge_handler_bond_impl { hit_count.fill(0); acc_count.fill(0); } + public: // For non-singleton Counter hit_count; @@ -118,12 +120,14 @@ struct edge_handler_bond_impl { // - [0] = [1] = #type 1 bonds Counter acc_count; }; + static constexpr SizeType Max = 256; explicit edge_handler_bond_impl(const Single &gWrap) - : lg(gWrap.getLabelledGraph()), str(get_string(lg)), mol(get_molecule(lg)) { } + : lg(gWrap.getLabelledGraph()), str(get_string(lg)), mol(get_molecule(lg)) {} - void initialize(const auto &state) { + template + void initialize(const State &state) { Counter c; c.fill(0); counters.resize(state.n, c); @@ -134,7 +138,8 @@ struct edge_handler_bond_impl { // Generic Refiner //======================================================================== - void add_edge(auto &state, auto &node, const SizeType cell, const SizeType cell_end, const auto &e_out) { + template + void add_edge(State &state, Treenode &node, const SizeType cell, const SizeType cell_end, const Edge &e_out) { const auto bt = mol[e_out]; SizeType i = static_cast (bt); assert(i != 0); // invalid bond, should not happen @@ -146,42 +151,53 @@ struct edge_handler_bond_impl { ++cellData[cell].hit_count[i]; } - template + template void sort_equal_hit(Partition &pi, const SizeType cell, const SizeType cell_end, - const SizeType max, auto &splits) { + const SizeType max, Splits &splits) { sort_range(pi, cell, cell, cell_end, max, splits); } - template + template void sort_partitioned(Partition &pi, const SizeType cell, const SizeType cell_mid, const SizeType cell_end, - const SizeType max_count, auto &splits) { + const SizeType max_count, Splits &splits) { sort_range(pi, cell, cell_mid, cell_end, max_count, splits); } - template - void sort_duplicate_partitioned_equal_hit(Partition &pi, const SizeType cell, const SizeType cell_mid, const SizeType cell_end, - const SizeType max, auto &splits) { + template + void sort_duplicate_partitioned_equal_hit(Partition &pi, + const SizeType cell, + const SizeType cell_mid, + const SizeType cell_end, + const SizeType max, + Splits &splits) { sort_range(pi, cell, cell_mid, cell_end, max, splits); } - template + template void sort_duplicate_partitioned(Partition &pi, const SizeType cell, const SizeType cell_mid, const SizeType cell_end, - const SizeType max, const SizeType max_count, - const auto &counters, auto &splits) { + const SizeType max, const SizeType max_count, + const Counters &counters, Splits &splits) { sort_range(pi, cell, cell_mid, cell_end, max, splits); } - template + template void sort(Partition &pi, const SizeType cell, const SizeType cell_end, - const SizeType max, const SizeType max_count, SizeType &first_non_zero, - const auto &counters, auto &splits) { + const SizeType max, const SizeType max_count, SizeType &first_non_zero, + const Counters &counters, Splits &splits) { assert(max_count != cell_end - cell); // handled by refiner assert(max > 1); // handled by refiner first_non_zero = sort_range(pi, cell, cell, cell_end, max, splits); } -private: - void sort_level(auto &pi, const SizeType cell, const SizeType idx_first, auto &splits, const auto first, const auto last, const auto level) { +private: + template + void sort_level(Partition &pi, + const SizeType cell, + const SizeType idx_first, + Splits &splits, + const Iter first, + const Iter last, + const int level) { if(level == 4) return; if(cellData[cell].hit_count[level] == 0) { return sort_level(pi, cell, idx_first, splits, first, last, level + 1); @@ -217,9 +233,9 @@ struct edge_handler_bond_impl { sort_level(pi, cell, idx_first + prev, splits, sub_first, sub_last, level + 1); } - template + template SizeType sort_range(Partition &pi, const SizeType cell, const SizeType idx_first, const SizeType idx_last, - const SizeType max, auto &splits) { + const SizeType max, Splits &splits) { const auto first = pi.begin() + idx_first; const auto last = pi.begin() + idx_last; // use counting sort to sort for low max_count @@ -295,15 +311,17 @@ struct edge_handler_bond_impl { } return idx_first; // TODO: we could check this } -public: - void clear_cell(auto &state, auto &node, const SizeType cell, const SizeType cell_end) { +public: + template + void clear_cell(State &state, Treenode &node, const SizeType cell, const SizeType cell_end) { cellData[cell].hit_count.fill(0); for(auto i = cell; i != cell_end; ++i) counters[node.pi.get(i)].fill(0); } - void clear_cell_aborted(auto &state, auto &node, const SizeType cell, const SizeType cell_end) { + template + void clear_cell_aborted(State &state, Treenode &node, const SizeType cell, const SizeType cell_end) { clear_cell(state, node, cell, cell_end); } @@ -311,7 +329,13 @@ struct edge_handler_bond_impl { // Singleton Refiner //======================================================================== - void add_edge_singleton_refiner(auto &state, auto &node, const SizeType cell, const SizeType cell_end, const auto &e_out, const SizeType target_pos) { + template + void add_edge_singleton_refiner(State &state, + Treenode &node, + const SizeType cell, + const SizeType cell_end, + const Edge &e_out, + const SizeType target_pos) { const auto bt = mol[e_out]; SizeType i = static_cast (bt); assert(i != 0); // invalid bond, should not happen @@ -390,7 +414,11 @@ struct edge_handler_bond_impl { } template - void sort_singleton_refiner(Partition &pi, const SizeType cell, const SizeType cell_mid, const SizeType cell_end, Splits &splits) { + void sort_singleton_refiner(Partition &pi, + const SizeType cell, + const SizeType cell_mid, + const SizeType cell_end, + Splits &splits) { const auto &acc_count = cellData[cell].acc_count; const auto target_0 = cell_end - acc_count[0]; const auto target_1 = cell_end - acc_count[1]; @@ -405,20 +433,24 @@ struct edge_handler_bond_impl { splits.push_back(target_3); } - void clear_cell_singleton_refiner(auto &state, auto &node, const SizeType cell, const SizeType cell_end) { + template + void clear_cell_singleton_refiner(State &state, TreeNode &node, const SizeType cell, const SizeType cell_end) { cellData[cell].acc_count.fill(0); } - void clear_cell_singleton_refiner_aborted(auto &state, auto &node, const SizeType cell, const SizeType cell_end) { + template + void clear_cell_singleton_refiner_aborted(State &state, TreeNode &node, const SizeType cell, const SizeType cell_end) { clear_cell_singleton_refiner(state, node, cell, cell_end); } + private: graph_canon::counting_sorter sorter; public: - - long long compare(auto &state, const auto e_left, const auto e_right) const { + template + long long compare(State &state, const Edge e_left, const Edge e_right) const { return static_cast (mol[e_left]) - static_cast (mol[e_right]); } + public: const LabelledGraph ≶ const LabelledGraph::PropStringType &str; @@ -431,17 +463,19 @@ struct edge_handler_bond { template using type = edge_handler_bond_impl; - explicit edge_handler_bond(const Single &gWrap) : gWrap(&gWrap) { } + explicit edge_handler_bond(const Single &gWrap) : gWrap(&gWrap) {} template auto make() const { return edge_handler_bond_impl(*gWrap); } + public: const Single *gWrap; }; -void printLeaf(std::ostream &s, const auto &lg, const auto &pi) { +template +void printLeaf(std::ostream &s, const LabelledGraph &lg, const Partition &pi) { std::vector perm; std::copy(pi.begin_inverse(), pi.end_inverse(), std::back_inserter(perm)); const auto &str = get_string(lg); @@ -457,7 +491,7 @@ void printLeaf(std::ostream &s, const auto &lg, const auto &pi) { struct debug_visitor : graph_canon::debug_visitor { using Base = graph_canon::debug_visitor; - debug_visitor(const LabelledGraph &lg) : Base(true, true, true, true, false), lg(lg) { } + debug_visitor(const LabelledGraph &lg) : Base(true, true, true, true, false), lg(lg) {} template bool tree_create_node_begin(State &state, TreeNode &t) { @@ -494,6 +528,7 @@ struct debug_visitor : graph_canon::debug_visitor { printLeaf(std::cout, lg, state.get_canon_leaf()->pi); } } + private: const LabelledGraph ≶ }; @@ -504,18 +539,12 @@ auto getCanonForm(const Single &g, EdgeHandler eHandler, LabelType labelType, bo const auto &graph = get_graph(g.getLabelledGraph()); const auto idx = get(boost::vertex_index_t(), graph); const auto vis = graph_canon::make_visitor( - graph_canon::traversal_bfs_exp() - , graph_canon::target_cell_flm() - , graph_canon::refine_WL_1() - , graph_canon::aut_pruner_basic() - , graph_canon::aut_implicit_size_2() - , graph_canon::refine_degree_1() - , graph_canon::invariant_partial_leaf() - , graph_canon::invariant_cell_split() - , graph_canon::invariant_quotient() + graph_canon::traversal_bfs_exp(), graph_canon::target_cell_flm(), graph_canon::refine_WL_1(), + graph_canon::aut_pruner_basic(), graph_canon::aut_implicit_size_2(), graph_canon::refine_degree_1(), + graph_canon::invariant_partial_leaf(), graph_canon::invariant_cell_split(), graph_canon::invariant_quotient() // , debug_visitor(g.getLabelledGraph()) , graph_canon::stats_visitor() - ); + ); const auto &str = get_string(g.getLabelledGraph()); const auto vLess = [&str](Vertex a, Vertex b) { return str[a] < str[b]; @@ -577,15 +606,21 @@ struct PrintVisitor { using Edge = typename boost::graph_traits::edge_descriptor; public: - PrintVisitor(const LGraph &lg1, const LGraph &lg2, const Graph &g1, const Graph &g2, const Idx &idx1, const Idx &idx2) - : lg1(lg1), lg2(lg2), g1(g1), g2(g2), idx1(idx1), idx2(idx2) { } + PrintVisitor(const LGraph &lg1, + const LGraph &lg2, + const Graph &g1, + const Graph &g2, + const Idx &idx1, + const Idx &idx2) + : lg1(lg1), lg2(lg2), g1(g1), g2(g2), idx1(idx1), idx2(idx2) {} void at_num_vertices() const { std::cout << "num_vertices: " << num_vertices(g1) << " != " << num_vertices(g2) << std::endl; } void at_vertex_compare(Vertex v1, Vertex v2) const { - std::cout << "vertexComp(" << idx1[v1] << "(" << v1 << ")" << ", " << idx2[v2] << "(" << v2 << ")" << ") == false" << std::endl; + std::cout << "vertexComp(" << idx1[v1] << "(" << v1 << ")" << ", " << idx2[v2] << "(" << v2 << ")" << ") == false" + << std::endl; } void at_out_degree(Vertex v1, Vertex v2) const { @@ -596,21 +631,24 @@ struct PrintVisitor { printGraph(std::cout, lg1, g1, idx1); std::cout << std::endl; printGraph(std::cout, lg2, g2, idx2); - std::string edge = boost::is_same::directed_category, boost::undirected_tag>::value ? " -- " : " -> "; + std::string edge = boost::is_same::directed_category, boost::undirected_tag>::value + ? " -- " : " -> "; std::cout << "out_edge: " << get(idx1, source(e1, g1)) << edge << get(idx1, target(e1, g1)) - << " != " << get(idx2, source(e2, g2)) << edge << get(idx2, target(e2, g2)) << std::endl; + << " != " << get(idx2, source(e2, g2)) << edge << get(idx2, target(e2, g2)) << std::endl; } void at_edge_compare(Edge e1, Edge e2) const { printGraph(std::cout, lg1, g1, idx1); std::cout << std::endl; printGraph(std::cout, lg2, g2, idx2); - std::string edge = boost::is_same::directed_category, boost::undirected_tag>::value ? " -- " : " -> "; + std::string edge = boost::is_same::directed_category, boost::undirected_tag>::value + ? " -- " : " -> "; std::cout << "edgeComp: " << get(idx1, source(e1, g1)) << edge << get(idx1, target(e1, g1)) - << " != " << get(idx2, source(e2, g2)) << edge << get(idx2, target(e2, g2)) << std::endl; + << " != " << get(idx2, source(e2, g2)) << edge << get(idx2, target(e2, g2)) << std::endl; } - void at_end(bool) const { } + void at_end(bool) const {} + private: const LGraph &lg1; const LGraph &lg2; @@ -621,7 +659,12 @@ struct PrintVisitor { }; template -PrintVisitor makePrintVisitor(const LGraph &lg1, const LGraph &lg2, const Graph &g1, const Graph &g2, const Idx &idx1, const Idx &idx2) { +PrintVisitor makePrintVisitor(const LGraph &lg1, + const LGraph &lg2, + const Graph &g1, + const Graph &g2, + const Idx &idx1, + const Idx &idx2) { return PrintVisitor(lg1, lg2, g1, g2, idx1, idx2); } @@ -638,14 +681,13 @@ bool canonicalCompare(const Single &g1, const Single &g2, LabelType labelType, b switch(labelType) { case LabelType::String: return graph_canon::ordered_graph_equal(ord1, ord2, - [&gl1, &gl2](Vertex v1, Vertex v2) -> bool { - return get_string(gl1)[v1] == get_string(gl2)[v2]; - }, - [&gl1, &gl2](Edge e1, Edge e2) -> bool { - return get_string(gl1)[e1] == get_string(gl2)[e2]; - }, visitor); - case LabelType::Term: - throw LogicError("Can not currently compare canonical forms with term labels."); + [&gl1, &gl2](Vertex v1, Vertex v2) -> bool { + return get_string(gl1)[v1] == get_string(gl2)[v2]; + }, + [&gl1, &gl2](Edge e1, Edge e2) -> bool { + return get_string(gl1)[e1] == get_string(gl2)[e2]; + }, visitor); + case LabelType::Term: throw LogicError("Can not currently compare canonical forms with term labels."); } MOD_ABORT; } diff --git a/src/mod/lib/Graph/Canonicalisation.h b/libs/libmod/src/mod/lib/Graph/Canonicalisation.hpp similarity index 93% rename from src/mod/lib/Graph/Canonicalisation.h rename to libs/libmod/src/mod/lib/Graph/Canonicalisation.hpp index cd3ddff..ccb227d 100644 --- a/src/mod/lib/Graph/Canonicalisation.h +++ b/libs/libmod/src/mod/lib/Graph/Canonicalisation.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_GRAPH_CANONICALISATION_H #define MOD_LIB_GRAPH_CANONICALISATION_H -#include +#include namespace mod { namespace lib { diff --git a/libs/libmod/src/mod/lib/Graph/Collection.cpp b/libs/libmod/src/mod/lib/Graph/Collection.cpp new file mode 100644 index 0000000..55ebb0b --- /dev/null +++ b/libs/libmod/src/mod/lib/Graph/Collection.cpp @@ -0,0 +1,121 @@ +#include "Collection.hpp" + +#include +#include + +namespace mod { +namespace lib { +namespace Graph { +namespace { + +inline CollectionStats getStats(const lib::Graph::Single *g) { + const auto &graph = g->getGraph(); + return {num_vertices(graph), num_edges(graph)}; +} + + +} // namespace + +struct Collection::Store { + bool trustInsert(const lib::Graph::Single *g) { + return graphs.insert(g).second; + } + + auto end() const { + return graphs.end(); + } + + auto find(const lib::Graph::Single *g) const { + return graphs.find(g); + } + + std::shared_ptr findIsomorphic(const lib::Graph::Single *g, LabelSettings ls) const { + for(const auto &gCand : graphs) { + const bool iso = lib::Graph::Single::isomorphic(*g, *gCand, ls); + if(iso) return gCand->getAPIReference(); + // if iso: + // if(getConfig().dg.calculateDetailsVerbose.get()) { + // IO::log() << "Discarding product " << gCand->getName() << ", isomorphic to " << g->getName() << std::endl; + // IO::log() << "\tLabelSettings: withStereo=" << std::boolalpha << this->labelSettings.withStereo << std::endl; + // mod::postSection("Discarded"); + // mod::lib::IO::Graph::Write::Options opts, optsGraph; + // opts.edgesAsBonds = opts.withIndex = true; + // optsGraph.collapseHydrogens = optsGraph.edgesAsBonds = optsGraph.raiseCharges = true; + // optsGraph.simpleCarbons = optsGraph.withColour = optsGraph.withIndex = true; + // mod::lib::IO::Graph::Write::summary(*gCand, optsGraph, optsGraph); + // std::shared_ptr gCandWrapped = graph::Graph::makeGraph(std::move(gCand)); + // for(auto v : gCandWrapped->vertices()) { + // if(v.getStringLabel() == "C") + // v.printStereo(); + // } + // } + } + return nullptr; + } + +private: + std::unordered_set graphs; +}; + +Collection::Collection(LabelSettings ls, Config::IsomorphismAlg alg) + : ls(ls.type, LabelRelation::Isomorphism, + ls.withStereo, LabelRelation::Isomorphism) {} + +Collection::~Collection() {} + +const std::vector> &Collection::asList() const { + return graphs; +} + +bool Collection::contains(std::shared_ptr g) const { + const auto *gLib = &g->getGraph(); + const auto stats = getStats(gLib); + const auto iterStore = graphStore.find(stats); + if(iterStore == end(graphStore)) return false; + const auto iterGraph = iterStore->second->find(gLib); + return iterGraph != iterStore->second->end(); +} + +std::shared_ptr Collection::findIsomorphic(std::shared_ptr g) const { + const auto *gLib = &g->getGraph(); + const auto stats = getStats(gLib); + const auto iterStore = graphStore.find(stats); + if(iterStore == end(graphStore)) return nullptr; + const auto iterGraph = iterStore->second->find(gLib); + if(iterGraph != iterStore->second->end()) return g; + return iterStore->second->findIsomorphic(gLib, ls); +} + +std::shared_ptr Collection::findIsomorphic(lib::Graph::Single *g) const { + const auto stats = getStats(g); + const auto iterStore = graphStore.find(stats); + if(iterStore == end(graphStore)) return nullptr; + return iterStore->second->findIsomorphic(g, ls); +} + +bool Collection::trustInsert(std::shared_ptr g) { + const auto *gLib = &g->getGraph(); + const auto stats = getStats(gLib); + auto iterStore = graphStore.find(stats); + if(iterStore == end(graphStore)) { + iterStore = graphStore.emplace(stats, std::make_unique()).first; + iterStore->second->trustInsert(gLib); + graphs.push_back(g); + return true; + } else { + const bool res = iterStore->second->trustInsert(gLib); + if(res)graphs.push_back(g); + return res; + } +} + +std::pair, bool> Collection::tryInsert(std::shared_ptr g) { + const auto gIns = findIsomorphic(g); + if(gIns) return {gIns, false}; + trustInsert(g); + return {g, true}; +} + +} // namespace Graph +} // namespace lib +} // namespace mod \ No newline at end of file diff --git a/libs/libmod/src/mod/lib/Graph/Collection.hpp b/libs/libmod/src/mod/lib/Graph/Collection.hpp new file mode 100644 index 0000000..c0929da --- /dev/null +++ b/libs/libmod/src/mod/lib/Graph/Collection.hpp @@ -0,0 +1,76 @@ +#ifndef MOD_LIB_GRAPH_COLLECTION_HPP +#define MOD_LIB_GRAPH_COLLECTION_HPP + +#include +#include + +#include +#include + +#include + +namespace mod { +namespace lib { +namespace Graph { + +struct CollectionStats { + std::size_t numVertices; + std::size_t numEdges; +public: + friend bool operator==(CollectionStats a, CollectionStats b) { + return std::tie(a.numVertices, a.numEdges) == std::tie(b.numVertices, b.numEdges); + } +}; +} // namespace Graph +} // namespace lib +} // namespace mod + +template<> +struct std::hash { + std::size_t operator()(mod::lib::Graph::CollectionStats stats) const { + std::size_t res = stats.numVertices; + boost::hash_combine(res, stats.numEdges); + return res; + } +}; + +namespace mod { +namespace lib { +namespace Graph { + +struct Collection { + explicit Collection(LabelSettings ls, Config::IsomorphismAlg alg); + ~Collection(); + const std::vector> &asList() const; + // by pointer + bool contains(std::shared_ptr g) const; + // By isomorphism. + // Returns nullptr if non found. + std::shared_ptr findIsomorphic(std::shared_ptr g) const; + // By isomorphism, but g may not necessarily be wrapped yet. + // Returns nullptr if non found. + std::shared_ptr findIsomorphic(lib::Graph::Single *g) const; +public: + // Insert without checking for isomorphism. + // Still checks for pointer equality. + // Requires: findIsomorphic(g) != g; + // Returns whether insertion was done or not. + bool trustInsert(std::shared_ptr g); + // Try to insert with isomorphism check first. + // Returns a graph and a boolean indicating whether insertion was successful. + // If inserted, return g, otherwise return an isomorphic graph. + // Note: if the same graph object is already present, the return value is . + std::pair, bool> tryInsert(std::shared_ptr g); +private: + struct Store; + const LabelSettings ls; + std::unordered_map> graphStore; + // owning part + std::vector> graphs; +}; + +} // namespace Graph +} // namespace lib +} // namespace mod + +#endif //MOD_LIB_GRAPH_COLLECTION_HPP \ No newline at end of file diff --git a/src/mod/lib/Graph/DFSEncoding.cpp b/libs/libmod/src/mod/lib/Graph/DFSEncoding.cpp similarity index 98% rename from src/mod/lib/Graph/DFSEncoding.cpp rename to libs/libmod/src/mod/lib/Graph/DFSEncoding.cpp index 9004ca6..54e1b04 100644 --- a/src/mod/lib/Graph/DFSEncoding.cpp +++ b/libs/libmod/src/mod/lib/Graph/DFSEncoding.cpp @@ -1,11 +1,11 @@ -#include "DFSEncoding.h" +#include "DFSEncoding.hpp" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include @@ -397,8 +397,8 @@ BOOST_FUSION_ADAPT_STRUCT(mod::lib::Graph::DFSEncoding::detail::Chain, BOOST_FUSION_ADAPT_STRUCT(mod::lib::Graph::DFSEncoding::detail::Branch, (std::vector, tail)) -#include -#include +#include +#include #include #include diff --git a/src/mod/lib/Graph/DFSEncoding.h b/libs/libmod/src/mod/lib/Graph/DFSEncoding.hpp similarity index 94% rename from src/mod/lib/Graph/DFSEncoding.h rename to libs/libmod/src/mod/lib/Graph/DFSEncoding.hpp index 6cd6403..d15d5dc 100644 --- a/src/mod/lib/Graph/DFSEncoding.h +++ b/libs/libmod/src/mod/lib/Graph/DFSEncoding.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_GRAPH_DFSENCODING_H #define MOD_LIB_GRAPH_DFSENCODING_H -#include +#include #include #include diff --git a/src/mod/lib/Graph/GraphDecl.h b/libs/libmod/src/mod/lib/Graph/GraphDecl.hpp similarity index 100% rename from src/mod/lib/Graph/GraphDecl.h rename to libs/libmod/src/mod/lib/Graph/GraphDecl.hpp diff --git a/src/mod/lib/Graph/LabelledGraph.cpp b/libs/libmod/src/mod/lib/Graph/LabelledGraph.cpp similarity index 91% rename from src/mod/lib/Graph/LabelledGraph.cpp rename to libs/libmod/src/mod/lib/Graph/LabelledGraph.cpp index 9375e58..4122e0c 100644 --- a/src/mod/lib/Graph/LabelledGraph.cpp +++ b/libs/libmod/src/mod/lib/Graph/LabelledGraph.cpp @@ -1,12 +1,12 @@ -#include "LabelledGraph.h" +#include "LabelledGraph.hpp" -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include -#include +#include #include diff --git a/src/mod/lib/Graph/LabelledGraph.h b/libs/libmod/src/mod/lib/Graph/LabelledGraph.hpp similarity index 97% rename from src/mod/lib/Graph/LabelledGraph.h rename to libs/libmod/src/mod/lib/Graph/LabelledGraph.hpp index 37f23fb..d52cd35 100644 --- a/src/mod/lib/Graph/LabelledGraph.h +++ b/libs/libmod/src/mod/lib/Graph/LabelledGraph.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_GRAPH_LABELLED_GRAPH_H #define MOD_LIB_GRAPH_LABELLED_GRAPH_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Graph/Multiset.h b/libs/libmod/src/mod/lib/Graph/Multiset.hpp similarity index 67% rename from src/mod/lib/Graph/Multiset.h rename to libs/libmod/src/mod/lib/Graph/Multiset.hpp index 9c34cbc..32a8b86 100644 --- a/src/mod/lib/Graph/Multiset.h +++ b/libs/libmod/src/mod/lib/Graph/Multiset.hpp @@ -1,6 +1,8 @@ #ifndef MOD_LIB_GRAPH_MULTISET_H #define MOD_LIB_GRAPH_MULTISET_H +#include + #include #include @@ -12,9 +14,9 @@ template struct Multiset { Multiset() = default; - explicit Multiset(GraphType *g) : graphs(1, g) { } + explicit Multiset(GraphType *g) : graphs(1, g) {} - explicit Multiset(std::vector graphs) : graphs(std::move(graphs)) { + explicit Multiset(std::vector graphs) : graphs(std::move(graphs)) { this->graphs.shrink_to_fit(); std::sort(this->graphs.begin(), this->graphs.end(), typename std::remove_cv::type::IdLess()); } @@ -42,13 +44,21 @@ struct Multiset { friend bool operator<(const Multiset &l, const Multiset &r) { return l.graphs < r.graphs; } + private: - std::vector graphs; + std::vector graphs; }; } // namespace Graph } // namespace lib } // namespace mod +template +struct std::hash> { + std::size_t operator()(const mod::lib::Graph::Multiset &gs) const { + return boost::hash_range(gs.begin(), gs.end()); + } +}; + #endif /* MOD_LIB_GRAPH_MULTISET_H */ diff --git a/src/mod/lib/Graph/MultisetIO.h b/libs/libmod/src/mod/lib/Graph/MultisetIO.hpp similarity index 92% rename from src/mod/lib/Graph/MultisetIO.h rename to libs/libmod/src/mod/lib/Graph/MultisetIO.hpp index ab2efbc..a857a7b 100644 --- a/src/mod/lib/Graph/MultisetIO.h +++ b/libs/libmod/src/mod/lib/Graph/MultisetIO.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_GRAPH_MULTISETIO_H #define MOD_LIB_GRAPH_MULTISETIO_H -#include +#include #include diff --git a/src/mod/lib/Graph/Properties/Depiction.cpp b/libs/libmod/src/mod/lib/Graph/Properties/Depiction.cpp similarity index 95% rename from src/mod/lib/Graph/Properties/Depiction.cpp rename to libs/libmod/src/mod/lib/Graph/Properties/Depiction.cpp index 5b35f16..509bbae 100644 --- a/src/mod/lib/Graph/Properties/Depiction.cpp +++ b/libs/libmod/src/mod/lib/Graph/Properties/Depiction.cpp @@ -1,13 +1,13 @@ -#include "Depiction.h" - -#include -#include -#include -#include -#include -#include -#include -#include +#include "Depiction.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Graph/Properties/Depiction.h b/libs/libmod/src/mod/lib/Graph/Properties/Depiction.hpp similarity index 95% rename from src/mod/lib/Graph/Properties/Depiction.h rename to libs/libmod/src/mod/lib/Graph/Properties/Depiction.hpp index 242991d..82e4daa 100644 --- a/src/mod/lib/Graph/Properties/Depiction.h +++ b/libs/libmod/src/mod/lib/Graph/Properties/Depiction.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_GRAPH_DEPICTION_H #define MOD_LIB_GRAPH_DEPICTION_H -#include -#include -#include +#include +#include +#include namespace mod { struct AtomId; diff --git a/src/mod/lib/Graph/Properties/Molecule.cpp b/libs/libmod/src/mod/lib/Graph/Properties/Molecule.cpp similarity index 92% rename from src/mod/lib/Graph/Properties/Molecule.cpp rename to libs/libmod/src/mod/lib/Graph/Properties/Molecule.cpp index baa63d4..df3cde1 100644 --- a/src/mod/lib/Graph/Properties/Molecule.cpp +++ b/libs/libmod/src/mod/lib/Graph/Properties/Molecule.cpp @@ -1,10 +1,10 @@ -#include "Molecule.h" +#include "Molecule.hpp" -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Graph/Properties/Molecule.h b/libs/libmod/src/mod/lib/Graph/Properties/Molecule.hpp similarity index 86% rename from src/mod/lib/Graph/Properties/Molecule.h rename to libs/libmod/src/mod/lib/Graph/Properties/Molecule.hpp index b15120e..0ffdf8f 100644 --- a/src/mod/lib/Graph/Properties/Molecule.h +++ b/libs/libmod/src/mod/lib/Graph/Properties/Molecule.hpp @@ -1,10 +1,10 @@ #ifndef MOD_LIB_GRAPH_PROP_MOLECULE_H #define MOD_LIB_GRAPH_PROP_MOLECULE_H -#include -#include -#include -#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Graph/Properties/Property.h b/libs/libmod/src/mod/lib/Graph/Properties/Property.hpp similarity index 96% rename from src/mod/lib/Graph/Properties/Property.h rename to libs/libmod/src/mod/lib/Graph/Properties/Property.hpp index 329aaf0..cf1c2fe 100644 --- a/src/mod/lib/Graph/Properties/Property.h +++ b/libs/libmod/src/mod/lib/Graph/Properties/Property.hpp @@ -1,10 +1,10 @@ #ifndef MOD_LIB_GRAPH_PROPERTY_H #define MOD_LIB_GRAPH_PROPERTY_H -#include -#include -#include -#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Graph/Properties/Stereo.h b/libs/libmod/src/mod/lib/Graph/Properties/Stereo.hpp similarity index 87% rename from src/mod/lib/Graph/Properties/Stereo.h rename to libs/libmod/src/mod/lib/Graph/Properties/Stereo.hpp index ca1eb64..f39aa7c 100644 --- a/src/mod/lib/Graph/Properties/Stereo.h +++ b/libs/libmod/src/mod/lib/Graph/Properties/Stereo.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_GRAPH_STATE_STEREO_H #define MOD_LIB_GRAPH_STATE_STEREO_H -#include -#include -#include +#include +#include +#include #include diff --git a/src/mod/lib/Graph/Properties/String.h b/libs/libmod/src/mod/lib/Graph/Properties/String.hpp similarity index 91% rename from src/mod/lib/Graph/Properties/String.h rename to libs/libmod/src/mod/lib/Graph/Properties/String.hpp index 4a17d8e..eaae1cd 100644 --- a/src/mod/lib/Graph/Properties/String.h +++ b/libs/libmod/src/mod/lib/Graph/Properties/String.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_GRAPH_PROP_LABEL_H #define MOD_LIB_GRAPH_PROP_LABEL_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Graph/Properties/Term.cpp b/libs/libmod/src/mod/lib/Graph/Properties/Term.cpp similarity index 90% rename from src/mod/lib/Graph/Properties/Term.cpp rename to libs/libmod/src/mod/lib/Graph/Properties/Term.cpp index bcb356e..6d83aaa 100644 --- a/src/mod/lib/Graph/Properties/Term.cpp +++ b/libs/libmod/src/mod/lib/Graph/Properties/Term.cpp @@ -1,10 +1,10 @@ -#include "Term.h" +#include "Term.hpp" -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Graph/Properties/Term.h b/libs/libmod/src/mod/lib/Graph/Properties/Term.hpp similarity index 90% rename from src/mod/lib/Graph/Properties/Term.h rename to libs/libmod/src/mod/lib/Graph/Properties/Term.hpp index d3db248..2015df1 100644 --- a/src/mod/lib/Graph/Properties/Term.h +++ b/libs/libmod/src/mod/lib/Graph/Properties/Term.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_GRAPH_PROP_TERM_H #define MOD_LIB_GRAPH_PROP_TERM_H -#include -#include +#include +#include #include diff --git a/src/mod/lib/Graph/Single.cpp b/libs/libmod/src/mod/lib/Graph/Single.cpp similarity index 94% rename from src/mod/lib/Graph/Single.cpp rename to libs/libmod/src/mod/lib/Graph/Single.cpp index 9ced166..84c5280 100644 --- a/src/mod/lib/Graph/Single.cpp +++ b/libs/libmod/src/mod/lib/Graph/Single.cpp @@ -1,27 +1,27 @@ -#include "Single.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Single.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Graph/Single.h b/libs/libmod/src/mod/lib/Graph/Single.hpp similarity index 95% rename from src/mod/lib/Graph/Single.h rename to libs/libmod/src/mod/lib/Graph/Single.hpp index f30a5af..c301e35 100644 --- a/src/mod/lib/Graph/Single.h +++ b/libs/libmod/src/mod/lib/Graph/Single.hpp @@ -1,11 +1,11 @@ #ifndef MOD_LIB_GRAPH_SINGLE_H #define MOD_LIB_GRAPH_SINGLE_H -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/GraphMorphism/Constraints/AllVisitor.h b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/AllVisitor.hpp similarity index 82% rename from src/mod/lib/GraphMorphism/Constraints/AllVisitor.h rename to libs/libmod/src/mod/lib/GraphMorphism/Constraints/AllVisitor.hpp index 901317d..344b3a3 100644 --- a/src/mod/lib/GraphMorphism/Constraints/AllVisitor.h +++ b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/AllVisitor.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_GRAPHMORPHISM_ALLVISITOR_H #define MOD_LIB_GRAPHMORPHISM_ALLVISITOR_H -#include -#include -#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/GraphMorphism/Constraints/CheckVisitor.h b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/CheckVisitor.hpp similarity index 97% rename from src/mod/lib/GraphMorphism/Constraints/CheckVisitor.h rename to libs/libmod/src/mod/lib/GraphMorphism/Constraints/CheckVisitor.hpp index c6f40f4..16ce4c7 100644 --- a/src/mod/lib/GraphMorphism/Constraints/CheckVisitor.h +++ b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/CheckVisitor.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_GRAPHMORPHISM_MATCHESVISITOR_H #define MOD_LIB_GRAPHMORPHISM_MATCHESVISITOR_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/GraphMorphism/Constraints/Constraint.h b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/Constraint.hpp similarity index 96% rename from src/mod/lib/GraphMorphism/Constraints/Constraint.h rename to libs/libmod/src/mod/lib/GraphMorphism/Constraints/Constraint.hpp index e725272..b5c6a89 100644 --- a/src/mod/lib/GraphMorphism/Constraints/Constraint.h +++ b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/Constraint.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_GRAPHMORPHISM_CONSTRAINT_H #define MOD_LIB_GRAPHMORPHISM_CONSTRAINT_H -#include +#include #include #include diff --git a/src/mod/lib/GraphMorphism/Constraints/ShortestPath.h b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/ShortestPath.hpp similarity index 96% rename from src/mod/lib/GraphMorphism/Constraints/ShortestPath.h rename to libs/libmod/src/mod/lib/GraphMorphism/Constraints/ShortestPath.hpp index c4c90b4..5384c7b 100644 --- a/src/mod/lib/GraphMorphism/Constraints/ShortestPath.h +++ b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/ShortestPath.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_GRAPHMORPHISM_SHORTESTPATH_H #define MOD_LIB_GRAPHMORPHISM_SHORTESTPATH_H -#include -#include -#include +#include +#include +#include #include diff --git a/src/mod/lib/GraphMorphism/Constraints/VertexAdjacency.h b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/VertexAdjacency.hpp similarity index 96% rename from src/mod/lib/GraphMorphism/Constraints/VertexAdjacency.h rename to libs/libmod/src/mod/lib/GraphMorphism/Constraints/VertexAdjacency.hpp index b94d3fc..a01fcc3 100644 --- a/src/mod/lib/GraphMorphism/Constraints/VertexAdjacency.h +++ b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/VertexAdjacency.hpp @@ -1,10 +1,10 @@ #ifndef MOD_LIB_GRAPHMORPHISM_ADJACENCY_H #define MOD_LIB_GRAPHMORPHISM_ADJACENCY_H -#include -#include -#include -#include +#include +#include +#include +#include #include #include diff --git a/src/mod/lib/GraphMorphism/Constraints/Visitor.h b/libs/libmod/src/mod/lib/GraphMorphism/Constraints/Visitor.hpp similarity index 100% rename from src/mod/lib/GraphMorphism/Constraints/Visitor.h rename to libs/libmod/src/mod/lib/GraphMorphism/Constraints/Visitor.hpp diff --git a/src/mod/lib/GraphMorphism/Finder.hpp b/libs/libmod/src/mod/lib/GraphMorphism/Finder.hpp similarity index 100% rename from src/mod/lib/GraphMorphism/Finder.hpp rename to libs/libmod/src/mod/lib/GraphMorphism/Finder.hpp diff --git a/src/mod/lib/GraphMorphism/LabelledMorphism.h b/libs/libmod/src/mod/lib/GraphMorphism/LabelledMorphism.hpp similarity index 98% rename from src/mod/lib/GraphMorphism/LabelledMorphism.h rename to libs/libmod/src/mod/lib/GraphMorphism/LabelledMorphism.hpp index 34315e0..9e3b817 100644 --- a/src/mod/lib/GraphMorphism/LabelledMorphism.h +++ b/libs/libmod/src/mod/lib/GraphMorphism/LabelledMorphism.hpp @@ -1,13 +1,13 @@ #ifndef MOD_LIB_GRAPHMORPHISM_LABELLEDMORPHISM_H #define MOD_LIB_GRAPHMORPHISM_LABELLEDMORPHISM_H -#include -#include +#include +#include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/mod/lib/GraphMorphism/McGregorCommonFinder.hpp b/libs/libmod/src/mod/lib/GraphMorphism/McGregorCommonFinder.hpp similarity index 100% rename from src/mod/lib/GraphMorphism/McGregorCommonFinder.hpp rename to libs/libmod/src/mod/lib/GraphMorphism/McGregorCommonFinder.hpp diff --git a/src/mod/lib/GraphMorphism/StereoVertexMap.h b/libs/libmod/src/mod/lib/GraphMorphism/StereoVertexMap.hpp similarity index 69% rename from src/mod/lib/GraphMorphism/StereoVertexMap.h rename to libs/libmod/src/mod/lib/GraphMorphism/StereoVertexMap.hpp index 37c27b0..350abbb 100644 --- a/src/mod/lib/GraphMorphism/StereoVertexMap.h +++ b/libs/libmod/src/mod/lib/GraphMorphism/StereoVertexMap.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_GRAPHMORPHISM_STEREOVERTEXMAP_H #define MOD_LIB_GRAPHMORPHISM_STEREOVERTEXMAP_H -#include -#include -#include +#include +#include +#include #include #include @@ -32,7 +32,7 @@ using EmbeddingEdge = lib::Stereo::EmbeddingEdge; struct LocalIso { template - bool operator()(const ConfPtr &cDom, const ConfPtr &cCodom, Args&&... args) const { + bool operator()(const ConfPtr &cDom, const ConfPtr &cCodom, Args &&... args) const { if(cDom->getGeometryVertex() != cCodom->getGeometryVertex()) return false; if(cDom->getNumLonePairs() != cCodom->getNumLonePairs()) return false; if(cDom->getHasRadical() != cCodom->getHasRadical()) return false; @@ -40,12 +40,12 @@ struct LocalIso { } template - bool operator()(const EdgeCategory catDom, const EdgeCategory catCodom, Args&&... args) const { + bool operator()(const EdgeCategory catDom, const EdgeCategory catCodom, Args &&... args) const { return catDom == catCodom; } template - bool operator()(const bool inContextDom, const bool inContextCodom, Args&&... args) const { + bool operator()(const bool inContextDom, const bool inContextCodom, Args &&... args) const { return inContextDom == inContextCodom; } }; @@ -53,8 +53,9 @@ struct LocalIso { struct LocalSpec { template - bool operator()(const ConfPtr &cDom, const ConfPtr &cCodom, Args&&... args) const { - bool isAncestor = lib::Stereo::getGeometryGraph().isAncestorOf(cDom->getGeometryVertex(), cCodom->getGeometryVertex()); + bool operator()(const ConfPtr &cDom, const ConfPtr &cCodom, Args &&... args) const { + bool isAncestor = lib::Stereo::getGeometryGraph().isAncestorOf(cDom->getGeometryVertex(), + cCodom->getGeometryVertex()); if(!isAncestor) return false; // TODO: check #lone pairs and #radicals // if they are different, we can't do any further checking @@ -63,12 +64,12 @@ struct LocalSpec { } template - bool operator()(const EdgeCategory catDom, const EdgeCategory catCodom, Args&&... args) const { + bool operator()(const EdgeCategory catDom, const EdgeCategory catCodom, Args &&... args) const { return catDom == catCodom || catDom == EdgeCategory::Any; } template - bool operator()(const bool inContextDom, const bool inContextCodom, Args&&... args) const { + bool operator()(const bool inContextDom, const bool inContextCodom, Args &&... args) const { return inContextCodom || !inContextDom; } }; @@ -79,16 +80,22 @@ struct LocalSpec { template struct PredIso { - PredIso(Next next) : next(next) { } + PredIso(Next next) : next(next) {} template - bool operator()(const VEDom &veDom, const VECodom &veCodom, const LabGraphDom &gDom, const LabGraphCodom &gCodom) const { + bool operator()(const VEDom &veDom, + const VECodom &veCodom, + const LabGraphDom &gDom, + const LabGraphCodom &gCodom) const { const auto &pDom = get_stereo(gDom); const auto &pCodom = get_stereo(gCodom); using Handler = typename LabGraphDom::PropStereoType::Handler; - const bool res = Handler::reduce(std::logical_and<>(), Handler::fmap2(get(pDom, veDom), get(pCodom, veCodom), gDom, gCodom, LocalIso())); + const bool res = Handler::reduce(std::logical_and<>(), + Handler::fmap2(get(pDom, veDom), get(pCodom, veCodom), gDom, gCodom, + LocalIso())); return res && next(veDom, veCodom, gDom, gCodom); } + private: Next next; }; @@ -105,16 +112,22 @@ auto makePredIso(Next next = jla_boost::AlwaysTrue()) { template struct PredSpec { - PredSpec(Next next) : next(next) { } + PredSpec(Next next) : next(next) {} template - bool operator()(const VEDom &veDom, const VECodom &veCodom, const LabGraphDom &gDom, const LabGraphCodom &gCodom) const { + bool operator()(const VEDom &veDom, + const VECodom &veCodom, + const LabGraphDom &gDom, + const LabGraphCodom &gCodom) const { using Handler = typename LabGraphDom::PropStereoType::Handler; const auto &pDom = get_stereo(gDom); const auto &pCodom = get_stereo(gCodom); - const bool res = Handler::reduce(std::logical_and<>(), Handler::fmap2(get(pDom, veDom), get(pCodom, veCodom), gDom, gCodom, LocalSpec())); + const bool res = Handler::reduce(std::logical_and<>(), + Handler::fmap2(get(pDom, veDom), get(pCodom, veCodom), gDom, gCodom, + LocalSpec())); return res && next(veDom, veCodom, gDom, gCodom); } + private: Next next; }; @@ -138,13 +151,19 @@ struct StereoDataSpec { template friend lib::Stereo::GeometryGraph::Vertex - get_geometry(const StereoDataSpec&, const LabGraphLeft &lgLeft, const LabGraphRight &lgRight, const VertexRight &vRight) { + get_geometry(const StereoDataSpec &, + const LabGraphLeft &lgLeft, + const LabGraphRight &lgRight, + const VertexRight &vRight) { return get_stereo(lgRight)[vRight]->getGeometryVertex(); } template friend lib::Stereo::EdgeCategory - get_edge_category(const StereoDataSpec&, const LabGraphLeft &lgLeft, const LabGraphRight &lgRight, const EdgeRight &eRight) { + get_edge_category(const StereoDataSpec &, + const LabGraphLeft &lgLeft, + const LabGraphRight &lgRight, + const EdgeRight &eRight) { return get_stereo(lgRight)[eRight]; } }; @@ -155,7 +174,7 @@ struct ToVertexMapBase { public: ToVertexMapBase(const LabGraphDom &lgDom, const LabGraphCodom &lgCodom, Next next) - : lgDom(lgDom), lgCodom(lgCodom), next(next) { } + : lgDom(lgDom), lgCodom(lgCodom), next(next) {} template bool operator()(VertexMap &&m, const GraphMorDom &gMorDom, const GraphMorCodom &gMorCodom) const { @@ -197,27 +216,30 @@ struct ToVertexMapBase { return next(getDerived().wrapVertexMap(std::move(m), pDom, pCodom, gMorDom, gMorCodom), gMorDom, gMorCodom); } + private: const Derived &getDerived() const { - return static_cast (*this); + return static_cast (*this); } + protected: template struct VertexMapper { - VertexMapper(F f, F2 f2) : f(f), f2(f2) { } + VertexMapper(F f, F2 f2) : f(f), f2(f2) {} template - decltype(auto) operator()(Args&&... args) const { + decltype(auto) operator()(Args &&... args) const { return f(std::forward(args)...); } template - decltype(auto) operator()(bool a, bool b, Args&&... args) const { + decltype(auto) operator()(bool a, bool b, Args &&... args) const { return f2(a, b, std::forward(args)...); } + private: F f; F2 f2; @@ -227,15 +249,23 @@ struct ToVertexMapBase { static auto makeVertexMapper(F f, F2 f2) { return VertexMapper(f, f2); } + protected: const LabGraphDom &lgDom; const LabGraphCodom &lgCodom; Next next; }; -template -std::vector makePermutation(const auto &vDom, const auto &vCodom, const VertexMap &m, const GraphMorDom &gMorDom, const GraphMorCodom &gMorCodom, - const ConfPtr &cDom, const ConfPtr &cCodom, const LabGraphDom &gLabDom, const LabGraphCodom &gLabCodom) { +template +std::vector makePermutation(const VertexDom &vDom, + const VertexCodom &vCodom, + const VertexMap &m, + const GraphMorDom &gMorDom, + const GraphMorCodom &gMorCodom, + const ConfPtr &cDom, + const ConfPtr &cCodom, + const LabGraphDom &gLabDom, + const LabGraphCodom &gLabCodom) { const auto &gDom = get_graph(gLabDom); const auto &gCodom = get_graph(gLabCodom); const auto lDeg = cDom->degree(); @@ -247,8 +277,7 @@ std::vector makePermutation(const auto &vDom, const auto &vCodom, c for(std::size_t i = 0; i < lDeg; ++i) { const auto &lEmb = lBeg[i]; switch(lEmb.type) { - case EmbeddingEdge::Type::Edge: - { + case EmbeddingEdge::Type::Edge: { const auto &eOutLeft = lEmb.getEdge(vDom, gDom); const auto vOutLeft = target(eOutLeft, gDom); const auto vOutRight = get(m, gMorDom, gMorCodom, vOutLeft); @@ -257,9 +286,10 @@ std::vector makePermutation(const auto &vDom, const auto &vCodom, c MOD_ABORT; } else { const auto oesRight = out_edges(vCodom, gCodom); - const auto oeRightIter = std::find_if(oesRight.first, oesRight.second, [vOutRight, &gCodom](const auto &eOutRight) { - return target(eOutRight, gCodom) == vOutRight; - }); + const auto oeRightIter = std::find_if(oesRight.first, oesRight.second, + [vOutRight, &gCodom](const auto &eOutRight) { + return target(eOutRight, gCodom) == vOutRight; + }); if(oeRightIter == oesRight.second) { // TODO: so, we have an edge to a vertex, which is not mapped to another edge? MOD_ABORT; @@ -278,11 +308,9 @@ std::vector makePermutation(const auto &vDom, const auto &vCodom, c } } break; - case Stereo::EmbeddingEdge::Type::LonePair: - perm[i] = -1; // to be mapped later + case Stereo::EmbeddingEdge::Type::LonePair: perm[i] = -1; // to be mapped later break; - case Stereo::EmbeddingEdge::Type::Radical: - MOD_ABORT; + case Stereo::EmbeddingEdge::Type::Radical: MOD_ABORT; perm[i] = -2; // to be mapped later break; } @@ -291,7 +319,8 @@ std::vector makePermutation(const auto &vDom, const auto &vCodom, c } template -struct ToVertexMapIso : ToVertexMapBase, LabGraphDom, LabGraphCodom, Next> { +struct ToVertexMapIso + : ToVertexMapBase, LabGraphDom, LabGraphCodom, Next> { using Base = ToVertexMapBase, LabGraphDom, LabGraphCodom, Next>; friend Base; using typename Base::Handler; @@ -302,18 +331,33 @@ struct ToVertexMapIso : ToVertexMapBase bool unifyEdges(const EdgeDom &eDom, const EdgeCodom &eCodom, const PropDom &pDom, const PropCodom &pCodom) const { - return Handler::reduce(std::logical_and<>(), Handler::fmap2(get(pDom, eDom), get(pCodom, eCodom), this->lgDom, this->lgCodom, LocalIso())); + return Handler::reduce(std::logical_and<>(), + Handler::fmap2(get(pDom, eDom), get(pCodom, eCodom), this->lgDom, this->lgCodom, + LocalIso())); } template - bool unifyGeometries(const VertexDom &vDom, const VertexCodom &vCodom, const PropDom &pDom, const PropCodom &pCodom) const { - return Handler::reduce(std::logical_and<>(), Handler::fmap2(get(pDom, vDom), get(pCodom, vCodom), this->lgDom, this->lgCodom, LocalIso())); + bool unifyGeometries(const VertexDom &vDom, + const VertexCodom &vCodom, + const PropDom &pDom, + const PropCodom &pCodom) const { + return Handler::reduce(std::logical_and<>(), + Handler::fmap2(get(pDom, vDom), get(pCodom, vCodom), this->lgDom, this->lgCodom, + LocalIso())); } template - bool mapNeighbourhoods(const VertexDom &vDom, const VertexCodom &vCodom, const PropDom &pDom, const PropCodom &pCodom, - const VertexMap &m, const GraphMorDom &gMorDom, const GraphMorCodom &gMorCodom) const { - const auto mapper = [&vDom, &gMorDom, &vCodom, &gMorCodom, &m](const ConfPtr &cDom, const ConfPtr &cCodom, const auto &gLabDom, const auto &gLabCodom) { + bool mapNeighbourhoods(const VertexDom &vDom, + const VertexCodom &vCodom, + const PropDom &pDom, + const PropCodom &pCodom, + const VertexMap &m, + const GraphMorDom &gMorDom, + const GraphMorCodom &gMorCodom) const { + const auto mapper = [&vDom, &gMorDom, &vCodom, &gMorCodom, &m](const ConfPtr &cDom, + const ConfPtr &cCodom, + const auto &gLabDom, + const auto &gLabCodom) { if(cDom->morphismStaticOk()) return true; if(cCodom->morphismStaticOk()) return true; if(cDom->morphismDynamicOk()) return true; @@ -322,11 +366,16 @@ struct ToVertexMapIso : ToVertexMapBasemorphismIso(*cCodom, perm); }; const auto vMapper = Base::makeVertexMapper(mapper, jla_boost::AlwaysTrue()); - return Handler::reduce(std::logical_and<>(), Handler::fmap2(get(pDom, vDom), get(pCodom, vCodom), this->lgDom, this->lgCodom, vMapper)); + return Handler::reduce(std::logical_and<>(), + Handler::fmap2(get(pDom, vDom), get(pCodom, vCodom), this->lgDom, this->lgCodom, vMapper)); } template - auto wrapVertexMap(VertexMap &&m, const PropDom &pDom, const PropCodom &pCodom, const GraphMorDom &gMorDom, const GraphMorCodom &gMorCodom) const { + auto wrapVertexMap(VertexMap &&m, + const PropDom &pDom, + const PropCodom &pCodom, + const GraphMorDom &gMorDom, + const GraphMorCodom &gMorCodom) const { // TODO: we _must_ add a stereo prop, otherwise the subsequent stages won't recognize that there is stereo! // return GM::addProp(std::move(m), StereoDataT(), StereoDataIso()); return std::move(m); @@ -339,7 +388,8 @@ auto makeToVertexMapIso(const LabGraphDom &gDom, const LabGraphCodom &gCodom, Ne } template -struct ToVertexMapSpec : ToVertexMapBase, LabGraphDom, LabGraphCodom, Next> { +struct ToVertexMapSpec + : ToVertexMapBase, LabGraphDom, LabGraphCodom, Next> { using Base = ToVertexMapBase, LabGraphDom, LabGraphCodom, Next>; friend Base; using typename Base::Handler; @@ -352,18 +402,32 @@ struct ToVertexMapSpec : ToVertexMapBase(), Handler::fmap2(propDom, propCodom, this->lgDom, this->lgCodom, LocalSpec())); + return Handler::reduce(std::logical_and<>(), + Handler::fmap2(propDom, propCodom, this->lgDom, this->lgCodom, LocalSpec())); } template - bool unifyGeometries(const VertexDom &vDom, const VertexCodom &vCodom, const PropDom &pDom, const PropCodom &pCodom) const { - return Handler::reduce(std::logical_and<>(), Handler::fmap2(get(pDom, vDom), get(pCodom, vCodom), this->lgDom, this->lgCodom, LocalSpec())); + bool unifyGeometries(const VertexDom &vDom, + const VertexCodom &vCodom, + const PropDom &pDom, + const PropCodom &pCodom) const { + return Handler::reduce(std::logical_and<>(), + Handler::fmap2(get(pDom, vDom), get(pCodom, vCodom), this->lgDom, this->lgCodom, + LocalSpec())); } template - bool mapNeighbourhoods(const VertexDom &vDom, const VertexCodom &vCodom, const PropDom &pDom, const PropCodom &pCodom, - const VertexMap &m, const GraphMorDom &gMorDom, const GraphMorCodom &gMorCodom) const { - const auto mapper = [&vDom, &gMorDom, &vCodom, &gMorCodom, &m](const ConfPtr &cDom, const ConfPtr &cCodom, const auto &gLabDom, const auto &gLabCodom) { + bool mapNeighbourhoods(const VertexDom &vDom, + const VertexCodom &vCodom, + const PropDom &pDom, + const PropCodom &pCodom, + const VertexMap &m, + const GraphMorDom &gMorDom, + const GraphMorCodom &gMorCodom) const { + const auto mapper = [&vDom, &gMorDom, &vCodom, &gMorCodom, &m](const ConfPtr &cDom, + const ConfPtr &cCodom, + const auto &gLabDom, + const auto &gLabCodom) { if(cDom->morphismStaticOk()) return true; if(cCodom->morphismStaticOk()) return true; if(cDom->morphismDynamicOk()) return true; @@ -372,11 +436,16 @@ struct ToVertexMapSpec : ToVertexMapBasemorphismSpec(*cCodom, perm); }; const auto vMapper = Base::makeVertexMapper(mapper, jla_boost::AlwaysTrue()); - return Handler::reduce(std::logical_and<>(), Handler::fmap2(get(pDom, vDom), get(pCodom, vCodom), this->lgDom, this->lgCodom, vMapper)); + return Handler::reduce(std::logical_and<>(), + Handler::fmap2(get(pDom, vDom), get(pCodom, vCodom), this->lgDom, this->lgCodom, vMapper)); } template - auto wrapVertexMap(VertexMap &&m, const PropDom &pDom, const PropCodom &pCodom, const GraphMorDom &gMorDom, const GraphMorCodom &gMorCodom) const { + auto wrapVertexMap(VertexMap &&m, + const PropDom &pDom, + const PropCodom &pCodom, + const GraphMorDom &gMorDom, + const GraphMorCodom &gMorCodom) const { return GM::addProp(std::move(m), StereoDataT(), StereoDataSpec()); } }; diff --git a/src/mod/lib/GraphMorphism/TermVertexMap.h b/libs/libmod/src/mod/lib/GraphMorphism/TermVertexMap.hpp similarity index 98% rename from src/mod/lib/GraphMorphism/TermVertexMap.h rename to libs/libmod/src/mod/lib/GraphMorphism/TermVertexMap.hpp index 56b49b1..757afab 100644 --- a/src/mod/lib/GraphMorphism/TermVertexMap.h +++ b/libs/libmod/src/mod/lib/GraphMorphism/TermVertexMap.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_GRAPHMORPHISM_TERMVERTEXMAP_H #define MOD_LIB_GRAPHMORPHISM_TERMVERTEXMAP_H -#include -#include -#include +#include +#include +#include #include #include @@ -13,8 +13,8 @@ // - Filters for isRenaming and isSpecialisation // for debugging -#include -#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/GraphMorphism/VF2Finder.hpp b/libs/libmod/src/mod/lib/GraphMorphism/VF2Finder.hpp similarity index 100% rename from src/mod/lib/GraphMorphism/VF2Finder.hpp rename to libs/libmod/src/mod/lib/GraphMorphism/VF2Finder.hpp diff --git a/libs/libmod/src/mod/lib/GraphPimpl.hpp b/libs/libmod/src/mod/lib/GraphPimpl.hpp new file mode 100644 index 0000000..1afad2b --- /dev/null +++ b/libs/libmod/src/mod/lib/GraphPimpl.hpp @@ -0,0 +1,301 @@ +#ifndef MOD_LIB_GRAPHPIMPL_H +#define MOD_LIB_GRAPHPIMPL_H + +#include + +#include + +namespace mod { +namespace lib { + +#define MOD_GRAPHPIMPL_Define_Vertex(Graph, OwnerLowerCase, getMacroGraph, g, Owner) \ + \ +Graph::Vertex::Vertex(std::shared_ptr g, std::size_t vId) : g(g), vId(vId) { \ + assert(g); \ + using boost::vertices; \ + const auto &graph = getMacroGraph; \ + const auto &vs = vertices(graph); \ + if(vId >= std::distance(vs.first, vs.second)) { \ + this->g = nullptr; \ + this->vId = 0; \ + } \ +} \ + \ +Graph::Vertex::Vertex() : vId(0) { } \ + \ +std::ostream &operator<<(std::ostream &s, const Graph::Vertex &v) { \ + s << #Graph "Vertex("; \ + if(!v.get ## Owner()) s << "null"; \ + else s << *v.get ## Owner() << ", " << v.getId(); \ + return s << ")"; \ +} \ + \ +bool operator==(const Graph::Vertex &v1, const Graph::Vertex &v2) { \ + return v1.g == v2.g && v1.vId == v2.vId; \ +} \ + \ +bool operator!=(const Graph::Vertex &v1, const Graph::Vertex &v2) { \ + return !(v1 == v2); \ +} \ + \ +bool operator<(const Graph::Vertex &v1, const Graph::Vertex &v2) { \ + return std::tie(v1.g, v1.vId) < std::tie(v2.g, v2.vId); \ +} \ + \ +std::size_t Graph::Vertex::hash() const { \ + if(g) return getId(); \ + else return -1; \ +} \ + \ +Graph::Vertex::operator bool() const { \ + return !isNull(); \ +} \ + \ +bool Graph::Vertex::isNull() const { \ + return *this == Graph::Vertex(); \ +} \ + \ +std::size_t Graph::Vertex::getId() const { \ + if(!g) throw LogicError("Can not get id on a null vertex."); \ + const auto &graph = getMacroGraph; \ + using boost::vertices; \ + auto v = *std::next(vertices(graph).first, vId); \ + return get(boost::vertex_index_t(), graph, v); \ +} \ + \ +std::shared_ptr Graph::Vertex::get ## Owner() const { \ + if(!g) throw LogicError("Can not get " #OwnerLowerCase " on a null vertex."); \ + return g; \ +} + + +#define MOD_GRAPHPIMPL_Define_Vertex_Undirected(Graph, GraphLowerCase, getMacroGraph, g) \ + \ +std::size_t Graph::Vertex::getDegree() const { \ + if(!g) throw LogicError("Can not get degree on a null vertex."); \ + const auto &graph = getMacroGraph; \ + using boost::vertices; \ + auto v = *std::next(vertices(graph).first, vId); \ + return out_degree(v, graph); \ +} \ + \ +Graph::IncidentEdgeRange Graph::Vertex::incidentEdges() const { \ + if(!g) throw LogicError("Can not get incident edges on a null vertex."); \ + return IncidentEdgeRange(g, vId); \ +} + + +#define MOD_GRAPHPIMPL_Define_Vertex_Directed(Graph, GraphLowerCase, getMacroGraph, g) \ + \ +std::size_t Graph::Vertex::inDegree() const { \ + if(!g) throw LogicError("Can not get in-degree on a null vertex."); \ + const auto &graph = getMacroGraph; \ + using boost::vertices; \ + auto v = *std::next(vertices(graph).first, vId); \ + return in_degree(v, graph); \ +} \ + \ +std::size_t Graph::Vertex::outDegree() const { \ + if(!g) throw LogicError("Can not get out-degree on a null vertex."); \ + const auto &graph = getMacroGraph; \ + using boost::vertices; \ + auto v = *std::next(vertices(graph).first, vId); \ + return out_degree(v, graph); \ +} + + +#define MOD_GRAPHPIMPL_Define_Indices(Graph, OwnerLowerCase, getMacroGraph, g, getGraph, Owner) \ + \ +/*----------------------------------------------------------------------------*/ \ +/* Edge */ \ +/*----------------------------------------------------------------------------*/ \ + \ +Graph::Edge::Edge(std::shared_ptr g, std::size_t vId, std::size_t eId) : g(g), vId(vId), eId(eId) { \ + assert(g); \ + using boost::vertices; \ + const auto &graph = getMacroGraph; \ + const auto &vs = vertices(graph); \ + if(vId >= std::distance(vs.first, vs.second) \ + || eId >= out_degree(*std::next(vertices(graph).first, vId), graph)) { \ + this->g = nullptr; \ + this->vId = 0; \ + this->eId = 0; \ + } \ +} \ + \ +Graph::Edge::Edge() : vId(0), eId(0) { } \ + \ +std::ostream &operator<<(std::ostream &s, const Graph::Edge &e) { \ + s << #Graph "Edge("; \ + if(e.g) s << *e.getGraph() << ", " << e.source().getId() << ", " << e.target().getId(); \ + else s << "null"; \ + return s << ")"; \ +} \ + \ +bool operator==(const Graph::Edge &e1, const Graph::Edge &e2) { \ + if(e1.g && e2.g) \ + return (e1.source() == e2.source() && e1.target() == e2.target()) \ + || (e1.source() == e2.target() && e1.target() == e2.source()); \ + else if(!e1.g && !e2.g) return true; \ + else return false; \ +} \ + \ +bool operator!=(const Graph::Edge &e1, const Graph::Edge &e2) { \ + return !(e1 == e2); \ +} \ + \ +bool operator<(const Graph::Edge &e1, const Graph::Edge &e2) { \ + return std::tie(e1.g, e1.vId, e1.eId) < std::tie(e2.g, e2.vId, e2.eId); \ +} \ + \ +Graph::Edge::operator bool() const { \ + return !isNull(); \ +} \ + \ +bool Graph::Edge::isNull() const { \ + return *this == Graph::Edge(); \ +} \ + \ +std::shared_ptr Graph::Edge::getGraph() const { \ + if(!g) throw LogicError("Can not get graph on a null edge."); \ + return g; \ +} \ + \ +Graph::Vertex Graph::Edge::source() const { \ + if(!g) throw LogicError("Can not get source on a null edge."); \ + return Vertex(g, vId); \ +} \ + \ +Graph::Vertex Graph::Edge::target() const { \ + if(!g) throw LogicError("Can not get target on a null edge."); \ + const auto &graph = getMacroGraph; \ + using boost::vertices; \ + auto v = *std::next(vertices(graph).first, vId); \ + auto e = *std::next(out_edges(v, graph).first, eId); \ + using boost::target; \ + auto vTar = target(e, graph); \ + const auto &vs = vertices(graph); \ + auto vTarIter = std::find(vs.first, vs.second, vTar); \ + return Vertex(g, std::distance(vs.first, vTarIter)); \ +} \ + \ +/*----------------------------------------------------------------------------*/ \ +/* VertexIterator */ \ +/*----------------------------------------------------------------------------*/ \ + \ +Graph::VertexIterator::VertexIterator(std::shared_ptr g) : g(g), vId(0) { \ + assert(g); \ + using boost::vertices; \ + const auto &graph = getMacroGraph; \ + const auto &vs = vertices(graph); \ + if(0 == std::distance(vs.first, vs.second)) \ + this->g = nullptr; \ +} \ + \ +Graph::VertexIterator::VertexIterator() : g(nullptr), vId(0) { } \ + \ +Graph::Vertex Graph::VertexIterator::dereference() const { \ + return Graph::Vertex(g, vId); \ +} \ + \ +bool Graph::VertexIterator::equal(const VertexIterator &iter) const { \ + if(g) return g == iter.g && vId == iter.vId; \ + else return g == iter.g; \ +} \ + \ +void Graph::VertexIterator::increment() { \ + ++this->vId; \ + using boost::vertices; \ + const auto &graph = getMacroGraph; \ + const auto &vs = vertices(graph); \ + if(vId >= std::distance(vs.first, vs.second)) { \ + this->g = nullptr; \ + this->vId = 0; \ + } \ +} \ + \ +/*----------------------------------------------------------------------------*/ \ +/* EdgeIterator */ \ +/*----------------------------------------------------------------------------*/ \ + \ +Graph::EdgeIterator::EdgeIterator(std::shared_ptr g) : g(g), vId(0), eId(0) { \ + assert(g); \ + advanceToValid(); \ +} \ + \ +Graph::EdgeIterator::EdgeIterator() : g(nullptr), vId(0), eId(0) { } \ + \ +Graph::Edge Graph::EdgeIterator::dereference() const { \ + return Edge(g, vId, eId); \ +} \ + \ +bool Graph::EdgeIterator::equal(const EdgeIterator &iter) const { \ + if(g) return g == iter.g && vId == iter.vId && eId == iter.eId; \ + else return g == iter.g; \ +} \ + \ +void Graph::EdgeIterator::increment() { \ + eId++; \ + advanceToValid(); \ +} \ + \ +void Graph::EdgeIterator::advanceToValid() { \ + assert(g); \ + using boost::vertices; \ + const auto &graph = getMacroGraph; \ + const auto &vs = vertices(graph); \ + for(; vId < std::distance(vs.first, vs.second); vId++, eId = 0) { \ + using boost::vertices; \ + for(auto v = *std::next(vertices(graph).first, vId); eId < out_degree(v, graph); eId++) {\ + auto e = *std::next(out_edges(v, graph).first, eId); \ + auto vTar = target(e, graph); \ + if(get(boost::vertex_index_t(), graph, vTar) > get(boost::vertex_index_t(), graph, v)) \ + return; \ + } \ + } \ + g = nullptr; \ + vId = 0; \ + eId = 0; \ +} \ + \ +/*----------------------------------------------------------------------------*/ \ +/* IncidentEdgeIterator */ \ +/*----------------------------------------------------------------------------*/ \ + \ +Graph::IncidentEdgeIterator::IncidentEdgeIterator(std::shared_ptr g, std::size_t vId) : g(g), vId(vId), eId(0) { \ + assert(g); \ + const auto &graph = getMacroGraph; \ + using boost::vertices; \ + auto v = *std::next(vertices(graph).first, vId); \ + if(out_degree(v, graph) == 0) { \ + this->g = nullptr; \ + this->vId = 0; \ + } \ +} \ + \ +Graph::IncidentEdgeIterator::IncidentEdgeIterator() : g(nullptr), vId(0), eId(0) { } \ + \ +Graph::Edge Graph::IncidentEdgeIterator::dereference() const { \ + return Graph::Edge(g, vId, eId); \ +} \ + \ +bool Graph::IncidentEdgeIterator::equal(const IncidentEdgeIterator &iter) const { \ + if(g) return g == iter.g && vId == iter.vId && eId == iter.eId; \ + else return g == iter.g; \ +} \ + \ +void Graph::IncidentEdgeIterator::increment() { \ + ++this->eId; \ + const auto &graph = getMacroGraph; \ + using boost::vertices; \ + auto v = *std::next(vertices(graph).first, vId); \ + if(eId >= out_degree(v, graph)) { \ + this->g = nullptr; \ + this->vId = 0; \ + } \ +} + +} // namespace lib +} // namespace mod + +#endif /* MOD_LIB_GRAPHPIMPL_H */ \ No newline at end of file diff --git a/src/mod/lib/IO/DG.h b/libs/libmod/src/mod/lib/IO/DG.hpp similarity index 61% rename from src/mod/lib/IO/DG.h rename to libs/libmod/src/mod/lib/IO/DG.hpp index a14c038..a929746 100644 --- a/src/mod/lib/IO/DG.h +++ b/libs/libmod/src/mod/lib/IO/DG.hpp @@ -1,10 +1,10 @@ #ifndef MOD_LIB_IO_DG_H #define MOD_LIB_IO_DG_H -#include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -14,13 +14,17 @@ namespace mod { namespace lib { namespace DG { class Hyper; + class NonHyper; } // namespace DG namespace IO { namespace DG { namespace Read { -lib::DG::NonHyper *dump(const std::vector > &graphs, const std::vector > &rules, const std::string &file, std::ostream &err); -lib::DG::NonHyper *abstract(const std::string &s, std::ostream &err); +std::unique_ptr dump(const std::vector > &graphs, + const std::vector > &rules, + const std::string &file, + std::ostream &err); +std::unique_ptr abstract(const std::string &s, std::ostream &err); } // namespace Read namespace Write { using Vertex = lib::DG::HyperVertex; @@ -39,43 +43,92 @@ struct Options; struct SyntaxPrinter { - SyntaxPrinter(std::string file) : s(file) { } + SyntaxPrinter(std::string file) : s(file) {} + virtual std::string getName() const = 0; virtual void begin() = 0; virtual void end() = 0; virtual void comment(const std::string &str) = 0; - virtual void vertex(const std::string &id, const std::string &label, const std::string &image, const std::string &colour) = 0; + virtual void vertex(const std::string &id, + const std::string &label, + const std::string &image, + const std::string &colour) = 0; virtual void vertexHidden(const std::string &id, bool large) = 0; virtual void hyperEdge(const std::string &id, const std::string &label, const std::string &colour) = 0; - virtual void tailConnector(const std::string &idVertex, const std::string &idHyperEdge, const std::string &colour, unsigned int num, unsigned int maxNum) = 0; - virtual void headConnector(const std::string &idHyperEdge, const std::string &idVertex, const std::string &colour, unsigned int num, unsigned int maxNum) = 0; - virtual void shortcutEdge(const std::string &idTail, const std::string &idHead, const std::string &label, const std::string &colour, bool hasReverse) = 0; - virtual std::function getImageCreator() = 0; + virtual void tailConnector(const std::string &idVertex, + const std::string &idHyperEdge, + const std::string &colour, + unsigned int num, + unsigned int maxNum) = 0; + virtual void headConnector(const std::string &idHyperEdge, + const std::string &idVertex, + const std::string &colour, + unsigned int num, + unsigned int maxNum) = 0; + virtual void shortcutEdge(const std::string &idTail, + const std::string &idHead, + const std::string &label, + const std::string &colour, + bool hasReverse) = 0; + virtual std::function getImageCreator() = 0; public: FileHandle s; }; struct TikzPrinter : SyntaxPrinter { - TikzPrinter(std::string file, std::string coords, const Options &options, const IO::Graph::Write::Options &graphOptions) - : SyntaxPrinter(file), coords(coords), options(options), graphOptions(graphOptions) { } + TikzPrinter(std::string file, + std::string coords, + const Options &options, + const IO::Graph::Write::Options &graphOptions) + : SyntaxPrinter(file), coords(coords), options(options), graphOptions(graphOptions) {} std::string getName() const override { return "tikz"; } - void begin(); - void end(); - void comment(const std::string &str); - void vertex(const std::string &id, const std::string &label, const std::string &image, const std::string &colour); - void vertexHidden(const std::string &id, bool large); - void transitVertex(const std::string &idHost, const std::string &idTransit, const std::string &angle, const std::string &label); - void hyperEdge(const std::string &id, const std::string &label, const std::string &colour); - void connector(const std::string &idTail, const std::string &idHead, const std::string &colour, unsigned int num, unsigned int maxNum); - void tailConnector(const std::string &idVertex, const std::string &idHyperEdge, const std::string &colour, unsigned int num, unsigned int maxNum); - void headConnector(const std::string &idHyperEdge, const std::string &idVertex, const std::string &colour, unsigned int num, unsigned int maxNum); - void shortcutEdge(const std::string &idTail, const std::string &idHead, const std::string &label, const std::string &colour, bool hasReverse); - void transitEdge(const std::string &idTail, const std::string &idHead, const std::string &label, const std::string &colour); - std::function getImageCreator(); + + void begin() override; + void end() override; + void comment(const std::string &str) override; + void vertex(const std::string &id, + const std::string &label, + const std::string &image, + const std::string &colour) override; + void vertexHidden(const std::string &id, bool large) override; + void transitVertex(const std::string &idHost, + const std::string &idTransit, + const std::string &angle, + const std::string &label); + void hyperEdge(const std::string &id, const std::string &label, const std::string &colour) override; + void connector(const std::string &idTail, + const std::string &idHead, + const std::string &colour, + unsigned int num, + unsigned int maxNum); + void tailConnector(const std::string &idVertex, + const std::string &idHyperEdge, + const std::string &colour, + unsigned int num, + unsigned int maxNum) override; + void headConnector(const std::string &idHyperEdge, + const std::string &idVertex, + const std::string &colour, + unsigned int num, + unsigned int maxNum) override; + void shortcutEdge(const std::string &idTail, + const std::string &idHead, + const std::string &label, + const std::string &colour, + bool hasReverse) override; + void transitEdge(const std::string &idTail, + const std::string &idHead, + const std::string &label, + const std::string &colour); + std::function getImageCreator() override; public: std::string coords; const Options &options; @@ -94,7 +147,7 @@ struct Options { public: Options() : withShortcutEdges(true), withGraphImages(true), labelsAsLatexMath(true), - withShortcutEdgesAfterVisibility(false), withInlineGraphs(false) { } + withShortcutEdgesAfterVisibility(false), withInlineGraphs(false) {} Options &Non() { return WithShortcutEdges(false).WithGraphImages(false).LabelsAsLatexMath(false); @@ -190,7 +243,10 @@ struct Options { std::pair inDegreeVisible(DupVertex e, const lib::DG::Hyper &dg) const; std::pair outDegreeVisible(DupVertex e, const lib::DG::Hyper &dg) const; - bool isShortcutEdge(DupVertex e, const lib::DG::Hyper &dg, unsigned int inDegreeVisible, unsigned int outDegreeVisible) const; + bool isShortcutEdge(DupVertex e, + const lib::DG::Hyper &dg, + unsigned int inDegreeVisible, + unsigned int outDegreeVisible) const; std::string vDupToId(DupVertex vDup, const lib::DG::Hyper &dg) const; public: bool withShortcutEdges; @@ -200,18 +256,18 @@ struct Options { bool withInlineGraphs; std::string suffix; // appearance (not giving state) - std::function vertexVisible; - std::function vertexLabel; - std::function dupVertexLabel; - std::function hyperedgeVisible; - std::function hyperedgeLabel; - std::function vertexColour; - std::function hyperedgeColour; - std::function tailColour, headColour; - std::function auxPrinter; + std::function vertexVisible; + std::function vertexLabel; + std::function dupVertexLabel; + std::function hyperedgeVisible; + std::function hyperedgeLabel; + std::function vertexColour; + std::function hyperedgeColour; + std::function tailColour, headColour; + std::function auxPrinter; // - std::function) > rotationOverwrite; - std::function) > mirrorOverwrite; + std::function)> rotationOverwrite; + std::function)> mirrorOverwrite; // duplication (not giving state) // all vertices must be first and then all edges // all incarnations must be contiguous and in increasing order @@ -221,15 +277,15 @@ struct Options { }; struct Data { - struct Connections { + Connections(unsigned int numTails, unsigned int numHeads) : tail(numTails, 0), head(numHeads, 0) {} - Connections(unsigned int numTails, unsigned int numHeads) : tail(numTails, 0), head(numHeads, 0) { } // indices are offsets on the in-/out-edge iterators // values are the duplicate numbers std::vector tail; std::vector head; }; + using ConnectionsStore = std::unordered_map >; public: explicit Data(const lib::DG::Hyper &dg); @@ -243,12 +299,13 @@ struct Data { const lib::DG::Hyper &getDG() const { return dg; } + private: const lib::DG::Hyper &dg; ConnectionsStore connections; // hyper-edge -> dupNum -> Connections std::set removedIfDegreeZero; public: - std::function dupVertexLabel; + std::function dupVertexLabel; }; struct Printer { @@ -256,21 +313,22 @@ struct Printer { std::pair printHyper(const Data &data, const IO::Graph::Write::Options &graphOptions); void pushSuffix(const std::string suffix); void popSuffix(); - void pushVertexVisible(std::function f); // visible(v) <=> all of pushed f(v)) + void pushVertexVisible(std::function f); // visible(v) <=> all of pushed f(v)) void popVertexVisible(); - void pushEdgeVisible(std::function f); // visible(v) <=> all of pushed f(v)) + void pushEdgeVisible(std::function f); // visible(v) <=> all of pushed f(v)) void popEdgeVisible(); - void pushVertexLabel(std::function f); + void pushVertexLabel(std::function f); void popVertexLabel(); - void pushEdgeLabel(std::function f); + void pushEdgeLabel(std::function f); void popEdgeLabel(); - void pushVertexColour(std::function f, bool extendToEdges); // colour(v) == first f(v) != "" + void pushVertexColour(std::function f, + bool extendToEdges); // colour(v) == first f(v) != "" void popVertexColour(); - void pushEdgeColour(std::function f); // colour(v) == first f(v) != "" + void pushEdgeColour(std::function f); // colour(v) == first f(v) != "" void popEdgeColour(); public: - void setRotationOverwrite(std::function) > f); - void setMirrorOverwrite(std::function) > f); + void setRotationOverwrite(std::function)> f); + void setMirrorOverwrite(std::function)> f); public: Options prePrint(const Data &data); void postPrint(); @@ -281,10 +339,10 @@ struct Printer { private: std::vector suffixes; // not giving state - std::vector > vertexVisibles, edgeVisibles; - std::vector > vertexLabels, edgeLabels; - std::vector, bool> > vertexColour; - std::vector > edgeColour; + std::vector > vertexVisibles, edgeVisibles; + std::vector > vertexLabels, edgeLabels; + std::vector, bool> > vertexColour; + std::vector > edgeColour; public: std::string vertexLabelSep, edgeLabelSep; bool withGraphName, withRuleName, withRuleId; @@ -293,10 +351,16 @@ struct Printer { void generic(const lib::DG::Hyper &dg, const Options &options, SyntaxPrinter &print); std::string dot(const lib::DG::Hyper &dg, const Options &options, const IO::Graph::Write::Options &graphOptions); std::string coords(const lib::DG::Hyper &dg, const Options &options, const IO::Graph::Write::Options &graphOptions); -std::pair tikz(const lib::DG::Hyper &dg, const Options &options, const IO::Graph::Write::Options &graphOptions); +std::pair tikz(const lib::DG::Hyper &dg, + const Options &options, + const IO::Graph::Write::Options &graphOptions); std::string pdfFromDot(const lib::DG::Hyper &dg, const Options &options, const IO::Graph::Write::Options &graphOptions); -std::pair pdf(const lib::DG::Hyper &dg, const Options &options, const IO::Graph::Write::Options &graphOptions); -std::pair summary(const Data &data, Printer &printer, const IO::Graph::Write::Options &graphOptions); +std::pair pdf(const lib::DG::Hyper &dg, + const Options &options, + const IO::Graph::Write::Options &graphOptions); +std::pair summary(const Data &data, + Printer &printer, + const IO::Graph::Write::Options &graphOptions); } // namespace Write } // namespace DG diff --git a/src/mod/lib/IO/DGRead.cpp b/libs/libmod/src/mod/lib/IO/DGRead.cpp similarity index 76% rename from src/mod/lib/IO/DGRead.cpp rename to libs/libmod/src/mod/lib/IO/DGRead.cpp index e0fb2af..40968bf 100644 --- a/src/mod/lib/IO/DGRead.cpp +++ b/libs/libmod/src/mod/lib/IO/DGRead.cpp @@ -1,14 +1,14 @@ -#include "DG.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "DG.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -50,13 +50,14 @@ namespace { struct NonHyperAbstract : public lib::DG::NonHyper { NonHyperAbstract(const std::vector &derivations) - : NonHyper({}, - { + : NonHyper({}, + { - LabelType::String, LabelRelation::Isomorphism, false, LabelRelation::Isomorphism - }), derivationsForConstruction(&derivations) { + LabelType::String, LabelRelation::Isomorphism, false, LabelRelation::Isomorphism + }), derivationsForConstruction(&derivations) { calculate(true); } + private: virtual std::string getType() const override { @@ -67,7 +68,7 @@ struct NonHyperAbstract : public lib::DG::NonHyper { const auto &derivations = *derivationsForConstruction; std::unordered_map > strToGraph; for(const auto &der : derivations) { - const auto handleSide = [this, &strToGraph] (const Derivation::List & side) { + const auto handleSide = [this, &strToGraph](const Derivation::List &side) { for(const auto &e : side) { const auto iter = strToGraph.find(e.second); if(iter == end(strToGraph)) { @@ -86,7 +87,7 @@ struct NonHyperAbstract : public lib::DG::NonHyper { } for(const auto &der : derivations) { using Side = std::unordered_map, unsigned int>; - const auto makeSide = [&strToGraph] (const Derivation::List & side) { + const auto makeSide = [&strToGraph](const Derivation::List &side) { Side result; for(const auto &e : side) { const auto g = strToGraph[e.second]; @@ -99,7 +100,7 @@ struct NonHyperAbstract : public lib::DG::NonHyper { }; const Side left = makeSide(der.left); const Side right = makeSide(der.right); - std::vector leftGraphs, rightGraphs; + std::vector leftGraphs, rightGraphs; for(const auto &e : left) { for(unsigned int i = 0; i < e.second; i++) leftGraphs.push_back(&e.first->getGraph()); @@ -117,7 +118,8 @@ struct NonHyperAbstract : public lib::DG::NonHyper { derivationsForConstruction = nullptr; } - virtual void listImpl(std::ostream &s) const override { } + virtual void listImpl(std::ostream &s) const override {} + private: std::vector > rules; const std::vector *derivationsForConstruction; @@ -131,10 +133,10 @@ struct NonHyperAbstract : public lib::DG::NonHyper { } // namespace mod BOOST_FUSION_ADAPT_STRUCT(mod::lib::IO::DG::Read::Derivation, - (mod::lib::IO::DG::Read::Derivation::List, left) - (bool, reverse) - (mod::lib::IO::DG::Read::Derivation::List, right) - ); + (mod::lib::IO::DG::Read::Derivation::List, left) + (bool, reverse) + (mod::lib::IO::DG::Read::Derivation::List, right) +); namespace mod { namespace lib { @@ -157,21 +159,19 @@ const auto derivations = +derivation; } // namespace parser } // namespace -lib::DG::NonHyper *dump(const std::vector > &graphs, const std::vector > &rules, const std::string &file, std::ostream &err) { - std::ifstream fileInStream(file.c_str()); - if(!fileInStream.is_open()) { - err << "DG file not found, '" << file << "'" << std::endl; - return nullptr; - } - return lib::DG::Dump::load(graphs, rules, fileInStream, err); +std::unique_ptr dump(const std::vector > &graphs, + const std::vector > &rules, + const std::string &file, + std::ostream &err) { + return lib::DG::Dump::load(graphs, rules, file, err); } -lib::DG::NonHyper *abstract(const std::string &s, std::ostream &err) { +std::unique_ptr abstract(const std::string &s, std::ostream &err) { auto iterStart = s.begin(), iterEnd = s.end(); std::vector derivations; bool res = lib::IO::parse(iterStart, iterEnd, parser::derivations, derivations, err, x3::space); if(!res) return nullptr; - return new NonHyperAbstract(derivations); + return std::make_unique(derivations); } } // namespace Read diff --git a/src/mod/lib/IO/DGWrite.cpp b/libs/libmod/src/mod/lib/IO/DGWrite.cpp similarity index 78% rename from src/mod/lib/IO/DGWrite.cpp rename to libs/libmod/src/mod/lib/IO/DGWrite.cpp index 8fa9e60..0912905 100644 --- a/src/mod/lib/IO/DGWrite.cpp +++ b/libs/libmod/src/mod/lib/IO/DGWrite.cpp @@ -1,22 +1,22 @@ -#include "DG.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "DG.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include @@ -35,7 +35,7 @@ std::string dump(const lib::DG::NonHyper &dg) { } std::string dotNonHyper(const lib::DG::NonHyper &nonHyper) { - FileHandle s(getUniqueFilePrefix() + "dgNonHyper_" + boost::lexical_cast (nonHyper.getId()) + ".dot"); + FileHandle s(getUniqueFilePrefix() + "dgNonHyper_" + boost::lexical_cast(nonHyper.getId()) + ".dot"); { // printing using Vertex = lib::DG::NonHyperVertex; using Edge = lib::DG::NonHyperEdge; @@ -93,7 +93,10 @@ void TikzPrinter::comment(const std::string &str) { s << "% " << str << "\n"; } -void TikzPrinter::vertex(const std::string &id, const std::string &label, const std::string &image, const std::string &colour) { +void TikzPrinter::vertex(const std::string &id, + const std::string &label, + const std::string &image, + const std::string &colour) { bool haveLabel = label != ""; bool haveImage = image != ""; s << "\\node[modStyleDGHyperVertex, at=(v-coord-" << id << ")"; @@ -122,7 +125,10 @@ void TikzPrinter::vertexHidden(const std::string &id, bool large) { s << ", at=(v-coord-" << id << ")] (v-" << id << ") {};" << std::endl; } -void TikzPrinter::transitVertex(const std::string &idHost, const std::string &idTransit, const std::string &angle, const std::string &label) { +void TikzPrinter::transitVertex(const std::string &idHost, + const std::string &idTransit, + const std::string &angle, + const std::string &label) { s << "\\node[modStyleDGTransitVertex, at=(v-" << idHost << "." << angle << ")"; if(!label.empty()) s << ", label=" << angle << ":{" << label << "}"; s << "] (v-" << idTransit << ") {};" << std::endl; @@ -139,7 +145,11 @@ void TikzPrinter::hyperEdge(const std::string &id, const std::string &label, con s << "};" << std::endl; } -void TikzPrinter::connector(const std::string &idTail, const std::string &idHead, const std::string &colour, unsigned int num, unsigned int maxNum) { +void TikzPrinter::connector(const std::string &idTail, + const std::string &idHead, + const std::string &colour, + unsigned int num, + unsigned int maxNum) { if(maxNum > 1) { s << "\\pgfmathparse{"; int position = num - maxNum / 2 - 1; @@ -154,15 +164,27 @@ void TikzPrinter::connector(const std::string &idTail, const std::string &idHead s << " (v-" << idHead << ");" << std::endl; } -void TikzPrinter::tailConnector(const std::string &idVertex, const std::string &idHyperEdge, const std::string &colour, unsigned int num, unsigned int maxNum) { +void TikzPrinter::tailConnector(const std::string &idVertex, + const std::string &idHyperEdge, + const std::string &colour, + unsigned int num, + unsigned int maxNum) { connector(idVertex, idHyperEdge, colour, num, maxNum); } -void TikzPrinter::headConnector(const std::string &idHyperEdge, const std::string &idVertex, const std::string &colour, unsigned int num, unsigned int maxNum) { +void TikzPrinter::headConnector(const std::string &idHyperEdge, + const std::string &idVertex, + const std::string &colour, + unsigned int num, + unsigned int maxNum) { connector(idHyperEdge, idVertex, colour, num, maxNum); } -void TikzPrinter::shortcutEdge(const std::string &idTail, const std::string &idHead, const std::string &label, const std::string &colour, bool hasReverse) { +void TikzPrinter::shortcutEdge(const std::string &idTail, + const std::string &idHead, + const std::string &label, + const std::string &colour, + bool hasReverse) { s << "\\path[modStyleDGHyperConnector"; if(!colour.empty()) s << ", draw=" << colour; s << "] (v-" << idTail << ") to"; @@ -175,7 +197,10 @@ void TikzPrinter::shortcutEdge(const std::string &idTail, const std::string &idH s << "} (v-" << idHead << ");" << std::endl; } -void TikzPrinter::transitEdge(const std::string &idTail, const std::string &idHead, const std::string &label, const std::string &colour) { +void TikzPrinter::transitEdge(const std::string &idTail, + const std::string &idHead, + const std::string &label, + const std::string &colour) { s << "\\path[modStyleDGHyperConnector"; if(!colour.empty()) s << ", draw=" << colour; s << "] (v-" << idTail << ") to"; @@ -187,8 +212,10 @@ void TikzPrinter::transitEdge(const std::string &idTail, const std::string &idHe s << "} (v-" << idHead << ");" << std::endl; } -std::function TikzPrinter::getImageCreator() { - return [this](const lib::DG::Hyper &dg, lib::DG::HyperVertex v, const std::string & id) -> std::string { +std::function TikzPrinter::getImageCreator() { + return [this](const lib::DG::Hyper &dg, lib::DG::HyperVertex v, const std::string &id) -> std::string { const auto &g = *dg.getGraph()[v].graph; const auto doIt = [&](const auto &gOpts) { if(this->options.withInlineGraphs) { @@ -243,11 +270,15 @@ std::pair Options::outDegreeVisible(DupVertex return std::make_pair(numVisible, vDupFirst); } -bool Options::isShortcutEdge(DupVertex e, const lib::DG::Hyper &dg, unsigned int inDegreeVisible, unsigned int outDegreeVisible) const { +bool Options::isShortcutEdge(DupVertex e, + const lib::DG::Hyper &dg, + unsigned int inDegreeVisible, + unsigned int outDegreeVisible) const { const auto &g = dg.getGraph(); Vertex v = dupGraph[e].v; - return (withShortcutEdges && in_degree(v, g) == 1 && out_degree(v, g) == 1 && inDegreeVisible > 0 && outDegreeVisible > 0) - || (withShortcutEdgesAfterVisibility && inDegreeVisible == 1 && outDegreeVisible == 1); + return (withShortcutEdges && in_degree(v, g) == 1 && out_degree(v, g) == 1 && inDegreeVisible > 0 && + outDegreeVisible > 0) + || (withShortcutEdgesAfterVisibility && inDegreeVisible == 1 && outDegreeVisible == 1); } std::string Options::vDupToId(DupVertex vDup, const lib::DG::Hyper &dg) const { @@ -263,7 +294,7 @@ std::string Options::vDupToId(DupVertex vDup, const lib::DG::Hyper &dg) const { Data::Data(const lib::DG::Hyper &dg) : dg(dg) { for(Vertex v : asRange(vertices(dg.getGraph()))) { - if(dg.getGraph()[v].kind != lib::DG::Hyper::VertexKind::Edge) continue; + if(dg.getGraph()[v].kind != lib::DG::HyperVertexKind::Edge) continue; std::unordered_map val; Connections c(in_degree(v, dg.getGraph()), out_degree(v, dg.getGraph())); val.insert(std::make_pair(0, std::move(c))); @@ -273,7 +304,8 @@ Data::Data(const lib::DG::Hyper &dg) : dg(dg) { void Data::makeDuplicate(Vertex e, unsigned int eDup) { const auto &dg = getDG().getGraph(); - assert(dg[e].kind == lib::DG::Hyper::VertexKind::Edge); + (void) dg; + assert(dg[e].kind == lib::DG::HyperVertexKind::Edge); auto iterEdgeDups = connections.find(e); assert(iterEdgeDups != end(connections)); auto iterEdgeCons = iterEdgeDups->second.find(eDup); @@ -285,7 +317,8 @@ void Data::makeDuplicate(Vertex e, unsigned int eDup) { void Data::removeDuplicate(Vertex e, unsigned int eDup) { const auto &dg = getDG().getGraph(); - assert(dg[e].kind == lib::DG::Hyper::VertexKind::Edge); + (void) dg; + assert(dg[e].kind == lib::DG::HyperVertexKind::Edge); auto iterEdgeDups = connections.find(e); assert(iterEdgeDups != end(connections)); iterEdgeDups->second.erase(eDup); @@ -293,18 +326,25 @@ void Data::removeDuplicate(Vertex e, unsigned int eDup) { namespace { -void reconnectCommon(const lib::DG::Hyper &dgHyper, Data::ConnectionsStore &connections, - Vertex v, unsigned int eDup, Vertex headOrTail, unsigned int vDupTar, unsigned int vDupSrc, bool isTail) { +void reconnectCommon(const lib::DG::Hyper &dgHyper, + Data::ConnectionsStore &connections, + Vertex v, + unsigned int eDup, + Vertex headOrTail, + unsigned int vDupTar, + unsigned int vDupSrc, + bool isTail) { // std::cout << "reconnect(" << std::boolalpha << isTail << ", " << v << ", " << eDup << ", " << headOrTail << ", " << vDupTar << ", " << vDupSrc << ")" << std::endl; const auto &dg = dgHyper.getGraph(); - assert(dg[v].kind == lib::DG::Hyper::VertexKind::Edge); - assert(dg[headOrTail].kind == lib::DG::Hyper::VertexKind::Vertex); + assert(dg[v].kind == lib::DG::HyperVertexKind::Edge); + assert(dg[headOrTail].kind == lib::DG::HyperVertexKind::Vertex); auto iterEdgeDups = connections.find(v); assert(iterEdgeDups != end(connections)); auto iterEdgeCons = iterEdgeDups->second.find(eDup); if(iterEdgeCons == end(iterEdgeDups->second)) { std::stringstream ss; - ss << "Derivation duplicate " << eDup << " does not exist for derivation " << dgHyper.getDerivation(v) << std::endl; + ss << "Derivation duplicate " << eDup << " does not exist for derivation " << dgHyper.getDerivation(v) + << std::endl; ss << "Duplicates:"; for(const auto &dups : iterEdgeDups->second) ss << " " << dups.first; ss << std::endl; @@ -316,8 +356,8 @@ void reconnectCommon(const lib::DG::Hyper &dgHyper, Data::ConnectionsStore &conn auto &dupNums = isTail ? cons.tail : cons.head; for(unsigned int i = 0; i < theDegree; i++) { Vertex vCand = isTail - ? *(inv_adjacent_vertices(v, dg).first + i) - : *(adjacent_vertices(v, dg).first + i); + ? *(inv_adjacent_vertices(v, dg).first + i) + : *(adjacent_vertices(v, dg).first + i); if(vCand != headOrTail) continue; if(vDupSrc != std::numeric_limits::max() && dupNums[i] != vDupSrc) continue; offset = i; @@ -330,8 +370,8 @@ void reconnectCommon(const lib::DG::Hyper &dgHyper, Data::ConnectionsStore &conn ss << " duplicate " << vDupSrc << " does not exist. Duplicates are:"; for(unsigned int i = 0; i < theDegree; i++) { Vertex vCand = isTail - ? *(inv_adjacent_vertices(v, dg).first + i) - : *(adjacent_vertices(v, dg).first + i); + ? *(inv_adjacent_vertices(v, dg).first + i) + : *(adjacent_vertices(v, dg).first + i); if(vCand != headOrTail) continue; ss << " " << dupNums[i]; } @@ -352,7 +392,7 @@ void Data::reconnectHead(Vertex v, unsigned int eDup, Vertex head, unsigned int } void Data::removeVertexIfDegreeZero(Vertex v) { - assert(getDG().getGraph()[v].kind == lib::DG::Hyper::VertexKind::Vertex); + assert(getDG().getGraph()[v].kind == lib::DG::HyperVertexKind::Vertex); removedIfDegreeZero.insert(v); } @@ -385,7 +425,8 @@ void Data::compile(Options &options) const { if(dg[v].kind != lib::DG::HyperVertexKind::Vertex) continue; unsigned int vId = idx[v]; const auto &dups = duplicates[vId]; - if(dups.empty() && removedIfDegreeZero.find(v) == removedIfDegreeZero.end()) { // happens when a vertex has degree 0 + if(dups.empty() && + removedIfDegreeZero.find(v) == removedIfDegreeZero.end()) { // happens when a vertex has degree 0 DupVertex vDup = add_vertex(dupGraph); dupGraph[vDup].v = v; dupGraph[vDup].dupNum = 0; @@ -437,9 +478,10 @@ void Data::compile(Options &options) const { //------------------------------------------------------------------------------ Printer::Printer() : vertexLabelSep(", "), edgeLabelSep(", "), -withGraphName(true), withRuleName(false), withRuleId(true) { } + withGraphName(true), withRuleName(false), withRuleId(true) {} -std::pair Printer::printHyper(const Data &data, const IO::Graph::Write::Options &graphOptions) { +std::pair Printer::printHyper(const Data &data, + const IO::Graph::Write::Options &graphOptions) { Options options = prePrint(data); const auto &dg = data.getDG(); const auto files = IO::DG::Write::pdf(dg, options, graphOptions); @@ -456,7 +498,7 @@ void Printer::popSuffix() { suffixes.pop_back(); } -void Printer::pushVertexVisible(std::function f) { +void Printer::pushVertexVisible(std::function f) { vertexVisibles.push_back(f); } @@ -465,7 +507,7 @@ void Printer::popVertexVisible() { vertexVisibles.pop_back(); } -void Printer::pushEdgeVisible(std::function f) { +void Printer::pushEdgeVisible(std::function f) { edgeVisibles.push_back(f); } @@ -474,7 +516,7 @@ void Printer::popEdgeVisible() { edgeVisibles.pop_back(); } -void Printer::pushVertexLabel(std::function f) { +void Printer::pushVertexLabel(std::function f) { vertexLabels.push_back(f); } @@ -483,7 +525,7 @@ void Printer::popVertexLabel() { vertexLabels.pop_back(); } -void Printer::pushEdgeLabel(std::function f) { +void Printer::pushEdgeLabel(std::function f) { edgeLabels.push_back(f); } @@ -492,7 +534,7 @@ void Printer::popEdgeLabel() { edgeLabels.pop_back(); } -void Printer::pushVertexColour(std::function f, bool extendToEdges) { +void Printer::pushVertexColour(std::function f, bool extendToEdges) { vertexColour.emplace_back(f, extendToEdges); } @@ -501,7 +543,7 @@ void Printer::popVertexColour() { vertexColour.pop_back(); } -void Printer::pushEdgeColour(std::function f) { +void Printer::pushEdgeColour(std::function f) { edgeColour.push_back(f); } @@ -510,11 +552,11 @@ void Printer::popEdgeColour() { edgeColour.pop_back(); } -void Printer::setRotationOverwrite(std::function) > f) { +void Printer::setRotationOverwrite(std::function)> f) { baseOptions.rotationOverwrite = f; } -void Printer::setMirrorOverwrite(std::function) > f) { +void Printer::setMirrorOverwrite(std::function)> f) { baseOptions.mirrorOverwrite = f; } @@ -522,39 +564,39 @@ Options Printer::prePrint(const Data &data) { Options options = baseOptions; data.compile(options); if(withGraphName) { - pushVertexLabel([](Vertex v, const lib::DG::Hyper & dg) -> std::string { + pushVertexLabel([](Vertex v, const lib::DG::Hyper &dg) -> std::string { const auto &g = dg.getGraph(); assert(g[v].kind == lib::DG::HyperVertexKind::Vertex); return g[v].graph->getName(); }); } if(withRuleId) { // we want the rule id before its name - pushEdgeLabel([this](Vertex v, const lib::DG::Hyper & dg) -> std::string { + pushEdgeLabel([this](Vertex v, const lib::DG::Hyper &dg) -> std::string { const auto &g = dg.getGraph(); assert(g[v].kind == lib::DG::HyperVertexKind::Edge); std::string res; bool first = true; - for(auto *r : g[v].rules) { + for(auto *r : dg.getRulesFromEdge(v)) { if(!first) res += this->edgeLabelSep; - first = false; - res += "r_{"; - res += boost::lexical_cast(r->getId()); - res += '}'; - } + first = false; + res += "r_{"; + res += boost::lexical_cast(r->getId()); + res += '}'; + } return res; }); } if(withRuleName) { - pushEdgeLabel([this](Vertex v, const lib::DG::Hyper & dg) -> std::string { + pushEdgeLabel([this](Vertex v, const lib::DG::Hyper &dg) -> std::string { const auto &g = dg.getGraph(); assert(g[v].kind == lib::DG::HyperVertexKind::Edge); std::string res; bool first = true; - for(auto *r : g[v].rules) { + for(auto *r : dg.getRulesFromEdge(v)) { if(!first) res += this->edgeLabelSep; - first = false; - res += r->getName(); - } + first = false; + res += r->getName(); + } return res; }); } @@ -572,21 +614,21 @@ void Printer::postPrint() { void Printer::setup(Options &options) { for(const auto &s : suffixes) options.suffix += s; - options.vertexVisible = [this](Vertex v, const lib::DG::Hyper & dg) { + options.vertexVisible = [this](Vertex v, const lib::DG::Hyper &dg) { for(const auto &f : vertexVisibles) { if(!f(v, dg)) return false; } return true; }; - options.hyperedgeVisible = [this](Vertex v, const lib::DG::Hyper & dg) { + options.hyperedgeVisible = [this](Vertex v, const lib::DG::Hyper &dg) { for(const auto &f : edgeVisibles) { if(!f(v, dg)) return false; } return true; }; - options.vertexLabel = [this](Vertex v, const lib::DG::Hyper & dg) { + options.vertexLabel = [this](Vertex v, const lib::DG::Hyper &dg) { std::string label; if(!vertexLabels.empty()) label += vertexLabels.front()(v, dg); for(unsigned int i = 1; i < vertexLabels.size(); i++) { @@ -600,7 +642,7 @@ void Printer::setup(Options &options) { } return label; }; - options.hyperedgeLabel = [this](Vertex v, const lib::DG::Hyper & dg) { + options.hyperedgeLabel = [this](Vertex v, const lib::DG::Hyper &dg) { std::string label; if(!edgeLabels.empty()) label += edgeLabels.front()(v, dg); for(unsigned int i = 1; i < edgeLabels.size(); i++) { @@ -610,7 +652,7 @@ void Printer::setup(Options &options) { return label; }; - options.vertexColour = [this](Vertex v, const lib::DG::Hyper & dg) { + options.vertexColour = [this](Vertex v, const lib::DG::Hyper &dg) { for(const auto &fp : vertexColour) { std::string colour = fp.first(v, dg); if(!colour.empty()) return colour; @@ -619,7 +661,7 @@ void Printer::setup(Options &options) { }; - auto getRawHyperEdgeColour = [this](Vertex v, const lib::DG::Hyper & dg) { + auto getRawHyperEdgeColour = [this](Vertex v, const lib::DG::Hyper &dg) { assert(dg.getGraph()[v].kind == lib::DG::HyperVertexKind::Edge); for(const auto &f : edgeColour) { std::string colour = f(v, dg); @@ -628,7 +670,7 @@ void Printer::setup(Options &options) { return std::string(); }; - auto getExtendColour = [this](Vertex v, const lib::DG::Hyper & dg) { + auto getExtendColour = [this](Vertex v, const lib::DG::Hyper &dg) { assert(dg.getGraph()[v].kind == lib::DG::HyperVertexKind::Vertex); for(const auto &fp : vertexColour) { if(!fp.second) continue; @@ -638,7 +680,7 @@ void Printer::setup(Options &options) { return std::string(); }; - auto getHyperedgeExtendColour = [getExtendColour](Vertex v, const lib::DG::Hyper & dg) { + auto getHyperedgeExtendColour = [getExtendColour](Vertex v, const lib::DG::Hyper &dg) { assert(dg.getGraph()[v].kind == lib::DG::HyperVertexKind::Edge); std::string tailColour, headColour; for(Vertex vAdj : asRange(inv_adjacent_vertices(v, dg.getGraph()))) { @@ -653,13 +695,14 @@ void Printer::setup(Options &options) { else return std::string(); }; - options.hyperedgeColour = [getRawHyperEdgeColour, getHyperedgeExtendColour](Vertex v, const lib::DG::Hyper & dg) { + options.hyperedgeColour = [getRawHyperEdgeColour, getHyperedgeExtendColour](Vertex v, const lib::DG::Hyper &dg) { assert(dg.getGraph()[v].kind == lib::DG::HyperVertexKind::Edge); std::string colour = getRawHyperEdgeColour(v, dg); if(!colour.empty()) return colour; return getHyperedgeExtendColour(v, dg); }; - options.tailColour = [this, getRawHyperEdgeColour, getExtendColour, getHyperedgeExtendColour](Vertex v, Vertex e, const lib::DG::Hyper & dg) { + options.tailColour = [getRawHyperEdgeColour, getExtendColour, + getHyperedgeExtendColour](Vertex v, Vertex e, const lib::DG::Hyper &dg) { assert(dg.getGraph()[v].kind == lib::DG::HyperVertexKind::Vertex); assert(dg.getGraph()[e].kind == lib::DG::HyperVertexKind::Edge); std::string colour = getRawHyperEdgeColour(e, dg); @@ -668,7 +711,8 @@ void Printer::setup(Options &options) { if(colour.empty()) return std::string(); else return getExtendColour(v, dg); }; - options.headColour = [this, getRawHyperEdgeColour, getExtendColour, getHyperedgeExtendColour](Vertex e, Vertex v, const lib::DG::Hyper & dg) { + options.headColour = [getRawHyperEdgeColour, getExtendColour, + getHyperedgeExtendColour](Vertex e, Vertex v, const lib::DG::Hyper &dg) { assert(dg.getGraph()[v].kind == lib::DG::HyperVertexKind::Vertex); assert(dg.getGraph()[e].kind == lib::DG::HyperVertexKind::Edge); std::string colour = getRawHyperEdgeColour(e, dg); @@ -696,9 +740,9 @@ void generic(const lib::DG::Hyper &dg, const Options &options, SyntaxPrinter &pr std::string label = options.getVertexLabel(dg, vDup); std::string image; if(options.withGraphImages) image = imageCreator(dg, v, id); - std::string colour = options.getVertexColour(v, dg); - print.vertex(id, label, image, colour); - }); + std::string colour = options.getVertexColour(v, dg); + print.vertex(id, label, image, colour); + }); // edges detail::forEachExplicitHyperEdge(dg, options, print, [&dg, &options, &print](DupVertex vDup) { @@ -748,69 +792,91 @@ std::string dot(const lib::DG::Hyper &dg, const Options &options, const IO::Grap struct DotPrinter : SyntaxPrinter { DotPrinter(std::string file, const IO::Graph::Write::Options &graphOptions) - : SyntaxPrinter(file), graphOptions(graphOptions) { } + : SyntaxPrinter(file), graphOptions(graphOptions) {} std::string getName() const override { return "dot"; } - void begin() { + virtual void begin() override { s << "digraph g {\n"; s << getConfig().dg.graphvizCoordsBegin.get() << '\n'; } - void end() { + virtual void end() override { s << "}" << std::endl; } - void comment(const std::string &str) { + virtual void comment(const std::string &str) override { s << "// " << str << std::endl; } - void vertex(const std::string &id, const std::string &label, const std::string &image, const std::string &colour) { + virtual void vertex(const std::string &id, + const std::string &label, + const std::string &image, + const std::string &colour) override { s << '"' << id << "\" [ shape=ellipse label=\"" << label << "\""; if(!image.empty()) s << " image=\"" << image << "\""; if(!colour.empty()) s << " color=\"" << colour << "\""; s << " ];" << std::endl; } - void vertexHidden(const std::string &id, bool large) { + virtual void vertexHidden(const std::string &id, bool large) override { s << '"' << id << "\" [ shape=point style=invis label=\"\" ];" << std::endl; } - void hyperEdge(const std::string &id, const std::string &label, const std::string &colour) { + virtual void hyperEdge(const std::string &id, const std::string &label, const std::string &colour) override { s << '"' << id << "\" [ shape=box label=\"" << label << "\""; if(!colour.empty()) s << "color=\"" << colour << "\""; s << " ];" << std::endl; } - void connector(const std::string &idSrc, const std::string &idTarget, const std::string &colour, unsigned int num, unsigned int maxNum) { + void connector(const std::string &idSrc, + const std::string &idTarget, + const std::string &colour, + unsigned int num, + unsigned int maxNum) { // dot handles parallel edges fine, just print the data s << '"' << idSrc << "\" -> \"" << idTarget << "\" ["; if(!colour.empty()) s << "color=\"" << colour << "\""; s << " ];" << std::endl; } - void tailConnector(const std::string &idVertex, const std::string &idHyperEdge, const std::string &colour, unsigned int num, unsigned int maxNum) { + virtual void tailConnector(const std::string &idVertex, + const std::string &idHyperEdge, + const std::string &colour, + unsigned int num, + unsigned int maxNum) override { connector(idVertex, idHyperEdge, colour, num, maxNum); } - void headConnector(const std::string &idHyperEdge, const std::string &idVertex, const std::string &colour, unsigned int num, unsigned int maxNum) { + virtual void headConnector(const std::string &idHyperEdge, + const std::string &idVertex, + const std::string &colour, + unsigned int num, + unsigned int maxNum) override { connector(idHyperEdge, idVertex, colour, num, maxNum); } - void shortcutEdge(const std::string &idTail, const std::string &idHead, const std::string &label, const std::string &colour, bool hasReverse) { + virtual void shortcutEdge(const std::string &idTail, + const std::string &idHead, + const std::string &label, + const std::string &colour, + bool hasReverse) override { s << '"' << idTail << "\" -> \"" << idHead << "\" [ label=\"" << label << "\""; if(!colour.empty()) s << " color=\"" << colour << "\""; s << " ];" << std::endl; } - std::function getImageCreator() { - return [this](const lib::DG::Hyper &dg, lib::DG::HyperVertex v, const std::string & id) -> std::string { + virtual std::function getImageCreator() override { + return [this](const lib::DG::Hyper &dg, lib::DG::HyperVertex v, const std::string &id) -> std::string { const auto &g = *dg.getGraph()[v].graph; return IO::Graph::Write::svg(g, graphOptions); }; } + public: const IO::Graph::Write::Options &graphOptions; }; @@ -832,7 +898,9 @@ std::string coords(const lib::DG::Hyper &dg, const Options &options, const IO::G return fileNoExt + "_coord.tex"; } -std::pair tikz(const lib::DG::Hyper &dg, const Options &options, const IO::Graph::Write::Options &graphOptions) { +std::pair tikz(const lib::DG::Hyper &dg, + const Options &options, + const IO::Graph::Write::Options &graphOptions) { std::string fileCoordsExt = coords(dg, options, graphOptions); std::string file = getUniqueFilePrefix(); file += "dg_" + boost::lexical_cast(dg.getNonHyper().getId()) + "_"; @@ -843,14 +911,18 @@ std::pair tikz(const lib::DG::Hyper &dg, const Options return std::make_pair(file, fileCoordsExt); } -std::string pdfFromDot(const lib::DG::Hyper &dg, const Options &options, const IO::Graph::Write::Options &graphOptions) { +std::string pdfFromDot(const lib::DG::Hyper &dg, + const Options &options, + const IO::Graph::Write::Options &graphOptions) { std::string fileNoExt = dot(dg, options, graphOptions); fileNoExt.erase(end(fileNoExt) - 4, end(fileNoExt)); IO::post() << "gv dgHyper \"" << fileNoExt << "\" pdf" << std::endl; return fileNoExt + ".pdf"; } -std::pair pdf(const lib::DG::Hyper &dg, const Options &options, const IO::Graph::Write::Options &graphOptions) { +std::pair pdf(const lib::DG::Hyper &dg, + const Options &options, + const IO::Graph::Write::Options &graphOptions) { auto tikzFiles = tikz(dg, options, graphOptions); std::string fileNoExt = tikzFiles.first.substr(0, tikzFiles.first.length() - 4); std::string fileCoordsNoExt = tikzFiles.second.substr(0, tikzFiles.second.length() - 4); @@ -860,7 +932,9 @@ std::pair pdf(const lib::DG::Hyper &dg, const Options return {fileNoExt + ".pdf", tikzFiles.second}; } -std::pair summary(const Data &data, Printer &printer, const IO::Graph::Write::Options &graphOptions) { +std::pair summary(const Data &data, + Printer &printer, + const IO::Graph::Write::Options &graphOptions) { const auto files = printer.printHyper(data, graphOptions); std::string fileNoExt = files.first; const auto &dg = data.getDG(); @@ -877,4 +951,4 @@ std::pair summary(const Data &data, Printer &printer, } // namespace DG } // namespace IO } // namespace lib -} // namespace mod \ No newline at end of file +} // namespace mod diff --git a/src/mod/lib/IO/DGWriteDetail.h b/libs/libmod/src/mod/lib/IO/DGWriteDetail.hpp similarity index 96% rename from src/mod/lib/IO/DGWriteDetail.h rename to libs/libmod/src/mod/lib/IO/DGWriteDetail.hpp index ad547c8..c5c36b3 100644 --- a/src/mod/lib/IO/DGWriteDetail.h +++ b/libs/libmod/src/mod/lib/IO/DGWriteDetail.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_IO_DGWRITEDETAIL_H #define MOD_LIB_IO_DGWRITEDETAIL_H -#include -#include +#include +#include #include @@ -131,8 +131,9 @@ void forEachConnector(const lib::DG::Hyper &dg, const Options &options, SyntaxPr headBody(vDup, vDupAdj, p.second); } } else { - bool hasReverse = g[v].reverse != g.null_vertex() - && options.isHyperedgeVisible(g[v].reverse, dg); + const auto vReverse = dg.getReverseEdge(v); + bool hasReverse = vReverse != g.null_vertex() + && options.isHyperedgeVisible(vReverse, dg); if(hasReverse) { // check if the reverse goes between the same vertex incarnations // TODO diff --git a/src/mod/lib/IO/Derivation.cpp b/libs/libmod/src/mod/lib/IO/Derivation.cpp similarity index 90% rename from src/mod/lib/IO/Derivation.cpp rename to libs/libmod/src/mod/lib/IO/Derivation.cpp index 55e60ed..44ec72f 100644 --- a/src/mod/lib/IO/Derivation.cpp +++ b/libs/libmod/src/mod/lib/IO/Derivation.cpp @@ -1,26 +1,26 @@ -#include "Derivation.h" +#include "Derivation.hpp" -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -128,13 +128,15 @@ void forEachMatch(const lib::DG::NonHyper &dg, lib::DG::HyperVertex v, const lib std::vector > summary(const lib::DG::NonHyper &dg, lib::DG::HyperVertex v, const IO::Graph::Write::Options &options, const std::string &nomatchColour, const std::string &matchColour) { - const lib::DG::HyperGraphType &dgGraph = dg.getHyper().getGraph(); - if(dgGraph[v].rules.empty()) { + const auto &dgHyper = dg.getHyper(); + const lib::DG::HyperGraphType &dgGraph = dgHyper.getGraph(); + const auto &rules = dgHyper.getRulesFromEdge(v); + if(rules.empty()) { IO::log() << "Warning: no rules on derivation to be printed." << std::endl; return {}; } std::vector > res; - for(const lib::Rules::Real *rPtr : dgGraph[v].rules) { + for(const lib::Rules::Real *rPtr : rules) { const lib::Rules::Real &rReal = *rPtr; if(!getConfig().dg.dryDerivationPrinting.get()) { IO::post() << "summarySectionNoEscape \"Derivation " << get(boost::vertex_index_t(), dgGraph, v); diff --git a/src/mod/lib/IO/Derivation.h b/libs/libmod/src/mod/lib/IO/Derivation.hpp similarity index 95% rename from src/mod/lib/IO/Derivation.h rename to libs/libmod/src/mod/lib/IO/Derivation.hpp index 3d2f863..2a4141b 100644 --- a/src/mod/lib/IO/Derivation.h +++ b/libs/libmod/src/mod/lib/IO/Derivation.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_IO_DERIVATION_H #define MOD_LIB_IO_DERIVATION_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/IO/FileHandle.cpp b/libs/libmod/src/mod/lib/IO/FileHandle.cpp similarity index 84% rename from src/mod/lib/IO/FileHandle.cpp rename to libs/libmod/src/mod/lib/IO/FileHandle.cpp index e328254..9afef42 100644 --- a/src/mod/lib/IO/FileHandle.cpp +++ b/libs/libmod/src/mod/lib/IO/FileHandle.cpp @@ -1,7 +1,7 @@ -#include "FileHandle.h" +#include "FileHandle.hpp" -#include -#include +#include +#include #include diff --git a/src/mod/lib/IO/FileHandle.h b/libs/libmod/src/mod/lib/IO/FileHandle.hpp similarity index 100% rename from src/mod/lib/IO/FileHandle.h rename to libs/libmod/src/mod/lib/IO/FileHandle.hpp diff --git a/src/mod/lib/IO/GMLUtil.cpp b/libs/libmod/src/mod/lib/IO/GMLUtil.cpp similarity index 92% rename from src/mod/lib/IO/GMLUtil.cpp rename to libs/libmod/src/mod/lib/IO/GMLUtil.cpp index b416e9f..986e513 100644 --- a/src/mod/lib/IO/GMLUtil.cpp +++ b/libs/libmod/src/mod/lib/IO/GMLUtil.cpp @@ -1,4 +1,4 @@ -#include +#include #include diff --git a/src/mod/lib/IO/GMLUtils.h b/libs/libmod/src/mod/lib/IO/GMLUtils.hpp similarity index 98% rename from src/mod/lib/IO/GMLUtils.h rename to libs/libmod/src/mod/lib/IO/GMLUtils.hpp index 28980a8..a065e66 100644 --- a/src/mod/lib/IO/GMLUtils.h +++ b/libs/libmod/src/mod/lib/IO/GMLUtils.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_IO_GMLUTILS_H #define MOD_LIB_IO_GMLUTILS_H -#include +#include #include #include diff --git a/src/mod/lib/IO/Graph.h b/libs/libmod/src/mod/lib/IO/Graph.hpp similarity index 99% rename from src/mod/lib/IO/Graph.h rename to libs/libmod/src/mod/lib/IO/Graph.hpp index 9fb6ea6..c40abf0 100644 --- a/src/mod/lib/IO/Graph.h +++ b/libs/libmod/src/mod/lib/IO/Graph.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_IO_GRAPH_H #define MOD_LIB_IO_GRAPH_H -#include +#include #include #include diff --git a/src/mod/lib/IO/GraphRead.cpp b/libs/libmod/src/mod/lib/IO/GraphRead.cpp similarity index 95% rename from src/mod/lib/IO/GraphRead.cpp rename to libs/libmod/src/mod/lib/IO/GraphRead.cpp index 5ddc8df..7b3ce30 100644 --- a/src/mod/lib/IO/GraphRead.cpp +++ b/libs/libmod/src/mod/lib/IO/GraphRead.cpp @@ -1,14 +1,14 @@ -#include "Graph.h" +#include "Graph.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/IO/GraphWrite.cpp b/libs/libmod/src/mod/lib/IO/GraphWrite.cpp similarity index 96% rename from src/mod/lib/IO/GraphWrite.cpp rename to libs/libmod/src/mod/lib/IO/GraphWrite.cpp index e7717d3..5091e78 100644 --- a/src/mod/lib/IO/GraphWrite.cpp +++ b/libs/libmod/src/mod/lib/IO/GraphWrite.cpp @@ -1,18 +1,18 @@ -#include "Graph.h" +#include "Graph.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/IO/GraphWriteDetail.h b/libs/libmod/src/mod/lib/IO/GraphWriteDetail.hpp similarity index 99% rename from src/mod/lib/IO/GraphWriteDetail.h rename to libs/libmod/src/mod/lib/IO/GraphWriteDetail.hpp index 89cca15..1d65a0c 100644 --- a/src/mod/lib/IO/GraphWriteDetail.h +++ b/libs/libmod/src/mod/lib/IO/GraphWriteDetail.hpp @@ -1,10 +1,10 @@ #ifndef MOD_LIB_IO_GRAPHWRITEDETAIL_H #define MOD_LIB_IO_GRAPHWRITEDETAIL_H -#include -#include -#include -#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/IO/IO.cpp b/libs/libmod/src/mod/lib/IO/IO.cpp similarity index 97% rename from src/mod/lib/IO/IO.cpp rename to libs/libmod/src/mod/lib/IO/IO.cpp index 37128cd..c259005 100644 --- a/src/mod/lib/IO/IO.cpp +++ b/libs/libmod/src/mod/lib/IO/IO.cpp @@ -1,6 +1,6 @@ -#include "IO.h" +#include "IO.hpp" -#include +#include #include diff --git a/src/mod/lib/IO/IO.h b/libs/libmod/src/mod/lib/IO/IO.hpp similarity index 100% rename from src/mod/lib/IO/IO.h rename to libs/libmod/src/mod/lib/IO/IO.hpp diff --git a/src/mod/lib/IO/MorphismConstraints.h b/libs/libmod/src/mod/lib/IO/MorphismConstraints.hpp similarity index 97% rename from src/mod/lib/IO/MorphismConstraints.h rename to libs/libmod/src/mod/lib/IO/MorphismConstraints.hpp index bc4a898..8612883 100644 --- a/src/mod/lib/IO/MorphismConstraints.h +++ b/libs/libmod/src/mod/lib/IO/MorphismConstraints.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_IO_MORPHISMCONSTRAINTS_H #define MOD_LIB_IO_MORPHISMCONSTRAINTS_H -#include -#include -#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/IO/ParsingUtil.h b/libs/libmod/src/mod/lib/IO/ParsingUtil.hpp similarity index 100% rename from src/mod/lib/IO/ParsingUtil.h rename to libs/libmod/src/mod/lib/IO/ParsingUtil.hpp diff --git a/src/mod/lib/IO/RC.cpp b/libs/libmod/src/mod/lib/IO/RC.cpp similarity index 96% rename from src/mod/lib/IO/RC.cpp rename to libs/libmod/src/mod/lib/IO/RC.cpp index 85e51fd..50895fd 100644 --- a/src/mod/lib/IO/RC.cpp +++ b/libs/libmod/src/mod/lib/IO/RC.cpp @@ -1,13 +1,13 @@ -#include "RC.h" +#include "RC.hpp" -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/IO/RC.h b/libs/libmod/src/mod/lib/IO/RC.hpp similarity index 97% rename from src/mod/lib/IO/RC.h rename to libs/libmod/src/mod/lib/IO/RC.hpp index 6dc6592..cc62f7f 100644 --- a/src/mod/lib/IO/RC.h +++ b/libs/libmod/src/mod/lib/IO/RC.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_IO_RC_H #define MOD_LIB_IO_RC_H -#include +#include #include diff --git a/src/mod/lib/IO/Rule.h b/libs/libmod/src/mod/lib/IO/Rule.hpp similarity index 95% rename from src/mod/lib/IO/Rule.h rename to libs/libmod/src/mod/lib/IO/Rule.hpp index 5526676..034d8b3 100644 --- a/src/mod/lib/IO/Rule.h +++ b/libs/libmod/src/mod/lib/IO/Rule.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_IO_RULE_H #define MOD_LIB_IO_RULE_H -#include -#include // to make sure the write options are defined -#include +#include +#include // to make sure the write options are defined +#include #include diff --git a/src/mod/lib/IO/RuleRead.cpp b/libs/libmod/src/mod/lib/IO/RuleRead.cpp similarity index 98% rename from src/mod/lib/IO/RuleRead.cpp rename to libs/libmod/src/mod/lib/IO/RuleRead.cpp index 2e54471..5f3e0ef 100644 --- a/src/mod/lib/IO/RuleRead.cpp +++ b/libs/libmod/src/mod/lib/IO/RuleRead.cpp @@ -1,11 +1,11 @@ -#include "Rule.h" +#include "Rule.hpp" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include diff --git a/src/mod/lib/IO/RuleWrite.cpp b/libs/libmod/src/mod/lib/IO/RuleWrite.cpp similarity index 97% rename from src/mod/lib/IO/RuleWrite.cpp rename to libs/libmod/src/mod/lib/IO/RuleWrite.cpp index fb52f54..94a467d 100644 --- a/src/mod/lib/IO/RuleWrite.cpp +++ b/libs/libmod/src/mod/lib/IO/RuleWrite.cpp @@ -1,18 +1,18 @@ -#include "Rule.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Rule.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -457,7 +457,8 @@ struct AdvOptions { } private: - std::string getStereoStringVertex(const CoreVertex v, const auto f) const { + template + std::string getStereoStringVertex(const CoreVertex v, const F f) const { const auto apply = [&](const auto &lg) { const auto &conf = *get_stereo(lg)[v]; const auto getNeighbourId = [&](const lib::Stereo::EmbeddingEdge & emb) { diff --git a/src/mod/lib/IO/Stereo.h b/libs/libmod/src/mod/lib/IO/Stereo.hpp similarity index 94% rename from src/mod/lib/IO/Stereo.h rename to libs/libmod/src/mod/lib/IO/Stereo.hpp index 49693c7..2f9e4b1 100644 --- a/src/mod/lib/IO/Stereo.h +++ b/libs/libmod/src/mod/lib/IO/Stereo.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_IO_STEREO_H #define MOD_LIB_IO_STEREO_H -#include -#include +#include +#include #include diff --git a/src/mod/lib/IO/StereoRead.cpp b/libs/libmod/src/mod/lib/IO/StereoRead.cpp similarity index 97% rename from src/mod/lib/IO/StereoRead.cpp rename to libs/libmod/src/mod/lib/IO/StereoRead.cpp index f5a5eca..26faac6 100644 --- a/src/mod/lib/IO/StereoRead.cpp +++ b/libs/libmod/src/mod/lib/IO/StereoRead.cpp @@ -1,6 +1,6 @@ -#include "Stereo.h" +#include "Stereo.hpp" -#include +#include #include #include diff --git a/src/mod/lib/IO/StereoWrite.cpp b/libs/libmod/src/mod/lib/IO/StereoWrite.cpp similarity index 97% rename from src/mod/lib/IO/StereoWrite.cpp rename to libs/libmod/src/mod/lib/IO/StereoWrite.cpp index f608067..b3e8dc7 100644 --- a/src/mod/lib/IO/StereoWrite.cpp +++ b/libs/libmod/src/mod/lib/IO/StereoWrite.cpp @@ -1,18 +1,18 @@ -#include "Stereo.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include +#include "Stereo.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include #include diff --git a/src/mod/lib/IO/Term.cpp b/libs/libmod/src/mod/lib/IO/Term.cpp similarity index 97% rename from src/mod/lib/IO/Term.cpp rename to libs/libmod/src/mod/lib/IO/Term.cpp index 0722ae0..6ab9054 100644 --- a/src/mod/lib/IO/Term.cpp +++ b/libs/libmod/src/mod/lib/IO/Term.cpp @@ -1,9 +1,9 @@ -#include "Term.h" +#include "Term.hpp" -#include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -244,7 +244,7 @@ std::ostream &term(const lib::Term::Wam &machine, lib::Term::Address addr, const const Wam &machine; const StringStore &strings; std::ostream &s; - std::size_t occursBase; + //std::size_t occursBase; std::unordered_set
occurred; }; Printer(machine, strings, s)(addr); diff --git a/src/mod/lib/IO/Term.h b/libs/libmod/src/mod/lib/IO/Term.hpp similarity index 94% rename from src/mod/lib/IO/Term.h rename to libs/libmod/src/mod/lib/IO/Term.hpp index f3e0b60..95d01b0 100644 --- a/src/mod/lib/IO/Term.h +++ b/libs/libmod/src/mod/lib/IO/Term.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_IO_TERM_H #define MOD_LIB_IO_TERM_H -#include -#include +#include +#include #include diff --git a/src/mod/lib/LabelledGraph.h b/libs/libmod/src/mod/lib/LabelledGraph.hpp similarity index 100% rename from src/mod/lib/LabelledGraph.h rename to libs/libmod/src/mod/lib/LabelledGraph.hpp diff --git a/src/mod/lib/LabelledUnionGraph.h b/libs/libmod/src/mod/lib/LabelledUnionGraph.hpp similarity index 98% rename from src/mod/lib/LabelledUnionGraph.h rename to libs/libmod/src/mod/lib/LabelledUnionGraph.hpp index 38836e7..58275d9 100644 --- a/src/mod/lib/LabelledUnionGraph.h +++ b/libs/libmod/src/mod/lib/LabelledUnionGraph.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_LABELLEDUNIONGRAPH_H #define MOD_LIB_LABELLEDUNIONGRAPH_H -#include +#include #include diff --git a/src/mod/lib/RC/Compose.h b/libs/libmod/src/mod/lib/RC/Compose.hpp similarity index 92% rename from src/mod/lib/RC/Compose.h rename to libs/libmod/src/mod/lib/RC/Compose.hpp index 5213218..5da680d 100644 --- a/src/mod/lib/RC/Compose.h +++ b/libs/libmod/src/mod/lib/RC/Compose.hpp @@ -5,9 +5,9 @@ // L <- K -> R, i.e., the "core" graph. // The graphs may not have parallel edges. -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/mod/lib/RC/ComposeRuleReal.cpp b/libs/libmod/src/mod/lib/RC/ComposeRuleReal.cpp similarity index 72% rename from src/mod/lib/RC/ComposeRuleReal.cpp rename to libs/libmod/src/mod/lib/RC/ComposeRuleReal.cpp index 29357e0..90f7b3b 100644 --- a/src/mod/lib/RC/ComposeRuleReal.cpp +++ b/libs/libmod/src/mod/lib/RC/ComposeRuleReal.cpp @@ -1,10 +1,10 @@ -#include "ComposeRuleReal.h" +#include "ComposeRuleReal.hpp" -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/RC/ComposeRuleReal.h b/libs/libmod/src/mod/lib/RC/ComposeRuleReal.hpp similarity index 97% rename from src/mod/lib/RC/ComposeRuleReal.h rename to libs/libmod/src/mod/lib/RC/ComposeRuleReal.hpp index 48401f4..c74af70 100644 --- a/src/mod/lib/RC/ComposeRuleReal.h +++ b/libs/libmod/src/mod/lib/RC/ComposeRuleReal.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_RC_COMPOSE_RULE_REAL_H #define MOD_LIB_RC_COMPOSE_RULE_REAL_H -#include +#include #include #include diff --git a/src/mod/lib/RC/ComposeRuleRealGeneric.h b/libs/libmod/src/mod/lib/RC/ComposeRuleRealGeneric.hpp similarity index 90% rename from src/mod/lib/RC/ComposeRuleRealGeneric.h rename to libs/libmod/src/mod/lib/RC/ComposeRuleRealGeneric.hpp index 7a8967c..163b6c7 100644 --- a/src/mod/lib/RC/ComposeRuleRealGeneric.h +++ b/libs/libmod/src/mod/lib/RC/ComposeRuleRealGeneric.hpp @@ -1,15 +1,15 @@ #ifndef MOD_LIB_RC_COMPOSE_RULE_REAL_GENERIC_H #define MOD_LIB_RC_COMPOSE_RULE_REAL_GENERIC_H -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/RC/Evaluator.cpp b/libs/libmod/src/mod/lib/RC/Evaluator.cpp similarity index 92% rename from src/mod/lib/RC/Evaluator.cpp rename to libs/libmod/src/mod/lib/RC/Evaluator.cpp index 1d77f68..a4d6cd0 100644 --- a/src/mod/lib/RC/Evaluator.cpp +++ b/libs/libmod/src/mod/lib/RC/Evaluator.cpp @@ -1,16 +1,16 @@ -#include "Evaluator.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Evaluator.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -90,7 +90,7 @@ struct EvalVisitor : public boost::static_visitor > operator()(const rule::RCExp::ComposeCommon &common) { - auto composer = [&common, this](const lib::Rules::Real &rFirst, const lib::Rules::Real &rSecond, + const auto composer = [&common, this](const lib::Rules::Real &rFirst, const lib::Rules::Real &rSecond, std::function) > reporter) { RC::Common mm(common.getMaxmimum(), common.getConnected()); lib::RC::composeRuleRealByMatchMaker(rFirst, rSecond, mm, reporter, evaluator.labelSettings); @@ -99,7 +99,7 @@ struct EvalVisitor : public boost::static_visitor > operator()(const rule::RCExp::ComposeParallel &common) { - auto composer = [&common, this](const lib::Rules::Real &rFirst, const lib::Rules::Real & rSecond, + const auto composer = [this](const lib::Rules::Real &rFirst, const lib::Rules::Real & rSecond, std::function) > reporter) { lib::RC::composeRuleRealByMatchMaker(rFirst, rSecond, lib::RC::Parallel(), reporter, evaluator.labelSettings); }; @@ -107,7 +107,7 @@ struct EvalVisitor : public boost::static_visitor > operator()(const rule::RCExp::ComposeSub &sub) { - auto composer = [&sub, this](const lib::Rules::Real &rFirst, const lib::Rules::Real & rSecond, + const auto composer = [&sub, this](const lib::Rules::Real &rFirst, const lib::Rules::Real & rSecond, std::function) > reporter) { RC::Sub mm(sub.getAllowPartial()); lib::RC::composeRuleRealByMatchMaker(rFirst, rSecond, mm, reporter, evaluator.labelSettings); @@ -116,7 +116,7 @@ struct EvalVisitor : public boost::static_visitor > operator()(const rule::RCExp::ComposeSuper &super) { - auto composer = [&super, this](const lib::Rules::Real &rFirst, const lib::Rules::Real & rSecond, + const auto composer = [&super, this](const lib::Rules::Real &rFirst, const lib::Rules::Real & rSecond, std::function) > reporter) { RC::Super mm(super.getAllowPartial(), super.getEnforceConstraints()); lib::RC::composeRuleRealByMatchMaker(rFirst, rSecond, mm, reporter, evaluator.labelSettings); diff --git a/src/mod/lib/RC/Evaluator.h b/libs/libmod/src/mod/lib/RC/Evaluator.hpp similarity index 97% rename from src/mod/lib/RC/Evaluator.h rename to libs/libmod/src/mod/lib/RC/Evaluator.hpp index 42fa697..b5fc0fe 100644 --- a/src/mod/lib/RC/Evaluator.h +++ b/libs/libmod/src/mod/lib/RC/Evaluator.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_RC_EVALCONTEXT_H #define MOD_LIB_RC_EVALCONTEXT_H -#include -#include +#include +#include #include diff --git a/src/mod/lib/RC/LabelledComposition.h b/libs/libmod/src/mod/lib/RC/LabelledComposition.hpp similarity index 85% rename from src/mod/lib/RC/LabelledComposition.h rename to libs/libmod/src/mod/lib/RC/LabelledComposition.hpp index b468924..7c708e1 100644 --- a/src/mod/lib/RC/LabelledComposition.h +++ b/libs/libmod/src/mod/lib/RC/LabelledComposition.hpp @@ -3,14 +3,14 @@ // This file is specific to the label settings we use. -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/RC/MatchMaker/Common.h b/libs/libmod/src/mod/lib/RC/MatchMaker/Common.hpp similarity index 82% rename from src/mod/lib/RC/MatchMaker/Common.h rename to libs/libmod/src/mod/lib/RC/MatchMaker/Common.hpp index 61b7dd6..90b2546 100644 --- a/src/mod/lib/RC/MatchMaker/Common.h +++ b/libs/libmod/src/mod/lib/RC/MatchMaker/Common.hpp @@ -1,10 +1,10 @@ #ifndef MOD_LIB_RC_COMMONSG_H #define MOD_LIB_RC_COMMONSG_H -#include +#include #include -#include -#include +#include +#include #include #include @@ -19,7 +19,7 @@ struct Common { template void makeMatches(const lib::Rules::Real &rFirst, const lib::Rules::Real &rSecond, Callback callback, LabelSettings labelSettings) { - const auto mr = [&rFirst, &rSecond, &callback, &labelSettings](auto &&m, const auto &gSecond, const auto &gFirst) -> bool { + const auto mr = [&rFirst, &rSecond, &callback](auto &&m, const auto &gSecond, const auto &gFirst) -> bool { return callback(rFirst, rSecond, std::move(m)); }; const auto &lgDom = get_labelled_left(rSecond.getDPORule()); diff --git a/src/mod/lib/RC/MatchMaker/ComponentWiseUtil.h b/libs/libmod/src/mod/lib/RC/MatchMaker/ComponentWiseUtil.hpp similarity index 97% rename from src/mod/lib/RC/MatchMaker/ComponentWiseUtil.h rename to libs/libmod/src/mod/lib/RC/MatchMaker/ComponentWiseUtil.hpp index f92abe9..79c3a97 100644 --- a/src/mod/lib/RC/MatchMaker/ComponentWiseUtil.h +++ b/libs/libmod/src/mod/lib/RC/MatchMaker/ComponentWiseUtil.hpp @@ -1,11 +1,11 @@ #ifndef MOD_LIB_RC_MATCH_MAKER_COMPONENTWISE_UTIL_H #define MOD_LIB_RC_MATCH_MAKER_COMPONENTWISE_UTIL_H -#include -#include +#include +#include #include -#include -#include +#include +#include #include #include diff --git a/src/mod/lib/RC/MatchMaker/LabelledMatch.h b/libs/libmod/src/mod/lib/RC/MatchMaker/LabelledMatch.hpp similarity index 77% rename from src/mod/lib/RC/MatchMaker/LabelledMatch.h rename to libs/libmod/src/mod/lib/RC/MatchMaker/LabelledMatch.hpp index 0c00698..755127e 100644 --- a/src/mod/lib/RC/MatchMaker/LabelledMatch.h +++ b/libs/libmod/src/mod/lib/RC/MatchMaker/LabelledMatch.hpp @@ -1,13 +1,13 @@ #ifndef MOD_LIB_RC_MATCH_MAKER_LABELLED_MATCH_H #define MOD_LIB_RC_MATCH_MAKER_LABELLED_MATCH_H -#include -#include +#include +#include -#include -#include -#include -#include +#include +#include +#include +#include #include @@ -16,7 +16,8 @@ namespace lib { namespace RC { namespace detail { -void initTermLabel(const auto &rFirst, const auto &rSecond) { +template +void initTermLabel(const RFirst &rFirst, const RSecond &rSecond) { const auto &termFirst = get_term(rFirst.getDPORule()); const auto &termSecond = get_term(rSecond.getDPORule()); if(!isValid(termFirst)) { @@ -31,14 +32,16 @@ void initTermLabel(const auto &rFirst, const auto &rSecond) { } } -void initStereoLabel(const auto &rFirst, const auto &rSecond) { +template +void initStereoLabel(const RFirst &rFirst, const RSecond &rSecond) { get_stereo(rFirst.getDPORule()); get_stereo(rSecond.getDPORule()); } } // namespace detail -void initByLabelSettings(const auto &rFirst, const auto &rSecond, LabelSettings labelSettings) { +template +void initByLabelSettings(const RFirst &rFirst, const RSecond &rSecond, LabelSettings labelSettings) { switch(labelSettings.type) { case LabelType::String: break; case LabelType::Term: @@ -55,8 +58,8 @@ namespace detail { // return mr(rFirst, rSecond, std::move(m)); //} -template -bool handleMapToStereo(const auto &rFirst, const auto &rSecond, VertexMap &&m, auto &&mr, LabelSettings labelSettings) { +template +bool handleMapToStereo(const RFirst &rFirst, const RSecond &rSecond, VertexMap &&m, MR &&mr, LabelSettings labelSettings) { if(!labelSettings.withStereo) { return mr(rFirst, rSecond, std::move(m)); } @@ -83,8 +86,8 @@ bool handleMapToStereo(const auto &rFirst, const auto &rSecond, VertexMap &&m, a MOD_ABORT; } -template -bool handleMapToTerm(const auto &rFirst, const auto &rSecond, VertexMap &&m, auto &&mr, LabelSettings labelSettings) { +template +bool handleMapToTerm(const RFirst &rFirst, const RSecond &rSecond, VertexMap &&m, MR &&mr, LabelSettings labelSettings) { namespace GM = jla_boost::GraphMorphism; using GraphDom = typename GM::VertexMapTraits::GraphDom; using GraphCodom = typename GM::VertexMapTraits::GraphCodom; @@ -141,8 +144,8 @@ bool handleMapToTerm(const auto &rFirst, const auto &rSecond, VertexMap &&m, aut return handleMapToStereo(rFirst, rSecond, std::move(mTerm), mr, labelSettings); } -template -bool handleMapToStringOrTerm(const auto &rFirst, const auto &rSecond, VertexMap &&m, auto &&mr, LabelSettings labelSettings) { +template +bool handleMapToStringOrTerm(const RFirst &rFirst, const RSecond &rSecond, VertexMap &&m, MR &&mr, LabelSettings labelSettings) { switch(labelSettings.type) { case LabelType::String: return handleMapToStereo(rFirst, rSecond, std::move(m), std::move(mr), labelSettings); @@ -154,8 +157,8 @@ bool handleMapToStringOrTerm(const auto &rFirst, const auto &rSecond, VertexMap } // namesapce detail -template -bool handleMapByLabelSettings(const auto &rFirst, const auto &rSecond, VertexMap &&m, MR &&mr, LabelSettings labelSettings) { +template +bool handleMapByLabelSettings(const RFirst &rFirst, const RSecond &rSecond, VertexMap &&m, MR &&mr, LabelSettings labelSettings) { return detail::handleMapToStringOrTerm(rFirst, rSecond, std::forward(m), std::forward(mr), labelSettings); } diff --git a/src/mod/lib/RC/MatchMaker/Parallel.h b/libs/libmod/src/mod/lib/RC/MatchMaker/Parallel.hpp similarity index 91% rename from src/mod/lib/RC/MatchMaker/Parallel.h rename to libs/libmod/src/mod/lib/RC/MatchMaker/Parallel.hpp index 145b97a..9c96d6c 100644 --- a/src/mod/lib/RC/MatchMaker/Parallel.h +++ b/libs/libmod/src/mod/lib/RC/MatchMaker/Parallel.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_RC_MATCH_MAKER_PARALLEL_H #define MOD_LIB_RC_MATCH_MAKER_PARALLEL_H -#include -#include +#include +#include #include diff --git a/src/mod/lib/RC/MatchMaker/Sub.h b/libs/libmod/src/mod/lib/RC/MatchMaker/Sub.hpp similarity index 90% rename from src/mod/lib/RC/MatchMaker/Sub.h rename to libs/libmod/src/mod/lib/RC/MatchMaker/Sub.hpp index 69dadc0..d05eabb 100644 --- a/src/mod/lib/RC/MatchMaker/Sub.h +++ b/libs/libmod/src/mod/lib/RC/MatchMaker/Sub.hpp @@ -1,16 +1,16 @@ #ifndef MOD_LIB_RC_SUB_H #define MOD_LIB_RC_SUB_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -69,6 +69,7 @@ Sub::matchFromPosition(const lib::Rules::Real &rFirst, const lib::Rules::Real &r const auto &lgCodom = get_labelled_right(rFirst.getDPORule()); const auto &gCodom = get_graph(lgCodom); const auto vNullDom = boost::graph_traits::null_vertex(); + (void) vNullDom; const auto vNullCodom = boost::graph_traits::null_vertex(); auto map = VertexMapType(gDom, gCodom); for(std::size_t pId = 0; pId < position.size(); pId++) { diff --git a/src/mod/lib/RC/MatchMaker/Super.h b/libs/libmod/src/mod/lib/RC/MatchMaker/Super.hpp similarity index 81% rename from src/mod/lib/RC/MatchMaker/Super.h rename to libs/libmod/src/mod/lib/RC/MatchMaker/Super.hpp index e549bf1..108fc84 100644 --- a/src/mod/lib/RC/MatchMaker/Super.h +++ b/libs/libmod/src/mod/lib/RC/MatchMaker/Super.hpp @@ -1,16 +1,16 @@ #ifndef MOD_LIB_RC_SUPER_H #define MOD_LIB_RC_SUPER_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -27,18 +27,20 @@ struct Super { public: Super(bool allowPartial, bool enforceConstraints) - : allowPartial(allowPartial), enforceConstraints(enforceConstraints) { } + : allowPartial(allowPartial), enforceConstraints(enforceConstraints) {} - void makeMatches(const auto &rFirst, const auto &rSecond, auto &&mr, LabelSettings labelSettings) const { + template + void makeMatches(const RFirst &rFirst, const RSecond &rSecond, MR &&mr, LabelSettings labelSettings) const { if(allowPartial) makeMatchesInternal(rFirst, rSecond, mr, labelSettings); else makeMatchesInternal(rFirst, rSecond, mr, labelSettings); } + private: - template - void makeMatchesInternal(const auto &rFirst, const auto &rSecond, auto &&mr, LabelSettings labelSettings) const { + template + void makeMatchesInternal(const RFirst &rFirst, const RSecond &rSecond, MR &&mr, LabelSettings labelSettings) const { if(getConfig().componentSG.verbose.get()) { IO::log() << "ComponentSG: " << rFirst.getName() << " -> " << rSecond.getName() << std::endl; IO::log() << "ComponentSG: " << "labelSettings = " << labelSettings << std::endl; @@ -75,7 +77,8 @@ struct Super { get_num_connected_components(lgDomPatterns), get_num_connected_components(lgCodomHosts), mp); if(getConfig().componentSG.verbose.get()) { - IO::log() << "ComponentSG: " << "Match matrix, " << mm.morphisms.size() << " x " << mm.morphisms.front().size() << std::endl; + IO::log() << "ComponentSG: " << "Match matrix, " << mm.morphisms.size() << " x " << mm.morphisms.front().size() + << std::endl; for(int i = 0; i != mm.morphisms.size(); ++i) { IO::log() << "ComponentSG: "; if(mm.preDisabled[i]) IO::log() << "x:"; @@ -98,9 +101,12 @@ struct Super { if(!continue_) break; } } + public: template - boost::optional matchFromPosition(const lib::Rules::Real &rFirst, const lib::Rules::Real &rSecond, const std::vector &position) const; + boost::optional matchFromPosition(const lib::Rules::Real &rFirst, + const lib::Rules::Real &rSecond, + const std::vector &position) const; private: bool allowPartial; bool enforceConstraints; @@ -108,12 +114,15 @@ struct Super { template inline boost::optional -Super::matchFromPosition(const lib::Rules::Real &rFirst, const lib::Rules::Real &rSecond, const std::vector &position) const { +Super::matchFromPosition(const lib::Rules::Real &rFirst, + const lib::Rules::Real &rSecond, + const std::vector &position) const { const auto &lgDom = get_labelled_left(rSecond.getDPORule()); const auto &gDom = get_graph(lgDom); const auto &gCodom = get_graph(get_labelled_right(rFirst.getDPORule())); const auto vNullDom = boost::graph_traits::null_vertex(); const auto vNullCodom = boost::graph_traits::null_vertex(); + (void) vNullCodom; auto map = VertexMapType(gDom, gCodom); for(std::size_t pId = 0; pId < position.size(); ++pId) { if(position[pId].disabled) continue; diff --git a/src/mod/lib/RC/Result.h b/libs/libmod/src/mod/lib/RC/Result.hpp similarity index 100% rename from src/mod/lib/RC/Result.h rename to libs/libmod/src/mod/lib/RC/Result.hpp diff --git a/src/mod/lib/RC/Visitor/Compound.h b/libs/libmod/src/mod/lib/RC/Visitor/Compound.hpp similarity index 99% rename from src/mod/lib/RC/Visitor/Compound.h rename to libs/libmod/src/mod/lib/RC/Visitor/Compound.hpp index 4a8bb52..9d4511b 100644 --- a/src/mod/lib/RC/Visitor/Compound.h +++ b/libs/libmod/src/mod/lib/RC/Visitor/Compound.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_RC_VISITOR_COMPOUND_H #define MOD_LIB_RC_VISITOR_COMPOUND_H -#include -#include +#include +#include #include diff --git a/src/mod/lib/RC/Visitor/MatchConstraints.h b/libs/libmod/src/mod/lib/RC/Visitor/MatchConstraints.hpp similarity index 98% rename from src/mod/lib/RC/Visitor/MatchConstraints.h rename to libs/libmod/src/mod/lib/RC/Visitor/MatchConstraints.hpp index df70f9d..9e9d58b 100644 --- a/src/mod/lib/RC/Visitor/MatchConstraints.h +++ b/libs/libmod/src/mod/lib/RC/Visitor/MatchConstraints.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_RC_VISITOR_MATCH_CONSTRAINTS_H #define MOD_LIB_RC_VISITOR_MATCH_CONSTRAINTS_H -#include -#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/RC/Visitor/Stereo.h b/libs/libmod/src/mod/lib/RC/Visitor/Stereo.hpp similarity index 98% rename from src/mod/lib/RC/Visitor/Stereo.h rename to libs/libmod/src/mod/lib/RC/Visitor/Stereo.hpp index b2d1f9c..df705e3 100644 --- a/src/mod/lib/RC/Visitor/Stereo.h +++ b/libs/libmod/src/mod/lib/RC/Visitor/Stereo.hpp @@ -1,10 +1,10 @@ #ifndef MOD_LIB_RC_VISITOR_STEREO_H #define MOD_LIB_RC_VISITOR_STEREO_H -#include -#include -#include -#include +#include +#include +#include +#include #include @@ -154,12 +154,14 @@ struct Stereo { // copy left if(Verbose) IO::log() << "\tLeft:\n"; const bool partial = copyAllFromSide(std::true_type(), get_labelled_left(rInput), vInput, gInput, mInputToResult, vResult, get_left(result.rResult), vDataLeft, eDataLeft); + (void) partial; assert(!partial); } if(m != Membership::Left) { // copy right if(Verbose) IO::log() << "\tRight:\n"; const bool partial = copyAllFromSide(std::true_type(), get_labelled_right(rInput), vInput, gInput, mInputToResult, vResult, get_right(result.rResult), vDataRight, eDataRight); + (void) partial; assert(!partial); } }; @@ -230,6 +232,7 @@ struct Stereo { if(secondToFirstSubgraph) { if(Verbose) IO::log() << "\t\tSecond-to-first subgraph: copy and map L1/R1 to L\n"; const bool partial = copyAllFromSide(std::true_type(), get_labelled_left(rFirst), vFirst, gFirst, result.mFirstToResult, vResult, get_left(result.rResult), vDataLeft, eDataLeft); + (void) partial; assert(!partial); } else if(firstToSecondSubgraph) { if(Verbose) IO::log() << "\t\tFirst-to-second subgraph: copy and map L2 to L\n"; @@ -243,6 +246,7 @@ struct Stereo { if(secondToFirstSubgraph) { if(Verbose) IO::log() << "\t\tSecond-to-first subgraph: copy and map L1 to L\n"; const bool partial = copyAllFromSide(std::true_type(), get_labelled_left(rFirst), vFirst, gFirst, result.mFirstToResult, vResult, get_left(result.rResult), vDataLeft, eDataLeft); + (void) partial; assert(!partial); } else if(firstToSecondSubgraph) { if(Verbose) IO::log() << "\t\tFirst-to-second subgraph: hmm\n"; @@ -270,10 +274,12 @@ struct Stereo { if(firstToSecondSubgraph) { if(Verbose) IO::log() << "\t\tFirst-to-second subgraph: copy and map L2/R2 to R\n"; const bool partial = copyAllFromSide(std::true_type(), get_labelled_right(rSecond), vSecond, gSecond, result.mSecondToResult, vResult, get_right(result.rResult), vDataRight, eDataRight); + (void) partial; assert(!partial); } else if(secondToFirstSubgraph) { if(Verbose) IO::log() << "\t\tSecond-to-first subgraph: copy and map R1 to R\n"; const bool partial = copyAllFromSide(std::true_type(), get_labelled_right(rFirst), vFirst, gFirst, result.mFirstToResult, vResult, get_right(result.rResult), vDataRight, eDataRight); + (void) partial; assert(!partial); } else { if(Verbose) IO::log() << "\t\tNon-subgraph: do a merge\n"; @@ -284,6 +290,7 @@ struct Stereo { if(firstToSecondSubgraph) { if(Verbose) IO::log() << "\t\tFirst-to-second subgraph: copy and map R2 to R\n"; const bool partial = copyAllFromSide(std::true_type(), get_labelled_right(rSecond), vSecond, gSecond, result.mSecondToResult, vResult, get_right(result.rResult), vDataRight, eDataRight); + (void) partial; assert(!partial); } else if(secondToFirstSubgraph) { if(Verbose) { @@ -295,8 +302,10 @@ struct Stereo { IO::log() << "\tCopying all from R2\n"; } const bool partial = copyAllFromSide(std::true_type(), get_labelled_right(rSecond), vSecond, gSecond, result.mSecondToResult, vResult, get_right(result.rResult), vDataRight, eDataRight); + (void) partial; assert(!partial); const auto sizeAfterR2 = data.edges.size(); + (void) sizeAfterR2; { // copy unmatched from R1 if(Verbose) IO::log() << "\tCopying unmatched from R1\n"; const auto vInput = vFirst; @@ -508,6 +517,7 @@ struct Stereo { const VertexFirst &vFirst, const VertexResult &vResult) { const auto &gResult = get_graph(result.rResult); const auto vResultId = get(boost::vertex_index_t(), gResult, vResult); + (void) vResultId; assert(vDataLeft.size() + 1 == num_vertices(gResult)); assert(vDataLeft.size() == vDataRight.size()); assert(vDataLeft.size() == vResultId); @@ -523,6 +533,7 @@ struct Stereo { const VertexSecond &vSecond, const VertexResult &vResult) { const auto &gResult = get_graph(result.rResult); const auto vResultId = get(boost::vertex_index_t(), gResult, vResult); + (void) vResultId; assert(vDataLeft.size() + 1 == num_vertices(gResult)); assert(vDataLeft.size() == vDataRight.size()); assert(vDataLeft.size() == vResultId); @@ -625,7 +636,8 @@ struct Stereo { } private: - void printData(std::ostream &s, auto geometryVertex, auto firstEmb, auto lastEmb) { + template + void printData(std::ostream &s, GeometryVertex geometryVertex, IterEmb firstEmb, IterEmb lastEmb) { const auto &gGeometry = lib::Stereo::getGeometryGraph().getGraph(); if(geometryVertex == lib::Stereo::getGeometryGraph().nullGeometry()) { s << "nullGeo"; diff --git a/src/mod/lib/RC/Visitor/String.h b/libs/libmod/src/mod/lib/RC/Visitor/String.hpp similarity index 98% rename from src/mod/lib/RC/Visitor/String.h rename to libs/libmod/src/mod/lib/RC/Visitor/String.hpp index 7478f41..cb50260 100644 --- a/src/mod/lib/RC/Visitor/String.h +++ b/libs/libmod/src/mod/lib/RC/Visitor/String.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_RC_VISITOR_STRING_H #define MOD_LIB_RC_VISITOR_STRING_H -#include +#include -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/RC/Visitor/Term.h b/libs/libmod/src/mod/lib/RC/Visitor/Term.hpp similarity index 97% rename from src/mod/lib/RC/Visitor/Term.h rename to libs/libmod/src/mod/lib/RC/Visitor/Term.hpp index cddf1a4..9990b30 100644 --- a/src/mod/lib/RC/Visitor/Term.h +++ b/libs/libmod/src/mod/lib/RC/Visitor/Term.hpp @@ -1,13 +1,13 @@ #ifndef MOD_LIB_RC_VISITOR_TERM_H #define MOD_LIB_RC_VISITOR_TERM_H -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/RC/detail/CompositionHelper.h b/libs/libmod/src/mod/lib/RC/detail/CompositionHelper.hpp similarity index 99% rename from src/mod/lib/RC/detail/CompositionHelper.h rename to libs/libmod/src/mod/lib/RC/detail/CompositionHelper.hpp index bf1659c..324b24d 100644 --- a/src/mod/lib/RC/detail/CompositionHelper.h +++ b/libs/libmod/src/mod/lib/RC/detail/CompositionHelper.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_RC_DETAIL_COMPOSITIONHELPER_H #define MOD_LIB_RC_DETAIL_COMPOSITIONHELPER_H -#include +#include #include @@ -413,8 +413,9 @@ struct CompositionHelper { auto vResultOther = isSrcMatched ? vResultTar : vResultSrc; // vResultMatched may be null_vertex, if it's a RIGHT vs. LEFT vertex assert(vResultOther != boost::graph_traits::null_vertex()); - auto meSecond = membership(rSecond, eSecond); - auto mvResultOther = membership(rResult, vResultOther); + const auto meSecond = membership(rSecond, eSecond); + const auto mvResultOther = membership(rResult, vResultOther); + (void) mvResultOther; assert(mvResultOther == Membership::Context || mvResultOther == meSecond); if(vResultMatched == boost::graph_traits::null_vertex()) { diff --git a/src/mod/lib/Random.cpp b/libs/libmod/src/mod/lib/Random.cpp similarity index 94% rename from src/mod/lib/Random.cpp rename to libs/libmod/src/mod/lib/Random.cpp index 0ecf0ec..0b787ae 100644 --- a/src/mod/lib/Random.cpp +++ b/libs/libmod/src/mod/lib/Random.cpp @@ -1,6 +1,6 @@ -#include "Random.h" +#include "Random.hpp" -#include +#include #include diff --git a/src/mod/lib/Random.h b/libs/libmod/src/mod/lib/Random.hpp similarity index 100% rename from src/mod/lib/Random.h rename to libs/libmod/src/mod/lib/Random.hpp diff --git a/src/mod/lib/Rules/ConnectedComponent.h b/libs/libmod/src/mod/lib/Rules/ConnectedComponent.hpp similarity index 100% rename from src/mod/lib/Rules/ConnectedComponent.h rename to libs/libmod/src/mod/lib/Rules/ConnectedComponent.hpp diff --git a/src/mod/lib/Rules/GraphDecl.h b/libs/libmod/src/mod/lib/Rules/GraphDecl.hpp similarity index 100% rename from src/mod/lib/Rules/GraphDecl.h rename to libs/libmod/src/mod/lib/Rules/GraphDecl.hpp diff --git a/src/mod/lib/Rules/GraphToRule.h b/libs/libmod/src/mod/lib/Rules/GraphToRule.hpp similarity index 97% rename from src/mod/lib/Rules/GraphToRule.h rename to libs/libmod/src/mod/lib/Rules/GraphToRule.hpp index 99fb67c..d63dbd5 100644 --- a/src/mod/lib/Rules/GraphToRule.h +++ b/libs/libmod/src/mod/lib/Rules/GraphToRule.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_RULES_GRAPHTORULE_H #define MOD_LIB_RULES_GRAPHTORULE_H -#include -#include +#include +#include #include diff --git a/src/mod/lib/Rules/LabelledRule.cpp b/libs/libmod/src/mod/lib/Rules/LabelledRule.cpp similarity index 98% rename from src/mod/lib/Rules/LabelledRule.cpp rename to libs/libmod/src/mod/lib/Rules/LabelledRule.cpp index b6e4f1d..2e0f403 100644 --- a/src/mod/lib/Rules/LabelledRule.cpp +++ b/libs/libmod/src/mod/lib/Rules/LabelledRule.cpp @@ -1,9 +1,9 @@ -#include "LabelledRule.h" +#include "LabelledRule.hpp" -#include +#include #include -#include -#include +#include +#include #include diff --git a/src/mod/lib/Rules/LabelledRule.h b/libs/libmod/src/mod/lib/Rules/LabelledRule.hpp similarity index 95% rename from src/mod/lib/Rules/LabelledRule.h rename to libs/libmod/src/mod/lib/Rules/LabelledRule.hpp index 6926560..e2cfbf7 100644 --- a/src/mod/lib/Rules/LabelledRule.h +++ b/libs/libmod/src/mod/lib/Rules/LabelledRule.hpp @@ -1,13 +1,13 @@ #ifndef MOD_LIB_RULES_LABELLED_RULE_H #define MOD_LIB_RULES_LABELLED_RULE_H -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Rules/Properties/Depiction.cpp b/libs/libmod/src/mod/lib/Rules/Properties/Depiction.cpp similarity index 98% rename from src/mod/lib/Rules/Properties/Depiction.cpp rename to libs/libmod/src/mod/lib/Rules/Properties/Depiction.cpp index 7edff47..71a29b2 100644 --- a/src/mod/lib/Rules/Properties/Depiction.cpp +++ b/libs/libmod/src/mod/lib/Rules/Properties/Depiction.cpp @@ -1,13 +1,13 @@ -#include "Depiction.h" - -#include -#include -#include -#include -#include -#include -#include -#include +#include "Depiction.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Rules/Properties/Depiction.h b/libs/libmod/src/mod/lib/Rules/Properties/Depiction.hpp similarity index 95% rename from src/mod/lib/Rules/Properties/Depiction.h rename to libs/libmod/src/mod/lib/Rules/Properties/Depiction.hpp index cf4509b..ed6057d 100644 --- a/src/mod/lib/Rules/Properties/Depiction.h +++ b/libs/libmod/src/mod/lib/Rules/Properties/Depiction.hpp @@ -1,10 +1,10 @@ #ifndef MOD_LIB_RULES_STATE_DEPICTION_H #define MOD_LIB_RULES_STATE_DEPICTION_H -#include -#include -#include -#include +#include +#include +#include +#include #include #include diff --git a/src/mod/lib/Rules/Properties/Molecule.cpp b/libs/libmod/src/mod/lib/Rules/Properties/Molecule.cpp similarity index 91% rename from src/mod/lib/Rules/Properties/Molecule.cpp rename to libs/libmod/src/mod/lib/Rules/Properties/Molecule.cpp index e7d615c..bc6c6df 100644 --- a/src/mod/lib/Rules/Properties/Molecule.cpp +++ b/libs/libmod/src/mod/lib/Rules/Properties/Molecule.cpp @@ -1,9 +1,9 @@ -#include "Molecule.h" +#include "Molecule.hpp" -#include -#include -#include -#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Rules/Properties/Molecule.h b/libs/libmod/src/mod/lib/Rules/Properties/Molecule.hpp similarity index 84% rename from src/mod/lib/Rules/Properties/Molecule.h rename to libs/libmod/src/mod/lib/Rules/Properties/Molecule.hpp index 75c5b31..1555a26 100644 --- a/src/mod/lib/Rules/Properties/Molecule.h +++ b/libs/libmod/src/mod/lib/Rules/Properties/Molecule.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_RULES_PROP_MOLECULE_H #define MOD_LIB_RULES_PROP_MOLECULE_H -#include -#include -#include +#include +#include +#include namespace mod { struct AtomData; diff --git a/src/mod/lib/Rules/Properties/Property.h b/libs/libmod/src/mod/lib/Rules/Properties/Property.hpp similarity index 99% rename from src/mod/lib/Rules/Properties/Property.h rename to libs/libmod/src/mod/lib/Rules/Properties/Property.hpp index e968f5c..f331419 100644 --- a/src/mod/lib/Rules/Properties/Property.h +++ b/libs/libmod/src/mod/lib/Rules/Properties/Property.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_RULES_PROP_H #define MOD_LIB_RULES_PROP_H -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/mod/lib/Rules/Properties/Stereo.h b/libs/libmod/src/mod/lib/Rules/Properties/Stereo.hpp similarity index 97% rename from src/mod/lib/Rules/Properties/Stereo.h rename to libs/libmod/src/mod/lib/Rules/Properties/Stereo.hpp index d8b1c5f..7887e4e 100644 --- a/src/mod/lib/Rules/Properties/Stereo.h +++ b/libs/libmod/src/mod/lib/Rules/Properties/Stereo.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_RULE_PROP_STEREO_H #define MOD_LIB_RULE_PROP_STEREO_H -#include -#include -#include +#include +#include +#include #include @@ -50,10 +50,12 @@ struct PropStereoCore : private PropCore -#include -#include -#include +#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Rules/Properties/String.h b/libs/libmod/src/mod/lib/Rules/Properties/String.hpp similarity index 83% rename from src/mod/lib/Rules/Properties/String.h rename to libs/libmod/src/mod/lib/Rules/Properties/String.hpp index fa5607c..4cd08e0 100644 --- a/src/mod/lib/Rules/Properties/String.h +++ b/libs/libmod/src/mod/lib/Rules/Properties/String.hpp @@ -1,9 +1,9 @@ #ifndef MOD_LIB_RULES_PROP_STRING_H #define MOD_LIB_RULES_PROP_STRING_H -#include -#include -#include +#include +#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Rules/Properties/Term.cpp b/libs/libmod/src/mod/lib/Rules/Properties/Term.cpp similarity index 95% rename from src/mod/lib/Rules/Properties/Term.cpp rename to libs/libmod/src/mod/lib/Rules/Properties/Term.cpp index 1596e20..62593cf 100644 --- a/src/mod/lib/Rules/Properties/Term.cpp +++ b/libs/libmod/src/mod/lib/Rules/Properties/Term.cpp @@ -1,10 +1,10 @@ -#include "Term.h" +#include "Term.hpp" -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Rules/Properties/Term.h b/libs/libmod/src/mod/lib/Rules/Properties/Term.hpp similarity index 89% rename from src/mod/lib/Rules/Properties/Term.h rename to libs/libmod/src/mod/lib/Rules/Properties/Term.hpp index 8b6d156..b9bc1f4 100644 --- a/src/mod/lib/Rules/Properties/Term.h +++ b/libs/libmod/src/mod/lib/Rules/Properties/Term.hpp @@ -1,10 +1,10 @@ #ifndef MOD_LIB_RULES_PROP_TERM_H #define MOD_LIB_RULES_PROP_TERM_H -#include -#include -#include -#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Rules/Real.cpp b/libs/libmod/src/mod/lib/Rules/Real.cpp similarity index 90% rename from src/mod/lib/Rules/Real.cpp rename to libs/libmod/src/mod/lib/Rules/Real.cpp index 5d8622d..a26585d 100644 --- a/src/mod/lib/Rules/Real.cpp +++ b/libs/libmod/src/mod/lib/Rules/Real.cpp @@ -1,21 +1,21 @@ -#include "Real.h" - -#include -#include -#include -#include -#include -#include +#include "Real.hpp" + +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Rules/Real.h b/libs/libmod/src/mod/lib/Rules/Real.hpp similarity index 94% rename from src/mod/lib/Rules/Real.h rename to libs/libmod/src/mod/lib/Rules/Real.hpp index a4119ee..f0f658f 100644 --- a/src/mod/lib/Rules/Real.h +++ b/libs/libmod/src/mod/lib/Rules/Real.hpp @@ -1,11 +1,11 @@ #ifndef MOD_LIB_RULES_REAL_H #define MOD_LIB_RULES_REAL_H -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Stereo/CloneUtil.h b/libs/libmod/src/mod/lib/Stereo/CloneUtil.hpp similarity index 97% rename from src/mod/lib/Stereo/CloneUtil.h rename to libs/libmod/src/mod/lib/Stereo/CloneUtil.hpp index c83a174..25a9028 100644 --- a/src/mod/lib/Stereo/CloneUtil.h +++ b/libs/libmod/src/mod/lib/Stereo/CloneUtil.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_STEREO_CLONEUTIL_H #define MOD_LIB_STEREO_CLONEUTIL_H -#include +#include #include #include diff --git a/src/mod/lib/Stereo/Configuration/Any.cpp b/libs/libmod/src/mod/lib/Stereo/Configuration/Any.cpp similarity index 96% rename from src/mod/lib/Stereo/Configuration/Any.cpp rename to libs/libmod/src/mod/lib/Stereo/Configuration/Any.cpp index a719ec5..9e3502f 100644 --- a/src/mod/lib/Stereo/Configuration/Any.cpp +++ b/libs/libmod/src/mod/lib/Stereo/Configuration/Any.cpp @@ -1,6 +1,6 @@ -#include "Any.h" +#include "Any.hpp" -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/Configuration/Any.h b/libs/libmod/src/mod/lib/Stereo/Configuration/Any.hpp similarity index 95% rename from src/mod/lib/Stereo/Configuration/Any.h rename to libs/libmod/src/mod/lib/Stereo/Configuration/Any.hpp index ac8d996..703a340 100644 --- a/src/mod/lib/Stereo/Configuration/Any.h +++ b/libs/libmod/src/mod/lib/Stereo/Configuration/Any.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_STEREO_CONFIGURATION_ANY_H #define MOD_LIB_STEREO_CONFIGURATION_ANY_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/Configuration/Configuration.cpp b/libs/libmod/src/mod/lib/Stereo/Configuration/Configuration.cpp similarity index 98% rename from src/mod/lib/Stereo/Configuration/Configuration.cpp rename to libs/libmod/src/mod/lib/Stereo/Configuration/Configuration.cpp index 5fb462f..4e7c814 100644 --- a/src/mod/lib/Stereo/Configuration/Configuration.cpp +++ b/libs/libmod/src/mod/lib/Stereo/Configuration/Configuration.cpp @@ -1,6 +1,6 @@ -#include "Configuration.h" +#include "Configuration.hpp" -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/Configuration/Configuration.h b/libs/libmod/src/mod/lib/Stereo/Configuration/Configuration.hpp similarity index 98% rename from src/mod/lib/Stereo/Configuration/Configuration.h rename to libs/libmod/src/mod/lib/Stereo/Configuration/Configuration.hpp index 81efb3c..9f18112 100644 --- a/src/mod/lib/Stereo/Configuration/Configuration.h +++ b/libs/libmod/src/mod/lib/Stereo/Configuration/Configuration.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_STEREO_CONFIGURATION_CONFIGURATION_H #define MOD_LIB_STEREO_CONFIGURATION_CONFIGURATION_H -#include -#include +#include +#include #include diff --git a/src/mod/lib/Stereo/Configuration/Linear.cpp b/libs/libmod/src/mod/lib/Stereo/Configuration/Linear.cpp similarity index 95% rename from src/mod/lib/Stereo/Configuration/Linear.cpp rename to libs/libmod/src/mod/lib/Stereo/Configuration/Linear.cpp index 25898d4..0129d24 100644 --- a/src/mod/lib/Stereo/Configuration/Linear.cpp +++ b/libs/libmod/src/mod/lib/Stereo/Configuration/Linear.cpp @@ -1,6 +1,6 @@ -#include "Linear.h" +#include "Linear.hpp" -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/Configuration/Linear.h b/libs/libmod/src/mod/lib/Stereo/Configuration/Linear.hpp similarity index 95% rename from src/mod/lib/Stereo/Configuration/Linear.h rename to libs/libmod/src/mod/lib/Stereo/Configuration/Linear.hpp index a79b384..210013f 100644 --- a/src/mod/lib/Stereo/Configuration/Linear.h +++ b/libs/libmod/src/mod/lib/Stereo/Configuration/Linear.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_STEREO_CONFIGURATION_LINEAR_H #define MOD_LIB_STEREO_CONFIGURATION_LINEAR_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/Configuration/Tetrahedral.cpp b/libs/libmod/src/mod/lib/Stereo/Configuration/Tetrahedral.cpp similarity index 98% rename from src/mod/lib/Stereo/Configuration/Tetrahedral.cpp rename to libs/libmod/src/mod/lib/Stereo/Configuration/Tetrahedral.cpp index 165e26c..3067b76 100644 --- a/src/mod/lib/Stereo/Configuration/Tetrahedral.cpp +++ b/libs/libmod/src/mod/lib/Stereo/Configuration/Tetrahedral.cpp @@ -1,6 +1,6 @@ -#include "Tetrahedral.h" +#include "Tetrahedral.hpp" -#include +#include namespace mod { namespace lib { @@ -123,7 +123,7 @@ bool Tetrahedral::morphismIso(const Configuration &cCodomBase, std::vector +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp b/libs/libmod/src/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp similarity index 97% rename from src/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp rename to libs/libmod/src/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp index 2892a8a..1b53b99 100644 --- a/src/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp +++ b/libs/libmod/src/mod/lib/Stereo/Configuration/TrigonalPlanar.cpp @@ -1,6 +1,6 @@ -#include "TrigonalPlanar.h" +#include "TrigonalPlanar.hpp" -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/Configuration/TrigonalPlanar.h b/libs/libmod/src/mod/lib/Stereo/Configuration/TrigonalPlanar.hpp similarity index 96% rename from src/mod/lib/Stereo/Configuration/TrigonalPlanar.h rename to libs/libmod/src/mod/lib/Stereo/Configuration/TrigonalPlanar.hpp index 1a60722..bc030a4 100644 --- a/src/mod/lib/Stereo/Configuration/TrigonalPlanar.h +++ b/libs/libmod/src/mod/lib/Stereo/Configuration/TrigonalPlanar.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_STEREO_CONFIGURATION_TRIGONAL_PLANAR_H #define MOD_LIB_STEREO_CONFIGURATION_TRIGONAL_PLANAR_H -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/EdgeCategory.cpp b/libs/libmod/src/mod/lib/Stereo/EdgeCategory.cpp similarity index 98% rename from src/mod/lib/Stereo/EdgeCategory.cpp rename to libs/libmod/src/mod/lib/Stereo/EdgeCategory.cpp index 6be5816..c9b3ee3 100644 --- a/src/mod/lib/Stereo/EdgeCategory.cpp +++ b/libs/libmod/src/mod/lib/Stereo/EdgeCategory.cpp @@ -1,6 +1,6 @@ -#include "EdgeCategory.h" +#include "EdgeCategory.hpp" -#include +#include #include @@ -40,7 +40,7 @@ EdgeCategory bondTypeToEdgeCategory(BondType bt) { case BondType::Triple: return EdgeCategory::Triple; case BondType::Aromatic: return EdgeCategory::Aromatic; } - MOD_ABORT; // fuck you too GCC + __builtin_unreachable(); } // EdgeCategorySubset diff --git a/src/mod/lib/Stereo/EdgeCategory.h b/libs/libmod/src/mod/lib/Stereo/EdgeCategory.hpp similarity index 98% rename from src/mod/lib/Stereo/EdgeCategory.h rename to libs/libmod/src/mod/lib/Stereo/EdgeCategory.hpp index f3dd07d..dda7354 100644 --- a/src/mod/lib/Stereo/EdgeCategory.h +++ b/libs/libmod/src/mod/lib/Stereo/EdgeCategory.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_STEREO_EDGECATEGORY_H #define MOD_LIB_STEREO_EDGECATEGORY_H -#include +#include #include #include diff --git a/src/mod/lib/Stereo/EmbeddingEdge.cpp b/libs/libmod/src/mod/lib/Stereo/EmbeddingEdge.cpp similarity index 91% rename from src/mod/lib/Stereo/EmbeddingEdge.cpp rename to libs/libmod/src/mod/lib/Stereo/EmbeddingEdge.cpp index 0001c13..d01561a 100644 --- a/src/mod/lib/Stereo/EmbeddingEdge.cpp +++ b/libs/libmod/src/mod/lib/Stereo/EmbeddingEdge.cpp @@ -1,4 +1,4 @@ -#include "EmbeddingEdge.h" +#include "EmbeddingEdge.hpp" namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/EmbeddingEdge.h b/libs/libmod/src/mod/lib/Stereo/EmbeddingEdge.hpp similarity index 95% rename from src/mod/lib/Stereo/EmbeddingEdge.h rename to libs/libmod/src/mod/lib/Stereo/EmbeddingEdge.hpp index d5768f5..807bc5e 100644 --- a/src/mod/lib/Stereo/EmbeddingEdge.h +++ b/libs/libmod/src/mod/lib/Stereo/EmbeddingEdge.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_STEREO_EMBEDDINGEDGE_H #define MOD_LIB_STEREO_EMBEDDINGEDGE_H -#include +#include #include diff --git a/src/mod/lib/Stereo/GeometryGraph.cpp b/libs/libmod/src/mod/lib/Stereo/GeometryGraph.cpp similarity index 96% rename from src/mod/lib/Stereo/GeometryGraph.cpp rename to libs/libmod/src/mod/lib/Stereo/GeometryGraph.cpp index e7bdddc..6ceef33 100644 --- a/src/mod/lib/Stereo/GeometryGraph.cpp +++ b/libs/libmod/src/mod/lib/Stereo/GeometryGraph.cpp @@ -1,15 +1,15 @@ -#include "GeometryGraph.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include +#include "GeometryGraph.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/Stereo/GeometryGraph.h b/libs/libmod/src/mod/lib/Stereo/GeometryGraph.hpp similarity index 97% rename from src/mod/lib/Stereo/GeometryGraph.h rename to libs/libmod/src/mod/lib/Stereo/GeometryGraph.hpp index 44a1d06..d95a9ec 100644 --- a/src/mod/lib/Stereo/GeometryGraph.h +++ b/libs/libmod/src/mod/lib/Stereo/GeometryGraph.hpp @@ -1,8 +1,8 @@ #ifndef MOD_LIB_STEREO_GEOMETRY_GRAPH_H #define MOD_LIB_STEREO_GEOMETRY_GRAPH_H -#include -#include +#include +#include #include diff --git a/src/mod/lib/Stereo/Inference.cpp b/libs/libmod/src/mod/lib/Stereo/Inference.cpp similarity index 85% rename from src/mod/lib/Stereo/Inference.cpp rename to libs/libmod/src/mod/lib/Stereo/Inference.cpp index 9189245..3bcb7cd 100644 --- a/src/mod/lib/Stereo/Inference.cpp +++ b/libs/libmod/src/mod/lib/Stereo/Inference.cpp @@ -1,4 +1,4 @@ -#include "Inference.h" +#include "Inference.hpp" namespace mod { namespace lib { diff --git a/src/mod/lib/Stereo/Inference.h b/libs/libmod/src/mod/lib/Stereo/Inference.hpp similarity index 98% rename from src/mod/lib/Stereo/Inference.h rename to libs/libmod/src/mod/lib/Stereo/Inference.hpp index a6211dc..1f42384 100644 --- a/src/mod/lib/Stereo/Inference.h +++ b/libs/libmod/src/mod/lib/Stereo/Inference.hpp @@ -1,12 +1,12 @@ #ifndef MOD_LIB_STEREO_INFERENCE_H #define MOD_LIB_STEREO_INFERENCE_H -#include +#include -#include -#include -#include -#include +#include +#include +#include +#include #include diff --git a/src/mod/lib/StringStore.cpp b/libs/libmod/src/mod/lib/StringStore.cpp similarity index 97% rename from src/mod/lib/StringStore.cpp rename to libs/libmod/src/mod/lib/StringStore.cpp index 92a6ab0..5abc4b4 100644 --- a/src/mod/lib/StringStore.cpp +++ b/libs/libmod/src/mod/lib/StringStore.cpp @@ -1,4 +1,4 @@ -#include "StringStore.h" +#include "StringStore.hpp" #include #include diff --git a/src/mod/lib/StringStore.h b/libs/libmod/src/mod/lib/StringStore.hpp similarity index 100% rename from src/mod/lib/StringStore.h rename to libs/libmod/src/mod/lib/StringStore.hpp diff --git a/src/mod/lib/Term/RawTerm.cpp b/libs/libmod/src/mod/lib/Term/RawTerm.cpp similarity index 95% rename from src/mod/lib/Term/RawTerm.cpp rename to libs/libmod/src/mod/lib/Term/RawTerm.cpp index 59ca676..e1fec9b 100644 --- a/src/mod/lib/Term/RawTerm.cpp +++ b/libs/libmod/src/mod/lib/Term/RawTerm.cpp @@ -1,9 +1,9 @@ -#include "RawTerm.h" -#include "WAM.h" +#include "RawTerm.hpp" +#include "WAM.hpp" -#include -#include -#include +#include +#include +#include #include diff --git a/src/mod/lib/Term/RawTerm.h b/libs/libmod/src/mod/lib/Term/RawTerm.hpp similarity index 100% rename from src/mod/lib/Term/RawTerm.h rename to libs/libmod/src/mod/lib/Term/RawTerm.hpp diff --git a/src/mod/lib/Term/WAM.cpp b/libs/libmod/src/mod/lib/Term/WAM.cpp similarity index 78% rename from src/mod/lib/Term/WAM.cpp rename to libs/libmod/src/mod/lib/Term/WAM.cpp index b60c129..bd3353f 100644 --- a/src/mod/lib/Term/WAM.cpp +++ b/libs/libmod/src/mod/lib/Term/WAM.cpp @@ -1,6 +1,6 @@ -#include "WAM.h" +#include "WAM.hpp" -#include +#include namespace mod { namespace lib { diff --git a/src/mod/lib/Term/WAM.h b/libs/libmod/src/mod/lib/Term/WAM.hpp similarity index 98% rename from src/mod/lib/Term/WAM.h rename to libs/libmod/src/mod/lib/Term/WAM.hpp index 9a37bcd..6871c58 100644 --- a/src/mod/lib/Term/WAM.h +++ b/libs/libmod/src/mod/lib/Term/WAM.hpp @@ -1,7 +1,7 @@ #ifndef MOD_LIB_TERM_WAM_H #define MOD_LIB_TERM_WAM_H -#include +#include #include #include @@ -68,7 +68,7 @@ struct Cell { } REF; struct { - std::size_t arity; + int arity; std::size_t name; } Structure; }; @@ -183,8 +183,7 @@ struct Wam { for(int i = 1; i <= arity; ++i) { if(!doCopy[i - 1]) continue; const auto argAddr = deref(addr + i); - auto &argCell = getCell(argAddr); - assert(argCell.tag == CellTag::Structure); + assert(getCell(argAddr).tag == CellTag::Structure); const auto targetAddr = addrHeap + i; auto &targetCell = getCell(targetAddr); targetCell.tag = CellTag::STR; @@ -421,7 +420,7 @@ inline void Wam::unifyHeapTemp(std::size_t lhsIndex, std::size_t rhsIndex, MGU & getCell(rhsAddr).tag = CellTag::STR; getCell(rhsAddr).STR.addr = rhsAddrNew; // copy arguments - for(std::size_t i = 1; i <= rhsCell.Structure.arity; i++) { + for(int i = 1; i <= rhsCell.Structure.arity; i++) { Address rhsSubAddr = rhsAddr + i; Cell rhsSubCell = getCell(rhsSubAddr); switch(rhsSubCell.tag) { diff --git a/src/mod/rule/Composer.cpp b/libs/libmod/src/mod/rule/Composer.cpp similarity index 95% rename from src/mod/rule/Composer.cpp rename to libs/libmod/src/mod/rule/Composer.cpp index 0e55682..e01bd25 100644 --- a/src/mod/rule/Composer.cpp +++ b/libs/libmod/src/mod/rule/Composer.cpp @@ -1,6 +1,6 @@ -#include "Composer.h" +#include "Composer.hpp" -#include +#include namespace mod { namespace rule { diff --git a/src/mod/rule/Composer.h b/libs/libmod/src/mod/rule/Composer.hpp similarity index 88% rename from src/mod/rule/Composer.h rename to libs/libmod/src/mod/rule/Composer.hpp index 9b049a8..c23ba18 100644 --- a/src/mod/rule/Composer.h +++ b/libs/libmod/src/mod/rule/Composer.hpp @@ -1,9 +1,10 @@ #ifndef MOD_RULE_COMPOSITION_H #define MOD_RULE_COMPOSITION_H -#include -#include -#include +#include +#include +#include +#include #include #include @@ -25,12 +26,10 @@ namespace rule { // rst: // rst-class-start: -class Composer { +class MOD_DECL Composer { Composer(const std::unordered_set > &database, LabelSettings labelSettings); - Composer(const Composer&) = delete; - Composer &operator=(const Composer&) = delete; - Composer(Composer&&) = delete; - Composer &operator=(Composer&&) = delete; + Composer(Composer &&) = delete; + Composer &operator=(Composer &&) = delete; public: ~Composer(); // rst: .. function:: const std::unordered_set > &getRuleDatabase() const @@ -60,7 +59,8 @@ class Composer { // rst: :returns: a new instance of an evaluator with its database initialised with the given rules. // rst: // rst: .. note:: The caller is responsible for ensuring the given rules are unique. - static std::shared_ptr create(const std::unordered_set > &database, LabelSettings labelSettings); + static std::shared_ptr create(const std::unordered_set > &database, + LabelSettings labelSettings); }; // rst-class-end: diff --git a/src/mod/rule/CompositionExpr.cpp b/libs/libmod/src/mod/rule/CompositionExpr.cpp similarity index 97% rename from src/mod/rule/CompositionExpr.cpp rename to libs/libmod/src/mod/rule/CompositionExpr.cpp index 973ed8e..7c2da4e 100644 --- a/src/mod/rule/CompositionExpr.cpp +++ b/libs/libmod/src/mod/rule/CompositionExpr.cpp @@ -1,8 +1,8 @@ -#include "CompositionExpr.h" +#include "CompositionExpr.hpp" -#include -#include -#include +#include +#include +#include namespace mod { namespace rule { diff --git a/src/mod/rule/CompositionExpr.h b/libs/libmod/src/mod/rule/CompositionExpr.hpp similarity index 81% rename from src/mod/rule/CompositionExpr.h rename to libs/libmod/src/mod/rule/CompositionExpr.hpp index eb9e7ec..d6c4ece 100644 --- a/src/mod/rule/CompositionExpr.h +++ b/libs/libmod/src/mod/rule/CompositionExpr.hpp @@ -1,8 +1,9 @@ #ifndef MOD_RULE_COMPOSITIONEXPR_H #define MOD_RULE_COMPOSITIONEXPR_H -#include -#include +#include +#include +#include #include #include @@ -31,9 +32,9 @@ namespace RCExp { // rst: // rst-class-start: -struct Union { +struct MOD_DECL Union { Union(std::vector exps); - friend std::ostream &operator<<(std::ostream &s, const Union &par); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Union &par); const std::vector &getExpressions() const; private: std::vector exps; @@ -46,9 +47,9 @@ struct Union { // rst: // rst-class-start: -struct Bind { +struct MOD_DECL Bind { Bind(std::shared_ptr g); - friend std::ostream &operator<<(std::ostream &s, const Bind &b); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Bind &b); std::shared_ptr getGraph() const; private: std::shared_ptr g; @@ -61,9 +62,9 @@ struct Bind { // rst: // rst-class-start: -struct Id { +struct MOD_DECL Id { Id(std::shared_ptr g); - friend std::ostream &operator<<(std::ostream &s, const Id &i); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Id &i); std::shared_ptr getGraph() const; private: std::shared_ptr g; @@ -76,9 +77,9 @@ struct Id { // rst: // rst-class-start: -struct Unbind { +struct MOD_DECL Unbind { Unbind(std::shared_ptr g); - friend std::ostream &operator<<(std::ostream &s, const Unbind &u); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Unbind &u); std::shared_ptr getGraph() const; private: std::shared_ptr g; @@ -89,8 +90,11 @@ struct Unbind { //------------------------------------------------------------------------------ class ComposeCommon; + class ComposeParallel; + class ComposeSub; + class ComposeSuper; // rst-class: rule::RCExp::Expression @@ -99,7 +103,7 @@ class ComposeSuper; // rst: // rst-class-start: -struct Expression { +struct MOD_DECL Expression { Expression(std::shared_ptr r); Expression(Union u); Expression(Bind bind); @@ -114,13 +118,14 @@ struct Expression { typename Visitor::result_type applyVisitor(Visitor visitor) const { return boost::apply_visitor(visitor, data); } - friend std::ostream &operator<<(std::ostream &s, const Expression &exp); + + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Expression &exp); private: boost::variant, Union, Bind, Id, Unbind, - boost::recursive_wrapper, - boost::recursive_wrapper, - boost::recursive_wrapper, - boost::recursive_wrapper + boost::recursive_wrapper, + boost::recursive_wrapper, + boost::recursive_wrapper, + boost::recursive_wrapper > data; }; // rst-class-end: @@ -135,12 +140,12 @@ struct Expression { // rst: // rst-class-start: -class ComposeBase { +class MOD_DECL ComposeBase { protected: ComposeBase(Expression first, Expression second, bool discardNonchemical); public: virtual ~ComposeBase(); - friend std::ostream &operator<<(std::ostream &s, const ComposeBase &compose); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const ComposeBase &compose); const Expression &getFirst() const; const Expression &getSecond() const; bool getDiscardNonchemical() const; @@ -159,7 +164,7 @@ class ComposeBase { // rst: // rst-class-start: -struct ComposeCommon : public ComposeBase { +struct MOD_DECL ComposeCommon : public ComposeBase { ComposeCommon(Expression first, Expression second, bool discardNonchemical, bool maximum, bool connected); bool getMaxmimum() const; bool getConnected() const; @@ -176,7 +181,7 @@ struct ComposeCommon : public ComposeBase { // rst: // rst-class-start: -struct ComposeParallel : public ComposeBase { +struct MOD_DECL ComposeParallel : public ComposeBase { ComposeParallel(Expression first, Expression second, bool discardNonchemical); private: std::ostream &print(std::ostream &s) const; @@ -190,7 +195,7 @@ struct ComposeParallel : public ComposeBase { // rst: // rst-class-start: -struct ComposeSub : public ComposeBase { +struct MOD_DECL ComposeSub : public ComposeBase { ComposeSub(Expression first, Expression second, bool discardNonchemical, bool allowPartial); bool getAllowPartial() const; private: @@ -207,8 +212,12 @@ struct ComposeSub : public ComposeBase { // rst: // rst-class-start: -struct ComposeSuper : public ComposeBase { - ComposeSuper(Expression first, Expression second, bool discardNonchemical, bool allowPartial, bool enforceConstraints); +struct MOD_DECL ComposeSuper : public ComposeBase { + ComposeSuper(Expression first, + Expression second, + bool discardNonchemical, + bool allowPartial, + bool enforceConstraints); bool getAllowPartial() const; bool getEnforceConstraints() const; private: diff --git a/src/mod/rule/ForwardDecl.h b/libs/libmod/src/mod/rule/ForwardDecl.hpp similarity index 100% rename from src/mod/rule/ForwardDecl.h rename to libs/libmod/src/mod/rule/ForwardDecl.hpp diff --git a/src/mod/rule/GraphInterface.cpp b/libs/libmod/src/mod/rule/GraphInterface.cpp similarity index 98% rename from src/mod/rule/GraphInterface.cpp rename to libs/libmod/src/mod/rule/GraphInterface.cpp index 19a6a65..ddb85e0 100644 --- a/src/mod/rule/GraphInterface.cpp +++ b/libs/libmod/src/mod/rule/GraphInterface.cpp @@ -1,12 +1,12 @@ -#include "GraphInterface.h" - -#include -#include -#include -#include -#include -#include -#include +#include "GraphInterface.hpp" + +#include +#include +#include +#include +#include +#include +#include namespace mod { namespace rule { diff --git a/src/mod/rule/GraphInterface.h b/libs/libmod/src/mod/rule/GraphInterface.hpp similarity index 95% rename from src/mod/rule/GraphInterface.h rename to libs/libmod/src/mod/rule/GraphInterface.hpp index e0f485b..7785132 100644 --- a/src/mod/rule/GraphInterface.h +++ b/libs/libmod/src/mod/rule/GraphInterface.hpp @@ -4,7 +4,7 @@ // rst: This header contains the definitions for the graph interface for :cpp:class:`rule::Rule`. // rst: -#include +#include #include @@ -86,10 +86,10 @@ class Rule::LeftGraph::Vertex { // rst: // rst: Constructs a null descriptor. Vertex(); - friend std::ostream &operator<<(std::ostream &s, const Vertex &v); - friend bool operator==(const Vertex &v1, const Vertex &v2); - friend bool operator!=(const Vertex &v1, const Vertex &v2); - friend bool operator<(const Vertex &v1, const Vertex &v2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Vertex &v); + MOD_DECL friend bool operator==(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator!=(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator<(const Vertex &v1, const Vertex &v2); std::size_t hash() const; // rst: .. function:: explicit operator bool() const // rst: @@ -178,10 +178,10 @@ class Rule::LeftGraph::Edge { // rst: // rst: Constructs a null descriptor. Edge(); - friend std::ostream &operator<<(std::ostream &s, const Edge &e); - friend bool operator==(const Edge &e1, const Edge &e2); - friend bool operator!=(const Edge &e1, const Edge &e2); - friend bool operator<(const Edge &e1, const Edge &e2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Edge &e); + MOD_DECL friend bool operator==(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator!=(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator<(const Edge &e1, const Edge &e2); // rst: .. function:: explicit operator bool() const // rst: // rst: :returns: :cpp:expr:`!isNull()` @@ -440,10 +440,10 @@ class Rule::ContextGraph::Vertex { // rst: // rst: Constructs a null descriptor. Vertex(); - friend std::ostream &operator<<(std::ostream &s, const Vertex &v); - friend bool operator==(const Vertex &v1, const Vertex &v2); - friend bool operator!=(const Vertex &v1, const Vertex &v2); - friend bool operator<(const Vertex &v1, const Vertex &v2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Vertex &v); + MOD_DECL friend bool operator==(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator!=(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator<(const Vertex &v1, const Vertex &v2); std::size_t hash() const; // rst: .. function:: explicit operator bool() const // rst: @@ -498,10 +498,10 @@ class Rule::ContextGraph::Edge { // rst: // rst: Constructs a null descriptor. Edge(); - friend std::ostream &operator<<(std::ostream &s, const Edge &e); - friend bool operator==(const Edge &e1, const Edge &e2); - friend bool operator!=(const Edge &e1, const Edge &e2); - friend bool operator<(const Edge &e1, const Edge &e2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Edge &e); + MOD_DECL friend bool operator==(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator!=(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator<(const Edge &e1, const Edge &e2); // rst: .. function:: explicit operator bool() const // rst: // rst: :returns: :cpp:expr:`!isNull()` @@ -750,10 +750,10 @@ class Rule::RightGraph::Vertex { // rst: // rst: Constructs a null descriptor. Vertex(); - friend std::ostream &operator<<(std::ostream &s, const Vertex &v); - friend bool operator==(const Vertex &v1, const Vertex &v2); - friend bool operator!=(const Vertex &v1, const Vertex &v2); - friend bool operator<(const Vertex &v1, const Vertex &v2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Vertex &v); + MOD_DECL friend bool operator==(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator!=(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator<(const Vertex &v1, const Vertex &v2); std::size_t hash() const; // rst: .. function:: explicit operator bool() const // rst: @@ -842,10 +842,10 @@ class Rule::RightGraph::Edge { // rst: // rst: Constructs a null descriptor. Edge(); - friend std::ostream &operator<<(std::ostream &s, const Edge &e); - friend bool operator==(const Edge &e1, const Edge &e2); - friend bool operator!=(const Edge &e1, const Edge &e2); - friend bool operator<(const Edge &e1, const Edge &e2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Edge &e); + MOD_DECL friend bool operator==(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator!=(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator<(const Edge &e1, const Edge &e2); // rst: .. function:: explicit operator bool() const // rst: // rst: :returns: :cpp:expr:`!isNull()` @@ -1061,10 +1061,10 @@ class Rule::Vertex { // rst: // rst: Constructs a null descriptor. Vertex(); - friend std::ostream &operator<<(std::ostream &s, const Vertex &v); - friend bool operator==(const Vertex &v1, const Vertex &v2); - friend bool operator!=(const Vertex &v1, const Vertex &v2); - friend bool operator<(const Vertex &v1, const Vertex &v2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Vertex &v); + MOD_DECL friend bool operator==(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator!=(const Vertex &v1, const Vertex &v2); + MOD_DECL friend bool operator<(const Vertex &v1, const Vertex &v2); std::size_t hash() const; // rst: .. function:: explicit operator bool() const // rst: @@ -1146,10 +1146,10 @@ class Rule::Edge { // rst: // rst: Constructs a null descriptor. Edge(); - friend std::ostream &operator<<(std::ostream &s, const Edge &e); - friend bool operator==(const Edge &e1, const Edge &e2); - friend bool operator!=(const Edge &e1, const Edge &e2); - friend bool operator<(const Edge &e1, const Edge &e2); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Edge &e); + MOD_DECL friend bool operator==(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator!=(const Edge &e1, const Edge &e2); + MOD_DECL friend bool operator<(const Edge &e1, const Edge &e2); // rst: .. function:: explicit operator bool() const // rst: // rst: :returns: :cpp:expr:`!isNull()` diff --git a/src/mod/rule/Rule.cpp b/libs/libmod/src/mod/rule/Rule.cpp similarity index 94% rename from src/mod/rule/Rule.cpp rename to libs/libmod/src/mod/rule/Rule.cpp index 89a9bc0..ed86caa 100644 --- a/src/mod/rule/Rule.cpp +++ b/libs/libmod/src/mod/rule/Rule.cpp @@ -1,14 +1,14 @@ -#include "Rule.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Rule.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -235,11 +235,10 @@ std::shared_ptr Rule::ruleGMLString(const std::string &data, bool invert) } std::shared_ptr Rule::ruleGML(const std::string &file, bool invert) { - std::string fullFilename = prefixFilename(file); - std::ifstream ifs(fullFilename); - if(!ifs) throw InputError("Could not open rule GML file '" + file + "' ('" + fullFilename + "').\n"); + std::ifstream ifs(file); + if(!ifs) throw InputError("Could not open rule GML file '" + file + "'.\n"); std::ostringstream err; - return handleLoadedRule(lib::IO::Rules::Read::gml(ifs, err), invert, "file '" + fullFilename + "'", err); + return handleLoadedRule(lib::IO::Rules::Read::gml(ifs, err), invert, "file '" + file + "'", err); } std::shared_ptr Rule::makeRule(std::unique_ptr r) { diff --git a/src/mod/rule/Rule.h b/libs/libmod/src/mod/rule/Rule.hpp similarity index 97% rename from src/mod/rule/Rule.h rename to libs/libmod/src/mod/rule/Rule.hpp index ef69269..9e9d76c 100644 --- a/src/mod/rule/Rule.h +++ b/libs/libmod/src/mod/rule/Rule.hpp @@ -1,9 +1,10 @@ #ifndef MOD_RULE_RULE_H #define MOD_RULE_RULE_H -#include -#include -#include +#include +#include +#include +#include #include @@ -23,7 +24,7 @@ namespace rule { // rst: // rst-class-start: -struct Rule { +struct MOD_DECL Rule { class Vertex; class Edge; class VertexIterator; @@ -37,8 +38,6 @@ struct Rule { class ContextGraph; class RightGraph; private: - Rule(const Rule&) = delete; - Rule &operator=(const Rule&) = delete; Rule(Rule&&) = delete; Rule &operator=(Rule&&) = delete; private: @@ -49,7 +48,7 @@ struct Rule { // rst: // rst: :returns: the unique instance id among all :class:`Rule` instances. unsigned int getId() const; - friend std::ostream &operator<<(std::ostream &s, const Rule &r); + MOD_DECL friend std::ostream &operator<<(std::ostream &s, const Rule &r); const lib::Rules::Real &getRule() const; public: // graph interface // rst: .. function:: std::size_t numVertices() const diff --git a/libs/post_mod/CMakeLists.txt b/libs/post_mod/CMakeLists.txt new file mode 100644 index 0000000..bdbc30e --- /dev/null +++ b/libs/post_mod/CMakeLists.txt @@ -0,0 +1,34 @@ +if(NOT BUILD_POST_MOD) + return() +endif() + +########################################################################### +# Targets and Artefacts +########################################################################### + +install(PROGRAMS bin/mod_post + DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT post_mod_run) + +# commonPreamble.fmt +add_custom_target(commonPreamble ALL + pdflatex + -interaction=nonstopmode + -halt-on-error + -ini + '&pdflatex \\input{${CMAKE_CURRENT_LIST_DIR}/share/mod/commonPreamble.tex}\\usepackage{${CMAKE_CURRENT_LIST_DIR}/share/mod/mod}\\dump' + DEPENDS share/mod/commonPreamble.tex share/mod/mod.sty + BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/share/mod/commonPreamble.fmt + COMMENT "Precompiling Latex preamble (commonPreamble.fmt)") +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/commonPreamble.fmt + share/mod/commonPreamble.tex + share/mod/figureTemplate.tex + share/mod/summary.tex + DESTINATION ${CMAKE_INSTALL_DATADIR}/mod + COMPONENT post_mod_run) + +# Makefile template and Latex package +install(FILES share/mod/mod.mk share/mod/mod.sty + DESTINATION ${CMAKE_INSTALL_DATADIR}/mod + COMPONENT post_mod_run) \ No newline at end of file diff --git a/src/bin/mod_post b/libs/post_mod/bin/mod_post similarity index 89% rename from src/bin/mod_post rename to libs/post_mod/bin/mod_post index 8663462..bbc3908 100755 --- a/src/bin/mod_post +++ b/libs/post_mod/bin/mod_post @@ -316,15 +316,32 @@ else # $1 == --mode echo -n " $file.pdf" >> $makefileDep } - # latex fileNoExt - function phonyLatexDG { - extractTexImageDeps $1.tex >> $makefileDep - } - #--------------------------------------------------------------------- # Other #--------------------------------------------------------------------- - + + # graphType fileNoExt outType extraArgs + function gv { + local graphType=$1 + local fileNoExt="$2" + local outType=$3 + local extraArgs="$4" + echo -n " $fileNoExt.$outType" >> $makefileClean + echo "$fileNoExt.$outType: $fileNoExt.dot" >> $makefileImpl + echo " $this --mode gv $graphType \"$fileNoExt\" $outType \"$extraArgs\"" >> $makefileImpl + echo -n " $fileNoExt.$outType" >> $makefileDep + + return + extractGVImageDeps $inFile >> $makefileImpl + echo "" >> $makefileImpl + # dotFile + function extractGVImageDeps { + grep image $1 | sed "s/.* image=\"\([^\"]*\)\".*/\1/" | while read f; do + echo -n " $f" + done; + } + } + # graphType fileNoExt [noOverlay] function coordsFromGV { local graphType=$1 @@ -369,8 +386,16 @@ else # $1 == --mode echo -n " $fileSvg" >> $makefileDep } + # fileNoExt + function svgToPdf { + local inFile="$1.svg" + local outFile="$1.pdf" + echo -n " $outFile" >> $makefileClean + echo -n " $outFile" >> $makefileDep + echo "$outFile: $inFile" >> $makefileImpl + echo " $this --mode svgToPdf \"$inFile\" \"$outFile\"" >> $makefileImpl + } - . $MOD_PREFIX/bin/mod_genSummaryMakefile #--------------------------------------------------------------------- # The actual processing #--------------------------------------------------------------------- @@ -449,13 +474,26 @@ else # $1 == --mode } gvArgs_base="" - gvArgs_graph="$gvArgs_base -Kneato" + #gvArgs_graph="$gvArgs_base -Kneato" #gvArgs_ruleSide="$gvArgs_base -Kneato -Nfontsize=28 -Epenwidth=3" - gvArgs_rule="$gvArgs_base -Kneato" - #gvArgs_dgNonHyper="$gvArgs_base -Kneato -Goverlap=false -Elen=1.1" + #gvArgs_rule="$gvArgs_base -Kneato" + gvArgs_ruleCombined="$gvArgs_base -Kneato" + gvArgs_dgNonHyper="$gvArgs_base -Kneato -Goverlap=false -Elen=1.1" gvArgs_dgHyper="$gvArgs_base -Kneato -Goverlap=false -Elen=1.5" - gvArgs_dgHyperDot="$gvArgs_base -Goverlap=false -Elen=1.5" - #gvArgs_rc="$gvArgs_base -Kdot"; + #gvArgs_dgHyperDot="$gvArgs_base -Goverlap=false -Elen=1.5" + gvArgs_rc="$gvArgs_base -Kdot"; + + # graphType fileNoExt outType extraArgs + function gv { + printStatus "$FUNCNAME($1)" + local graphType=$1 + local fileNoExt="$2" + local outType=$3 + local extraArgs="$4" + local gvArgsVar="gvArgs_$graphType" + local gvArgs="-T$outType ${!gvArgsVar} $extraArgs" + dot $gvArgs -o $fileNoExt.$outType $fileNoExt.dot + } # graphType fileNoExt [noOverlay] function coordsFromGV { @@ -523,6 +561,14 @@ BEGIN { pdf2svg "$filePdf" "$fileSvg" } + # inFile outFile + function svgToPdf { + local inFile="$1" + local outFile="$2" + echo "graph { a [ shape=plaintext label=\"\" image=\"$inFile\" ] }" | \ + neato -Tpdf $gvArgs_svgToPdf -o $outFile + } + $mode "$@" exit $? fi diff --git a/src/share/mod/commonPreamble.tex b/libs/post_mod/share/mod/commonPreamble.tex similarity index 100% rename from src/share/mod/commonPreamble.tex rename to libs/post_mod/share/mod/commonPreamble.tex diff --git a/src/share/mod/figureTemplate.tex b/libs/post_mod/share/mod/figureTemplate.tex similarity index 100% rename from src/share/mod/figureTemplate.tex rename to libs/post_mod/share/mod/figureTemplate.tex diff --git a/src/share/mod/mod.mk b/libs/post_mod/share/mod/mod.mk similarity index 100% rename from src/share/mod/mod.mk rename to libs/post_mod/share/mod/mod.mk diff --git a/src/share/mod/mod.sty b/libs/post_mod/share/mod/mod.sty similarity index 100% rename from src/share/mod/mod.sty rename to libs/post_mod/share/mod/mod.sty diff --git a/src/share/mod/summary.tex b/libs/post_mod/share/mod/summary.tex similarity index 100% rename from src/share/mod/summary.tex rename to libs/post_mod/share/mod/summary.tex diff --git a/libs/pymod/CMakeLists.txt b/libs/pymod/CMakeLists.txt new file mode 100644 index 0000000..bcd3549 --- /dev/null +++ b/libs/pymod/CMakeLists.txt @@ -0,0 +1,77 @@ +if(NOT BUILD_PY_MOD) + return() +endif() + +########################################################################### +# Targets and Artefacts +########################################################################### + +# libpymod +# ------------------------------------------------------------------------- +add_library(pymod MODULE + ${mod_pymod_INCLUDE_FILES} + ${mod_pymod_SRC_FILES}) +add_library(mod::pymod ALIAS pymod) +target_include_directories(pymod + PUBLIC + $ + $ + ${Boost_INCLUDE_DIR}) +target_link_libraries(pymod PUBLIC mod::libmod Boost::${PYTHON_TARGET} Python3::Python) +target_compile_options(pymod PRIVATE -Wall -Wextra + -Wno-unused-parameter + -Wno-comment + -Wno-unused-local-typedefs) +set_target_properties(pymod PROPERTIES + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON) +target_compile_definitions(pymod PRIVATE PYMOD_SOURCE) +if(ENABLE_IPO) + check_ipo_supported(RESULT result OUTPUT output) + if(result) + set_property(TARGET pymod PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + else() + message(FATAL_ERROR "Interprocedural optimization was requested ('ENABLE_IPO=on'), but it is not supported: ${output}") + endif() +endif() + +install(TARGETS pymod + EXPORT PROJECT_exports + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/mod COMPONENT pymod_lib + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/mod COMPONENT pymod_lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT pymod_lib) +install(DIRECTORY src/mod + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT pymod_dev + FILES_MATCHING PATTERN "*.hpp") + +# the plugin file +set(exportDir ${CMAKE_CURRENT_BINARY_DIR}/share/mod/plugins) +configure_file(share/mod/plugins/00_mod.in ${exportDir}/00_mod.in @ONLY) +install(FILES ${exportDir}/00_mod.in + DESTINATION ${CMAKE_INSTALL_DATADIR}/mod/plugins/ + COMPONENT pymod_run) + +# module files +install(DIRECTORY lib/mod + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT pymod_run + FILES_MATCHING PATTERN "*.py") + + +# mod +# ------------------------------------------------------------------------- +set(exportDir ${CMAKE_CURRENT_BINARY_DIR}/bin) +configure_file(bin/mod.in ${exportDir}/mod @ONLY) +install(PROGRAMS ${exportDir}/mod + DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT pymod_run) + + +# Valgrind suppression files +# ------------------------------------------------------------------------- +install(FILES + share/mod/obabel.supp + share/mod/python.supp + DESTINATION ${CMAKE_INSTALL_DATADIR}/mod + COMPONENT pymod_run) \ No newline at end of file diff --git a/src/bin/mod b/libs/pymod/bin/mod.in similarity index 97% rename from src/bin/mod rename to libs/pymod/bin/mod.in index b0fc889..4447945 100755 --- a/src/bin/mod +++ b/libs/pymod/bin/mod.in @@ -132,7 +132,7 @@ if test "$quiet" = "false"; then echo -n "MedØlDatschgerl version " fi if test "$quiet" = "false" -o "$doVersion" = "true"; then - cat $MOD_PREFIX/share/mod/VERSION + echo "@PROJECT_VERSION@" fi @@ -298,6 +298,8 @@ EOF #-------------------------------------------------------------- + + mod.includedFiles = set() def include(fName, checkDup=True, putDup=True, skipDup=True): @@ -420,8 +422,13 @@ fi # Post processing if [ $post = "true" ]; then export MOD_PREFIX - $MOD_PREFIX/bin/$summaryMaker "${summaryArgs[@]}" - res=$? + if test -x $MOD_PREFIX/bin/$summaryMaker; then + $MOD_PREFIX/bin/$summaryMaker "${summaryArgs[@]}" + res=$? + else + echo "Wrapper script called without --nopost, but mod_post is not installed." + res=1 + fi else res=0 fi diff --git a/src/lib/mod/__init__.py b/libs/pymod/lib/mod/__init__.py similarity index 94% rename from src/lib/mod/__init__.py rename to libs/pymod/lib/mod/__init__.py index 2a751f2..e68059b 100644 --- a/src/lib/mod/__init__.py +++ b/libs/pymod/lib/mod/__init__.py @@ -1,4 +1,4 @@ -from .mod_ import * +from .libpymod import * import collections import inspect import math @@ -52,6 +52,40 @@ def _fixClass(name, c, indent): if c[1] == Unbuffered: continue _fixClass(c[0], c[1], 0) + +#---------------------------------------------------------- +# Script Inclusion Support +#---------------------------------------------------------- + +class CWDPath: + def __init__(self, f): + self.f = f + +_filePrefixes = [] + +def prefixFilename(name): + if isinstance(name, CWDPath): + return name.f + if len(name) == 0 or name[0] == '/': + return name + prefixed = [] + for s in _filePrefixes: + if len(s) != 0 and s[0] == '/': + prefixed[:] = [s] + else: + prefixed.append(s) + prefixed.append(name) + return ''.join(prefixed) + +def pushFilePrefix(prefix): + _filePrefixes.append(prefix) + +def popFilePrefix(): + if len(_filePrefixes) == 0: + raise LogicError("popFilePrefix failed; the stack is empty") + _filePrefixes.pop() + + #---------------------------------------------------------- # Wrappers #---------------------------------------------------------- @@ -65,7 +99,7 @@ def _unwrap(lcpp): l.extend(a for a in lcpp) return l -def _funcWrap(F, f, resultWrap=None, module=mod_): +def _funcWrap(F, f, resultWrap=None, module=libpymod): if isinstance(f, F): res = f elif hasattr(f, "__call__"): # wrap functor @@ -110,7 +144,7 @@ def __call__(self, *args): # Chem #---------------------------------------------------------- -BondType.__str__ = mod_._bondTypeToString +BondType.__str__ = libpymod._bondTypeToString #---------------------------------------------------------- # Config @@ -131,20 +165,16 @@ def _Derivation__setattr__(self, name, value): _NoNew__setattr__(self, name, value) Derivation.__setattr__ = _Derivation__setattr__ -def _Derivation__hash__(self): - assert False -Derivation.__hash__ = _Derivation__hash__ - #---------------------------------------------------------- # DG #---------------------------------------------------------- def dgDerivations(ders): - return mod_.dgDerivations(_wrap(VecDerivation, ders)) + return libpymod.dgDerivations(_wrap(VecDerivation, ders)) def dgRuleComp(graphs, strat, labelSettings=LabelSettings(LabelType.String, LabelRelation.Isomorphism), ignoreRuleLabelTypes=False): - return mod_.dgRuleComp(_wrap(VecGraph, graphs), dgStrat(strat), labelSettings, ignoreRuleLabelTypes) + return libpymod.dgRuleComp(_wrap(VecGraph, graphs), dgStrat(strat), labelSettings, ignoreRuleLabelTypes) def dgDump(graphs, rules, f): - return mod_.dgDump(_wrap(VecGraph, graphs), _wrap(VecRule, rules), f) + return libpymod.dgDump(_wrap(VecGraph, graphs), _wrap(VecRule, rules), prefixFilename(f)) _DG_print_orig = DG.print def _DG_print(self, printer=None, data=None): @@ -341,13 +371,13 @@ def _graphLoad(a, name, add): inputGraphs.append(a) return a def graphGMLString(d, name=None, add=True): - return _graphLoad(mod_.graphGMLString(d), name, add) + return _graphLoad(libpymod.graphGMLString(d), name, add) def graphGML(f, name=None, add=True): - return _graphLoad(mod_.graphGML(f), name, add) + return _graphLoad(libpymod.graphGML(prefixFilename(f)), name, add) def graphDFS(s, name=None, add=True): - return _graphLoad(mod_.graphDFS(s), name, add) + return _graphLoad(libpymod.graphDFS(s), name, add) def smiles(s, name=None, add=True): - return _graphLoad(mod_.smiles(s), name, add) + return _graphLoad(libpymod.smiles(s), name, add) def _Graph__repr__(self): return str(self) + "(" + str(self.id) + ")" @@ -381,7 +411,7 @@ def _RCEvaluator__getattribute__(self, name): RCEvaluator.eval = lambda self, e: _unwrap(_RCEvaluator_eval(self, e)) def rcEvaluator(rules, labelSettings=LabelSettings(LabelType.String, LabelRelation.Isomorphism)): - return mod_.rcEvaluator(_wrap(VecRule, rules), labelSettings) + return libpymod.rcEvaluator(_wrap(VecRule, rules), labelSettings) #---------------------------------------------------------- # Rule @@ -409,12 +439,12 @@ def _Rule_print(self, first=None, second=None): Rule.printGML = lambda self, withCoords=False: _Rule_printGML(self, withCoords) def ruleGMLString(s, invert=False, add=True): - a = mod_.ruleGMLString(s, invert) + a = libpymod.ruleGMLString(s, invert) if add: inputRules.append(a) return a def ruleGML(f, invert=False, add=True): - a = mod_.ruleGML(f, invert) + a = libpymod.ruleGML(prefixFilename(f), invert) if add: inputRules.append(a) return a diff --git a/src/lib/mod/latex.py b/libs/pymod/lib/mod/latex.py similarity index 100% rename from src/lib/mod/latex.py rename to libs/pymod/lib/mod/latex.py diff --git a/src/share/mod/obabel.supp b/libs/pymod/share/mod/obabel.supp similarity index 100% rename from src/share/mod/obabel.supp rename to libs/pymod/share/mod/obabel.supp diff --git a/libs/pymod/share/mod/plugins/00_mod.in b/libs/pymod/share/mod/plugins/00_mod.in new file mode 100644 index 0000000..d0c49d2 --- /dev/null +++ b/libs/pymod/share/mod/plugins/00_mod.in @@ -0,0 +1,2 @@ +name: mod +path: @CMAKE_INSTALL_FULL_LIBDIR@ diff --git a/src/share/mod/python.supp b/libs/pymod/share/mod/python.supp similarity index 73% rename from src/share/mod/python.supp rename to libs/pymod/share/mod/python.supp index 7497b50..8f5eb3a 100644 --- a/src/share/mod/python.supp +++ b/libs/pymod/share/mod/python.supp @@ -8,14 +8,29 @@ # ./python -E ./Lib/test/regrtest.py -u gui,network # # You must edit Objects/obmalloc.c and uncomment Py_USING_MEMORY_DEBUGGER -# to use the preferred suppressions with Py_ADDRESS_IN_RANGE. +# to use the preferred suppressions with address_in_range. # # If you do not want to recompile Python, you can uncomment -# suppressions for PyObject_Free and PyObject_Realloc. +# suppressions for _PyObject_Free and _PyObject_Realloc. # # See Misc/README.valgrind for more information. -# These first suppressions are manually added, and may be wrong +# these first ones have been manually added and may not be correct +{ + + Memcheck:Cond + fun:__wcsnlen_avx2 + ... + fun:Py_GetProgramFullPath +} +{ + + Memcheck:Cond + fun:internal_utf8_loop + ... + fun:Py_GetProgramFullPath +} + { Memcheck:Addr4 @@ -29,6 +44,12 @@ ... fun:unicode_dealloc.* } +{ + + Memcheck:Value8 + ... + fun:unicode_dealloc.* +} { @@ -36,6 +57,12 @@ ... fun:freechildren.* } +{ + + Memcheck:Cond + ... + fun:freechildren.* +} { @@ -62,6 +89,18 @@ ... fun:list_dealloc.* } +{ + + Memcheck:Cond + ... + fun:list_dealloc.* +} +{ + + Memcheck:Value8 + ... + fun:list_dealloc.* +} { @@ -85,27 +124,40 @@ { Memcheck:Cond - fun:address_in_range - fun:_PyObject_Free + ... + fun:PyMem_Free } { Memcheck:Value8 - fun:address_in_range - fun:_PyObject_Free + ... + fun:PyMem_Free } + { Memcheck:Addr4 - fun:address_in_range - fun:_PyObject_Free + ... + fun:PyObject_GC_Del +} +{ + + Memcheck:Cond + ... + fun:PyObject_GC_Del +} +{ + + Memcheck:Value8 + ... + fun:PyObject_GC_Del } { - Memcheck:Addr4 + Memcheck:Cond ... - fun:_PyObject_Realloc.* + fun:PyObject_Free } { @@ -141,183 +193,174 @@ { - Memcheck:Addr4 - fun:address_in_range - fun:_PyObject_Realloc -} -{ - - Memcheck:Cond - fun:address_in_range - fun:_PyObject_Realloc + Memcheck:Value8 + ... + fun:PyObject_Free } { - Memcheck:Value8 - fun:address_in_range - fun:_PyObject_Realloc + Memcheck:Addr4 + ... + fun:PyObject_Free } { - Memcheck:Addr4 - fun:address_in_range - fun:_PyObject_Free + Memcheck:Cond + ... + fun:_PyObject_Free.* } { - Memcheck:Leak - match-leak-kinds: possible - fun:malloc - fun:PyObject_Malloc - fun:_PyObject_GC_NewVar + Memcheck:Addr4 + ... + fun:_PyObject_Free.* } { Memcheck:Value8 ... - fun:PyObject_GC_Del + fun:_PyObject_Free.* } + { Memcheck:Cond ... - fun:PyObject_GC_Del + fun:_PyObject_Realloc.* } { Memcheck:Addr4 ... - fun:PyObject_GC_Del + fun:_PyObject_Realloc.* } { - Memcheck:Leak - match-leak-kinds: possible - fun:malloc - fun:_PyObject_Malloc.* -} - -{ - - Memcheck:Leak - fun:realloc - fun:_PyObject_GC_Resize + Memcheck:Value8 + ... + fun:_PyObject_Realloc.* } { - - Memcheck:Leak - fun:malloc - ... - fun:_PyObject_GC_Resize + + Memcheck:Addr4 + ... + fun:PyMem_Free } { - - Memcheck:Leak - fun:malloc - fun:_PyObject_GC_Malloc + + Memcheck:Addr4 + ... + fun:PyNode_Free } { - - Memcheck:Cond - ... - fun:_PyObject_GC_Resize + + Memcheck:Addr4 + ... + fun:PyArena_Free } { - - Memcheck:Value8 - ... - fun:_PyObject_GC_Resize + + Memcheck:Addr4 + ... + fun:list_dealloc.* } - { - - Memcheck:Addr4 - ... - fun:_PyObject_GC_Resize + + Memcheck:Addr4 + ... + fun:list_dealloc.* } { - - Memcheck:Addr4 - fun:_PyCodec_Lookup + + Memcheck:Cond + ... + fun:code_dealloc.* } - { - - Memcheck:Cond - ... - fun:_PyBytes_Resize + + Memcheck:Addr4 + ... + fun:code_dealloc.* } - { - - Memcheck:Value8 - ... - fun:_PyBytes_Resize + + Memcheck:Value8 + ... + fun:code_dealloc.* } { - - Memcheck:Addr4 - ... - fun:_PyBytes_Resize + + Memcheck:Cond + ... + fun:unicode_dealloc.* } - { - - Memcheck:Addr8 - fun:wcscmp + + Memcheck:Addr4 + ... + fun:unicode_dealloc.* } - { Memcheck:Cond ... - fun:wcstombs -} - -{ - - Memcheck:Addr8 - fun:wcschr + fun:wcsrtombs + ... + fun:_Py_wreadlink } { - Memcheck:Addr8 - fun:__wcschr_sse2 + Memcheck:Cond + ... + fun:wcsrtombs + ... + fun:_Py_wfopen } + { Memcheck:Cond - fun:__wcsrchr_sse2 + ... + fun:PyParser_ASTFromStringObject } - { - Memcheck:Addr8 - fun:__wcscpy_ssse3 + Memcheck:Addr4 + ... + fun:PyParser_ASTFromStringObject } { - Memcheck:Cond - fun:__wcscpy_ssse3 + Memcheck:Value8 + ... + fun:PyParser_ASTFromStringObject } + { - Memcheck:Addr8 - fun:wcslen + Memcheck:Leak + match-leak-kinds: possible + fun:malloc + ... + fun:_PyObject_GC_Alloc.* } + { - Memcheck:Cond - fun:wcslen + Memcheck:Leak + match-leak-kinds: possible + fun:malloc + ... + fun:_PyObject_Realloc.* } @@ -326,25 +369,25 @@ { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 - fun:Py_ADDRESS_IN_RANGE + fun:address_in_range } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 - fun:Py_ADDRESS_IN_RANGE + fun:address_in_range } { ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64) Memcheck:Value8 - fun:Py_ADDRESS_IN_RANGE + fun:address_in_range } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond - fun:Py_ADDRESS_IN_RANGE + fun:address_in_range } # @@ -431,106 +474,64 @@ fun:_dl_allocate_tls } -# The special functions for memory stuff - { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 - fun:_PyObject_Free* -} - -{ - ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value - Memcheck:Cond - fun:_PyObject_Free* -} - -{ - ADDRESS_IN_RANGE/Invalid read of size 8 - Memcheck:Value8 - fun:_PyObject_Free* + fun:_PyObject_Free } { ADDRESS_IN_RANGE/Invalid read of size 4 - Memcheck:Addr4 - fun:_PyObject_Realloc* + Memcheck:Value4 + fun:_PyObject_Free } { - ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value - Memcheck:Cond - fun:_PyObject_Realloc* + ADDRESS_IN_RANGE/Use of uninitialised value of size 8 + Memcheck:Addr8 + fun:_PyObject_Free } { - ADDRESS_IN_RANGE/Invalid read of size 8 + ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Value8 - fun:_PyObject_Realloc* -} - -# Orig - -{ - ADDRESS_IN_RANGE/Invalid read of size 4 - Memcheck:Addr4 - fun:PyObject_Free -} - -{ - ADDRESS_IN_RANGE/Invalid read of size 4 - Memcheck:Value4 - fun:PyObject_Free + fun:_PyObject_Free } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond - fun:PyObject_Free + fun:_PyObject_Free } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 - fun:PyObject_Realloc* + fun:_PyObject_Realloc } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 - fun:PyObject_Realloc -} - -{ - ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value - Memcheck:Cond - fun:PyObject_Realloc* + fun:_PyObject_Realloc } -# Changed to size 8 - { - ADDRESS_IN_RANGE/Invalid read of size 8 + ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Addr8 - fun:PyObject_Free + fun:_PyObject_Realloc } { - ADDRESS_IN_RANGE/Invalid read of size 8 + ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Value8 - fun:PyObject_Free -} - -{ - ADDRESS_IN_RANGE/Invalid read of size 8 - Memcheck:Addr8 - fun:PyObject_Realloc + fun:_PyObject_Realloc } { - ADDRESS_IN_RANGE/Invalid read of size 8 - Memcheck:Value8 - fun:PyObject_Realloc* + ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value + Memcheck:Cond + fun:_PyObject_Realloc } ### @@ -659,6 +660,38 @@ ### fun:MD5_Update ###} +# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64 +# See http://bugs.python.org/issue14171 +{ + openssl 1.0.1 prng 1 + Memcheck:Cond + fun:bcmp + fun:fips_get_entropy + fun:FIPS_drbg_instantiate + fun:RAND_init_fips + fun:OPENSSL_init_library + fun:SSL_library_init + fun:init_hashlib +} + +{ + openssl 1.0.1 prng 2 + Memcheck:Cond + fun:fips_get_entropy + fun:FIPS_drbg_instantiate + fun:RAND_init_fips + fun:OPENSSL_init_library + fun:SSL_library_init + fun:init_hashlib +} + +{ + openssl 1.0.1 prng 3 + Memcheck:Value8 + fun:_x86_64_AES_encrypt_compact + fun:AES_encrypt +} + # # All of these problems come from using test_socket_ssl # @@ -761,4 +794,37 @@ fun:SHA1_Update } +{ + test_buffer_non_debug + Memcheck:Addr4 + fun:PyUnicodeUCS2_FSConverter +} + +{ + test_buffer_non_debug + Memcheck:Addr4 + fun:PyUnicode_FSConverter +} + +{ + wcscmp_false_positive + Memcheck:Addr8 + fun:wcscmp + fun:_PyOS_GetOpt + fun:Py_Main + fun:main +} + +# Additional suppressions for the unified decimal tests: +{ + test_decimal + Memcheck:Addr4 + fun:PyUnicodeUCS2_FSConverter +} + +{ + test_decimal2 + Memcheck:Addr4 + fun:PyUnicode_FSConverter +} diff --git a/src/mod/Py/Chem.cpp b/libs/pymod/src/mod/py/Chem.cpp similarity index 99% rename from src/mod/Py/Chem.cpp rename to libs/pymod/src/mod/py/Chem.cpp index be15900..582af2b 100644 --- a/src/mod/Py/Chem.cpp +++ b/libs/pymod/src/mod/py/Chem.cpp @@ -1,6 +1,6 @@ -#include +#include -#include +#include #include diff --git a/src/mod/Py/Collections.cpp b/libs/pymod/src/mod/py/Collections.cpp similarity index 89% rename from src/mod/Py/Collections.cpp rename to libs/pymod/src/mod/py/Collections.cpp index c53c7cd..dd88629 100644 --- a/src/mod/Py/Collections.cpp +++ b/libs/pymod/src/mod/py/Collections.cpp @@ -1,12 +1,12 @@ -#include +#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/src/mod/Py/Common.h b/libs/pymod/src/mod/py/Common.hpp similarity index 100% rename from src/mod/Py/Common.h rename to libs/pymod/src/mod/py/Common.hpp diff --git a/src/mod/Py/Config.cpp b/libs/pymod/src/mod/py/Config.cpp similarity index 99% rename from src/mod/Py/Config.cpp rename to libs/pymod/src/mod/py/Config.cpp index 78373c9..d8cb96b 100644 --- a/src/mod/Py/Config.cpp +++ b/libs/pymod/src/mod/py/Config.cpp @@ -1,6 +1,6 @@ -#include +#include -#include +#include namespace mod { namespace Py { diff --git a/src/mod/Py/Derivation.cpp b/libs/pymod/src/mod/py/Derivation.cpp similarity index 93% rename from src/mod/Py/Derivation.cpp rename to libs/pymod/src/mod/py/Derivation.cpp index 9938b2a..8574703 100644 --- a/src/mod/Py/Derivation.cpp +++ b/libs/pymod/src/mod/py/Derivation.cpp @@ -1,7 +1,7 @@ -#include +#include -#include -#include +#include +#include namespace mod { namespace Py { diff --git a/src/mod/Py/Error.cpp b/libs/pymod/src/mod/py/Error.cpp similarity index 97% rename from src/mod/Py/Error.cpp rename to libs/pymod/src/mod/py/Error.cpp index 2eb121d..62c6700 100644 --- a/src/mod/Py/Error.cpp +++ b/libs/pymod/src/mod/py/Error.cpp @@ -1,6 +1,6 @@ -#include +#include -#include +#include // see http://stackoverflow.com/questions/2261858/boostpython-export-custom-exception // and http://stackoverflow.com/questions/9620268/boost-python-custom-exception-class diff --git a/src/mod/Py/Function.cpp b/libs/pymod/src/mod/py/Function.cpp similarity index 89% rename from src/mod/Py/Function.cpp rename to libs/pymod/src/mod/py/Function.cpp index 09617f9..b8e898a 100644 --- a/src/mod/Py/Function.cpp +++ b/libs/pymod/src/mod/py/Function.cpp @@ -1,12 +1,12 @@ -#include +#include -#include "Function.h" +#include "Function.hpp" -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include namespace mod { namespace Py { diff --git a/src/mod/Py/Function.h b/libs/pymod/src/mod/py/Function.hpp similarity index 99% rename from src/mod/Py/Function.h rename to libs/pymod/src/mod/py/Function.hpp index f33d8cf..1f8c733 100644 --- a/src/mod/Py/Function.h +++ b/libs/pymod/src/mod/py/Function.hpp @@ -5,7 +5,7 @@ // The arg wrapping should also be looked into. // Use exportFunc to export the wrapper class for a given signature. -#include +#include #include diff --git a/libs/pymod/src/mod/py/Misc.cpp b/libs/pymod/src/mod/py/Misc.cpp new file mode 100644 index 0000000..2ef8d29 --- /dev/null +++ b/libs/pymod/src/mod/py/Misc.cpp @@ -0,0 +1,101 @@ +#include + +#include +#include +#include +#include + +#include + +#include +#include + +namespace mod { +namespace Py { + +// rst: +// rst: .. function:: prefixFilename(name) +// rst: +// rst: Utility function for converting script-relative paths to current-working-directory-relative paths +// rst: (see also :py:func:`include`). +// rst: This function is used in all PyMØD functions that takes a filename as argument. +// rst: To circumvent this prefixing use the :py:class:`CWDPath` class. +// rst: +// rst: :returns: :py:attr:`name` prefixed with all strings pushed with :py:func:`pushFilePrefix` +// rst: and popped yet. +// rst: :rtype: str +// rst: +// rst: .. function:: pushFilePrefix(s) +// rst: +// rst: Push another prefix used in :py:func:`prefixFilename`. +// rst: The prefixes are concatenated in the order they are pushed. +// rst: No directory delimiters are inserted, so they must explicitly be part of the pushed prefixes. +// rst: If the argument starts with ``/``, then during concatenation all previously pushed prefixes are ignored. +// rst: +// rst: :param s: the string to push as a prefix to be concatenated in :py:func:`prefixFilename`. +// rst: :type s: str +// rst: +// rst: .. function:: popFilePrefix() +// rst: +// rst: Pop a previously pushed prefix. +// rst: +// rst: .. class:: CWDPath +// rst: +// rst: A dummy class to wrap a filename in to disable prefixing. +// rst: +// rst: For example, if a graph GML file is to be loaded relative to the current file +// rst: (assuming :py:func:`include` is used for script inclusion), then it can be done with +// rst: +// rst: .. code-block:: python +// rst: +// rst: g = graphGML(f) +// rst: +// rst: If the file is located relative to the current working directory +// rst: (i.e., where the :any:`mod` wrapper script were invoked from), then the graph loading should be done as +// rst: +// rst: .. code-block:: python +// rst: +// rst: g = graphGML(CWDPath(f)) +// rst: +// rst: .. function:: __init__(self, f) +// rst: +// rst: Wrap a filename. +// rst: + +namespace { + +std::uintptr_t magicLibraryValue() { + return reinterpret_cast (&mod::getConfig()); +} + +} // namespace + +void Misc_doExport() { + // rst: .. function:: magicLibraryValue() + // rst: + // rst: :returns: a number unique for each instantiation of libMØD. This can be used to check for the diamond problem for shared libraries. + // rst: + // rst: :rtype: uintptr_t + py::def("magicLibraryValue", &magicLibraryValue); + + // rst: .. function:: version() + // rst: + // rst: :returns: the version of MØD. + // rst: :rtype: string + py::def("version", &mod::version); + + // rst: .. function:: rngReseed(seed) + // rst: + // rst: Reseed the random bit generator used in the library. + py::def("rngReseed", &mod::rngReseed); + + py::def("post", &mod::post); + py::def("postChapter", &mod::postChapter); + py::def("postSection", &mod::postSection); + + + py::def("printGeometryGraph", &mod::printGeometryGraph); +} + +} // namespace Py +} // namespace mod diff --git a/src/mod/Py/Module.cpp b/libs/pymod/src/mod/py/Module.cpp similarity index 95% rename from src/mod/Py/Module.cpp rename to libs/pymod/src/mod/py/Module.cpp index 3f98d7a..eb53877 100644 --- a/src/mod/Py/Module.cpp +++ b/libs/pymod/src/mod/py/Module.cpp @@ -1,3 +1,4 @@ +#define BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY 1 // TODO: remove when >= Boost 1.66 #include #include @@ -7,7 +8,6 @@ #include #include - // BOOST_PP_SEQ( // BOOST_PP_TUPLE(Namespace, // BOOST_PP_SEQ(Name) @@ -42,7 +42,7 @@ BOOST_PP_SEQ_FOR_EACH(MOD_iterDecl, ~, MOD_FILES()) #undef MOD_iterDecl } // namespace mod -BOOST_PYTHON_MODULE(mod_) { +BOOST_PYTHON_MODULE(libpymod) { #define MOD_call(a, prefix) mod::prefix Py:: BOOST_PP_CAT(a, _doExport)(); #define MOD_iterNs(r, data, i, t) MOD_call(t, data::) #define MOD_iterDecl(r, data, t) \ diff --git a/src/mod/Py/Term.cpp b/libs/pymod/src/mod/py/Term.cpp similarity index 71% rename from src/mod/Py/Term.cpp rename to libs/pymod/src/mod/py/Term.cpp index 009b76d..56ada59 100644 --- a/src/mod/Py/Term.cpp +++ b/libs/pymod/src/mod/py/Term.cpp @@ -1,6 +1,6 @@ -#include +#include -#include +#include namespace mod { namespace Py { diff --git a/src/mod/Py/dg/DG.cpp b/libs/pymod/src/mod/py/dg/DG.cpp similarity index 95% rename from src/mod/Py/dg/DG.cpp rename to libs/pymod/src/mod/py/dg/DG.cpp index bea4719..1c5a704 100644 --- a/src/mod/Py/dg/DG.cpp +++ b/libs/pymod/src/mod/py/dg/DG.cpp @@ -1,21 +1,17 @@ -#include +#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include namespace mod { namespace dg { namespace Py { namespace { -std::vector > getGraphDatabase(std::shared_ptr dg) { - return std::vector >(begin(dg->getGraphDatabase()), end(dg->getGraphDatabase())); -} - DG::HyperEdge(DG::*findEdgeVertices)(const std::vector&, const std::vector&) const = &DG::findEdge; DG::HyperEdge(DG::*findEdgeGraphs)(const std::vector >&, const std::vector >&) const = &DG::findEdge; @@ -100,7 +96,7 @@ void DG_doExport() { // rst: All graphs known to the derivation graph. // rst: // rst: :type: list of :class:`Graph` - .add_property("_graphDatabase", &getGraphDatabase) + .add_property("_graphDatabase", py::make_function(&DG::getGraphDatabase, py::return_value_policy())) // rst: .. py:attribute:: products // rst: // rst: The subset of the vertex graphs which were discovered by the calculation. diff --git a/src/mod/Py/dg/GraphInterface.cpp b/libs/pymod/src/mod/py/dg/GraphInterface.cpp similarity index 98% rename from src/mod/Py/dg/GraphInterface.cpp rename to libs/pymod/src/mod/py/dg/GraphInterface.cpp index 1652740..45e82bb 100644 --- a/src/mod/Py/dg/GraphInterface.cpp +++ b/libs/pymod/src/mod/py/dg/GraphInterface.cpp @@ -1,9 +1,9 @@ -#include +#include -#include -#include -#include -#include +#include +#include +#include +#include #include diff --git a/src/mod/Py/dg/Printer.cpp b/libs/pymod/src/mod/py/dg/Printer.cpp similarity index 98% rename from src/mod/Py/dg/Printer.cpp rename to libs/pymod/src/mod/py/dg/Printer.cpp index 64c05d5..8291313 100644 --- a/src/mod/Py/dg/Printer.cpp +++ b/libs/pymod/src/mod/py/dg/Printer.cpp @@ -1,10 +1,10 @@ -#include +#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include namespace mod { namespace dg { diff --git a/src/mod/Py/dg/Strategies.cpp b/libs/pymod/src/mod/py/dg/Strategies.cpp similarity index 99% rename from src/mod/Py/dg/Strategies.cpp rename to libs/pymod/src/mod/py/dg/Strategies.cpp index 5e01e29..33b1844 100644 --- a/src/mod/Py/dg/Strategies.cpp +++ b/libs/pymod/src/mod/py/dg/Strategies.cpp @@ -1,7 +1,7 @@ -#include +#include -#include -#include +#include +#include // rst: This section describes two interfaces for the derivation graph strategies; the basic API and an embedded language which is built on the basic API. // rst: Usually the embedded strategy language is easiest and sufficient for constructing strategies. diff --git a/src/mod/Py/graph/Automorphism.cpp b/libs/pymod/src/mod/py/graph/Automorphism.cpp similarity index 93% rename from src/mod/Py/graph/Automorphism.cpp rename to libs/pymod/src/mod/py/graph/Automorphism.cpp index 6709377..fb62c91 100644 --- a/src/mod/Py/graph/Automorphism.cpp +++ b/libs/pymod/src/mod/py/graph/Automorphism.cpp @@ -1,7 +1,7 @@ -#include +#include -#include -#include +#include +#include namespace mod { namespace graph { diff --git a/libs/pymod/src/mod/py/graph/Graph.cpp b/libs/pymod/src/mod/py/graph/Graph.cpp new file mode 100644 index 0000000..dead6be --- /dev/null +++ b/libs/pymod/src/mod/py/graph/Graph.cpp @@ -0,0 +1,324 @@ +#include + +#include +#include +#include +#include + +#include + +namespace mod { +namespace graph { +namespace Py { + +void Graph_doExport() { + std::pair(Graph::* + printWithoutOptions)() const = &Graph::print; + std::pair(Graph::* + printWithOptions)(const graph::Printer&, const graph::Printer&) const = &Graph::print; + + // rst: .. py:class:: Graph + // rst: + // rst: This class models an undirected graph with labels on vertices and edges, + // rst: without loops and without parallel edges. + // rst: Certain labels are regarded as models of chemical atoms and bonds. + // rst: See :ref:`mol-enc` for more information on this. + // rst: + py::class_, boost::noncopyable>("Graph", py::no_init) + // rst: .. py:attribute:: id + // rst: + // rst: (Read-only) A unique instance id among :class:`Graph` objects. + // rst: + // rst: :type: int + .add_property("id", &Graph::getId) + .def(str(py::self)) + //------------------------------------------------------------------ + // rst: .. py:attribute:: numVertices + // rst: + // rst: (Read-only) The number of vertices in the graph. + // rst: + // rst: :type: int + .add_property("numVertices", &Graph::numVertices) + // rst: .. py:attribute:: vertices + // rst: + // rst: (Read-only) An iterable of all vertices in the graph. + // rst: + // rst: :type: :py:class:`GraphVertexRange` + .add_property("vertices", &Graph::vertices) + // rst: .. py:attribute:: numEdges + // rst: + // rst: (Read-only) The number of edges in the graph. + // rst: + // rst: :type: int + .add_property("numEdges", &Graph::numEdges) + // rst: .. py:attribute:: edges + // rst: + // rst: (Read-only) An iterable of all edges in the graph. + // rst: + // rst: :type: :py:class:`GraphEdgeRange` + .add_property("edges", &Graph::edges) + //------------------------------------------------------------------ + // rst: .. py:function:: aut(labelSettings=LabelSettings(LabelType.String, LabelRelation.Isomorphism)) + // rst: + // rst: :param labelSettings: the label settings to use. + // rst: :type labelSettings: :py:class:`LabelSettings` + // rst: :returns: an object representing the automorphism group of the graph, with the given label settings. + // rst: :rtype: :py:class:`GraphAutGroup` + .def("aut", &Graph::aut) + //------------------------------------------------------------------ + // rst: .. py:method:: print() + // rst: print(first, second=None) + // rst: + // rst: Print the graph, using either the default options or the options in ``first`` and ``second``. + // rst: If ``first`` and ``second`` are the same, only one depiction will be made. + // rst: + // rst: :param first: the printing options used for the first depiction. + // rst: :type first: :class:`GraphPrinter` + // rst: :param second: the printing options used for the second depiction. + // rst: If it is ``None`` then it is set to ``first``. + // rst: :type second: :class:`GraphPrinter` + // rst: :returns: the names for the PDF-files that will be compiled in post-processing. + // rst: If ``first`` and ``second`` are the same, the two file prefixes are equal. + // rst: :rtype: (string, string) + .def("print", printWithoutOptions) + .def("print", printWithOptions) + // rst: .. py:method:: printTermState + // rst: + // rst: Print the term state for the graph. + .def("printTermState", &Graph::printTermState) + // rst: .. py:method:: getGMLString(withCoords=False) + // rst: + // rst: :returns: the :ref:`GML ` representation of the graph, + // rst: optionally with generated 2D coordinates. + // rst: :rtype: string + // rst: :raises: :py:class:`LogicError` when coordinates are requested, but + // rst: none can be generated. + .def("getGMLString", &Graph::getGMLString) + // rst: .. py:method:: printGML(withCoords=False) + // rst: + // rst: Print the :ref:`GML ` representation of the graph, + // rst: optionally with generated 2D coordinates. + // rst: + // rst: :returns: the filename of the printed GML file. + // rst: :rtype: string + // rst: :raises: :py:class:`LogicError` when coordinates are requested, but + // rst: none can be generated. + .def("printGML", &Graph::printGML) + // rst: .. py:attribute:: name + // rst: + // rst: The name of the graph. The default name includes the unique instance id. + // rst: + // rst: :type: string + .add_property("name", py::make_function(&Graph::getName, py::return_value_policy()), + &Graph::setName) + // rst: .. py:attribute:: smiles + // rst: + // rst: (Read-only) If the graph models a molecule, this is the canonical :ref:`SMILES string ` for it. + // rst: + // rst: :type: string + // rst: :raises: :py:class:`LogicError` if the graph is not a molecule. + .add_property("smiles", + py::make_function(&Graph::getSmiles, py::return_value_policy())) + // rst: .. py:attribute:: smilesWithIds + // rst: + // rst: (Read-only) If the graph models a molecule, this is the canonical :ref:`SMILES string ` for it, + // rst: that includes the internal vertex id as a class label on each atom. + // rst: + // rst: :type: string + // rst: :raises: :py:class:`LogicError` if the graph is not a molecule. + .add_property("smilesWithIds", + py::make_function(&Graph::getSmilesWithIds, py::return_value_policy())) + // rst: .. py:attribute:: graphDFS + // rst: + // rst: (Read-only) This is a :ref:`GraphDFS ` of the graph. + // rst: + // rst: :type: string + .add_property("graphDFS", + py::make_function(&Graph::getGraphDFS, py::return_value_policy())) + // rst: .. py:attribute:: graphDFSWithIds + // rst: + // rst: (Read-only) This is a :ref:`GraphDFS ` of the graph, where each vertices have an explicit id, + // rst: corresponding to its internal vertex id. + // rst: + // rst: :type: string + .add_property("graphDFSWithIds", py::make_function(&Graph::getGraphDFSWithIds, + py::return_value_policy())) + // rst: .. py:attribute:: linearEncoding + // rst: + // rst: (Read-only) If the graph models a molecule this is the :ref:`SMILES string ` string, otherwise it is the :ref:`GraphDFS ` string. + // rst: + // rst: :type: string + .add_property("linearEncoding", py::make_function(&Graph::getLinearEncoding, + py::return_value_policy())) + // rst: .. py:attribute:: isMolecule + // rst: + // rst: (Read-only) Whether or not the graph models a molecule. See :ref:`mol-enc`. + // rst: + // rst: :type: bool + .add_property("isMolecule", &Graph::getIsMolecule) + // rst: .. py:attribute:: energy + // rst: + // rst: (Read-only) If the graph models a molecule, this is some energy value. + // rst: The energy is calculated using Open Babel, unless already calculated or cached by :py:meth:`Graph.cacheEnergy`. + // rst: + // rst: :type: double + .add_property("energy", &Graph::getEnergy) + // rst: .. py:method:: cacheEnergy(e) + // rst: + // rst: If the graph models a molecule, sets the energy to a given value. + // rst: + // rst: :param double e: the value for the energy to be set. + .def("cacheEnergy", &Graph::cacheEnergy) + // rst: .. py:attribute:: exactMass + // rst: + // rst: (Read-only) The exact mass of the graph, if it is a molecule. + // rst: It is the sum of the exact mass of each atom, with the mass of electrons subtracted corresponding to the integer charge. + // rst: That is, the mass is :math:`\sum_a (mass(a) - mass(e)\cdot charge(a))`. + // rst: If an atom has no specified isotope, then the most abundant is used. + // rst: + // rst: :type: double + // rst: :raises: :class:`LogicError` if it is not a molecule, including if some isotope has not been tabulated. + .add_property("exactMass", &Graph::getExactMass) + // rst: .. py:method:: vLabelCount(label) + // rst: + // rst: :param string label: some label for querying. + // rst: :returns: the number of vertices in the graph with the given label. + // rst: :rtype: unsigned int + .def("vLabelCount", &Graph::vLabelCount) + // rst: .. py:method:: eLabelCount(label) + // rst: + // rst: :param string label: some label for querying. + // rst: :returns: the number of edges in the graph with the given label. + // rst: :rtype: unsigned int + .def("eLabelCount", &Graph::eLabelCount) + // rst: .. py:method:: isomorphism(other, maxNumMatches=1, labelSettings=LabelSettings(LabelType.String, LabelRelation.Isomorphism)) + // rst: + // rst: :param other: the codomain :class:`Graph` for finding morphisms. + // rst: :type other: :class:`Graph` + // rst: :param maxNumMatches: the maximum number of isomorphisms to search for. + // rst: :type maxNumMatches: :cpp:any:`std::size_t` + // rst: :param labelSettings: the label settings to use during the search. + // rst: :type labeSettings: :py:class:`LabelSettings` + // rst: :returns: the number of isomorphisms from this graph to ``other``, but at most ``maxNumMatches``. + // rst: :rtype: :cpp:any:`std::size_t` + .def("isomorphism", &Graph::isomorphism) + // rst: .. py:method:: monomorphism(other, maxNumMatches=1, labelSettings=LabelSettings(LabelType.String, LabelRelation.Isomorphism)) + // rst: + // rst: :param other: the codomain :class:`Graph` for finding morphisms. + // rst: :type host: :class:`Graph` + // rst: :param maxNumMatches: the maximum number of monomorphisms to search for. + // rst: :type maxNumMatches: :cpp:any:`std::size_t` + // rst: :param labelSettings: the label settings to use during the search. + // rst: :type labeSettings: :py:class:`LabelSettings` + // rst: :returns: the number of monomorphisms from this graph to ``other``, though at most ``maxNumMatches``. + // rst: :rtype: :cpp:any:`std::size_t` + .def("monomorphism", &Graph::monomorphism) + // rst: .. py:method:: makePermutation() + // rst: + // rst: :returns: a graph isomorphic to this, but with the vertex indices randomly permuted. + // rst: :rtype: :py:class:`Graph` + .def("makePermutation", &Graph::makePermutation) + // rst: .. py:attribute:: image + // rst: + // rst: (Write-only) A custom depiction for the graph. The depiction file used will be the string + // rst: returned by the given function, with ``.pdf`` appended. + // rst: The function will only be called once. + // rst: + // rst: :type: string() + .add_property("image", &mod::Py::noGet, &Graph::setImage) + // rst: .. py:attribute:: imageCommad + // rst: + // rst: A command to be run in post-processing if a custom depiction is set. + // rst: The command is only run once. + // rst: + // rst: :type: string + .add_property("imageCommand", &Graph::getImageCommand, &Graph::setImageCommand) + // rst: .. py:method:: getVertexFromExternalId(id) + // rst: + // rst: If the graph was not loaded from an external data format, then this function + // rst: always return a null descriptor. + // rst: If the graph was loaded from a SMILES string, but *any* class label was not unique, + // rst: then the function always return a null descriptor. + // rst: + // rst: .. note:: In general there is no correlation between external and internal ids. + // rst: + // rst: :param id: the external id to find the vertex descriptor for. + // rst: :type id: int + // rst: :returns: the vertex descriptor for the given external id. + // rst: The descriptor is null if the external id was not used. + // rst: :rtype: :py:class:`GraphVertex` + .def("getVertexFromExternalId", &Graph::getVertexFromExternalId) + // rst: .. py:attribute:: minExternalId + // rst: maxExternalId + // rst: + // rst: If the graph was not loaded from an external data format, then these attributes + // rst: are always return 0. Otherwise, they are the minimum/maximum external id from which + // rst: non-null vertices can be obtained from :py:meth:`getVertexFromExternalId`. + // rst: If no such minimum and maximum exists, then they are 0. + // rst: + // rst: :type: int + .add_property("minExternalId", &Graph::getMinExternalId) + .add_property("maxExternalId", &Graph::getMaxExternalId) + // rst: .. py:method: instantiateStereo() + // rst: + // rst: Make sure that stereo data is instantiated. + // rst: + // rst: :raises: :py:class:`StereoDeductionError` if the data was not instantiated and deduction failed. + .def("instantiateStereo", &Graph::instantiateStereo); + + // rst: .. py:data:: inputGraphs + // rst: + // rst: A list of graphs to which explicitly loaded graphs as default are appended. + // rst: + // rst: :type: list of :class:`Graph` + // rst: + + // rst: .. py:method:: graphGMLString(s, name=None, add=True) + // rst: + // rst: Load a graph in :ref:`GML ` format from a given string. + // rst: + // rst: :param string s: the string with the :ref:`GML ` data to load from. + // rst: :param string name: the name of the graph. If none is given the default name is used. + // rst: :param bool add: whether to append the graph to :data:`inputGraphs` or not. + // rst: :returns: the loaded graph. + // rst: :rtype: :class:`Graph` + // rst: :raises: :class:`InputError` on bad input. + py::def("graphGMLString", &Graph::graphGMLString); + // rst: .. py:method:: graphGML(f, name=None, add=True) + // rst: + // rst: Load a graph in :ref:`GML ` format from a given file. + // rst: + // rst: :param string f: name of the :ref:`GML ` file to be loaded. + // rst: :param string name: the name of the graph. If none is given the default name is used. + // rst: :param bool add: whether to append the graph to :data:`inputGraphs` or not. + // rst: :returns: the loaded graph. + // rst: :rtype: :class:`Graph` + // rst: :raises: :class:`InputError` on bad input. + py::def("graphGML", &Graph::graphGML); + // rst: .. py:method:: graphDFS(s, name=None, add=True) + // rst: + // rst: Load a graph from a :ref:`GraphDFS ` string. + // rst: + // rst: :param string s: the :ref:`GraphDFS ` string to parse. + // rst: :param string name: the name of the graph. If none is given the default name is used. + // rst: :param bool add: whether to append the graph to :data:`inputGraphs` or not. + // rst: :returns: the loaded graph. + // rst: :rtype: :class:`Graph` + // rst: :raises: :class:`InputError` on bad input. + py::def("graphDFS", &Graph::graphDFS); + // rst: .. py:method:: smiles(s, name=None, add=True) + // rst: + // rst: Load a molecule from a :ref:`SMILES ` string. + // rst: + // rst: :param string s: the :ref:`SMILES ` string to parse. + // rst: :param string name: the name of the graph. If none is given the default name is used. + // rst: :param bool add: whether to append the graph to :data:`inputGraphs` or not. + // rst: :returns: the loaded molecule. + // rst: :rtype: :class:`Graph` + // rst: :raises: :class:`InputError` on bad input. + py::def("smiles", &Graph::smiles); +} + +} // namespace Py +} // namespace graph +} // namespace mod diff --git a/src/mod/Py/graph/GraphInterface.cpp b/libs/pymod/src/mod/py/graph/GraphInterface.cpp similarity index 98% rename from src/mod/Py/graph/GraphInterface.cpp rename to libs/pymod/src/mod/py/graph/GraphInterface.cpp index 9cf589e..414926d 100644 --- a/src/mod/Py/graph/GraphInterface.cpp +++ b/libs/pymod/src/mod/py/graph/GraphInterface.cpp @@ -1,8 +1,8 @@ -#include +#include -#include -#include -#include +#include +#include +#include namespace mod { namespace graph { diff --git a/src/mod/Py/graph/Printer.cpp b/libs/pymod/src/mod/py/graph/Printer.cpp similarity index 98% rename from src/mod/Py/graph/Printer.cpp rename to libs/pymod/src/mod/py/graph/Printer.cpp index 57995da..8cb8910 100644 --- a/src/mod/Py/graph/Printer.cpp +++ b/libs/pymod/src/mod/py/graph/Printer.cpp @@ -1,6 +1,6 @@ -#include +#include -#include +#include #include diff --git a/src/mod/Py/rule/Composition.cpp b/libs/pymod/src/mod/py/rule/Composition.cpp similarity index 98% rename from src/mod/Py/rule/Composition.cpp rename to libs/pymod/src/mod/py/rule/Composition.cpp index ea374b9..05dbcb3 100644 --- a/src/mod/Py/rule/Composition.cpp +++ b/libs/pymod/src/mod/py/rule/Composition.cpp @@ -1,7 +1,7 @@ -#include +#include -#include -#include +#include +#include #include diff --git a/src/mod/Py/rule/GraphInterface.cpp b/libs/pymod/src/mod/py/rule/GraphInterface.cpp similarity index 99% rename from src/mod/Py/rule/GraphInterface.cpp rename to libs/pymod/src/mod/py/rule/GraphInterface.cpp index c92f184..e544380 100644 --- a/src/mod/Py/rule/GraphInterface.cpp +++ b/libs/pymod/src/mod/py/rule/GraphInterface.cpp @@ -1,9 +1,9 @@ -#include +#include -#include -#include -#include -#include +#include +#include +#include +#include namespace mod { namespace rule { diff --git a/src/mod/Py/rule/Rule.cpp b/libs/pymod/src/mod/py/rule/Rule.cpp similarity index 98% rename from src/mod/Py/rule/Rule.cpp rename to libs/pymod/src/mod/py/rule/Rule.cpp index b9ebe11..ac4f12e 100644 --- a/src/mod/Py/rule/Rule.cpp +++ b/libs/pymod/src/mod/py/rule/Rule.cpp @@ -1,8 +1,8 @@ -#include +#include -#include -#include -#include +#include +#include +#include namespace mod { namespace rule { diff --git a/m4/ax_boost_base.m4 b/m4/ax_boost_base.m4 deleted file mode 100644 index 46806ee..0000000 --- a/m4/ax_boost_base.m4 +++ /dev/null @@ -1,258 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_boost_base.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# DESCRIPTION -# -# Test for the Boost C++ libraries of a particular version (or newer) -# -# If no path to the installed boost library is given the macro searchs -# under /usr, /usr/local, /opt and /opt/local and evaluates the -# $BOOST_ROOT environment variable. Further documentation is available at -# . -# -# This macro calls: -# -# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS) -# -# And sets: -# -# HAVE_BOOST -# -# LICENSE -# -# Copyright (c) 2008 Thomas Porschberg -# Copyright (c) 2009 Peter Adolphs -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 20 - -AC_DEFUN([AX_BOOST_BASE], -[ -AC_ARG_WITH([boost], - [AS_HELP_STRING([--with-boost@<:@=ARG@:>@], - [use Boost library from a standard location (ARG=yes), - from the specified location (ARG=), - or disable it (ARG=no) - @<:@ARG=yes@:>@ ])], - [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ac_boost_path="" - else - want_boost="yes" - ac_boost_path="$withval" - fi - ], - [want_boost="yes"]) - - -AC_ARG_WITH([boost-libdir], - AS_HELP_STRING([--with-boost-libdir=LIB_DIR], - [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]), - [ - if test -d "$withval" - then - ac_boost_lib_path="$withval" - else - AC_MSG_ERROR(--with-boost-libdir expected directory name) - fi - ], - [ac_boost_lib_path=""] -) - -if test "x$want_boost" = "xyes"; then - boost_lib_version_req=ifelse([$1], ,1.20.0,$1) - boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` - boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` - boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` - boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - if test "x$boost_lib_version_req_sub_minor" = "x" ; then - boost_lib_version_req_sub_minor="0" - fi - WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` - AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) - succeeded=no - - dnl On 64-bit systems check for system libraries in both lib64 and lib. - dnl The former is specified by FHS, but e.g. Debian does not adhere to - dnl this (as it rises problems for generic multi-arch support). - dnl The last entry in the list is chosen by default when no libraries - dnl are found, e.g. when only header-only libraries are installed! - libsubdirs="lib" - ax_arch=`uname -m` - if test $ax_arch = x86_64 -o $ax_arch = ppc64 -o $ax_arch = s390x -o $ax_arch = sparc64; then - libsubdirs="lib64 lib lib64" - fi - - dnl first we check the system location for boost libraries - dnl this location ist chosen if boost libraries are installed with the --layout=system option - dnl or if you install boost with RPM - if test "$ac_boost_path" != ""; then - BOOST_CPPFLAGS="-I$ac_boost_path/include" - for ac_boost_path_tmp in $libsubdirs; do - if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then - BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" - break - fi - done - elif test "$cross_compiling" != yes; then - for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do - if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then - for libsubdir in $libsubdirs ; do - if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi - done - BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" - BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" - break; - fi - done - fi - - dnl overwrite ld flags if we have required special directory with - dnl --with-boost-libdir parameter - if test "$ac_boost_lib_path" != ""; then - BOOST_LDFLAGS="-L$ac_boost_lib_path" - fi - - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_REQUIRE([AC_PROG_CXX]) - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - - - - dnl if we found no boost with system layout we search for boost libraries - dnl built and installed without the --layout=system option or for a staged(not installed) version - if test "x$succeeded" != "xyes"; then - _version=0 - if test "$ac_boost_path" != ""; then - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then - _version=$_version_tmp - fi - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" - done - fi - else - if test "$cross_compiling" != yes; then - for ac_boost_path in /usr /usr/local /opt /opt/local ; do - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then - _version=$_version_tmp - best_path=$ac_boost_path - fi - done - fi - done - - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" - if test "$ac_boost_lib_path" = ""; then - for libsubdir in $libsubdirs ; do - if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi - done - BOOST_LDFLAGS="-L$best_path/$libsubdir" - fi - fi - - if test "x$BOOST_ROOT" != "x"; then - for libsubdir in $libsubdirs ; do - if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi - done - if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then - version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` - stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` - stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` - V_CHECK=`expr $stage_version_shorten \>\= $_version` - if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then - AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) - BOOST_CPPFLAGS="-I$BOOST_ROOT" - BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" - fi - fi - fi - fi - - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - fi - - if test "$succeeded" != "yes" ; then - if test "$_version" = "0" ; then - AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) - else - AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) - fi - # execute ACTION-IF-NOT-FOUND (if present): - ifelse([$3], , :, [$3]) - else - AC_SUBST(BOOST_CPPFLAGS) - AC_SUBST(BOOST_LDFLAGS) - AC_DEFINE(HAVE_BOOST,,[Define if the Boost library is available.]) - # execute ACTION-IF-FOUND (if present): - ifelse([$2], , :, [$2]) - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" -fi - -]) diff --git a/m4/ax_prefix_config_h.m4 b/m4/ax_prefix_config_h.m4 deleted file mode 100644 index 43a3906..0000000 --- a/m4/ax_prefix_config_h.m4 +++ /dev/null @@ -1,209 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_prefix_config_h.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PREFIX_CONFIG_H [(OUTPUT-HEADER [,PREFIX [,ORIG-HEADER]])] -# -# DESCRIPTION -# -# This is a new variant from ac_prefix_config_ this one will use a -# lowercase-prefix if the config-define was starting with a -# lowercase-char, e.g. "#define const", "#define restrict", or "#define -# off_t", (and this one can live in another directory, e.g. -# testpkg/config.h therefore I decided to move the output-header to be the -# first arg) -# -# takes the usual config.h generated header file; looks for each of the -# generated "#define SOMEDEF" lines, and prefixes the defined name (ie. -# makes it "#define PREFIX_SOMEDEF". The result is written to the output -# config.header file. The PREFIX is converted to uppercase for the -# conversions. -# -# Defaults: -# -# OUTPUT-HEADER = $PACKAGE-config.h -# PREFIX = $PACKAGE -# ORIG-HEADER, from AM_CONFIG_HEADER(config.h) -# -# Your configure.ac script should contain both macros in this order, and -# unlike the earlier variations of this prefix-macro it is okay to place -# the AX_PREFIX_CONFIG_H call before the AC_OUTPUT invokation. -# -# Example: -# -# AC_INIT(config.h.in) # config.h.in as created by "autoheader" -# AM_INIT_AUTOMAKE(testpkg, 0.1.1) # makes #undef VERSION and PACKAGE -# AM_CONFIG_HEADER(config.h) # prep config.h from config.h.in -# AX_PREFIX_CONFIG_H(mylib/_config.h) # prep mylib/_config.h from it.. -# AC_MEMORY_H # makes "#undef NEED_MEMORY_H" -# AC_C_CONST_H # makes "#undef const" -# AC_OUTPUT(Makefile) # creates the "config.h" now -# # and also mylib/_config.h -# -# if the argument to AX_PREFIX_CONFIG_H would have been omitted then the -# default outputfile would have been called simply "testpkg-config.h", but -# even under the name "mylib/_config.h" it contains prefix-defines like -# -# #ifndef TESTPKG_VERSION -# #define TESTPKG_VERSION "0.1.1" -# #endif -# #ifndef TESTPKG_NEED_MEMORY_H -# #define TESTPKG_NEED_MEMORY_H 1 -# #endif -# #ifndef _testpkg_const -# #define _testpkg_const _const -# #endif -# -# and this "mylib/_config.h" can be installed along with other -# header-files, which is most convenient when creating a shared library -# (that has some headers) where some functionality is dependent on the -# OS-features detected at compile-time. No need to invent some -# "mylib-confdefs.h.in" manually. :-) -# -# Note that some AC_DEFINEs that end up in the config.h file are actually -# self-referential - e.g. AC_C_INLINE, AC_C_CONST, and the AC_TYPE_OFF_T -# say that they "will define inline|const|off_t if the system does not do -# it by itself". You might want to clean up about these - consider an -# extra mylib/conf.h that reads something like: -# -# #include -# #ifndef _testpkg_const -# #define _testpkg_const const -# #endif -# -# and then start using _testpkg_const in the header files. That is also a -# good thing to differentiate whether some library-user has starting to -# take up with a different compiler, so perhaps it could read something -# like this: -# -# #ifdef _MSC_VER -# #include -# #else -# #include -# #endif -# #ifndef _testpkg_const -# #define _testpkg_const const -# #endif -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2008 Marten Svantesson -# Copyright (c) 2008 Gerald Point -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 11 - -AC_DEFUN([AX_PREFIX_CONFIG_H],[dnl -AC_PREREQ([2.62]) -AC_BEFORE([AC_CONFIG_HEADERS],[$0])dnl -AC_CONFIG_COMMANDS([ifelse($1,,$PACKAGE-config.h,$1)],[dnl -AS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl -AS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl -AS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl -AS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl -AS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl -AS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl -m4_pushdef([_script],[conftest.prefix])dnl -m4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl -_OUT=`echo ifelse($1, , $PACKAGE-config.h, $1)` -_DEF=`echo _$_OUT | sed -e "y:m4_cr_letters:m4_cr_LETTERS[]:" -e "s/@<:@^m4_cr_Letters@:>@/_/g"` -_PKG=`echo ifelse($2, , $PACKAGE, $2)` -_LOW=`echo _$_PKG | sed -e "y:m4_cr_LETTERS-:m4_cr_letters[]_:"` -_UPP=`echo $_PKG | sed -e "y:m4_cr_letters-:m4_cr_LETTERS[]_:" -e "/^@<:@m4_cr_digits@:>@/s/^/_/"` -_INP=`echo "ifelse($3,,,$3)" | sed -e 's/ *//'` -if test ".$_INP" = "."; then - for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue - case "$ac_file" in - *.h) _INP=$ac_file ;; - *) - esac - test ".$_INP" != "." && break - done -fi -if test ".$_INP" = "."; then - case "$_OUT" in - */*) _INP=`basename "$_OUT"` - ;; - *-*) _INP=`echo "$_OUT" | sed -e "s/@<:@_symbol@:>@*-//"` - ;; - *) _INP=config.h - ;; - esac -fi -if test -z "$_PKG" ; then - AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H]) -else - if test ! -f "$_INP" ; then if test -f "$srcdir/$_INP" ; then - _INP="$srcdir/$_INP" - fi fi - AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines) - if test -f $_INP ; then - AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_LETTERS[]_@:>@\\)/@%:@undef $_UPP""_\\1/"]) > _script - AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_letters@:>@\\)/@%:@undef $_LOW""_\\1/"]) >> _script - AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_UPP""_\\1\\"]) >> _script - AS_ECHO(["@%:@def[]ine $_UPP""_\\1\\2\\"]) >> _script - AS_ECHO(["@%:@endif/"]) >> _script - AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_LOW""_\\1\\"]) >> _script - AS_ECHO(["@%:@define $_LOW""_\\1\\2\\"]) >> _script - AS_ECHO(["@%:@endif/"]) >> _script - # now executing _script on _DEF input to create _OUT output file - echo "@%:@ifndef $_DEF" >$tmp/pconfig.h - echo "@%:@def[]ine $_DEF 1" >>$tmp/pconfig.h - echo ' ' >>$tmp/pconfig.h - echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h - - sed -f _script $_INP >>$tmp/pconfig.h - echo ' ' >>$tmp/pconfig.h - echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h - echo "@%:@endif" >>$tmp/pconfig.h - if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then - AC_MSG_NOTICE([$_OUT is unchanged]) - else - ac_dir=`AS_DIRNAME(["$_OUT"])` - AS_MKDIR_P(["$ac_dir"]) - rm -f "$_OUT" - mv $tmp/pconfig.h "$_OUT" - fi - cp _script _configs.sed - else - AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT]) - fi - rm -f conftest.* -fi -m4_popdef([_symbol])dnl -m4_popdef([_script])dnl -AS_VAR_POPDEF([_INP])dnl -AS_VAR_POPDEF([_UPP])dnl -AS_VAR_POPDEF([_LOW])dnl -AS_VAR_POPDEF([_PKG])dnl -AS_VAR_POPDEF([_DEF])dnl -AS_VAR_POPDEF([_OUT])dnl -],[PACKAGE="$PACKAGE"])]) diff --git a/src/bin/main.cpp b/src/bin/main.cpp deleted file mode 100644 index d4f82b3..0000000 --- a/src/bin/main.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -#include -#include - -int main(int argc, char **argv) { - std::stringstream baseData; - baseData << mod::VM::VM::getStdPrelude(); - baseData << mod::VM::VM::argsToCode(argc, argv); - if(argc > 1) { - for(int i = 1; i < argc; i++) - std::cout << "Argument " << i << " ('" << argv[i] << "') can not be recognized." << std::endl; - return 1; - } - - mod::VM::VM vm; - bool res = vm.execute(baseData.str()); - if(!res) return 1; - return 0; -} diff --git a/src/bin/mod_fetchKEGGrewrite b/src/bin/mod_fetchKEGGrewrite deleted file mode 100755 index 61b1385..0000000 --- a/src/bin/mod_fetchKEGGrewrite +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -function fetch { - temp=$(mktemp) - keggid=$1 - server="http://rna.tbi.univie.ac.at/cgi-bin/mapreaction.cgi?" - server="${server}valence=true&keggid=" - wget -O $temp $server$keggid 2> /dev/null - res=$? - - if [ $res -ne 0 ]; then - echo "Could not fetch: $keggid" - echo "Error code: $res" - echo "URL: $server$keggid" - rm -f $temp - return 1 - fi - - line=$(grep -n "
rule \[" $temp | head -n 1 | sed "s/:.*$//")
-	tail -n +$line $temp | sed "s/<[^<]*>//g" | head -n -4 > $keggid.gml
-	echo -e "Done:\t$keggid"
-	rm -f $temp
-}
-
-
-for arg in $@; do
-	fetch $arg
-done
diff --git a/src/bin/mod_genSummaryMakefile b/src/bin/mod_genSummaryMakefile
deleted file mode 100755
index 848cd47..0000000
--- a/src/bin/mod_genSummaryMakefile
+++ /dev/null
@@ -1,187 +0,0 @@
-#------------------------------------------------------------------
-# Meta stuff
-#------------------------------------------------------------------
- 
-function printStatus {
-	echo "	echo -n '$1 '" >> $makefileImpl
-}
-
-# target to add
-function addTarget {
-	echo -n " $1" >> $makefileAllTarget
-}
-
-#------------------------------------------------------------------
-# OpenBabel related post processing
-#------------------------------------------------------------------
-
-# svgFile
-function obabelPostProcess {
-	# hax to remove the artificial bagground obabel made
-	echo "	sed -i 's///' $1" >> $makefileImpl
-}
-
-# svgFile
-function obabelRulePostProcess {
-	# remove radicals and implicit hydrogens
-	echo "	sed -i \\" >> $makefileImpl
-	echo "		-e \"s/.*>\.<\/text>//\" \\" >> $makefileImpl
-	echo "		-e \"s/.*>\.\.<\/text>//\" \\" >> $makefileImpl
-	echo "		-e \"s/>\(..*\)H<\/text>/>\1<\/text>/\" \\" >> $makefileImpl
-	echo "		-e \"s/>H\([A-Z].*\)<\/text>/ dx=\\\"16\\\">\1<\/text>/\" \\" >> $makefileImpl
-	echo "		$1" >> $makefileImpl
-	# the magic 16 is fontSize
-}
-
-# svgFile mapFile
-function graphDFSSvgMapping {
-	local outFile=$1
-	local map=$2
-	echo "	cat $map | while read relation; do \\" >> $makefileImpl
-	echo "		key=\$\$(echo \$\$relation | sed \"s/^\([A-Z][a-z]*\).*/\1/\"); \\" >> $makefileImpl
-	echo "		value=\$\$(echo \$\$relation | sed \"s/^[A-Z][a-z]*.\(.*\)/\1/\"); \\" >> $makefileImpl
-	echo "		keyLen=\$\$(echo \$\$key | wc -m); \\" >> $makefileImpl
-	echo "		let keyLen=keyLen-1; \\" >> $makefileImpl		# wc -m counts the eoi char too
-	echo "		offset=\$\$(echo \"16*0.75*\$\$keyLen/2\" | bc -q); \\" >> $makefileImpl # fontSize * 0.75 * numChars / 2
-	# TODO: should probably do some escaping of $value
-	echo "		sed -i \\" >> $makefileImpl
-	echo "			-e \"s/ fill=\\\"rgb([0-9]*,[0-9]*,[0-9]*)\\\"\(.*>\$\$key<\/text>\)/ fill=\\\"black\\\"\1/\" \\" >> $makefileImpl
-	echo "			-e \"s/ stroke=\\\"rgb([0-9]*,[0-9]*,[0-9]*)\\\"\(.*>\$\$key<\/text>\)/ stroke=\\\"black\\\"\1/\" \\" >> $makefileImpl
-	echo "			-e \"s/>\$\$key<\/text>/ dx=\\\"\$\$offset\\\" style=\\\"text-anchor: middle;\\\">\$\$value<\/text>/\" \\" >> $makefileImpl
-	echo "			$outFile; \\" >> $makefileImpl
-	echo "	done;" >> $makefileImpl
-}
-
-#------------------------------------------------------------------
-# Smiles and GraphDFS stuff
-#------------------------------------------------------------------
-
-# fileNoExt
-function phonyGraphDFSToSvg {
-	local dotFile=$1.svg
-	local outFile=$1.graphDFS.svg
-	echo "$outFile: $dotFile" >> $makefileImpl
-	echo "	cp $dotFile $outFile" >> $makefileImpl
-}
-
-# graphDFS fileNoExt fileGraphDFSmap
-function graphDFSToSvg {
-	local graphDFS=$1
-	local outFile=$2.graphDFS.svg
-	local log=$2.graphDFS.log
-	local map=$3
-	echo "$outFile $log: $2.svg $map" >> $makefileImpl
-	echo "	obabel -:\"$graphDFS\" -o svg -O $outFile.temp &> $log" >> $makefileImpl
-	echo "	grep \"1 molecule converted\" $log &> /dev/null || \\" >> $makefileImpl
-	echo "		cp $2.svg $outFile.temp" >> $makefileImpl
-	obabelPostProcess $outFile.temp
-	graphDFSSvgMapping $outFile.temp $map
-	echo "	mv $outFile.temp $outFile" >> $makefileImpl
-}
-
-# fileNoExt fileGraphDFSmap
-function graphDFSRuleSide {
-	local f=$1.graphDFS.svg.orig
-	local out=$1.graphDFS.svg
-	local map=$2
-	echo "$out: $f" >> $makefileImpl
-	obabelPostProcess $f
-	obabelRulePostProcess $f
-	graphDFSSvgMapping $f $map
-	echo "	cp $f $out" >> $makefileImpl
-}
-
-# smilesString fileNoExt
-function smilesToSvg {
-	local smiles=$1
-	local file=$2.smiles.svg
-	local log=$2.smiles.log
-	echo "$file $log:" >> $makefileImpl
-	echo "	obabel -:\"$smiles\" -o svg -O $file.temp &> $log" >> $makefileImpl
-	echo "	grep \"1 molecule converted\" $log &> /dev/null || (cat $log && false)" >> $makefileImpl
-	obabelPostProcess $file.temp $1
-	echo "	mv $file.temp $file" >> $makefileImpl
-}
-
-# fileNoExt
-function phonySmilesToSvg {
-	local inFile=$1.graphDFS.svg
-	local outFile=$1.smiles.svg
-	echo "$outFile: $inFile" >> $makefileImpl
-	echo "	cp $inFile $outFile" >> $makefileImpl
-}
-
-# fileNoExt
-function phonyRuleSideGraphDFSToSvg {
-	local inFile=$1.svg
-	local outFile=$1.graphDFS.svg
-	echo "$outFile: $inFile" >> $makefileImpl
-	echo "	cp $inFile $outFile" >> $makefileImpl
-}
-
-#------------------------------------------------------------------
-# Graphviz
-#------------------------------------------------------------------
-
-gvArgs_base="-Gbgcolor=transparent -Gpad=0.01 -Gmargin=0"
-
-gvArgs_graph="$gvArgs_base -Kneato -Nfontsize=28 -Epenwidth=3"
-gvArgs_ruleSide="$gvArgs_base -Kneato -Nfontsize=28 -Epenwidth=3"
-gvArgs_ruleCombined="$gvArgs_base -Kneato"
-gvArgs_dgNonHyper="$gvArgs_base -Kneato -Goverlap=false -Elen=1.1"
-gvArgs_dgHyper="$gvArgs_base -Kneato -Goverlap=false -Elen=1.1"
-gvArgs_rc="$gvArgs_base -Kdot";
-
-
-gvArgs_svgToPdf="$gvArgs_base"
-gvArgs_putLabelSvg="$gvArgs_base"
-
-# dotFile
-function extractGVImageDeps {
-	grep image $1 | sed "s/.* image=\"\([^\"]*\)\".*/\1/" | while read f; do
-		echo -n " $f"
-	done;
-}
-
-# texFile
-function extractTexImageDeps {
-	grep insertNodeGraph $1 | sed "s/.*\\insertNodeGraph{\([^}]*\)}.*/\1/" | while read f; do
-		echo -n " $f"
-	done;
-}
-
-# graphType fileNoExt outType extraArgs
-function gv {
-	local gvType=$1
-	local argsVar="gvArgs_$gvType"
-	local outType=$3
-	local args="-T$outType ${!argsVar} $4"
-	local inFile=$2.dot
-	local outFile=$2.$outType
-	echo -n "$outFile: $inFile" >> $makefileImpl
-	extractGVImageDeps $inFile >> $makefileImpl
-	echo "" >> $makefileImpl
-	printStatus "$FUNCNAME($1)"
-	echo "	dot $args -o $outFile $inFile" >> $makefileImpl
-}
-
-# fileNoExt
-function svgToPdf {
-	local file=$1.svg
-	local outFile=$1.pdf
-	echo "$outFile: $file" >> $makefileImpl
-	printStatus $FUNCNAME
-	echo "	echo 'graph { a [ shape=plaintext label=\"\" image=\"$file\" ] }' | \\" >> $makefileImpl
-	echo "		neato -Tpdf $gvArgs_svgToPdf -o $outFile" >> $makefileImpl
-}
-
-# label inFile outFile
-function putLabelSvg {
-	local label=$1
-	local inFile=$2.svg
-	local outFile=$3.svg
-	echo "$outFile: $inFile" >> $makefileImpl
-	printStatus $FUNCNAME
-	echo "	echo \"graph { label=\\\"$label\\\"; a [ shape=plaintext label=\\\"\\\" image=\\\"$inFile\\\" ] }\" | \\" >> $makefileImpl
-	echo "		neato -Tsvg $gvArgs_putLabelSvg -o $outFile" >> $makefileImpl
-}
diff --git a/src/jla_boost/test/vf2.hpp b/src/jla_boost/test/vf2.hpp
deleted file mode 100644
index b5e0375..0000000
--- a/src/jla_boost/test/vf2.hpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef JLA_BOOST_TEST_VF2_HPP
-#define JLA_BOOST_TEST_VF2_HPP
-
-namespace jla_boost {
-namespace test {
-
-void vf2();
-
-} // namespace test
-} // namespace jla_boost
-
-#endif /* JLA_BOOST_TEST_VF2_HPP */
\ No newline at end of file
diff --git a/src/lib/pkgconfig/mod.pc.in b/src/lib/pkgconfig/mod.pc.in
deleted file mode 100644
index 2a7e721..0000000
--- a/src/lib/pkgconfig/mod.pc.in
+++ /dev/null
@@ -1,16 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-includedir=@includedir@
-package=@PACKAGE@
-
-Name: MedØlDatschgerl
-Description: MØD
-Version: @PACKAGE_VERSION@
-Requires: 
-Libs: -L${libdir} -Wl,-rpath -Wl,${libdir} -lmod @PKG_LIBS@
-Cflags: -I${includedir} @PKG_INCLUDES@
diff --git a/src/mod/Misc.cpp b/src/mod/Misc.cpp
deleted file mode 100644
index d2d620f..0000000
--- a/src/mod/Misc.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#include "Misc.h"
-
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include 
-
-#include 
-#include 
-
-namespace mod {
-namespace {
-
-std::vector filePrefixes;
-
-} // namespace 
-
-std::string prefixFilename(const std::string &name) {
-	if(name.empty() || name[0] == '/') return name;
-	std::string prefixed;
-	for(const std::string &str : filePrefixes) {
-		if(!str.empty() && str[0] == '/') prefixed = str;
-		else prefixed += str;
-	}
-	prefixed += name;
-	return prefixed;
-}
-
-void pushFilePrefix(const std::string &prefix) {
-	filePrefixes.push_back(prefix);
-}
-
-void popFilePrefix() {
-	if(filePrefixes.empty()) {
-		lib::IO::log() << "popFilePrefix failed; the stack is empty" << std::endl;
-		std::exit(1);
-	} else filePrefixes.pop_back();
-}
-
-void post(const std::string &text) {
-	lib::IO::post() << text << std::endl;
-}
-
-void postChapter(const std::string &chapterTitle) {
-	lib::IO::post() << "summaryChapter \"" << chapterTitle << "\"" << std::endl;
-}
-
-void postSection(const std::string §ionTitle) {
-	lib::IO::post() << "summarySection \"" << sectionTitle << "\"" << std::endl;
-}
-
-void printGeometryGraph() {
-	lib::IO::Stereo::Write::summary(lib::Stereo::getGeometryGraph());
-}
-
-std::string version() {
-	return MOD_VERSION;
-}
-
-} // namespace mod
diff --git a/src/mod/Misc.h b/src/mod/Misc.h
deleted file mode 100644
index 6c0c8fe..0000000
--- a/src/mod/Misc.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef MOD_MISC_H
-#define MOD_MISC_H
-
-#include 
-#include 
-
-#include 
-#include 
-
-namespace mod {
-
-std::string prefixFilename(const std::string &name);
-void pushFilePrefix(const std::string &prefix);
-void popFilePrefix();
-
-void post(const std::string &text);
-void postChapter(const std::string &chapterTitle);
-void postSection(const std::string §ionTitle);
-
-void printGeometryGraph();
-
-// rst: .. function:: std::string version()
-// rst:
-// rst:		:returns: the version of MØD.
-std::string version();
-
-} // namespace mod
-
-#endif	/* MOD_MISC_H */
\ No newline at end of file
diff --git a/src/mod/Py/Misc.cpp b/src/mod/Py/Misc.cpp
deleted file mode 100644
index 7d7c335..0000000
--- a/src/mod/Py/Misc.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#include 
-
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include 
-
-#include 
-
-#include 
-#include 
-
-namespace mod {
-namespace Py {
-namespace {
-
-std::uintptr_t magicLibraryValue() {
-	return reinterpret_cast (&mod::getConfig());
-}
-
-void reseed(unsigned int seed) {
-	lib::Random::getInstance().reseed(seed);
-}
-
-} // namespace 
-
-void Misc_doExport() {
-	// rst: .. function:: magicLibraryValue()
-	// rst:
-	// rst:		:returns: a number unique for each instantiation of libMØD. This can be used to check for the diamond problem for shared libraries.
-	// rst:
-	// rst:		:rtype: uintptr_t
-	py::def("magicLibraryValue", &magicLibraryValue);
-	
-	py::def("rngReseed", &reseed);
-
-	py::def("prefixFilename", &mod::prefixFilename);
-	py::def("pushFilePrefix", &mod::pushFilePrefix);
-	py::def("popFilePrefix", &mod::popFilePrefix);
-	py::def("post", &mod::post);
-	py::def("postChapter", &mod::postChapter);
-	py::def("postSection", &mod::postSection);
-
-	// rst: .. function:: version()
-	// rst:
-	// rst:		:returns: the version of MØD.
-	// rst:		:rtype: string
-	py::def("version", &mod::version);
-	
-	py::def("printGeometryGraph", &mod::printGeometryGraph);
-
-	// jla_boost tests
-	py::def("test_vf2", &jla_boost::test::vf2);
-}
-
-} // namespace Py
-} // namespace mod
diff --git a/src/mod/Py/graph/Graph.cpp b/src/mod/Py/graph/Graph.cpp
deleted file mode 100644
index 171c841..0000000
--- a/src/mod/Py/graph/Graph.cpp
+++ /dev/null
@@ -1,312 +0,0 @@
-#include 
-
-#include 
-#include 
-#include 
-#include 
-
-#include 
-
-namespace mod {
-namespace graph {
-namespace Py {
-
-void Graph_doExport() {
-	std::pair (Graph::*printWithoutOptions)() const = &Graph::print;
-	std::pair (Graph::*printWithOptions)(const graph::Printer&, const graph::Printer&) const = &Graph::print;
-
-	// rst: .. py:class:: Graph
-	// rst:
-	// rst:		This class models an undirected graph with labels on vertices and edges,
-	// rst:		without loops and without parallel edges.
-	// rst:		Certain labels are regarded as models of chemical atoms and bonds.
-	// rst:		See :ref:`mol-enc` for more information on this.
-	// rst:
-	py::class_, boost::noncopyable>("Graph", py::no_init)
-			// rst:		.. py:attribute:: id
-			// rst:
-			// rst:			(Read-only) A unique instance id among :class:`Graph` objects.
-			// rst:	
-			// rst:			:type: int
-			.add_property("id", &Graph::getId)
-			.def(str(py::self))
-			//------------------------------------------------------------------
-			// rst:		.. py:attribute:: numVertices
-			// rst:
-			// rst:			(Read-only) The number of vertices in the graph.
-			// rst:
-			// rst:			:type: int
-			.add_property("numVertices", &Graph::numVertices)
-			// rst:		.. py:attribute:: vertices
-			// rst:
-			// rst:			(Read-only) An iterable of all vertices in the graph.
-			// rst:
-			// rst:			:type: :py:class:`GraphVertexRange`
-			.add_property("vertices", &Graph::vertices)
-			// rst:		.. py:attribute:: numEdges
-			// rst:
-			// rst:			(Read-only) The number of edges in the graph.
-			// rst:
-			// rst:			:type: int
-			.add_property("numEdges", &Graph::numEdges)
-			// rst:		.. py:attribute:: edges
-			// rst:
-			// rst:			(Read-only) An iterable of all edges in the graph.
-			// rst:
-			// rst:			:type: :py:class:`GraphEdgeRange`
-			.add_property("edges", &Graph::edges)
-			//------------------------------------------------------------------
-			// rst:		.. py:function:: aut(labelSettings=LabelSettings(LabelType.String, LabelRelation.Isomorphism))
-			// rst:
-			// rst:			:param labelSettings: the label settings to use.
-			// rst:			:type labelSettings: :py:class:`LabelSettings`
-			// rst:			:returns: an object representing the automorphism group of the graph, with the given label settings.
-			// rst:			:rtype: :py:class:`GraphAutGroup`
-			.def("aut", &Graph::aut)
-			//------------------------------------------------------------------
-			// rst:		.. py:method:: print()
-			// rst:		               print(first, second=None)
-			// rst:
-			// rst:			Print the graph, using either the default options or the options in ``first`` and ``second``.
-			// rst:			If ``first`` and ``second`` are the same, only one depiction will be made.
-			// rst:
-			// rst:			:param first: the printing options used for the first depiction.
-			// rst:			:type first: :class:`GraphPrinter`
-			// rst:			:param second: the printing options used for the second depiction.
-			// rst:				If it is ``None`` then it is set to ``first``.
-			// rst:			:type second: :class:`GraphPrinter`
-			// rst:			:returns: the names for the PDF-files that will be compiled in post-processing.
-			// rst:				If ``first`` and ``second`` are the same, the two file prefixes are equal.
-			// rst:			:rtype: (string, string)
-			.def("print", printWithoutOptions)
-			.def("print", printWithOptions)
-			// rst:		.. py:method:: printTermState
-			// rst:
-			// rst:			Print the term state for the graph.
-			.def("printTermState", &Graph::printTermState)
-			// rst:		.. py:method:: getGMLString(withCoords=False)
-			// rst:
-			// rst:			:returns: the :ref:`GML ` representation of the graph,
-			// rst:			          optionally with generated 2D coordinates.
-			// rst:			:rtype: string
-			// rst:			:raises: :py:class:`LogicError` when coordinates are requested, but
-			// rst:			         none can be generated.
-			.def("getGMLString", &Graph::getGMLString)
-			// rst:		.. py:method:: printGML(withCoords=False)
-			// rst:
-			// rst:			Print the :ref:`GML ` representation of the graph,
-			// rst:			optionally with generated 2D coordinates.
-			// rst:
-			// rst:			:returns: the filename of the printed GML file.
-			// rst:			:rtype: string
-			// rst:			:raises: :py:class:`LogicError` when coordinates are requested, but
-			// rst:			         none can be generated.
-			.def("printGML", &Graph::printGML)
-			// rst:		.. py:attribute:: name
-			// rst:
-			// rst:			The name of the graph. The default name includes the unique instance id.
-			// rst:
-			// rst:			:type: string
-			.add_property("name", py::make_function(&Graph::getName, py::return_value_policy()),
-			&Graph::setName)
-			// rst:		.. py:attribute:: smiles
-			// rst:
-			// rst:			(Read-only) If the graph models a molecule, this is the canonical :ref:`SMILES string ` for it.
-			// rst:
-			// rst:			:type: string
-			// rst:			:raises: :py:class:`LogicError` if the graph is not a molecule.
-			.add_property("smiles", py::make_function(&Graph::getSmiles, py::return_value_policy()))
-			// rst:		.. py:attribute:: smilesWithIds
-			// rst:
-			// rst:			(Read-only) If the graph models a molecule, this is the canonical :ref:`SMILES string ` for it,
-			// rst:			that includes the internal vertex id as a class label on each atom.
-			// rst:
-			// rst:			:type: string
-			// rst:			:raises: :py:class:`LogicError` if the graph is not a molecule.
-			.add_property("smilesWithIds", py::make_function(&Graph::getSmilesWithIds, py::return_value_policy()))
-			// rst:		.. py:attribute:: graphDFS
-			// rst:
-			// rst:			(Read-only) This is a :ref:`GraphDFS ` of the graph.
-			// rst:
-			// rst:			:type: string
-			.add_property("graphDFS", py::make_function(&Graph::getGraphDFS, py::return_value_policy()))
-			// rst:		.. py:attribute:: graphDFSWithIds
-			// rst:
-			// rst:			(Read-only) This is a :ref:`GraphDFS ` of the graph, where each vertices have an explicit id,
-			// rst:			corresponding to its internal vertex id.
-			// rst:
-			// rst:			:type: string
-			.add_property("graphDFSWithIds", py::make_function(&Graph::getGraphDFSWithIds, py::return_value_policy()))
-			// rst:		.. py:attribute:: linearEncoding
-			// rst:
-			// rst:			(Read-only) If the graph models a molecule this is the :ref:`SMILES string ` string, otherwise it is the :ref:`GraphDFS ` string.
-			// rst:
-			// rst:			:type: string
-			.add_property("linearEncoding", py::make_function(&Graph::getLinearEncoding, py::return_value_policy()))
-			// rst:		.. py:attribute:: isMolecule
-			// rst:
-			// rst:			(Read-only) Whether or not the graph models a molecule. See :ref:`mol-enc`.
-			// rst:
-			// rst:			:type: bool
-			.add_property("isMolecule", &Graph::getIsMolecule)
-			// rst:		.. py:attribute:: energy
-			// rst:
-			// rst:			(Read-only) If the graph models a molecule, this is some energy value.
-			// rst:			The energy is calculated using Open Babel, unless already calculated or cached by :py:meth:`Graph.cacheEnergy`.
-			// rst:
-			// rst:			:type: double
-			.add_property("energy", &Graph::getEnergy)
-			// rst:		.. py:method:: cacheEnergy(e)
-			// rst:
-			// rst:			If the graph models a molecule, sets the energy to a given value.
-			// rst:
-			// rst:			:param double e: the value for the energy to be set.
-			.def("cacheEnergy", &Graph::cacheEnergy)
-			// rst:		.. py:attribute:: exactMass
-			// rst:
-			// rst:			(Read-only) The exact mass of the graph, if it is a molecule.
-			// rst:			It is the sum of the exact mass of each atom, with the mass of electrons subtracted corresponding to the integer charge.
-			// rst:			That is, the mass is :math:`\sum_a (mass(a) - mass(e)\cdot charge(a))`.
-			// rst:			If an atom has no specified isotope, then the most abundant is used.
-			// rst:
-			// rst:			:type: double
-			// rst:			:raises: :class:`LogicError` if it is not a molecule, including if some isotope has not been tabulated.
-			.add_property("exactMass", &Graph::getExactMass)
-			// rst:		.. py:method:: vLabelCount(label)
-			// rst:
-			// rst:			:param string label: some label for querying.
-			// rst:			:returns: the number of vertices in the graph with the given label.
-			// rst:			:rtype: unsigned int
-			.def("vLabelCount", &Graph::vLabelCount)
-			// rst:		.. py:method:: eLabelCount(label)
-			// rst:		
-			// rst:			:param string label: some label for querying.
-			// rst:			:returns: the number of edges in the graph with the given label.
-			// rst:			:rtype: unsigned int
-			.def("eLabelCount", &Graph::eLabelCount)
-			// rst:		.. py:method:: isomorphism(other, maxNumMatches=1, labelSettings=LabelSettings(LabelType.String, LabelRelation.Isomorphism))
-			// rst:		
-			// rst:			:param other: the codomain :class:`Graph` for finding morphisms.
-			// rst:			:type other: :class:`Graph`
-			// rst:			:param maxNumMatches: the maximum number of isomorphisms to search for.
-			// rst:			:type maxNumMatches: :cpp:any:`std::size_t`
-			// rst:			:param labelSettings: the label settings to use during the search.
-			// rst:			:type labeSettings: :py:class:`LabelSettings`
-			// rst:			:returns: the number of isomorphisms from this graph to ``other``, but at most ``maxNumMatches``.
-			// rst:			:rtype: :cpp:any:`std::size_t`
-			.def("isomorphism", &Graph::isomorphism)
-			// rst:		.. py:method:: monomorphism(other, maxNumMatches=1, labelSettings=LabelSettings(LabelType.String, LabelRelation.Isomorphism))
-			// rst:		
-			// rst:			:param other: the codomain :class:`Graph` for finding morphisms.
-			// rst:			:type host: :class:`Graph`
-			// rst:			:param maxNumMatches: the maximum number of monomorphisms to search for.
-			// rst:			:type maxNumMatches: :cpp:any:`std::size_t`
-			// rst:			:param labelSettings: the label settings to use during the search.
-			// rst:			:type labeSettings: :py:class:`LabelSettings`
-			// rst:			:returns: the number of monomorphisms from this graph to ``other``, though at most ``maxNumMatches``.
-			// rst:			:rtype: :cpp:any:`std::size_t`
-			.def("monomorphism", &Graph::monomorphism)
-			// rst:		.. py:method:: makePermutation()
-			// rst:
-			// rst:			:returns: a graph isomorphic to this, but with the vertex indices randomly permuted.
-			// rst:			:rtype: :py:class:`Graph`
-			.def("makePermutation", &Graph::makePermutation)
-			// rst:		.. py:attribute:: image
-			// rst:
-			// rst:			(Write-only) A custom depiction for the graph. The depiction file used will be the string
-			// rst:			returned by the given function, with ``.pdf`` appended.
-			// rst:			The function will only be called once.
-			// rst:
-			// rst:			:type: string()
-			.add_property("image", &mod::Py::noGet, &Graph::setImage)
-			// rst:		.. py:attribute:: imageCommad
-			// rst:
-			// rst:			A command to be run in post-processing if a custom depiction is set.
-			// rst:			The command is only run once.
-			// rst:
-			// rst:			:type: string
-			.add_property("imageCommand", &Graph::getImageCommand, &Graph::setImageCommand)
-			// rst:		.. py:method:: getVertexFromExternalId(id)
-			// rst:
-			// rst:			If the graph was not loaded from an external data format, then this function
-			// rst:			always return a null descriptor.
-			// rst:			If the graph was loaded from a SMILES string, but *any* class label was not unique,
-			// rst:			then the function always return a null descriptor.
-			// rst:
-			// rst:			.. note:: In general there is no correlation between external and internal ids.
-			// rst:
-			// rst:			:param id: the external id to find the vertex descriptor for.
-			// rst:			:type id: int
-			// rst:			:returns: the vertex descriptor for the given external id.
-			// rst:		            The descriptor is null if the external id was not used.
-			// rst:			:rtype: :py:class:`GraphVertex`
-			.def("getVertexFromExternalId", &Graph::getVertexFromExternalId)
-			// rst:		.. py:attribute:: minExternalId
-			// rst:		                  maxExternalId
-			// rst:
-			// rst:			If the graph was not loaded from an external data format, then these attributes
-			// rst:			are always return 0. Otherwise, they are the minimum/maximum external id from which
-			// rst:			non-null vertices can be obtained from :py:meth:`getVertexFromExternalId`.
-			// rst:			If no such minimum and maximum exists, then they are 0.
-			// rst:
-			// rst:			:type: int
-			.add_property("minExternalId", &Graph::getMinExternalId)
-			.add_property("maxExternalId", &Graph::getMaxExternalId)
-			;
-
-	// rst: .. py:data:: inputGraphs
-	// rst:
-	// rst:		A list of graphs to which explicitly loaded graphs as default are appended.
-	// rst:
-	// rst:		:type: list of :class:`Graph`
-	// rst:
-	
-	// rst: .. py:method:: graphGMLString(s, name=None, add=True)
-	// rst:
-	// rst:		Load a graph in :ref:`GML ` format from a given string.
-	// rst:
-	// rst:		:param string s: the string with the :ref:`GML ` data to load from.
-	// rst:		:param string name: the name of the graph. If none is given the default name is used.
-	// rst:		:param bool add: whether to append the graph to :data:`inputGraphs` or not.
-	// rst:		:returns: the loaded graph.
-	// rst:		:rtype: :class:`Graph`
-	// rst:		:raises: :class:`InputError` on bad input.
-	py::def("graphGMLString", &Graph::graphGMLString);
-	// rst: .. py:method:: graphGML(f, name=None, add=True)
-	// rst:
-	// rst:		Load a graph in :ref:`GML ` format from a given file.
-	// rst:
-	// rst:		:param string f: name of the :ref:`GML ` file to be loaded.
-	// rst:		:param string name: the name of the graph. If none is given the default name is used.
-	// rst:		:param bool add: whether to append the graph to :data:`inputGraphs` or not.
-	// rst:		:returns: the loaded graph.
-	// rst:		:rtype: :class:`Graph`
-	// rst:		:raises: :class:`InputError` on bad input.
-	py::def("graphGML", &Graph::graphGML);
-	// rst: .. py:method:: graphDFS(s, name=None, add=True)
-	// rst:
-	// rst:		Load a graph from a :ref:`GraphDFS ` string.
-	// rst:
-	// rst:		:param string s: the :ref:`GraphDFS ` string to parse.
-	// rst:		:param string name: the name of the graph. If none is given the default name is used.
-	// rst:		:param bool add: whether to append the graph to :data:`inputGraphs` or not.
-	// rst:		:returns: the loaded graph.
-	// rst:		:rtype: :class:`Graph`
-	// rst:		:raises: :class:`InputError` on bad input.
-	py::def("graphDFS", &Graph::graphDFS);
-	// rst: .. py:method:: smiles(s, name=None, add=True)
-	// rst:
-	// rst:		Load a molecule from a :ref:`SMILES ` string.
-	// rst:
-	// rst:		:param string s: the :ref:`SMILES ` string to parse.
-	// rst:		:param string name: the name of the graph. If none is given the default name is used.
-	// rst:		:param bool add: whether to append the graph to :data:`inputGraphs` or not.
-	// rst:		:returns: the loaded molecule.
-	// rst:		:rtype: :class:`Graph`
-	// rst:		:raises: :class:`InputError` on bad input.
-	py::def("smiles", &Graph::smiles);
-}
-
-} // namespace Py
-} // namespace graph
-} // namespace mod
diff --git a/src/mod/lib/DG/Dump.h b/src/mod/lib/DG/Dump.h
deleted file mode 100644
index 487dad3..0000000
--- a/src/mod/lib/DG/Dump.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef MOD_LIB_DG_DUMP_H
-#define MOD_LIB_DG_DUMP_H
-
-#include 
-#include 
-
-#include 
-#include 
-#include 
-
-namespace mod {
-namespace lib {
-namespace DG {
-class NonHyper;
-namespace Dump {
-
-NonHyper *load(const std::vector > &graphs, const std::vector > &rules, std::istream &s, std::ostream &err);
-void write(const NonHyper &dg, std::ostream &s);
-
-} // namespace Dump
-} // namespace DG
-} // namespace lib
-} // namespace mod
-
-#endif	/* MOD_LIB_DG_DUMP_H */
\ No newline at end of file
diff --git a/src/mod/lib/GraphPimpl.h b/src/mod/lib/GraphPimpl.h
deleted file mode 100644
index 882a2fd..0000000
--- a/src/mod/lib/GraphPimpl.h
+++ /dev/null
@@ -1,303 +0,0 @@
-#ifndef MOD_LIB_GRAPHPIMPL_H
-#define MOD_LIB_GRAPHPIMPL_H
-
-#include 
-
-#include 
-
-namespace mod {
-namespace lib {
-
-#define MOD_GRAPHPIMPL_Define_Vertex(Graph, OwnerLowerCase, getMacroGraph, g, Owner) \
-																																										 \
-Graph::Vertex::Vertex(std::shared_ptr g, std::size_t vId) : g(g), vId(vId) {  \
-	assert(g);                                                                    \
-	using boost::vertices;                                                        \
-	const auto &graph = getMacroGraph;                                            \
-	const auto &vs = vertices(graph);                                             \
-	if(vId >= std::distance(vs.first, vs.second)) {                               \
-		this->g = nullptr;                                                          \
-		this->vId = 0;                                                              \
-	}                                                                             \
-}                                                                               \
-																																								\
-Graph::Vertex::Vertex() : vId(0) { }                                            \
-																																								\
-std::ostream &operator<<(std::ostream &s, const Graph::Vertex &v) {             \
-	s << #Graph "Vertex(";                                                        \
-	if(!v.get ## Owner()) s << "null";                                            \
-	else s << *v.get ## Owner() << ", " << v.getId();                             \
-	return s << ")";                                                              \
-}                                                                               \
-																																								\
-bool operator==(const Graph::Vertex &v1, const Graph::Vertex &v2) {             \
-	return v1.g == v2.g && v1.vId == v2.vId;                                      \
-}                                                                               \
-																																								\
-bool operator!=(const Graph::Vertex &v1, const Graph::Vertex &v2) {             \
-	return !(v1 == v2);                                                           \
-}                                                                               \
-																																								\
-bool operator<(const Graph::Vertex &v1, const Graph::Vertex &v2) {              \
-	return std::tie(v1.g, v1.vId) < std::tie(v2.g, v2.vId);                       \
-}                                                                               \
-																																								\
-std::size_t Graph::Vertex::hash() const {                                       \
-	if(g) return getId();                                                         \
-  else return -1;                                                               \
-}                                                                               \
-                                                                                \
-Graph::Vertex::operator bool() const {                                          \
-	return !isNull();                                                             \
-}                                                                               \
-                                                                                \
-bool Graph::Vertex::isNull() const {                                            \
-	return *this == Graph::Vertex();                                              \
-}                                                                               \
-                                                                                \
-std::size_t Graph::Vertex::getId() const {                                      \
-	if(!g) throw LogicError("Can not get id on a null vertex.");                  \
-	const auto &graph = getMacroGraph;                                            \
-	using boost::vertices;                                                        \
-	auto v = *std::next(vertices(graph).first, vId);                              \
-	return get(boost::vertex_index_t(), graph, v);                                \
-}                                                                               \
-																																								\
-std::shared_ptr Graph::Vertex::get ## Owner() const {                    \
-	if(!g) throw LogicError("Can not get " #OwnerLowerCase " on a null vertex."); \
-	return g;                                                                     \
-}
-
-
-#define MOD_GRAPHPIMPL_Define_Vertex_Undirected(Graph, GraphLowerCase, getMacroGraph, g) \
-																																								\
-std::size_t Graph::Vertex::getDegree() const {                                  \
-	if(!g) throw LogicError("Can not get degree on a null vertex.");              \
-	const auto &graph = getMacroGraph;                                            \
-	using boost::vertices;                                                        \
-	auto v = *std::next(vertices(graph).first, vId);                              \
-	return out_degree(v, graph);                                                  \
-}                                                                               \
-																																								\
-Graph::IncidentEdgeRange Graph::Vertex::incidentEdges() const {                 \
-	if(!g) throw LogicError("Can not get incident edges on a null vertex.");      \
-	return IncidentEdgeRange(g, vId);                                             \
-}
-
-
-#define MOD_GRAPHPIMPL_Define_Vertex_Directed(Graph, GraphLowerCase, getMacroGraph, g) \
-																																								\
-std::size_t Graph::Vertex::inDegree() const {                                   \
-	if(!g) throw LogicError("Can not get in-degree on a null vertex.");           \
-	const auto &graph = getMacroGraph;                                            \
-	using boost::vertices;                                                        \
-	auto v = *std::next(vertices(graph).first, vId);                              \
-	return in_degree(v, graph);                                                   \
-}                                                                               \
-																																								\
-std::size_t Graph::Vertex::outDegree() const {                                  \
-	if(!g) throw LogicError("Can not get out-degree on a null vertex.");          \
-	const auto &graph = getMacroGraph;                                            \
-	using boost::vertices;                                                        \
-	auto v = *std::next(vertices(graph).first, vId);                              \
-	return out_degree(v, graph);                                                  \
-}
-
-
-
-#define MOD_GRAPHPIMPL_Define_Indices(Graph, OwnerLowerCase, getMacroGraph, g, getGraph, Owner)  \
-																																								\
-/*----------------------------------------------------------------------------*/\
-/* Edge                                                                       */\
-/*----------------------------------------------------------------------------*/\
-																							                                  \
-Graph::Edge::Edge(std::shared_ptr g, std::size_t vId, std::size_t eId) : g(g), vId(vId), eId(eId) { \
-	assert(g);                                                                    \
-	using boost::vertices;                                                        \
-	const auto &graph = getMacroGraph;                                            \
-	const auto &vs = vertices(graph);                                             \
-	if(vId >= std::distance(vs.first, vs.second)                                  \
-			|| eId >= out_degree(*std::next(vertices(graph).first, vId), graph)) {    \
-		this->g = nullptr;                                                          \
-		this->vId = 0;                                                              \
-		this->eId = 0;                                                              \
-	}                                                                             \
-}                                                                               \
-																																								\
-Graph::Edge::Edge() : vId(0), eId(0) { }                                        \
-																																								\
-std::ostream &operator<<(std::ostream &s, const Graph::Edge &e) {               \
-	s << #Graph "Edge(";                                                          \
-	if(e.g) s << *e.getGraph() << ", " << e.source().getId() << ", " << e.target().getId(); \
-	else s << "null";                                                             \
-	return s << ")";                                                              \
-}                                                                               \
-																																								\
-bool operator==(const Graph::Edge &e1, const Graph::Edge &e2) {                 \
-	if(e1.g && e2.g)                                                              \
-		return (e1.source() == e2.source() && e1.target() == e2.target())           \
-				|| (e1.source() == e2.target() && e1.target() == e2.source());          \
-	else if(!e1.g && !e2.g) return true;                                          \
-	else return false;                                                            \
-}                                                                               \
-																																								\
-bool operator!=(const Graph::Edge &e1, const Graph::Edge &e2) {                 \
-	return !(e1 == e2);                                                           \
-}                                                                               \
-																																								\
-bool operator<(const Graph::Edge &e1, const Graph::Edge &e2) {                  \
-	return std::tie(e1.g, e1.vId, e1.eId) < std::tie(e2.g, e2.vId, e2.eId);       \
-}                                                                               \
-																																								\
-Graph::Edge::operator bool() const {                                            \
-	return !isNull();                                                             \
-}                                                                               \
-                                                                                \
-bool Graph::Edge::isNull() const {                                              \
-	return *this == Graph::Edge();                                                \
-}                                                                               \
-																																								\
-std::shared_ptr Graph::Edge::getGraph() const {                          \
-	if(!g) throw LogicError("Can not get graph on a null edge.");                 \
-	return g;                                                                     \
-}                                                                               \
-																																								\
-Graph::Vertex Graph::Edge::source() const {                                     \
-	if(!g) throw LogicError("Can not get source on a null edge.");                \
-	return Vertex(g, vId);                                                        \
-}                                                                               \
-																																								\
-Graph::Vertex Graph::Edge::target() const {                                     \
-	if(!g) throw LogicError("Can not get target on a null edge.");                \
-	const auto &graph = getMacroGraph;                                            \
-	using boost::vertices;                                                        \
-	auto v = *std::next(vertices(graph).first, vId);                              \
-	auto e = *std::next(out_edges(v, graph).first, eId);                          \
-	using boost::target;                                                          \
-	auto vTar = target(e, graph);                                                 \
-	const auto &vs = vertices(graph);                                             \
-	auto vTarIter = std::find(vs.first, vs.second, vTar);                         \
-	return Vertex(g, std::distance(vs.first, vTarIter));                          \
-}                                                                               \
-																																								\
-/*----------------------------------------------------------------------------*/\
-/* VertexIterator                                                             */\
-/*----------------------------------------------------------------------------*/\
-																							                                  \
-Graph::VertexIterator::VertexIterator(std::shared_ptr g) : g(g), vId(0) {\
-	assert(g);                                                                    \
-	using boost::vertices;                                                        \
-	const auto &graph = getMacroGraph;                                            \
-	const auto &vs = vertices(graph);                                             \
-	if(0 == std::distance(vs.first, vs.second))                                   \
-		this->g = nullptr;                                                          \
-}                                                                               \
-																																								\
-Graph::VertexIterator::VertexIterator() : g(nullptr), vId(0) { }                \
-																																								\
-Graph::Vertex Graph::VertexIterator::dereference() const {                      \
-	return Graph::Vertex(g, vId);                                                 \
-}                                                                               \
-																																								\
-bool Graph::VertexIterator::equal(const VertexIterator &iter) const {           \
-	if(g) return g == iter.g && vId == iter.vId;                                  \
-	else return g == iter.g;                                                      \
-}                                                                               \
-																																								\
-void Graph::VertexIterator::increment() {                                       \
-	++this->vId;                                                                  \
-	using boost::vertices;                                                        \
-	const auto &graph = getMacroGraph;                                            \
-	const auto &vs = vertices(graph);                                             \
-	if(vId >= std::distance(vs.first, vs.second)) {                               \
-		this->g = nullptr;                                                          \
-		this->vId = 0;                                                              \
-	}                                                                             \
-}                                                                               \
-																																								\
-/*----------------------------------------------------------------------------*/\
-/* EdgeIterator												                                        */\
-/*----------------------------------------------------------------------------*/\
-																							                                  \
-Graph::EdgeIterator::EdgeIterator(std::shared_ptr g) : g(g), vId(0), eId(0) { \
-	assert(g);                                                                    \
-	advanceToValid();                                                             \
-}                                                                               \
-																																								\
-Graph::EdgeIterator::EdgeIterator() : g(nullptr), vId(0), eId(0) { }            \
-																																								\
-Graph::Edge Graph::EdgeIterator::dereference() const {                          \
-	return Edge(g, vId, eId);                                                     \
-}                                                                               \
-																																								\
-bool Graph::EdgeIterator::equal(const EdgeIterator &iter) const {               \
-	if(g) return g == iter.g && vId == iter.vId && eId == iter.eId;               \
-	else return g == iter.g;                                                      \
-}                                                                               \
-																																								\
-void Graph::EdgeIterator::increment() {                                         \
-	eId++;                                                                        \
-	advanceToValid();                                                             \
-}                                                                               \
-																																								\
-void Graph::EdgeIterator::advanceToValid() {                                    \
-	assert(g);                                                                    \
-	using boost::vertices;                                                        \
-	const auto &graph = getMacroGraph;                                            \
-	const auto &vs = vertices(graph);                                             \
-	for(; vId < std::distance(vs.first, vs.second); vId++, eId = 0) {             \
-		using boost::vertices;                                                                    \
-		for(auto v = *std::next(vertices(graph).first, vId); eId < out_degree(v, graph); eId++) { \
-			auto e = *std::next(out_edges(v, graph).first, eId);                                    \
-			auto vTar = target(e, graph);                                                           \
-			if(get(boost::vertex_index_t(), graph, vTar) > get(boost::vertex_index_t(), graph, v))  \
-				return;                                                                               \
-		}                                                                                         \
-	}                                                                                           \
-	g = nullptr;                                                                                \
-	vId = 0;                                                                                    \
-	eId = 0;                                                                                    \
-}                                                                                             \
-																																								\
-/*----------------------------------------------------------------------------*/\
-/* IncidentEdgeIterator                                                       */\
-/*----------------------------------------------------------------------------*/\
-																							                                  \
-Graph::IncidentEdgeIterator::IncidentEdgeIterator(std::shared_ptr g, std::size_t vId) : g(g), vId(vId), eId(0) { \
-	assert(g);                                                                    \
-	const auto &graph = getMacroGraph;                                            \
-	using boost::vertices;                                                        \
-	auto v = *std::next(vertices(graph).first, vId);                              \
-	if(out_degree(v, graph) == 0) {                                               \
-		this->g = nullptr;                                                          \
-		this->vId = 0;                                                              \
-	}                                                                             \
-}                                                                               \
-																																								\
-Graph::IncidentEdgeIterator::IncidentEdgeIterator() : g(nullptr), vId(0), eId(0) { } \
-																																								\
-Graph::Edge Graph::IncidentEdgeIterator::dereference() const {                  \
-	return Graph::Edge(g, vId, eId);                                              \
-}                                                                               \
-																																								\
-bool Graph::IncidentEdgeIterator::equal(const IncidentEdgeIterator &iter) const { \
-	if(g) return g == iter.g && vId == iter.vId && eId == iter.eId;               \
-	else return g == iter.g;                                                      \
-}                                                                               \
-																																								\
-void Graph::IncidentEdgeIterator::increment() {                                 \
-	++this->eId;                                                                  \
-	const auto &graph = getMacroGraph;                                            \
-	using boost::vertices;                                                        \
-	auto v = *std::next(vertices(graph).first, vId);                              \
-	if(eId >= out_degree(v, graph)) {                                             \
-		this->g = nullptr;                                                          \
-		this->vId = 0;                                                              \
-	}                                                                             \
-}
-
-} // namespace lib
-} // namespace mod
-
-#endif /* MOD_LIB_GRAPHPIMPL_H */
-
diff --git a/src/mod/lib/Rules/LabelledRule.cpp.orig b/src/mod/lib/Rules/LabelledRule.cpp.orig
deleted file mode 100644
index 0f16a68..0000000
--- a/src/mod/lib/Rules/LabelledRule.cpp.orig
+++ /dev/null
@@ -1,388 +0,0 @@
-#include "LabelledRule.h"
-
-#include 
-#include 
-
-#include 
-
-namespace mod {
-namespace lib {
-namespace Rules {
-
-// LabelledRule
-//------------------------------------------------------------------------------
-
-LabelledRule::LabelledRule() : g(new GraphType()) { }
-
-LabelledRule::LabelledRule(const LabelledRule &other, bool withConstraints) : LabelledRule() {
-	auto &g = *this->g;
-	const auto &gOther = get_graph(other);
-	this->pString = std::make_unique(g);
-	auto &pString = *this->pString;
-	auto &pStringOther = get_string(other);
-	for(Vertex vOther : asRange(vertices(gOther))) {
-		Vertex v = add_vertex(g);
-		g[v].membership = membership(other, vOther);
-		switch(g[v].membership) {
-		case Membership::Left:
-			pString.add(v, pStringOther.getLeft()[vOther], "");
-			break;
-		case Membership::Right:
-			pString.add(v, "", pStringOther.getRight()[vOther]);
-			break;
-		case Membership::Context:
-			pString.add(v, pStringOther.getRight()[vOther], pStringOther.getLeft()[vOther]);
-			break;
-		}
-	}
-	for(Edge eOther : asRange(edges(gOther))) {
-		Edge e = add_edge(source(eOther, gOther), target(eOther, gOther), g).first;
-		g[e].membership = membership(other, eOther);
-		switch(g[e].membership) {
-		case Membership::Left:
-			pString.add(e, pStringOther.getLeft()[eOther], "");
-			break;
-		case Membership::Right:
-			pString.add(e, "", pStringOther.getRight()[eOther]);
-			break;
-		case Membership::Context:
-			pString.add(e, pStringOther.getLeft()[eOther], pStringOther.getRight()[eOther]);
-			break;
-		}
-	}
-	if(withConstraints) {
-		leftComponentMatchConstraints.reserve(other.leftComponentMatchConstraints.size());
-		rightComponentMatchConstraints.reserve(other.rightComponentMatchConstraints.size());
-		for(auto &&c : other.leftComponentMatchConstraints)
-			leftComponentMatchConstraints.push_back(c->clone());
-		for(auto &&c : other.rightComponentMatchConstraints)
-			rightComponentMatchConstraints.push_back(c->clone());
-	}
-}
-
-void LabelledRule::initComponents() { // TODO: structure this better
-	if(numLeftComponents != std::numeric_limits::max()) MOD_ABORT;
-	leftComponents.resize(num_vertices(get_graph(*this)), -1);
-	rightComponents.resize(num_vertices(get_graph(*this)), -1);
-	numLeftComponents = boost::connected_components(get_graph(get_labelled_left(*this)), leftComponents.data());
-	numRightComponents = boost::connected_components(get_graph(get_labelled_right(*this)), rightComponents.data());
-}
-
-void LabelledRule::invert() {
-	// we only invert the string prop
-	get_string(*this);
-	// clear cached stuff
-	this->pTerm.reset();
-	this->projs.reset();
-	// and not the actual inversion
-	auto &g = *this->g;
-	auto &pString = *this->pString;
-	for(Vertex v : asRange(vertices(g))) {
-		auto membership = g[v].membership;
-		switch(membership) {
-		case Membership::Left:
-		{
-			auto label = pString.getLeft()[v];
-			g[v].membership = Membership::Right;
-			pString.setRight(v, label);
-		}
-			break;
-		case Membership::Right:
-		{
-			auto label = pString.getRight()[v];
-			g[v].membership = Membership::Left;
-			pString.setLeft(v, label);
-		}
-			break;
-		case Membership::Context:
-		{
-			auto left = pString.getLeft()[v];
-			auto right = pString.getRight()[v];
-			pString.setLeft(v, right);
-			pString.setRight(v, left);
-		}
-			break;
-		}
-	}
-
-	for(Edge e : asRange(edges(g))) {
-		auto membership = g[e].membership;
-		switch(membership) {
-		case Membership::Left:
-		{
-			auto label = pString.getLeft()[e];
-			g[e].membership = Membership::Right;
-			pString.setRight(e, label);
-		}
-			break;
-		case Membership::Right:
-		{
-			auto label = pString.getRight()[e];
-			g[e].membership = Membership::Left;
-			pString.setLeft(e, label);
-		}
-			break;
-		case Membership::Context:
-		{
-			auto left = pString.getLeft()[e];
-			auto right = pString.getRight()[e];
-			pString.setLeft(e, right);
-			pString.setRight(e, left);
-		}
-			break;
-		}
-	}
-	// also invert the component stuff
-	using std::swap;
-	swap(this->numLeftComponents, this->numRightComponents);
-	swap(this->leftComponents, this->rightComponents);
-	swap(this->leftComponentMatchConstraints, this->rightComponentMatchConstraints);
-}
-
-GraphType &get_graph(LabelledRule &r) {
-	return *r.g;
-}
-
-const GraphType &get_graph(const LabelledRule &r) {
-	return *r.g;
-}
-
-const LabelledRule::PropStringType &get_string(const LabelledRule &r) {
-	assert(r.pString || r.pTerm);
-	return *r.pString;
-}
-
-const LabelledRule::PropTermType &get_term(const LabelledRule &r) {
-	assert(r.pString || r.pTerm);
-	if(!r.pTerm) r.pTerm.reset(new LabelledRule::PropTermType(get_graph(r), get_string(r), lib::Term::getStrings()));
-	return *r.pTerm;
-}
-
-bool has_stereo(const LabelledRule &r) {
-	return bool(r.pStereo);
-}
-
-const LabelledRule::PropStereoType &get_stereo(const LabelledRule &r) {
-	if(!has_stereo(r)) {
-		auto gLeft = get_labelled_left(r);
-		auto gRight = get_labelled_right(r);
-		auto pMoleculeLeft = get_molecule(gLeft);
-		auto pMoleculeRight = get_molecule(gRight);
-		auto leftInference = lib::Stereo::makeInference(get_graph(gLeft), pMoleculeLeft, true);
-		auto rightInference = lib::Stereo::makeInference(get_graph(gRight), pMoleculeRight, true);
-		std::stringstream ssErr;
-		auto leftResult = leftInference.finalize(ssErr, [&r](LabelledRule::Vertex v) {
-			return std::to_string(get(boost::vertex_index_t(), get_graph(r), v)) + " left";
-		});
-		switch(leftResult) {
-		case Stereo::DeductionResult::Success: break;
-		case Stereo::DeductionResult::Warning:
-			IO::log() << ssErr.str();
-			break;
-		case Stereo::DeductionResult::Error:
-			throw StereoDeductionError(ssErr.str());
-			break;
-		}
-		auto rightResult = rightInference.finalize(ssErr, [&r](LabelledRule::Vertex v) {
-			return std::to_string(get(boost::vertex_index_t(), get_graph(r), v)) + " right";
-		});
-		switch(rightResult) {
-		case Stereo::DeductionResult::Success: break;
-		case Stereo::DeductionResult::Warning:
-			IO::log() << ssErr.str();
-			break;
-		case Stereo::DeductionResult::Error:
-			throw StereoDeductionError(ssErr.str());
-		}
-		r.pStereo.reset(new PropStereoCore(get_graph(r), std::move(leftInference), std::move(rightInference)));
-	}
-	return *r.pStereo;
-}
-
-const LabelledRule::PropMoleculeType &get_molecule(const LabelledRule &r) {
-	if(!r.pMolecule) {
-		r.pMolecule.reset(new LabelledRule::PropMoleculeType(get_graph(r), get_string(r)));
-	}
-	return *r.pMolecule;
-}
-
-const LabelledRule::LeftGraphType &get_left(const LabelledRule &r) {
-	if(!r.projs) r.projs.reset(new LabelledRule::Projections(r));
-	return r.projs->left;
-}
-
-const LabelledRule::ContextGraphType &get_context(const LabelledRule &r) {
-	if(!r.projs) r.projs.reset(new LabelledRule::Projections(r));
-	return r.projs->context;
-}
-
-const LabelledRule::RightGraphType &get_right(const LabelledRule &r) {
-	if(!r.projs) r.projs.reset(new LabelledRule::Projections(r));
-	return r.projs->right;
-}
-
-jla_boost::GraphDPO::Membership membership(const LabelledRule &r, const Vertex &v) {
-	return get_graph(r)[v].membership;
-}
-
-jla_boost::GraphDPO::Membership membership(const LabelledRule &r, const Edge &e) {
-	return get_graph(r)[e].membership;
-}
-
-void put_membership(LabelledRule &r, const Vertex &v, jla_boost::GraphDPO::Membership m) {
-	get_graph(r)[v].membership = m;
-}
-
-void put_membership(LabelledRule &r, const Edge &e, jla_boost::GraphDPO::Membership m) {
-	get_graph(r)[e].membership = m;
-}
-
-LabelledRule::LabelledLeftType get_labelled_left(const LabelledRule &r) {
-	return LabelledRule::LabelledLeftType(r);
-}
-
-LabelledRule::LabelledRightType get_labelled_right(const LabelledRule &r) {
-	return LabelledRule::LabelledRightType(r);
-}
-
-LabelledRule::Projections::Projections(const LabelledRule &r)
-: left(get_graph(r), Membership::Left),
-context(get_graph(r), Membership::Context),
-right(get_graph(r), Membership::Right) { }
-
-
-// LabelledSideGraph
-//------------------------------------------------------------------------------
-
-namespace detail {
-
-LabelledSideGraph::LabelledSideGraph(const LabelledRule &r, jla_boost::GraphDPO::Membership m)
-: r(r), m(m) { }
-
-} // namespace detail
-
-// LabelledLeftGraph
-//------------------------------------------------------------------------------
-
-LabelledLeftGraph::LabelledLeftGraph(const LabelledRule &r)
-: Base(r, jla_boost::GraphDPO::Membership::Left) { }
-
-const LabelledLeftGraph::GraphType &get_graph(const LabelledLeftGraph &g) {
-	return get_left(g.r);
-}
-
-LabelledLeftGraph::PropStringType get_string(const LabelledLeftGraph &g) {
-	return get_string(g.r).getLeft();
-}
-
-LabelledLeftGraph::PropTermType get_term(const LabelledLeftGraph &g) {
-	return get_term(g.r).getLeft();
-}
-
-<<<<<<< HEAD
-bool has_stereo(const LabelledLeftGraph &g) {
-	return has_stereo(g.r);
-}
-
-LabelledLeftGraph::PropStereoType get_stereo(const LabelledLeftGraph &g) {
-	return get_stereo(g.r).getLeft();
-}
-
-const std::vector > &
-=======
-const std::vector > &
->>>>>>> private/develop
-get_match_constraints(const LabelledLeftGraph &g) {
-	return g.r.leftComponentMatchConstraints;
-}
-
-std::size_t get_num_connected_components(const LabelledLeftGraph &g) {
-	return g.r.numLeftComponents;
-}
-
-LabelledLeftGraph::PropMoleculeType get_molecule(const LabelledLeftGraph &g) {
-	return get_molecule(g.r).getLeft();
-}
-
-LabelledLeftGraph::Base::ComponentGraph
-get_component_graph(std::size_t i, const LabelledLeftGraph &g) {
-	assert(i < get_num_connected_components(g));
-	LabelledLeftGraph::Base::ComponentFilter filter(&get_graph(g), &g.r.leftComponents, i);
-	return LabelledLeftGraph::Base::ComponentGraph(get_graph(g), filter, filter);
-}
-
-const std::vector::vertex_descriptor>&
-get_vertex_order_component(std::size_t i, const LabelledLeftGraph &g) {
-	assert(i < get_num_connected_components(g));
-	// the number of connected components is initialized externally after construction, so we have this annoying hax
-	if(g.vertex_orders.empty()) g.vertex_orders.resize(get_num_connected_components(g));
-	if(g.vertex_orders[i].empty()) {
-		g.vertex_orders[i] = get_vertex_order(lib::GraphMorphism::DefaultFinderArgsProvider(), get_component_graph(i, g));
-	}
-	return g.vertex_orders[i];
-}
-
-// LabelledRightGraph
-//------------------------------------------------------------------------------
-
-LabelledRightGraph::LabelledRightGraph(const LabelledRule &r)
-: Base(r, jla_boost::GraphDPO::Membership::Right) { }
-
-const LabelledRightGraph::GraphType &get_graph(const LabelledRightGraph &g) {
-	return get_right(g.r);
-}
-
-LabelledRightGraph::PropStringType get_string(const LabelledRightGraph &g) {
-	return get_string(g.r).getRight();
-}
-
-LabelledRightGraph::PropTermType get_term(const LabelledRightGraph &g) {
-	return get_term(g.r).getRight();
-}
-
-<<<<<<< HEAD
-bool has_stereo(const LabelledRightGraph &g) {
-	return has_stereo(g.r);
-}
-
-LabelledRightGraph::PropStereoType get_stereo(const LabelledRightGraph &g) {
-	return get_stereo(g.r).getRight();
-}
-
-const std::vector > &
-=======
-const std::vector > &
->>>>>>> private/develop
-get_match_constraints(const LabelledRightGraph &g) {
-	return g.r.rightComponentMatchConstraints;
-}
-
-std::size_t get_num_connected_components(const LabelledRightGraph &g) {
-	return g.r.numRightComponents;
-}
-
-LabelledRightGraph::Base::ComponentGraph
-get_component_graph(std::size_t i, const LabelledRightGraph &g) {
-	assert(i < get_num_connected_components(g));
-	LabelledRightGraph::Base::ComponentFilter filter(&get_graph(g), &g.r.rightComponents, i);
-	return LabelledRightGraph::Base::ComponentGraph(get_graph(g), filter, filter);
-}
-
-LabelledRightGraph::PropMoleculeType get_molecule(const LabelledRightGraph &g) {
-	return get_molecule(g.r).getRight();
-}
-
-const std::vector::vertex_descriptor>&
-get_vertex_order_component(std::size_t i, const LabelledRightGraph &g) {
-	assert(i < get_num_connected_components(g));
-	// the number of connected components is initialized externally after construction, so we have this annoying hax
-	if(g.vertex_orders.empty()) g.vertex_orders.resize(get_num_connected_components(g));
-	if(g.vertex_orders[i].empty()) {
-		g.vertex_orders[i] = get_vertex_order(lib::GraphMorphism::DefaultFinderArgsProvider(), get_component_graph(i, g));
-	}
-	return g.vertex_orders[i];
-}
-
-} // namespace Rules
-} // namespace lib
-} // namespace mod
\ No newline at end of file
diff --git a/src/mod/lib/Rules/LabelledRule.h.orig b/src/mod/lib/Rules/LabelledRule.h.orig
deleted file mode 100644
index 22fe4d0..0000000
--- a/src/mod/lib/Rules/LabelledRule.h.orig
+++ /dev/null
@@ -1,171 +0,0 @@
-#ifndef MOD_LIB_RULES_LABELLED_RULE_H
-#define MOD_LIB_RULES_LABELLED_RULE_H
-
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include 
-
-#include 
-
-namespace mod {
-namespace lib {
-namespace Rules {
-struct LabelledLeftGraph;
-struct LabelledRightGraph;
-
-class LabelledRule {
-public: // LabelledGraphConcept, PushoutRuleConcept
-	using GraphType = lib::Rules::GraphType;
-public: // PushoutRuleConcept
-	using LeftGraphType = jla_boost::GraphDPO::FilteredGraphProjection;
-	using ContextGraphType = LeftGraphType;
-	using RightGraphType = LeftGraphType;
-public: // LabelledGraphConcept
-	using PropStringType = PropStringCore;
-	using PropTermType = PropTermCore;
-	using PropStereoType = PropStereoCore;
-	using PropMoleculeType = PropMoleculeCore;
-public: // Other
-	using Vertex = boost::graph_traits::vertex_descriptor;
-	using Edge = boost::graph_traits::edge_descriptor;
-	using LeftMatchConstraint = GraphMorphism::MatchConstraint::Constraint;
-	using RightMatchConstraint = GraphMorphism::MatchConstraint::Constraint;
-	using LabelledLeftType = LabelledLeftGraph;
-	using LabelledRightType = LabelledRightGraph;
-public:
-	LabelledRule();
-	LabelledRule(const LabelledRule &other, bool withConstraints);
-	void initComponents(); // TODO: this is a huge hax
-	void invert();
-public: // LabelledGraphConcept, PushoutRuleConcept
-	friend GraphType &get_graph(LabelledRule &r);
-	friend const GraphType &get_graph(const LabelledRule &r);
-public: // LabelledGraphConcept
-	friend const PropStringType &get_string(const LabelledRule &r);
-	friend const PropTermType &get_term(const LabelledRule &r);
-	friend bool has_stereo(const LabelledRule &r);
-	friend const PropStereoType &get_stereo(const LabelledRule &r);
-public:
-	friend const PropMoleculeType &get_molecule(const LabelledRule &r);
-public: // PushoutRuleConcept
-	friend const LeftGraphType &get_left(const LabelledRule &r);
-	friend const ContextGraphType &get_context(const LabelledRule &r);
-	friend const RightGraphType &get_right(const LabelledRule &r);
-	friend jla_boost::GraphDPO::Membership membership(const LabelledRule &r, const Vertex &v);
-	friend jla_boost::GraphDPO::Membership membership(const LabelledRule &r, const Edge &e);
-	friend void put_membership(LabelledRule &r, const Vertex &v, jla_boost::GraphDPO::Membership m);
-	friend void put_membership(LabelledRule &r, const Edge &e, jla_boost::GraphDPO::Membership m);
-public:
-	friend LabelledLeftType get_labelled_left(const LabelledRule &r);
-	friend LabelledRightType get_labelled_right(const LabelledRule &r);
-private:
-
-	struct Projections {
-		Projections(const LabelledRule &r);
-	public:
-		LeftGraphType left;
-		ContextGraphType context;
-		RightGraphType right;
-	};
-	std::unique_ptr g;
-	mutable std::unique_ptr projs;
-public:
-	mutable std::unique_ptr pString;
-	mutable std::unique_ptr pTerm;
-<<<<<<< HEAD
-	mutable std::unique_ptr pStereo;
-	std::vector > leftComponentMatchConstraints, rightComponentMatchConstraints;
-private:
-	mutable std::unique_ptr pMolecule;
-=======
-	std::vector > leftComponentMatchConstraints;
-	std::vector >rightComponentMatchConstraints;
->>>>>>> private/develop
-public:
-	std::size_t numLeftComponents = -1, numRightComponents = -1;
-	std::vector leftComponents, rightComponents;
-};
-
-namespace detail {
-
-struct LabelledSideGraph {
-	using LabelledRule = lib::Rules::LabelledRule;
-	using GraphType = jla_boost::GraphDPO::FilteredGraphProjection;
-	using ComponentFilter = ConnectedComponentFilter >;
-	using ComponentGraph = boost::filtered_graph;
-public:
-	LabelledSideGraph(const LabelledRule &r, jla_boost::GraphDPO::Membership m);
-public:
-	const LabelledRule &r;
-	const jla_boost::GraphDPO::Membership m;
-protected:
-	mutable std::vector::vertex_descriptor> > vertex_orders;
-};
-
-} // namespace detail
-
-struct LabelledLeftGraph : detail::LabelledSideGraph {
-	using Base = detail::LabelledSideGraph;
-	using PropStringType = LabelledRule::PropStringType::LeftType;
-	using PropTermType = LabelledRule::PropTermType::LeftType;
-	using PropStereoType = LabelledRule::PropStereoType::LeftType;
-public:
-	using PropMoleculeType = typename LabelledRule::PropMoleculeType::LeftType;
-public:
-	explicit LabelledLeftGraph(const LabelledRule &r);
-	friend const Base::GraphType &get_graph(const LabelledLeftGraph &g);
-	friend PropStringType get_string(const LabelledLeftGraph &g);
-	friend PropTermType get_term(const LabelledLeftGraph &g);
-	friend bool has_stereo(const LabelledLeftGraph &g);
-	friend PropStereoType get_stereo(const LabelledLeftGraph &g);
-public:
-	friend const std::vector > &
-	get_match_constraints(const LabelledLeftGraph &g);
-public:
-	friend std::size_t get_num_connected_components(const LabelledLeftGraph &g);
-	friend Base::ComponentGraph get_component_graph(std::size_t i, const LabelledLeftGraph &g);
-public:
-	friend PropMoleculeType get_molecule(const LabelledLeftGraph &g);
-public:
-	friend const std::vector::vertex_descriptor>&
-	get_vertex_order_component(std::size_t i, const LabelledLeftGraph &g);
-};
-
-struct LabelledRightGraph : detail::LabelledSideGraph {
-	using Base = detail::LabelledSideGraph;
-	using PropStringType = LabelledRule::PropStringType::RightType;
-	using PropTermType = LabelledRule::PropTermType::RightType;
-	using PropStereoType = LabelledRule::PropStereoType::RightType;
-public:
-	using PropMoleculeType = typename LabelledRule::PropMoleculeType::RightType;
-public:
-	explicit LabelledRightGraph(const LabelledRule &r);
-	friend const Base::GraphType &get_graph(const LabelledRightGraph &g);
-	friend PropStringType get_string(const LabelledRightGraph &g);
-	friend PropTermType get_term(const LabelledRightGraph &g);
-	friend bool has_stereo(const LabelledRightGraph &g);
-	friend PropStereoType get_stereo(const LabelledRightGraph &g);
-public:
-	friend const std::vector > &
-	get_match_constraints(const LabelledRightGraph &g);
-public:
-	friend std::size_t get_num_connected_components(const LabelledRightGraph &g);
-	friend Base::ComponentGraph get_component_graph(std::size_t i, const LabelledRightGraph &g);
-public:
-	friend PropMoleculeType get_molecule(const LabelledRightGraph &g);
-public:
-	friend const std::vector::vertex_descriptor>&
-	get_vertex_order_component(std::size_t i, const LabelledRightGraph &g);
-};
-
-} // namespace Rules
-} // namespace lib
-} // namespace mod
-
-#endif /* MOD_LIB_RULES_LABELLED_RULE_H */
diff --git a/src/share/mod/plugins/00_mod.in b/src/share/mod/plugins/00_mod.in
deleted file mode 100644
index 1f7fbaf..0000000
--- a/src/share/mod/plugins/00_mod.in
+++ /dev/null
@@ -1,2 +0,0 @@
-name: mod
-path: @libdir@
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..1588075
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,20 @@
+if(NOT BUILD_TESTING)
+    return()
+endif()
+
+if(BUILD_PY_MOD)
+    foreach(fileName ${mod_TEST_PY_FILES})
+        string(REPLACE "/" "__" testName "${fileName}")
+        set(workDir ${CMAKE_CURRENT_BINARY_DIR}/workDir/${testName})
+        file(MAKE_DIRECTORY ${workDir})
+        add_test(NAME ${testName}
+                COMMAND ${CMAKE_INSTALL_FULL_BINDIR}/mod -f ${CMAKE_CURRENT_LIST_DIR}/${fileName}.py
+                WORKING_DIRECTORY ${workDir})
+        set_tests_properties(${testName} PROPERTIES
+                ENVIRONMENT MOD_NUM_POST_THREADS=1)
+        add_coverage_case(${testName})
+    endforeach()
+endif()
+
+add_subdirectory(cmake_add_subdirectory)
+add_subdirectory(cmake_import)
diff --git a/test/cmake_add_subdirectory/CMakeLists.txt b/test/cmake_add_subdirectory/CMakeLists.txt
new file mode 100644
index 0000000..deaf893
--- /dev/null
+++ b/test/cmake_add_subdirectory/CMakeLists.txt
@@ -0,0 +1,20 @@
+set(workDir ${CMAKE_CURRENT_BINARY_DIR}/workDir/cmake_add_subdirectory_configure)
+file(MAKE_DIRECTORY ${workDir})
+add_test(NAME cmake_add_subdirectory_configure
+        COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"
+        -Dmod_DIR=${PROJECT_SOURCE_DIR}
+        -DBOOST_ROOT=${BOOST_ROOT}
+        -DWITH_CPLEX=${WITH_CPLEX}
+        -DCPLEX_DIR=${CPLEX_DIR}
+        -DWITH_OPENBABEL=${WITH_OPENBABEL}
+        -DWITH_PNAPI=${WITH_PNAPI}
+        -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
+        ${CMAKE_CURRENT_SOURCE_DIR}/project
+        WORKING_DIRECTORY ${workDir})
+add_test(NAME cmake_add_subdirectory_build
+        COMMAND ${CMAKE_COMMAND} --build .
+        WORKING_DIRECTORY ${workDir})
+set_tests_properties(cmake_add_subdirectory_configure PROPERTIES
+        FIXTURES_SETUP cmake_add_subdirectory)
+set_tests_properties(cmake_add_subdirectory_build PROPERTIES
+        FIXTURES_REQUIRED cmake_add_subdirectory)
diff --git a/test/cmake_add_subdirectory/project/CMakeLists.txt b/test/cmake_add_subdirectory/project/CMakeLists.txt
new file mode 100644
index 0000000..2f0b2b8
--- /dev/null
+++ b/test/cmake_add_subdirectory/project/CMakeLists.txt
@@ -0,0 +1,9 @@
+cmake_minimum_required(VERSION 3.10)
+
+project(CMakeTestProject CXX)
+
+add_subdirectory(${mod_DIR}
+        ${CMAKE_CURRENT_BINARY_DIR}/mod)
+
+add_executable(doStuff main.cpp)
+target_link_libraries(doStuff mod::libmod)
\ No newline at end of file
diff --git a/test/cmake_add_subdirectory/project/main.cpp b/test/cmake_add_subdirectory/project/main.cpp
new file mode 100644
index 0000000..d938bd4
--- /dev/null
+++ b/test/cmake_add_subdirectory/project/main.cpp
@@ -0,0 +1,8 @@
+#include 
+
+#include 
+
+int main() {
+	auto g = mod::graph::Graph::graphDFS("[T]");
+	std::cout << "Graph name:      " << g->getName() << "\n";
+}
\ No newline at end of file
diff --git a/test/cmake_import/CMakeLists.txt b/test/cmake_import/CMakeLists.txt
new file mode 100644
index 0000000..a245628
--- /dev/null
+++ b/test/cmake_import/CMakeLists.txt
@@ -0,0 +1,15 @@
+set(workDir ${CMAKE_CURRENT_BINARY_DIR}/workDir/cmake_import_configure)
+file(MAKE_DIRECTORY ${workDir})
+add_test(NAME cmake_import_configure
+        COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"
+        -DBOOST_ROOT=${BOOST_ROOT}
+        -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
+        ${CMAKE_CURRENT_SOURCE_DIR}/project
+        WORKING_DIRECTORY ${workDir})
+add_test(NAME cmake_import_build
+        COMMAND ${CMAKE_COMMAND} --build .
+        WORKING_DIRECTORY ${workDir})
+set_tests_properties(cmake_import_configure PROPERTIES
+        FIXTURES_SETUP cmake_import)
+set_tests_properties(cmake_import_build PROPERTIES
+        FIXTURES_REQUIRED cmake_import)
diff --git a/test/cmake_import/project/CMakeLists.txt b/test/cmake_import/project/CMakeLists.txt
new file mode 100644
index 0000000..ad3e8be
--- /dev/null
+++ b/test/cmake_import/project/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 3.10)
+
+project(CMakeTestProject CXX)
+
+find_package(mod REQUIRED)
+
+add_executable(doStuff main.cpp)
+target_link_libraries(doStuff mod::libmod)
\ No newline at end of file
diff --git a/test/cmake_import/project/main.cpp b/test/cmake_import/project/main.cpp
new file mode 100644
index 0000000..d938bd4
--- /dev/null
+++ b/test/cmake_import/project/main.cpp
@@ -0,0 +1,8 @@
+#include 
+
+#include 
+
+int main() {
+	auto g = mod::graph::Graph::graphDFS("[T]");
+	std::cout << "Graph name:      " << g->getName() << "\n";
+}
\ No newline at end of file
diff --git a/test/py/DGSmilesProblem.py b/test/py/DGSmilesProblem.py
new file mode 100644
index 0000000..63cd0f8
--- /dev/null
+++ b/test/py/DGSmilesProblem.py
@@ -0,0 +1,135 @@
+a = graphGMLString("""graph [
+	node [ id 0 label "C" ]
+	node [ id 1 label "C" ]
+	node [ id 2 label "C" ]
+	node [ id 3 label "C" ]
+	node [ id 4 label "C" ]
+	node [ id 5 label "C" ]
+	node [ id 6 label "O" ]
+	node [ id 7 label "H" ]
+	node [ id 8 label "H" ]
+	node [ id 9 label "H" ]
+	node [ id 10 label "H" ]
+	node [ id 11 label "H" ]
+	node [ id 12 label "H" ]
+	node [ id 13 label "H" ]
+	node [ id 14 label "H" ]
+	edge [ source 1 target 0 label "-" ]
+	edge [ source 2 target 1 label "-" ]
+	edge [ source 3 target 2 label "=" ]
+	edge [ source 4 target 3 label "-" ]
+	edge [ source 5 target 3 label "-" ]
+	edge [ source 5 target 1 label "=" ]
+	edge [ source 6 target 5 label "-" ]
+	edge [ source 7 target 0 label "-" ]
+	edge [ source 8 target 0 label "-" ]
+	edge [ source 9 target 0 label "-" ]
+	edge [ source 10 target 2 label "-" ]
+	edge [ source 11 target 4 label "-" ]
+	edge [ source 12 target 4 label "-" ]
+	edge [ source 13 target 4 label "-" ]
+	edge [ source 14 target 6 label "-" ]
+]
+""", "a")
+b = graphGMLString("""graph [
+	node [ id 0 label "H" ]
+	node [ id 1 label "H" ]
+	node [ id 2 label "H" ]
+	node [ id 3 label "H" ]
+	node [ id 4 label "C" ]
+	node [ id 5 label "H" ]
+	node [ id 6 label "H" ]
+	node [ id 7 label "O" ]
+	node [ id 8 label "H" ]
+	node [ id 9 label "C" ]
+	node [ id 10 label "H" ]
+	node [ id 11 label "C" ]
+	node [ id 12 label "C" ]
+	node [ id 13 label "C" ]
+	node [ id 14 label "C" ]
+	edge [ source 13 target 12 label "-" ]
+	edge [ source 9 target 13 label "-" ]
+	edge [ source 11 target 9 label "=" ]
+	edge [ source 4 target 11 label "-" ]
+	edge [ source 14 target 11 label "-" ]
+	edge [ source 14 target 13 label "=" ]
+	edge [ source 7 target 14 label "-" ]
+	edge [ source 1 target 12 label "-" ]
+	edge [ source 8 target 12 label "-" ]
+	edge [ source 5 target 12 label "-" ]
+	edge [ source 10 target 9 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+	edge [ source 3 target 4 label "-" ]
+	edge [ source 2 target 4 label "-" ]
+	edge [ source 6 target 7 label "-" ]
+]
+""", "b")
+p = ruleGMLString("""rule [
+left [
+	node [ id 0 label "C" ]
+	node [ id 1 label "C" ]
+	node [ id 2 label "C" ]
+	node [ id 3 label "C" ]
+	node [ id 4 label "C" ]
+	node [ id 5 label "C" ]
+	node [ id 6 label "O" ]
+	node [ id 7 label "H" ]
+	node [ id 8 label "H" ]
+	node [ id 9 label "H" ]
+	node [ id 10 label "H" ]
+	node [ id 11 label "H" ]
+	node [ id 12 label "H" ]
+	node [ id 13 label "H" ]
+	node [ id 14 label "H" ]
+	edge [ source 1 target 0 label "-" ]
+	edge [ source 2 target 1 label "-" ]
+	edge [ source 3 target 2 label "=" ]
+	edge [ source 4 target 3 label "-" ]
+	edge [ source 5 target 3 label "-" ]
+	edge [ source 5 target 1 label "=" ]
+	edge [ source 6 target 5 label "-" ]
+	edge [ source 7 target 0 label "-" ]
+	edge [ source 8 target 0 label "-" ]
+	edge [ source 9 target 0 label "-" ]
+	edge [ source 10 target 2 label "-" ]
+	edge [ source 11 target 4 label "-" ]
+	edge [ source 12 target 4 label "-" ]
+	edge [ source 13 target 4 label "-" ]
+	edge [ source 14 target 6 label "-" ]
+]
+right [
+	node [ id 90 label "H" ]
+	node [ id 91 label "H" ]
+	node [ id 92 label "H" ]
+	node [ id 93 label "H" ]
+	node [ id 94 label "C" ]
+	node [ id 95 label "H" ]
+	node [ id 96 label "H" ]
+	node [ id 97 label "O" ]
+	node [ id 98 label "H" ]
+	node [ id 99 label "C" ]
+	node [ id 910 label "H" ]
+	node [ id 911 label "C" ]
+	node [ id 912 label "C" ]
+	node [ id 913 label "C" ]
+	node [ id 914 label "C" ]
+	edge [ source 913 target 912 label "-" ]
+	edge [ source 99 target 913 label "-" ]
+	edge [ source 911 target 99 label "=" ]
+	edge [ source 94 target 911 label "-" ]
+	edge [ source 914 target 911 label "-" ]
+	edge [ source 914 target 913 label "=" ]
+	edge [ source 97 target 914 label "-" ]
+	edge [ source 91 target 912 label "-" ]
+	edge [ source 98 target 912 label "-" ]
+	edge [ source 95 target 912 label "-" ]
+	edge [ source 910 target 99 label "-" ]
+	edge [ source 90 target 94 label "-" ]
+	edge [ source 93 target 94 label "-" ]
+	edge [ source 92 target 94 label "-" ]
+	edge [ source 96 target 97 label "-" ]
+]
+]""")
+dg = dgRuleComp([a], addSubset(a) >> p)
+dg.calc()
+dg.print()
diff --git a/test/py/chem.py b/test/py/chem.py
new file mode 100644
index 0000000..c1072dc
--- /dev/null
+++ b/test/py/chem.py
@@ -0,0 +1,44 @@
+print("AtomId\n----------")
+a = AtomId()
+print(a)
+a = AtomId(42)
+print(a)
+print(int(a))
+
+print("Charge\n----------")
+a = Charge()
+print(a)
+a = Charge(-42)
+print(a)
+print(int(a))
+
+print("AtomData\n----------")
+a = AtomData()
+print(a.atomId)
+print(a.isotope)
+print(a.charge)
+print(a.radical)
+a = AtomData(AtomId(42), Isotope(60), Charge(-9), True)
+print("AtomData:", a)
+b = AtomData(AtomId(42), Isotope(60), Charge(-9), True)
+assert a == b
+g = graphDFS("[60Mo9-.]")
+v = next(iter(g.vertices))
+print("Vertex:", v.atomId, v.isotope, v.charge, v.radical)
+assert v.atomId == a.atomId
+assert v.isotope == a.isotope
+assert v.charge == a.charge
+assert a.radical == a.radical
+
+print("BondType\n----------")
+for a in [BondType.Invalid, BondType.Single, BondType.Aromatic, BondType.Double, BondType.Triple]:
+	print(repr(a))
+	if a != BondType.Invalid:
+		print(a)
+print(BondType.values)
+
+print("AtomId\n----------")
+print(AtomIds.Invalid)
+print(AtomIds.Max)
+for k, v in AtomIds.__dict__.items():
+	print(k, ":", v)
diff --git a/test/py/derivation.py b/test/py/derivation.py
new file mode 100644
index 0000000..7ad32fe
--- /dev/null
+++ b/test/py/derivation.py
@@ -0,0 +1,7 @@
+include("formoseCommon/grammar_H.py")
+
+d = Derivation()
+d.left = inputGraphs
+d.rule = inputRules[0]
+d.right = inputGraphs
+print("Derivation:\t", d)
diff --git a/test/py/dg/DGDump.dg b/test/py/dg/DGDump.dg
new file mode 100644
index 0000000..0472809
--- /dev/null
+++ b/test/py/dg/DGDump.dg
@@ -0,0 +1,205 @@
+numVertices:	94
+numEdges:	104
+numRules:	4
+vertex:	0	"Formaldehyde"	"C(=O)([H])[H]"
+vertex:	1	"Glycolaldehyde"	"O(C(C(=O)[H])([H])[H])[H]"
+vertex:	2	"p_0_0"	"O(C([H])=C([H])O[H])[H]"
+vertex:	3	"p_0_1"	"C([H])([H])(O[H])C(O[H])([H])C([H])=O"
+vertex:	4	"p_0_2"	"O(C(C([H])(O[H])C(O[H])([H])C([H])=O)([H])[H])[H]"
+vertex:	5	"p_0_3"	"C([H])([H])(O[H])C(O[H])=C([H])O[H]"
+vertex:	6	"p_0_4"	"O(C(C([H])(O[H])C(O[H])=C([H])O[H])([H])[H])[H]"
+vertex:	7	"p_0_5"	"O(C([H])(C([H])=O)C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	8	"p_0_6"	"O(C([H])(C([H])=O)C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	9	"p_0_7"	"C([H])([H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	10	"p_0_8"	"O(C(C([H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+vertex:	11	"p_0_9"	"C([H])([H])(O[H])C(O[H])([H])C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])=O"
+vertex:	12	"p_0_10"	"C([H])([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C([H])([H])O[H])=O)([H])O[H]"
+vertex:	13	"p_0_11"	"C([H])([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])=O"
+vertex:	14	"p_0_12"	"C([H])([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])=O)([H])O[H]"
+vertex:	15	"p_0_13"	"O(C(C([H])(O[H])C(O[H])([H])C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])=O)([H])[H])[H]"
+vertex:	16	"p_0_14"	"O(C(C([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C([H])([H])O[H])=O)([H])O[H])([H])[H])[H]"
+vertex:	17	"p_0_15"	"O(C(C([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])=O)([H])[H])[H]"
+vertex:	18	"p_0_16"	"O(C(C([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])=O)([H])O[H])([H])[H])[H]"
+vertex:	19	"p_0_17"	"O(C([H])(C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])=O)C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	20	"p_0_18"	"O(C([H])(C([H])(O[H])C(C(C([H])([H])O[H])=O)([H])O[H])C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	21	"p_0_19"	"O(C([H])(C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])=O)C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	22	"p_0_20"	"O(C([H])(C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])=O)([H])O[H])C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	23	"p_0_21"	"O(C([H])(C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])=O)C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	24	"p_0_22"	"O(C([H])(C([H])(O[H])C(C(C([H])([H])O[H])=O)([H])O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	25	"p_0_23"	"O(C([H])(C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])=O)C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	26	"p_0_24"	"O(C([H])(C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])=O)([H])O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	27	"p_0_25"	"C([H])([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])=O"
+vertex:	28	"p_0_26"	"C([H])([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])=O"
+vertex:	29	"p_0_27"	"C([H])([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])=O)([H])O[H]"
+vertex:	30	"p_0_28"	"O(C(C([H])(O[H])C(C(C([H])([H])O[H])=O)([H])O[H])([H])[H])[H]"
+vertex:	31	"p_0_29"	"O(C(C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])=O)([H])[H])[H]"
+vertex:	32	"p_0_30"	"O(C(C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])=O)([H])O[H])([H])[H])[H]"
+vertex:	33	"p_0_31"	"O(C(C(O[H])=C(O[H])C([H])(O[H])[H])([H])[H])[H]"
+vertex:	34	"p_0_32"	"O(C([H])(C([H])=O)C(C([H])([H])O[H])(O[H])C([H])(O[H])[H])[H]"
+vertex:	35	"p_0_33"	"O(C([H])(C([H])=O)C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H])[H]"
+vertex:	36	"p_0_34"	"O(C([H])(C([H])=O)C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H])[H]"
+vertex:	37	"p_0_35"	"C([H])([H])(O[H])C(O[H])(C([H])=O)C(C([H])([H])O[H])(O[H])C([H])(O[H])[H]"
+vertex:	38	"p_0_36"	"C([H])([H])(O[H])C(=O)C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])[H]"
+vertex:	39	"p_0_37"	"C([H])([H])(O[H])C(O[H])(C([H])=O)C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H]"
+vertex:	40	"p_0_38"	"C([H])([H])(O[H])C(=O)C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H]"
+vertex:	41	"p_0_39"	"C([H])([H])(O[H])C(O[H])(C([H])=O)C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H]"
+vertex:	42	"p_0_40"	"C([H])([H])(O[H])C(=O)C([H])(O[H])C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H]"
+vertex:	43	"p_0_41"	"O(C(C([H])(O[H])C(O[H])(C([H])=O)C(C([H])([H])O[H])(O[H])C([H])(O[H])[H])([H])[H])[H]"
+vertex:	44	"p_0_42"	"O(C(C([H])(O[H])C(=O)C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])[H])([H])[H])[H]"
+vertex:	45	"p_0_43"	"O(C(C([H])(O[H])C(O[H])(C([H])=O)C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H])([H])[H])[H]"
+vertex:	46	"p_0_44"	"O(C(C([H])(O[H])C(=O)C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H])([H])[H])[H]"
+vertex:	47	"p_0_45"	"O(C(C([H])(O[H])C(O[H])(C([H])=O)C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H])([H])[H])[H]"
+vertex:	48	"p_0_46"	"O(C(C([H])(O[H])C(=O)C([H])(O[H])C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H])([H])[H])[H]"
+vertex:	49	"p_0_47"	"C([H])([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	50	"p_0_48"	"O(C(C([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+vertex:	51	"p_0_49"	"O(C([H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	52	"p_0_50"	"O(C([H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	53	"p_0_51"	"C([H])([H])(O[H])C(O[H])(C([H])(O[H])[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	54	"p_0_52"	"O(C(C([H])(O[H])C(O[H])(C([H])(O[H])[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+vertex:	55	"p_0_53"	"C([H])([H])(O[H])C(O[H])([H])C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	56	"p_0_54"	"C([H])([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C([H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H]"
+vertex:	57	"p_0_55"	"C([H])([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	58	"p_0_56"	"C([H])([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H]"
+vertex:	59	"p_0_57"	"O(C(C([H])(O[H])C(O[H])([H])C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+vertex:	60	"p_0_58"	"O(C(C([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C([H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H])([H])[H])[H]"
+vertex:	61	"p_0_59"	"O(C(C([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+vertex:	62	"p_0_60"	"O(C(C([H])(O[H])C(O[H])([H])C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H])([H])[H])[H]"
+vertex:	63	"p_0_61"	"O(C([H])(C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	64	"p_0_62"	"O(C([H])(C([H])(O[H])C(C(C([H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H])C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	65	"p_0_63"	"O(C([H])(C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	66	"p_0_64"	"O(C([H])(C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H])C(C(C([H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	67	"p_0_65"	"O(C([H])(C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	68	"p_0_66"	"O(C([H])(C([H])(O[H])C(C(C([H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	69	"p_0_67"	"O(C([H])(C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	70	"p_0_68"	"O(C([H])(C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])[H])([H])O[H])[H]"
+vertex:	71	"p_0_69"	"C([H])([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	72	"p_0_70"	"C([H])([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	73	"p_0_71"	"C([H])([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H]"
+vertex:	74	"p_0_72"	"O(C(C([H])(O[H])C(C(C([H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H])([H])[H])[H]"
+vertex:	75	"p_0_73"	"O(C(C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+vertex:	76	"p_0_74"	"O(C(C([H])(O[H])C(C(C(C(O[H])([H])[H])([H])O[H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])O[H])([H])[H])[H]"
+vertex:	77	"p_0_75"	"O(C([H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])[H])[H]"
+vertex:	78	"p_0_76"	"O(C([H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H])[H]"
+vertex:	79	"p_0_77"	"O(C([H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H])[H]"
+vertex:	80	"p_0_78"	"C([H])([H])(O[H])C(O[H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])[H]"
+vertex:	81	"p_0_79"	"C([H])([H])(O[H])C(O[H])(C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	82	"p_0_80"	"C([H])([H])(O[H])C(O[H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H]"
+vertex:	83	"p_0_81"	"C([H])([H])(O[H])C(O[H])(C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	84	"p_0_82"	"C([H])([H])(O[H])C(O[H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H]"
+vertex:	85	"p_0_83"	"C([H])([H])(O[H])C(O[H])(C([H])(O[H])C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	86	"p_0_84"	"O(C(C([H])(O[H])C(O[H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])[H])([H])[H])[H]"
+vertex:	87	"p_0_85"	"O(C(C([H])(O[H])C(O[H])(C([H])(O[H])C(C([H])([H])O[H])(O[H])C([H])(O[H])[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+vertex:	88	"p_0_86"	"O(C(C([H])(O[H])C(O[H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H])([H])[H])[H]"
+vertex:	89	"p_0_87"	"O(C(C([H])(O[H])C(O[H])(C([H])(O[H])C(C(C(O[H])([H])[H])([H])O[H])(O[H])C([H])(O[H])[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+vertex:	90	"p_0_88"	"O(C(C([H])(O[H])C(O[H])(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H])([H])[H])[H]"
+vertex:	91	"p_0_89"	"O(C(C([H])(O[H])C(O[H])(C([H])(O[H])C(C(C([H])([H])O[H])(C([H])([H])O[H])O[H])([H])O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+vertex:	92	"p_0_90"	"C([H])([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H]"
+vertex:	93	"p_0_91"	"O(C(C([H])(O[H])C(C(O[H])([H])[H])(O[H])C(=O)C([H])(O[H])[H])([H])[H])[H]"
+rule:	1	"Keto-enol isomerization <-"
+rule:	3	"Aldol Addition <-"
+rule:	0	"Keto-enol isomerization ->"
+rule:	2	"Aldol Addition ->"
+edge:	94	0	-2 3 
+edge:	95	1	-3 2 
+edge:	96	2	-3 -1 4 
+edge:	97	2	-2 -3 5 
+edge:	98	0	-4 6 
+edge:	99	0	-5 7 
+edge:	100	2	-3 -4 8 
+edge:	101	2	-3 -5 9 
+edge:	102	3	-4 3 1 
+edge:	103	3	-5 2 3 
+edge:	104	1	-6 4 
+edge:	105	1	-6 10 
+edge:	106	1	-7 5 
+edge:	107	1	-7 11 
+edge:	108	2	-4 -6 12 
+edge:	109	2	-4 -6 13 
+edge:	110	2	-4 -7 14 
+edge:	111	2	-4 -7 15 
+edge:	112	2	-5 -6 16 
+edge:	113	2	-5 -6 17 
+edge:	114	2	-5 -7 18 
+edge:	115	2	-5 -7 19 
+edge:	116	2	-6 -8 20 
+edge:	117	2	-6 -8 21 
+edge:	118	2	-7 -8 22 
+edge:	119	2	-7 -8 23 
+edge:	120	2	-6 -9 24 
+edge:	121	2	-6 -9 25 
+edge:	122	2	-7 -9 26 
+edge:	123	2	-7 -9 27 
+edge:	124	2	-1 -6 28 
+edge:	125	2	-1 -6 11 
+edge:	126	2	-1 -7 29 
+edge:	127	2	-1 -7 30 
+edge:	128	2	-2 -6 29 
+edge:	129	2	-2 -6 31 
+edge:	130	2	-2 -7 32 
+edge:	131	2	-2 -7 33 
+edge:	132	0	-10 6 
+edge:	133	0	-11 34 
+edge:	134	0	-11 7 
+edge:	135	2	-3 -10 35 
+edge:	136	2	-3 -11 36 
+edge:	137	2	-3 -28 37 
+edge:	138	2	-6 -10 38 
+edge:	139	2	-6 -10 39 
+edge:	140	2	-6 -11 40 
+edge:	141	2	-6 -11 41 
+edge:	142	2	-6 -28 42 
+edge:	143	2	-6 -28 43 
+edge:	144	2	-7 -10 44 
+edge:	145	2	-7 -10 45 
+edge:	146	2	-7 -11 46 
+edge:	147	2	-7 -11 47 
+edge:	148	2	-7 -28 48 
+edge:	149	2	-7 -28 49 
+edge:	150	3	-11 1 6 
+edge:	151	3	-28 1 6 
+edge:	152	1	-34 11 
+edge:	153	2	-4 -34 50 
+edge:	154	2	-5 -34 51 
+edge:	155	2	-8 -34 52 
+edge:	156	2	-9 -34 53 
+edge:	157	2	-10 -34 54 
+edge:	158	2	-11 -34 55 
+edge:	159	2	-34 -12 56 
+edge:	160	2	-34 -13 57 
+edge:	161	2	-34 -14 58 
+edge:	162	2	-34 -15 59 
+edge:	163	2	-34 -16 60 
+edge:	164	2	-34 -17 61 
+edge:	165	2	-34 -18 62 
+edge:	166	2	-34 -19 63 
+edge:	167	2	-34 -20 64 
+edge:	168	2	-34 -21 65 
+edge:	169	2	-34 -22 66 
+edge:	170	2	-34 -23 67 
+edge:	171	2	-34 -24 68 
+edge:	172	2	-34 -25 69 
+edge:	173	2	-34 -26 70 
+edge:	174	2	-34 -27 71 
+edge:	175	2	-34 -28 72 
+edge:	176	2	-34 -29 73 
+edge:	177	2	-34 -30 74 
+edge:	178	2	-34 -31 75 
+edge:	179	2	-34 -32 76 
+edge:	180	2	-34 -33 77 
+edge:	181	2	-34 -35 78 
+edge:	182	2	-34 -36 79 
+edge:	183	2	-34 -37 80 
+edge:	184	2	-34 -38 81 
+edge:	185	2	-34 -39 82 
+edge:	186	2	-34 -40 83 
+edge:	187	2	-34 -41 84 
+edge:	188	2	-34 -42 85 
+edge:	189	2	-34 -43 86 
+edge:	190	2	-34 -44 87 
+edge:	191	2	-34 -45 88 
+edge:	192	2	-34 -46 89 
+edge:	193	2	-34 -47 90 
+edge:	194	2	-34 -48 91 
+edge:	195	2	-34 -49 92 
+edge:	196	2	-1 -34 93 
+edge:	197	2	-2 -34 94 
diff --git a/test/py/dg/abstract/test.py b/test/py/dg/abstract/test.py
new file mode 100644
index 0000000..b1e4123
--- /dev/null
+++ b/test/py/dg/abstract/test.py
@@ -0,0 +1,16 @@
+def doStuff(s):
+	dg = dgAbstract(s)
+	dg.print()
+	print("-"*80)
+	for e in dg.edges:
+		print(e)
+
+doStuff("a -> b")
+doStuff("a <=> b")
+doStuff("a + b -> a")
+doStuff("2 a + b -> 3 c")
+doStuff("a -> b b -> d + a d -> c c -> b")
+# test  null reactions
+doStuff("a -> b b + c -> b + c c + d <=> c + d d -> e")
+# test coefficient stuff
+doStuff("2a -> 2 b")
diff --git a/test/py/dg/dg.py b/test/py/dg/dg.py
new file mode 100644
index 0000000..08409d9
--- /dev/null
+++ b/test/py/dg/dg.py
@@ -0,0 +1,132 @@
+config.dg.printVertexIds = True
+include("../formoseCommon/grammar.py")
+
+config.dg.listUniverse = True
+config.dg.printVertexIds = True
+
+try:
+	dgDump(inputGraphs, inputRules, "nope.dg")
+	assert False
+except mod.InputError:
+	pass
+
+dg = dgDump(inputGraphs, inputRules, "DGDump.dg")
+print("Dump:\t", dg)
+
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs))
+print("RuleComp:\t", dg)
+dg.calc()
+print("GraphDatabase:\t", dg.graphDatabase)
+print("Products:\t", dg.products)
+f = dg.print()
+print("print file:", f)
+
+dg.dump()
+
+dg = dgRuleComp(inputGraphs, filterSubset(False))
+try:
+    dg.print()
+    assert False
+except LogicError:
+    pass
+
+
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules[0] >> inputRules[2])
+dg.calc()
+dg.list()
+
+educts = [glycolaldehyde]
+products = dg.products[0:1]
+eductVertices = [dg.findVertex(a) for a in educts]
+productVertices = [dg.findVertex(a) for a in products]
+e = dg.findEdge(eductVertices, productVertices)
+assert not e.isNull()
+print(e)
+e = dg.findEdge(educts, products)
+assert not e.isNull()
+print(e)
+dg.list()
+dg.listStats()
+
+dumpFirst = dg.dump()
+dg = dgDump(dg.graphDatabase, inputRules, CWDPath(dumpFirst))
+dumpSecond = dg.dump()
+import filecmp
+print("dumpFirst: %s, dumpSecond: %s" % (dumpFirst, dumpSecond))
+assert filecmp.cmp(dumpFirst, dumpSecond)
+
+postSection("Complete")
+dg.print()
+
+ders = []
+for e in dg.edges:
+    if len(e.rules) == 0:
+        d = Derivation()
+        d.left = [a.graph for a in e.sources]
+        d.right = [a.graph for a in e.dg.targets]
+        ders.append(d)
+    else:
+        for r in e.rules:
+            d = Derivation()
+            d.left = [a.graph for a in e.sources]
+            d.right = [a.graph for a in e.targets]
+            d.rule = r
+            ders.append(d)
+dg = dgDerivations(ders)
+dg.print()
+
+postSection("Non")
+printer = DGPrinter()
+printer.pushVertexVisible(False)
+dg.print(printer)
+
+postSection("Not Input")
+printer = DGPrinter()
+printer.pushVertexVisible(lambda g, dg: all(g != a for a in inputGraphs))
+dg.print(printer)
+
+postSection("Highlight")
+printer = DGPrinter()
+printer.pushVertexColour(lambda g, dg: "Blue" if g == formaldehyde else "")
+dg.print(printer)
+
+postSection("Properties")
+printer.pushVertexLabel(lambda g, dg: "|V|=" + str(g.numVertices))
+printer.pushEdgeLabel(lambda d: "d=" + str(d))
+dg.print(printer)
+printer.graphPrinter.withIndex = True
+dg.print(printer)
+
+
+print("numVertices:", dg.numVertices)
+for v in dg.vertices:
+	assert v.dg == dg
+	print(v.id, v.inDegree, v.outDegree, v.graph)
+	print("\tin:", end="")
+	for e in v.inEdges:
+		print("", e.id, end="")
+	print()
+	print("\tout:", end="")
+	for e in v.outEdges:
+		print("", e.id, end="")
+	print()
+	assert dg.findVertex(v.graph) == v
+print("numEdges:", dg.numEdges)
+for e in dg.edges:
+	assert e.dg == dg
+	print(e.id, e.numSources, e.numTargets, "{", end="")
+	for s in e.sources:
+		print("", s.id, end="")
+	print(" }, {", end="")
+	for r in e.rules:
+		print("", str(r), end="")
+	print(" }, {", end="")
+	for t in e.targets:
+		print("", t.id, end="")
+	print(" }", end="")
+	print("  ", e.inverse)
+	e.print()
+	e.printTransitionState()
+
+
+# TODO: test the __eq__ operator
diff --git a/test/py/dg/dgDepiction.py b/test/py/dg/dgDepiction.py
new file mode 100644
index 0000000..fc003de
--- /dev/null
+++ b/test/py/dg/dgDepiction.py
@@ -0,0 +1,21 @@
+include("../formoseCommon/grammar.py")
+
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs)
+	>> rightPredicate[lambda d: all(a.vLabelCount("C") <= 4 for a in d.right)](
+		repeat(inputRules)
+	)
+)
+dg.calc()
+
+postSection("Vertex Graphs")
+for v in dg.vertices:
+	v.graph.print()
+
+printer = DGPrinter()
+postSection("Complete")
+dg.print(printer)
+
+
+
+dg = dgAbstract("2 A -> 3 B")
+dg.print()
diff --git a/test/py/dg/dgDiff.py b/test/py/dg/dgDiff.py
new file mode 100644
index 0000000..fb078d2
--- /dev/null
+++ b/test/py/dg/dgDiff.py
@@ -0,0 +1,34 @@
+def makeGraph(name):
+	return graphDFS("[%s]" % name)
+def makeRule(name):
+	return ruleGMLString('rule [ ruleID "%s" ]' % name)
+def makeDer(left, rule, right):
+	d = Derivation()
+	d.left = left
+	d.rule = rule
+	d.right = right
+	return d
+
+a = makeGraph("a")
+b = makeGraph("b")
+c = makeGraph("c")
+d = makeGraph("d")
+r1 = makeRule("r1")
+r2 = makeRule("r2")
+r3 = makeRule("r3")
+r4 = makeRule("r4")
+
+print("DG1")
+dg1 = dgDerivations([
+	makeDer([a], r1, [b]),
+	makeDer([a], r2, [b]),
+	makeDer([a, a], r1, [b]),
+])
+print("DG2")
+dg2 = dgDerivations([
+	makeDer([a, a], r2, [b]),
+	makeDer([a], r1, [b]),
+])
+diffDGs(dg1, dg2)
+dg1.print()
+dg2.print()
diff --git a/test/py/dg/dgInlineGraphs.py b/test/py/dg/dgInlineGraphs.py
new file mode 100644
index 0000000..4db6096
--- /dev/null
+++ b/test/py/dg/dgInlineGraphs.py
@@ -0,0 +1,15 @@
+include("../formoseCommon/grammar.py")
+
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules[0] >> inputRules[2])
+dg.calc()
+
+
+p = DGPrinter()
+p.withInlineGraphs = True
+dg.print(p)
+
+p = GraphPrinter()
+p.setMolDefault()
+p.thick = True
+for v in dg.vertices:
+    v.graph.print(p)
diff --git a/test/py/dg/dgPrintDPO.py b/test/py/dg/dgPrintDPO.py
new file mode 100644
index 0000000..5b657e5
--- /dev/null
+++ b/test/py/dg/dgPrintDPO.py
@@ -0,0 +1,11 @@
+include("../formoseCommon/grammar.py")
+dg = dgRuleComp(inputGraphs,
+	addSubset(inputGraphs)
+	>> rightPredicate[lambda d: all(g.vLabelCount("C") <= 4 for g in d.right)](
+		repeat(inputRules)
+	)
+)
+dg.calc()
+dg.print()
+for e in dg.edges:
+	e.print()
diff --git a/test/py/dg/dgPrintData.py b/test/py/dg/dgPrintData.py
new file mode 100644
index 0000000..ad25d12
--- /dev/null
+++ b/test/py/dg/dgPrintData.py
@@ -0,0 +1,26 @@
+include("../formoseCommon/grammar.py")
+
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs)
+	>> rightPredicate[lambda d: all(a.vLabelCount("C") <= 4 for a in d.right)](
+		repeat(inputRules)
+	)
+)
+dg.calc()
+
+data = DGPrintData(dg)
+printer = DGPrinter()
+postSection("Default")
+dg.print(printer, data)
+postSection("Individual Formaldehyde")
+for e in dg.edges:
+	if formaldehyde in (v.graph for v in e.sources):
+		data.reconnectTail(e, 0, formaldehyde, e.id)
+	if formaldehyde in (v.graph for v in e.targets):
+		data.reconnectHead(e, 0, formaldehyde, e.id)
+dg.print(printer, data)
+postSection("All Duplicates")
+data = DGPrintData(dg)
+for e in dg.edges:
+	for v in e.sources: data.reconnectTail(e, 0, v.graph, e.id)
+	for v in e.targets: data.reconnectHead(e, 0, v.graph, e.id)
+dg.print(printer, data)
diff --git a/test/py/dg/dgPrinter.py b/test/py/dg/dgPrinter.py
new file mode 100644
index 0000000..f945fe2
--- /dev/null
+++ b/test/py/dg/dgPrinter.py
@@ -0,0 +1,56 @@
+include("../formoseCommon/grammar.py")
+
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs)
+	>> rightPredicate[lambda d: all(a.vLabelCount("C") <= 4 for a in d.right)](
+		repeat(inputRules)
+	)
+)
+dg.calc()
+
+printer = DGPrinter()
+printer.withShortcutEdges = False
+printer.withGraphImages = False
+printer.labelsAsLatexMath = False
+dg.print(printer)
+
+printer = DGPrinter()
+printer.vertexLabelSep = "\circ_V{}"
+printer.edgeLabelSep = "\circ_E{}"
+printer.pushVertexLabel(lambda g, dg: "g_{" + str(g.id) + "}")
+printer.pushEdgeLabel(lambda e: "name=" + next(iter(e.rules)).name)
+
+dg.print(printer)
+
+printer.popVertexLabel()
+printer.popEdgeLabel()
+printer.pushVertexVisible(lambda g, dg: g.vLabelCount("C") != 1)
+printer.pushEdgeVisible(lambda e: False if e.numTargets == 2 and e.dg.findVertex(formaldehyde) not in e.targets else True)
+printer.withGraphName = False
+printer.withRuleName = True
+printer.withRuleId = False
+dg.print(printer)
+printer.withShortcutEdgesAfterVisibility = True
+dg.print(printer)
+printer.popVertexVisible()
+printer.popEdgeVisible()
+
+printer = DGPrinter()
+printer.pushVertexColour(lambda g, dg: "Green" if g == formaldehyde else "", True)
+printer.pushVertexColour(lambda g, dg: "Blue" if g.vLabelCount("C") == 4 else "", False)
+printer.pushVertexColour(lambda g, dg: "Purple" if g.vLabelCount("C") % 2 == 0 else "", True)
+printer.pushEdgeColour(lambda e: "Red" if any(v.graph.vLabelCount("C") == 3 for v in e.sources) else "")
+dg.print(printer)
+printer.popVertexColour()
+printer.popVertexColour()
+printer.popVertexColour()
+printer.popEdgeColour()
+
+printer = DGPrinter()
+dg = dgAbstract("2 A -> B")
+dg.print(printer)
+dg = dgAbstract("3 A -> B")
+dg.print(printer)
+dg = dgAbstract("4 A -> B")
+dg.print(printer)
+dg = dgAbstract("5 A -> B")
+dg.print(printer)
diff --git a/test/py/dg/dpoPrinting.py b/test/py/dg/dpoPrinting.py
new file mode 100644
index 0000000..5a5ce42
--- /dev/null
+++ b/test/py/dg/dpoPrinting.py
@@ -0,0 +1,32 @@
+ruleGMLString("""rule [
+	left [
+		node [ id 1 label "B" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		node [ id 2 label "C" ]
+		edge [ source 0 target 1 label "-" ]
+		edge [ source 1 target 2 label "-" ]
+	]
+	right [
+		node [ id 1 label "Q" ]
+	]
+]""")
+ruleGMLString("""rule [
+	left [
+		node [ id 1 label "B" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		edge [ source 0 target 1 label "-" ]
+	]
+	right [
+		node [ id 1 label "Q" ]
+	]
+]""")
+graphDFS("[A][B][C]")
+
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules)
+dg.calc()
+for e in dg.edges:
+	e.print()
diff --git a/test/py/dg/dupGraphs.py b/test/py/dg/dupGraphs.py
new file mode 100644
index 0000000..57a820a
--- /dev/null
+++ b/test/py/dg/dupGraphs.py
@@ -0,0 +1,35 @@
+a = smiles("O")
+b = smiles("O")
+
+def fail1(f):
+	try:
+		print("Trying")
+		dg = f()
+		assert False
+	except LogicError as e:
+		print("\t%s" % str(e))
+def fail2(f):
+	try:
+		print("Trying")
+		dg = f()
+		print("\tCreated")
+		dg.calc()
+		assert False
+	except LogicError as e:
+		print("\t%s" % str(e))
+
+fail1(lambda: dgRuleComp([a, b], filterSubset(False)))
+fail1(lambda: dgRuleComp([a], addSubset(b)))
+fail1(lambda: dgRuleComp([], addSubset(a) >> addSubset(b)))
+
+fail2(lambda: dgRuleComp([a], addSubset(lambda: [b])))
+fail2(lambda: dgRuleComp([], addSubset(a) >> addSubset(lambda: [b])))
+fail2(lambda: dgRuleComp([], addSubset(lambda: [a]) >> addSubset(lambda: [b])))
+
+dgRuleComp([a, a], filterSubset(False))
+dgRuleComp([a], addSubset(a))
+dgRuleComp([], addSubset(a) >> addSubset(a))
+
+dgRuleComp([a], addSubset(lambda: [a])).calc()
+dgRuleComp([], addSubset(a) >> addSubset(lambda: [a])).calc()
+dgRuleComp([], addSubset(lambda: [a]) >> addSubset(lambda: [a])).calc()
diff --git a/test/py/dgStrat/add.py b/test/py/dgStrat/add.py
new file mode 100644
index 0000000..d92d820
--- /dev/null
+++ b/test/py/dgStrat/add.py
@@ -0,0 +1,30 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+print("===> addUniverse(graph)")
+handleDG(addUniverse(inputGraphs[0]))
+
+print("===> addUniverse(graphs)")
+handleDG(addUniverse(inputGraphs))
+
+print("===> addSubset(inputGraphsraph)")
+handleDG(addSubset(inputGraphs[0]))
+print("===> addSubset(inputGraphsraphs)")
+handleDG(addSubset(inputGraphs))
+
+print("===> addSubset(inputGraphsraph, graphs)")
+a = smiles("O", add=False)
+handleDG(addSubset(a, inputGraphs))
+
+
+print("===> addUniverse(lambda)")
+handleDG(addUniverse(lambda: [a]))
+
+print("===> addSubset(lambda)")
+handleDG(addSubset(lambda: [a]))
+
+dynGraphs = []
+def setDynGraphs(gs):
+	dynGraphs.append(a)
+print("===> add(lambda) dynamic test")
+handleDG(addUniverse(lambda: dynGraphs) >> execute(setDynGraphs) >> addUniverse(lambda: dynGraphs))
diff --git a/test/py/dgStrat/common.py b/test/py/dgStrat/common.py
new file mode 100644
index 0000000..dd922c3
--- /dev/null
+++ b/test/py/dgStrat/common.py
@@ -0,0 +1,8 @@
+config.dg.listUniverse = True
+config.dg.calculateVerbose = True
+
+def handleDG(strat):
+	dg = dgRuleComp(inputGraphs, strat)
+	dg.calc()
+	dg.list()
+	dg.print()
diff --git a/test/py/dgStrat/derivationPredicates.py b/test/py/dgStrat/derivationPredicates.py
new file mode 100644
index 0000000..a4e8165
--- /dev/null
+++ b/test/py/dgStrat/derivationPredicates.py
@@ -0,0 +1,28 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+config.dg.calculatePredicatesVerbose = True
+
+filterFunc = True
+print("===> True, API left")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeLeftPredicate(filterFunc, dgStrat(inputRules)))
+print("===> True, API right")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeRightPredicate(filterFunc, dgStrat(inputRules)))
+
+filterFunc = False
+print("===> False, API left")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeLeftPredicate(filterFunc, dgStrat(inputRules)))
+print("===> False, API right")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeRightPredicate(filterFunc, dgStrat(inputRules)))
+
+filterFunc = lambda d: len(d.left) == 2
+print("===> lambda, API left")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeLeftPredicate(filterFunc, dgStrat(inputRules)))
+print("===> lambda, API right")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeRightPredicate(filterFunc, dgStrat(inputRules)))
+
+
+print("==> nice left")
+handleDG(addSubset(inputGraphs) >> leftPredicate[filterFunc](inputRules))
+print("==> nice right")
+handleDG(addSubset(inputGraphs) >> rightPredicate[filterFunc](inputRules))
diff --git a/test/py/dgStrat/execute.py b/test/py/dgStrat/execute.py
new file mode 100644
index 0000000..d53827c
--- /dev/null
+++ b/test/py/dgStrat/execute.py
@@ -0,0 +1,10 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+def exeFunc(gs):
+	print(gs)
+print("===> API")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeExecute(exeFunc)
+	>> filterSubset(lambda g1, gs, first: g1.numVertices < 5)
+	>> DGStrat.makeExecute(exeFunc)
+)
diff --git a/test/py/dgStrat/filter.py b/test/py/dgStrat/filter.py
new file mode 100644
index 0000000..7279d41
--- /dev/null
+++ b/test/py/dgStrat/filter.py
@@ -0,0 +1,35 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+filterFunc = True
+print("===> both, True, API")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeFilter(True, filterFunc))
+print("===> subset, True, API")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeFilter(False, filterFunc))
+
+filterFunc = False
+print("===> both, False, API")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeFilter(True, filterFunc))
+print("===> subset, False, API")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeFilter(False, filterFunc))
+
+filterFunc = lambda g, gs, first: (g.numVertices < 60
+		and len(gs.subset) < 40
+		and len(gs.universe) < 5
+	)
+filterFunc_lambda = filterFunc
+def filterFunc(g, gs, first):
+	print("subset: " + str(gs.subset))
+	print("universe: " + str(gs.universe))
+	return filterFunc_lambda(g, gs, first)
+
+print("===> both, lambda, API")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeFilter(True, filterFunc))
+print("===> subset, lambda, API")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeFilter(False, filterFunc))
+
+
+print("===> both, lambda, nice")
+handleDG(addSubset(inputGraphs) >> filterUniverse(filterFunc))
+print("===> subset, lambda, nice")
+handleDG(addSubset(inputGraphs) >> repeat[3](inputRules >> filterSubset(filterFunc)))
diff --git a/test/py/dgStrat/parallel.py b/test/py/dgStrat/parallel.py
new file mode 100644
index 0000000..8560801
--- /dev/null
+++ b/test/py/dgStrat/parallel.py
@@ -0,0 +1,17 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+config.dg.listUniverse = True
+config.dg.calculateVerbose = True
+
+print("==> explicit call, explicit list")
+handleDG(DGStrat.makeParallel([
+	dgStrat(inputRules[0]),
+	dgStrat(inputRules[1])
+	]))
+
+print("==> rule list")
+handleDG(inputRules)
+
+print("==> rule set")
+handleDG({inputRules[0], inputRules[1]})
diff --git a/test/py/dgStrat/repeat.py b/test/py/dgStrat/repeat.py
new file mode 100644
index 0000000..18da3d5
--- /dev/null
+++ b/test/py/dgStrat/repeat.py
@@ -0,0 +1,11 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+print("==> explicit call, bound, simple")
+handleDG(DGStrat.makeRepeat(1, addSubset(inputGraphs)))
+
+print("==> bound, simple")
+handleDG(repeat[1](addSubset(inputGraphs)))
+
+print("==> no bound, simple")
+handleDG(repeat(addSubset(inputGraphs)))
diff --git a/test/py/dgStrat/revive.py b/test/py/dgStrat/revive.py
new file mode 100644
index 0000000..2ae7334
--- /dev/null
+++ b/test/py/dgStrat/revive.py
@@ -0,0 +1,11 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+print("==> normal")
+handleDG(addSubset(inputGraphs) >> inputRules[0])
+
+print("==> with explicit revive")
+handleDG(addSubset(inputGraphs) >> DGStrat.makeRevive(dgStrat(inputRules[0])))
+
+print("==> with implicit revive")
+handleDG(addSubset(inputGraphs) >> revive(inputRules[0]))
diff --git a/test/py/dgStrat/rule.py b/test/py/dgStrat/rule.py
new file mode 100644
index 0000000..ab43b42
--- /dev/null
+++ b/test/py/dgStrat/rule.py
@@ -0,0 +1,4 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+handleDG(addSubset(inputGraphs) >> inputRules[0])
diff --git a/test/py/dgStrat/sequence.py b/test/py/dgStrat/sequence.py
new file mode 100644
index 0000000..f8d6a44
--- /dev/null
+++ b/test/py/dgStrat/sequence.py
@@ -0,0 +1,11 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+print("===> seq 2")
+handleDG(addUniverse(formaldehyde) >> addSubset(glycolaldehyde))
+
+print("===> seq 3 left")
+handleDG(addUniverse(formaldehyde) >> addSubset(glycolaldehyde) >> addSubset(formaldehyde))
+
+print("===> seq 3 right")
+handleDG(addUniverse(formaldehyde) >> (addSubset(glycolaldehyde) >> addSubset(formaldehyde)))
diff --git a/test/py/dgStrat/sort.py b/test/py/dgStrat/sort.py
new file mode 100644
index 0000000..6210276
--- /dev/null
+++ b/test/py/dgStrat/sort.py
@@ -0,0 +1,17 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+less = lambda g1, g2, gs: g1.numVertices > g2.numVertices
+print("===> API")
+handleDG(
+	addSubset(inputGraphs) >> repeat[2](inputRules)
+	>> DGStrat.makeSort(False, less)
+	>> DGStrat.makeSort(True, less)
+)
+
+print("===> nice")
+handleDG(
+	addSubset(inputGraphs) >> repeat[2](inputRules)
+	>> sortSubset(less)
+	>> sortUniverse(less)
+)
diff --git a/test/py/dgStrat/splitToIsomorphs.gml b/test/py/dgStrat/splitToIsomorphs.gml
new file mode 100644
index 0000000..036f529
--- /dev/null
+++ b/test/py/dgStrat/splitToIsomorphs.gml
@@ -0,0 +1,10 @@
+rule [
+	ruleID "Split to isomorphms"
+	left [
+		edge [ source 1 target 2 label "-" ]
+	]
+	context [
+		node [ id 1 label "Q" ]
+		node [ id 2 label "Q" ]
+	]
+]
diff --git a/test/py/dgStrat/take.py b/test/py/dgStrat/take.py
new file mode 100644
index 0000000..ededfde
--- /dev/null
+++ b/test/py/dgStrat/take.py
@@ -0,0 +1,16 @@
+include("../formoseCommon/grammar.py")
+include("common.py")
+
+print("===> API")
+handleDG(
+	addSubset(inputGraphs) >> repeat[2](inputRules)
+	>> DGStrat.makeTake(False, 1)
+	>> DGStrat.makeTake(True, 0)
+)
+
+print("===> nice")
+handleDG(
+	addSubset(inputGraphs) >> repeat[2](inputRules)
+	>> takeSubset(1)
+	>> takeUniverse(0)
+)
diff --git a/test/py/dgStrat/testSplitToIsomorphs.py b/test/py/dgStrat/testSplitToIsomorphs.py
new file mode 100644
index 0000000..895214d
--- /dev/null
+++ b/test/py/dgStrat/testSplitToIsomorphs.py
@@ -0,0 +1,8 @@
+rSplit = ruleGML("splitToIsomorphs.gml")
+rSplit.print()
+g1 = graphDFS("[Q][Q]")
+dg = dgRuleComp(inputGraphs, addSubset(g1) >> rSplit)
+config.dg.calculateVerbose = True
+dg.calc()
+dg.print()
+for a in dg.products: a.print()
diff --git a/test/py/formoseCommon/aldol_addition_backward.gml b/test/py/formoseCommon/aldol_addition_backward.gml
new file mode 100644
index 0000000..5f8cfcd
--- /dev/null
+++ b/test/py/formoseCommon/aldol_addition_backward.gml
@@ -0,0 +1,37 @@
+rule [
+	ruleID "Aldol Addition <-"	
+	left [
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "=" ]
+		edge [ source 5 target 6 label "-" ]
+
+		edge [ source 4 target 5 label "-" ]
+		edge [ source 6 target 1 label "-" ]
+	]
+	context [
+		node [ id 1 label "C" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "O" ]
+		node [ id 4 label "H" ]
+		node [ id 5 label "O" ]
+		node [ id 6 label "C" ]
+	]
+	right [
+		edge [ source 1 target 2 label "=" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 3 target 4 label "-" ]
+		edge [ source 5 target 6 label "=" ]
+	]	
+	constrainAdj [
+		id 2
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+	constrainAdj [
+		id 6
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+]
diff --git a/test/py/formoseCommon/aldol_addition_backward_H.gml b/test/py/formoseCommon/aldol_addition_backward_H.gml
new file mode 100644
index 0000000..868e93a
--- /dev/null
+++ b/test/py/formoseCommon/aldol_addition_backward_H.gml
@@ -0,0 +1,41 @@
+rule [
+	ruleID "Aldol Addition H <-"	
+	left [
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "=" ]
+		edge [ source 5 target 6 label "-" ]
+
+		edge [ source 4 target 5 label "-" ]
+		edge [ source 6 target 1 label "-" ]
+	]
+	context [
+		node [ id 1 label "C" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "O" ]
+		node [ id 4 label "H" ]
+		node [ id 5 label "O" ]
+		node [ id 6 label "C" ]
+		node [ id 7 label "H" ]
+		edge [ source 7 target 6 label "-" ]
+		node [ id 8 label "H" ]
+		edge [ source 1 target 8 label "-" ]
+	]
+	right [
+		edge [ source 1 target 2 label "=" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 3 target 4 label "-" ]
+		edge [ source 5 target 6 label "=" ]
+	]	
+	constrainAdj [
+		id 2
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+	constrainAdj [
+		id 6
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+]
diff --git a/test/py/formoseCommon/aldol_addition_forward.gml b/test/py/formoseCommon/aldol_addition_forward.gml
new file mode 100644
index 0000000..dc03eb9
--- /dev/null
+++ b/test/py/formoseCommon/aldol_addition_forward.gml
@@ -0,0 +1,37 @@
+rule [
+	ruleID "Aldol Addition ->"	
+	left [
+		edge [ source 1 target 2 label "=" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 3 target 4 label "-" ]
+		edge [ source 5 target 6 label "=" ]
+	]
+	context [
+		node [ id 1 label "C" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "O" ]
+		node [ id 4 label "H" ]
+		node [ id 5 label "O" ]
+		node [ id 6 label "C" ]
+	]
+	right [
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "=" ]
+		edge [ source 5 target 6 label "-" ]
+
+		edge [ source 4 target 5 label "-" ]
+		edge [ source 6 target 1 label "-" ]
+	]	
+	constrainAdj [
+		id 2
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+	constrainAdj [
+		id 6
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+]
diff --git a/test/py/formoseCommon/aldol_addition_forward_H.gml b/test/py/formoseCommon/aldol_addition_forward_H.gml
new file mode 100644
index 0000000..8c2ddc0
--- /dev/null
+++ b/test/py/formoseCommon/aldol_addition_forward_H.gml
@@ -0,0 +1,41 @@
+rule [
+	ruleID "Aldol Addition H ->"	
+	left [
+		edge [ source 1 target 2 label "=" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 3 target 4 label "-" ]
+		edge [ source 5 target 6 label "=" ]
+	]
+	context [
+		node [ id 1 label "C" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "O" ]
+		node [ id 4 label "H" ]
+		node [ id 5 label "O" ]
+		node [ id 6 label "C" ]
+		node [ id 7 label "H" ]
+		edge [ source 7 target 6 label "-" ]
+		node [ id 8 label "H" ]
+		edge [ source 1 target 8 label "-" ]
+	]
+	right [
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "=" ]
+		edge [ source 5 target 6 label "-" ]
+
+		edge [ source 4 target 5 label "-" ]
+		edge [ source 6 target 1 label "-" ]
+	]	
+	constrainAdj [
+		id 2
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+	constrainAdj [
+		id 6
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+]
diff --git a/test/py/formoseCommon/grammar.py b/test/py/formoseCommon/grammar.py
new file mode 100644
index 0000000..7be4637
--- /dev/null
+++ b/test/py/formoseCommon/grammar.py
@@ -0,0 +1,6 @@
+formaldehyde = smiles("C=O", "Formaldehyde")
+glycolaldehyde = smiles( "OCC=O", "Glycolaldehyde")
+ketoEnol_F = ruleGML("keto_enol_forward.gml")
+ketoEnol_B = ruleGML("keto_enol_backward.gml")
+aldolAdd_F = ruleGML("aldol_addition_forward.gml")
+aldolAdd_B = ruleGML("aldol_addition_backward.gml")
diff --git a/test/py/formoseCommon/grammar_H.py b/test/py/formoseCommon/grammar_H.py
new file mode 100644
index 0000000..73ac8de
--- /dev/null
+++ b/test/py/formoseCommon/grammar_H.py
@@ -0,0 +1,6 @@
+formaldehyde = smiles("C=O", "Formaldehyde")
+glycolaldehyde = smiles("OCC=O", "Glycolaldehyde")
+ketoEnol_F = ruleGML("keto_enol_forward.gml")
+ketoEnol_B = ruleGML("keto_enol_backward.gml")
+aldolAdd_F = ruleGML("aldol_addition_forward_H.gml")
+aldolAdd_B = ruleGML("aldol_addition_backward_H.gml")
diff --git a/test/py/formoseCommon/keto_enol_backward.gml b/test/py/formoseCommon/keto_enol_backward.gml
new file mode 100644
index 0000000..7bccc5e
--- /dev/null
+++ b/test/py/formoseCommon/keto_enol_backward.gml
@@ -0,0 +1,26 @@
+rule [
+	ruleID "Keto-enol isomerization <-"
+	left [
+		edge [ source 1 target 2 label "=" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 3 target 4 label "-" ]
+	]
+	context [
+		node [ id 1 label "C" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "O" ]
+		node [ id 4 label "H" ]
+	]
+	right [
+		edge [ source 1 target 4 label "-" ]
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "=" ]
+	]
+	constrainAdj [
+		id 2
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+]	
+
diff --git a/test/py/formoseCommon/keto_enol_forward.gml b/test/py/formoseCommon/keto_enol_forward.gml
new file mode 100644
index 0000000..56a9bdd
--- /dev/null
+++ b/test/py/formoseCommon/keto_enol_forward.gml
@@ -0,0 +1,26 @@
+rule [
+	ruleID "Keto-enol isomerization ->"
+	left [
+		edge [ source 1 target 4 label "-" ]
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "=" ]
+	]
+	context [
+		node [ id 1 label "C" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "O" ]
+		node [ id 4 label "H" ]
+	]
+	right [
+		edge [ source 1 target 2 label "=" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 3 target 4 label "-" ]
+	]
+	constrainAdj [
+		id 2
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+]	
+
diff --git a/test/py/function.py b/test/py/function.py
new file mode 100644
index 0000000..02d0e3f
--- /dev/null
+++ b/test/py/function.py
@@ -0,0 +1,30 @@
+include("formoseCommon/grammar.py")
+
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules[0] >> inputRules[2])
+dg.calc()
+dg.list()
+
+printer = DGPrinter()
+postSection("Const False")
+printer.pushVertexVisible(False)
+dg.print(printer)
+printer.popVertexVisible()
+postSection("Const True")
+printer.pushVertexVisible(True)
+dg.print(printer)
+printer.popVertexVisible()
+
+postSection("Func")
+def f(g, dg): return all(g != a for a in inputGraphs)
+printer.pushVertexVisible(f)
+dg.print(printer)
+printer.popVertexVisible()
+
+printer.pushVertexVisible(True)
+dg.print(printer)
+printer.popVertexVisible()
+
+postSection("Lambda")
+printer.pushVertexVisible(lambda g, dg: all(g != a for a in inputGraphs))
+dg.print(printer)
+printer.popVertexVisible()
diff --git a/test/py/graph/graph.gml b/test/py/graph/graph.gml
new file mode 100644
index 0000000..b94a297
--- /dev/null
+++ b/test/py/graph/graph.gml
@@ -0,0 +1,6 @@
+graph [
+	edge [ source 0 target 1 label "Q" ]
+	node [ id 1 label 
+		"A" ]
+	node [ id 0 label "B" ]
+]
diff --git a/test/py/graph/graph.py b/test/py/graph/graph.py
new file mode 100644
index 0000000..4691fd7
--- /dev/null
+++ b/test/py/graph/graph.py
@@ -0,0 +1,123 @@
+graphGMLString("""
+	graph [ node [ id 0 label "C" ] ]
+""")
+graphGML("graph.gml")
+a = graphGML("graph.gml")
+print("a:\t", a)
+with open("myGraph.gml", "w") as f:
+	f.write(a.getGMLString())
+a = graphGML(CWDPath("myGraph.gml"))
+
+graphDFS("OCC=O")
+a = graphDFS("OCC=O")
+print("a:\t", a)
+
+smiles("O")
+a = smiles("O")
+print("a:\t", a)
+
+smiles("[O]")
+for a in inputGraphs: a.print()
+
+print("inputGraphs:\t", inputGraphs)
+
+print("id:\t", a.id)
+print("str:\t", a)
+print("repr:\t", repr(a))
+
+a = graphDFS("COCC-O-C#N")
+a.print()
+a = graphDFS("COCC")
+a.print()
+a.printGML()
+print(a.getGMLString())
+
+print("name", "smiles", "graphDFS", "linearEncoding", sep="\t")
+print(a.name, a.smiles, a.graphDFS, a.linearEncoding, sep="\t")
+
+print("numVertices:\t", a.numVertices)
+print("numEdges:\t", a.numEdges)
+print("isMolecule:\t", a.isMolecule)
+print("energy:\t", a.energy)
+a = graphDFS("COCC=O")
+a.cacheEnergy(42)
+print("energy:\t", a.energy)
+print("exactMass:\t", a.exactMass)
+
+print("vLabelCount:\t", a.vLabelCount("O"))
+print("eLabelCount:\t", a.eLabelCount("="))
+
+a.name = "Test"
+print("setName:\t", a)
+print("inputGraphs:\t", inputGraphs)
+
+# Check eq operator
+inputGraphs[:] = []
+
+a = smiles("C")
+print("Energy:", a.energy)
+
+host = smiles("O=C=O", "CO2")
+pattern = smiles("[C]=O", name="Pattern")
+host2 = smiles("O=C=O", "CO2 2")
+
+assert(host.isomorphism(host2) > 0)
+assert(host.isomorphism(pattern) == 0)
+assert(pattern.monomorphism(host) > 0)
+assert(host.monomorphism(host2) > 0)
+assert(host2.monomorphism(pattern) == 0)
+
+a = smiles("O=C(O)C(CC(=O)O)C(O)C(=O)O", name="Isocitrate")
+aPerm = a.makePermutation()
+
+a = smiles("C*C")
+a.print()
+a = smiles("N[*]N")
+a.print()
+
+
+a = smiles("C")
+a.print()
+def customImage():
+	with open("out/custom.tex", "w") as f:
+		f.write("""\\begin{tikzpicture}
+\\node {custom};
+\\end{tikzpicture}""")
+	return "out/custom"
+a.image = customImage
+a.imageCommand = "compileTikz \"out/custom\" \"out/custom\""
+a.print()
+
+# Check interface
+a = graphDFS("COCC-O-C#N")
+print("numVertices:", a.numVertices)
+for v in a.vertices:
+	print("Vertex:", v.graph, v.id, v.degree, v.stringLabel, v.atomId, v.isotope, v.charge, v.radical)
+	for e in v.incidentEdges:
+		print("\tEdge:", e.target.id)
+print("numEdges:", a.numEdges)
+for e in a.edges:
+	print("Edge:", e.graph, e.source.id, e.target.id, e.stringLabel, e.bondType)
+
+a = graphDFS("[A][B]")
+v0 = a.vertices[0]
+v1 = a.vertices[1]
+assert v0 == v0
+assert v0 != v1
+assert v0 < v1
+e1 = list(v0.incidentEdges)[0]
+e2 = list(v1.incidentEdges)[0]
+assert e1 == e2
+assert not e1 != e2
+assert e1 < e2
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/py/graph/graphDFS.py b/test/py/graph/graphDFS.py
new file mode 100644
index 0000000..91fd527
--- /dev/null
+++ b/test/py/graph/graphDFS.py
@@ -0,0 +1,53 @@
+def check(s, withIds=False):
+	if withIds:
+		toString = lambda a: a.graphDFSWithIds
+	else:
+		toString = lambda a: a.graphDFS
+	a = graphDFS(s)
+	a.print()
+	s1 = toString(a)
+	print(s1)
+	a1 = graphDFS(s1)
+	s2 = toString(a1)
+	a2 = graphDFS(s2)
+	iso1 = a.isomorphism(a1)
+	iso2 = a.isomorphism(a2)
+	if iso1 == 0 or iso2 == 0:
+		print("s: ", s)
+		print("s1:", s1)
+		print("s2:", s2)
+		postSection("Error, iso1=%d, iso2=%d" % (iso1, iso2))
+		a.print()
+		a1.print()
+		a2.print()
+		assert False
+	return a
+
+postSection("Implicit vertices")
+print("Implicit vertices")
+for s in {"B", "C", "N", "O", "P", "S", "F", "Cl", "Br", "I"}:
+	a = check(s)
+	print(a.id, a.graphDFS)
+	a.printGML()
+
+postSection("Explicit implicit vertices")
+print("Explicit implicit vertices")
+for s in {"B", "C", "N", "O", "P", "S", "F", "Cl", "Br", "I"}:
+	a = check("[" + s + "]")
+	print(a.id, a.graphDFS)
+	a.printGML()
+
+postSection("Ids and Ring Closures")
+print("Ids and Ring Closures")
+check("O1CCC-1N")
+check("O1CCC1N")
+
+postSection("More Stuff")
+print("More Stuff")
+check("C1CCC1")
+check("[C\]]")
+check("C{a\}b}C")
+
+postSection("All With Ids")
+print("All With Ids")
+check("NCC(O)C(O)=O", withIds=True)
diff --git a/test/py/graph/graphExtId.py b/test/py/graph/graphExtId.py
new file mode 100644
index 0000000..07285f8
--- /dev/null
+++ b/test/py/graph/graphExtId.py
@@ -0,0 +1,35 @@
+def check(a):
+	data = {42: "C", 1337: "O", 0: "U"}
+	for i in range(a.minExternalId, a.maxExternalId + 1):
+		v = a.getVertexFromExternalId(i)
+		if i in data:
+			assert not v.isNull()
+			assert v.stringLabel == data[i]
+		else:
+			assert v.isNull()
+	for i, s in data.items():
+		v = a.getVertexFromExternalId(i)
+		assert not v.isNull()
+		assert v.stringLabel == data[i]
+		
+
+# GML
+a = graphGMLString("""graph [
+	node [ id 42 label "C" ]
+	node [ id 1337 label "O" ]
+	node [ id 0 label "U" ]
+	edge [ source 42 target 1337 label "-" ]
+	edge [ source 1337 target 0 label "-" ]
+]""")
+check(a)
+
+# DFS
+a = graphDFS("C42O1337[U]0")
+check(a)
+
+# SMILES
+a = smiles("[C:42][O:1337][U:0]")
+check(a)
+a = smiles("[C:0][C:0][C:1]")
+v = a.getVertexFromExternalId(1)
+assert v.isNull()
diff --git a/test/py/graph/graphPerm.py b/test/py/graph/graphPerm.py
new file mode 100644
index 0000000..174f045
--- /dev/null
+++ b/test/py/graph/graphPerm.py
@@ -0,0 +1,44 @@
+if True:
+	a = smiles("C(=CC(=O)O)C(=O)O", name="Fumarate")
+	p = GraphPrinter()
+	p.withIndex = True
+	a.print(p)
+	g = a.aut()
+	print("Aut:", g)
+	print("Perm:", g.gens[0])
+	print("Num gens:", len(g.gens))
+	for p in g.gens:
+		print(p)
+	v = next(a.vertices.__iter__())
+	print("Get input: ", v)
+	print("Get output:", g.gens[1][v])
+
+a = smiles("CC1=C(CC2=C(C)N=S(=O)(O)N=C2C)C(=NS(=O)(=N1)O)C")
+a = smiles("CC(C)C[C@@H](C(=O)O)N", name="Leucine")
+p = GraphPrinter()
+p.setMolDefault()
+p.collapseHydrogens = False
+f = a.print(p)
+f = f[0][:-3]
+fInc = f + "tex"
+fName = "out/aut.tex"
+pairs = set()
+with open(fName, "w") as f:
+	f.write("\\input{%s}\n" % fInc)
+	f.write("\\begin{tikzpicture}[overlay, remember picture]\n")
+	for p in a.aut().gens:
+		for v in a.vertices:
+			if v.stringLabel == "H" and v.degree == 1:
+				continue
+			vImg = p[v]
+			if v == vImg:
+				continue
+			s, t = v, vImg
+			if s.id > t.id:
+				s, t = t, s
+			if (s.id, t.id) in pairs:
+				continue
+			pairs.add((s.id, t.id))
+			f.write("\\path[modRCMatchEdge] (v-%d) to[bend left=15] (v-%d);\n" % (v.id, vImg.id))
+	f.write("\\end{tikzpicture}\n")
+post("summaryInput \"%s\"" % fName)
diff --git a/test/py/graph/smilesId.py b/test/py/graph/smilesId.py
new file mode 100644
index 0000000..dcdbaf6
--- /dev/null
+++ b/test/py/graph/smilesId.py
@@ -0,0 +1,6 @@
+smiles("[H][H]")
+smiles("CNOPS")
+for a in inputGraphs:
+	print("-" * 60)
+	print("SMILES:", a.smiles)
+	print("WithId:", a.smilesWithIds)
diff --git a/test/py/graph/topo.py b/test/py/graph/topo.py
new file mode 100644
index 0000000..0dc5f2c
--- /dev/null
+++ b/test/py/graph/topo.py
@@ -0,0 +1,19 @@
+try:
+    graphGMLString("""graph [ node [ id 0 label "C" ] node [ id 1 label "C" ] ]""")
+    assert False
+except InputError as e:
+    print(e)
+try:
+    graphGMLString("""graph [ node [ id 0 label "C" ] node [ id 1 label "C" ] 
+            edge [ source 0 target 1 label "-" ] edge [ source 1 target 0 label "-" ]
+        ]""")
+    assert False
+except InputError as e:
+    print(e)
+try:
+    graphGMLString("""graph [ node [ id 0 label "C" ]
+            edge [ source 0 target 0 label "-" ]
+        ]""")
+    assert False
+except InputError as e:
+    print(e)
diff --git a/test/py/isotopeDepict.py b/test/py/isotopeDepict.py
new file mode 100644
index 0000000..d7de9e4
--- /dev/null
+++ b/test/py/isotopeDepict.py
@@ -0,0 +1,36 @@
+smiles("C[13CH2]C")
+graphDFS("C[13Q]([H])([H])C")
+smiles("[2H][H]")
+smiles("[H][2H]")
+smiles("[2H]O")
+smiles("[18OH2]")
+
+p = GraphPrinter()
+for a in inputGraphs: 
+	a.print()
+	a.print(p)
+
+a = smiles("C[13CH2]C")
+for v in a.vertices:
+	v.printStereo()
+a = graphDFS("C[13Q]([H])([H])C")
+for v in a.vertices:
+	v.printStereo()
+
+a = ruleGMLString("""rule [
+	left [
+		node [ id 0 label "13C" ]
+		node [ id 4 label "13C" ]
+		node [ id 5 label "13Q" ]
+	]
+	context [
+		node [ id 1 label "13C" ]
+		node [ id 6 label "13Q" ]
+	]
+	right [
+		node [ id 2 label "13C" ]
+		node [ id 4 label "14C" ]
+		node [ id 7 label "13Q" ]
+	]
+]""")
+a.print()
diff --git a/test/py/matchConstraints/loadInvert.py b/test/py/matchConstraints/loadInvert.py
new file mode 100644
index 0000000..7cb6d48
--- /dev/null
+++ b/test/py/matchConstraints/loadInvert.py
@@ -0,0 +1,22 @@
+rStr = """rule [
+	context [
+		node [ id 0 label "s" ]
+	]
+	constrainAdj [
+		id 0 op "=" count 0
+	]
+]"""
+r = ruleGMLString(rStr)
+try:
+	r.makeInverse()
+	assert False
+except LogicError:
+	pass
+try:
+	ruleGMLString(rStr, invert=True)
+	assert False
+except InputError:
+	pass
+config.rule.ignoreConstraintsDuringInversion = True
+r.makeInverse()
+ruleGMLString(rStr, invert=True)
diff --git a/test/py/matchConstraints/shortestPath.py b/test/py/matchConstraints/shortestPath.py
new file mode 100644
index 0000000..fbdbf9b
--- /dev/null
+++ b/test/py/matchConstraints/shortestPath.py
@@ -0,0 +1,70 @@
+lString = LabelSettings(LabelType.String, LabelRelation.Unification)
+lTerm = LabelSettings(LabelType.Term, LabelRelation.Unification)
+
+smiles("O")
+print("Same connected component\n%s" % ('='*70))
+graphCommon = """
+	node [ id 0 label "s" ]
+	node [ id 1 label "v" ]
+	node [ id 2 label "v" ]
+	node [ id 3 label "t" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 1 target 2 label "-" ]
+	edge [ source 2 target 3 label "-" ]
+"""
+ruleTemplate = """rule [
+	ruleID "%s"
+	left [
+		edge [ source 1 target 2 label "-" ]
+	]
+	context [
+		node [ id 0 label "s" ]
+		node [ id 1 label "v" ]
+		node [ id 2 label "v" ]
+		node [ id 3 label "t" ]
+		edge [ source 0 target 1 label "-" ]
+		edge [ source 2 target 3 label "-" ]
+
+		node [ id 9 label "O" ]
+	]
+	right [
+		edge [ source 1 target 2 label "%s" ]
+	]
+	constrainShortestPath [
+		source 0 target 3
+		op "%s" length %s
+	]
+]"""
+ruleGMLString(ruleTemplate % ("Leq2", "leq2", "<=", "2"))
+ruleGMLString(ruleTemplate % ("Eq1", "eq1", "=", "1"))
+ruleGMLString(ruleTemplate % ("Eq3", "eq3", "=", "3"))
+ruleGMLString(ruleTemplate % ("Geq2", "geq2", ">=", "2"))
+length1 = graphGMLString('graph [ %s edge [ source 0 target 3  label "-" ] ]' % graphCommon)
+length3 = graphGMLString('graph [ %s ]' % graphCommon)
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules, labelSettings=lString)
+dg.calc()
+dg.print()
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules, labelSettings=lTerm)
+dg.calc()
+dg.print()
+
+
+
+
+sys.exit(0)
+
+
+print("Different connected components\n%s" % ('='*70))
+ruleGMLString("""rule [
+	left [
+		node [ id 0 label "a" ]
+		node [ id 1 label "b" ]
+	]
+	constrainShortestPath [
+		source 0 target 1
+		op "=" length 1
+	]
+]""")
+assert False
+
+
diff --git a/test/py/matchConstraints/vertexAdjacency/coreInsteadOfComponent.py b/test/py/matchConstraints/vertexAdjacency/coreInsteadOfComponent.py
new file mode 100644
index 0000000..caf5242
--- /dev/null
+++ b/test/py/matchConstraints/vertexAdjacency/coreInsteadOfComponent.py
@@ -0,0 +1,24 @@
+# test case for the bug where the constraint is checked in the core graph
+# instead of the component graph
+rLeft = ruleGMLString("""rule [
+	left [
+		edge [ source 1 target 2 label "-" ]
+	]
+	context [
+		node [ id 1 label "C" ]
+		node [ id 2 label "O" ]
+	]
+]""")
+rRight = ruleGMLString("""rule [
+	context [
+		node [ id 1 label "C" ]
+	]
+	constrainAdj [
+		id 1 count 0 op "="
+		nodeLabels [ label "O" ]
+	]
+]""")
+rc = rcEvaluator(inputRules)
+exp = rc.eval(rLeft *rcSuper(enforceConstraints=True)* rRight)
+assert len(exp) > 0
+for a in exp: a.print()
diff --git a/test/py/matchConstraints/vertexAdjacency/main.py b/test/py/matchConstraints/vertexAdjacency/main.py
new file mode 100644
index 0000000..a03b9bd
--- /dev/null
+++ b/test/py/matchConstraints/vertexAdjacency/main.py
@@ -0,0 +1,106 @@
+lString = LabelSettings(LabelType.String, LabelRelation.Unification)
+lTerm = LabelSettings(LabelType.Term, LabelRelation.Unification)
+
+graphGMLString("""graph [
+	node [ id 0 label "C" ]
+	edge [ source 0 target 1 label "a" ]
+	node [ id 1 label "A" ]
+	edge [ source 0 target 2 label "b" ]
+	node [ id 2 label "B" ]
+]""")
+ruleTemplate = """rule [
+	ruleID "%s"
+	left [
+		node [ id 0 label "C" ]
+	]
+	right [
+		node [ id 0 label "C(%s)" ]
+	]
+	constrainAdj [
+		id 0 op "%s"
+		count %d
+		%s
+	]
+]"""
+ops = {'lt': '<', 'leq': '<=', 'eq': '=', 'geq': '>=', 'gt': '>'}
+def evalOp(a, op, b):
+	if op == '<': return a < b
+	if op == '<=': return a <= b
+	if op == '=': return a == b
+	if op == '>=': return a >= b
+	if op == '>': return a > b
+	assert False
+nodeLabels = {
+	'': '',
+	'A': 'nodeLabels [ label "A" ]',
+	'AB': 'nodeLabels [ label "A" label "B" ]',
+}
+edgeLabels = {
+	'': '',
+	'a': 'edgeLabels [ label "a" ]',
+	'ab': 'edgeLabels [ label "a" label "b" ]',
+}
+trueCounts = {
+	('',   ''): 2, ('',   'a'): 1, ('',   'ab'): 2,
+	('A',  ''): 1, ('A',  'a'): 1, ('A',  'ab'): 1,
+	('AB', ''): 2, ('AB', 'a'): 1, ('AB', 'ab'): 2
+}
+valid = set()
+for count in range(0, 4):
+	for opName, op in ops.items():
+		for nlName, nl in nodeLabels.items():
+			for elName, el in edgeLabels.items():
+				if evalOp(trueCounts[(nlName, elName)], op, count):
+					valid.add((nlName, elName, opName, count))
+				name =  ','.join(a for a in [opName, str(count), nlName, elName] if len(a) > 0)
+				labels = nl + "\n" + el + "\n"
+				ruleGMLString(ruleTemplate % (name, name, op, count, labels))
+def doDG(name, lSettings):
+	print(name + "\n" + "="*50)
+	dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules, labelSettings=lSettings)
+	dg.calc()
+	dg.print()
+	found = set()
+	for vDG in dg.vertices:
+		g = vDG.graph
+		v = next(a for a in g.vertices if a.stringLabel.startswith("C"))
+		l = v.stringLabel
+		if l == "C": continue
+		l = l[2:-1]
+		if l.find(', ') != -1:
+			ls = l.split(', ')
+		else:
+			ls = l.split(',')
+		if len(ls[2:]) == 0:
+			nl = ''
+			el = ''
+		elif len(ls[2:]) == 1:
+			if ls[2] in nodeLabels:
+				nl = ls[2]
+				el = ''
+			else:
+				assert ls[2] in edgeLabels
+				nl = ''
+				el = ls[2]
+		else:
+			assert len(ls[2:]) == 2
+			nl = ls[2]
+			el = ls[3]
+		t = (nl, el, ls[0], int(ls[1]))
+		found.add(t)
+		print(ls[2:], ops[ls[0]], ls[1])
+	err = False
+	for f in found:
+		if f not in valid:
+			print("Too much:", f)
+			err = True
+	for v in valid:
+		if v not in found:
+			print("Too little:", v)
+			err = True
+	if err:
+		print(sorted(found))
+		print(sorted(valid))
+		assert False
+doDG("String", lString)
+doDG("Term", lTerm)
diff --git a/test/py/matchConstraints/vertexAdjacency/termConversion.py b/test/py/matchConstraints/vertexAdjacency/termConversion.py
new file mode 100644
index 0000000..d7750ca
--- /dev/null
+++ b/test/py/matchConstraints/vertexAdjacency/termConversion.py
@@ -0,0 +1,47 @@
+ls = LabelSettings(LabelType.Term, LabelRelation.Unification)
+rId = ruleGMLString("""rule [
+    context [
+        node [ id 0 label "C" ]
+    ]
+    right [
+        node [ id 1 label "R" ]
+        edge [ source 0 target 1 label "-" ]
+    ]
+]""")
+rIdInv = rId.makeInverse()
+rStr = """rule [
+    context [
+        node [ id 0 label "C" ]
+        node [ id 1 label "Q" ]
+        edge [ source 0 target 1 label "-" ]
+    ]
+    constrainAdj [
+        id 1 op "=" count 1
+        nodeLabels [ label "a" label "_x" label "b(c)" label "d(_y)" ]
+        edgeLabels [ label "g" label "_p" label "h(i)" label "j(_q)" ]
+    ]
+]"""
+a = ruleGMLString(rStr)
+postChapter("TermState")
+a.printTermState()
+#b = a.makeInverse()
+
+postChapter("Compose first")
+rc = rcEvaluator([], ls)
+res = rc.eval(a *rcSuper* rId)
+for b in res:
+    b.print()
+    b.printTermState()
+
+postChapter("Compose second")
+rc = rcEvaluator([], ls)
+res = rc.eval(rIdInv *rcSub* a)
+for b in res:
+    b.print()
+    b.printTermState()
+
+postChapter("DGRuleComp")
+graphDFS("C[Q]")
+dg = dgRuleComp([], addSubset(inputGraphs) >> a, ls)
+dg.calc()
+dg.print()
diff --git a/test/py/matchConstraints/vertexAdjacency/vertexAndEdge.py b/test/py/matchConstraints/vertexAdjacency/vertexAndEdge.py
new file mode 100644
index 0000000..010b4a9
--- /dev/null
+++ b/test/py/matchConstraints/vertexAdjacency/vertexAndEdge.py
@@ -0,0 +1,18 @@
+graphDFS("[_x]{_x}[C]")
+ruleGMLString("""rule [
+	left [
+		node [ id 0 label "C" ]
+	]
+	right [
+		node [ id 0 label "U" ]
+	]
+	constrainAdj [
+		id 0 op "=" count 1
+		nodeLabels [ label "a" ]
+		edgeLabels [ label "b" ]
+	]
+]""")
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules,
+	labelSettings=LabelSettings(LabelType.Term, LabelRelation.Specialisation))
+dg.calc()
+dg.print()
diff --git a/test/py/molDepiction.py b/test/py/molDepiction.py
new file mode 100644
index 0000000..31c6994
--- /dev/null
+++ b/test/py/molDepiction.py
@@ -0,0 +1,64 @@
+postSection("Hydrogen moving and charges")
+for b in ["", "=", "#"]:
+    for c in ["", "+", ".", "+."]:
+        for l in [6, 8, 10, 12]:
+            for h in ["", "2"]:
+                unit = "[CH%s%s]" % (h, c)
+                s = [unit + "1"]
+                for i in range(l - 1):
+                    s.append(unit)
+                s.append("1")
+                smiles(b.join(s), name="b%s-c%s-l%d-h%s" % (b, c, l, h))
+p = GraphPrinter()
+p.setMolDefault()
+p.simpleCarbons = False
+p.withIndex = True
+for a in inputGraphs: a.print(p)
+inputGraphs[:] = []
+
+postSection("Double/Triple/Lablled bond")
+smiles("O=C=C")
+smiles("CCCC#N")
+smiles("CCC(O)=O")
+smiles("CC(=O)C")
+graphDFS("C{a}C")
+for a in inputGraphs: a.print()
+inputGraphs[:] = []
+postSection("middle C -> simple C + hidden H")
+smiles("CCC")
+smiles("CC(O)C")
+smiles("N=CC")
+for a in inputGraphs: a.print()
+inputGraphs[:] = []
+postSection("collapse H")
+smiles("[H][H]")
+graphDFS("[Q][H][R]")
+graphDFS("[H]=[R]")
+smiles("O")
+smiles("CNC")
+for a in inputGraphs: a.print()
+inputGraphs[:] = []
+postSection("Aromatic")
+smiles("c1ccccc1")
+smiles("c1[nH]c2c(ncnc2n1)N")
+for a in inputGraphs: a.print()
+inputGraphs[:] = []
+postSection("Charges")
+smiles("[OH-]")
+graphDFS("[O2-]")
+smiles("[H+]")
+smiles("[NH4+]")
+graphDFS("O[N2+](O)(O)O")
+graphDFS("[Q]C[Hest]C[Q+]")
+smiles("O[C-]C(=O)COP([O-])([O-])=O")
+smiles("O[CH-]C(=O)COP([O-])([O-])=O")
+for a in inputGraphs: a.print()
+inputGraphs[:] = []
+
+
+postSection("Formose")
+include("formoseCommon/grammar.py")
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules[0] >> inputRules[2])
+dg.calc()
+for v in dg.vertices: v.graph.print()
+inputGraphs[:] = []
diff --git a/test/py/parseReactionSmiles.py b/test/py/parseReactionSmiles.py
new file mode 100644
index 0000000..ca4e15b
--- /dev/null
+++ b/test/py/parseReactionSmiles.py
@@ -0,0 +1,41 @@
+# type: str -> Rule
+def makeReactionSmiles(line):
+	sLeft, sRight = line.split(">>")
+	ssLeft = sLeft.split(".")
+	ssRight = sRight.split(".")
+	mLeft = [smiles(s, add=False) for s in ssLeft]
+	mRight = [smiles(s, add=False) for s in ssRight]
+	def printGraph(g):
+		extFromInt = {}
+		for iExt in range(g.minExternalId, g.maxExternalId + 1):
+			v = g.getVertexFromExternalId(iExt)
+			if not v.isNull():
+				extFromInt[v] = iExt
+		s = ""
+		for v in g.vertices:
+			assert v in extFromInt
+			s += '\t\tnode [ id %d label "%s" ]\n' % (extFromInt[v], v.stringLabel)
+		for e in g.edges:
+			s += '\t\tedge [ source %d target %d label "%s" ]\n' % (extFromInt[e.source], extFromInt[e.target], e.stringLabel)
+		return s
+	s = "rule [\n\tleft [\n"
+	for m in mLeft:
+		s += printGraph(m)
+	s += "\t]\n\tright [\n"
+	for m in mRight:
+		s += printGraph(m)
+	s += "\t]\n]\n"
+	return ruleGMLString(s, add=False)
+
+
+strs = [
+	"[C:8]([C:7]1[C:0]([H:11])=[C:1]([C:2]([H:13])=[C:3]([C:4]=1[O:5][C:6]([H:17])([H:16])[H:15])[H:14])[H:12])([O-:10])=[O:9]>>[C:0]1([C-:7]=[C:4]([C:3]([H:14])=[C:2]([C:1]=1[H:12])[H:13])[O:5][C:6]([H:15])([H:16])[H:17])[H:11].[C:8](=[O:10])=[O:9]",
+	"[C:0]1([C-:7]=[C:4]([C:3]([H:11])=[C:2]([C:1]=1[H:9])[H:10])[O:5][C:6]([H:14])([H:13])[H:12])[H:8]>>[C:1]1([C:2]([H:10])=[C:3]([C:4]([O:5][C-:6]([H:12])[H:13])=[C:7]([C:0]=1[H:8])[H:14])[H:11])[H:9]",
+	"[C:1]1([C:2]([H:10])=[C:3]([C:4]([O:5][C-:6]([H:14])[H:13])=[C:7]([C:0]=1[H:8])[H:12])[H:11])[H:9]>>[C:3]1([C-:4]=[C:7]([C:0]([H:8])=[C:1]([C:2]=1[H:10])[H:9])[H:12])[H:11].[C:6]([H:13])([H:14])=[O:5]",
+]
+for s in strs:
+	r = makeReactionSmiles(s)
+	p = GraphPrinter()
+	p.setReactionDefault()
+	p.withIndex = True
+	r.print(p)
diff --git a/test/py/pppCommon/aldo_keto_backward.gml b/test/py/pppCommon/aldo_keto_backward.gml
new file mode 100644
index 0000000..327b8b7
--- /dev/null
+++ b/test/py/pppCommon/aldo_keto_backward.gml
@@ -0,0 +1,32 @@
+rule [
+	ruleID "Aldose-Ketose <-"
+	left [
+		edge [ source 1 target 2 label "=" ]
+		edge [ source 3 target 4 label "-" ]
+		edge [ source 3 target 5 label "-" ]
+		edge [ source 4 target 6 label "-" ]
+	]
+	context [
+		node [ id 1 label "O" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "C" ]
+		node [ id 4 label "O" ]
+		node [ id 5 label "H" ]
+		node [ id 6 label "H" ]
+		node [ id 7 label "H" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 3 target 7 label "-" ]
+	]
+	right [
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 1 target 5 label "-" ]
+		edge [ source 2 target 6 label "-" ]
+		edge [ source 3 target 4 label "=" ]
+	]
+	constrainAdj [
+		id 2
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+]
diff --git a/test/py/pppCommon/aldo_keto_forward.gml b/test/py/pppCommon/aldo_keto_forward.gml
new file mode 100644
index 0000000..6cdfc28
--- /dev/null
+++ b/test/py/pppCommon/aldo_keto_forward.gml
@@ -0,0 +1,32 @@
+rule [
+	ruleID "Aldose-Ketose ->"
+	left [
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 1 target 5 label "-" ]
+		edge [ source 2 target 6 label "-" ]
+		edge [ source 3 target 4 label "=" ]
+	]
+	context [
+		node [ id 1 label "O" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "C" ]
+		node [ id 4 label "O" ]
+		node [ id 5 label "H" ]
+		node [ id 6 label "H" ]
+		node [ id 7 label "H" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 3 target 7 label "-" ]
+	]
+	right [
+		edge [ source 1 target 2 label "=" ]
+		edge [ source 3 target 4 label "-" ]
+		edge [ source 3 target 5 label "-" ]
+		edge [ source 4 target 6 label "-" ]
+	]
+	constrainAdj [
+		id 2
+		op "="
+		count 1
+		nodeLabels [ label "O" ]
+	]
+]
diff --git a/test/py/pppCommon/aldolase.gml b/test/py/pppCommon/aldolase.gml
new file mode 100644
index 0000000..76d28c0
--- /dev/null
+++ b/test/py/pppCommon/aldolase.gml
@@ -0,0 +1,38 @@
+rule [
+	ruleID "Aldolase"
+	left [
+		edge [ source 1 target 4 label "-" ]
+
+		edge [ source 101 target 102 label "=" ]
+	]
+	context [
+		node [ id 1 label "C" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "O" ]
+		node [ id 4 label "H" ]
+
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "=" ]
+		
+		node [ id 30 label "O" ]
+		edge [ source 1 target 30 label "-" ]
+		node [ id 31 label "H" ]
+		edge [ source 30 target 31 label "-" ]
+		node [ id 32 label "H" ]
+		edge [ source 1 target 32 label "-" ]
+
+
+		node [ id 101 label "C" ]
+		node [ id 102 label "O" ]
+		
+		node [ id 130 label "H" ]
+		edge [ source 101 target 130 label "-" ]
+	]
+	right [
+		edge [ source 102 target 4 label "-" ]
+		edge [ source 101 target 102 label "-" ]
+
+		edge [ source 1 target 101 label "-" ]
+	]
+
+]
diff --git a/test/py/pppCommon/dgStrict.py b/test/py/pppCommon/dgStrict.py
new file mode 100644
index 0000000..9e04bc9
--- /dev/null
+++ b/test/py/pppCommon/dgStrict.py
@@ -0,0 +1,10 @@
+include("grammar.py")
+
+strat = (addUniverse(water) >> addSubset(ribuloseP)
+	>> aldoKetoF >> transKeto
+	>> [
+		transAldo >> transKeto,
+		aldoKetoB >> aldolase >> phosphohydro
+	])
+dg = dgRuleComp(inputGraphs, strat)
+dg.calc()
diff --git a/test/py/pppCommon/dhap_aldolase.gml b/test/py/pppCommon/dhap_aldolase.gml
new file mode 100644
index 0000000..ecc9dd6
--- /dev/null
+++ b/test/py/pppCommon/dhap_aldolase.gml
@@ -0,0 +1,53 @@
+rule [
+	ruleID "DHAP aldolase"
+	left [
+		edge [ source 1 target 4 label "-" ]
+
+		edge [ source 101 target 103 label "=" ]
+	]
+	context [
+		node [ id 1 label "C" ]
+		node [ id 2 label "C" ]
+		node [ id 3 label "O" ]
+		node [ id 4 label "H" ]
+
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "=" ]
+		
+		node [ id 30 label "O" ]
+		edge [ source 1 target 30 label "-" ]
+		node [ id 31 label "H" ]
+		edge [ source 30 target 31 label "-" ]
+		node [ id 32 label "H" ]
+		edge [ source 1 target 32 label "-" ]
+
+		node [ id 50 label "C" ]
+		edge [ source 2 target 50 label "-" ]
+
+
+		node [ id 101 label "C" ]
+		node [ id 102 label "C" ]
+		node [ id 103 label "O" ]
+		
+		edge [ source 101 target 102 label "-" ]
+
+		node [ id 130 label "H" ]
+		edge [ source 101 target 130 label "-" ]
+		node [ id 131 label "H" ]
+		edge [ source 102 target 131 label "-" ]
+		node [ id 132 label "O" ]
+		edge [ source 102 target 132 label "-" ]
+		node [ id 133 label "H" ]
+		edge [ source 132 target 133 label "-" ]
+
+		node [ id 150 label "C" ]
+		edge [ source 102 target 150 label "-" ]
+	]
+	right [
+		edge [ source 103 target 4 label "-" ]
+		edge [ source 101 target 103 label "-" ]
+
+		edge [ source 1 target 101 label "-" ]
+	]
+
+]
diff --git a/test/py/pppCommon/grammar.py b/test/py/pppCommon/grammar.py
new file mode 100644
index 0000000..1419c16
--- /dev/null
+++ b/test/py/pppCommon/grammar.py
@@ -0,0 +1,26 @@
+AcP = smiles("OP(O)(=O)OC(=O)C", "AcP") # Acetyl-Phosphate
+G3P = smiles("C(C(C=O)O)OP(=O)(O)O", "G3P") # Glyceraldehyde 3-phosphate
+E4P = smiles("OP(O)(=O)OCC(O)C(O)C=O", "E4P") # Erythrose-4-phosphate
+R5P = smiles("OP(O)(=O)OCC(O)C(O)C(O)C=O", "R5P") # Ribose 5-phosphate
+Ru5P = smiles("OCC(=O)C(O)C(O)COP(=O)(O)O", "Ru5P") # Ribulose-5-Phosphate
+ribuloseP = Ru5P # TODO: remove at some point
+F6P = smiles("OCC(=O)C(O)C(O)C(O)COP(=O)(O)O", "F6P") # Fructose-6-Phosphate
+fructoseP = F6P # TODO: remove at some point
+S7P = smiles("O=P(O)(OCC(O)C(O)C(O)C(O)C(=O)CO)O", "S7P") # Sedoheptulose 7-phosphate
+water = smiles("O", "Water")
+Pi = smiles("O=P(O)(O)O", "Pi")
+phosphate = Pi # TODO: remove at some point
+
+aldoKetoF = ruleGML("aldo_keto_backward.gml")
+aldoKetoB = ruleGML("aldo_keto_forward.gml")
+transKeto = ruleGML("transketolase.gml")
+Tkt = transKeto
+transAldo = ruleGML("transaldolase.gml")
+Tal = transAldo
+aldolase = ruleGML("aldolase.gml")
+phosphohydro = ruleGML("phosphohydrolase.gml")
+
+aldolaseReal = leftPredicate[lambda d: any(a.vLabelCount("C") > 2 for a in d.left)](aldolase)
+
+rulesGeneric = [aldoKetoF, aldoKetoB, transKeto, transAldo, aldolase, phosphohydro]
+rulesReal = [aldoKetoF, aldoKetoB, transKeto, transAldo, aldolaseReal, phosphohydro]
diff --git a/test/py/pppCommon/phosphohydrolase.gml b/test/py/pppCommon/phosphohydrolase.gml
new file mode 100644
index 0000000..0e8b7df
--- /dev/null
+++ b/test/py/pppCommon/phosphohydrolase.gml
@@ -0,0 +1,36 @@
+rule [
+	ruleID "Phophohydrolase"
+	left [
+		edge [ source 0 target 6 label "-" ]
+
+		edge [ source 100 target 101 label "-" ]
+	]
+	context [
+		node [ id 0 label "P" ]
+		node [ id 1 label "O" ]
+		edge [ source 0 target 1 label "=" ]
+		node [ id 2 label "O" ]
+		edge [ source 0 target 2 label "-" ]
+		node [ id 3 label "H" ]
+		edge [ source 2 target 3 label "-" ]
+		node [ id 4 label "O" ]
+		edge [ source 0 target 4 label "-" ]
+		node [ id 5 label "H" ]
+		edge [ source 4 target 5 label "-" ]
+		node [ id 6 label "O" ]
+
+		node [ id 7 label "C" ]
+		edge [ source 6 target 7 label "-" ]
+
+
+		node [ id 100 label "O" ]
+		node [ id 101 label "H" ]
+		node [ id 102 label "H" ]
+		edge [ source 100 target 102 label "-" ]
+	]
+	right [
+		edge [ source 100 target 0 label "-" ]
+
+		edge [ source 101 target 6 label "-" ]
+	]
+]
diff --git a/test/py/pppCommon/transaldolase.gml b/test/py/pppCommon/transaldolase.gml
new file mode 100644
index 0000000..a76b730
--- /dev/null
+++ b/test/py/pppCommon/transaldolase.gml
@@ -0,0 +1,56 @@
+rule [
+	ruleID "Transaldolase"
+	left [
+		edge [ source 8 target 15 label "-" ]
+		edge [ source 10 target 8 label "-" ]
+
+		edge [ source 11 target 9 label "=" ]
+
+		edge [ source 12 target 10 label "-" ]
+	]
+	context [
+		node [ id 1 label "H" ]
+		node [ id 2 label "C" ]
+		edge [ source 2 target 1 label "-" ]
+		node [ id 3 label "H" ]
+		edge [ source 3 target 2 label "-" ]
+		node [ id 4 label "O" ]
+		edge [ source 4 target 2 label "-" ]
+		node [ id 5 label "H" ]
+		edge [ source 5 target 4 label "-" ]
+		node [ id 6 label "C" ]
+		edge [ source 6 target 2 label "-" ]
+		node [ id 7 label "O" ]
+		edge [ source 7 target 6 label "=" ]
+
+		node [ id 15 label "C" ]
+		edge [ source 15 target 6 label "-" ]
+		node [ id 16 label "H" ]
+		edge [ source 16 target 15 label "-" ]
+		node [ id 17 label "O" ]
+		edge [ source 17 target 15 label "-" ]
+		node [ id 18 label "H" ]
+		edge [ source 18 target 17 label "-" ]
+
+
+		node [ id 8 label "C" ]
+		node [ id 10 label "O" ]
+		node [ id 13 label "H" ]
+		edge [ source 13 target 8 label "-" ]
+
+		node [ id 9 label "C" ]
+		node [ id 11 label "O" ]
+		node [ id 14 label "H" ]
+		edge [ source 14 target 9 label "-" ]
+
+		node [ id 12 label "H" ]
+	]
+	right [
+		edge [ source 9 target 15 label "-" ]
+		edge [ source 10 target 8 label "=" ]
+
+		edge [ source 11 target 9 label "-" ]
+
+		edge [ source 12 target 11 label "-" ]
+	]
+]
diff --git a/test/py/pppCommon/transketolase.gml b/test/py/pppCommon/transketolase.gml
new file mode 100644
index 0000000..e8e9e4e
--- /dev/null
+++ b/test/py/pppCommon/transketolase.gml
@@ -0,0 +1,46 @@
+rule [
+	ruleID "Transketolase"
+	left [
+		edge [ source 8 target 6 label "-" ]
+		edge [ source 10 target 8 label "-" ]
+
+		edge [ source 11 target 9 label "=" ]
+
+		edge [ source 12 target 10 label "-" ]
+	]
+	context [
+		node [ id 1 label "H" ]
+		node [ id 2 label "C" ]
+		edge [ source 2 target 1 label "-" ]
+		node [ id 3 label "H" ]
+		edge [ source 3 target 2 label "-" ]
+		node [ id 4 label "O" ]
+		edge [ source 4 target 2 label "-" ]
+		node [ id 5 label "H" ]
+		edge [ source 5 target 4 label "-" ]
+		node [ id 6 label "C" ]
+		edge [ source 6 target 2 label "-" ]
+		node [ id 7 label "O" ]
+		edge [ source 7 target 6 label "=" ]
+
+		node [ id 8 label "C" ]
+		node [ id 10 label "O" ]
+		node [ id 13 label "H" ]
+		edge [ source 13 target 8 label "-" ]
+
+		node [ id 9 label "C" ]
+		node [ id 11 label "O" ]
+		node [ id 14 label "H" ]
+		edge [ source 14 target 9 label "-" ]
+
+		node [ id 12 label "H" ]
+	]
+	right [
+		edge [ source 9 target 6 label "-" ]
+		edge [ source 10 target 8 label "=" ]
+
+		edge [ source 11 target 9 label "-" ]
+
+		edge [ source 12 target 11 label "-" ]
+	]
+]
diff --git a/test/py/radical.py b/test/py/radical.py
new file mode 100644
index 0000000..d4610f5
--- /dev/null
+++ b/test/py/radical.py
@@ -0,0 +1,19 @@
+def test(a):
+	a.print()
+	p = GraphPrinter()
+	p.setMolDefault()
+	p.withIndex = True
+	a.print(p)
+	print(a.smiles)
+	b = smiles(a.smiles)
+	assert a.isomorphism(b) > 0
+test(graphDFS("[C.]"))
+test(graphDFS("[C.]" + "(C)"))
+test(graphDFS("[C.]" + "(C)"*2))
+test(graphDFS("[C.]" + "(C)"*3))
+test(graphDFS("[C.]" + "(C)"*4))
+test(graphDFS("[C.]" + "(C)"*5))
+test(graphDFS("[C.]" + "(C)"*6))
+test(graphDFS("[C.]" + "(C)"*7))
+test(smiles("[CH2+.:42]"))
+test(smiles("[CH+.:42]"))
diff --git a/test/py/rc/checks.py b/test/py/rc/checks.py
new file mode 100644
index 0000000..e1f2415
--- /dev/null
+++ b/test/py/rc/checks.py
@@ -0,0 +1,356 @@
+def doChecks():
+	print("############################################")
+	# Rules
+	# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+	# Let ABC = {A, B, C}
+	# Let ABCe = {A, B, C, }
+	# We only enumerate connected rules
+	# ==== ==== ================================== ============
+	# L    R    Label variations                   Id Pattern
+	# ==== ==== ================================== ============
+	# (empty)                                      _
+	# O         ABC                                l_
+	#      O    ABC                                _l
+	# O    O    ABC                                l_l
+	# $    $    ABC x ABC                          l_l
+	# ---- ---- ---------------------------------- ------------
+	# O-O       ABC x ABC c ABC                    lel_
+	# O-O' O    ABC x ABC x ABC                    lel_l
+	# O-$  $    ABC x ABC x ABC x ABC              lel_l
+	#      O-O  ABC x ABC x ABC                    _lel
+	# O    O-O' ABC x ABC x ABC                    l_lel
+	# $    O-$  ABC x ABC x ABC x ABC              l_lel
+	# ---- ---- ---------------------------------- ------------
+	# O-O' O-O' ABC x ABC x ABCe x ABC             lel_lel
+	# O-$  O-$  ABC x ABC x ABC x ABCe x ABC       lel_lel
+	# $-$' $-$' ABC x ABC x ABC x ABC x ABCe x ABC lel_lel
+	# ==== ==== ================================== ============
+
+	# ======= =======  =======  =========================
+	# First   Second   New 
+	# === === === ===  === ===  =========================
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("(empty) with everything"); checkNum = 1
+	#         A        A
+	#             A        A
+	#         A   A    A   A
+	#         A   B    A   B
+	check(_ *rcParallel* A_, {iso(0, A_)})
+	check(_ *rcParallel* _A, {iso(0, _A)})
+	check(_ *rcParallel* A_A, {iso(0, A_A)})
+	check(_ *rcParallel* A_B, {iso(0, A_B)})
+	#         AAA      AAA
+	#         AAA A    AAA A
+	#             AAA      AAA
+	#         A   AAA  A   AAA
+	check(_ *rcParallel* AAA_, {iso(0, AAA_)})
+	check(_ *rcParallel* AAA_A, {iso(0, AAA_A)})
+	check(_ *rcParallel* _AAA, {iso(0, _AAA)})
+	check(_ *rcParallel* A_AAA, {iso(0, A_AAA)})
+	#         AAA A A  AAA A A
+	#         A A AAA  A A AAA
+	#         AAA AAA  AAA AAA
+	#         AAA ABA  AAA ABA
+	check(_ *rcParallel* AAA_AeA, {iso(0, AAA_AeA)})
+	check(_ *rcParallel* AeA_AAA, {iso(0, AeA_AAA)})
+	check(_ *rcParallel* AAA_AAA, {iso(0, AAA_AAA)})
+	check(_ *rcParallel* AAA_ABA, {iso(0, AAA_ABA)})
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("everything with (empty)"); checkNum = 1
+	# A                A
+	#     A                A
+	# A   A            A   A
+	# A   B            A   B
+	# AAA A A          AAA A A
+	# A A AAA          A A AAA
+	# AAA AAA          AAA AAA
+	# AAA ABA          AAA ABA
+	check(A_ *rcParallel* _, {iso(0, A_)})
+	check(_A *rcParallel* _, {iso(0, _A)})
+	check(A_A *rcParallel* _, {iso(0, A_A)})
+	check(A_B *rcParallel* _, {iso(0, A_B)})
+	check(AAA_AeA *rcParallel* _, {iso(0, AAA_AeA)})
+	check(AeA_AAA *rcParallel* _, {iso(0, AeA_AAA)})
+	check(AAA_AAA *rcParallel* _, {iso(0, AAA_AAA)})
+	check(AAA_ABA *rcParallel* _, {iso(0, AAA_ABA)})
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("O -> with everything"); checkNum = 1
+	# There would be no non-empty match
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("-> O with everything"); checkNum = 1
+	#     A   A                 Delete node
+	#     A   A   A        A
+	#     A   A   B        B
+	#     A   AAB               Invalid, eSecond dangling in L
+	#     A   A   AAB      AAB
+	#     A   AAB A B           Invalid, eSecond dangling in L
+	#     A   A B AAB    B AAB  (B_BAA)
+	#     A   AAB AAB           Invalid, eSecond dangling in L
+	#     A   AAB ABB           Invalid, eSecond dangling in L
+	check(_A *rcCommon* A_, {iso(0, _)})
+	check(_A *rcCommon* A_A, {iso(0, _A)})
+	check(_A *rcCommon* A_B, {iso(0, _B)})
+	check(_A *rcCommon* AAB_, {}, 0)
+	check(_A *rcCommon* A_AAB, {iso(0, _AAB)})
+	check(_A *rcCommon* AAB_AeB, {}, 0)
+	check(_A *rcCommon* AeB_AAB, {iso(0, B_BAA)})
+	check(_A *rcCommon* AAB_AAB, {}, 0)
+	check(_A *rcCommon* AAB_ABB, {}, 0)
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("O -> O with everything"); checkNum = 1
+	# A   A   A        A
+	# A   A   A   A    A   A
+	# A   A   A   B    A   B
+	# A   A   AAB      AAB
+	# A   A   A   AAB  A   AAB
+	# A   A   AAB A B  AAB A B
+	# A   A   A B AAB  A B AAB
+	# A   A   AAB AAB  AAB AAB
+	# A   A   AAB ABB  AAB ABB
+	check(A_A *rcCommon* A_, {iso(0, A_)})
+	check(A_A *rcCommon* A_A, {iso(0, A_A)})
+	check(A_A *rcCommon* A_B, {iso(0, A_B)})
+	check(A_A *rcCommon* AAB_, {iso(0, AAB_)})
+	check(A_A *rcCommon* A_AAB, {iso(0, A_AAB)})
+	check(A_A *rcCommon* AAB_AeB, {iso(0, AAB_AeB)})
+	check(A_A *rcCommon* AeB_AAB, {iso(0, AeB_AAB)})
+	check(A_A *rcCommon* AAB_AAB, {iso(0, AAB_AAB)})
+	check(A_A *rcCommon* AAB_ABB, {iso(0, AAB_ABB)})
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("$ -> $ with everything"); checkNum = 1
+	# A   B   B        A
+	# A   B   B   B    A   B
+	# A   B   B   A    A   A
+	# A   B   B   C    A   C
+	check(A_B *rcCommon* B_, {iso(0, A_)})
+	check(A_B *rcCommon* B_B, {iso(0, A_B)})
+	check(A_B *rcCommon* B_A, {iso(0, A_A)})
+	check(A_B *rcCommon* B_C, {iso(0, A_C)})
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("O-O -> with everything"); checkNum = 1
+	# There would be no non-empty match
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("O-O' -> O with everything"); checkNum = 1
+	# This would be similar to just O -> O
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("O-$ -> $ with everything"); checkNum = 1
+	# This would be similar to just $ -> $
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("-> O-O with everything"); checkNum = 1
+	#     A A AAA               Invalid, eSecond dangling in L
+	#     A A A A AAA      AAA
+	check(_AeA *rcSub* AAA_, {}, 0)
+	check(_AeA *rcSub* AeA_AAA, {iso(0, _AAA)})
+	#     AAA A                 Invalid, eFirst dangling in R
+	#     AAA A   A        AAA 
+	#     AAA A   B        BAA  (AAB)
+	#     AAA A A               Invalid, eFirst dangling in R
+	#     AAA AAA               (All deleted)
+	#     AAA ABA               (Only one vertex would be matched) Invalid, both edges dangling
+	check(_AAA *rcCommon* A_, {}, 0)
+	check(_AAA *rcCommon* A_A, {iso(0, _AAA)})
+	check(_AAA *rcCommon* A_B, {iso(0, _AAB)})
+	check(_AAA *rcSuper* AeA_, {}, 0)
+	check(_AAA *rcCommon* AAA_, {iso(0, _)})
+	check(_AAA *rcCommon* ABA_, {}, 0)
+	#     AAA A A A             Invalid, eFirst dangling in R
+	#     AAA AAA A        A
+	#     AAA ABA A             (Only one vertex would be matched) Invalid, eSecond dangling in L
+	check(_AAA *rcSuper* AeA_A, {}, 0)
+	check(_AAA *rcCommon* AAA_A, {iso(0, _A)})
+	check(_AAA *rcCommon* ABA_A, {}, 0)
+	#     AAA A A AAA           Invalid, duplicate edge in R
+	#     AAA AAA A A      A A
+	#     AAA AAA AAA      AAA
+	#     AAA AAA ABA      ABA
+	check(_AAA *rcSuper* AeA_AAA, {}, 0)
+	check(_AAA *rcSuper* AAA_AeA, {iso(0, _AeA)})
+	check(_AAA *rcSuper* AAA_AAA, {iso(0, _AAA)})
+	check(_AAA *rcSuper* AAA_ABA, {iso(0, _ABA)})
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("O -> O-O with everything"); checkNum = 1
+	# A   A A AAA               Invalid, eSecond dangling in L
+	# A   A A AAA A             Invalid, eSecond dangling in L
+	# A   A A A A AAA  A   AAA
+	check(A_AeA *rcSub* AAA_, {}, 0)
+	check(A_AeA *rcSub* AAA_A, {}, 0)
+	check(A_AeA *rcSub* AeA_AAA, {iso(0, A_AAA)})
+	# A   AAA A                 Invalid, eFirst dangling in R
+	# A   AAA A   A    A   AAA 
+	# A   AAA A   B    A   BAA
+	#                  A   AAB  
+	# A   AAA A A               Invalid, eFirst dangling in R
+	# A   AAA AAA      A
+	# A   AAA ABA               (Only one vertex would be matched) Invalid, both edges dangling
+	check(A_AAA *rcCommon* A_, {}, 0)
+	check(A_AAA *rcCommon* A_A, {iso(0, A_AAA)})
+	check(A_AAA *rcCommon* A_B, {iso(0, A_AAB), iso(1, A_BAA)}, 2)
+	check(A_AAA *rcSuper* AeA_, {}, 0)
+	check(A_AAA *rcCommon* AAA_, {iso(0, A_)})
+	check(A_AAA *rcCommon* ABA_, {}, 0)
+	# A   AAA A A A             Invalid, eFirst dangling in R
+	# A   AAA AAA A    A     A
+	#                  A   A
+	# A   AAA ABA A    ABA AAA' (Only one vertex would be matched, AB->A<- and AA->A<- are not the same)
+	check(A_AAA *rcSuper* AeA_A, {}, 0)
+	check(A_AAA *rcCommonMax* AAA_A, {iso(0, A__A), iso(1, A_A)}, 2)
+	check(A_AAA *rcCommonMax* ABA_A, {iso(0, ABA__AAA)})
+	# A   AAA A A AAA           Invalid, duplicate edge in R
+	# A   AAA AAA A A  A   A A
+	# A   AAA AAA AAA  A   AAA
+	# A   AAA AAA ABA  A   ABA
+	check(A_AAA *rcSuper* AeA_AAA, {}, 0)
+	check(A_AAA *rcSuper* AAA_AeA, {iso(0, A_AeA)})
+	check(A_AAA *rcSuper* AAA_AAA, {iso(0, A_AAA)})
+	check(A_AAA *rcSuper* AAA_ABA, {iso(0, A_ABA)})
+	# ---------------------------------------------------
+	# L   R   L   R    L   R    Note
+	# === === === ===  === ===  =========================
+	print("O-O -> O-O with everything"); checkNum = 1
+	# A A A A A A AAA  A A AAA
+	# A A A A AAA A A  AAA A A
+	# A A A A AAA A    AAA A  
+	# A A A A AAA AAA  AAA AAA
+	# A A A A AAA ABA  AAA ABA
+	print("Group 1"); checkNum = 1
+	check(AeA_AeA *rcSuper* AeA_AAA, {iso(0, AeA_AAA)})
+	check(AeA_AeA *rcSub* AAA_AeA, {iso(0, AAA_AeA)})
+	check(AeA_AeA *rcSub* AAA_A, {iso(0, AAA_A)})
+	check(AeA_AeA *rcSub* AAA_AAA, {iso(0, AAA_AAA)})
+	check(AeA_AeA *rcSub* AAA_ABA, {iso(0, AAA_ABA)})
+	# A A AAA A                 Invalid, eFirst dangling in R
+	# A A AAA A   A    A A AAA
+	# A A AAA A A               Invalid, eFirst dangling in R
+	# A A AAA AAA      A A
+	# A A AAA A A A             Invalid, eFirst dangling in R
+	# A A AAA AAA A    A A A
+	print("Group 2"); checkNum = 1
+	check(AeA_AAA *rcSuper* A_, {}, 0)
+	check(AeA_AAA *rcSuper* A_A, {iso(0, AeA_AAA)})
+	check(AeA_AAA *rcSuper* AeA_, {}, 0)
+	check(AeA_AAA *rcSuper* AAA_, {iso(0, AeA_)})
+	check(AeA_AAA *rcSuper* AeA_A, {}, 0)
+	check(AeA_AAA *rcSuper* AAA_A, {iso(0, AeA_A)})
+	# A A AAA A A A A  A A AAA
+	# A A AAA A A AAA           Invalid, duplicate edge in R
+	# A A AAA AAA A A  A A A A
+	# A A AAA AAA AAA  A A AAA
+	# A A AAA AAA ABA  A A ABA
+	print("Group 3"); checkNum = 1
+	check(AeA_AAA *rcSuper* AeA_AeA, {iso(0, AeA_AAA)})
+	check(AeA_AAA *rcSuper* AeA_AAA, {}, 0)
+	check(AeA_AAA *rcSuper* AAA_AeA, {iso(0, AeA_AeA)})
+	check(AeA_AAA *rcSuper* AAA_AAA, {iso(0, AeA_AAA)})
+	check(AeA_AAA *rcSuper* AAA_ABA, {iso(0, AeA_ABA)})
+	# AAA A A A        AAA A
+	# AAA A A A A A    AAA A
+	# AAA A A AAA A             Invalid, duplicate edge in L
+	print("Group 4"); checkNum = 1
+	check(AAA_AeA *rcSuper* A_, {iso(0, AAA_A)})
+	check(AAA_AeA *rcSuper* AeA_A, {iso(0, AAA_A)})
+	check(AAA_AeA *rcSuper* AAA_A, {}, 0)
+	# AAA A A A A A A  AAA A A
+	# AAA A A A A AAA  AAA AAA
+	# AAA A A A A ABA  AAA ABA
+	# AAA A A AAA A A           Invalid, duplicate edge in L
+	# AAA A A AAA AAA           Invalid, duplicate edge in L
+	# AAA A A AAA ABA           Invalid, duplicate edge in L
+	print("Group 5"); checkNum = 1
+	check(AAA_AeA *rcSuper* AeA_AeA, {iso(0, AAA_AeA)})
+	check(AAA_AeA *rcSuper* AeA_AAA, {iso(0, AAA_AAA)})
+	check(AAA_AeA *rcSuper* AeA_ABA, {iso(0, AAA_ABA)})
+	check(AAA_AeA *rcSub* AAA_AeA, {}, 0)
+	check(AAA_AeA *rcSub* AAA_AAA, {}, 0)
+	check(AAA_AeA *rcSub* AAA_ABA, {}, 0)
+	# AAA AAA A                 Invalid, eFirst dangling in R
+	# AAA AAA A   A    AAA AAA
+	# AAA AAA A A A             Invalid, eFirst dangling in R
+	# AAA AAA AAA A    AAA A
+	print("Group 6"); checkNum = 1
+	check(AAA_AAA *rcSuper* A_, {}, 0)
+	check(AAA_AAA *rcSuper* A_A, {iso(0, AAA_AAA)})
+	check(AAA_AAA *rcSuper* AeA_A, {}, 0)
+	check(AAA_AAA *rcSuper* AAA_A, {iso(0, AAA_A)})
+	# AAA AAA A A AAA           Invalid, duplicate edge in R
+	# AAA AAA AAA A A  AAA A A
+	# AAA AAA AAA AAA  AAA AAA
+	# AAA AAA AAA ABA  AAA ABA
+	print("Group 7"); checkNum = 1
+	check(AAA_AAA *rcSuper* AeA_AAA, {}, 0)
+	check(AAA_AAA *rcSuper* AAA_AeA, {iso(0, AAA_AeA)})
+	check(AAA_AAA *rcSuper* AAA_AAA, {iso(0, AAA_AAA)})
+	check(AAA_AAA *rcSuper* AAA_ABA, {iso(0, AAA_ABA)})
+	# AAA ABA A A AAA           Invalid, duplicate edge in R
+	# AAA ABA ABA A A  AAA A A
+	# AAA ABA ABA ABA  AAA ABA
+	# AAA ABA ABA AAA  AAA AAA
+	# AAA ABA ABA ACA  AAA ACA
+	print("Group 8"); checkNum = 1
+	check(AAA_ABA *rcSuper* AeA_AAA, {}, 0)
+	check(AAA_ABA *rcSuper* ABA_AeA, {iso(0, AAA_AeA)})
+	check(AAA_ABA *rcSuper* ABA_ABA, {iso(0, AAA_ABA)})
+	check(AAA_ABA *rcSuper* ABA_AAA, {iso(0, AAA_AAA)})
+	check(AAA_ABA *rcSuper* ABA_ACA, {iso(0, AAA_ACA)})
+
+
+	if False:
+		# ===== ===== ===== ============== ===========
+		# First Sec   New   Note
+		# == == == == == == =================================================
+		# L  R  L  R  L  R  
+		# == == == == == == ==================================================
+
+		# ===== ===== ===== ==================
+		# First Sec   New   Note
+		# == == == == == == =================================================
+		# L  R  L  R  L  R  
+		# == == == == == == ==================================================
+		#    B  B           Del
+		#    B  B  B     B
+		#    B  B  A     A
+		#    B  B  C     C
+		check(_B *rcSuper* B_, {iso(0, _)})
+		check(_B *rcSuper* B_B, {iso(0, _B)})
+		check(_B *rcSuper* B_A, {iso(0, _A)})
+		check(_B *rcSuper* B_C, {iso(0, _C)})
+		# -- -- -- -- -- -- ------------------------------------------------
+		# B  B  B     B
+		# B  B  B  B  B  B
+		# B  B  B  A  B  A
+		# B  B  B  C  B  C
+		check(B_B *rcSuper* B_, {iso(0, B_)})
+		check(B_B *rcSuper* B_B, {iso(0, B_B)})
+		check(B_B *rcSuper* B_A, {iso(0, B_A)})
+		check(B_B *rcSuper* B_C, {iso(0, B_C)})
+		# -- -- -- -- -- -- ------------------------------------------------
+		# A  B  B     A
+		# A  B  B  B  A  B
+		# A  B  B  A  A  A
+		# A  B  B  C  A  C
+		check(A_B *rcSuper* B_, {iso(0, A_)})
+		check(A_B *rcSuper* B_B, {iso(0, A_B)})
+		check(A_B *rcSuper* B_A, {iso(0, A_A)})
+		check(A_B *rcSuper* B_C, {iso(0, A_C)})
+		# ===== ===== ===== ==================
+
diff --git a/test/py/rc/rules.py b/test/py/rc/rules.py
new file mode 100644
index 0000000..e8793ee
--- /dev/null
+++ b/test/py/rc/rules.py
@@ -0,0 +1,361 @@
+_ = ruleGMLString("""rule [ ruleID "->"
+]""");
+_A = ruleGMLString("""rule [ ruleID "-> A"
+	right [
+		node [ id 0 label "A" ]
+	]
+]""");
+_AeA = ruleGMLString("""rule [ ruleID "-> A A"
+	right [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+]""");
+_AAA = ruleGMLString("""rule [ ruleID "-> AAA"
+	right [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+_ABA = ruleGMLString("""rule [ ruleID "-> ABA"
+	right [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "B" ]
+	]
+]""");
+_AAB = ruleGMLString("""rule [ ruleID "-> AAB"
+	right [
+		node [ id 0 label "A" ]
+		node [ id 1 label "B" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+_B = ruleGMLString("""rule [ ruleID "-> B"
+	right [
+		node [ id 0 label "B" ]
+	]
+]""");
+A_ = ruleGMLString("""rule [ ruleID "A ->"
+	left [
+		node [ id 0 label "A" ]
+	]
+]""");
+A__A = ruleGMLString("""rule [ ruleID "A -> other A"
+	left [
+		node [ id 0 label "A" ]
+	]
+	right [
+		node [ id 1 label "A" ]
+	]
+]""");
+A_A = ruleGMLString("""rule [ ruleID "A -> A"
+	context [
+		node [ id 0 label "A" ]
+	]
+]""");
+A_AeA = ruleGMLString("""rule [ ruleID "A -> A A"
+	context [
+		node [ id 0 label "A" ]
+	]
+	right [
+		node [ id 1 label "A" ]
+	]
+]""");
+A_AAA = ruleGMLString("""rule [ ruleID "A -> AAA"
+	context [
+		node [ id 0 label "A" ]
+	]
+	right [
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+A_ABA = ruleGMLString("""rule [ ruleID "A -> ABA"
+	context [
+		node [ id 0 label "A" ]
+	]
+	right [
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "B" ]
+	]
+]""");
+A_AAB = ruleGMLString("""rule [ ruleID "A -> AAB"
+	context [
+		node [ id 0 label "A" ]
+	]
+	right [
+		node [ id 1 label "B" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+A_B = ruleGMLString("""rule [ ruleID "A -> B"
+	left [
+		node [ id 0 label "A" ]
+	]
+	right [
+		node [ id 0 label "B" ]
+	]
+]""");
+A_BAA = ruleGMLString("""rule [ ruleID "A -> BAA"
+	left [
+		node [ id 0 label "A" ]
+	]
+	right [
+		node [ id 0 label "B" ]
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+A_C = ruleGMLString("""rule [ ruleID "A -> C"
+	left [
+		node [ id 0 label "A" ]
+	]
+	right [
+		node [ id 0 label "C" ]
+	]
+]""");
+AeA_ = ruleGMLString("""rule [ ruleID "A A ->"
+	left [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+]""");
+AeA_A = ruleGMLString("""rule [ ruleID "A A -> A"
+	left [
+		node [ id 0 label "A" ]
+	]
+	context [
+		node [ id 1 label "A" ]
+	]
+]""");
+AeA_AeA = ruleGMLString("""rule [ ruleID "A A -> A A"
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+]""");
+AeA_AAA = ruleGMLString("""rule [ ruleID "A A -> AAA"
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+	right [
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+AeA_ABA = ruleGMLString("""rule [ ruleID "A A -> ABA"
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+	right [
+		edge [ source 0 target 1 label "B" ]
+	]
+]""");
+AeB_AAB = ruleGMLString("""rule [ ruleID "AeB -> AAB"
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "B" ]
+	]
+	right [
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+AAA_ = ruleGMLString("""rule [ ruleID "AAA ->"
+	left [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+AAA_A = ruleGMLString("""rule [ ruleID "AAA -> A"
+	left [
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+	]
+]""");
+AAA_AeA = ruleGMLString("""rule [ ruleID "AAA -> A A"
+	left [
+		edge [ source 0 target 1 label "A" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+]""");
+AAA_AAA = ruleGMLString("""rule [ ruleID "AAA -> AAA"
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+AAA_ABA = ruleGMLString("""rule [ ruleID "AAA -> ABA"
+	left [
+		edge [ source 0 target 1 label "A" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+	right [
+		edge [ source 0 target 1 label "B" ]
+	]
+]""");
+AAA_ACA = ruleGMLString("""rule [ ruleID "AAA -> ACA"
+	left [
+		edge [ source 0 target 1 label "A" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+	right [
+		edge [ source 0 target 1 label "C" ]
+	]
+]""");
+AAB_ = ruleGMLString("""rule [ ruleID "AAB ->"
+	left [
+		node [ id 0 label "A" ]
+		node [ id 1 label "B" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+AAB_AeB = ruleGMLString("""rule [ ruleID "AAB -> A B"
+	left [
+		edge [ source 0 target 1 label "A" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "B" ]
+	]
+]""");
+AAB_AAB = ruleGMLString("""rule [ ruleID "AAB -> AAB"
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "B" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+AAB_ABB = ruleGMLString("""rule [ ruleID "AAB -> ABB"
+	left [
+		edge [ source 0 target 1 label "A" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "B" ]
+	]
+	right [
+		edge [ source 0 target 1 label "B" ]
+	]
+]""");
+ABA_ = ruleGMLString("""rule [ ruleID "ABA ->"
+	left [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "B" ]
+	]
+]""");
+ABA__AAA = ruleGMLString("""rule [ ruleID "ABA -> AAA other"
+	left [
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "B" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+	]
+	right [
+		node [ id 2 label "A" ]
+		edge [ source 0 target 2 label "A" ]
+	]
+]""");
+ABA_A = ruleGMLString("""rule [ ruleID "ABA -> A"
+	left [
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "B" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+	]
+]""");
+ABA_AeA = ruleGMLString("""rule [ ruleID "ABA -> A A"
+	left [
+		edge [ source 0 target 1 label "B" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+]""");
+ABA_AAA = ruleGMLString("""rule [ ruleID "ABA -> AAA"
+	left [
+		edge [ source 0 target 1 label "B" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+	right [
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
+ABA_ABA = ruleGMLString("""rule [ ruleID "ABA -> ABA"
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "B" ]
+	]
+]""");
+ABA_ACA = ruleGMLString("""rule [ ruleID "ABA -> ACA"
+	left [
+		edge [ source 0 target 1 label "B" ]
+	]
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "A" ]
+	]
+	right [
+		edge [ source 0 target 1 label "C" ]
+	]
+]""");
+
+B_ = ruleGMLString("""rule [ ruleID "B ->"
+	left [
+		node [ id 0 label "B" ]
+	]
+]""");
+B_A = ruleGMLString("""rule [ ruleID "B -> A"
+	left [
+		node [ id 0 label "B" ]
+	]
+	right [
+		node [ id 0 label "A" ]
+	]
+]""");
+B_B = ruleGMLString("""rule [ ruleID "B -> B"
+	context [
+		node [ id 0 label "B" ]
+	]
+]""");
+B_C = ruleGMLString("""rule [ ruleID "B -> C"
+	left [
+		node [ id 0 label "B" ]
+	]
+	right [
+		node [ id 0 label "C" ]
+	]
+]""");
+B_BAA = ruleGMLString("""rule [ ruleID "B -> BAA"
+	context [
+		node [ id 0 label "B" ]
+	]
+	right [
+		node [ id 1 label "A" ]
+		edge [ source 0 target 1 label "A" ]
+	]
+]""");
diff --git a/test/py/rc/test.py b/test/py/rc/test.py
new file mode 100644
index 0000000..3caf87e
--- /dev/null
+++ b/test/py/rc/test.py
@@ -0,0 +1,56 @@
+include("rules.py")
+for a in inputRules:
+	a.print()
+	a.printTermState()
+
+rc = 'dummy'
+iso = 'dummy'
+
+checkNum = 0
+def check(exp, checks, resSize=1):
+	global checkNum
+	print("Check", checkNum, exp)
+	checkNum += 1
+	res = rc.eval(exp)
+	def redo():
+		config.rc.verbose = True
+		rc.eval(exp)
+	if len(rc.products) != 0:
+		postSection("Product Error, Result")
+		print("ERROR")
+		print("=============================================================")
+		for a in res: a.print()
+		redo()
+		assert False
+	if len(res) != resSize:
+		postSection("Len Error, Result")
+		print("ERROR")
+		print("=============================================================")
+		for a in res: a.print()
+		redo()
+		assert False
+	for a in checks:
+		if not a(res):
+			postSection("Check Error, Result")
+			print("ERROR")
+			print("=============================================================")
+			for a in res: a.print()
+			redo()
+			assert False
+rcSub = rcSub(allowPartial=False)
+rcSuper = rcSuper(allowPartial=False)
+rcCommonMax = rcCommon(maximum=True, connected=False)
+rcCommon = rcCommon(maximum=False, connected=False)
+
+def testSettings(settings):
+	global rc
+	global iso
+	global checkNum
+	checkNum = 0
+	rc = rcEvaluator(inputRules, labelSettings=settings)
+	iso = lambda index, rule: lambda res: res[index].isomorphism(rule, labelSettings=settings) > 0
+	include("checks.py", checkDup=False, skipDup=False)
+	doChecks()
+testSettings(LabelSettings(LabelType.String, LabelRelation.Isomorphism))
+testSettings(LabelSettings(LabelType.Term, LabelRelation.Isomorphism))
+#testSettings(LabelSettings(LabelType.String, LabelRelation.Isomorphism, LabelRelation.Isomorphism))
diff --git a/test/py/rc/unification.py b/test/py/rc/unification.py
new file mode 100644
index 0000000..67ec8f9
--- /dev/null
+++ b/test/py/rc/unification.py
@@ -0,0 +1,20 @@
+config.rc.verbose = True
+inc = ruleGMLString("""rule [
+	ruleID "inc"
+	left [
+		node [ id 0 label "NUM(_N)" ]
+	]
+	right [
+		node [ id 0 label "NUM(s(_N))" ]
+	]
+]""")
+inc.printTermState()
+a = graphGMLString("""graph [
+	node [ id 0 label "NUM(0)" ]
+]""")
+
+rcEval = rcEvaluator(inputRules, labelSettings=LabelSettings(LabelType.Term, LabelRelation.Specialisation))
+res = rcEval.eval(rcId(a) *rcSuper* inc)
+for a in res:
+	a.printTermState()
+	a.print()
diff --git a/test/py/rcEval/common.py b/test/py/rcEval/common.py
new file mode 100644
index 0000000..46d7eaa
--- /dev/null
+++ b/test/py/rcEval/common.py
@@ -0,0 +1,20 @@
+include("../formoseCommon/grammar_H.py")
+
+for a in inputRules: a.print()
+
+config.rc.printMatches = True
+
+def handleExp(exp, printRules=False):
+	rc = rcEvaluator(inputRules)
+	e = rcExp(exp)
+	print("Expression:\t", e)
+	res = rc.eval(e)
+	print("Result:\t", res)
+	print("Database:\t", rc.ruleDatabase)
+	print("Products:\t", rc.products)
+	if printRules:
+		for a in rc.ruleDatabase: a.print()
+	postSection("Products")
+	for a in rc.products: a.print()
+	rc.print()
+	inputRules.extend(a for a in rc.products)
diff --git a/test/py/rcEval/composeCommon.py b/test/py/rcEval/composeCommon.py
new file mode 100644
index 0000000..743206a
--- /dev/null
+++ b/test/py/rcEval/composeCommon.py
@@ -0,0 +1,10 @@
+include("common.py")
+
+print("Explicit -------------------------------------------------------------")
+handleExp(RCExpComposeCommon(rcExp(ketoEnol_F), rcExp(aldolAdd_F), True, True, False))
+print("Semi-implicit --------------------------------------------------------")
+handleExp(rcExp(ketoEnol_F) * rcCommon * rcExp(aldolAdd_F))
+print("Implicit -------------------------------------------------------------")
+handleExp(ketoEnol_F * rcCommon() * aldolAdd_F)
+print("Implicit 2 -----------------------------------------------------------")
+handleExp(ketoEnol_F * rcCommon * aldolAdd_F)
diff --git a/test/py/rcEval/composeParallel.py b/test/py/rcEval/composeParallel.py
new file mode 100644
index 0000000..ccda6d0
--- /dev/null
+++ b/test/py/rcEval/composeParallel.py
@@ -0,0 +1,10 @@
+include("common.py")
+
+print("Explicit -------------------------------------------------------------")
+handleExp(RCExpComposeParallel(rcExp(ketoEnol_F), rcExp(aldolAdd_F), True))
+print("Semi-implicit --------------------------------------------------------")
+handleExp(rcExp(ketoEnol_F) *rcParallel* rcExp(aldolAdd_F))
+print("Implicit -------------------------------------------------------------")
+handleExp(ketoEnol_F *rcParallel*  aldolAdd_F)
+print("Implicit 2 -----------------------------------------------------------")
+handleExp(ketoEnol_F *rcParallel(False)* aldolAdd_F)
diff --git a/test/py/rcEval/composeSub.py b/test/py/rcEval/composeSub.py
new file mode 100644
index 0000000..369a56b
--- /dev/null
+++ b/test/py/rcEval/composeSub.py
@@ -0,0 +1,10 @@
+include("common.py")
+
+print("Explicit -------------------------------------------------------------")
+handleExp(RCExpComposeSub(rcExp(ketoEnol_B), rcExp(aldolAdd_B), True, True))
+print("Semi-implicit --------------------------------------------------------")
+handleExp(rcExp(ketoEnol_B) * rcSub * rcExp(aldolAdd_B))
+print("Implicit -------------------------------------------------------------")
+handleExp(ketoEnol_B * rcSub() * aldolAdd_B)
+print("Implicit 2 -----------------------------------------------------------")
+handleExp(ketoEnol_B * rcSub * aldolAdd_B)
diff --git a/test/py/rcEval/composeSuper.py b/test/py/rcEval/composeSuper.py
new file mode 100644
index 0000000..02de451
--- /dev/null
+++ b/test/py/rcEval/composeSuper.py
@@ -0,0 +1,10 @@
+include("common.py")
+
+print("Explicit -------------------------------------------------------------")
+handleExp(RCExpComposeSuper(rcExp(aldolAdd_B), rcExp(ketoEnol_B), True, True, False))
+print("Semi-implicit --------------------------------------------------------")
+handleExp(rcExp(aldolAdd_B) * rcSuper * rcExp(ketoEnol_B))
+print("Implicit -------------------------------------------------------------")
+handleExp(aldolAdd_B * rcSuper() * ketoEnol_B)
+print("Implicit 2 -----------------------------------------------------------")
+handleExp(aldolAdd_B * rcSuper * ketoEnol_B)
diff --git a/test/py/rcEval/constraints/rFirstTransfer.py b/test/py/rcEval/constraints/rFirstTransfer.py
new file mode 100644
index 0000000..c8f7af0
--- /dev/null
+++ b/test/py/rcEval/constraints/rFirstTransfer.py
@@ -0,0 +1,9 @@
+r1 = ruleGML("rFirstTransfer_r1.gml")
+r2 = ruleGML("rFirstTransfer_r2.gml")
+
+for a in inputRules: a.print()
+
+rc = rcEvaluator(inputRules)
+rc.eval(r1 * rcSuper * r2)
+rc.print()
+for a in rc.products: a.print()
diff --git a/test/py/rcEval/constraints/rFirstTransfer_r1.gml b/test/py/rcEval/constraints/rFirstTransfer_r1.gml
new file mode 100644
index 0000000..77b5722
--- /dev/null
+++ b/test/py/rcEval/constraints/rFirstTransfer_r1.gml
@@ -0,0 +1,20 @@
+rule [
+	ruleID "R1"
+	left [
+		node [ id 1 label "A1" ]
+		node [ id 2 label "A2" ]
+	]
+	context [
+		edge [ source 1 target 2 label "-" ]
+	]
+	right [
+		node [ id 1 label "B1" ]
+		node [ id 2 label "B2" ]
+	]
+	constrainAdj [
+		id 2
+		count 1
+		op "="
+		nodeLabels [ label "on_node_A2" ]
+	]
+]
diff --git a/test/py/rcEval/constraints/rFirstTransfer_r2.gml b/test/py/rcEval/constraints/rFirstTransfer_r2.gml
new file mode 100644
index 0000000..7cf332d
--- /dev/null
+++ b/test/py/rcEval/constraints/rFirstTransfer_r2.gml
@@ -0,0 +1,14 @@
+rule [
+	ruleID "R2"
+	left [
+		node [ id 1 label "B2" ]
+		node [ id 2 label "B1" ]
+	]
+	context [
+		edge [ source 1 target 2 label "-" ]
+	]
+	right [
+		node [ id 1 label "C2" ]
+		node [ id 2 label "C1" ]
+	]
+]
diff --git a/test/py/rcEval/constraints/rSecondDelete.py b/test/py/rcEval/constraints/rSecondDelete.py
new file mode 100644
index 0000000..b5b9586
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondDelete.py
@@ -0,0 +1,9 @@
+r1 = ruleGML("rSecondDelete_r1.gml")
+r2 = ruleGML("rSecondDelete_r2.gml")
+
+for a in inputRules: a.print()
+
+rc = rcEvaluator(inputRules)
+rc.eval(r1 * rcSuper * r2)
+rc.print()
+for a in rc.products: a.print()
diff --git a/test/py/rcEval/constraints/rSecondDelete_r1.gml b/test/py/rcEval/constraints/rSecondDelete_r1.gml
new file mode 100644
index 0000000..b8b56c7
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondDelete_r1.gml
@@ -0,0 +1,11 @@
+rule [
+	ruleID "R1"
+	left [
+		node [ id 1 label "A1" ]
+	]
+	right [
+		node [ id 1 label "B1" ]
+		node [ id 2 label "B2" ]
+		edge [ source 1 target 2 label "-" ]
+	]
+]
diff --git a/test/py/rcEval/constraints/rSecondDelete_r2.gml b/test/py/rcEval/constraints/rSecondDelete_r2.gml
new file mode 100644
index 0000000..20b3890
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondDelete_r2.gml
@@ -0,0 +1,17 @@
+rule [
+	ruleID "R2"
+	left [
+		node [ id 1 label "B2" ]
+		node [ id 2 label "B1" ]
+		edge [ source 1 target 2 label "-" ]
+	]
+	right [
+		node [ id 2 label "C1" ]
+	]
+	constrainAdj [
+		id 1
+		count 1
+		op "="
+		nodeLabels [ label "on_node_B2" ]
+	]
+]
diff --git a/test/py/rcEval/constraints/rSecondInLeft.py b/test/py/rcEval/constraints/rSecondInLeft.py
new file mode 100644
index 0000000..0092ce5
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondInLeft.py
@@ -0,0 +1,9 @@
+r1 = ruleGML("rSecondInLeft_r1.gml")
+r2 = ruleGML("rSecondInLeft_r2.gml")
+
+for a in inputRules: a.print()
+
+rc = rcEvaluator(inputRules)
+rc.eval(r1 * rcSuper * r2)
+rc.print()
+for a in rc.products: a.print()
diff --git a/test/py/rcEval/constraints/rSecondInLeft_r1.gml b/test/py/rcEval/constraints/rSecondInLeft_r1.gml
new file mode 100644
index 0000000..a9f764a
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondInLeft_r1.gml
@@ -0,0 +1,14 @@
+rule [
+	ruleID "R1"
+	left [
+		node [ id 1 label "A1" ]
+		node [ id 2 label "A2" ]
+	]
+	context [
+		edge [ source 1 target 2 label "-" ]
+	]
+	right [
+		node [ id 1 label "B1" ]
+		node [ id 2 label "B2" ]
+	]
+]
diff --git a/test/py/rcEval/constraints/rSecondInLeft_r2.gml b/test/py/rcEval/constraints/rSecondInLeft_r2.gml
new file mode 100644
index 0000000..ad20067
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondInLeft_r2.gml
@@ -0,0 +1,20 @@
+rule [
+	ruleID "R2"
+	left [
+		node [ id 1 label "B2" ]
+		node [ id 2 label "B1" ]
+	]
+	context [
+		edge [ source 1 target 2 label "-" ]
+	]
+	right [
+		node [ id 1 label "C2" ]
+		node [ id 2 label "C1" ]
+	]
+	constrainAdj [
+		id 1
+		count 1
+		op "="
+		nodeLabels [ label "on_node_B2" ]
+	]
+]
diff --git a/test/py/rcEval/constraints/rSecondToRightSide.py b/test/py/rcEval/constraints/rSecondToRightSide.py
new file mode 100644
index 0000000..f7fe0f4
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondToRightSide.py
@@ -0,0 +1,9 @@
+r1 = ruleGML("rSecondToRightSide_r1.gml")
+r2 = ruleGML("rSecondToRightSide_r2.gml")
+
+for a in inputRules: a.print()
+
+rc = rcEvaluator(inputRules)
+rc.eval(r1 * rcSuper * r2)
+rc.print()
+for a in rc.products: a.print()
diff --git a/test/py/rcEval/constraints/rSecondToRightSide_r1.gml b/test/py/rcEval/constraints/rSecondToRightSide_r1.gml
new file mode 100644
index 0000000..b8b56c7
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondToRightSide_r1.gml
@@ -0,0 +1,11 @@
+rule [
+	ruleID "R1"
+	left [
+		node [ id 1 label "A1" ]
+	]
+	right [
+		node [ id 1 label "B1" ]
+		node [ id 2 label "B2" ]
+		edge [ source 1 target 2 label "-" ]
+	]
+]
diff --git a/test/py/rcEval/constraints/rSecondToRightSide_r2.gml b/test/py/rcEval/constraints/rSecondToRightSide_r2.gml
new file mode 100644
index 0000000..ad20067
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondToRightSide_r2.gml
@@ -0,0 +1,20 @@
+rule [
+	ruleID "R2"
+	left [
+		node [ id 1 label "B2" ]
+		node [ id 2 label "B1" ]
+	]
+	context [
+		edge [ source 1 target 2 label "-" ]
+	]
+	right [
+		node [ id 1 label "C2" ]
+		node [ id 2 label "C1" ]
+	]
+	constrainAdj [
+		id 1
+		count 1
+		op "="
+		nodeLabels [ label "on_node_B2" ]
+	]
+]
diff --git a/test/py/rcEval/constraints/rSecondTransfer.py b/test/py/rcEval/constraints/rSecondTransfer.py
new file mode 100644
index 0000000..0dd6092
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondTransfer.py
@@ -0,0 +1,9 @@
+r1 = ruleGML("rSecondTransfer_r1.gml")
+r2 = ruleGML("rSecondTransfer_r2.gml")
+
+for a in inputRules: a.print()
+
+rc = rcEvaluator(inputRules)
+rc.eval(r1 * rcSuper * r2)
+rc.print()
+for a in rc.products: a.print()
diff --git a/test/py/rcEval/constraints/rSecondTransfer_r1.gml b/test/py/rcEval/constraints/rSecondTransfer_r1.gml
new file mode 100644
index 0000000..a9f764a
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondTransfer_r1.gml
@@ -0,0 +1,14 @@
+rule [
+	ruleID "R1"
+	left [
+		node [ id 1 label "A1" ]
+		node [ id 2 label "A2" ]
+	]
+	context [
+		edge [ source 1 target 2 label "-" ]
+	]
+	right [
+		node [ id 1 label "B1" ]
+		node [ id 2 label "B2" ]
+	]
+]
diff --git a/test/py/rcEval/constraints/rSecondTransfer_r2.gml b/test/py/rcEval/constraints/rSecondTransfer_r2.gml
new file mode 100644
index 0000000..d4556b5
--- /dev/null
+++ b/test/py/rcEval/constraints/rSecondTransfer_r2.gml
@@ -0,0 +1,22 @@
+rule [
+	ruleID "R2"
+	left [
+		node [ id 3 label "B2" ]
+		node [ id 2 label "B1" ]
+	]
+	context [
+		node [ id 1 label "Q" ]
+		edge [ source 3 target 2 label "-" ]
+	]
+	right [
+		node [ id 3 label "C2" ]
+		node [ id 2 label "C1" ]
+		edge [ source 2 target 1 label "=" ]
+	]
+	constrainAdj [
+		id 1
+		count 1
+		op "="
+		nodeLabels [ label "on_node_Q" ]
+	]
+]
diff --git a/test/py/rcEval/convertGraph.py b/test/py/rcEval/convertGraph.py
new file mode 100644
index 0000000..645e140
--- /dev/null
+++ b/test/py/rcEval/convertGraph.py
@@ -0,0 +1,14 @@
+include("common.py")
+
+def convert(name, cls, f):
+	postSection(name)
+	print(name + ", explicit -------------------------------------------------")
+	handleExp(cls(formaldehyde))
+	print(name + ", implicit -------------------------------------------------")
+	handleExp(f(formaldehyde))
+	print(name + ", multi ----------------------------------------------------")
+	handleExp(f(inputGraphs), True)
+	print()
+convert("Bind", RCExpBind, rcBind)
+convert("Id", RCExpId, rcId)
+convert("Unbind", RCExpUnbind, rcUnbind)
diff --git a/test/py/rcEval/rule.py b/test/py/rcEval/rule.py
new file mode 100644
index 0000000..eeee19a
--- /dev/null
+++ b/test/py/rcEval/rule.py
@@ -0,0 +1,7 @@
+include("common.py")
+
+print("Explicit -----------------------------------------------------------------")
+handleExp(rcExp(ketoEnol_F))
+
+print("Implicit -----------------------------------------------------------------")
+handleExp(ketoEnol_F)
diff --git a/test/py/rcEval/testFull.py b/test/py/rcEval/testFull.py
new file mode 100644
index 0000000..92986b1
--- /dev/null
+++ b/test/py/rcEval/testFull.py
@@ -0,0 +1,26 @@
+a = ruleGMLString("""rule [
+	ruleID "a"
+	context [
+		node [ id 0 label "A" ]
+	]
+]""")
+b = ruleGMLString("""rule [
+	ruleID "b"
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "B" ]
+	]
+]""")
+c = ruleGMLString("""rule [
+	ruleID "c"
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "B" ]
+		node [ id 2 label "C" ]
+	]
+]""")
+rc = rcEvaluator(inputRules)
+for i in [a, b, c]:
+	for j in [a, b, c]:
+		print(i, j)
+		rc.eval(i *rcSuper(allowPartial=False)* j)
diff --git a/test/py/rcEval/union.py b/test/py/rcEval/union.py
new file mode 100644
index 0000000..5cbca72
--- /dev/null
+++ b/test/py/rcEval/union.py
@@ -0,0 +1,10 @@
+include("common.py")
+
+print("Explicit --------------------------------------------------------------------")
+handleExp(rcExp({ketoEnol_F, ketoEnol_B}))
+
+print("Implicit --------------------------------------------------------------------")
+handleExp({ketoEnol_F, ketoEnol_B})
+
+print("Input rules -----------------------------------------------------------------")
+handleExp(inputRules)
diff --git a/test/py/rule/labelType.py b/test/py/rule/labelType.py
new file mode 100644
index 0000000..5ba6791
--- /dev/null
+++ b/test/py/rule/labelType.py
@@ -0,0 +1,30 @@
+template = """rule [
+    %s
+    context [
+        node [ id 0 label "H+" ]
+    ]
+]"""
+lsString = LabelSettings(LabelType.String, LabelRelation.Unification)
+lsTerm = LabelSettings(LabelType.Term, LabelRelation.Unification)
+s = ruleGMLString(template % 'labelType "string"')
+t = ruleGMLString(template % 'labelType "term"')
+n = ruleGMLString(template % '')
+for a in s, t, n:
+    print("LabelType:", a.labelType)
+    print("GML\n===========================")
+    print(a.getGMLString())
+    print("GML end\n===========================")
+
+def fail(f, a, ls, o):
+    try:
+        f(a, ls, o)
+        assert False
+    except LogicError as e:
+        print(e)
+f = lambda a, ls, o: dgRuleComp([], a, ls, ignoreRuleLabelTypes=o)
+f(s, lsString, False)
+f(t, lsTerm, False)
+fail(f, s, lsTerm, False)
+fail(f, t, lsString, False)
+f(s, lsTerm, True)
+f(t, lsString, True)
diff --git a/test/py/rule/rule.gml b/test/py/rule/rule.gml
new file mode 100644
index 0000000..5963eac
--- /dev/null
+++ b/test/py/rule/rule.gml
@@ -0,0 +1,27 @@
+rule [
+	ruleID  "Test Rule"
+	left [
+		node [ id 1 label "L" ]
+		node [ id 4 label "LC_A" ]
+		edge [ source 1 target 4 label "-" ]
+	]
+	context [
+		node [ id 3 label "C" ]
+		edge [ source 3 target 4 label "-" ]
+	]
+	right [
+		node [ id 2 label "R" ]
+		node [ id 4 label "LC_B" ]
+		edge [ source 2 target 4 label "-" ]
+	]
+	constrainAdj [
+		id 1 count 0 op "="
+		nodeLabels [ label "A" label "B" ]
+		edgeLabels [ label "Q" label "R" ]
+	]
+	constrainAdj [
+		id 4 count 2 op "<"
+		nodeLabels [ label "C" label "D" ]
+		edgeLabels [ label "S" label "T" ]
+	]
+]
diff --git a/test/py/rule/rule.py b/test/py/rule/rule.py
new file mode 100644
index 0000000..0c3c57b
--- /dev/null
+++ b/test/py/rule/rule.py
@@ -0,0 +1,77 @@
+testRule = ruleGMLString("""
+	rule [ ruleID "inline rule" context [ node [ id 0 label "A" ] ] ]
+""")
+testRuleInverse = testRule.makeInverse()
+ruleGML("rule.gml")
+a = ruleGML("rule.gml")
+print("a:\t", a)
+print("inputRules:\t", inputRules)
+with open("myRule.gml", "w") as f:
+	f.write(a.getGMLString())
+a = ruleGML(CWDPath("myRule.gml"))
+
+try:
+	b = a.makeInverse()
+except LogicError:
+	pass
+else:
+	assert False
+
+a.print()
+a.printGML()
+print(a.getGMLString())
+
+print("name:\t", a.name)
+a.name = "New Name"
+print("name:\t", a.name)
+
+print("numLeftComponents:\t", a.numLeftComponents)
+print("numRightComponents:\t", a.numRightComponents)
+
+# Check eq operator
+inputRules[:] = []
+a = ruleGML("rule.gml")
+rs = inputRules  # TODO: make rs something comming from C++ to get difference Python object with same ptr 
+b = rs[0]
+print("a:", a)
+print("b:", b)
+assert a == b
+assert a.isomorphism(b) > 0
+assert a.isomorphism(testRule) == 0
+
+a = ruleGMLString("""rule [ context [ node [ id 0 label "C" ] ] ]""")
+a.print()
+
+
+inputRules[:] = []
+include("../formoseCommon/grammar.py")
+postSection("Formose")
+for a in inputRules: a.print()
+inputRules[0].print(GraphPrinter(), GraphPrinter())
+
+try:
+	rBad = ruleGMLString("""rule [
+		left  [ node [ id 0 label "A" ] ]
+		right [ node [ id 0 label "A" ] ]
+	]""")
+except InputError as e:
+	print("InputError catched")
+try:
+	rBad = ruleGMLString("""rule [
+		left  [ edge [ source 0 target 1 label "A" ] ]
+		context [
+			node [ id 0 label "A" ]
+			node [ id 1 label "A" ]
+		]
+		right  [ edge [ source 0 target 1 label "A" ] ]
+	]""")
+except InputError as e:
+	print("InputError catched")
+r = ruleGMLString("""rule [
+	context [
+		node [ id 0 label "*" ]
+		node [ id 1 label "*" ]
+		edge [ source 0 target 1 label "*" ]
+	]
+]""")
+r.printTermState()
diff --git a/test/py/rule/ruleExtId.py b/test/py/rule/ruleExtId.py
new file mode 100644
index 0000000..276296c
--- /dev/null
+++ b/test/py/rule/ruleExtId.py
@@ -0,0 +1,24 @@
+def check(a):
+	data = {42: "C", 1337: "O", 0: "U"}
+	for i in range(a.minExternalId, a.maxExternalId + 1):
+		v = a.getVertexFromExternalId(i)
+		if i in data:
+			assert not v.isNull()
+			assert v.left.stringLabel == data[i]
+		else:
+			assert v.isNull()
+	for i, s in data.items():
+		v = a.getVertexFromExternalId(i)
+		assert not v.isNull()
+		assert v.left.stringLabel == data[i]
+		
+
+# GML
+a = ruleGMLString("""rule [ context [
+	node [ id 42 label "C" ]
+	node [ id 1337 label "O" ]
+	node [ id 0 label "U" ]
+	edge [ source 42 target 1337 label "-" ]
+	edge [ source 1337 target 0 label "-" ]
+] ]""")
+check(a)
diff --git a/test/py/rule/ruleGML.py b/test/py/rule/ruleGML.py
new file mode 100644
index 0000000..dc0b083
--- /dev/null
+++ b/test/py/rule/ruleGML.py
@@ -0,0 +1,27 @@
+def check(res, gml):
+	try:
+		p = ruleGMLString(gml)
+	except InputError as e:
+		if res:
+			raise e
+		else:
+			print("Yay, error:\n%s" % str(e), end="")
+	else:
+		if not res:
+			print("Expected InputError.")
+			assert False
+		else:
+			print("Yay, no error.")
+check(False, """rule [ left [ node [ id 0 ] ] ]""")
+check(False, """rule [ context [ node [ id 0 ] ] ]""")
+check(False, """rule [ right [ node [ id 0 ] ] ]""")
+check(False, """rule [
+	right [ node [ id 0 ] ]
+	context [ node [ id 0 ] ]
+	left [ node [ id 0 ] ]
+]""")
+check(True, """rule [
+	right [ node [ id 0 ] ]
+	context [ node [ id 0 label "A" ] ]
+	left [ node [ id 0 ] ]
+]""")
diff --git a/test/py/rule/ruleInterface.py b/test/py/rule/ruleInterface.py
new file mode 100644
index 0000000..6b504b0
--- /dev/null
+++ b/test/py/rule/ruleInterface.py
@@ -0,0 +1,99 @@
+a = ruleGMLString("""rule [
+	left [
+		node [ id 0 label "C+." ]
+		edge [ source 100 target 0 label "-" ]
+	]
+	context [
+		node [ id 2 label "H-." ]
+		edge [ source 100 target 2 label ":" ]
+		node [ id 100 label "U" ]
+	]
+	right [
+		node [ id 1 label "O-." ]
+		edge [ source 100 target 1 label "=" ]
+	]
+]""")
+
+print("Core\n" + "="*80)
+print("numVertices:", a.numVertices)
+for v in a.vertices:
+	print("Vertex:", v.rule, v.id, v.degree)
+	if v.left.isNull():
+		print("\tLeft: N/A")
+	else:
+		print("\tLeft:", v.left, v.left.stringLabel)
+		assert v.left.core == v
+	if v.context.isNull():
+		print("\tContext: N/A")
+	else:
+		print("\tContext:", v.context)
+		assert v.context.core == v
+	if v.right.isNull():
+		print("\tRight: N/A")
+	else:
+		print("\tRight:", v.right, v.right.stringLabel)
+		assert v.right.core == v
+	for e in v.incidentEdges:
+		print("\tEdge:", e.target.id)
+print("numEdges:", a.numEdges)
+for e in a.edges:
+	print("Edge:", e.rule, e.source.id, e.target.id)
+	if e.left.isNull():
+		print("Left: N/A")
+	else:
+		print("Left:", e.left)
+		assert e.left.core == e
+	if e.context.isNull():
+		print("Context: N/A")
+	else:
+		print("Context:", e.context)
+		assert e.context.core == e
+	if e.right.isNull():
+		print("Right: N/A")
+	else:
+		print("Right:", e.right)
+		assert e.right.core == e
+
+
+def checkGraph(a, withLabels, name):
+	print(name + "\n" + "="*80)
+	print("rule:", a.rule.name)
+	print("numVertices:", a.numVertices)
+	for v in a.vertices:
+		if withLabels:
+			print("Vertex:", v.rule, v.id, v.degree, v.stringLabel, v.atomId, v.isotope, v.charge, v.radical)
+		else:
+			print("Vertex:", v.rule, v.id, v.degree)
+		assert v.id == v.core.id
+		for e in v.incidentEdges:
+			print("\tEdge:", e.target.id)
+	print("numEdges:", a.numEdges)
+	for e in a.edges:
+		if withLabels:
+			print("Edge:", e.rule, e.source.id, e.target.id, e.stringLabel, e.bondType)
+		else:
+			print("Edge:", e.rule, e.source.id, e.target.id)
+		print("Core:", e.core)
+
+checkGraph(a.left, True, "Left")
+checkGraph(a.context, False, "Context")
+checkGraph(a.right, True, "Right")
+
+
+
+a = ruleGMLString("""rule [
+	context [
+		node [ id 0 label "A" ]
+		node [ id 1 label "B" ]
+		edge [ source 0 target 1 label "-" ]
+	]
+]""")
+v0 = a.vertices[0]
+v1 = a.vertices[1]
+assert v0 == v0
+assert v0 != v1
+e1 = list(v0.incidentEdges)[0]
+e2 = list(v1.incidentEdges)[0]
+assert e1 == e2
+assert not e1 != e2
+
diff --git a/test/py/rule/topo.py b/test/py/rule/topo.py
new file mode 100644
index 0000000..f7446cc
--- /dev/null
+++ b/test/py/rule/topo.py
@@ -0,0 +1,24 @@
+def fail(s):
+    try:
+        a = ruleGMLString("rule [ %s ]" % s)
+        a.print()
+        print(a.getGMLString())
+        assert False
+    except InputError as e:
+        print(e)
+
+for side in "left", "context", "right":
+    fail("""
+        %s [
+            node [ id 0 label "C" ]
+            node [ id 1 label "C" ]
+            edge [ source 0 target 1 label "-" ]
+            edge [ source 1 target 0 label "-" ]
+        ]
+    """ % side)
+    fail("""
+        %s [
+            node [ id 0 label "C" ]
+            edge [ source 0 target 0 label "-" ]
+        ]
+    """ % side)
diff --git a/test/py/runAll.sh b/test/py/runAll.sh
new file mode 100755
index 0000000..8980a63
--- /dev/null
+++ b/test/py/runAll.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+function handleFile {
+	f=$1
+	shift
+	if test "x$1" = "x-p"; then
+		mod=$2
+		shift
+		shift
+	else
+		mod="mod"
+	fi
+	dir=$(dirname $f)
+	base=$(basename $f)
+	echo "Executing $f"
+	cd $dir
+	$mod -f $base "$@"
+	res=$?
+	if [ $res -ne 0 ]; then
+		echo "Execution of $f failed: $res"
+		echo "pwd: $(pwd)"
+		exit $res
+	fi
+	mod clean
+}
+
+origDir=$(pwd)
+
+function doIt {
+	for f in $(find . -name "*.py"); do
+		cd $origDir
+		handleFile $f "$@"
+	done
+}
+
+time doIt "$@"
diff --git a/test/py/smiles/cansmi-roundtrip.smi b/test/py/smiles/cansmi-roundtrip.smi
new file mode 100644
index 0000000..69fa9f5
--- /dev/null
+++ b/test/py/smiles/cansmi-roundtrip.smi
@@ -0,0 +1,4372 @@
+Br.CC(=O)Nc1ccc(cc1)S(=O)(=O)c1ccc(cc1)NC(=O)c1ccccc1SC(=O)CCCCn1ccccc1
+Br.CC(=O)Nc1cccc(c1)S(=O)(=O)c1cccc(NC(=O)c2ccccc2SC(=O)CCCCn2ccccc2)c1
+Br.COc1ccc(cc1)Cn1cccc(O)c1
+Br.COc1ccc2c(c1)[C@]13CCCC[C@@H]3[C@H](N(C)CC1)[C@@]12CC1
+Br.NCCCCNCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br.NCCCCNCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br.NCCCNCCCCNCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br.NCCCNCCCCNCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br.NCCCNCCCCNCCCNCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br.NCCCNCCCCNCCCNCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br.NCCCNCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br.NCCCNCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br.O=C(CCCCn1ccccc1)Sc1ccccc1C(=O)NCc1ccc(cc1)S(=O)(=O)N
+Br.O=C(CCCCn1ccccc1)Sc1ccccc1C(=O)Nc1ccc(cc1)S(=O)(=O)NC(=O)C
+Br.O=C(CCCCn1ccccc1)Sc1ccccc1C(=O)Nc1ccc(cc1)S(=O)(=O)c1ccc(cc1)N(=O)O
+Br.O=C(CCCCn1ccccc1)Sc1ccccc1C(=O)Nc1ccc(cc1)S(=O)(=O)c1ccc(cc1)NS(=O)(=O)Cc1ccccc1N(=O)O
+Br.OC(=O)CCCCCCCn1ccccc1
+Br.OC(=O)CCCCCn1ccccc1
+Br.OC(=O)CCCCn1ccccc1
+Br.OC(=O)CCn1ccccc1
+Br.OC(=O)Cn1ccccc1
+Br.Oc1cccn(Cc2ccccc2)c1
+Br/C=C(\Br)/C(=C\Br)/Br
+Br/C=C(\Br)/C[N@+]12CN3CN(CN(C3)C2)C1
+Br/C=C/C[N@+]12CN3CN(CN(C3)C2)C1.Br/C=C/C[N@+]12CN3CN(CN(C3)C2)C1
+BrC1=C(Br)[C@@]2(Br)CC[C@]1(Br)[C@@]2(Br)Br
+BrC1=C(N2CC2)C(=O)C2=C(C1=O)[C@H]1c3ccccc3[C@@H]2c2ccccc12
+BrC1=C[C@@H]2[C@H](C1=O)[C@H]1[C@H]3CC[C@H]3[C@]2(Br)[C@]21OCCO2
+BrCC(=O)/N=n\1/c2ccc(C)cc2nc2c1c1cccc3cccc2c13
+BrCC(=O)/N=n\1/c2ccc(C)cc2nc2c3c(OC)ccc4cccc(c34)c12
+BrCC(=O)/N=n\1/c2ccc(Cl)cc2nc2c1c1cccc3cccc2c13
+BrCC(=O)/N=n\1/c2ccc(Cl)cc2nc2c3c(OC)ccc4cccc(c34)c12
+BrCC(=O)/N=n\1/c2ccc(OC)cc2nc2c1c1cccc3cccc2c13
+BrCC(=O)/N=n\1/c2ccc(cc2nc2c1c1cccc3ccc(OC)c2c13)C(F)(F)F
+BrCC(=O)/N=n\1/c2ccc(cc2nc2c1c1cccc3cccc2c13)C(F)(F)F
+BrCC(=O)/N=n\1/c2ccccc2nc2c1c1cccc3cccc2c13
+BrCC(=O)/N=n\1/c2ccccc2nc2c3c(OC)ccc4cccc(c34)c12
+BrCC(=O)N1CC[C@]2(CC1)SS[C@@]1(CCN(CC1)C(=O)CBr)S2
+BrCC(=O)[C@H](OC(=O)C)[C@@H](OC(=O)C)[C@@H](OC(=O)C)C(=O)CBr
+BrCC[C@@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+BrCC[C@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+BrCC[N@+]12CC[N@+](CCBr)(CC1)C2.OC(=O)/C=C/C(=O)O
+BrCC[N@+]12CC[N@+](CCBr)(CC1)C2.OC(=O)[C@@H](O)[C@H](O)C(=O)O
+BrCC[N@+]12CC[N@+](CCBr)(CC1)C2.[O-][Cl](=O)(=O)=O
+BrCC[N@@+]12CC[N@@+](CCBr)(CC1)C2.[O-][Cl](=O)(=O)=O
+BrC[C@]1(C)CO[C@@](OC1)(c1ccccc1)c1cccs1
+BrC[C@]1(C)CO[C@](OC1)(C1CCCCC1)c1ccccc1
+Br[C-]1C(=[O+][Ru+3]23([O+]=C1C)([O+]=C(C)[C-](Br)C(=[O+]2)C)[O+]=C(C)[C-](Br)C(=[O+]3)C)C
+Br[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(Br)C6=C12
+Br[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(Br)C6=C12
+Br[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Br[C@@H](C(=O)/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)c1ccccc1
+Br[C@@H](C(=O)/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)c1ccccc1
+Br[C@@H]1CC2(OCCO2)[C@@H](Br)C[C@]21OCCO2
+Br[C@@H]1CCCCC[C@H](Br)[C@@]21OCCO2
+Br[C@@H]1CCCCC[C@H](Br)[C@]21OCCO2
+Br[C@@H]1CCCC[C@H](Br)[C@]21OCCO2
+Br[C@@H]1CC[C@@H]2[C@H](CC[C@H](Br)[C@]32OCCO3)[C@@]21OCCO2
+Br[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+Br[C@@H]1[C@H](Br)[C@@H](Br)[C@H](Br)[C@H](Br)[C@H]1Br
+Br[C@@H]1[C@H](Br)[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)[C@]2(Cl)Cl)Cl
+Br[C@@]1(Br)[C@H]2CCCC[C@@H]12
+Br[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Br[C@H](C[S@@](=O)(=O)C[C@H](Br)c1ccccc1)c1ccccc1
+Br[C@H]1CCCCC[C@@]21OCCO2
+Br[C@H]1CN2C[C@@H](Br)CN2C1
+Br[C@H]1C[C@@H](Br)[C@@H]2O[C@@](C)(C)O[C@H]12
+Br[C@H]1C[C@@](Sc2ccccc2)(C[C@@H]1Br)S(=O)(=O)c1ccccc1
+Br[C@H]1[C@@H]2CC[C@@H](CC2)[C@H]1Br
+Br[C@]1(Br)[C@@H]2CCC=CCC[C@H]12
+Br[C@]1(Br)[C@@H]2CCCCCC[C@H]12
+Br[C@]1(Br)[C@@H]2C[C@H]3[C@H](C[C@H]12)[C@H]1C[C@H]2[C@H](C[C@H]31)[C@]2(Br)Br
+Br[C@]1(Br)[C@H]2COCOC[C@@H]12
+Br[C@]1(Br)[C@]23CCCC[C@@]13CC=CC2
+Br[C@]12CC[C@H](CC1)[C@]1(Br)CC[C@H]2CC1
+Br[Co@@](Br)(/[O+]=C\1/CCCN1)/[O+]=C\1/CCCN1
+Br[N@+]12CN3CN(CN(C3)C2)C1
+Br[Ni]123(Br)[N@+]4(CC[N@+]1(CC[N@+]3(CC[N@@+]2(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1
+Brc1c2c3ccccc3ccn2c2nc3ccccc3nc12
+Brc1c2nsnc2c(Br)c2nsnc12
+Brc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(O)c(Br)c1
+Brc1cc(/C=N\C[C@@H]2CC[C@@H](C/N=C\c3cc(Br)cc(Br)c3O)CC2)c(O)c(Br)c1
+Brc1cc(Br)cc(/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)c1
+Brc1cc(cc2c1c1c(cc(cc1C2=O)[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-].C1CCc2ccc3cc4c(ccc5ccccc45)cc3c2C1
+Brc1cc2cc(C(=O)Nc3scc(n3)[C@@]34C[C@H]5C[C@H](C[C@H](C5)C4)C3)c(=O)oc2c(Br)c1
+Brc1cc2ccccc2c2c3c4ccccc4cc(Br)c3c3c(Br)cc4ccccc4c3c3c(c(Br)cc4ccccc34)c12
+Brc1ccc(N/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)cc1
+Brc1ccc(O)c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+Brc1ccc(c(O)c1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Brc1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Brc1ccc(cc1)/N=C\1/C(C)(C)/C(=N\c2ccc(Br)cc2)/[C@]1(C)C
+Brc1ccc(cc1)C(=O)/C=c/1\[nH]c2ccccc2nc1N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Brc1ccc(cc1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1
+Brc1ccc(cc1)C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)c3ccc(Br)cc3)C6=C12
+Brc1ccc(cc1)C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)c3ccc(Br)cc3)C6=C12
+Brc1ccc(cc1)C(=O)[C@@]12S[C@H](C(=O)c3ccc(Br)cc3)[C@@H](S[C@]2(S[C@@H](C(=O)c2ccc(Br)cc2)[C@H](S1)C(=O)c1ccc(Br)cc1)C(=O)c1ccc(Br)cc1)C(=O)c1ccc(Br)cc1
+Brc1ccc(cc1)C[N@+]12CN3CN(CN(C3)C2)C1
+Brc1ccc(cc1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+Brc1ccc(cc1)N1C[C@@H](OC(=O)C)CN(C[C@@H](OC(=O)C)C1)c1ccc(Br)cc1
+Brc1ccc(cc1)N1C[C@H](O)CN(C[C@H](O)C1)c1ccc(Br)cc1
+Brc1ccc(cc1)S(=O)(=O)OC[C@H]1C[C@@H]2CC[C@H]1CC2
+Brc1ccc(nc1)NC(=S)N[C@@]12C[C@@H]3C[C@H](C[C@H](C3)C2)C1
+Brc1ccc(s1)c1ccc2nnnn2n1
+Brc1ccc2N(C)C(=O)/C(=c/3\sc4nc5ccccc5n4c3=O)/c2c1
+Brc1ccc2NC(=O)/C(=c\3/sc4nc5ccccc5n4c3=O)/c2c1
+Brc1ccc2[nH]cc(/C=N/NC(=S)N[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c2c1
+Brc1ccc2c(c1)nc1C(=O)c3cccnc3c3nccc2c13
+Brc1ccc2c3nc4cc(ccc4nc3c3cccc1c23)C(F)(F)F
+Brc1ccc2nc3C(=O)c4cccnc4c4nccc(c34)c2c1
+Brc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+Brc1cccc(/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)c1
+Brc1cccc(c1)C(=O)CCN1C[C@@H]2CC[C@@H](CC2)C1
+Brc1cccc(c1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Brc1ccccc1/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Brc1sc(N2CC[C@@H](CC2)c2ccccc2)c2C(=O)C[C@H](NC(=O)C(F)(F)F)c12
+C#CC(C)(C)NC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+C#CCN1C(=O)[C@@H](c2ccccc2)[C@]2(CCN(C)CC2)C1=O
+C#CC[N@+]12CN3CN(CN(C3)C2)C1
+C#C[C@@]1(O)CCCC2=C[C@]3(SCCS3)CC[C@]12C
+C#C[C@@]1(O)C[C@@H](c2ccccc2)N(C)[C@@H](C1)c1ccccc1
+C#C[C@H](C)N1CC[C@]2(CC1)C(=O)NCN2c1ccccc1
+C#C[C@H]1CC[C@@H](CC1)NC(=O)NCCCCCCNC(=O)N[C@H]1CC[C@@H](C#C)CC1
+C#C[C@](O)(C(=O)O[C@H]1CN2CC[C@H]1CC2)c1ccccc1
+C#C[C@]1(O)CCC[C@@H]2C[C@]3(OCCO3)CC[C@@]12C
+C#Cc1cccc(c1)N1C(=O)[C@H]2[C@H]3C=C[C@@H]([C@H]2C1=O)[C@H]1C(=O)N(c2cccc(C#C)c2)C(=O)[C@@H]31
+C(C[C@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+C/C(=C\C(C)(C)C)/C(=C\C(C)(C)C)/C
+C/C(=C\C=C\C=C(\C)/C=C\C=C(/C)\C(=O)O)/C=C/C=C(\C)/C(=O)O.c1ccncc1
+C/C(=C\c1ccccc1)/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+C/C(=N/N=C(/C)\C(=N/N=C/c1ccccn1)\C)/C(=N/N=C(/C)\C(=N/N=C\c1ccccn1)\C)/C
+C/C(=N/c1ccncc1)/C(=N/c1ccncc1)/C
+C/C(=N\NC(=N)N)/C/C(=N\NC(=N)N)/C.OS(=O)(=O)O
+C/C(=N\NC(=N)N)/CC/C(=N\NC(=N)N)/C.OS(=O)(=O)O
+C/C(=N\NC(=O)C(=O)N/N=C(/C)\CCC(=O)O)/CCC(=O)O
+C/C(=N\NC(=O)c1ccccc1)/C(=N\NC(=O)c1ccccc1)/C
+C/C(=N\NC(=O)c1ccccc1O)/C1=C(C)NC(=C(/C(=N/NC(=O)c2ccccc2O)/C)[C@@H]1C)C
+C/C(=N\NC(=S)N1CCCCC1)/C(=N\NC(=S)N1CCCCC1)/C
+C/C(=N\Nc1ccccc1)/CC(=O)NC1=CC=C(CC1)NC(=O)C/C(=N\Nc1ccccc1)/C
+C/C(=N\c1ccccc1)/C(=N\c1ccccc1)/C
+C/C(=N\c1n(C)c(=O)n(C)c(=O)c1N)/C/C(=N\c1n(C)c(=O)n(C)c(=O)c1N)/C
+C/C=C/C(C)(C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+C/C=C/C(C)(C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+C/C=C/C=C/[C@H](O)CC(=O)N1O[C@@]2(C)c3ccccc3[C@]1(C)c1ccccc21
+C/C=C/C[C@H](C/C=C/C)c1cc[n+](cc1)[Pt](Cl)(Cl)(Cl)(Cl)[n+]1ccc(cc1)[C@H](C/C=C/C)C/C=C/C
+C/C=C/C[C@]1(C/C=C/C)C(=O)NC(=O)NC1=O
+C/C=C/[C@@](/C=C/C)(C(=O)OCCN(CC)CC)[C@@](/C=C/C)(/C=C/C)C(=O)OCCN(CC)CC
+C/C=C/[C@@](/C=C\C)(C(=O)OCCN(C)C)[C@@](/C=C/C)(/C=C/C)C(=O)OCCN(C)C
+C/C=C/[C@@](/C=C\C)(C(=O)O[C@H](C)CN(C)C)[C@@](/C=C/C)(/C=C/C)C(=O)O[C@H](C)CN(C)C
+C/C=C/[C@@](O)(C(=O)O[C@@H]1CN2CC[C@H]1CC2)c1ccccc1
+C/C=C/[C@@]1(/C=C\C)C(=O)OC(=O)[C@]1(/C=C/C)/C=C/C
+C/C=C\1/[C@@H](C(=O)O)[C@@H]1C(=O)O
+C/C=C\[C@@H]1[C@H]2C(=O)[C@]3(Cl)[C@@H](/C=C/C)[C@H]3C(=O)[C@]12Cl
+C/C=C\[C@@](O)(C1CCCC1)C(=O)O[C@@H]1[C@@H]2CCN(CC2)[C@@H]1C
+C/C=C\[C@@](O)(C1CCCCC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2
+C/C=C\[C@H]1O[C@H](C)[C@@H](C)O1
+C/C=C\[C@](O)(C1CCCC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2
+C/[O+]=C/1\C=C(OC)/C(=C\c2c(OC)cc(OC)cc2OC)/C(=C1)OC
+C12=C3C4=C5[C@@H]1[Co]16782345C2=C6C7=C1[C@@H]82
+C12=C3C4=C5[C@@H]1[Fe]16782345C2=C6C7=C1[C@@H]82
+C12=C3C4=C5[C@@H]1[Fe]16782345C2=C7[C@@]8(C6=C12)[Ge]([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+C12=C3C4=C5[C@@H]1[Fe]16782345C2=C7[C@@]8(C6=C12)[Pb]([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+C12=C3C4=C5[C@@H]1[Fe]16782345C2=C7[C@@]8(C6=C12)[Si]([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+C12=C3C4=C5[C@@H]1[Fe]16782345C2=C7[C@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+C12=C3C4=C5[C@@H]1[Mn]16782345C2=C6C7=C1[C@@H]82
+C12=C3C4=C5[C@@H]1[Ni]16782345C2=C6C7=C1[C@@H]82
+C12=C3C4=C5[C@@H]1[Ru]16782345C2=C6C7=C1[C@@H]82
+C1=CC=C23[C@H]4C5=C6[Fe]789%10245([C@H]2C9=C8C7=C%102)C36=C1
+C1=CC=c2cc3C=c4ccccc4=c3cc2C1
+C1=CC[C@@H](CC1)[C@@H]1OC[C@]2(CO1)CO[C@H](OC2)[C@H]1CCC=CC1
+C1=C[C@@H]2C=C[C@H]12
+C1=C[C@@H]2C[C@]3(OCCO3)[C@@H]2C1
+C1=C[C@@H]2[C@@H]3C=C[C@H]1C=C[C@H]23
+C1=C[C@H]2C=C[C@@H]1C2
+C1=C[C@H]2CC[C@@H](C1)[C@@]12OCCO1
+C1CCC(C1)CC[N@@+]12CC[N@@+](CCC3CCCC3)(CC1)C2
+C1CCC(CC1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+C1CCC(CC1)/N=C\1/N(C2CCCCC2)/C(=N\C2CCCCC2)/N1C1CCCCC1
+C1CCC(CC1)[C@@H]1CC[C@H](CC1)C1CCCCC1
+C1CCC(CC1)[C@@H]1O[C@@]21C=C[C@@]1(CC[C@]3(CC1)O[C@@]13C=CC=C1)C2
+C1CCC(CC1)[C@H]1CC[C@@H](CC1)N1CCCCC1
+C1CCC(CC1)c1nnnn1C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+C1CCC(CC1)c1nnnn1C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+C1CCN(C1)c1ccc2nnnn2n1
+C1CCN(CC1)[C@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+C1CCN(CC1)c1cc2nc3c(cc(N4CCCCC4)c4ccccc34)nc2c2ccccc12
+C1CC[C@@]2(CC1)CCN(CC2)c1ccc(/C=N/c2ccc3ccccc3c2)cc1
+C1CC[C@@]2(CC1)O[C@@H]1[C@@H](O[C@H]3O[C@H]4CO[C@]5(CCCCC5)O[C@H]4[C@H]4O[C@]5(CCCCC5)O[C@H]34)O[C@H]3CO[C@@]4(CCCCC4)O[C@H]3[C@H]1O2
+C1CC[C@H](OC1)OC[C@@]1(CCCCO1)CO[C@@H]1CCCCO1
+C1CC[C@H]2N(C1)[C@H]1CCCCN1[C@@H]1CCCCN21
+C1CC[C@H]2N[Au@]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3
+C1CC[C@H]2N[Cu@]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3
+C1CC[C@H]2N[Ni@]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3
+C1CC[C@H]2[C@H](C1)C[C@@H]1CCCC[C@@H]1[C@@H]2[C@@H]1[C@H]2CCCC[C@@H]2C[C@@H]2CCCC[C@H]12
+C1CC[C@]2(CCCC[C@H]2C1)CC[C@]12CCCC[C@@H]2CCCC1
+C1CC[C@]23CCCC[C@]3(C1)O2
+C1CC[N+]2(CC1)Cc1c(ccc3ccccc13)[OH+][Cu@+2]12[Cl-][Cu@@+2]2([OH+]c3ccc4ccccc4c3C[N+]32CCCCC3)[Cl-]1
+C1CC[N+]2(CC1)Cc1c(ccc3ccccc13)[OH+][Cu@@+2]12[Cl-][Cu@+2]2([OH+]c3ccc4ccccc4c3C[N+]32CCCCC3)[Cl-]1
+C1CN1[C@H]1CC[C@@H](CC1)N1CC1
+C1CN2CCN1[Co@]12N2CCN1CC2
+C1CN2CCN1[Hg@]12N2CCN1CC2
+C1CN2CCN1[Zn@]12N2CCN1CC2
+C1CN2CCN3CCCN4CCN(C1)[C@H]2[C@H]34
+C1CN=C(N1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+C1CN=C(O1)N1C[C@@H]2CC[C@@H](CC2)C1
+C1COB(O1)[C@@H]1C[C@H]2CCC[C@H]3CCC[C@@H](C1)[C@@H]23.C1COB(O1)[C@]12[C@@H]3CCC[C@H]1CCC[C@H]2CCC3
+C1CS[C@]2(SC1)SCS[C@@]12SCCCS1
+C1C[C@@H]2CCC[C@@H]2C1
+C1C[C@@H]2CCCc3c4CCC[C@H]5CCCc(c(C1)c23)c45
+C1C[C@@H]2CC[C@H]1CN(C2)[C@H]1CO[C@@H](CO1)N1C[C@H]2CC[C@H](CC2)C1
+C1C[C@@H]2[C@H](CCC[C@]32OCCO3)[C@]2(C1)OCCO2.C1C[C@@H]2[C@H](CCC[C@@]32OCCO3)[C@]2(C1)OCCO2
+C1C[C@H]2CCC[C@@H]3[C@@H]2[C@@H](C1)[C@H]1CCC[C@@H]2CCC[C@H]3[C@H]12
+C1C[C@H]2CCC[C@@H]3[C@H]4CCCC[C@@H]4[C@@H](C1)[C@@H]23
+C1C[C@H]2CC[C@@H]1C2
+C1C[C@H]2CC[C@@H]1O2
+C1C[C@H]2CC[C@H]3CC[C@@H]1[C@@H]23
+C1C[C@H]2C[C@@H]1[C@]13O[C@H]1[C@]1(CC1)[C@H]1O[C@@]231
+C1C[C@]2(CO2)CC[C@]21CO2
+C1C[N@@+]23CCC[N@+]4(CCC2)CC[SH+][Ni@@+2]34[SH+]1
+C1C[N@@+]23CCC[N@+]4(CCC2)CC[SH+][Pd@@+2]34[SH+]1
+C1C[S+]2[Ni@]3(N1)NCC[S+]3[Ni@]12[S+]2CCN[Ni@@]32NCC[S+]13
+C1O[Cu+2]234[OH+]CC[N@+]4(C1)CC[O-]3[Cu+2]134OCC[N@+]4(CC[OH+]1)CC[O-]3[Cu+2]134OCC[N@+]4(CC[OH+]1)CC[O-]3[Cu+2]134OCC[N@+]4(CC[OH+]1)CC[O-]23
+C1O[Cu+2]234[OH+]CC[N@@+]4(C1)CC[O-]2[Cu+2]124OCC[N@@+]4(CC[OH+]1)CC[O-]2[Cu+2]124OCC[N@+]4(CC[OH+]1)CC[O-]2[Cu+2]124OCC[N@+]2(CC[OH+]1)CC[O-]34
+C1Oc2cc(/C=C/c3nc4ccccc4nc3/C=C\c3ccc4OCOc4c3)ccc2O1
+C1[C@@H]2C[C@@H]3C[C@H]1C[C@H](C2)[C@@]13OO[C@]21[C@@H]1C[C@H]3C[C@@H](C1)C[C@@H]2C3
+C1[C@@H]2C[C@@H]3C[C@H]1C[C@](/C=N/[C@]14C[C@@H]5C[C@@H](C[C@@H](C5)C4)C1)(C2)C3
+C1[C@@H]2C[C@@H]3C[C@H]1C[C@](C#C[C@]14C[C@@H]5C[C@@H](C[C@@H](C5)C4)C1)(C2)C3
+C1[C@@H]2C[C@H]3C[C@@H]1CC(C2)(C3)Nc1nc(nc(n1)N[C@@]12C[C@@H]3C[C@@H](C[C@H](C3)C2)C1)N[C@@]12C[C@H]3C[C@H](C[C@@H](C3)C2)C1
+C1[C@H]2C[C@@H]3C[C@H]1CC(C2)(C3)C1=[O+][Rh]234OC(=[O+][Rh]4([O+]=C(O2)C24C[C@@H]5C[C@@H](C[C@H](C5)C4)C2)(O1)OC(=[O+]3)C12C[C@H]3C[C@@H](C[C@@H](C3)C2)C1)C12C[C@H]3C[C@H](C[C@@H](C3)C2)C1
+C1[C@H]2C[C@@H]3[C@H](C2)[C@H]13
+C1[C@H]2C[C@H]3C[C@@H]1C[C@@](C2)(C3)c1sc2nnc(n2n1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+C1[C@H]2O[C@H]3CN1C[C@@H](O2)O3
+C=C/C(=[N+]\1/[OH+][W+]23451(C#[O+])(C#[O+])[C@H]1C4=C3C2=C51)/C
+C=C1C[C@]2(CCC[C@@]3(OCCO3)C2)OC1=O
+C=CC(=O)N[C@@]1(CN2CC[C@H]1CC2)c1ccccc1
+C=CC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+C=CC(=O)OCCCS(=O)(=O)[OH+][Pt@+2]1(N[C@H]2CCCC[C@@H]2N1)[OH+]S(=O)(=O)CCCOC(=O)C=C
+C=CCCCCCCCC[C@@H]1OC[C@@](CC)(CCCC)CO1
+C=CCCCCCCCC[C@H]1O[C@H](C)C[C@@H](C)O1
+C=CCCCN1C(=O)[C@H]2[C@@H]3c4ccccc4[C@](C=O)([C@@H]2C1=O)c1ccccc31
+C=CCC[C@@H]1C[C@@H](C[C@@]2(OCCO2)C1)C(C)C
+C=CCC[C@]1(C)O[C@H](C)[C@@H](C)O1
+C=CCN1C(=O)[C@H](c2ccccc2)[C@@]2(CCN(C)CC2)C1=O
+C=CCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+C=CCOC(=O)[C@@H](C)O[C@@H](C)O[C@H](C)C(=O)OCC=C
+C=CCOC(=O)[C@@H]1[C@@H](C(=O)OCC=C)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl
+C=CCOc1ccc2c(NO[N+]2[O-])c1
+C=CCOc1ccc2c(no[n+]2[O-])c1
+C=CCOc1ccccc1c1nnn(C)n1
+C=CC[C@@H]1CCCC[C@@]21OCCO2
+C=CC[C@@]1(CC=CC[C@]21OCCO2)CC(=O)O
+C=CC[C@@]12C[C@H](C=C[C@]32OCCO3)OC(=O)[C@H]1C
+C=CC[C@@]12C[C@H](C=C[C@]32OCCO3)O[C@@H](O)[C@H]1C
+C=CC[C@H]1C(=[O+][Cu@@]2([O+]=C1C)[O+]=C(C)[C@@H](CC=C)C(=[O+]2)C)C
+C=CC[N@+]12CN3CN(CN(C3)C2)C1
+C=CCc1cccc2cc(C(=O)Nc3scc(n3)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(=O)oc12
+C=CCn1c(=O)c(C(=O)Nc2scc(n2)[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c(O)c2ccccc12
+C=CCn1c(=S)[nH]nc1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+C=C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+C=C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+C=C[C@@H](C)S(=O)(=O)[Fe]1234(C#[O+])(C#[O+])C5(=C3(C)C2(=C1(C)[C@]45C)C)C
+C=C[C@@H](C)[C@@]1(CCC[C@@]21OCCO2)C(=O)OC
+C=C[C@@]1(CC[C@H](CC1)C(C)(C)C)NS(=O)(=O)c1ccc(C)cc1
+C=C[C@H]1CN2CC[C@H]1C[C@H]2[C@H](O)c1ccnc2ccccc12.OC(=O)[C@@H](C)[S@@](=O)(=O)[C@H](C)C(=O)O
+C=C[C@]12CC(=O)N3CCc4ccccc4[C@@]3(C1)C2
+C=C[Si@]1(C)C[Si@@](C)(C=C)C1.C=C[Si@]1(C)C[Si@@](C)(C=C)C1
+C=Cc1nnnn1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CC#C[C@@](O)(C(=O)O[C@@H]1[C@@H]2CCN(CC2)[C@H]1C)C1=CCCC1
+CC#C[C@@](O)(C1CCCC1)C(=O)O[C@@H]1[C@H]2CCN(CC2)[C@H]1C
+CC#C[C@@](O)(C1CCCC1)C(=O)O[C@H]1[C@@H]2CCN(CC2)[C@H]1CC
+CC#C[C@](O)(C1CC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2
+CC#C[Ti]12345678(C#CC)([C@@H]9C3=C2C1=C49)[C@H]1C7=C6C5=C81
+CC#[N+][Pt@@H+2]1([H-][MoH]2345(C#[O+])(C#[O+])(C6=C3C4=C2[C@H]56)P1(c1ccccc1)c1ccccc1)P(c1ccccc1)(c1ccccc1)c1ccccc1.F[P-](F)(F)(F)(F)F
+CC#[N+][PtH2+2]1([H-][MoH2]2345(C#[O+])(C#[O+])(C6=C3C4=C2C56)P1(c1ccccc1)c1ccccc1)P(c1ccccc1)(c1ccccc1)c1ccccc1.F[P-](F)(F)(F)(F)F
+CC(=C)C#C[C@@](O)(C(C)C)C(=O)O[C@@H]1CN2CC[C@@H]1CC2
+CC(=C)C#C[C@@](O)(C1CCCCC1)C(=O)O[C@H]1CN2CC[C@H]1CC2
+CC(=C)C#C[C@](O)(C(=O)O[C@H]1[C@@H]2CCN(CC2)[C@H]1C)c1ccccc1
+CC(=C)C(=O)Nc1ccc2nn(nc2c1)c1ccccc1O
+CC(=C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(=C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(=C)[C@@](O)(C(=O)O[C@H]1CN2CC[C@@H]1CC2)c1cccs1
+CC(=C)[C@@](O)(C(=O)O[C@H]1CN2CC[C@H]1CC2)c1ccccc1
+CC(=C)[C@@](O)(C1CCCCC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2
+CC(=C1[C@H]2CC[C@H](CC2)[C@]21CCC1=C(C2)[C@@H]2CC[C@H]1CC2)C
+CC(=CCC/C(=C\[C@H]1O[C@H](C)[C@@H](C)O1)/C)C
+CC(=CCC/C(=C\c1nnc2n[nH]c(=S)n2n1)/C)C
+CC(=CCN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C
+CC(=CC[N@+]12CN3CN(CN(C3)C2)C1)C
+CC(=C[C@H]1CC[C@]2(OCCO2)[C@]1(C)COCc1ccccc1)C
+CC(=NC1=[O+][Mn]2(ON1)ONC(=[O+]2)N=C(C)C)C.O=C1C[N@+]23CC(=O)[OH+][Mn+2]453([OH+]1)[OH+]C(=O)C[N@@+]5(CC(=O)[OH+]4)[C@H](C)C2
+CC(=NN1C(=O)[C@@H]2[C@@H]3c4ccccc4[C@](OC(=O)C)([C@H]2C1=O)c1ccccc31)C
+CC(=NNC(=S)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C
+CC(=O)/N=c\1/nc(SCc2ccccc2)c2c(NO[N+]2[O-])[nH]1
+CC(=O)/N=c\1/nc(SCc2ccccc2)c2c([nH]o[n+]2[O-])n1
+CC(=O)C(=CN[C@@H]1C[C@H](NC=C(C(=O)C)C(=O)C)C[C@@H](NC=C(C(=O)C)C(=O)C)C1)C(=O)C
+CC(=O)C(C[C@H]1CC[C@H](CC1)CC(C(=O)C)C(=O)C)C(=O)C
+CC(=O)C12=C3[C@-]45CCC(=O)[C@-]67C8=C9C%10=C6[Fe+2]6235789%10C4=C16
+CC(=O)C12=C3[C@-]45CCC(=O)[C@@-]67C8=C9C%10=C6[Fe+2]6235789%10C4=C16
+CC(=O)CC(=O)NC[C@@H]1CC[C@H](CC1)CNC(=O)CC(=O)C
+CC(=O)CC(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CC(=O)CC(=O)[C@H]1CC[C@@H](CC1)C(=O)CC(=O)C
+CC(=O)CC1=C(OC(C)C)[C@]2(OCCO2)[C@@H]1O
+CC(=O)C[C@H]1C[C@]2(OCCO2)CCC1=O
+CC(=O)C[N@+]12CN3CN(CN(C3)C2)C1
+CC(=O)N1CCN(C(=O)C)[C@@H]2[C@H]1N(CCN2C(=O)C)C(=O)C
+CC(=O)N1CC[C@]2(CC1)SS[C@]1(CCN(CC1)C(=O)C)S2
+CC(=O)N1O[C@]2(C)c3ccccc3[C@@]1(C)c1ccccc21
+CC(=O)N[C@@H](C(=O)N/N=C(\C)/c1ccccc1)C(=O)N/N=C(\C)/c1ccccc1
+CC(=O)N[C@@H](Cn1cc/c(=N)/cc1)C(=O)O
+CC(=O)N[C@@H]1CC[C@H](CC1)Cc1ccccc1
+CC(=O)N[C@@H]1CC[C@H](CCC2CCCCC2)CC1
+CC(=O)N[C@@H]1c2ccccc2C(C)(C)[C@@]21CC[C@]1(OCCO1)CC2
+CC(=O)N[C@@]12CCCC[C@]2(CCCC1)NC(=O)C
+CC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC(=O)N[C@H](C(C)C)C(=O)O[Pt@]1(OC(=O)[C@H](NC(=O)C)C(C)C)N[C@H]2CCCC[C@H]2N1
+CC(=O)N[C@H]1C(=[O+][Cu@@]2([O+]=C1C)[O+]=C(C)[C@@H](NC(=O)C)C(=[O+]2)C)C
+CC(=O)N[C@H]1CC[C@@H](CC1)C(C)(C)C.CC(=O)N[C@@H]1CC[C@H](CC1)C(C)(C)C
+CC(=O)N[C@H]1CC[C@@H](CC1)C(F)(F)F.CC(=O)N[C@@H]1CC[C@H](CC1)C(F)(F)F
+CC(=O)N[C@H]1CC[C@@H](CC1)CC1CCCCC1
+CC(=O)N[C@H]1C[C@@H]2c3ccccc3[C@@]1([N+](=O)[O-])c1ccccc21
+CC(=O)N[C@H]1C[C@H]2c3ccccc3[C@]1([N+](=O)[O-])c1ccccc21
+CC(=O)N[C@]12CC[C@H](c3ccccc13)c1ccccc21
+CC(=O)Nc1ccc(/C=N/NC(=S)N[C@@H]2CN3CC[C@@H]2CC3)cc1
+CC(=O)Nc1ccc(cc1)/C=c/1\sc2nnc(/C=C/c3ccccc3)n2c1=O
+CC(=O)Nc1ccc(cc1)/C=c/1\sc2nnc(CCC(=O)Nc3ccccc3Cl)n2c1=O
+CC(=O)Nc1ccc(cc1)/C=c\1/sc2nnc(c3cccnc3)n2c1=O
+CC(=O)Nc1ccc(cc1)/N=C/1\C(=C(SC2=C(c3ccccc3)/C(=N/c3ccc(cc3)NC(=O)C)/c3ccccc23)c2ccccc12)c1ccccc1
+CC(=O)Nc1ccc2c3ccccc3[C@H](N3C[C@@H]4CC[C@@H](CC4)C3)c2c1
+CC(=O)Nc1n[nH]/c(=S\2/[Pt@@](Cl)(Cl)/S(=c\3/[nH]nc(NC(=O)C)s3)/[Pt@]2(Cl)Cl)/s1
+CC(=O)Nc1nnn(C)n1
+CC(=O)O.CC(C)Oc1ccc2[nH]c3c(C)c4ccn(C)cc4c(C)c3c2c1
+CC(=O)O.C[C@@H]1N2CCc3ccccc3[C@H]2[C@@H]2c3ccccc3CCN12
+CC(=O)O.Cn1ccc2c(C)c3[nH]c4ccc(OCC(F)(F)F)cc4c3c(C)c2c1
+CC(=O)O.Cn1ccc2c(C)c3[nH]c4ccc(Oc5ccccc5)cc4c3c(C)c2c1
+CC(=O)O.Cn1ccc2c(C)c3[nH]c4ccc(cc4c3c(C)c2c1)OC(C)(C)C
+CC(=O)O.N=C\1/C=C/C(=C(/c2ccc(N)cc2)\c2ccc(N)c(C)c2)/C=C1
+CC(=O)O.Nc1nc(N)c2c(ccc3nc(c4ccccc4)c(nc23)c2ccccc2)n1
+CC(=O)O.Oc1nc(N)c2nc3c(nc2n1)c1cccc2cccc3c12.OS(=O)(=O)O
+CC(=O)O.Oc1nc2nc3c(nc2c(N)n1)c1cccc2cccc3c12
+CC(=O)OCCn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2ccccc12
+CC(=O)OC[C@@H](OC(=O)C)[C@@H](O[C@@H]1O[C@H](COC(=O)C)[C@@H](OC(=O)C)[C@H](OC(=O)C)[C@@H]1OC(=O)C)[C@@H](OC(=O)C)c1cnn(n1)c1ccccc1
+CC(=O)OC[C@@H]1CC/C(=C/2\C(=O)O[C@@](C)(C)OC2=O)/N1
+CC(=O)OC[C@@H]1O[C@H](OC[C@H](OC(=O)C)[C@H](OC(=O)C)[C@@H](OC(=O)C)c2cnn(n2)c2ccccc2)[C@@H](OC(=O)C)[C@@H](OC(=O)C)[C@H]1OC(=O)C
+CC(=O)OC[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H](COC(=O)C)OC(=O)C
+CC(=O)OC[C@H](OC(=O)C)[C@H]1O[C@@H](O[C@H]([C@H](COC(=O)C)OC(=O)C)[C@H]1OC(=O)C)c1ccccc1
+CC(=O)OC[C@H]1CO[C@@]2(CCCC2)O1
+CC(=O)OC[C@H]1O[C@H](OC(=O)C)[C@H](NC(=O)CN[Pt@](Cl)(Cl)NCC(=O)N[C@H]2[C@@H](OC(=O)C)O[C@H](COC(=O)C)[C@H](OC(=O)C)[C@H]2OC(=O)C)[C@@H](OC(=O)C)[C@H]1OC(=O)C
+CC(=O)OC[C@H]1O[C@H](OC(=O)C)[C@H](N[Pt@](Cl)(Cl)N[C@H]2[C@@H](OC(=O)C)O[C@H](COC(=O)C)[C@H](OC(=O)C)[C@H]2OC(=O)C)[C@@H](OC(=O)C)[C@H]1OC(=O)C
+CC(=O)OC[C@]1(C)OC(=O)[C@@]2(CCCCC2)O1
+CC(=O)OCc1cnc2c3ncccc3C(=O)c3nc4ccccc4c1c23
+CC(=O)O[C@@H](C)C(=O)O[C@@H](COC(=O)[C@H](C)OC(=O)C)COC(=O)[C@H](C)OC(=O)C
+CC(=O)O[C@@H](C)C1=C[C@@]2(C=C[C@H]3[C@@H](C=C[C@@H]23)C2OC[C@](C)(C)CO2)OC1=O.CC(=O)O[C@@H](C)C1=C[C@@]2(C=C[C@H]3[C@@H](C=C[C@@H]23)C2OC[C@@](C)(C)CO2)OC1=O
+CC(=O)O[C@@H](C)[C@@H](OC(=O)C)[C@@H](OC(=O)C)c1cnn(n1)c1ccccc1
+CC(=O)O[C@@H]([C@H](COC(=O)C)OC(=O)C)c1cnn(n1)c1ccccc1
+CC(=O)O[C@@H](c1cnn(n1)c1ccccc1)[C@H](OC(=O)C)[C@@H](COC(=O)C)OC(=O)C
+CC(=O)O[C@@H](c1cnn(n1)c1ccccc1)[C@H](OC(=O)C)[C@H](OC(=O)C)[C@@H](COC(=O)C)OC(=O)C
+CC(=O)O[C@@H]1C=CN(C(=O)C)[C@H](S[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[C@H]1O
+CC(=O)O[C@@H]1CC[C@@]2(C)C(=CC[C@H]3[C@H]2CC[C@@]2(C)[C@H]3CC[C@]32SCCCS3)C1
+CC(=O)O[C@@H]1CC[C@@]2(C)[C@@H](CC[C@H]3[C@H]2CC[C@@]2(C)[C@H]3CC[C@]32SCCCS3)C1
+CC(=O)O[C@@H]1CN(C[C@@H](OC(=O)C)CN(C1)c1ccccc1)c1ccccc1
+CC(=O)O[C@@H]1CO[C@H]([C@@H](OC(=O)C)[C@H]1OC(=O)C)n1c2c(ccc3c4ccccc4[nH]c23)c2ccccc12
+CC(=O)O[C@@H]1C[C@@H]2N[Pt@@](Cl)(Cl)N[C@H]2C[C@@H]1OC(=O)C
+CC(=O)O[C@@H]1C[C@](C)(C)C[C@@H](OC(=O)C)[C@@]1(C)C
+CC(=O)O[C@@H]1C[N@+]2(CCc3ccccc3)CC[C@H]1CC2
+CC(=O)O[C@@H]1C[N@@+]2(C)CC[C@@]1(CC2)c1ccccc1
+CC(=O)O[C@@H]1N(C(=O)C)[C@H](S[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)C(=C[C@@]1(C)OC(=O)C)C
+CC(=O)O[C@@H]1O[C@H](OC(=O)C)[C@H](OC(=O)C)[C@@H](OC(=O)C)O1
+CC(=O)O[C@@H]1[C@@H](OC(=O)C)CN(OCc2ccccc2)C[C@@H]1OC(=O)C
+CC(=O)O[C@@H]1[C@@H](ON(=C[C@@]21CCCCC2)O)O[C@@H]1CCCCC1(c1ccccc1)c1ccccc1
+CC(=O)O[C@@H]1[C@@](C)(C)[C@@H](OC(=O)C)[C@]1(C)C.CC(=O)O[C@@H]1[C@](C)(C)[C@@H](OC(=O)C)[C@]1(C)C
+CC(=O)O[C@@]12CCCC[C@H]2[C@@]2(CCCC2)NC1=O
+CC(=O)O[C@H]([C@@H](COC(=O)C)OC(=O)C)c1cnn(n1)c1ccccc1
+CC(=O)O[C@H]([C@@H]1C[C@@H]2CCN1CC2)c1ccnc2ccccc12
+CC(=O)O[C@H](c1cnn(n1)c1ccccc1)[C@@H](OC(=O)C)[C@@H](OC(=O)C)[C@H](COC(=O)C)OC(=O)C
+CC(=O)O[C@H]1C(=[O+][Cu@@]2([O+]=C1C)[O+]=C(C)[C@@H](OC(=O)C)C(=[O+]2)C)C
+CC(=O)O[C@H]1C=CN(C(=O)C)[C@@H](S[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[C@H]1OC(=O)C
+CC(=O)O[C@H]1C=C[C@H](S[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)N(C(=O)C)[C@@H]1S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CC(=O)O[C@H]1CCCCCCCCCC[C@@]21OCCO2
+CC(=O)O[C@H]1CCN(Cc2ccccc2)C[C@H]1CN(C(=O)C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC(=O)O[C@H]1CC[C@@H](CC1)CC1CCCCC1
+CC(=O)O[C@H]1CC[C@H]2[C@H]3CC[C@H]4C[C@@]5(SCCS5)CC[C@]4(C)[C@H]3CC[C@]12C
+CC(=O)O[C@H]1CN(OC[C@H]2O[C@H](OC(=O)C)[C@H](OC(=O)C)[C@@H](OC(=O)C)[C@H]2OC(=O)C)C[C@H](OC(=O)C)[C@@H]1OC(=O)C
+CC(=O)O[C@H]1OC[C@@H]2O[C@]3(CCCCC3)O[C@H]2[C@@H]1SCc1ccccc1
+CC(=O)O[C@H]1[C@@H](OC(=O)C)C(=O)OC(=O)[C@@H]1OC(=O)C
+CC(=O)O[C@H]1[C@H](CCC[C@@H]1C(C)C)C(C)C
+CC(=O)O[C@H]1[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H]1OC(=O)C
+CC(=O)O[C@H]1[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H]2O[C@](C)(C)O[C@H]2[C@H]1OC(=O)C
+CC(=O)O[C@H]1[C@H]2CC[C@@H]1[C@H]1[C@@H]2[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)[C@]2(Cl)Cl)Cl
+CC(=O)O[C@H]1[C@H]2[C@@H]3[C@H]2[C@@H]2[C@H]1[C@H]32
+CC(=O)O[C@H]1c2ccccc2[C@@H](OC(=O)C)c2ccccc12
+CC(=O)O[C@]1(C=C/C(=N/S(=O)(=O)c2ccccc2)/C=C1)[C@@]1(C=C/C(=N/S(=O)(=O)c2ccccc2)/C=C1)OC(=O)C
+CC(=O)O[C@]1([C@@H]2CC[C@H]1CC2)c1cc(cc(c1)C(F)(F)F)C(F)(F)F
+CC(=O)O[C@]12[C@H]3CCC[C@H]1CCC[C@H]2CCC3
+CC(=O)O[Pb]([C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82)([C@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+CC(=O)Oc1c2c(n(C(=O)C)c3ccccc3n2C(=O)C)c(OC(=O)C)c2c1n(C(=O)C)c1ccccc1n2C(=O)C
+CC(=O)Oc1cc2c(cc1OC(=O)C)[C@@]1(C)CC[C@]2(C)c2cc(OC(=O)C)c(OC(=O)C)cc12
+CC(=O)Oc1cc2nc3ccccc3nc2c2c1n(C)c1cc(ccc21)OC(=O)C
+CC(=O)Oc1ccc(cc1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC(=O)Oc1ccccc1[C@H]1CC(=O)C[C@@H](c2ccccc2OC(=O)C)[C@@]21C(=O)c1ccccc1C2=O
+CC(=O)SS[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC(=O)S[C@H]1C[S@@](=O)(=O)C[C@@H]1SC(=O)C
+CC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)C)C6=C12
+CC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)C)C6=C12
+CC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)C)C6=C12
+CC(=O)[C@@H]1C[C@@]21c1ccccc1Cc1ccccc21
+CC(=O)[C@@H]1C[C@@]21c1ccccc1c1ccccc21
+CC(=O)[C@@H]1C[C@]2(C(=O)C1=O)c1ccccc1c1ccccc21
+CC(=O)[C@@H]1[C@@H](N=N[C@@]21c1ccccc1Oc1ccccc21)c1ccccc1
+CC(=O)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+CC(=O)[C@H]1C(=O)C[C@H](/C=C/c2ccccc2)CC1=O
+CC(=O)[C@H]1C(=[O+][Cr]23([O+]=C1C)([O+]=C(C)[C@@H](C(=O)C)C(=[O+]2)C)[O+]=C(C)[C@@H](C(=O)C)C(=[O+]3)C)C
+CC(=O)[C@H]1C(=[O+][Cu@]2([O+]=C1C)[O+]=C(C)[C@@H](C(=O)C)C(=[O+]2)C)C
+CC(=O)[C@H]1CC[C@H]2[C@H]3C[C@H](C)[C@]4(O)CC5(OC[C@](C)(C)CO5)CC[C@]4(C)[C@H]3C(=O)C[C@]12C
+CC(=O)[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+CC(=O)[C@H]1[C@H]2c3ccccc3[C@@H]([C@@H]1C)c1ccccc21
+CC(=O)[OH+][Cu@+2]12N(Cc3n(C)cc[n+]13)Cc1n(C)cc[n+]21.[O-][Cl](=O)(=O)=[OH+]
+CC(=O)[OH+][Cu@@+2]12N(Cc3n(C)cc[n+]13)Cc1n(C)cc[n+]21.[O-][Cl](=O)(=O)=[OH+]
+CC(=O)[OH+][Hg][C@@]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(=O)[OH+][Hg][C@]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@]8([Hg][OH+]C(=O)C)C6=C12
+CC(=O)[OH+][Hg][C@]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(=O)c1ccc(cc1)/N=N\c1ccc2nonc2c1N
+CC(=O)c1ccc(cc1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CC(=O)c1ccc2=c3cc(ccc3=c2c1)C(=O)C
+CC(=O)c1nnc2n[nH]c(=S)n2n1
+CC(=O)c1nnn(n1)c1ccccc1
+CC(=O)n1c2cc3ccccc3cc2n(C(=O)C)c2cc3ccccc3cc12
+CC(=O)n1ccc(=c2ccn(cc2)C(=O)C)cc1
+CC(C)(C(C)(C)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+CC(C)(C)/N=C/N1CC[C@H](CC1)C(c1ccccc1)c1ccccc1
+CC(C)(C)CO[C@@H]1[C@@]2(OCCO2)[C@@H]2CC[C@@]1(C)C2(C)C
+CC(C)(C)N/N=C/1\C(C)(C)/C(=N\NC(C)(C)C)/C1(C)C
+CC(C)(C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(C)(C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(C)(C)[C@@H]1CC[C@@]2(CC1)c1[nH]c3ccccc3c1[C@]1(CC[C@@H](CC1)C(C)(C)C)c1[nH]c3ccccc3c21
+CC(C)(C)[C@@H]1CC[C@H](CC1)NC1=NCCO1.CC(C)(C)[C@@H]1CC[C@H](CC1)NC1=NCCO1
+CC(C)(C)[C@@H]1CC[C@]2(OC[C@H]3CCCN23)CC1
+CC(C)(C)[C@H]1CC/C(=N/SC(c2ccccc2)(c2ccccc2)c2ccccc2)/CC1
+CC(C)(C)c1nc2ccccc2p1c1ccccc1
+CC(C)(O)CCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(C)(O)CCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(C)(O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)C(C)(C)O
+CC(C)(O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)C(C)(C)O
+CC(C)(O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC(C)(O)c1cc2c3ccccc3c2cc1C(C)(C)O
+CC(C)/C=C\[C@](O)(C1CCCC1)C(=O)O[C@@H]1CN2CC[C@@H]1CC2
+CC(C)C#C[C@@](O)(C1CCCC1)C(=O)O[C@@H]1[C@@H]2CCN(CC2)[C@H]1C
+CC(C)C(C)(C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(C)C(C)(C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CC(C)C12=C3C4=C5C6=C1[Cr]1789%1023456C2=C7C9=C%10(C(C)C)C8=C12
+CC(C)CC(=O)O[C@@H]1CC[C@@H](CC1)C1CCCCC1
+CC(C)CCCCCCCCCCCCC(=O)NCC(=O)N[C@H]1[C@H](O)[C@H](O)[C@@H](Nc2ncnc3[nH]cnc23)[C@@H](O)[C@H]1O
+CC(C)CCC[C@@H](C)[C@@H]1CC[C@@H]2[C@@H]3CC[C@@H]4Cc5nc6C[C@@]7(C)[C@@H](CC[C@H]8[C@@H]7CC[C@]7(C)[C@H](CC[C@@H]87)[C@H](C)CCCC(C)C)Cc6nc5C[C@@]4(C)[C@@H]3CC[C@@]12C
+CC(C)CNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CC(C)CN[C@]12CN3CN(CN(C3)C2)C1
+CC(C)Cc1ccc(cc1)C[N@+]12CN3CN(CN(C3)C2)C1
+CC(C)N(C(C)C)C(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CC(C)N(C(C)C)C(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)N(C(C)C)C(C)C
+CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)C(C)(C)C
+CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)N
+CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)O
+CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42I
+CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42[C@@H](O)C(C)(C)C
+CC(C)N(C(C)C)p1n(nnn1C(C)(C)C)C(C)(C)C
+CC(C)N1CNC(=O)[C@@]21CCN(CC2)C[C@H]1COc2ccccc2O1
+CC(C)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CC(C)NCCC[C@H](C)Nc1ccnc2ccc3nn(C)nc3c12.OP(=O)(O)O
+CC(C)O/C=C\1/[C@H]2CCCC[C@H]2[C@]2(SCCS2)C1=O
+CC(C)OP(=O)(OC(C)C)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC(C)[C@@]12C3=C4C5=C1[Zr]16782345(Cl)(Cl)C2=C7[C@]8(C(C)C)C6=C12
+CC(C)[C@H](SC[C@H](N)C(=O)O)SC[C@H](N)C(=O)O
+CC(C)[C@H]1O[C@@]2(CCCC2)OCC1(C)C
+CC(C)[C@H]1O[C@H](O[C@@H](O1)C(C)C)C(C)C
+CC(C)[C@]12Cc3c(ccc4ccccc34)O[C@@]2(C)Oc2ccc3ccccc3c2C1
+CC(C)[N@@+]12CC[N@+]3(CC[N@+](CC1)(C(C)C)[Mo]23(=O)(=O)=O)C(C)C
+CC(C)[Si](OC[C@H]1C[C@@H](C[C@H]2C[C@@H](C[C@@H]3C[C@H](CO[Si](C(C)C)(C(C)C)C(C)C)OC(C)(C)O3)O[C@](C)(C)O2)OC(C)(C)O1)(C(C)C)C(C)C
+CC(C)c1cc([C@@H]2O[Cu+2]34([O-])O[C@H](O[Cu+2]([O-])(O2)([OH+][C@@H]([OH+]3)c2cc(cc(C(C)C)c2O)C(C)C)[OH+][C@H]([OH+]4)c2cc(cc(C(C)C)c2O)C(C)C)c2cc(cc(C(C)C)c2O)C(C)C)c(O)c(c1)C(C)C
+CC(C)c1cc([C@H]2O[Cu+2]34([O-])O[C@@H](O[Cu+2]([O-])(O2)([OH+][C@@H]([OH+]3)c2cc(cc(C(C)C)c2O)C(C)C)[OH+][C@H]([OH+]4)c2cc(cc(C(C)C)c2O)C(C)C)c2cc(cc(C(C)C)c2O)C(C)C)c(O)c(c1)C(C)C
+CC(C)c1ccc(/C=C/CN2CC[C@@](O)(CC2)c2ccccc2)cc1
+CC(C)c1ccc(C)c(c1)N1C(=O)[C@@H]2[C@@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+CC(C)c1ccc(cc1)/C=C(\SS/C(=C/c1ccc(cc1)C(C)C)/C(=O)N)/C(=O)N
+CC(C)c1nnnn1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CC/C=C(\C)/[C@@]1(CC)C(=O)N/C(=N)/NC1=O
+CC/C=C(\CC)/C(=C\CC)/CC
+CC/C=C\[C@](O)(C1CCCC1)C(=O)O[C@@H]1CN2CC[C@@H]1CC2
+CC/N=C(/CC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)\N(CC)CC
+CC/N=C\1/S[C@H]2N(C)C(=O)[C@@H](S1)N(C)C2=O
+CC/[N+](=C/1\C=C/C(=C(/c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)O)\c2ccc(cc2)S(=O)(=O)[O-])/C=C1)/Cc1cccc(c1)S(=O)(=O)O
+CC/[N+](=C/1\C=C/C(=C(/c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)[O-])\c2ccccc2Cl)/C=C1)/Cc1cccc(c1)S(=O)(=O)O
+CC/[N+](=C/1\C=C/C(=C(\c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)O)/c2ccc(O)cc2S(=O)(=O)[O-])/C=C1)/Cc1cccc(c1)S(=O)(=O)O
+CC/[N+](=C\1/C=C/C(=C(/c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)O)\c2ccc(O)cc2S(=O)(=O)[O-])/C=C1)/Cc1cccc(c1)S(=O)(=O)O
+CC/[N+](=C\1/C=C/C(=C(\c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)O)/c2ccc(cc2)S(=O)(=O)[O-])/C=C1)/Cc1cccc(c1)S(=O)(=O)O
+CC/[N+](=C\1/C=C/C(=C(\c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)[O-])/c2ccccc2Cl)/C=C1)/Cc1cccc(c1)S(=O)(=O)O
+CC1(C)/C(=N\Nc2ccccc2)/C(C)(C)/C/1=N\Nc1ccccc1
+CC1(C)CNC(=NC1)N/N=C(\C=C\c1ccc(cc1)C(F)(F)F)/C=C/c1ccc(cc1)C(F)(F)F
+CC1(C)COC(=N1)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41I
+CC1(C)C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+CC1(C)O[C@@H]2[C@H]3O[C@](C)(C)O[C@@H]3[C@H]3OC(C)(C)O[C@H]3[C@H]2O1
+CC1(C)[C@@H]2CC[C@@]1(C)[C@@]1(OCCO1)C2
+CC1(C)[C@@H]2CC[C@]3(OCCO3)[C@H]1[C@@H]1O[C@@H]21
+CC1(C)[SH+][Ni@@+2]23[SH+]C(C)(C)C[N@@+]43CCC[N@+]2(CCC4)C1
+CC12=C3(C)[Ru+]456789%101(C1=C5C8(=C6C4=C71N)N)C2(C)C%10(=C39C)C.FC(F)(F)[S@@](=O)(=[OH+])[O-]
+CC12=C3(C)[Ru+]456789%101(C1=C7(N)C4=C6C8(=C51)N)C2(C)C%10(=C39C)C.FC(F)(F)[S@@](=O)(=[OH+])[O-]
+CC1=C(C)CC[C@@]2(C1)C(=O)[C@@]1(CCC(=C(C)C1)C)C2=O
+CC1=C(C)[C@@H]2[C@H]3C(=O)OC(=O)[C@H]3[C@H]1[C@@H]1C(=O)OC(=O)[C@H]21
+CC1=C(C)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl
+CC1=C(CC2=C(C)N=S(=O)(O)N=C2C)C(=NS(=O)(=N1)O)C
+CC1=C([N+](=O)[O-])[N+]([O-])ON1
+CC1=C/C(=N\N=C\2/C=C[C@](C)(C=C2)C(Cl)(Cl)Cl)/C=C[C@]1(C)C(Cl)(Cl)Cl
+CC1=CC[C@H](C/C=N\N=C\C[C@H]2CC=C(C)C2(C)C)C1(C)C
+CC1=NP(=NC(=C1)O)(O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CC1=[N+]2[N-]C(=[S+][Ni]342([S+]=C([N-][N+]4=C(C)c2cccc[n+]32)N2C[C@@H]3CC[C@@H](CC3)C2)[n+]2ccccc12)N1C[C@@H]2CC[C@@H](CC2)C1
+CC1=[N+]2[N-]C(=[S+][Ni]342([S+]=C([N-][N+]4=C(C)c2cccc[n+]32)N2C[C@@H]3CC[C@@H](CC3)C2)[n+]2ccccc12)N1C[C@H]2CC[C@H](CC2)C1
+CC1=[O+][Co]23([O+]=C(C)[C@H]1I)([O+]=C(C)[C@@H](I)C(=[O+]2)C)[O+]=C(C)[C@@H](I)C(=[O+]3)C
+CC1=[O+][Eu+3]234([O+]=C(C)[C-]1c1ccccc1)([O+]=C(C)[C-](c1ccccc1)C(=[O+]2)C)([O+]=C(C)[C-](c1ccccc1)C(=[O+]3)C)[O+]=C(C)[C-](c1ccccc1)C(=[O+]4)C.C1CCCNC1
+CC1=[O+][Eu+3]234([O+]=C(C)[C-]1c1ccccc1)([O+]=C(C)[C-](c1ccccc1)C(=[O+]2)C)([O+]=C(C)[C-](c1ccccc1)C(=[O+]3)C)[O+]=C(C)[C-](c1ccccc1)C(=[O+]4)C.C1CCNCC1
+CC1=[O+][Pt](Cl)([O+]=C(C)C1)[C@@H]1C(=[O+][Ga]23([O+]=C1C)([O+]=C(C)[C@H](C(=[O+]2)C)[Pt]1(Cl)[O+]=C(C)CC(=[O+]1)C)[O+]=C(C)[C@@H](C(=[O+]3)C)[Pt]1(Cl)[O+]=C(C)CC(=[O+]1)C)C
+CC1=[O+][Rh]23([O+]=C(C)C1)([O+]=C(C)[C@H](Cl)C(=[O+]2)C)[O+]=C(C)[C@H](Cl)C(=[O+]3)C
+CC1=[O+][Rh]23([O+]=C(C)[C@H]1Br)([O+]=C(C)[C@@H](Br)C(=[O+]2)C)[O+]=C(C)[C@@H](Br)C(=[O+]3)C
+CC1=[O+][Ru+3]23([O+]=C(C)[C-]1Br)([O+]=C(C)[C-](Br)C(=[O+]2)C)[O+]=C(C)[C-](Br)C(=[O+]3)C
+CC1=[O+][Ru+3]23([O+]=C(C)[C-]1C)([O+]=C(C)[C-](C)C(=[O+]2)C)[O+]=C(C)[C-](C)C(=[O+]3)C
+CC1=[O+][Ru+3]23([O+]=C(C)[C-]1Cl)([O+]=C(C)[C-](Cl)C(=[O+]2)C)[O+]=C(C)[C-](Cl)C(=[O+]3)C
+CC1=[O+][Ru+3]23([O+]=C(C)[C-]1I)([O+]=C(C)[C-](I)C(=[O+]2)C)[O+]=C(C)[C-](I)C(=[O+]3)C
+CC1CCN2C(C1)C1CC(CCN1[Ru+2]132(n2ccccc2=c2ccccn12)n1ccccc1=c1ccccn31)Cc1c(F)c(F)c(c(F)c1F)c1c(F)c(F)c(NC2C3CC4CC(C3)CC2C4)c(F)c1F
+CC1[CH][CH]C2NC(SC2[CH]1)C1[CH][CH]C([CH][CH]1)N1ON1C1[CH][CH]C(/C=C/C2[CH][CH]C([CH]C2S(=O)(=O)O)N2ON2C2[CH][CH]C([CH][CH]2)C2NC3[CH][CH]C(C)[CH]C3S2)C([CH]1)S(=O)(=O)O
+CCC#C[C@@](O)(C(=O)O[C@H]1[C@@H]2CCN(CC2)[C@@H]1C)c1ccccc1
+CCC#C[C@@](O)(C1CCCC1)C(=O)O[C@H]1CN2CC[C@H]1CC2
+CCC(=O)N([C@@H]1CCN(CC1)[C@H](C)Cc1ccccc1)c1ccccc1
+CCC(=O)N[C@@H]1c2ccccc2[C@@]2(CCN(CC2)C(=O)c2cccc(Cl)c2F)[C@H]1OC
+CCC(=O)OC[C@H]1CC[C@H](CC1)COC(=O)CC
+CCC(=O)O[C@@]1(CCN(C/C=C/c2ccc(F)cc2)CC1)c1ccccc1
+CCC(=O)O[C@@]1([C@@H]2CCN(CC2)C1=C)c1ccccc1
+CCC(=O)O[C@H](CC[C@H]1CCCO1)CC[C@H]1CCCO1
+CCC(=O)O[C@H]1[C@@](C)(C)[C@@H](OC(=O)CC)C1(C)C
+CCC(=O)O[C@]1(CCN(C/C=C/c2cccc3ccccc23)CC1)c1ccccc1
+CCC(=O)Oc1ccc2c(c1)c(=O)c1c(NCCCN(C)C)ccc3nnn2c13
+CCC(=O)c1ccc(OC[C@H](O)CN2CC[C@](O)(CC2)c2ccccc2)cc1
+CCC(CC)([C@@H]1CC[C@@H](O)CC1)[C@@H]1CC[C@@H](O)CC1
+CCC(CC)[C@H]1N[C@@H](C(CC)CC)N2N1[C@@H]2C(CC)CC
+CCC/C=C/C=C\[C@]1(CC[C@H](CC1)C(C)(C)C)NS(=O)(=O)c1ccc(C)cc1
+CCCC#C[C@@](O)(C1CCCC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2
+CCCC#C[C@@](O)(C1CCCCC1)C(=O)O[C@H]1CN2CC[C@@H]1CC2
+CCCC(=O)C[C@@H](C)C(=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCCC(=O)OC[C@H]1CC[C@H](CC1)COC(=O)CCC
+CCCC(=O)O[C@@H](CC[C@@H]1CCCO1)CC[C@@H]1CCCO1
+CCCC(=O)O[C@H]1[C@@H](OC(=O)CCC)[C@H](OC(=O)CCC)[C@H](OC(=O)CCC)[C@@H](OC(=O)CCC)[C@H]1OC(=O)CCC
+CCCC(=O)O[C@H]1[C@@](C)(C)[C@H](OC(=O)CCC)[C@]1(C)C.CCCC(=O)O[C@@H]1[C@](C)(C)[C@@H](OC(=O)CCC)[C@]1(C)C
+CCCC/C=C/C=C/C=C/CCCCCCCC(=O)O[C@H](COC(=O)CCCCCCC/C=C/[C@@H]1C=C[C@@H](CCCC)[C@H](C(=O)O)[C@H]1C(=O)O)COC(=O)CCCCCCC/C=C/[C@@H]1C=C[C@@H](CCCC)[C@H](C(=O)O)[C@H]1C(=O)O
+CCCC/C=C/[C@@](O)(C(=O)O[C@H]1CN2CC[C@@H]1CC2)c1ccccc1
+CCCC1(CN[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)C(=O)N(c2ccccc2)N(c2ccccc2)C1=O
+CCCCC(=O)O[C@@H]1CC[C@H](CC1)C1CCCCC1
+CCCCC/C(=C\c1ccccc1)/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCCCC1=C(C(=O)N2CCOCC2)[C@@]2(OCCO2)[C@@H]1Cl
+CCCCCC(=O)O[C@@H]1CC[C@H](CC1)C1CCCCC1
+CCCCCC(=O)O[C@H](CC[C@@H]1CCCO1)CC[C@@H]1CCCO1
+CCCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCC)C6=C12
+CCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCC)C6=C12
+CCCCCC(C)(C)N/[P@@H](/O)=N\C(C)(C)CCCCC
+CCCCCCC(=O)C/C(=N\NC(=S)N)/C(=O)N[C@@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3
+CCCCCCC1(/C=C/c2ccc(Cl)c(Cl)c2)OC[C@](C)(C)CO1
+CCCCCCCC(=O)N[C@H]1CC[C@@H](CC1)C(C)(C)C.CCCCCCCC(=O)N[C@H]1CC[C@@H](CC1)C(C)(C)C
+CCCCCCCC(=O)O[C@H]1CC[C@H](CC1)C1CCCCC1
+CCCCCCCC/C=C/CCCCCCCC(=O)N1CC[C@@H](CCCc2ccccc2)CC1
+CCCCCCCC/C=C/CCCCCCCC(=O)OC[C@H](COC(=O)CCCCCCC/C=C/CCCCCCCC)OC(=O)N(CCCl)CCCl
+CCCCCCCCCC(=O)NNC(=O)[C@@H](C)[C@@H](O)[C@H](C)C(=O)NNC(=O)CCCCCCCCC
+CCCCCCCCCC(=O)O[C@@H](CC[C@@H]1CCCO1)CC[C@@H]1CCCO1
+CCCCCCCCCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCCCCCCCC)C6=C12
+CCCCCCCCCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)CCCCCCCCCCC)C6=C12
+CCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCCCCCCCCC)C6=C12
+CCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)CCCCCCCCCCCC)C6=C12
+CCCCCCCCCCCCCCCC(=O)N(CCCN(C)C)[C@@H]1CC[C@H](CC1)N(CCCN(C)C)C(=O)CCCCCCCCCCCCCCC.[O-][N+](=O)O
+CCCCCCCCCCCCCCCC(=O)N(CCCN(C)C)[C@H]1CC[C@@H](CC1)N(CCCN(C)C)C(=O)CCCCCCCCCCCCCCC.[O-][N+](=O)O
+CCCCCCCCCCCCCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CCCCCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCCCCCCCCCCCC)C6=C12
+CCCCCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)CCCCCCCCCCCCCCC)C6=C12
+CCCCCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CCCCCCCCCCCCCCCCCCN1C(=O)[C@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+CCCCCCCCCCCCCCCCCCNC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82
+CCCCCCCCCCCCCCCCCCNC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82
+CCCCCCCCCCCCCCCCCCOC(=O)[C@H](C(=O)C)[C@@H](c1cccc(c1)[N+](=O)[O-])[C@@H](C(=O)C)C(=O)OCCCCCCCCCCCCCCCCCC
+CCCCCCCCCCCCCCCCCCOC(=O)[C@H](C(=O)C)[C@H](c1cccc(c1)[N+](=O)[O-])[C@@H](C(=O)C)C(=O)OCCCCCCCCCCCCCCCCCC
+CCCCCCCCCCCCCCCCCCOc1ccc2C3=NC4=NC(=NC5=NC(=NC6=NC(=NC(=N3)c2c1)c1cc(OCCCCCCCCCCCCCCCCCC)ccc61)c1ccc(OCCCCCCCCCCCCCCCCCC)cc51)c1cc(OCCCCCCCCCCCCCCCCCC)ccc41
+CCCCCCCCCCCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+CCCCCCCCCCCCCCCCS(=O)C[C@@H](O)COC(=O)c1ccc(cc1)C(=O)OC[C@@H](O)CS(=O)CCCCCCCCCCCCCCCC
+CCCCCCCCCCCCCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(CCCCCCCCCCCCCCCC)C6=C12
+CCCCCCCCCCCCCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(CCCCCCCCCCCCCCCC)C6=C12
+CCCCCCCCCCCCCCCC[C@@H]1C[C@@H]2CCCC[C@H]2C1
+CCCCCCCCCCCCCCCC[C@H]1CCC[C@@]2(CCCC2)C1
+CCCCCCCCCCCCC[C@H]1O[C@@H](CCCCCCCCCCCCC)O[C@@H](CCCCCCCCCCCCC)O1
+CCCCCCCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+CCCCCCCCCCCC[Si](CCCCCCCCCCCC)(CCCCCCCCCCCC)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[Si](CCCCCCCCCCCC)(CCCCCCCCCCCC)CCCCCCCCCCCC
+CCCCCCCCCCCC[Si](CCCCCCCCCCCC)(CCCCCCCCCCCC)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)[Si](CCCCCCCCCCCC)(CCCCCCCCCCCC)CCCCCCCCCCCC
+CCCCCCCCCCC[C@H]([C@H]1CC[C@H](C)CC1)[C@H]1CC[C@H](C)CC1
+CCCCCCCCCCCc1c(=O)c2oc3c(=O)c(CCCCCCCCCCC)c(O)c(=O)c3n(c3ccc(cc3)N(C)C)c2c(=O)c1O
+CCCCCCCCCCCc1c2[nH]c3cc(C)ccc3oc2cc2[nH]c3cc(C)ccc3oc12
+CCCCCCCCCC[C@@H]1CC[C@@H](CCCCCCCCCC)CC1
+CCCCCCCCCC[C@@H]1OC[C@](CC)(CCCC)CO1
+CCCCCCCCCC[C@H]1O[C@@H](C)C[C@H](C)O1
+CCCCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+CCCCCCCCC[C@@H]1OC[C@@](C)(CC)CO1
+CCCCCCCCC[C@@H]1OC[C@@](CC)(CCCC)CO1
+CCCCCCCCC[C@H]1OC[C@@](C)(CCC)CO1
+CCCCCCCCC[C@H]1O[C@H](CCCCCCCCC)O[C@@H](CCCCCCCCC)O1
+CCCCCCCCCc1cc[n+](cc1)C1=C(O)C(=O)C2=C([C@H]3c4ccccc4[C@@H]2c2ccccc32)C1=O
+CCCCCCCCCc1ccc(OCCOCCOCCOCCOCCOCCOCCCS(=O)(=O)[OH+][Pt@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]S(=O)(=O)CCCOCCOCCOCCOCCOCCOCCOc2ccc(CCCCCCCCC)cc2)cc1
+CCCCCCCCN(/N=C/c1c2NC(=O)C(=CC=C[C@@H](C)[C@@H](O)[C@H](C)[C@@H](O)[C@H](C)[C@H](OC(=O)C)[C@H](C)[C@H](OC)C=CO[C@]3(C)Oc4c(C)c(O)c(c2O)c(c1O)c4C3=O)C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCCCCCCCN(N)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+CCCCCCCCN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCCCCCCC[C@@H]1OC[C@](C)(CCC)CO1
+CCCCCCCC[C@@H]1[C@H](CCCCCCCC(=O)N2C[C@@H]3CC[C@@H](CC3)C2)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)C2(Cl)Cl)Cl
+CCCCCCCC[C@H]1OC[C@@](C)(CC)CO1
+CCCCCCCC[C@H]1OC[C@](CC)(CCCC)CO1
+CCCCCCCC[C@H]1O[C@@H](C)[C@H](C)O1
+CCCCCCCC[N@@+]12CN3CN(CN(C3)C2)C1
+CCCCCCCC[S+](c1ncnc2[nH]cnc12)[Pd@@](Cl)([S+](CCCCCCCC)c1ncnc2[nH]cnc12)[S+](CCCCCCCC)c1ncnc2[nH]cnc12
+CCCCCCCCn1nnnc1c1nnn(C)n1
+CCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+CCCCCCC[C@]1(C)O[C@@H](C)[C@H](C)O1
+CCCCCCN(C)[C@@]12CN3CN(CN(C3)C2)C1
+CCCCCCOc1ccc2c(NO[N+]2[O-])c1
+CCCCCCOc1ccc2c(no[n+]2[O-])c1
+CCCCCC[C@@H]1N(CCCN1[C@H](C#N)c1ccccc1)[C@H](C#N)c1ccccc1
+CCCCCC[C@@H]1OC[C@](CC)(CCCC)CO1
+CCCCCC[C@@H]1[C@@H](C#N)C(=O)NC(=O)[C@@H]1C#N
+CCCCCC[C@]1(C)OC[C@@](CC)(CCCC)CO1
+CCCCCC[C@]1(C)O[C@@H](C)[C@H](C)O1
+CCCCCC[Si](CCCCCC)(CCCCCC)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CCCCCC[Si](CCCCCC)(CCCCCC)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[Si](CCCCCC)(CCCCCC)CCCCCC
+CCCCCC[Si](CCCCCC)(CCCCCC)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)[Si](CCCCCC)(CCCCCC)CCCCCC
+CCCCCC[Si](CCCCCC)(CCCCCC)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CCCCCCc1cc2cc(C(=O)Nc3scc(n3)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(=O)oc2cc1O
+CCCCCN(C)[C@]12CN3CN(CN(C3)C2)C1
+CCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+CCCCCOC(=O)N1CCN(CC1)C(=O)[C@H](CCC(=O)[O-])NC(=O)c1cc(cc(n1)c1ccccc1)N1CC[C@@H](COC)CC1
+CCCCCOC(=O)N1CCN(CC1)C(=O)[C@H](CCC(=O)[O-])NC(=O)c1cc(cc(n1)c1ccccc1)N1CC[C@H](COC)CC1
+CCCCC[C@@H]1CC[C@H](CC1)OC(=O)C.CCCCC[C@H]1CC[C@@H](CC1)OC(=O)C
+CCCCC[C@@]1(CCO)C(=O)N/C(=N)/NC1=O
+CCCCC[C@H]([C@@H]1SC(=S)NC1=O)[C@@H]1SC(=S)NC1=O
+CCCCC[C@H]1CC[C@@H](CC1)OC(=O)NC.CCCCC[C@H]1CC[C@@H](CC1)OC(=O)NC
+CCCCC[C@H]1O[C@@H](CCCCC)O[C@@H](CCCCC)O1
+CCCCC[C@H]1[C@@H]2C(=O)NC(=O)[C@H]1C(=O)NC2=O
+CCCCC[C@]1(C)OC[C@](CC)(CCCC)CO1
+CCCCC[C@]1(C)O[C@@H](C)[C@H](C)O1
+CCCCN(C)[C@]12CN3CN(CN(C3)C2)C1
+CCCCN(CCCC)[C@@H]1CC[C@H](CC1)Nc1ccnc2cc(Cl)ccc12
+CCCCN/C(=[N+]\1/[C@H](C)CCC[C@H]1C)/c1ccccc1
+CCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+CCCCN1C(=O)[C@H](c2ccccc2)[C@@]2(CCN(C)CC2)C1=O
+CCCCN1CCN/C/1=[S+]\[Cu@@]1(/[S+]=C/2\NCCN2CCCC)O[S@@](=O)(=O)O1
+CCCCN1C[C@H](O)CN[Pt@@]21OC(=O)CC(=O)O2
+CCCCN1[C@H](CO)[C@H](O)[C@H](O)[C@@H](O)[C@H]1CO
+CCCCNC(=O)[C@H]1CC[C@H](CC1)CC1CCCCC1
+CCCCNC(C)(C)[C@]1(SS[C@](SS1)(c1ccc(Cl)cc1)C(C)(C)NCCCC)c1ccc(Cl)cc1
+CCCCN[C@@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12
+CCCCNc1ccc2nnc(C)n2n1
+CCCCOC(=O)Nc1ccc2c(c1)c1c(ccc3c1[nH]c(=O)c1cccn31)n2CC
+CCCCOC(=O)[C@@H]1O[C@@]2(CCCC2)O[C@@H]1C(=O)OCCCC
+CCCCOC(=O)[C@@H]1[C@@H](C(=O)OCCCC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl
+CCCCOC(=O)[C@@H]1[C@H](N[C@H](c2ccc(Cl)cc2)[C@@H](C(=O)OCCCC)[S@@]1(=O)=O)c1ccc(Cl)cc1
+CCCCOCN(COCCCC)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCCCON1C[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H](C1)OC(=O)C
+CCCCOP(=O)(OCCCC)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCCCP(CCCC)(CCCC)[Pd@]1(Cl)[Cl][Pd@](Cl)([Cl]1)P(CCCC)(CCCC)CCCC
+CCCCP(CCCC)(CCCC)[Pt@]1(Cl)[Cl][Pt@](Cl)([Cl]1)P(CCCC)(CCCC)CCCC
+CCCC[C@@H](CC)C(=O)O[Ge@](CCCC)(CCCC)OC(=O)[C@@H](CC)CCCC
+CCCC[C@@H](CC)C(=O)O[Sn@](CCCC)(CCCC)OC(=O)[C@@H](CC)CCCC
+CCCC[C@@H](CC)C(=O)O[Sn@](Cc1ccccc1)(Cc1ccccc1)OC(=O)[C@H](CC)CCCC
+CCCC[C@@H](CC)CN1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+CCCC[C@@H](CC)COC(=O)CC[S@](=O)(=O)CCC(=O)OC[C@@H](CC)CCCC
+CCCC[C@@H](CC)COC(=O)[C@H](CCC(=O)OC[C@H](CC)CCCC)CCC(=O)OC[C@H](CC)CCCC
+CCCC[C@@H](CC)COC(=O)[C@H]1[C@H](C(=O)OC[C@H](CC)CCCC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl
+CCCC[C@@H](CC)CO[C@@H](OC[C@@H](CC)CCCC)[C@H](OC[C@H](CC)CCCC)OC[C@H](CC)CCCC
+CCCC[C@@H]1CC(=O)[Pd@]2([O+]=C(C)CC(=[O+]2)C)[N+]1(CC)CC
+CCCC[C@@H]1CC[C@@H](NCC(=C)Br)CC1.CCCC[C@@H]1CC[C@@H](NCC(=C)Br)CC1
+CCCC[C@@H]1CC[C@H](CC1)NC(=O)Nc1ccccc1.CCCC[C@H]1CC[C@@H](CC1)NC(=O)Nc1ccccc1
+CCCC[C@@]1(CC)CO[C@H](/C=C/c2ccccc2)OC1
+CCCC[C@@]1(CC)CO[C@H](OC1)[C@@H]1CCC=CC1
+CCCC[C@@]1(CC)CO[C@H](OC1)c1ccccc1
+CCCC[C@@]1(CC)CO[C@](C)(OC1)Cc1ccccc1
+CCCC[C@@]1(O)[C@@]2(CCCCC2)NC(=O)[C@@]21CCCCC2
+CCCC[C@H](C(=O)C(=O)N[C@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3)C(=O)C(C)C
+CCCC[C@H]1O[C@@H](CCCC)O[C@@H](CCCC)O1
+CCCC[C@]1(CC)CO[C@@](C)(CCc2ccc(OC)cc2)OC1
+CCCC[C@]1(CC)CO[C@@](C)(OC1)c1ccccc1
+CCCC[C@]1(CC)CO[C@H](OC1)[C@H](C)c1ccccc1
+CCCC[C@]1(CC)CO[C@H](OC1)c1ccc(O)c(OC)c1
+CCCC[C@]1(CC)CO[C@H](OC1)c1ccc2OCOc2c1
+CCCC[C@]1(CC)CO[C@](CC)(OC1)c1ccccc1
+CCCC[C@]1(CCO)C(=O)N/C(=N)/NC1=O
+CCCC[N+]1(C[C@@H](O)CN[Pt@@]21OC(=O)CC(=O)O2)Cc1ccccc1
+CCCC[Pb]([C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)([C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)[C@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82
+CCCC[Sn@@](CCCC)(OC(=O)[C@H](OC(=O)C)c1ccccc1)OC(=O)[C@H](OC(=O)C)c1ccccc1
+CCCC[Sn@@](CCCC)(OS(=O)c1ccccc1)OS(=O)c1ccccc1
+CCCC[Sn@@]1(CCCC)OCCN2CCN(CCO1)CC2
+CCCC[Sn@](CCCC)(OC(=O)/C=C/c1ccccc1F)OC(=O)/C=C/c1ccccc1F
+CCCC[Sn@](CCCC)(OC(=O)[C@H](OC)c1ccccc1)OC(=O)[C@H](OC)c1ccccc1
+CCCC[Sn](CCCC)(CCCC)NC(=S)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCCC[Sn](CCCC)(CCCC)S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCCN(C)[C@@]12CN3CN(CN(C3)C2)C1
+CCCN/C(=[N+]\1/[C@@H](C)CCC[C@@H]1C)/c1ccccc1
+CCCNC(=O)[C@H]1[C@@H]2CC[C@@H](CC2)[C@@H]1C(=O)NCCC
+CCCN[C@@]12CN3CN(CN(C3)C2)C1
+CCCOC(=O)Nc1ccc2c(c1)c1c(ccc3c1[nH]c(=O)c1cccn31)n2CC
+CCCOC(=O)[C@@H]1[C@H](N[C@@H](c2ccc(OC)cc2)[C@H](C(=O)OCCC)[S@@]1(=O)=O)c1ccc(OC)cc1
+CCCOc1ccc(cc1OC)[C@H]([C@H](C(=O)C)C(=O)OCC)[C@H](C(=O)C)C(=O)OCC
+CCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CCC[C@@H](C)[C@H]1CC[C@@H](CC1)N[C@H]1CC[C@@H](CC1)[C@@H](C)CCC
+CCC[C@@H]1CC=CC[C@]21C(=O)NC(=O)NC2=O
+CCC[C@@H]1CCCC[C@]21C(=O)NC(=O)NC2=O
+CCC[C@@H]1O[C@H](C)[C@@H](C)O1
+CCC[C@@]1(C)CO[C@](C)(OC1)c1ccc(Cl)cc1
+CCC[C@@]1(c2ccccc2)[C@H](C#N)C(=O)NC(=O)[C@H]1C#N
+CCC[C@@]1(c2ccccc2)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O
+CCC[C@H](C1=C(O)C[C@@H](C)CC1=O)C1=C(O)C[C@@H](C)CC1=O
+CCC[C@H]1C(=O)N/C(=N)/NC1=O
+CCC[C@H]1OC[C@]2(CO1)CO[C@@H](CCC)OC2
+CCC[C@H]1O[C@]2(CCCC2)OC[C@H]1CC
+CCC[C@]1(C)CO[C@@H](/C=C/c2ccccc2)OC1
+CCC[C@]1(C)CO[C@@H](OC1)Cc1ccccc1
+CCC[C@]1(C)CO[C@@H](OC1)c1ccc(Cl)cc1
+CCC[C@]1(CC)C(=O)N/C(=N)/NC1=O
+CCC[N+](C)(C)CCn1c2[nH]c(=N)sc2c(=O)n(CC)c1=O
+CCC[N+](CCC)(CCC)CCC.N#C/C(=C\1/[SH+][Ni+2]2([SH+]1)[SH+]/C(=C(\C#N)/c1ccccc1)/[SH+]2)/c1ccccc1
+CCC[N+](CCC)(CCC)CCC.N#C/C(=C\1/[SH+][Pt+2]2([SH+]1)[SH+]/C(=C(\C#N)/c1ccccc1)/[SH+]2)/c1ccccc1
+CCC[N+](CCC)(CCC)CCC.c1ccc(cc1)/N=C/1\[SH+][Ni+2]2([SH+]1)[SH+]/C(=N/c1ccccc1)/[SH+]2
+CCC[S+]1[Rh](C#[O+])(C#[O+])[S+](CCC)[Rh@@]1(C#[O+])C#[O+]
+CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pd@@]1(Br)Br
+CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pd@@]1(Cl)Cl
+CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pt@@]1(Br)Br
+CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pt@@]1(Cl)Cl
+CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pt@@]1(I)I
+CCCc1nnnn1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCCn1c(=O)[nH]c(=O)c2sc(=N)[nH]c12
+CCCn1c2[nH]c(=N)sc2c(=O)n(CC)c1=O
+CCN(C)[C@]12CN3CN(CN(C3)C2)C1
+CCN(CC)C(=O)O[C@@H]1[C@@](C)(C)[C@@H](OC(=O)N(CC)CC)[C@]1(C)C
+CCN(CC)C(=S)S[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@@-]9(SC(=S)N(CC)CC)C7=C41
+CCN(CC)C(=S)S[C@@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@-]9(SC(=S)N(CC)CC)C7=C41
+CCN(CC)C1=[S+][Ni@@]2(S1)[S+](Cc1ccccc1)[Ni@@]1(SC(=[S+]1)N(CC)CC)[S+]2Cc1ccccc1
+CCN(CC)CC(=O)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCN(CC)CCCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31
+CCN(CC)CCC[C@H](C)Nc1ccnc2ccc3nn(C)nc3c12.OP(=O)(O)O
+CCN(CC)CCNc1ccc2NNn3c2c1c(=O)c1cc(ccc31)[N+](=O)[O-]
+CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(C)ccc31
+CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31
+CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(OC)ccc31
+CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(ccc31)OC(=O)C
+CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(ccc31)[N+](=O)[O-]
+CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1ccccc31
+CCN(CC)CCNc1ccc2nnn3c4ccc(OCCN(CC)CC)cc4c(=O)c1c23
+CCN(CC)CCOC(=O)[C@@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1
+CCN(CC)CCOC(=O)[C@H]1CC[C@@H](C)CC1
+CCN(CC)CCOC(=O)[C@](O)(C1CCCCC1)[C@@H]1CC[C@@H](C)CC1
+CCN(CC)CCOC(=O)[C@](O)(C1CCCCC1)[C@H]1[C@@H](C)CCC[C@@H]1C
+CCN(CC)CCOC(=O)[C@](O)([C@@H]1CC[C@H](CC1)C(C)C)[C@@H]1CC[C@H](CC1)C(C)C
+CCN(CC)CCn1c(nc2cc(ccc12)[N+](=O)[O-])CC12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCN(CC)CCn1c(nc2cc(ccc12)[N+](=O)[O-])C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCN(CC)C[C@@H](O)[C@H]1CC[C@@H](CC1)c1ccccc1
+CCN(CC)Cc1cc(ccc1OC)Nc1nc(N[C@@H]2CC[C@H](CC2)N(C)C)c2ccccc2n1
+CCN(CC)[C@@H]1CC[C@H](CC1)NS(=O)(=O)c1ccc(cc1)NC(=O)C
+CCN(CC)[C@H]1CC[C@@H](CC1)[C@@H]1[C@@H](C)[C@H](Oc2cc3OCOc3cc12)N1CCOCC1
+CCN(CC)[C@]1(OC[C@@]2(CO1)CO[C@](OC2)(N(CC)CC)[C@H](F)C(F)(F)F)[C@H](F)C(F)(F)F
+CCN(CC)c1c(C)nnc2c3c(nnc(c4ccccc4)c3c3ccccc3)nn12
+CCN(CC)c1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1
+CCN(CC)c1ccc2cc(C(=O)Nc3scc(n3)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(=O)oc2c1
+CCN(Cc1ccccc1)c1ccc(cc1)/C(=C/1\C=C/C(=[N+](\CC)/Cc2ccccc2)/C=C1)/c1cc(O)c(cc1S(=O)(=O)[O-])S(=O)(=O)O
+CCN(Cc1ccccc1)c1ccc(cc1)/C(=C\1/C=C/C(=[N+](/CC)\Cc2ccccc2)/C=C1)/c1cc(O)c(cc1S(=O)(=O)[O-])S(=O)(=O)O
+CCN(N=O)[C@H]1[C@]2(CCCC2)NC(=O)[C@@]21CCCC2
+CCN(c1ccccc1)c1cc2c(NO[N+]2[O-])cc1[N+](=O)[O-]
+CCN(c1ccccc1)c1cc2c(no[n+]2[O-])cc1[N+](=O)[O-]
+CCN1CCC[C@@H](C1)NP1(=O)OC[C@@](C)(CO1)[N+](=O)[O-]
+CCN1CCC[C@@H](C1)NP1(=O)OC[C@](C)(CO1)[N+](=O)[O-]
+CCN1CCN(CC1)c1ccc(cc1)Nc1ccnc2ccc3nn(C)nc3c12
+CCN1CC[C@@]2(CC1)O[C@H](c1ccccc1)[C@@H](O2)c1ccccc1
+CCN1CN(c2ccccc2)[C@@]2(CCN(CC2)C[C@@H]2COc3ccccc3O2)C1=O
+CCNC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CCNC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CCNC(=S)NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCNP(=O)(CCl)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCN[C@@H]1[C@]2(CCCCC2)NC(=O)[C@@]21CCCCC2
+CCN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCNc1ccc(cc1)/C(=C/1\C=C/C(=N)/C=C1)/c1ccc(N(CC)CC)c(C)c1
+CCO.CCOC(=O)[C@@H]1C(=O)[C@H]([C@@H](N(CCCl)CCCl)[C@H](O)[C@H](O)[C@H](O)CO)C(=O)[C@@H](C(=O)OCC)[C@@H]1c1ccc(O)cc1.CCOC(=O)[C@H]1[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C(=O)[C@H](C1=O)[C@@H]([C@H](O)[C@H](O)[C@H](O)CO)[C@H]1C(=O)[C@@H](C(=O)OCC)[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C1=O
+CCO.OC[C@H]1O[C@H](OC[C@H](O)[C@H](O)[C@H](O)c2cnn(n2)c2ccccc2)[C@H](O)[C@H](O)[C@H]1O
+CCO/C=N\Nc1ccc2nnc(Cl)n2n1
+CCOC(=O)/C(=C(\[C@H](C)CC)/[C@H](C)CC)/C#N
+CCOC(=O)/C(=C/1\[SH+][Cu+2]2([SH+]1)[SH+]/C(=C(\C#N)/C(=O)OCC)/[SH+]2)/C#N.c1ccc(cc1)CP(c1ccccc1)(c1ccccc1)c1ccccc1
+CCOC(=O)/C(=C\N[C@@H]1C[C@H](N/C=C(\C(=O)C)/C(=O)OCC)C[C@@H](N/C=C(/C(=O)C)\C(=O)OCC)C1)/C(=O)C
+CCOC(=O)/C(=C\[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)/C#N
+CCOC(=O)/C(=C\[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)/C#N
+CCOC(=O)/C=C\[C@@H](O)[C@@H](O)/C=C/C(=O)OCC
+CCOC(=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCOC(=O)C1(C(=O)OCC)[C@H](c2cc(OC)c(OC)c(OC)c2)[C@@](C(=O)OCC)(C(=O)OCC)[C@H]1c1cc(OC)c(OC)c(OC)c1
+CCOC(=O)C1=C(C#N)[C@]2(CC[C@@H](OCc3ccccc3)CC2)C(=O)O1
+CCOC(=O)C1=C(C)[C@@H]2[C@@H]3C(=O)NC(=O)[C@H]3[C@@]1(C)[C@@H]1C(=O)NC(=O)[C@@H]21
+CCOC(=O)C1=C(C)[C@@H]2[C@@H]3C(=O)OC(=O)[C@H]3[C@@]1(C)[C@@H]1C(=O)OC(=O)[C@@H]21
+CCOC(=O)C1=C(OCC1=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCOC(=O)CC[C@@](O)([C@H](C(=O)O)c1ccccc1)[C@H](C(=O)O)c1ccccc1
+CCOC(=O)CC[C@@]1(C)OC[C@H](O)CO1.CCOC(=O)CC[C@]1(C)OC[C@@H](CO)O1
+CCOC(=O)CC[C@]1(C)O[C@@H](C)[C@H](C)O1
+CCOC(=O)CN(CC)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCOC(=O)CN1C(=O)[C@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@H]2C1=O
+CCOC(=O)CNC(=O)N(CC)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCOC(=O)CNC(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCOC(=O)C[C@@H]1CC[C@H](CCCC[C@@H]2CC[C@H](CC2)CC(=O)OCC)CC1
+CCOC(=O)C[C@@H]1CN(CC[C@]21OCCO2)C(=O)c1ccccc1
+CCOC(=O)C[C@@H]1O[C@@H]2CCCC[C@H]2O1
+CCOC(=O)C[C@H](SP1(=S)OC[C@]2(CCCCC2)CO1)C(=O)OCC
+CCOC(=O)C[C@]1(C)O[C@@H](C)[C@H](C)O1
+CCOC(=O)C[n+]1ccc(cc1)C(=O)C[C@@]1(O)[C@]2(Cl)[C@]3(Cl)[C@]4(Cl)[C@@]1(Cl)[C@]1(Cl)[C@@]2(Cl)[C@@]3(Cl)[C@](Cl)(Cl)[C@]41Cl
+CCOC(=O)C[n+]1cccc(c1)C(=O)C[C@@]1(O)[C@@]2(Cl)[C@@]3(Cl)[C@@]4(Cl)[C@]1(Cl)[C@@]1(Cl)[C@]2(Cl)[C@]3(Cl)[C@@](Cl)(Cl)[C@@]41Cl
+CCOC(=O)Cc1nnn(C)n1
+CCOC(=O)N1CC[C@]2(CC1)O[C@@H](C)[C@](Sc1ccccc1)(C2)C(=O)C
+CCOC(=O)N1N(C(=O)OCC)[C@H]2c3ccccc3[C@@H]1c1ccccc21
+CCOC(=O)N1[C@@H]2C[S@@](=O)(=O)C[C@H]12
+CCOC(=O)N[C@@H]1CC[C@@H]2c3ccccc3[C@@](C1)([N+](=O)[O-])c1ccccc21
+CCOC(=O)N[C@@H]1CC[C@H]2c3ccccc3[C@](C1)([N+](=O)[O-])c1ccccc21
+CCOC(=O)N[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+CCOC(=O)N[C@@H]1C[C@@]2(CCCCC2)C=CN1C(=O)OCC
+CCOC(=O)N[C@H](P(=O)(O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1ccc(cc1)[C@H](NC(=O)OCC)P(=O)(O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCOC(=O)Oc1ccc2c(c1)c(=O)c1c(NCCCN(CC)CC)ccc3nnn2c13
+CCOC(=O)Oc1ccc2c(c1)c(=O)c1c(NCCN(CC)CC)ccc3nnn2c13
+CCOC(=O)[C@@H](C#N)[C@]1(C(=O)Nc2ccccc12)[C@H](C#N)C(=O)OCC
+CCOC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(O)cc1)[C@H](C(=O)C)C(=O)OCC
+CCOC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(OC)cc1)[C@H](C(=O)C)C(=O)OCC
+CCOC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(cc1)N(C)C)[C@H](C(=O)C)C(=O)OCC
+CCOC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(cc1)[N+](=O)[O-])[C@H](C(=O)C)C(=O)OCC
+CCOC(=O)[C@@H](C(=O)C)[C@H](CCc1cc(OC)ccc1OC)[C@H](C(=O)C)C(=O)OCC
+CCOC(=O)[C@@H](C(=O)C)[C@H](c1ccc(cc1)[N+](=O)[O-])[C@H](C(=O)C)C(=O)OCC
+CCOC(=O)[C@@H]1C=C2O[C@H]3O[C@@]4(CCCCC4)O[C@H]3[C@H]2[C@H]2C(=O)C=CC(=O)[C@]12C(=O)OC
+CCOC(=O)[C@@H]1CC2(SCCS2)[C@H](C[C@@]21SCCS2)C(=O)O
+CCOC(=O)[C@@H]1CCCC[C@@]21OCCO2
+CCOC(=O)[C@@H]1CC[C@@H](CC1)NC(=O)c1ccccc1
+CCOC(=O)[C@@H]1C[C@]2(OCCO2)C[C@@H](C)C1=O
+CCOC(=O)[C@@H]1O[C@]2(CCCCC2)O[C@@H]1C(=O)OCC
+CCOC(=O)[C@@H]1[C@@H](C(=O)OCC)[C@H]2c3ccccc3[C@@H]1c1ccccc21
+CCOC(=O)[C@@H]1[C@@H](c2ccc(cc2)OC(=O)C)[C@H](C(=O)OCC)c2nnp(N(CCOS(=O)(=O)C)CCOS(=O)(=O)C)c2/C/1=N/N=C\1/c2c(nnp2N(CCOS(=O)(=O)C)CCOS(=O)(=O)C)[C@@H](C(=O)OCC)[C@@H](c2ccc(cc2)OC(=O)C)[C@@H]1C(=O)OCC
+CCOC(=O)[C@@]1(S[C@@](S1)(C(=O)OCC)c1ccccc1)c1ccccc1
+CCOC(=O)[C@@]12CCC(=O)C[C@@]2(O)CC[C@]2(OCCCO2)C1
+CCOC(=O)[C@@]12CC[C@@](CC32SCCS3)(C(=O)OCC)[C@]2(SCCS2)C1
+CCOC(=O)[C@@]12C[C@H](COc3ccc(cc3)[N+](=O)[O-])ON2O[C@@H](COc2ccc(cc2)[N+](=O)[O-])C1
+CCOC(=O)[C@@]12N(O[C@@H]3C(=O)N(CC)C(=O)[C@@H]13)O[C@@H]1C(=O)N(CC)C(=O)[C@@H]21
+CCOC(=O)[C@H](/N=N/c1[nH]nnn1)/N=N/c1[nH]nnn1
+CCOC(=O)[C@H](Br)C#N.CCOC(=O)[C@@]1(C#N)[C@@]2(CCCCC2)C1(C#N)C#N
+CCOC(=O)[C@H](C(=O)C)[C@@H](c1ccc(OCc2ccccc2)c(C)c1)[C@@H](C(=O)C)C(=O)OCC
+CCOC(=O)[C@H](C(=O)C)[C@@H](c1ccccc1)[C@@H](C(=O)C)C(=O)OCC
+CCOC(=O)[C@H](C(=O)C)[C@H](C)[C@@H](C(=O)C)C(=O)OCC
+CCOC(=O)[C@H](C)NC(=O)N(C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCOC(=O)[C@H]1C(C)(C)/C(=N/NS(=O)(=O)c2ccc(C)cc2)/C1(C)C
+CCOC(=O)[C@H]1CCCC[C@]21Nc1cccc3cccc(N2)c13
+CCOC(=O)[C@H]1CCC[C@]21Nc1cccc3cccc(N2)c13
+CCOC(=O)[C@H]1CC[C@]2(OCCO2)C1
+CCOC(=O)[C@H]1CS[C@@]2(CCCC2)N1
+CCOC(=O)[C@H]1C[C@@]2(CC[C@H]1N)c1ccccc1c1ccccc21
+CCOC(=O)[C@H]1C[C@@]2(OCCO2)c2c(OC)ccc(Cl)c2[C@@H]1C
+CCOC(=O)[C@H]1C[C@]21c1ccccc1c1ccccc21
+CCOC(=O)[C@H]1NS(=O)(=O)N[C@@H](NS(=O)(=O)N1)C(=O)OCC
+CCOC(=O)[C@H]1N[Pt@@](Cl)(Cl)N[C@@H]1C(=O)OCC
+CCOC(=O)[C@H]1O[C@]21CCCC2
+CCOC(=O)[C@H]1[C@@H]2CC[C@@H](CC2)[C@@H]1C(=O)OCC
+CCOC(=O)[C@H]1[C@H](C(=O)OCC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl
+CCOC(=O)[C@](C#N)(CC/C(=N\c1ccccc1C#N)/NC(C)(C)C)CC/C(=N\c1ccccc1C#N)/NC(C)(C)C
+CCOC(=O)[C@](C#N)([C@H]1C=CCC1)[C@H]1C=CCC1
+CCOC(=O)[C@]1(C)OC(=O)[C@@]2(CCCCC2)O1
+CCOC(=O)[C@]1(C)OC(=O)[C@]2(CCCC2)O1
+CCOC(=O)[C@]1(O)OC(=O)[C@]2(CC[C@@H](OCc3ccccc3)CC2)C1
+CCOC(=O)[C@]12C[C@H](COc3ccc(cc3)[N+](=O)[O-])ON2O[C@@H](COc2ccc(cc2)[N+](=O)[O-])C1
+CCOC(=O)c1c(O)nc2cccc3Sc4ncccc4c1c23
+CCOC(=O)c1c2ccc3nc4nonc4nc3c2oc1C(F)(F)F
+CCOC(=O)c1cc(Cl)cc2c(=O)c3c(=O)c4[nH]c5c(cc(Cl)cc5c(=O)c4c(=O)c3[nH]c12)C(=O)OCC
+CCOC(=O)c1cc(Cl)cc2c(=O)c3c(O)c4[nH]c5c(cc(Cl)cc5c(=O)c4c(O)c3[nH]c12)C(=O)OCC
+CCOC(=O)c1ccc(/N=N/N2CN3CN(/N=N/c4ccc(cc4)C(=O)OCC)CN(C3)C2)cc1
+CCOC(=O)c1ccc(OC)c2[nH]c3c(=O)c4c(=O)c5c(ccc(OC)c5[nH]c4c(=O)c3c(=O)c12)C(=O)OCC
+CCOC(=O)c1ccc(cc1)/N=C(\CC[C@](C#N)(C#N)CC/C(=N\c1ccc(cc1)C(=O)OCC)/NC(C)(C)C)/NC(C)(C)C
+CCOC(=O)c1ccc(cc1)/N=C\1/C(C)(C)/C(=N\c2ccc(cc2)C(=O)OCC)/[C@@]1(C)C
+CCOC(=O)c1ccc(cc1)NC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)Nc3ccc(cc3)C(=O)OCC)C6=C12
+CCOC(=O)c1ccc(cc1)NC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)Nc3ccc(cc3)C(=O)OCC)C6=C12
+CCOC(=O)c1ccc2n[se]nc2c1
+CCOC(=O)c1cccc2c(=O)c3c(=O)c4[nH]c5c(cccc5c(=O)c4c(=O)c3[nH]c12)C(=O)OCC
+CCOC(=O)c1ccccc1N(O)C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCOC1=[O+][Ti]2([OH+]CC)([OH+]CC)([O+]=C(OCC)[CH-]C(=[O+]2)C23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[O+]=C([CH-]1)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCOC1=[O+][Ti]2([OH+]CC)([OH+]CC)([O+]=C(OCC)[CH-]C(=[O+]2)C23C[C@H]4C[C@H](C[C@H](C4)C3)C2)[O+]=C([CH-]1)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCOCCN(CCOCC)C(=O)c1ccc2[N+]([O-])ONc2c1
+CCOCCN(CCOCC)C(=O)c1ccc2c(no[n+]2[O-])c1
+CCOC[C@@H]1CO[C@]2(CCCC2)O1
+CCON1C(=O)[C@@]2(CCCCC2)C(=O)[C@]21CCCC=C2
+CCOP(=O)(CCl)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCOP(=O)(OCC)C[C@@H]1C[C@](O)(CNc2cc(Cl)nc(N)n2)C1
+CCOP(=O)(OCC)NC(=S)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCOP(=O)(OCC)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCOS(=O)(=O)C/C(=N\N=C(\CS(=O)(=O)OCC)/c1ccccc1)/c1ccccc1
+CCO[C@@H](C)C(=O)OC[C@]12CO[C@]3(C)CC[C@@](C)(OC1)N23
+CCO[C@@H]1CC[C@@]23C4=C5C6=C2[Fe]27893456C3=C8[C@@]19C7=C23
+CCO[C@@H]1O[C@H](OCC)C[S@](=O)(=O)C1
+CCO[C@@]1(NC(=O)N(C)C)[C@@H]2CCCC[C@@H]12
+CCO[C@@]1(OCC)[C@@]2(Cl)[C@@H]3[C@H]4C[C@@H]([C@H]5[C@H]4[C@@]4(Cl)C(=C(Cl)[C@@]5(Cl)C4(OCC)OCC)Cl)[C@H]3[C@]1(Cl)C(=C2Cl)Cl
+CCOc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)ccc1O
+CCOc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)ccc1OCC
+CCOc1cc(OCC)c(OCC)cc1/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCOc1ccc(cc1)C(=O)N1C[C@@H](C(=O)NCC(C)(C)[NH+]2CCOCC2)[C@]2(CC[NH2+]CC2)C1
+CCOc1ccc(cc1)N1C(=O)[C@@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@@H]2C1=O
+CCOc1ccc(cc1)NC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCOc1ccc(cc1OC)[C@H]1N2CCCN1CC2
+CCOc1ccc2[nH]c3c(C)c4ccn(C)cc4c(C)c3c2c1.CC(=O)O
+CCOc1ccc2c(c1)c(=O)c1c(NCCN(CC)CC)ccc3nnn2c13
+CCOc1ccc2nnnn2n1
+CCOc1cccc2OC[C@H](CN3CC[C@]4(CC3)C(=O)NCN4c3ccccc3)Oc12
+CCOc1ccccc1/C=N/N/C(=N)/N/N=C\c1ccccc1OCC
+CCOc1ccccc1/C=N/N/C(=N/N=C/c1ccccc1OCC)/N/N=C/c1ccccc1OCC
+CCOc1ccccc1/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCOc1ccccc1/C=c/1\sc2nc(nn2c1=O)c1ccc(F)cc1
+CCOc1ccccc1C(=O)O[C@@H]1CC[C@@H](C)CC1
+CCOc1ccccc1NC(=O)CCc1nnc2s/c(=C\CCc3ccccc3)/c(=O)n12
+CCOc1ccn(CC(=O)N2CC[C@]3(CC2)SS[C@@]2(CCN(CC2)C(=O)Cn2ccc(OCC)nc2=O)S3)c(=O)n1
+CCOc1ncn(n1)c1ccc(cc1)NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CCS(=O)(=O)O.N=C1NC(=N)N(c2ccc(OC[C@@H]3CC[C@H](CC3)COc3ccc(cc3)S(=O)(=O)F)c(Cl)c2)C(C)(C)N1
+CCS(=O)(=O)c1ccc2nnnn2n1
+CCSC1(SCC)[C@]2(CCCCC2)C(=O)[C@]21CCCCC2
+CCSc1n/c(=C/c2ccco2)/c2nncn12
+CCSc1n/c(=C/c2ccco2)/c2nnnn12
+CC[C@@H](C)C[C@]12C3=C4C5=C1[Zr]16782345(Cl)(Cl)C2=C7[C@@]8(C[C@H](C)CC)C6=C12
+CC[C@@H](C/C=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])C/C=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]
+CC[C@@H]1C(=O)O[Pt@@]2(NCc3cccc[n+]23)OC1=O
+CC[C@@H]1C(=O)[OH+][Pt@@+2](N)(NCCCCCCN[Pt@+2]2(N)[OH+]C(=O)[C@@H](CC)C(=O)[OH+]2)[OH+]C1=O
+CC[C@@H]1CC[Si](C)(C)C[C@]21C(=O)NC(=O)NC2=O
+CC[C@@H]1N2CC[C@@H](CC2)[C@H]1OC(=O)C(O)(c1ccccc1)c1ccccc1
+CC[C@@]1(C)CC(=O)N(C/C=C(/C)\CCC(=O)O)C(=O)C1
+CC[C@@]1(C)CC(=O)N(C/C=C(/C)\CCC=C(C)C)C(=O)C1
+CC[C@@]1(C)CO[C@@](C)(OC1)Cc1ccccc1
+CC[C@@]1(CC)O[C@@H]([C@H](O)CCc2ccccc2O)[C@@H](O1)[C@H](O)CCc1ccccc1O
+CC[C@@]1(O)C[C@@H](c2ccccc2)N(C)[C@@H](C1)c1ccccc1
+CC[C@@]1(c2ccccc2)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O
+CC[C@@]12O[C@]3(CC)[C@@H]4OC(=O)[C@H]2[C@@]2(CC)O[C@]4(CC)[C@@H]3OC(=O)[C@@H]12
+CC[C@H](C(=O)N[C@H]1CN2CC[C@@H]1CC2)c1ccccc1
+CC[C@H](C)[C@@H]1CC[C@H](CC1)OC(=O)c1ccccc1
+CC[C@H](C)[C@H](C)CN[C@]12CN3CN(CN(C3)C2)C1
+CC[C@H](C)[C@H]1CC[C@H]2/C(=C/C=C\3/C[C@@H](O)C(=C)[C@H](O)C3)/CCC[C@]12C
+CC[C@H](C)[C@](O)(C#C)C(=O)O[C@@H]1[C@H]2CCN(CC2)[C@H]1C
+CC[C@H](C/C=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])C/C=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]
+CC[C@H](CC[C@H](C)[C@@H]1CC[C@H]2[C@H]3CC=C4C[C@@H](CC[C@]4(C)[C@@H]3CC[C@]12C)[OH+][Ti@@]([Cl-])([OH+][C@@H]1CC[C@@]2(C)C(=CC[C@@H]3[C@@H]4CC[C@@H]([C@@H](C)CC[C@@H](CC)C(C)C)[C@@]4(C)CC[C@@H]23)C1)[OH+][C@@H]1CC[C@@]2(C)C(=CC[C@@H]3[C@@H]4CC[C@@H]([C@@H](C)CC[C@@H](CC)C(C)C)[C@@]4(C)CC[C@@H]23)C1)C(C)C
+CC[C@H](CC[C@H](C)[C@@H]1CC[C@H]2[C@H]3CC=C4C[C@@H](CC[C@]4(C)[C@@H]3CC[C@]12C)[OH+][Ti@]([Cl-])([OH+][C@@H]1CC[C@@]2(C)C(=CC[C@@H]3[C@@H]4CC[C@@H]([C@@H](C)CC[C@@H](CC)C(C)C)[C@@]4(C)CC[C@@H]23)C1)[OH+][C@@H]1CC[C@@]2(C)C(=CC[C@@H]3[C@@H]4CC[C@@H]([C@@H](C)CC[C@@H](CC)C(C)C)[C@@]4(C)CC[C@@H]23)C1)C(C)C
+CC[C@H](CO)N1CCN([C@H](CC)CO)[Pt@@]1(Cl)Cl
+CC[C@H](NC(=O)CCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1ccccc1OC
+CC[C@H]1C(=O)[OH+][Pt@+2](N)(NCCCCCN[Pt@+2]2(N)[OH+]C(=O)[C@@H](CC)C(=O)[OH+]2)[OH+]C1=O
+CC[C@H]1C(=[O+][Cu@]2([O+]=C1C)[O+]=C(C)[C@H](CC)C(=[O+]2)C)C
+CC[C@H]1CC[C@@H](CC1)NC(=O)NC.CC[C@H]1CC[C@@H](CC1)NC(=O)NC
+CC[C@H]1CC[C@@H](CC1)NC(=O)c1ccccc1.CC[C@@H]1CC[C@H](CC1)NC(=O)c1ccccc1
+CC[C@H]1N2CC[C@@H](CC2)[C@@H]1OC(=O)CC(O)(c1ccccc1)c1ccccc1
+CC[C@](C)([C@@H]1CC[C@H](O)CC1)[C@H]1CC[C@H](O)CC1
+CC[C@](O)([C@H](c1ccccc1)c1ccccn1)[C@H](c1ccccc1)c1ccccn1
+CC[C@]1(C)CO[C@@H](/C=C/c2ccccc2)OC1
+CC[C@]1(C)O[C@@H](C)[C@H](C)O1
+CC[C@]1(CC)COP(=O)(OCCN2C(=O)[C@@H]3[C@@H]4C=C[C@@H](C4)[C@H]3C2=O)OC1
+CC[C@]1(CCC(C)C)C(=O)N(c2ccccc2)/C(=N)/N(c2ccccc2)C1=O
+CC[C@]1(O)[C@]2(CCCC=C2)NC(=O)[C@@]21CCCCC2
+CC[C@]1(O[C@@H](C)[C@H](C)O1)c1ccccc1
+CC[Ge@@]1(CC)CC[C@@]2(CC1)NC(=O)N(CCCN(C)C)[C@@H]2O
+CC[Hg]N1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+CC[N+](C)(C)CCCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC[N+](C)(C)CCCOC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC[N+](C)(CC)CCOC(=O)[C@H](c1ccccc1)[C@@]1(O)CC[C@@H](C)CC1
+CC[N+](CC)(CC)CCCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC[N+]1(C)C[C@H]2CC[C@H](CC2)C1
+CC[N+]1(CC)CCN2CC[N+](CC)(CC)[Pd@@+]12Cl.FP(F)(F)(F)(F)F
+CC[N@+]12CN3CN(CN(C3)C2)C1
+CC[OH+][Ti]([OH+]CC)([OH+]c1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[OH+]c1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CC[OH+][Ti]12([O+]=C(C)[CH-]C(=[O+]1)c1ccccc1)([O+]=C(C)[CH-]C(=[O+]2)c1ccccc1)[OH+]C12C[C@@]3(C)C[C@@](C)(C1)C[C@@](C)(C2)C3
+CC[OH+][Ti]12([O+]=C(C)[CH-]C(=[O+]1)c1ccccc1)([O+]=C(C)[CH-]C(=[O+]2)c1ccccc1)[OH+]C12C[C@@]3(C)C[C@@](C)(C1)C[C@](C)(C3)C2
+CC[Sn@](CC)(OC(=O)[C@@H](N)Cc1ccccc1)OC(=O)[C@@H](N)Cc1ccccc1
+CC[Sn@](CC)(OC(=O)[C@H](OC(=O)C)c1ccccc1)OC(=O)[C@H](OC(=O)C)c1ccccc1
+CC[Sn@](CC)(OS(=O)(=O)C[C@@]12CC[C@@H](CC1=O)C2(C)C)OS(=O)(=O)C[C@@]12CC[C@@H](CC1=O)C2(C)C
+CCc1ccc(C)n(N)c1
+CCc1cccc(C)c1NC(=O)CCc1nnc2s/c(=C/c3cccc4ccccc34)/c(=O)n12
+CCc1cccc(CC)c1N1C(=O)[C@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+CCc1ccccc1[C@H](C(=O)N[C@H]1CN2CC[C@H]1CC2)c1ccsc1
+CCc1ccccn1N
+CCc1nnc2sc3c(nn12)c(Cl)c1sc2nnc(CC)n2nc1c3Cl
+CCc1nnnn1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CCn1c(=O)n(CC)c(=O)c2sc(=N)n(C)c12
+CCn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2cc(C)c(C)cc12
+CCn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2ccccc12
+CCn1c2ccc(NC(=O)OC(C)C)cc2c2c1ccc1c2[nH]c(=O)c2cccn12
+CCn1c2ccc3c([nH]c(=O)c4cccn34)c2c2cc(N)ccc12
+CCn1c2ccc3c(ncc4cccn34)c2c2cc(N)ccc12
+CCn1c2ccc3c(ncc4cccn34)c2c2ccccc12
+CCn1c2nc3cc4ccccc4cc3c(=O)n2c2ccccc2c1=O
+CCn1c2nc3ccccc3nc2n(CC)c2nc3ccccc3nc12
+CCn1cn(c2c(O)nc(N)nc12)[Pt@@](N)(Cl)n1cccc2ccccc12.ON(=O)O
+CCn1cn(c2c(O)nc(N)nc12)[Pt](N)(N)Cl.ON(=O)O
+CCn1nnc(/N=N/c2nnn(CC)n2)n1
+CN(/N=C/c1ccccc1)[C@@H](N(C)/N=C\c1ccccc1)c1ccccc1
+CN(/N=C/c1ccccc1Cl)[C@H](N(C)/N=C\c1ccccc1Cl)c1ccccc1Cl
+CN(/N=C\C=N\N(C)CCc1nnnn1C)CCc1nnnn1C
+CN(C(=O)[C@@]12[C@@H]3[C@@H]4[C@H]2[C@@H]2[C@H]1[C@H]3[C@]42C(=O)C(C)(C)C)C(C)(C)C
+CN(C(=O)[C@@]12[C@@H]3[C@@H]4[C@H]2[C@@H]2[C@H]1[C@H]3[C@]42C(=O)N)C(C)(C)C
+CN(C(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@H]1[C@@]4([C@@H]3[C@@]21C)C(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C)C(C)(C)C
+CN(C(=O)[C@]12[C@@H]3[C@H]4[C@@H]5[C@H]([C@@H]14)[C@]2([C@H]35)C(=O)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14)C(C)(C)C
+CN(C(=O)[C@]12[C@H]3[C@H]4[C@]2(C(=O)O)[C@H]2[C@@H]1[C@]3(C(=O)O)[C@@]42C(=O)N(C)C(C)(C)C)C(C)(C)C
+CN(C)/C(=N\c1ccccc1)/OC1=NC(=C/C/1=C/1\C=C(O/C(=N\c2ccccc2)/N(C)C)N=C1O/C(=N/c1ccccc1)/N(C)C)O/C(=N/c1ccccc1)/N(C)C
+CN(C)/C=N/[C@H]1CC[C@@H](CC1)CC1CCCCC1.CN(C)/C=N/[C@@H]1CC[C@H](CC1)CC1CCCCC1
+CN(C)/C=N/c1ccc2nonc2c1
+CN(C)C(=O)N1CN(c2ccccc2)[C@]2(CCN(CC2)C[C@H]2COc3ccccc3O2)C1=O
+CN(C)C(=O)O[C@@H]1[C@@](C)(C)[C@@H](OC(=O)N(C)C)[C@]1(C)C
+CN(C)C(=O)[C@@H](c1ccccc1)[C@@H](c1ccccc1)[C@H](c1ccccc1)C(=O)N(C)C
+CN(C)C(=O)[C@@H]1CC[C@H](CC1)CC1CCCCC1.CN(C)C(=O)[C@@H]1CC[C@H](CC1)CC1CCCCC1
+CN(C)C(=O)[C@@H]1C[C@@]2(C1)C[C@H](C2)C(=O)N(C)C
+CN(C)C(=S)Nc1nnc(s1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1.O[Cl](=O)(=O)=O
+CN(C)C(=S)S[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(SC(=S)N(C)C)C6=C12
+CN(C)C1=NC(=C2C=CC=C12)N(C)C
+CN(C)C1=[S+][Cu@@]2(I)S3=C(SC(=[S+][Cu@@]3(I)S2=C(S1)N(C)C)N(C)C)N(C)C
+CN(C)CC(=O)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CN(C)CC/[N+](=C(/c1ccccc1)\C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/[O-]
+CN(C)CC/[N+](=C(/c1ccccc1)\[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/[O-]
+CN(C)CC12=C3C4=C5[C@-]61SSS[C@-]17C8=C9C%10=C1[Fe+2]23456789%10
+CN(C)CC12=C3C4=C5[C@-]61SSS[C@@-]17C8=C9C%10=C1[Fe+2]23456789%10
+CN(C)CCCN1CC[C@@]2(CCC[C@@H](C2)C(F)(F)F)CC1
+CN(C)CCCN1CC[C@@]2(CCC[C@H](C)C2)CC1
+CN(C)CCCNc1ccc2NNn3c2c1c(=O)c1cc(ccc31)[N+](=O)[O-]
+CN(C)CCCNc1ccc2NNn3c4ccc(OC(=O)c5ccc(cc5)[N+](=O)[O-])cc4c(=O)c1c23
+CN(C)CCCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31
+CN(C)CCCNc1ccc2nnn3c2c1c(=O)c1cc(ccc31)[N+](=O)[O-]
+CN(C)CCCNc1ccc2nnn3c4ccc(OC(=O)c5ccc(cc5)[N+](=O)[O-])cc4c(=O)c1c23
+CN(C)CCCNc1ccc2nnn3c4ccc(OC(=O)c5ccccc5)cc4c(=O)c1c23
+CN(C)CCNc1ccc2ncnc3c4ccccc4C(=O)c1c23
+CN(C)CCNc1ccc2nnn3c2c1c(=O)c1cc(C)ccc31
+CN(C)CCNc1ccc2nnn3c2c1c(=O)c1cc(Cl)ccc31
+CN(C)CCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31
+CN(C)CCNc1ccc2nnn3c2c1c(=O)c1ccccc31
+CN(C)CCOC(=O)[C@@H]1C[C@]2(C1)C[C@@H](C2)C(=O)OCCN(C)C
+CN(C)CCONC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CN(C)CCO[C@@]1(CC[C@H](CC1)C(C)(C)C)Cc1ccc(C)cc1.OC(=O)/C=C/C(=O)O
+CN(C)CCO[C@@]1(CC[C@H](CC1)C(C)(C)C)Cc1ccc(Cl)cc1Cl.OC(=O)/C=C/C(=O)O
+CN(C)CCO[C@@]1(CC[C@H](CC1)C(C)(C)C)Cc1ccc(F)cc1.OC(=O)/C=C/C(=O)O
+CN(C)CCO[C@]1(CC[C@@H](CC1)C(C)(C)C)Cc1ccc(C)cc1.OC(=O)/C=C/C(=O)O
+CN(C)CCO[C@]1(CC[C@@H](CC1)C(C)(C)C)Cc1ccc(F)cc1.OC(=O)/C=C/C(=O)O
+CN(C)CC[N@+]12CCCN3[C@H](C)c4cccc5[C@@H](C)N(CCC1)[Ni@+3]23[n+]45.[O-][Cl](=O)(=O)=O
+CN(C)CC[N@+]12CCC[N+]3=C(C)c4cccc5C(=[N+](CCC1)[Ni@@+2]23[n+]45)C.[O-][Cl](=O)(=O)=O
+CN(C)CC[N@@+]12CCCN3[C@H](C)c4cccc5[C@@H](C)N(CCC1)[Ni@@+3]23[n+]45.[O-][Cl](=O)(=O)=O
+CN(C)CC[N@@+]12CCC[N+]3=C(C)c4cccc5C(=[N+](CCC1)[Ni@+2]23[n+]45)C.[O-][Cl](=O)(=O)=O
+CN(C)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CN(C)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CN(C)C[C@@H]1CCCC[C@@]21OCCO2
+CN(C)C[C@@H]1CCC[C@]21OCCO2.OC(=O)C(=O)O
+CN(C)C[C@@H]1C[C@@]2(OCCO2)C[C@H](CN(C)C)C1=O
+CN(C)Cc1cc(cc(c2ccccc2)c1O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CN(C)N1CC[C@@]2(CCC[C@@H](C2)C(F)(F)F)CC1
+CN(C)S(=O)(=O)/N=C/1\C=C/C(=N\S(=O)(=O)N(C)C)/C=C1
+CN(C)[C@H]1C(=C(C(=O)NC[N@+]23CCO[B@@-]3(OCC2)c2ccccc2C)C(=O)[C@]2(O)[C@@H]1C[C@H]1C(=C2O)C(=O)c2c(O)cccc2[C@]1(C)O)O
+CN(C)[C@H]1C(=C(C(=O)NC[N@@+]23CCO[B@-]3(OCC2)c2ccccc2C)C(=O)[C@]2(O)[C@@H]1C[C@H]1C(=C2O)C(=O)c2c(O)cccc2[C@]1(C)O)O
+CN(C)[C@H]1C(C)(C)[C@@H](OC(=O)C(O)(c2ccccc2)c2ccccc2)C1(C)C
+CN(C)[C@H]1CC[C@@H](CC1)C[C@@H]1CCc2ccccc12.CN(C)c1ccc(cc1)C[C@@H]1CC[C@H]2CCCC[C@H]12
+CN(C)[C@H]1CC[C@@H](CC1)NC1=CC(=O)C(=CC1=O)N[C@H]1CC[C@@H](CC1)N(C)C
+CN(C)[C@H]1CS(=O)(=O)[C@@]21C[C@H]1c3ccccc3[C@@H]2c2ccccc12
+CN(C)[C@]12CC[C@H](c3ccccc13)c1ccccc21
+CN(C)c1ccc(cc1)/C=C/1\CN(C/C(=C/c2ccc(cc2)N(C)C)/C1=O)C(=O)C
+CN(C)c1ccc(cc1)/C=C\1/C(=O)/C(=C\c2ccc(cc2)N(C)C)/c2ccccc12
+CN(C)c1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CN(C)c1ccc(cc1)/C=c/1\c2ccccc2n2c1cc([n+]2C)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1.[O-]S(=O)(=O)C(F)(F)F
+CN(C)c1ccc(cc1)/C=c/1\c2ccccc2n2c1cc([n+]2C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1.FC(F)(F)S(=O)(=O)[O-]
+CN(C)c1ccc(cc1)/C=c/1\sc2nc(=O)c(nn2c1=O)c1ccccc1NC(=O)C(F)(F)F
+CN(C)c1ccc(cc1)/C=c/1\sc2nc3ccccc3n2c1=O
+CN(C)c1ccc(cc1)/C=c/1\sc2nnc(Cc3ccccc3)n2c1=O
+CN(C)c1ccc(cc1)/C=c/1\sc2nnc(c3cccnc3)n2c1=O
+CN(C)c1ccc(cc1)/C=c/1\sc2nnc(c3ccco3)n2c1=O
+CN(C)c1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CN(C)c1ccc(cc1)[C@@H]1O[C@]2(CCCCC2)C[N@+]21CCCC2.[O-][Cl](=O)(=O)=O
+CN(C)c1ccc(cc1)[C@@H]1O[C@]2(CCCCC2)C[N@@+]21CCCC2.[O-][Cl](=O)(=O)=O
+CN(C)c1nc(nc(n1)N(C)C)N[C@@]12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1
+CN(C)c1nc(nc(n1)N(C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)N(C)C
+CN(C)c1nnn(Cc2ccccc2)n1
+CN(c1ccccc1)C(=S)S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CN(c1ccccc1)[C@H]1C2=C(CCCC2)OC(=O)[C@@]21SCCCS2
+CN.[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(B([C@@-]34C5=C7C8=C3[Fe+2]39%10%114578[C-]4C%10=C9C3=C%114)[C@@-]34C5=C7C8=C3[Fe+2]39%10%114578[C-]4C%10=C9C3=C%114)C6=C12
+CN.[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)B([C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+CN/C(=[S+]\[Rh@@](Cl)(C#[O+])/[S+]=C(\NC)/P(c1ccccc1)c1ccccc1)/P(c1ccccc1)c1ccccc1
+CN1C(=O)/C(=c/2\sc3nc4ccccc4n3c2=O)/c2ccccc12
+CN1C(=O)[C@@H]2S/C(=N/Nc3ccccc3)/S[C@H]1C(=O)N2C
+CN1C(=O)[C@H]2[C@@H](C1=O)[C@@]1(O)c3ccccc3[C@]2(N)c2ccccc12
+CN1C(=S)[C@@]2([C@@H]1c1ccccc1)C(C)(C)CCCC2(C)C
+CN1C/C(=C/c2cccs2)/[C@H](O)/C(=C\c2cccs2)/C1
+CN1C=Cc2ccccc2[C@@H]1[C@@H]([N+](=O)[O-])[C@@H]1N(C)C=Cc2ccccc12
+CN1C=Cc2ccccc2[C@@H]1[C@H]([N+](=O)[O-])[C@@H]1N(C)C=Cc2ccccc12
+CN1CCC[C@@H](CNC23C[C@H]4C[C@@H](C[C@@H](C4)C3)C2)C1
+CN1CCC[C@H](C1)CN(C(=O)C)C12C[C@H]3C[C@@H](C[C@@H](C3)C2)C1
+CN1CCN(CC1)c1ccc2nnc(Cl)n2n1
+CN1CC[C@@]2(CC1)C(=O)N(Cc1ccccc1)C(=O)[C@@H]2c1ccccc1
+CN1CC[C@@]2(CC1)C(=O)N(Nc1ccccc1)C(=O)[C@@H]2c1ccccc1
+CN1CC[C@@]2(CC1)N[C@@H]1CCN(C)C[C@H]1S2.[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-]
+CN1CC[C@@]2(CC1)O[C@H](c1ccccc1)[C@@H](O2)c1ccccc1
+CN1CC[C@@]2(CC1)[C@H](c1ccccc1)C(=O)N(C[C@@H]1COc3ccccc3O1)C2=O
+CN1CC[C@H](O)[C@H](CN[C@@]23C[C@@H]4C[C@@H](C[C@H](C4)C3)C2)C1
+CN1CC[C@H](O)[C@H](CN[C@]23C[C@@H]4C[C@H](C[C@H](C4)C3)C2)C1
+CN1CC[C@]2(CC1)C(=O)N(c1ccccc1)C(=O)[C@H]2c1ccccc1
+CN1CC[C@]2(CC1)N[C@@H]1CCN(C)C[C@H]1S2.[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-]
+CN1CC[C@]2(CC1)SS[C@]1(CCN(C)CC1)S2
+CN1CN(c2ccccc2)[C@]2(CCN(CCC[C@H]3Cc4ccccc4O3)CC2)C1=O
+CN1C[C@@H](c2ccccc2)[C@@H](OC(=O)C)[C@@H](C1)c1ccccc1
+CN1C[C@@H](c2ccccc2)[C@@](Cl)([C@@H](C1)c1ccccc1)[C@@]1(CN(C)C[C@@H](c2ccccc2)C1=O)c1ccccc1
+CN1C[C@@H]2CN(C)C[C@H](C1)[C@@]2(O)c1ccccc1
+CN1C[C@H]2CN(C)C[C@@H](C1)C2.FP(F)(F)(F)(F)F
+CN1NC=[N+](C)N1.[O-][Cl](=O)(=O)=O
+CN1[C@@H]2CC[C@H]1CC1(SCCS1)C2.[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-]
+CN1[C@@H]2CC[C@H]1C[C@]1(SCCS1)C2
+CN1[C@@H]2CC[C@H]1C[C@]1(SCCS1)C2.[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-]
+CN1[C@H](C)C[C@](C[C@H]1C)(c1ccccc1)c1ccccc1
+CN1c2ccccc2[C@]23CCN4CC=C[C@]5(CC[C@]13CC5)[C@H]24
+CNC(=O)N(C)/N=N/C[C@H]1CC[C@H](C/N=N/N(C)C(=O)NC)CC1
+CNC(=O)NCCN1C[C@@H]2CC[C@@H](CC2)C1
+CNC(=O)O/N=C\1/CC[C@@H](CC1)CC1CCCCC1
+CNC(=O)[C@@H]1CC[C@H](CC1)CC1CCCCC1.CNC(=O)[C@H]1CC[C@@H](CC1)CC1CCCCC1
+CNC(=O)[C@@]1(C#N)[C@H](c2ccccc2)[C@](C#N)(C(=O)NC)[C@@H]1c1ccccc1
+CNC(=O)[C@]12C(=O)NC(=O)[C@@]1(C(=O)O)[C@@]12CCCC1
+CNCCC(=O)NC[C@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1.OC(=O)/C=C/C(=O)O
+CNCCC[C@]12C[C@H](c3ccccc13)c1ccccc21
+CNC[C@H](O)C[C@]12CC[C@H](c3ccccc13)c1ccccc21
+CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CO/N=C(\C=C\c1ccccc1)/C=C/c1ccccc1
+COC(=N)c1nnn(n1)c1ccccc1
+COC(=O)C(=O)c1c2c3[nH]c4ccccc4c3ccn2c2ccccc12
+COC(=O)C1(C(=O)OC)[C@@H]2[C@@H](Cl)[C@@H]3[C@H]([C@H]12)C3(C(=O)OC)C(=O)OC
+COC(=O)C1=C(C(=O)OC)[C@@]2(C)O[C@@H]1C(=O)[C@@]12CC1
+COC(=O)C1=C(C(=O)OC)[C@@]2([C@@H]3C=CC=NN13)c1ccccc1c1ccccc21
+COC(=O)C1=C(C(=O)OC)[C@H]2[C@H]3O[C@H]3[C@@H]1[C@]2(c1ccccc1)c1ccccc1
+COC(=O)C1=C(C(=O)OC)[C@H]2c3ccccc3[C@@H]1c1ccccc21
+COC(=O)C1=C(C(=O)OC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl
+COC(=O)C1=C(C(=O)OC)[C@]2(O)c3ccccc3[C@H]1c1ccccc21
+COC(=O)C1=C(C(=O)OC)[C@]2([C@H]3C=CC=CN13)c1ccccc1c1ccccc21
+COC(=O)C1=CCCCC[C@H](N2C[C@H]3O[C@@H]2O3)[C@@H]1C(=O)OC
+COC(=O)C1=C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+COC(=O)C1=N/C(=N)/N=C(C(=O)OC)[C@@]21C(=O)Cc1ccccc21
+COC(=O)C1=N/C(=N)/N=C(C(=O)OC)[C@]1(C)C(=O)c1ccc(Cl)cc1
+COC(=O)C1=N/C(=N)/N=C(C(=O)OC)[C@]1(C)C(=O)c1ccccc1
+COC(=O)C1=N/C(=N)/N=C(C(=O)OC)[C@]1(CC)C(=O)c1ccccc1
+COC(=O)C1=NN[C@]2([C@@H]1C(=O)OC)c1ccccc1Sc1ccccc21
+COC(=O)CCC[C@@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+COC(=O)CCC[C@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+COC(=O)CCC[C@H]1CC/C(=N/Nc2ccccc2)/CC1
+COC(=O)CCC[C@H]1CC[C@@H](CCCC(=O)OC)CC1
+COC(=O)CC[C@H]1CC[C@H](CC1)C[C@@H]1CC[C@H](CC1)CCC(=O)OC
+COC(=O)CC[N+]12CN3CN(CN(C3)C2)C1.[O-][N+](=O)[O-]
+COC(=O)CC[N@+]12CN3CN(CN(C3)C2)C1.[O-][N+](=O)[O-]
+COC(=O)C[C@@]1(C)[C@H](O)[C@@H]2O[C@@](C)(C)O[C@@H]2[C@H]1O
+COC(=O)C[N@+]12CN3CN(CN(C3)C2)C1
+COC(=O)N/N=C\1/C(C)(C)/C(=N/NC(=O)OC)/C1(C)C
+COC(=O)N1CC(=O)[C@@H](C1)C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+COC(=O)N1[C@@H]2c3ccccc3[C@H](N1C(=O)OC)c1ccccc21
+COC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C6[C@-]7(Cl)C8(=C12)C(=O)OC
+COC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C6[C@-]7(Cl)C8(=C12)C(=O)OC
+COC(=O)[C@@H](N[Pd@](Cl)(Cl)N[C@@H](C(=O)OC)c1ccccc1)c1ccccc1
+COC(=O)[C@@H](N[Pt@](Cl)(Cl)N[C@@H](C(=O)OC)c1ccccc1)c1ccccc1
+COC(=O)[C@@H]1C(=O)[C@@H](C(=O)OC)[C@H]2CCC[C@H]3CCC[C@H]1N23
+COC(=O)[C@@H]1C(=O)[C@H](C(=O)OC)[C@]2(C)[C@@H](C(=O)OC)C(=O)[C@H](C(=O)OC)[C@]12C
+COC(=O)[C@@H]1CC(=O)C[C@H](CC(=O)C1)C(=O)OC
+COC(=O)[C@@H]1CC[C@H]2c3ccccc3[C@@H](C1)c1ccccc21
+COC(=O)[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+COC(=O)[C@@H]1OC[C@@]2(CO1)CO[C@@H](OC2)C(=O)OC
+COC(=O)[C@@H]1O[C@@](C)(C)O[C@H]1C(=O)OC
+COC(=O)[C@@H]1O[C@@]2(CCCC2)O[C@H]1C(=O)OC
+COC(=O)[C@@H]1[C@@H](C(=O)OC)[C@@H]2c3ccccc3[C@H]1c1ccccc21
+COC(=O)[C@@H]1[C@@H](C(=O)OC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl
+COC(=O)[C@@H]1[C@H](C(=O)OC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Br)Br)Cl
+COC(=O)[C@@H]1[C@H](c2ccccc2)[C@@H](C(=O)OC)[C@@H]1c1ccccc1
+COC(=O)[C@@]1(C#N)C(C)(C)N=C(c2ccccc2)[C@@]21CCCCC2
+COC(=O)[C@@]1(C)COP(=O)(OC1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+COC(=O)[C@@]12C(=O)NC(=O)[C@]1(C(=O)OC)[C@@]2(C)C
+COC(=O)[C@@]12CC=C3O[C@H]4O[C@@]5(CCCCC5)O[C@H]4[C@H]3[C@H]2C(=O)C=CC1=O
+COC(=O)[C@@]12C[C@@H](C[C@@]3(CC)CO[C@]4(CCCCC4)O3)C(=S)N1CCc1c3ccccc3[nH]c21
+COC(=O)[C@@]12C[C@@H](C[C@]3(CC)CO[C@@]4(CCCCC4)O3)C(=O)N1CCc1c3ccccc3[nH]c21
+COC(=O)[C@@]12C[C@H](CC[C@@H]2[C@]23COC(=O)[C@@H]3C(C)(C)[C@@]3(OCCO3)CC2)[C@H](C)[C@H]1O
+COC(=O)[C@@]12[C@@H]3[C@@H]4[C@@]2(C(=O)N(C(C)C)C(C)C)[C@@H]2[C@H]1[C@@]3(C(=O)N(C(C)C)C(C)C)[C@]42C(=O)OC
+COC(=O)[C@@]12[C@H]3[C@H]4[C@@H]1[C@H]1[C@@H]2[C@@H]3[C@@]41C(=O)N(C(C)C)C(C)C
+COC(=O)[C@H](c1ccccc1)[C@]1(O)CCN(CC1)C[C@H]1COc2ccccc2O1
+COC(=O)[C@H]1CCCCCCCCCC[C@]21SCCCS2
+COC(=O)[C@H]1CCC[C@]2(OCCO2)C1
+COC(=O)[C@H]1CC[C@H](CC1)N(C)S(=O)(=O)c1ccc(C)cc1
+COC(=O)[C@H]1CC[C@]2(OCCO2)C1
+COC(=O)[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+COC(=O)[C@H]1[C@@H](C(=O)OC)[C@@]1(c1ccccc1)c1ccccc1
+COC(=O)[C@H]1[C@@H]2C[S@@](=O)(=O)C[C@H]2[C@H]1C(=O)OC
+COC(=O)[C@H]1[C@H](C(=O)OC)[C@@H](C(=O)OC)[C@H]1C(=O)OC
+COC(=O)[C@H]1[C@H](C(=O)OC)[C@H](C(=O)OC)[C@@H]1C(=O)OC
+COC(=O)[C@H]1[C@H](C(=O)OC)[C@]21C=Cc1ccccc1C=C2
+COC(=O)[C@]1(Br)C[C@@]21c1ccccc1c1ccccc21
+COC(=O)[C@]1(C)C[C@@]21c1ccccc1C(=O)c1ccccc21
+COC(=O)[C@]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(C(=O)OC)C6=C12
+COC(=O)[C@]12CC=CC[C@]2(CC=CC1)C(=O)OC
+COC(=O)[C@]12OC[C@]34[C@@H](OC(=O)[C@H](OC(=O)/C=C(/C)\C(C)C)[C@H]24)C[C@@H]2C(=C(OC(=O)CC(=O)OC4=C(C)[C@H]5C[C@@H]6OC(=O)[C@H](OC(=O)/C=C(\C)/C(C)C)[C@@H]7[C@]8(OC[C@@]67[C@@H]([C@@H](O)[C@@H]8O)[C@@]5(C)CC4=O)C(=O)OC)C(=O)C[C@]2(C)[C@@H]3[C@@H](O)[C@@H]1O)C
+COC(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)NC(C)(C)CC(=O)O
+COC(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)OC(C)(C)C
+COC(=O)[C@]12[C@H](C)C=C3O[C@H]4O[C@@]5(CCCCC5)O[C@H]4[C@H]3[C@H]2C(=O)C=CC1=O
+COC(=O)[C@]12[C@H](COC(=O)C)C=C3O[C@H]4O[C@@]5(CCCCC5)O[C@H]4[C@H]3[C@H]2C(=O)C=CC1=O
+COC(=O)[C@]12[C@H]3O[C@H]([C@H]4O[C@@H]34)[C@]2(C(=O)OC)[C@@H]2O[C@H]1[C@@H]1O[C@H]21
+COC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)O
+COC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42I
+COC(=O)c1c(C(=O)OC)c2c3ccccc3n(C)c2c2n(C)c3ccccc3c12
+COC(=O)c1c[nH]n2c1n[n+]([O-])c1ccccc21
+COC(=O)c1cc(C(=O)OC)c(C/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/C(=O)Nc2cccc(c2)C(F)(F)F)nc1C/C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C(=O)Nc1cccc(c1)C(F)(F)F
+COC(=O)c1cc(C(=O)OC)c(C/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/C(=O)Nc2cccc(c2)C(F)(F)F)nc1C/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C(=O)Nc1cccc(c1)C(F)(F)F
+COC(=O)c1cc(C(=O)OC)c(CC(=O)C(=O)N[C@@H]2[C@@H]3C[C@H]4C[C@@H](C3)C[C@@H]2C4)nc1CC(=O)C(=O)N[C@H]1[C@@H]2C[C@H]3C[C@@H](C2)C[C@@H]1C3
+COC(=O)c1cc(cc(Cl)c1OC)C(=CC[C@]12C[C@@H]3C[C@@H](C[C@H](C3)C2)C1)c1cc(Cl)c(OC)c(c1)C(=O)OC
+COC(=O)c1ccc(cc1)[C@@H]1CC[C@H](CC1)OC(c1ccccc1)c1ccccc1
+COC(=O)c1ccc2c(NO[N+]2[O-])c1
+COC(=O)c1ccc2c(no[n+]2[O-])c1
+COC(=O)c1ccc2cc1nc1c(C#N)c[nH]c(=S)n21
+COC(=O)c1ccc2n[se]nc2c1
+COC(=O)c1cccc2[C@H]3CC[C@@H](c12)c1c(cccc31)C(=O)OC
+COC(=O)c1cccc2c3cccc(C(=O)OC)c3c12
+COC(=O)c1cn(c(=O)cc1C(=O)OC)c1ccc2nn(C)nc2c1
+COC(=O)c1cnn2c1n[n+]([O-])c1ccccc21
+COC(=O)c1n[nH]c(C)c1/N=N/N1CC[C@@H](CC1)C(=O)N
+COC(=O)c1nnn(n1)c1ccccc1
+COC(=S)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+COC(F)(F)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+COC(OC)CN(C(=O)C)[C@@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12
+COC(OC)CN(C(=O)c1ccccc1)[C@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12
+COC(OC)CNC(=O)c1ccc2c(NO[N+]2[O-])c1
+COC(OC)CNC(=O)c1ccc2c(no[n+]2[O-])c1
+COC1=CC(=C(C(=O)[C@@H]2[C@H](c3ccccc3)[C@H]([C@H]2c2ccccc2)C(=O)C2=C(O)C=C(OC)C(C)(C)C2=O)C(=O)C1(C)C)O
+COC1=c2ccccc2=c2ccccc2=c2ccccc2=N1
+COC1[CH]C(/N=N/C2[CH][CH][CH]C([CH]2)S(=O)(=O)O)[CH][CH]C1/N=N/C1[CH][CH]C(/C=C\C2[CH][CH]C([CH]C2S(=O)(=O)O)N2ON2C2[CH][CH]C(/C=C/C3[CH][CH]C(/N=N/C4[CH][CH]C(/N=N/C5[CH][CH][CH]C([CH]5)S(=O)(=O)O)[CH]C4OC)[CH]C3S(=O)(=O)O)C([CH]2)S(=O)(=O)O)C([CH]1)S(=O)(=O)O
+COCC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(cc1)N(C)C)[C@H](C(=O)C)C(=O)COC
+COCC(=O)[C@@H](C(=O)C)[C@@H](c1ccc2OCOc2c1)[C@H](C(=O)C)C(=O)COC
+COCC(=O)[C@@H](C(=O)C)[C@@H](c1ccncc1)[C@H](C(=O)C)C(=O)COC
+COCC(=O)[C@H](C(=O)C)[C@@H](c1ccc(OC)cc1)[C@@H](C(=O)C)C(=O)COC
+COCC(=O)[C@H](C(=O)C)[C@@H](c1ccccn1)[C@@H](C(=O)C)C(=O)COC
+COCCC[Ti]12345678(Cl)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81
+COCCN(C(=O)C)[C@@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12
+COCCN(C(=O)c1ccccc1)[C@@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12
+COCCN(CCOC)C(=O)c1ccc2c(NO[N+]2[O-])c1
+COCCN(CCOC)C(=O)c1ccc2c(no[n+]2[O-])c1
+COCCNC(=O)c1ccc2c(NO[N+]2[O-])c1
+COCCNC(=O)c1ccc2c(no[n+]2[O-])c1
+COCCN[C@@H]1CC[C@@]2(SCCS2)c2[nH]c3ccccc3c12
+COCCc1nnn(C)n1
+COC[C@H]1C(=O)c2cc3OCOc3cc2[C@@]21C=C[C@]1(OCCO1)C=C2
+COC[C@]1(COC)CCN(CC1)[C@H]1C[C@@H](O[C@@H](C)[C@H]1O)O[C@H]1C[C@@](O)(Cc2c1c(O)c1c(c2O)C(=O)c2cccc(OC)c2C1=O)C(=O)C
+CON1C(=O)[C@@]2(CCCCC2)C(=O)[C@]21CCCC=C2
+COP(=O)(OC)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+COP(OC)[C@@H]1CC[C@@H](C)CC1.COP(OC)[C@@H]1CC[C@@H](C)CC1
+COS(=O)(=O)O.CN(C)CCNC(=O)c1cccc2c(N[C@H](CCCNC(=N)N)C(=O)O)c3ccccc3n(C)c12
+COS(=O)(=O)O.NC(=N)NCCC[C@H](NC(=O)c1c2ccccc2n(C)c2ccccc12)C(=O)O
+COS(=O)(=O)O.NC(=N)NS(=O)(=O)c1ccc(cc1)NC(=O)c1c2ccccc2n(C)c2ccccc12
+COS(=O)(=O)O.O=C(Nc1ccc(cc1)S(=O)(=O)Nc1ccnn1c1ccccc1)c1c2ccccc2n(C)c2ccccc12
+COS(=O)(=O)O.O=C(Nc1ccc(cc1)S(=O)(=O)Nc1ncccn1)c1c2ccccc2n(C)c2ccccc12
+CO[C@@H](C)C[S@@](=O)(=O)C[C@@H](C)OC
+CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@@H](O)[C@@H](C)[C@@H](O)[C@H](C)[C@@H](OC(=O)C)[C@@H]1C)C)c(/C=N/N(C)[C@]15C[C@@H]6C[C@@H](C[C@@H](C6)C5)C1)c(O)c4c3C2=O
+CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@@H](O)[C@@H](C)[C@@H](O)[C@H](C)[C@@H](OC(=O)C)[C@@H]1C)C)c(/C=N/N(Cc1ccccc1)[C@]15C[C@@H]6C[C@@H](C[C@@H](C6)C5)C1)c(O)c4c3C2=O
+CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@H](O)[C@H](C)[C@H](O)[C@H](C)[C@H](OC(=O)C)[C@H]1C)C)c(/C=N/N1CC[C@H](CC1)N1CCCCC1)c(O)c4c3C2=O
+CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@H](O)[C@H](C)[C@H](O)[C@H](C)[C@H](OC(=O)C)[C@H]1C)C)c(CN1CC[C@H](C)CC1)c(O)c4c3C2=O
+CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@H](O)[C@H](C)[C@H](O)[C@H](C)[C@H](OC(=O)C)[C@H]1C)C)cc(N1CC[C@@H](C)CC1)c4c3C2=O
+CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@H](O)[C@H](C)[C@H](O)[C@H](C)[C@H](OC(=O)C)[C@H]1C)C)cc(OCC(=O)N1CC[C@](O)(CC1)Cc1ccccc1)c4c3C2=O
+CO[C@@H]1CCCC/C(=N\NC(=O)N)/CCCC1
+CO[C@@H]1CC[C@@H](CC1)/C(=C/[C@H]1CC[C@H](CC1)NC(=O)C)/C#N
+CO[C@@H]1CC[C@@H](CC1)/C=C(\C#N)/[C@@H]1CC[C@@H](OC)CC1
+CO[C@@H]1CC[C@@H](CC1)NC(=O)N(N=O)[C@H]1CC[C@H](OC)CC1
+CO[C@@H]1CC[C@@H](OC)[C@@H](C1)[C@]1(OC(=O)c2ccccc12)[C@@H]1C[C@H](OC)CC[C@H]1OC
+CO[C@@H]1CC[C@@H]2C[C@@]3(OCCO3)CC[C@]2(C)[C@@H]1O
+CO[C@@H]1CC[C@H](CC1)/C=C(\C#N)/[C@H]1CC[C@H](CC1)[N+](=O)[O-]
+CO[C@@H]1O[C@@H]2CO[C@@](C)(O[C@@H]2[C@@H](O)[C@H]1N[Pt@@](Cl)(Cl)N[C@H]1[C@H](OC)O[C@@H]2CO[C@](C)(O[C@@H]2[C@H]1O)c1ccccc1)c1ccccc1
+CO[C@@H]1[C@H](CN[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)O[C@@H]2OC(C)(C)O[C@H]12
+CO[C@@H]1[C@H](Cl)C[C@@H](C[C@H]1Cl)/C(=C/C1CCCCC1)/C(=O)O
+CO[C@@H]1[C@H]2O[C@@H](O[C@@H]2[C@@H](OC)[C@H]2[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12)c1ccccc1
+CO[C@@]1(OC)[C@@H]2C=C[C@H]1[C@H]1[C@@H]2[C@@H]2[C@H]1[C@@H]1C=C[C@H]2C1(OC)OC
+CO[C@@]1(OC)[C@]2(Cl)[C@H]3C(=O)[C@@H]4[C@@H]5C(=O)[C@H]3[C@@]1(Cl)[C@]5(Cl)[C@]24Cl
+CO[C@@]1(O[C@@]21CCN(C)CC2)c1ccc(C)cc1
+CO[C@@]1(c2ccccc2)c2cc3ccccc3cc2[C@@](OC)(c2ccccc2)c2cc3ccccc3cc12
+CO[C@H]1CCC[C@@]2(CN/C(=N)/NC2)C(=O)OC1
+CO[C@H]1CC[C@@H](CC1)/C(=C/[C@@H]1CC[C@@H](OC)[C@H](OC)C1)/C#N
+CO[C@H]1CC[C@@H](CC1)/C=C(\C#N)/[C@@H]1CC[C@H](C)CC1
+CO[C@H]1CC[C@@H](CC1)/C=C(\C#N)/[C@H]1CC[C@H](CC1)[N+](=O)[O-]
+CO[C@H]1CC[C@@H](CC1)[C@@H]1CCCC[C@@]1(O)CC(=O)OC
+CO[C@H]1CC[C@@H](CC1)[C@](O)(C(=O)O)C1CCCCC1
+CO[C@H]1CC[C@@]2(CC1)CN(O)[C@@]1(CC[C@@H](OC)C=C1)/C/2=N\O
+CO[C@H]1CC[C@H](CC1)/C(=C/[C@H]1CC[C@@H](CC1)N(C)C)/C#N
+CO[C@H]1C[C@@H](O)O[C@H]1[C@H](NC(=O)C)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CO[C@H]1[C@@H](OC)[C@H](OC)[C@H](OC)[C@@H](OC)[C@H]1OC
+CO[C@]1(N/C(=N)/N[C@@]1(OC)c1ccccc1)c1ccccc1
+CO[C@]1(OC)[C@@]2(Cl)C3=CCCC=C3[C@]1(Cl)C(=C2Cl)Cl
+CO[C@]1(OC)[C@@]2(Cl)[C@@H]3C=CC=C[C@H]3[C@]1(Cl)C(=C2Cl)Cl
+CO[C@]1(OC)[C@@]2(Cl)[C@H]3COC[C@@H]3[C@]1(Cl)C(=C2Cl)Cl
+CO[C@]1(OC)[C@@]2(Cl)[C@H]3[C@@H]4[C@@]5(OC(=O)C)[C@@H]6[C@H]([C@]3(OC(=O)C)C5=O)[C@@]2(Cl)[C@]6(Cl)[C@]14Cl
+CO[C@]1(OC)[C@]2(Cl)[C@@H]3CCCC[C@@H]3[C@@]1(Cl)C(=C2Cl)Cl
+CO[C@]1(O[C@]21CCCC2)c1ccc(Cl)cc1
+CO[Ni]12(OC)([O+]=C(C)[C@@H](Cl)C(=[O+]1)C)[O+]=C(C)[C@@H](Cl)C(=[O+]2)C
+COc1c(N2CCCCC2)c2c(=O)c3ccccc3oc2c2c3ccccc3n(C)c12
+COc1c(OC)cc(/C=C/2\N3CC[C@H](CC3)C2=O)cc1OC
+COc1c(OC)cc(C[C@@H]2N3CC[C@H](CC3)[C@@H]2O)cc1OC
+COc1c(OC)cc(cc1OC)C(=O)N1C[C@H]2CC[C@H](CC2)C1
+COc1c(OC)cc(cc1OC)[C@H]1CC(=O)C[C@@H](c2cc(OC)c(OC)c(OC)c2)[C@]21C(=O)c1ccccc1C2=O
+COc1c(OC)cc2CCN(C(=O)C)[C@H]3C[C@]4(C=CC(=O)C=C4)c1c23
+COc1c(OC)cc2CCN[C@H]3C[C@]4(C=CC(=O)C=C4)c1c23
+COc1c(cccc1OC)/C=C/1\COC/C(=C/c2cccc(OC)c2OC)/C1=O
+COc1cc(/C=N/N=C\c2ccc(OC)c(OC)c2)ccc1OC
+COc1cc(/C=N/c2ccc(cc2)c2csc(n2)c2ccc(Cl)cc2)ccc1N1CC[C@@]2(CCCCC2)CC1
+COc1cc(/C=N\NC(=S)N[C@H]2CN3CC[C@@H]2CC3)ccc1OC
+COc1cc(Br)c2nsnc2c1
+COc1cc(N[C@H](C)CCCN[C@@H]2CN3CC[C@H]2CC3)c2ncccc2c1.OS(=O)(=O)c1cccc2c1cccc2S(=O)(=O)O
+COc1cc(O)c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(OC)c1
+COc1cc(O)c2c(=O)cc(oc2c1)[C@]1(C=C[C@H](C=C1)O[C@@H]1O[C@@H](CO)[C@H](O)[C@H](O)[C@@H]1O)OC(=O)C
+COc1cc(OC)c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(OC)c1
+COc1cc(OC)c2ssc3c(OC)cc(OC)c4ssc1c2c34
+COc1cc(OC)cc(c1)C[N@@+]12CC[N@+](CC1)(Cc1cc(OC)cc(OC)c1)C2
+COc1cc(cc(OC)c1OC)[C@H]1N2CCCN1CC2
+COc1cc(cc(OC)c1OC)[C@H]1[C@H](C(=O)OC/C=C/c2ccc3OCOc3c2)[C@@H](c2cc(OC)c(OC)c(OC)c2)[C@H]1C(=O)OC/C=C/c1ccc2OCOc2c1
+COc1cc(ccc1O)C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1cc(ccc1O)C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1cc(ccc1O)[C@@H]1OC[C@]2(CO)CO[C@@H](c3ccc(O)c(OC)c3)N12
+COc1cc(ccc1O)[C@@H]1SCCCCCCCCCCS[C@H](SCCCCCCCCCCS1)c1ccc(O)c(OC)c1
+COc1cc(ccc1O)[C@H](/N=C/c1ccc(O)c(OC)c1)/N=C/c1ccc(O)c(OC)c1
+COc1cc(ccc1OC)/C=C/C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1cc(ccc1OC)/C=C/C(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1cc(ccc1OC)/C=C\1/C(=O)OC(=O)/C1=C\c1ccc(OC)c(OC)c1
+COc1cc(ccc1OC)C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1cc(ccc1OC)C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1cc(ccc1OC)Nc1c2ccccc2n2c(c1C#N)n(C)c1ccccc21.Cc1ccc(cc1)S(=O)(=O)O
+COc1cc(ccc1OC)[C@@H]1OC[C@@]2(CO)CO[C@@H](c3ccc(OC)c(OC)c3)N12
+COc1cc(ccc1OC)[C@]1(CCC2(C=C)OC[C@](C)(C)CO2)CN(=O)O[C@@H](O[C@H]2CCCC[C@H]2C(C)(C)c2ccccc2)C1
+COc1cc(ccc1OC)[C@]12CCN([C@@H]2[C@@H](CO)C2(OC[C@](C)(C)CO2)CC1)S(=O)(=O)c1ccc(C)cc1
+COc1cc2c(CN3Cc4cc(O)c(OC)cc4[C@H]2C3)cc1O
+COc1cc2c(c3c1c(=O)c1ccccc1n3C)c(=O)c1ccccc1n2C
+COc1cc2c(cc[n+]3cc4c(ccc5ccccc45)cc23)cc1OC
+COc1cc2c(oc(=O)c3c2c(OC)cc2cc(oc32)[Si](C)(C)C)c2cccc(OCc3ccccc3)c12
+COc1cc2c(oc(=O)c3c2c(OC)cc2ccoc32)c2cccc(O)c12
+COc1cc2c(oc(=O)c3c2c(OC)cc2ccoc32)c2cccc(OCc3ccccc3)c12
+COc1cc2cc(ccc2cc1OC)/C(=N\N=C(/C)\c1ccc2cc(OC)c(OC)cc2c1)/C
+COc1ccc(/C=N/N/C(=N)/N/N=C\c2ccc(OC)cc2)cc1
+COc1ccc(/C=N/N2CN(B(NC2=N)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)[C@@H](C)C(=O)O)cc1OC
+COc1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1OC
+COc1ccc(Cl)cc1N1C(=O)[C@H]2[C@@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl
+COc1ccc(NC(=O)C)c2c1[nH]c1c(c(=O)c3[nH]c4c(OC)ccc(NC(=O)C)c4c(=O)c3c1=O)c2=O
+COc1ccc(OC)c2c(cc(nc12)c1ccc(Cl)cc1)[C@@H](O)CN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+COc1ccc(c(OC)c1)N1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+COc1ccc(c(OC)c1)[C@H]1CC(=O)C[C@@H](c2ccc(OC)cc2OC)[C@]21C(=O)c1ccccc1C2=O
+COc1ccc(cc1)/C=C/C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1ccc(cc1)/C=C/C(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1ccc(cc1)/C=N/N(C)CN(C)/N=C\c1ccc(OC)cc1
+COc1ccc(cc1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+COc1ccc(cc1)/C=c/1\sc2=NN[C@@]3(CC[C@H](C)CC3)Nn2c1=O
+COc1ccc(cc1)/C=c/1\sc2nnc(CCC(=O)Nc3cccc(c3)C(F)(F)F)n2c1=O
+COc1ccc(cc1)/C=c\1/sc2nc(nn2c1=O)c1ccccc1
+COc1ccc(cc1)C#C[C@]1(O)c2ccccc2[C@](O)(C#Cc2ccc(OC)cc2)c2ccccc12
+COc1ccc(cc1)C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1ccc(cc1)C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1ccc(cc1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1
+COc1ccc(cc1)CC[C@@]1(C)OC[C@@](C)(CC)CO1
+COc1ccc(cc1)CN[C@H](C)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+COc1ccc(cc1)Cc1nnc2nc(OC)c(c3ccc(OC)cc3)n2n1
+COc1ccc(cc1)NC(=O)N1C[C@H]2CCN1CC2
+COc1ccc(cc1)P1(=[S+][Ni]2(S1)(SP(=[S+]2)(c1ccc(OC)cc1)c1ccc(OC)cc1)(N1CC[C@@H](C)CC1)N1CC[C@H](C)CC1)c1ccc(OC)cc1
+COc1ccc(cc1)S(=O)(=O)NC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+COc1ccc(cc1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)c1ccccc1O
+COc1ccc(cc1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)c1ccccc1O
+COc1ccc(cc1)[C@@H](C#N)N1CCCN([C@H](C#N)c2ccc(OC)cc2)[C@@H]1c1cccc(OC)c1O
+COc1ccc(cc1)[C@@H](C#N)N1CCCN([C@H](C#N)c2ccc(OC)cc2)[C@H]1c1ccccc1OC
+COc1ccc(cc1)[C@@H]1C2=C(C[C@@H](CC2=O)c2ccccc2)NC2=C1C(=O)C[C@H](C2)c1ccccc1
+COc1ccc(cc1)[C@@H]1CC(=O)C[C@@H](c2ccc(OC)cc2)[C@@]21C(=O)c1ccccc1C2=O
+COc1ccc(cc1)[C@@]12c3ccc(OC)cc3C[C@@]2(Cc2cc(OC)ccc12)c1ccc(cc1)[N+](=O)[O-]
+COc1ccc(cc1)[C@@]12c3ccccc3[C@H]2c2ccccc12
+COc1ccc(cc1)[C@H](/N=C/c1ccc(OC)cc1)/N=C/c1ccc(OC)cc1
+COc1ccc(cc1)[C@H](OC/C=C(/C)\CCC=C(C)C)OC/C=C(/C)\CCC=C(C)C
+COc1ccc(cc1)[C@H](OC[C@@H]1C[C@H]2CC[C@@H]1C2)OC[C@@H]1C[C@H]2CC[C@@H]1C2
+COc1ccc(cc1)[C@H](OC[C@H]1C[C@@H]2C=C[C@H]1C2)OC[C@H]1C[C@@H]2C=C[C@H]1C2
+COc1ccc(cc1)[C@H]1CC(=O)C[C@@H](c2ccc(OC)cc2)[C@@]21C(=O)NC(=O)NC2=O
+COc1ccc(cc1)[C@H]1CC(=O)C[C@@H](c2ccc(OC)cc2)[C@@]21C(=O)NC(=S)NC2=O
+COc1ccc(cc1)[C@H]1CC(=O)C[C@H](c2ccc(OC)cc2)[C@]21C(=O)CCCC2=O
+COc1ccc(cc1)[C@H]1OC[C@@](C)(CC)CO1
+COc1ccc(cc1)[C@H]1O[C@H](C)[C@@H](C)O1
+COc1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+COc1ccc(cc1)[C@]1(Cl)[C@@](Cl)(C(F)(F)F)[C@]1(Cl)C(F)(F)F
+COc1ccc(cc1)[C@]12c3ccc(OC)cc3C[C@]2(Cc2cc(OC)ccc12)c1ccc(cc1)[N+](=O)[O-]
+COc1ccc(cc1)[NH+]1CCN(CC1)C[C@@H](O)COCC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+COc1ccc(cc1)c1nnn(n1)/C(=N/O)/c1c(C)cc(OC)cc1C
+COc1ccc(cc1/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1)c1csc(Cc2ccccc2)n1
+COc1ccc(cc1OC)[C@@H](/N=C/c1ccc(OC)c(OC)c1)/N=C/c1ccc(OC)c(OC)c1
+COc1ccc(cc1OC)[C@@H]1[C@@H]2C(=O)NC(=O)[C@H]1C(=O)NC2=O
+COc1ccc2C[C@H]3N(C)CC[C@@]4(C[C@@]5(OCCO5)CC[C@H]34)c2c1Oc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]
+COc1ccc2C[C@H]3N(C)CC[C@@]4(C[C@]5(OCCO5)CC[C@H]34)c2c1Oc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]
+COc1ccc2O[C@@H](CN3CC[C@]4(CC3)C(=O)NCN4c3ccccc3)Cc2c1
+COc1ccc2[N+]([O-])ONc2c1
+COc1ccc2[nH]c3c(C)c4ccn5c(cc6ccccc6c5=O)c4c(C)c3c2c1
+COc1ccc2[nH]c3c(C)c4ccnc(NCCCN(C)CCCNc5ccc6nnn7c8ccccc8c(=O)c5c67)c4c(C)c3c2c1.CS(=O)(=O)O
+COc1ccc2[nH]c3cc4c(cc3c(=O)c2c1)[nH]c1ccc(OC)cc1c4=O
+COc1ccc2[nH]cc(C(=O)C(=O)N[C@@]34C[C@H]5C[C@H](C[C@H](C5)C4)C3)c2c1
+COc1ccc2c(CCC3=C2CC[C@H]2[C@@H]3C(=O)CC[C@]32OCCCO3)c1
+COc1ccc2c(c1)[n+]([O-])c(C(=O)C/C(=N/OCCCc1ccccc1)/C(=O)NC13C[C@@H]4C[C@@H](C[C@@H](C4)C3)C1)c(C)[n+]2[O-]
+COc1ccc2c(c1)[n+]([O-])c(C(=O)C/C(=N/OCCCc1ccccc1)/C(=O)N[C@]13C[C@@H]4C[C@@H](C[C@@H](C4)C3)C1)c(C)[n+]2[O-]
+COc1ccc2c(c1)c(=O)c1c(NCCN(C)C)ccc3nnn2c13
+COc1ccc2c(c1)nc1c(c3cccc4ccc(OC)c1c34)/n/2=N\C(=O)CBr
+COc1ccc2c(no[n+]2[O-])c1
+COc1ccc2n[se]nc2c1
+COc1ccc2nc(O)cc(/C=C/3\N4CC[C@H](CC4)C3=O)c2c1
+COc1ccc2nc3C(=O)c4cccnc4c4nccc(c34)c2c1
+COc1ccc2nc3cc(Cl)ccc3c(NCCCN3CCN(CCCNc4ccc5nnn6c7ccccc7c(=O)c4c56)CC3)c2c1.CS(=O)(=O)O
+COc1ccc2nccc(/C=C\3/N4CC[C@@H](CC4)[C@@H]3OC(=O)c3ccc(cc3)[N+](=O)[O-])c2c1
+COc1ccc2nccc(/C=C\3/N4CC[C@H](CC4)[C@@H]3OC(=O)c3ccc(cc3)[N+](=O)[O-])c2c1
+COc1ccc2nccc([C@H](O)[C@@H]3C[C@@H]4CCN3C[C@@H]4C=C)c2c1.OC(=O)[C@@H]1C[C@H]2CC[C@@H]1CC2
+COc1ccc2nonc2c1
+COc1cccc(/C=N/NC(=O)[C@@H]2CCN(CC2)C(=S)N[C@@H]2C[C@@H]3C=C[C@H]2C3)c1O
+COc1cccc(/C=N/NC(=S)N[C@@H]2CN3CC[C@@H]2CC3)c1OC
+COc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+COc1cccc(CCNc2c3cccnc3n3c(c2C#N)n(C)c2ccccc32)c1.Cc1ccc(cc1)S(=O)(=O)O
+COc1cccc([C@@H](/N=C/c2cccc(OC)c2O)/N=C/c2cccc(OC)c2O)c1O
+COc1cccc(c1)C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1cccc(c1)C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+COc1cccc(c1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+COc1cccc(c1)NC(=O)CC(=O)N1N=C(C)[C@@H](/N=N/c2ccc(cc2)[S@@](=O)(=O)c2ccc(/N=N/[C@@H]3C(=NN(C(=O)CC(=O)Nc4cccc(OC)c4)C3=O)C)cc2)C1=O
+COc1cccc(c1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+COc1cccc(c1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)c1ccccc1O
+COc1cccc(c1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+COc1cccc(c1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)c1ccccc1O
+COc1cccc(c1)[C@@H]1C[C@@H]([NH2+]CC2CC2)C1
+COc1cccc(c1)[C@@H]1C[C@]21C(=O)NC(=O)NC2=O
+COc1cccc(c1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+COc1cccc(c1)[C@@H]1[C@H](C#N)C(=O)NC(=O)[C@H]1C#N
+COc1cccc(c1)[C@@]1(O)CCCC[C@H]1[N@@H+]1CC[C@@]2(CC1)C(=O)NC[C@H]2c1ccccc1
+COc1cccc2C(=O)c3c(O)c4C[C@](O)(C[C@H](O[C@H]5C[C@H](N)[C@H](O)[C@H](C)O5)c4c(O)c3C(=O)c12)C1(C)OC[C@](C)(C)CO1
+COc1ccccc1/C=N/N/C(=N)/N/N=C\c1ccccc1OC
+COc1ccccc1/C=N/N/C(=N/N=C/c1ccccc1OC)/N/N=C/c1ccccc1OC
+COc1ccccc1/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+COc1ccccc1/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+COc1ccccc1N/C(=C/C(=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/c1ccccc1
+COc1ccccc1N1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+COc1ccccc1N1C(=O)[C@H]2[C@@H]3c4ccccc4[C@](OC(=O)C)([C@H]2C1=O)c1ccccc31
+COc1ccccc1NC(=O)OC[C@@]12COCN2COC1
+COc1ccccc1NC(=O)[C@@H](C(=O)C)[C@@H](c1cccc(c1)[N+](=O)[O-])[C@H](C(=O)C)C(=O)Nc1ccccc1OC
+COc1ccccc1NC(=O)[C@@H](C(=O)C)[C@H](c1cccc(c1)[N+](=O)[O-])[C@H](C(=O)C)C(=O)Nc1ccccc1OC
+COc1ccccc1[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+COc1ccccc1[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+COc1ccccc1[C@@H](C#N)N1CCCN([C@@H]1c1ccccc1)[C@H](C#N)c1ccccc1OC
+COc1ccccc1[C@@H](C#N)N1CCCN([C@H](C#N)c2ccccc2OC)[C@@H]1c1cccc(OC)c1O
+COc1ccccc1[C@@H]1CC(=O)C[C@@H](c2ccccc2OC)[C@@]21C(=O)NC(=S)NC2=O
+COc1ccccc1[C@@H]1O[C@@H](C)[C@H](C)O1
+COc1ccccc1[C@@H]1O[C@H](C[C@]2(CC(=C)C(=O)O2)C1)c1ccccc1OC
+COc1ccccc1[C@@]12c3ccccc3[C@@]2(O)c2ccccc12
+COc1ccccc1[C@H](C(=O)N[C@@H]1CN2CC[C@H]1CC2)c1ccsc1
+COc1ccnc2c1C(=O)c1nc3ccccc3c3ccnc2c13
+COc1nc2cc3c(oc4ccccc34)cc2n2cccc12
+CP(=S)(C)[C@@H]1CC[C@H](CC1)C(C)(C)C.CC(C)(C)[C@@H]1CC[C@H](CC1)P(=S)(C)C
+CP1CC[C@](O)(CC1)C(C)(C)C.CP1CC[C@](O)(CC1)C(C)(C)C
+CS(=O)(=O)N[C@]12CC[C@H](c3ccccc13)c1ccccc21
+CS(=O)(=O)OCCN1CC[C@@]2(CC1)SS[C@]1(CCN(CCOS(=O)(=O)C)CC1)S2
+CS(=O)(=O)OC[C@@H]1O[C@H](O[C@H]1COS(=O)(=O)C)C(Cl)(Cl)Cl
+CS(=O)(=O)OC[C@H]1CCCCCCCCCC[C@]21SCCCS2
+CS(=O)(=O)OC[C@H]1C[C@@H](COS(=O)(=O)C)C[C@@H](COS(=O)(=O)C)C1
+CS(=O)(=O)OC[C@H]1O[C@@H](Cc2ccccc2)O[C@@H]1COS(=O)(=O)C
+CS(=O)(=O)OC[C@H]1O[C@@H](O[C@@H]1COS(=O)(=O)C)C(Br)(Br)Br
+CS(=O)(=O)OC[C@H]1[C@H]2c3ccccc3[C@@H]([C@H]1COS(=O)(=O)C)c1ccccc21
+CS(=O)(=O)O[C@@H]1CC[C@H](CC1)OS(=O)(=O)C.CS(=O)(=O)O[C@H]1CC[C@@H](CC1)OS(=O)(=O)C
+CS(=O)(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+CS(=O)(=O)c1ccc(cc1)C[N@@+]12CN3CN(CN(C3)C2)C1
+CS(=O)(=O)c1ccc2nnnn2n1
+CSC(=S)C[C@H](O)[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+CSC(=S)S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+CSC[C@H]1CCCC[C@@]21OCCO2
+CSC[C@]12CCCC=C2C[C@@]2(OCCO2)CC1
+CS[C@H]1NN[C@]2(C(=O)N1)c1ccccc1c1ccccc21
+CSc1c2cccnc2n2c(c1C#N)n(C)c1ccccc21.Cc1ccc(cc1)S(=O)(=O)O
+CSc1cc2c3cccc[n+]3[Co+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51.[O-][Cl](=O)(=O)=O
+CSc1cc2c3cccc[n+]3[Co+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24.[O-][Cl](=O)(=O)=O
+CSc1cc2c3cccc[n+]3[Cu+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51.[O-][Cl](=O)(=O)=O
+CSc1cc2c3cccc[n+]3[Cu+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24.[O-][Cl](=O)(=O)=O
+CSc1cc2c3cccc[n+]3[Cu]3(Br)(Br)[n+]2c(c1)c1cccc[n+]31
+CSc1cc2c3cccc[n+]3[Mn+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51.[O-][Cl](=O)(=O)=O
+CSc1cc2c3cccc[n+]3[Mn+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24.[O-][Cl](=O)(=O)=O
+CSc1cc2c3cccc[n+]3[Ni+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51.[O-][Cl](=O)(=O)=O
+CSc1cc2c3cccc[n+]3[Ni+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24.[O-][Cl](=O)(=O)=O
+CSc1cc2c3cccc[n+]3[Zn+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51.[O-][Cl](=O)(=O)=O
+CSc1cc2c3cccc[n+]3[Zn+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24.[O-][Cl](=O)(=O)=O
+CSc1ccc(cc1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+CSc1cnn(CCC#N)c(=O)n1
+CSc1nc2=NC=N[S@@](=O)(=c2c(N)n1)O
+CSc1nc2cn[nH]c2c(n1)N(C)C
+CSc1nnn(n1)C(C)(C)C
+CSc1sc(C#N)c2nc3c4cccc5cccc(c3nc12)c45
+C[C-]1C(=[O+][Ru+3]23([O+]=C1C)([O+]=C(C)[C-](C)C(=[O+]2)C)[O+]=C(C)[C-](C)C(=[O+]3)C)C
+C[C@@H](CC[C@@H](CCCC[C@@H](CC[C@H](C)CC(C)(C)C)CC[C@H](C)CC(C)(C)C)CC[C@@H](C)CC(C)(C)C)CC(C)(C)C
+C[C@@H](CN1C[C@@H]2CC[C@@H](CC2)C1)C(=O)c1cccs1
+C[C@@H](CNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+C[C@@H](NCc1ccccc1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+C[C@@H](N[C@H](C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)N)c1ccccc1
+C[C@@H](O)C1=C[C@@]2(C=C[C@H]3[C@@H](C=C[C@@H]23)C2OC[C@](C)(C)CO2)OC1=O.C[C@@H](O)C1=C[C@@]2(C=C[C@H]3[C@@H](C=C[C@@H]23)C2OC[C@@](C)(C)CO2)OC1=O
+C[C@@H](O)[C@@H](O)[C@@H](O)c1cnn(n1)c1ccccc1
+C[C@@H](c1ccccc1)[C@]12C3=C4C5=C1[Hf]16782345(Cl)(Cl)[C@@H]2C7=C6C1=C82
+C[C@@H](c1ccccc1)[C@]12C3=C4C5=C1[Zr]16782345(Cl)(Cl)[C@@H]2C7=C6C1=C82
+C[C@@H]1C(=O)C(c2ccccc2)(c2ccccc2)[C@@H](C)C[N@@+]21CCCCCC2
+C[C@@H]1CC(C)(C)N[C@@]2(CCCC2)N1
+C[C@@H]1CC/C(=C\2/C(=O)N=C3S[Cu@]4(SC5=NC(=O)/C(=C/6\CC[C@@H](C)CC6)/[S+]45)[S+]23)/CC1
+C[C@@H]1CC/C(=N/Nc2ccc(cc2)[N+](=O)[O-])/CC1
+C[C@@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+C[C@@H]1CC/C(=N\NS(=O)(=O)c2ccc(cc2)[N+](=O)[O-])/CC1
+C[C@@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+C[C@@H]1CCCCC[N@+]21CCCC2
+C[C@@H]1CCCCC[N@+]21CC[N@@+]1(CCCCC[C@@H]1C)CC2
+C[C@@H]1CCCC[C@@]21OCCO2
+C[C@@H]1CCC[N@+]2(CCCC2)C1
+C[C@@H]1CCN(CC1)C(=S)N/N=C(\C)/c1cccc[n+]1[O-]
+C[C@@H]1CCO[C@]2(CCCC2)O1
+C[C@@H]1CC[C@@H](CC1)C(=O)[C@H]1CCCC[C@H]1CC1CCCCC1
+C[C@@H]1CC[C@@H](CC1)OS(=O)(=O)c1ccc(C)cc1
+C[C@@H]1CC[C@@H](NCCOC(=O)c2ccc(cc2)[N+](=O)[O-])CC1
+C[C@@H]1CC[C@@]2(CC1)CC(=O)N(N1CCCCC1)C2=O
+C[C@@H]1CC[C@H](CC1)C(C)(C)OCCN(C)C.OC(=O)CC(O)(CC(=O)O)C(=O)O
+C[C@@H]1CC[C@H](CC1)NC(=O)C.C[C@H]1CC[C@@H](CC1)NC(=O)C
+C[C@@H]1CC[C@H](CC1)NC(=O)[C@]1(C)Cn2c3ccccc3nc2C(=O)N1Cc1ccccc1Cl
+C[C@@H]1CC[C@H](CC1)O[C@H](C[N+](=O)[O-])C(Cl)(Cl)Cl
+C[C@@H]1CC[C@H](CC1)Oc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]
+C[C@@H]1CC[C@H](CC1)[C@@](O)(C(=O)O)[C@@H]1CC[C@@H](C)CC1
+C[C@@H]1CC[C@H](CC1)c1cc(c2ccccc2)n(n1)c1ccccc1
+C[C@@H]1CC[C@]2(CC1)N=C1CC[C@@H](C)C[C@H]1[C@]1(CC[C@@H](C)CC1)N2
+C[C@@H]1CN1P(=[O+][Cu@+2]([O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)([O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)[O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C.F[B-](F)(F)F
+C[C@@H]1CN1P(=[O+][Cu@@+2]([O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)([O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)[O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C.F[B-](F)(F)F
+C[C@@H]1CN2C[C@H](C)O[Si@](CCCCCC[Si@]34O[C@H](C)CN(C[C@H](C)O3)C[C@H](C)O4)(O1)O[C@@H](C)C2
+C[C@@H]1CN2C[C@H](C)O[Si@](CC[Si@]34O[C@H](C)CN(C[C@H](C)O3)C[C@H](C)O4)(O1)O[C@@H](C)C2
+C[C@@H]1CN=C(N1)c1ccc(cc1)NC(=O)[C@@H]1CC[C@@H](CC1)C(=O)Nc1ccc(cc1)C1=N[C@H](C)CN1
+C[C@@H]1CN[Pt@]2(N1)OC(=O)C(=O)O2
+C[C@@H]1COC2=[N+]1[Pd@+]([CH2-])(Cl)[N+]1=C(OC[C@@H]1C)C2(C)C
+C[C@@H]1COC2=[N+]1[Pd@+]([CH2-])(Cl)[N+]1=C(OC[C@@H]1C)[C@]2(C)C
+C[C@@H]1C[As+](C[C@H](C)N1C)(c1ccccc1)c1ccccc1.[O-][Cl](=O)(=O)=O
+C[C@@H]1C[As@@+](C[C@H](C)N1C)(c1ccccc1)c1ccccc1.[O-][Cl](=O)(=O)=O
+C[C@@H]1C[C@H](C)N[Pt@]2(N1)OC(=O)C(=O)O2
+C[C@@H]1NC(=S)N(c2ccc(cc2)[S@@](=O)(=O)c2ccc(cc2)N2C(=S)N[C@H](C)C2=O)C1=O
+C[C@@H]1OC(=O)[C@@H](c2ccccc2)[C@]2(CCCC2)O1
+C[C@@H]1O[C@@H](CCc2ccccc2)O[C@H]1C
+C[C@@H]1O[C@@H](O[C@H]1C)c1c(Cl)cccc1[N+](=O)[O-]
+C[C@@H]1O[C@@H](O[C@H]1C)c1ccc(Cl)c(Cl)c1
+C[C@@H]1O[C@@H](O[C@H]1C)c1ccco1
+C[C@@H]1O[C@@H](c2cnn(n2)c2ccccc2)[C@@H](O)[C@H]1O
+C[C@@H]1O[C@H](O[C@H]1C)[C@H]1CCC=CC1
+C[C@@H]1O[C@H](O[C@H]1C)c1c(Cl)cccc1[N+](=O)[O-]
+C[C@@H]1O[C@H](O[C@H]1C)c1ccc(cc1)C(C)C
+C[C@@H]1O[C@H](O[C@H]1C)c1ccccc1Cl
+C[C@@H]1O[C@](C)(Cc2ccccc2)O[C@H]1C
+C[C@@H]1O[C@](C)(O[C@H]1C)c1ccc(Cl)c(O)c1
+C[C@@H]1O[C@](C)(O[C@H]1C)c1ccc2ccccc2c1
+C[C@@H]1O[C@](C)(O[C@H]1C)c1ccccc1
+C[C@@H]1O[C@]2(OCCO2)C[C@H](OCc2ccccc2)[C@H]1OCc1ccccc1
+C[C@@H]1S[C@@H](C)[C@]23C4=C5C6=C2[Fe]27893456C3=C8[C@]19C7=C23
+C[C@@H]1[C@@H](C)[C@]1(F)c1ccccc1.C[C@@H]1[C@@H](C)[C@@]1(F)c1ccccc1
+C[C@@H]1[C@@]2(CCCCC2)[N@+]21CCCC2.F[B-](F)(F)F
+C[C@@H]1[C@H](C)[C@@H]2c3ccccc3[C@H]1c1ccccc21
+C[C@@H]1[C@]2(C=CC=C2)C1(C)C
+C[C@@H]1[C@]2(CCCCC2)[N@@+]21CCCC2.F[B-](F)(F)F
+C[C@@]1(C)/C(=N\C2CCCCC2)/[C@@](C)(C)/C/1=N/C1CCCCC1
+C[C@@]1(C)/C(=N\c2ccccc2)/[C@@](C)(C)/C/1=N/c1ccccc1
+C[C@@]1(C)COC2(OC1)[C@H]1CC[C@]3(CS(=O)(=O)N=C23)C1(C)C
+C[C@@]1(C)O[C@@H](CP(=O)(c2ccccc2)c2ccccc2)[C@@H](O1)CP(=O)(c1ccccc1)c1ccccc1
+C[C@@]1(C)O[C@H](CP(c2cccc3ccccc23)c2cccc3ccccc23)[C@H](CP(c2cccc3ccccc23)c2cccc3ccccc23)O1
+C[C@@]1(C)[C@@](O)(c2ccccc2)c2ccccc2[C@@]1(O)c1ccccc1
+C[C@@]1(Cl)[C@H]2c3ccccc3[C@H](c3ccccc23)[C@]1(C)Cl
+C[C@@]1(O)c2cccc3c2C2(O)c4c1cccc4[C@](C)(O)c1cccc(c21)[C@]3(C)O
+C[C@@]12CC[C@@]3(OCCO3)C[C@@H]1CC[C@H]1O[C@@H]21
+C[C@@]12C[C@@](C)(C[C@@](C)(C1)C(=O)NCCN(CCNC(=O)[C@]1(C)C[C@]3(C)C[C@](C)(C1)C(=O)NC3=O)CCNC(=O)[C@@]1(C)C[C@]3(C)C[C@](C)(C1)C(=O)NC3=O)C(=O)NC2=O
+C[C@@]12C[C@@]2(C)[C@@]1(C)C
+C[C@@]12C[C@@]3(C)C[C@@](C)(C1)CC(Br)(C2)C3
+C[C@@]12[C@@H]([C@@H]3c4ccccc4[C@H]1c1ccccc31)[C@@H]1c3ccccc3[C@H]2c2ccccc12
+C[C@H](CC[C@@H](CC[C@H](C)CC(C)(C)C)CC[C@H](C)CC(C)(C)C)CC(C)(C)C
+C[C@H](CC[Si@](F)(CC[C@H](C)CC(C)(C)C)CC[C@H](C)CC(C)(C)C)CC(C)(C)C
+C[C@H](Cc1ccccc1)N[Pt@](Cl)(Cl)N[C@H](C)Cc1ccccc1
+C[C@H](N)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+C[C@H](N)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+C[C@H](O)C[C@@H]1CCCC[C@@]21OCCO2
+C[C@H](O)C[N@+]12CC[N@@+](CC1)(C[C@H](C)O)[Pt@@]2(I)I
+C[C@H](O)C[N@@+]12CC[N@+](CC1)(C[C@H](C)O)[Pt@]2(Cl)Cl
+C[C@H](O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+C[C@H](O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+C[C@H](OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)[C@@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1
+C[C@H](OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1
+C[C@H](S[C@@H](C)C(=O)N/N=C(/C)\c1ccc(cc1)OS(=O)(=O)C)C(=O)N/N=C(\C)/c1ccc(cc1)OS(=O)(=O)C
+C[C@H](S[C@@H](C)C(=O)N/N=C\c1ccccc1F)C(=O)N/N=C/c1ccccc1F
+C[C@H]([C@H]1CCC[C@H]2CCCC[C@H]12)[C@H]1CCC[C@H]2CCCC[C@H]12
+C[C@H]([C@H]1CC[C@H]2CC[C@H]3CCC[C@H]1[C@@H]23)[C@H]1CC[C@H]2CC[C@H]3CCC[C@H]1[C@@H]23
+C[C@H]1C/C(=C\c2ccc(O)c(O)c2)/C(=O)/C(=C/c2ccc(O)c(O)c2)/C1
+C[C@H]1C/C(=C\c2ccc(cc2)OC(=O)C(C)(C)C)/C(=O)/C(=C/c2ccc(cc2)OC(=O)C(C)(C)C)/C1
+C[C@H]1CC(C)(C)O[C@]2(CCCC2)O1
+C[C@H]1CC/C(=N/NS(=O)(=O)c2ccc(cc2)NC(=O)C)/CC1
+C[C@H]1CC/C(=N/NS(=O)(=O)c2ccc(cc2)[N+](=O)[O-])/CC1
+C[C@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+C[C@H]1CC/C(=N\Nc2ccc(cc2)[N+](=O)[O-])/CC1
+C[C@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+C[C@H]1CC=CC[C@H]1[C@H](OC[C@@H]1CC=CC[C@@H]1C)OC[C@@H]1CC=CC[C@@H]1C
+C[C@H]1CCCCCCCCCC[C@]21OCCO2
+C[C@H]1CCCCN1/C=C/1\C(=O)O[C@@](C)(C)OC1=O
+C[C@H]1CCCC[C@H]1[C@@](O)(C(=O)O)[C@@H]1CCCC[C@@H]1C
+C[C@H]1CCCC[N@+]21CCCC2
+C[C@H]1CCC[NH+](CCNC(=O)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)C1
+C[C@H]1CCN(CC1)/N=N/c1nc2c([nH]1)n(C)c(=O)n(C)c2=O
+C[C@H]1CCN(CC1)C(=S)N/N=C(\C)/c1cccc[n+]1[O-]
+C[C@H]1CCN(CC1)C(=S)N/N=C(\C)/c1nccnc1C
+C[C@H]1CCN(CC1)S(=O)(=O)c1cc(cc(C)c1C)C(=O)OCC(=O)N[C@H](C)c1ccco1
+C[C@H]1CCN(CC1)[C@@H](c1ccccc1)C(=O)c1ccccc1
+C[C@H]1CCN(CC1)[C@@H](c1ccccc1)[C@H](O)c1ccccc1
+C[C@H]1CCN(CC1)[C@H](Cc1ccccc1Cl)c1ccccc1
+C[C@H]1CCN[Pt@@]2(N1)OC(=O)C(=O)O2
+C[C@H]1CC[C@@H](CC1)C(=O)O[C@H]1CC[C@H](CC1)C(C)(C)C
+C[C@H]1CC[C@@H](CC1)O[C@H](C[N+](=O)[O-])C(Cl)(Cl)Cl
+C[C@H]1CC[C@@H](CC1)Oc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]
+C[C@H]1CC[C@@]2(CC1)NC(=O)N(CNc1ccccc1)C2=O
+C[C@H]1CC[C@H](C(C)C)[C@@H](C1)[C@@]12C3=C4C5=C1[Zr]16782345(Cl)(Cl)C2=C7[C@]8([C@@H]3C[C@@H](C)CC[C@@H]3C(C)C)C6=C12
+C[C@H]1CC[C@H](C(C)C)[C@@]2(OC[C@](C)(C)CO2)C1
+C[C@H]1CC[C@H](CC1)C(C)(C)OC(=O)COC(=O)C
+C[C@H]1CC[C@H](CC1)C(C)(C)c1ccc(O)cc1
+C[C@H]1CC[C@H](NCCOC(=O)c2ccc(cc2)[N+](=O)[O-])CC1
+C[C@H]1CC[C@](O)(CC1)[C@](C)(C(=O)O)c1ccccc1
+C[C@H]1CN(CC[C@@]21OCCO2)C1(CCCCC1)c1ccccc1
+C[C@H]1CN1C1=CC(=O)C2=C(C1=O)[C@H]1c3ccccc3[C@@H]2c2ccccc12
+C[C@H]1CN1P1(=NP(=NP(=N1)(N1C[C@@H]1C)N1C[C@H]1C)(N1C[C@H]1C)N1C[C@@H]1C)N1C[C@@H]1C
+C[C@H]1CN2C[C@H](C)O[Si@](CC[Si](C)(C)C)(O1)O[C@@H](C)C2
+C[C@H]1C[C@@H](O[Ti@@](O[C@@H]2C[C@H](C)CC(C)(C)C2)(O[C@@H]2C[C@H](C)CC(C)(C)C2)O[C@H]2C[C@@H](C)CC(C)(C)C2)CC(C)(C)C1
+C[C@H]1C[C@H](C)O[C@]2(CCCC2)O1
+C[C@H]1C[C@H](C)[C@@H](C)C1
+C[C@H]1C[C@H](C[N+](=O)[O-])C[C@@]2(OCCO2)C1
+C[C@H]1C[C@H](C[N+](=O)[O-])C[C@]2(OCCO2)C1
+C[C@H]1C[C@]2(OCCO2)CC[C@@H]1OCc1ccccc1
+C[C@H]1O[C@@H](O[C@@H]1C)c1cccc(c1)[N+](=O)[O-]
+C[C@H]1O[C@@](C)(CCc2ccccc2)O[C@@H]1C
+C[C@H]1O[C@@]2(CCCC2)OCC1(C)C
+C[C@H]1O[C@H](C)C[C@]2(CCCC2)C1
+C[C@H]1O[C@H](Cc2ccccc2)O[C@@H]1C
+C[C@H]1O[C@H](O[C@@H]1C)c1cc2OCOc2cc1Br
+C[C@H]1O[C@H](O[C@@H]1C)c1ccc2OCOc2c1
+C[C@H]1O[C@H](O[C@@H]1C)c1cccc(c1)[N+](=O)[O-]
+C[C@H]1O[C@H](O[C@@H]1C)c1ccccc1
+C[C@H]1O[C@]2(CCCC2)O[C@H]1C
+C[C@H]1[C@@H]2O[C@@H]2[C@@H](C)[S@]1(=O)=O
+C[C@]1(Br)[C@@](C)(Br)[C@@](C)(Br)[C@@](C)(Br)[C@@](C)(Br)[C@]1(C)Br
+C[C@]1(C)O[C@@H](CP(c2ccc3ccccc3c2)c2ccc3ccccc3c2)[C@H](CP(c2ccc3ccccc3c2)c2ccc3ccccc3c2)O1
+C[C@]1(C)O[C@@H](CP(c2ccccc2)c2ccccc2)[C@@H](CP(c2ccccc2)c2ccccc2)O1
+C[C@]1(C)O[C@@H](CP(c2ccccc2)c2ccccc2)[C@H](CP(c2ccccc2)c2ccccc2)O1
+C[C@]1(C)O[C@H]2CS(=O)(=O)C[C@H]2O1
+C[C@]1(C=C[C@@](O)(C#C[C@]2(O)C=C[C@](C)(C=C2)C(Cl)(Cl)Cl)C=C1)C(Cl)(Cl)Cl
+C[C@]1(O)[C@@](C)(O)[C@](C)(O)[C@]1(C)O
+C[C@]1(S[C@@](S[C@@](C)(S1)c1ccccc1)(c1ccccc1)c1ccccc1)c1ccccc1
+C[C@]12C=C[C@H](c3ccccc13)c1ccccc21
+C[C@]12CCCC=C2C[C@]2(OCCO2)CC1
+C[C@]12Oc3ccc4ccccc4c3C[C@H]2Cc2c(ccc3ccccc23)O1
+C[C@]12Oc3ccc4ccccc4c3[C@H]2c2c(ccc3ccccc23)O1
+C[Ge](C)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+C[N+](C)(C)CCC[N+]1(C)CC[C@@]2(CCC[C@@H](C2)C(F)(F)F)CC1
+C[N+](C)(C)CCC[N@+]12CN3CN(CN(C3)C2)C1
+C[N+](C)(C)C[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+C[N@+]12CN3CN(CN(C3)C2)C1
+C[N@+]12CN3CN(CP(C3)C2)C1
+C[N@+]12C[C@@H]3O[C@H](C1)C[N@@+](C)(C3)C2
+C[S+](C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+C[SH+][Pt@@+]1(P234N5CCN2CC[N@@+]14CCN3CC5)P(c1ccccc1)(c1ccccc1)c1ccccc1
+C[Si@@H]1O[Si@H](C)[C@]23C4=C5C6=C2[Fe]27893456C3=C8[C@@]9([Si@H](C)O[Si@@H](C)[C@@]45C6=C8C9=C4[Fe]4%10%11%125689C5=C%11[C@]1%12C%10=C45)C7=C23
+C[Si@@]1(C)O[Si](C)(C)[C@@]23C4=C5C6=C2[Fe]27893456C3=C8[C@@]9(C7=C23)[Si](C)(C)O1
+C[Si](C)(C)C12#C3([Si](C)(C)C)[Ni]45671([C@H]1C6=C5C4=C71)[Ni]145623[C@H]2C5=C4C1=C62
+C[Si](C)(C)CC[Si@@]12OCCN([C@H]3CCCC[C@H]3O1)[C@H]1CCCC[C@H]1O2
+C[Si](C)(C)CC[Si@]12OCCN(CCO1)CC(C)(C)O2
+C[Si](C)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+C[Si]1(C)O[Si](C)(C)[C@@]23C4=C5C6=C2[Fe]27893456C3=C8[C@@]19C7=C23
+C[Sn](C)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+C[Zr]12345678(I)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81
+C[n+]1ccc(CCN[C@@H]2CC[C@H](CC2)/N=N/[C@H]2CC[C@@H](CC2)[N+](=O)[O-])cc1
+C[n+]1ccc(CCN[C@H]2CC[C@@H](CC2)/N=N/[C@@H]2CC[C@H](CC2)[N+](=O)[O-])cc1
+C[n+]1ccccc1S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+C[n+]1cnn(C)n1.[O-][Cl](=O)(=O)=O
+Cc1[nH]c(c2ccccc2)c(O)c1C(=O)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cc1c(C)c2c(n1C)C(=O)[C@@H]1[C@H](C2=O)[C@@]2(C)c3ccccc3[C@]1(C)c1ccccc21
+Cc1c(C)ccc2nc3c(nc12)c1ccccc1c1ccccc31
+Cc1c(nn2cc(nnc12)c1ccccc1)c1ccccc1
+Cc1c2[nH]c3c(ccc4ccccc34)c2cc2c(C)nccc12
+Cc1c2ccncc2c(C)c2c1n(C)c1c(C)c3ccncc3c(C)c21
+Cc1c2nc3cc4ccccc4cc3n2c(C)c2ccccc12
+Cc1c2sc3ccccc3[nH]c2nc2[nH]c3ccccc3sc12
+Cc1cc(C)c(c(C)c1)S(=O)(=O)O.c1ccc2c(c1)[C@@H]1N[C@H]2c2ccccc12
+Cc1cc(C)c2cnnn2n1
+Cc1cc(C)n2n1[B+3]1[NH+]3C(=CC(=[N+]3[Re+3]32(=O)([OH+]CC[OH+]3)[NH+]2C(=CC(=[N+]12)C)C)C)C
+Cc1cc(C)n2n1[B+3]1[NH+]3C(=CC(=[N+]3[Re+3]32(=O)([OH+][C@@H]2CCCCCC[C@H]2[OH+]3)[NH+]2C(=CC(=[N+]12)C)C)C)C
+Cc1cc(C)n2n1[B+3]1[NH+]3C(=CC(=[N+]3[Re+]2(=O)(=O)(=O)[NH+]2C(=CC(=[N+]12)C)C)C)C
+Cc1cc(N)c2nsnc2c1
+Cc1cc(O)c2c(c1)C(=O)[C@@]13C(=C(O)[C@@H]4[C@@H](O)[C@H]3[C@H]3[C@H](O)[C@@H]1C(=C1C(=O)c5c(O)cc(C)cc5C(=O)[C@]431)O)C2=O
+Cc1cc(O)c2cc3ccc4c5c(ccc(c35)c2n1)cc1c(O)cc(C)nc41
+Cc1cc(O[C@H](C)C(=O)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c(C)c(C)c1
+Cc1cc(Oc2ccccc2)c2c(ccc3nc(C)cc(Oc4ccccc4)c23)n1
+Cc1cc(cc(c1N)S(=O)(=O)O)/C(=C\1/C=C/C(=N\c2ccc(cc2)S(=O)(=O)O)/C=C1)/c1ccc(cc1)Nc1ccc(cc1)S(=O)(=O)O
+Cc1cc(ccc1N)/C(=C/1\C=C/C(=N\c2ccccc2)/C=C1)/c1ccc(cc1)Nc1ccccc1
+Cc1cc2[n+]3C(N(C)C)N4CCCCC4c3c3n(c2cc1C)c(N(C)C)[n+]1ccccc31.[O-][Cl](=O)(=O)=O
+Cc1cc2[n+]3c(N(C)C)n4ccccc4c3c3n(c2cc1C)c(N(C)C)[n+]1ccccc31.[O-][Cl](=O)(=O)=O
+Cc1cc2c(ccc3c2ccc2ccccc32)c2ccccc12
+Cc1cc2cc3CCc4ccccc4c4nn5cnnc5c(c34)c2o1
+Cc1cc2cc3CCc4ccccc4c4nn5nnnc5c(c34)c2o1
+Cc1cc2nnc(N)c(N)nnc1cc2C(C)C
+Cc1cc2nnc3cc(C)cc4nnc(c1)c2c34
+Cc1cc[n+](c(C)c1)C1=C(O)C(=O)C2=C([C@@H]3c4ccccc4[C@H]2c2ccccc32)C1=O
+Cc1cc[n+](cc1)[Pt+2]12[n+]3ccccc3c3cccc(=c4cccc[n+]14)[n+]23.F[B-](F)(F)F
+Cc1cc[n+](cc1)[Pt+2]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23.F[B-](F)(F)F
+Cc1ccc(/C=N/N(C)CN(C)/N=C\c2ccc(C)cc2)cc1
+Cc1ccc(C(C)C)c(OC[C@@H]2N3CC[C@@H](CC3)C2=O)c1
+Cc1ccc(C)c2c1[C@](O)(C#Cc1ccccc1)c1c(C)ccc(C)c1[C@]2(O)C#Cc1ccccc1
+Cc1ccc(N)n(N)c1
+Cc1ccc(cc1)/C(=C/C(=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/Sc1ccccc1
+Cc1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Cc1ccc(cc1)/N=C/c1ccc(cc1O)[S@@](=O)(=O)c1ccc(/C=N/c2ccc(C)cc2)c(O)c1
+Cc1ccc(cc1)C(=O)/C=C(\O)/C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Cc1ccc(cc1)C(=O)/C=c\1/[nH]c2c(nc1NC13C[C@H]4C[C@H](C[C@H](C4)C3)C1)c(=O)oc1ccccc21
+Cc1ccc(cc1)C(=O)/C=c\1/[nH]c2ccccc2nc1N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cc1ccc(cc1)N/N=C\1/C(=O)O[C@H](OC1=O)c1ccccc1
+Cc1ccc(cc1)N1C[C@H](O)CN(C[C@H](O)C1)c1ccc(C)cc1
+Cc1ccc(cc1)Oc1nc2nc3c(cc2c2ccccc12)n(C(=O)C)c1ccccc31
+Cc1ccc(cc1)P(c1ccc(C)cc1)(c1ccc(C)cc1)[Pt@@]1(Cl)[Cl][Pt@@](Cl)([Cl]1)P(c1ccc(C)cc1)(c1ccc(C)cc1)c1ccc(C)cc1
+Cc1ccc(cc1)S(=O)(=O)/N=S/1\CCCC1
+Cc1ccc(cc1)S(=O)(=O)C(=S=N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)Sc1ccccc1
+Cc1ccc(cc1)S(=O)(=O)C[C@H]1[C@H]2c3ccccc3[C@@H]([C@H]1C)c1ccccc21
+Cc1ccc(cc1)S(=O)(=O)N/N=C(\C=C\c1ccccc1)/C=C/c1ccccc1
+Cc1ccc(cc1)S(=O)(=O)N/N=C/1\CN2CC[C@H]1CC2
+Cc1ccc(cc1)S(=O)(=O)N/N=C/1\[C@@](C)(C)/C(=N\NS(=O)(=O)c2ccc(C)cc2)/[C@@]1(C)C
+Cc1ccc(cc1)S(=O)(=O)N/N=C\1/C(=N\NS(=O)(=O)c2ccc(C)cc2)/[C@H]2c3ccccc3[C@@H]1c1ccccc21
+Cc1ccc(cc1)S(=O)(=O)N/N=C\1/C=C2C/C(=N/NS(=O)(=O)c3ccc(C)cc3)/C=C2C1
+Cc1ccc(cc1)S(=O)(=O)N/N=C\1/[C@H]2CC=CC[C@@H]2/C(=N\NS(=O)(=O)c2ccc(C)cc2)/[C@H]2CC=CC[C@H]12
+Cc1ccc(cc1)S(=O)(=O)N/N=C\1/[C@H]2CC[C@@H]1CC2
+Cc1ccc(cc1)S(=O)(=O)N1C(=O)O[C@@]2(CCCCC2)[C@H]1C
+Cc1ccc(cc1)S(=O)(=O)N1C[C@@H](Cl)CN(C[C@H](Cl)C1)S(=O)(=O)c1ccc(C)cc1
+Cc1ccc(cc1)S(=O)(=O)N1C[C@@]2(O)CN(C[C@@](O)(C1)O2)S(=O)(=O)c1ccc(C)cc1
+Cc1ccc(cc1)S(=O)(=O)NC(=O)O[C@]12COCN2COC1
+Cc1ccc(cc1)S(=O)(=O)NNC(=O)[C@]12CC[C@H](CC1)C2
+Cc1ccc(cc1)S(=O)(=O)N[C@@H]1CC[C@@H](CC1)C(=O)O
+Cc1ccc(cc1)S(=O)(=O)O.N=c1[nH]nc2c3ccccc3n3c4ccccc4n(C)c3c12
+Cc1ccc(cc1)S(=O)(=O)OC[C@H]1O[C@@](C)(C)O[C@H]1COS(=O)(=O)c1ccc(C)cc1
+Cc1ccc(cc1)S(=O)(=O)OC[C@]12CC[C@H](CC1)[C@H]1C[C@@H]21
+Cc1ccc(cc1)S(=O)(=O)OC[C@]12CC[C@H]([C@H]3C[C@@H]13)[C@H]1C[C@@H]21
+Cc1ccc(cc1)S(=O)(=O)O[C@@H]1CC[C@H](CC1)N1C(=O)c2ccccc2C1=O
+Cc1ccc(cc1)S(=O)(=O)O[C@@H]1[C@H](O)[C@H](O)[C@H](O)[C@@H](O)[C@H]1O
+Cc1ccc(cc1)S(=O)(=O)O[C@@]1([C@@H]2CC[C@H]1CC2)c1ccc(cc1)C(F)(F)F
+Cc1ccc(cc1)S(=O)(=O)O[C@@]12CC[C@@](C)(CC1)[C@@]1(OCCO1)C2
+Cc1ccc(cc1)S(=O)(=O)O[C@H]1CC[C@@H](CC1)OS(=O)(=O)c1ccc(C)cc1
+Cc1ccc(cc1)S(=O)(=O)O[C@H]1[C@@](C)(C)[C@H](OS(=O)(=O)c2ccc(C)cc2)C1(C)C
+Cc1ccc(cc1)S(=O)(=O)O[C@]12CC[C@](C)(CC1)C(=O)C2
+Cc1ccc(cc1)S(=O)(=O)[O-].C[N+]1(C)CC[S+]2CC[N+](C)(C)[Pt@+]12Cl
+Cc1ccc(cc1)S(=O)(=O)[O-].C[N+]1(C)CC[S+]2CC[N+](C)(C)[Pt@@+]12Cl
+Cc1ccc(cc1)S(=O)(=O)[O-].Cc1ccc(cc1)S(=O)(=O)[OH+][Pd@+2]12[N+](C)(C)CC[N@@+]2(C)CC[N+]1(C)C
+Cc1ccc(cc1)S(=O)(=O)[O-].Cc1ccc(cc1)S(=O)(=O)[OH+][Pd@@+2]12[N+](C)(C)CC[N@+]2(C)CC[N+]1(C)C
+Cc1ccc(cc1)S(=O)(=O)[O-].Cl[Pt@+]12[N+](C)(C)CC[N@+]2(C)CC[N+]1(C)C
+Cc1ccc(cc1)S(=O)(=O)[O-].Cl[Pt@@+]12[N+](C)(C)CC[N@@+]2(C)CC[N+]1(C)C
+Cc1ccc(cc1)S(=O)(=O)[O-].Clc1ccc2[nH][se][n+](C)c2c1.Clc1ccc2[n+](C)[se][nH]c2c1
+Cc1ccc(cc1)S(=O)(=O)[O-].Clc1ccc2n[se][n+](C)c2c1.Clc1ccc2c(n[se][n+]2C)c1
+Cc1ccc(cc1)S(=O)(=O)c1c(N)c2nc3ccccc3n2c2nc3ccccc3nc12
+Cc1ccc(cc1)S(=O)OC[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Cc1ccc(cc1)S(=O)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cc1ccc(cc1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+Cc1ccc(cc1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+Cc1ccc(cc1)[C@@]1(O)CS/C(=N/[C@]23C[C@@H]4C[C@@H](C[C@H](C4)C3)C2)/N1C(P(=O)(O)O)P(=O)(O)O
+Cc1ccc(cc1)[C@H]1CC(=O)C[C@@H](c2ccc(C)cc2)[C@@]21C(=O)NC(=O)NC2=O
+Cc1ccc(cc1)[C@H]1CC(=O)C[C@H](c2ccc(C)cc2)[C@@]21C(=O)c1ccccc1C2=O
+Cc1ccc(cc1)[C@]1(C)O[C@@H](C)[C@H](C)O1
+Cc1ccc(cc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cc1ccc(cc1)[S@](=O)(=[OH+])[O-].O=C(c1ccccc1)c1ccc2[nH][se][n+](C)c2c1.O=C(c1ccccc1)c1ccc2[n+](C)[se][nH]c2c1
+Cc1ccc(cc1)[S@](=O)(=[OH+])[O-].O=C(c1ccccc1)c1ccc2n[se][n+](C)c2c1.O=C(c1ccccc1)c1ccc2c(n[se][n+]2C)c1
+Cc1ccc(cc1)[Si@]12O[C@H](C)CN(C[C@H](C)O1)C[C@H](C)O2
+Cc1ccc(cc1)c1nnc2s/c(=C\c3ccc(cc3)N(C)C)/c(=O)n12
+Cc1ccc2C(=[N+]3[N-]C(=[S+][Cu+]3[n+]2n1)N1C[C@H]2CC[C@H](CC2)C1)C
+Cc1ccc2C(=[N+]3[N-]C(=[S+][Fe+]3[n+]2n1)N1C[C@H]2CC[C@H](CC2)C1)C
+Cc1ccc2OCN(Cc2c1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cc1ccc2[n+](n1)[Cu+]1[S+]=C([N-][N+]1=C2C)N1C[C@H]2CC[C@H](CC2)C1
+Cc1ccc2[n+](n1)[Fe+]1[S+]=C([N-][N+]1=C2C)N1C[C@H]2CC[C@H](CC2)C1
+Cc1ccc2[nH]c3c(ncc4[nH]c5ccccc5c34)c2c1
+Cc1ccc2c(NO[N+]2[O-])c1
+Cc1ccc2c(c1)nc1cc3c(cc1n2C1CCCCC1)c(Cl)c(=O)c1ccccc31
+Cc1ccc2c(no[n+]2[O-])c1
+Cc1ccc2ccc3c(ccc4c3ccc3c(C)cccc43)c2c1
+Cc1ccc2ccc3c4C(=O)OC(=O)c4c4ccc5ccc(C)cc5c4c3c2c1
+Cc1ccc2n[se]nc2c1
+Cc1ccc2nc3c4cccc5cccc(c3nc2c1)c45
+Cc1ccc2nnc(NS(=O)(=O)c3cc(C)c(Cl)cc3S)n2n1
+Cc1ccc2oc(=O)c(cc2c1)C(=O)Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cc1ccc2s/c(=[S+]\[Pd@](Cl)(Cl)/[S+]=c/3\sc4ccc(C)cc4s3)/sc2c1
+Cc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+Cc1cccc(C)c1N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+Cc1cccc(C)n1N
+Cc1cccc(N)n1N
+Cc1cccc(c1)CP(Cc1cccc(C)c1)CC1(COC1)Cp1c2ccccc2c2ccccc12
+Cc1cccc(c1)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Cc1cccc(c1)N1CCN(CC1)c1ccc2NONc2c1[N+](=O)[O-]
+Cc1cccc(c1)N1CCN(CC1)c1ccc2nonc2c1[N+](=O)[O-]
+Cc1cccc(c1)NC(=O)[C@@H]1CC[C@H](CC1)CC1CCCCC1
+Cc1cccc(c1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+Cc1cccc(c1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+Cc1cccc(c1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Cc1cccc(c1)c1nnc2s/c(=C\c3ccc(cc3)N(C)C)/c(=O)n12
+Cc1cccc(c1)c1nnc2s/c(=C\c3ccc4OCOc4c3)/c(=O)n12
+Cc1cccc(c1)n1c(=S)[nH]c2c(sc(=O)n2c2ccccc2C)c1=O
+Cc1cccc(c1C)N1C(=O)[C@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+Cc1cccc2CC[C@H]3CCc4cccc(C)c4[C@H]3c12
+Cc1ccccc1/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cc1ccccc1n1c(=O)sc2c(=O)n(c3ccccc3)c(=S)[nH]c12
+Cc1ccccc1n1c(=S)[nH]c2n(c(=O)sc2c1=O)c1ccccc1C
+Cc1ccccn1N
+Cc1cccn(N)c1N
+Cc1ccn(cc1)[Pt](ON(=O)O)(ON(=O)O)n1ccc(C)cc1
+Cc1cp(Cc2ccccc2)cc1C
+Cc1cs/c(=N\C23C[C@H]4C[C@H](C[C@H](C4)C3)C2)/n1C(P(=O)(O)O)P(=O)(O)O
+Cc1n[nH]c2c(ncnc12)NC[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+Cc1nc(C)c2CCC(=O)N(Cc3ccc(cc3)c3ccccc3c3nn[nH]n3)c2n1
+Cc1nc2CCC=c3nc(C)c1n23
+Cc1nc2c(o1)/C(=N\c1ccccc1)/c1nc(C)oc1/C/2=N/c1ccccc1
+Cc1nc2c3ccccc3C(=O)c3nc4ccccc4c(c1)c23
+Cc1nc2c3ncccc3C(=O)c3nc4ccccc4c(c1)c23
+Cc1nc2cc3c(oc4ccccc34)cc2n2cccc12
+Cc1nc2ccccc2cc1C[N@@+]12CN3CN(CN(C3)C2)C1
+Cc1nn(c(C(Cl)Cl)c1Cl)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Cc1nn(c(C)c1)c1ccc2nnnn2n1
+Cc1nnc(o1)C(CCN1[C@@H]2CC[C@H]1CC2)(c1ccccc1)c1ccccc1
+Cc1nnnn1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cc1onc(C)c1/N=N/c1ccc2nonc2c1N
+Cc1sc2nc3sn4c(=O)c5c(nc4n3c(=O)c2c1C)sc(C)c5C
+Cl.C1CN(CCN1C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cl.C1C[C@@H]2CCN1C[C@@]12SS[C@@]2(CN3CC[C@H]2CC3)S1
+Cl.CC(C)N(CCn1c2c(oc(=O)c3ccccc23)c2ccc3ccccc3c12)C(C)C
+Cl.CC(C)[C@@](O)(C(=O)OCC1=C[C@@H]2CCN1CC2)c1ccccc1
+Cl.CC(C)[C@](O)(C(=O)O/C=C/1\C[C@@H]2CCN1CC2)c1ccccc1
+Cl.CC(C)c1ccc(cc1)[C@@H]1[C@H]2CCN1CC2
+Cl.CCN(CC)Cc1cc(ccc1O)Nc1ccnc2ccc3nn(C)nc3c12
+Cl.CCOC(=O)N1CCC(=O)[C@H](CN[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)C1
+Cl.CC[C@H](C)N1CN(c2ccccc2)[C@@]2(CCN(CC2)C[C@@H]2COc3ccccc3O2)C1=O
+Cl.CN(C)CCNC(=O)c1cccc2nc3c(nc12)c1ccccc1c1ccccc31
+Cl.CN(C)C[C@@H]1CCC[C@@H](CN(C)C)/C/1=N\OC(=O)c1ccccc1
+Cl.CN1CC[C@H](O)[C@H](CN[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)C1
+Cl.CO[C@H]1CCN(CC1)[C@H]1C[C@H](O[C@@H](C)[C@H]1O)O[C@@H]1C[C@@](O)(Cc2c1c(O)c1c(c2O)C(=O)c2cccc(OC)c2C1=O)C(=O)CO
+Cl.COc1ccc(cc1)CN(CCCCCCN(Cc1ccc(OC)cc1)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cl.C[C@@H](N)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Cl.C[C@@H](N)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Cl.C[C@@H]1CCN(CC1)CCC(=O)C[C@H](c1ccccc1)c1c(=O)oc2ccccc2c1O
+Cl.C[C@H]1N2CC[C@@H](CC2)[C@H]1OC(=O)C(O)(c1ccccc1)c1ccccc1
+Cl.Cl[Ru](Cl)Cl.O=C1CCCN1[C@H]1C[C@H](C[C@H](C[C@H](C[C@H](C[C@@H](C[C@H](C[C@H](C[C@H](C1)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O
+Cl.Clc1ccc(cc1)Cn1c(=N)n(CC(=O)NC23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c2ccccc12
+Cl.Fc1ccc(cc1)C(=O)CCCN1CC[C@]2(CC1)C[C@H](OC2=O)c1ccccc1
+Cl.Fc1ccc(cc1)[C@@](C)(CN1CC[C@]2(CC1)N(CN(CC(C)C)C2=O)c1ccccc1)C1OCCO1
+Cl.N#Cc1c(C)nn2c1nnc1c(=O)[nH][nH]c(=N)sc21
+Cl.NCCCN1CCN(CCCNc2ccc3nnn4c3c2c(=O)c2ccccc42)CC1
+Cl.NCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Cl.NCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Cl.N[C@H]1CC[C@@H](CC1)C(=O)[C@@H]1CC[C@@H](O)C[C@@H]1O
+Cl.O/N=C\1/[C@H](CC[C@@H]1CN(C)C)CN(C)C
+Cl.O=C(/C=C/c1ccccc1)Nc1ccccc1SCCCN1CC[C@]2(CC1)C(=O)N(C)CN2c1ccccc1
+Cl.O=C1CC[C@@H](C(=O)O[C@@H]2CN3CC[C@@H]2CC3)C(=O)N1
+Cl.O=C1C[C@@]2(CCN(CC2)C[C@@H]2COc3ccccc3O2)C(=O)N1N1CCCCCC1
+Cl.OC[C@@]1(CNc2nc(N)nc(Cl)c2N)C[C@@H](CCCCc2ccccc2)C1
+Cl.OC[C@@]1(CNc2nc(N)nc(Cl)c2N)C[C@@H](CCCc2ccccc2)C1
+Cl.O[C@@H](CN1CC[C@H](CC1)c1ccccc1)Cc1ccc(Br)cc1
+Cl.O[C@@H]1CCCN(C)[C@@H]1CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cl.[O-]C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=[OH+])O)C6=C12
+Cl.[O-]C(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=[OH+])O)C6=C12
+Cl.c1ccc(cc1)CN(CCCCCCN(Cc1ccccc1)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cl.c1ccc2ccc(N/N=C/[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)nc2c1
+Cl.c1ccc2ccc(N/N=C/[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)nc2c1
+Cl/C=C/C[N@+]12CN3CN(CN(C3)C2)C1
+ClC(=C(Cl)/C(=C(/N[C@@H](C)[C@@]12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1)\N[C@H](C)[C@@]12C[C@@H]3C[C@H](C[C@H](C3)C2)C1)/[N+](=O)[O-])Cl
+ClC(=C)C[N@+]12CN3CN(CN(C3)C2)C1
+ClC(=C1OC(=O)[C@@H]2[C@H]3c4ccccc4[C@@H]([C@H]12)c1ccccc31)Cl
+ClC(=O)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+ClC(=O)[C@H]1CC[C@@H]2c3ccccc3[C@@](C1)([N+](=O)[O-])c1ccccc21
+ClC(=O)[C@H]1CC[C@H]2c3ccccc3[C@](C1)([N+](=O)[O-])c1ccccc21
+ClC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+ClC(Cl)C(=O)N1C[C@H]2CC[C@H](CC2)C1
+ClC(Cl)C(=O)N[C@@H]1CC[C@H](CC1)C(C)(C)C.ClC(Cl)C(=O)N[C@H]1CC[C@@H](CC1)C(C)(C)C
+ClC/C(=N/NC1=N[C@@](C)(CC[C@]2(C)N=C(N/N=C(\C)/CCl)SP2(=O)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)P(=O)(S1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/C
+ClC/C(=N\C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)/NS(=O)(=O)c1ccc(C)cc1
+ClC/C=C/C[N@@+]12CN3CN(CN(C3)C2)C1
+ClC1=C(Cl)[C@@H]2c3ccccc3[C@H]1c1ccccc21
+ClC1=C(Cl)[C@@]2(Cl)C=C[C@]1(Cl)[C@@]2(Cl)Cl
+ClC1=C(Cl)[C@@]2(Cl)CC[C@]1(Cl)[C@@]2(Cl)Cl
+ClC1=C(Cl)[C@@]2(Cl)C[C@]1(Cl)[C@H]1[C@H]3C[C@H]([C@H]4O[C@](C)(C)O[C@@H]34)[C@@H]21
+ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4C=C[C@H](C4)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl
+ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4CC[C@H](C4)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl
+ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4C[C@H]([C@H]5O[C@@H]45)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl
+ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4C[C@H]([C@H]5[C@@H]6C[C@@H]([C@@H]7O[C@H]67)[C@@H]45)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl
+ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4O[C@H]([C@H]5O[C@@H]45)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl
+ClC1=C(Cl)[C@]2(Cl)[C@@]3(Cl)C(=C(Cl)[C@](Cl)([C@]43OCCO4)[C@]2(Cl)C21OCCO2)Cl
+ClC1=C(Cl)[C@]2(Cl)[C@H]3COC[C@H]3[C@@]1(Cl)[C@@]2(Cl)Cl
+ClC1=C(Cl)[C@]2(Cl)[C@H]3O[C@H]3[C@@]1(Cl)[C@]2(Cl)Cl
+ClC1=C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+ClCC(=N)NCCO[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+ClCC(=N)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+ClCC(=O)N1CC[C@]2(CC1)SS[C@]1(CCN(CC1)C(=O)CCl)S2
+ClCC(=O)N1C[C@H]2CC[C@H](CC2)C1
+ClCC(=O)NC[C@]1(S[C@@](CNC(=O)CCl)(S1)c1ccc(Cl)cc1)c1ccc(Cl)cc1
+ClCC(=O)[C@H](OC(=O)C)[C@@H](OC(=O)C)[C@@H](OC(=O)C)C(=O)CCl
+ClCC1=N[C@@H](c2ccc(cc2)[C@@H]2N=C(CCl)OP2(=O)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)P(=O)(O1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+ClCCN(CCCl)/N=C\C=N\N(CCCl)CCCl
+ClCCN(CCCl)COc1ccc(cc1)[C@H]1CC(=O)[C@@H](CN(CCCl)CCCl)C(=O)C1
+ClCCN(CCCl)C[C@@H]1C(=O)C[C@@H](CC1=O)c1ccc(O)cc1
+ClCCN(CCCl)P(=O)(N)O[C@H](c1ccccc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+ClCCN(CCCl)P(=O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+ClCCN(CCCl)[C@@H]([C@@H]1CCC=CC1)[C@@H]1C(=O)C[C@@H](CC1=O)c1ccc(O)cc1
+ClCCN(CCCl)[C@@H]([C@H](O)[C@H](O)[C@H](O)CO)[C@H]1C(=O)[C@@H](C(=O)OCC)[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C1=O.CCOC(=O)[C@H]1[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C(=O)[C@H](C1=O)[C@H]([C@H](O)[C@H](O)[C@H](O)CO)[C@H]1C(=O)[C@@H](C(=O)OCC)[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C1=O
+ClCCN(CCCl)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+ClCCN(CCCl)c1ccc(/C=N/NC(=O)[C@-]23C4=C5C6=C2[Fe+2]27893456C3=C8C7=C2[C-]93)c(C)c1
+ClCCN(CCCl)c1ccc(/C=N/NC(=O)[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8C7=C2[C-]93)c(C)c1
+ClCCN(CCCl)c1ccc(c(C)c1)[C@@H]1N(CCCN1[C@H](C#N)c1ccccc1)[C@H](C#N)c1ccccc1
+ClCCN(CCCl)c1ccc(cc1)/C=N/[C@H]1C(C)(C)[C@@H](/N=C/c2ccc(cc2)N(CCCl)CCCl)[C@@]1(C)C
+ClCCN(CCCl)c1ccc(cc1)/C=c\1/sc2nc3nc(C)nc(O)c3n2c1=O
+ClCCN(CCCl)c1ccc(cc1)[C@H]1N(CCCN1[C@H](C#N)c1ccccc1)[C@H](C#N)c1ccccc1
+ClCCN(C[C@@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1)C1CCCCC1
+ClCCN(Cc1ccccc1)C(=O)[C@@H]1[C@@H](c2ccccc2)[C@@H]1c1ccccc1
+ClCCN(N=O)C(=O)NC[C@H]1CC[C@@H](CC1)CNC(=O)N(N=O)CCCl
+ClCCN(N=O)C(=O)N[C@@H]1CC[C@@H](CC1)NC(=O)N(N=O)CCCl
+ClCCN(N=O)C(=O)N[C@@H]1CC[C@@H](OC)CC1
+ClCCN(N=O)C(=O)N[C@@H]1CC[C@H](CC1)C[C@H]1CC[C@H](CC1)NC(=O)N(N=O)CCCl
+ClCCN(N=O)C(=O)N[C@@H]1CC[C@H](OC)CC1
+ClCCN(N=O)C(=O)N[C@@H]1CS(=O)(=O)[C@@H](C)S(=O)(=O)C1
+ClCCN(N=O)C(=O)N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1
+ClCCN(N=O)C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+ClCCN(N=O)C(=O)N[C@H]1CC[C@H](CCl)CC1
+ClCCN(N=O)C(=O)N[C@H]1[C@@H](O)C[C@H](C)C[C@@H]1O
+ClCCN(N=O)C(=O)N[C@H]1[C@@H](O)[C@@H](O)[C@@H](O)[C@H](O)[C@@H]1O
+ClCCN(N=O)C(=O)N[C@H]1[C@@H](OC(=O)C)[C@H](OC(=O)C)[C@H](NC(=O)N(N=O)CCCl)[C@H](OC(=O)C)[C@@H]1OC(=O)C
+ClCCN1CC[C@@]2(CC1)SS[C@]1(CCN(CCCl)CC1)S2
+ClCCNC(=O)N(O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+ClCCNC(=O)N[C@@H]1CC[C@H](CC1)C[C@H]1CC[C@@H](CC1)NC(=O)NCCCl
+ClCCNC(=O)N[C@@H]1CC[C@H](CC1)NC(=O)NCCCl
+ClCCNC(=O)N[C@@H]1CS(=O)(=O)[C@H](C)S(=O)(=O)C1
+ClCCNC(=O)N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1
+ClCCNC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+ClCCNC(=O)N[C@H]1C[C@@H](NC(=O)NCCCl)C[C@](C)(C)C1
+ClCCNC(=O)N[C@H]1[C@@H](O)[C@@H](O)[C@@H](O)[C@H](O)[C@@H]1O
+ClCCNC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)NCCCl)C6=C12
+ClCCNC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)NCCCl)C6=C12
+ClCCNC(=O)[C@@H]1CC[C@H](CC1)C(=O)NCCCl
+ClCCNCCNc1ccnc2ccc3nn(C)nc3c12
+ClCCOC(=O)[C@@H]1[C@@H](C(=O)OCCCl)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.CCS(=O)(=O)[O-]
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.OC(=O)/C=C/C(=O)O
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.OC(=O)CP(=O)([O-])[O-]
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.OC(=O)P(=O)([O-])[O-]
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.OC(=O)[C@@H](O)[C@H](O)C(=O)O
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.OC(=O)c1ccccc1O
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.OC[C@@H](O)[C@@H]1OC(=O)C(=C1O)[O-]
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.[O-]P(=O)([O-])O
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.[O-]S(=O)(=O)[O-]
+ClCC[N@+]12CC[N@+](CCCl)(CC1)C2.[O-][Cl](=O)(=O)=O
+ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2.CCS(=O)(=O)[O-]
+ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2.Cl[Au](Cl)(Cl)Cl
+ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2.Cl[Pt](Cl)(Cl)Cl
+ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2.OC(=O)CP(=O)([O-])[O-]
+ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2.OC(=O)P(=O)([O-])[O-]
+ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2.OC[C@@H](O)[C@@H]1OC(=O)C(=C1O)[O-]
+ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2.[O-]P(=O)([O-])O
+ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2.[O-]S(=O)(=O)[O-]
+ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2.[O-][Cl](=O)(=O)=O
+ClCCc1nnn(C)n1
+ClCP(=O)(Cl)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+ClCP(=O)(N)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+ClCP(=O)(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)N1CC1
+ClC[C@@H](Cl)[C@@H]1CCC[C@H](Cl)C1.ClC[C@@H](Cl)[C@@H]1CC[C@@H](Cl)CC1
+ClC[C@@H](O)CN1CC[N@+]2(CC1)CC[N@+]1(CCN(CC1)C[C@H](O)CCl)CC2
+ClC[C@@H]1CO[C@@]2(CCCC2)O1
+ClC[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+ClC[C@H](OS(=O)(=O)C)[C@@H]1O[C@](C)(C)O[C@H]1[C@H](CCl)OS(=O)(=O)C
+ClC[C@H]1OC(C)(C)O[C@](C#N)(C1)C[C@@H]1C[C@H](C[C@@]2(C#N)C[C@@H](CCl)OC(C)(C)O2)O[C@](C)(C)O1
+ClC[C@H]1[C@@H](CCl)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl
+ClC[C@]12[C@@H]3C(=O)[C@H]1[C@]23CCl
+ClP(=O)(Cl)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+ClP(=O)(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccccc1
+ClP(=O)(Oc1ccccc1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cl[C-]1C(=[O+][Ru+3]23([O+]=C1C)([O+]=C(C)[C-](Cl)C(=[O+]2)C)[O+]=C(C)[C-](Cl)C(=[O+]3)C)C
+Cl[C@@H]1CCCC[C@@]21OCCO2
+Cl[C@@H]1CC[C@@H](CC1)CN1Cc2c(C1)nc(N)nc2N
+Cl[C@@H]1O[C@H](Cl)[C@H](Cl)[S@](=O)(=O)[C@@H]1Cl
+Cl[C@@H]1[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@H]1Cl
+Cl[C@@H]1[C@@H]2C=C[C@@H](C2)[C@@]21OCCO2
+Cl[C@@H]1c2ccccc2c2ccccc2[C@H](Cl)[S@]1(=O)=O
+Cl[C@@]1(Br)[C@H]2c3ccccc3[C@H](c3ccccc23)[C@@H]1S(=O)(=O)c1ccccc1
+Cl[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Cl[C@@]12[C@@H]([C@@H]3c4ccccc4[C@H]1c1ccccc31)[C@@H]1c3ccccc3[C@H]2c2ccccc12
+Cl[C@@]12[C@@]3(N)[C@]4(Cl)[C@]5(Cl)[C@@]3(Cl)[C@@]2(Cl)[C@](Cl)([C@]14Cl)C15OCCO1
+Cl[C@@]12[C@H]3CCC[C@H]1CCC[C@@H]2CCC3
+Cl[C@@]12c3ccccc3[C@@H](c3ccccc13)[C@@]1(Cl)c3ccccc3[C@@H]2c2ccccc12
+Cl[C@H](COc1ccccc1)Cn1cc/c(=N)/cc1
+Cl[C@H]1CCC[C@@]2(Cl)C(=O)N[C@@]3(CCCCC3)N=C12
+Cl[C@H]1S(=O)(=O)C[C@]21OCCO2
+Cl[C@]1(Cl)[C@@H](c2ccccc2)[C@H]1c1ccccc1
+Cl[C@]1(c2ccccc2)[C@@H]2CCCC[C@@H]12
+Cl[Co@]1([Cl][Co@](Cl)([Cl]1)[n+]1ccccc1)[n+]1ccccc1
+Cl[Co@]1([Cl][Co@]2([Cl]1)[Cl][Co@@](Cl)([Cl]2)[n+]1ccccc1)[n+]1ccccc1
+Cl[Fe@@](Cl)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cl[Fe](Cl)(Cl)Cl.C12=C3C4=C5[C@@H]1[Fe+]16782345C2=C6C7=C1[C@@H]82
+Cl[Fe]12([Cl-][Fe]3(Cl)([Cl-]1)[S-]1CC[N@+]45CCC[N@@+]6(CCC4)CC[S@@H]3[Ni@@+2]156)[S-]1CC[N@@+]34CCC[N@+]5(CCC3)CC[S@@H]2[Ni@@+2]145
+Cl[Fe]12([Cl-][Fe]3(Cl)([Cl-]1)[S-]1CC[N@@+]45CCC[N@+]6(CCC4)CC[S@@H]3[Ni@@+2]156)[S-]1CC[N@+]34CCC[N@@+]5(CCC3)CC[S@@H]2[Ni@@+2]145
+Cl[Hf]12345678(Cl)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81
+Cl[Hf]12345678(Cl)(C9=C4[C@]7(C3=C19)C(C)(C)C)C1=C6[C@]8(C5=C21)C(C)(C)C
+Cl[Hg](Cl)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cl[Hg][C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@]8([Hg][Cl-])C6=C12
+Cl[Hg][C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@]8([Hg][Cl-])C6=C12
+Cl[La](Cl)(Cl)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cl[Mn@](Cl)(/[S+]=c/1\nc[nH]c2[nH]cnc12)/[S+]=c/1\nc[nH]c2[nH]cnc12
+Cl[Pd@@](Cl)(/[S+]=C\1/NCCS1)/[S+]=C\1/NCCS1
+Cl[Pd@@](Cl)(/[S+]=c/1\scc[nH]1)/[S+]=c/1\scc[nH]1
+Cl[Pd@@]1(Cl)P(c2ccccc2)(c2ccccc2)[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@-]9(C7=C23)P1(c1ccccc1)c1ccccc1
+Cl[Pd@](Cl)(/[S+]=c/1\sc2ccccc2[nH]1)/[S+]=c/1\sc2ccccc2[nH]1
+Cl[Pd@](Cl)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Cl[Pd@](Cl)(Nc1ccc(cc1)/C=C/1\C=Cc2ccccc12)Nc1ccc(cc1)/C=C/1\C=Cc2ccccc12
+Cl[Pd]1(Cl)P(c2ccccc2)(c2ccccc2)[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]9(C7=C23)P1(c1ccccc1)c1ccccc1
+Cl[Pd]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23
+Cl[Pd]Cl.CN(C)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Cl[Pd]Cl.CN(C)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Cl[Pt@@](Cl)(/[S+]=C\1/NCCS1)/[S+]=C\1/NCCS1
+Cl[Pt@@](Cl)(/[S+]=c/1\scc[nH]1)/[S+]=c/1\scc[nH]1
+Cl[Pt@@]1(Cl)N(CCN1C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Cl[Pt@@]1([Cl][Pt@@](Cl)([Cl]1)P(C1CCCCC1)(c1ccccc1)c1ccccc1)P(C1CCCCC1)(c1ccccc1)c1ccccc1
+Cl[Pt@](Cl)(/[S+]=c/1\sc2ccccc2[nH]1)/[S+]=c/1\sc2ccccc2[nH]1
+Cl[Pt@](Cl)(Nc1ccc(cc1)/C=C/1\C=Cc2ccccc12)Nc1ccc(cc1)/C=C/1\C=Cc2ccccc12
+Cl[Pt@]1(Cl)N[C@@H]2CCC[C@@H](C2)N1
+Cl[Pt](Cl)(Cl)[N@+]12CN3CN(CN(C3)C2)C1
+Cl[Pt](Cl)[N@+]12CN3CN(CN(C3)C2)C1
+Cl[Pt]1(Cl)N(CCN1C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Cl[Pt]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23
+Cl[Sn](Cl)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+Cl[Ti]12345678(Cl)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81
+Cl[ZrH]12345678(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81
+Cl[Zr]12345678(Cl)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81
+Cl[Zr]12345678(Cl)(C9=C4[C@@]7(Cc4ccccc4)C3=C19)C1=C6[C@@]8(Cc3ccccc3)C5=C21
+Clc1c2cc3c(nc4cccnc4n3C3CCCCC3)cc2c2ccccc2c1=O
+Clc1c2nn3c(nnc3c3ccccc3O)sc2c(Cl)c2nn3c(nnc3c3ccccc3O)sc12
+Clc1c2sc3nnc(C)n3nc2c(Cl)c2sc3nnc(C)n3nc12
+Clc1cc(/C=N/C23C[C@H]4C[C@H](C[C@H](C4)C3)C2)cc(Cl)c1
+Clc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(O)c(Cl)c1
+Clc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc(Cl)c1
+Clc1cc(/C=N\C[C@H]2CC[C@@H](C/N=C\c3cc(Cl)cc(Cl)c3O)CC2)c(O)c(Cl)c1
+Clc1cc(C)c2nc(cn2n1)C(=O)O
+Clc1cc(Cl)c(Cl)cc1C[N@+]12CN3CN(CN(C3)C2)C1
+Clc1cc(Cl)c(OCc2ccccc2)c(c1)S(=O)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Clc1cc(Cl)c2n[se]nc2c1
+Clc1cc(Cl)c2n[se]nc2n1
+Clc1cc(Cl)c2nsnc2c1N
+Clc1cc(Cl)cc(/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)c1
+Clc1cc(Cl)cc(c1)Nc1nc(N[C@H]2CC[C@@H](CC2)N(C)C)c2ccccc2n1
+Clc1cc(N)c2nnc(c3ccccc3)n2n1
+Clc1cc(N)c2nncn2n1
+Clc1cc(N)c2nnnn2n1
+Clc1cc(NC(=O)c2ccccc2)c2nnc(c3ccccc3)n2n1
+Clc1cc(OC[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)nc(OC[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)n1
+Clc1cc(ccc1C)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+Clc1cc(ccc1Cl)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+Clc1cc(ccc1c1sc2nnc(n2n1)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-]
+Clc1cc(ccc1c1sc2nnc(n2n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-]
+Clc1cc2c(cc1Cl)nc1cc3c(cc1n2C)c(Cl)c(=O)c1ccccc31
+Clc1cc2cc3c4cc5nc6cc(Cl)c(Cl)cc6n(C)c5cc4c(Cl)c(=O)c3cc2cc1Cl
+Clc1ccc(/C=C/C(=O)[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c(Cl)c1
+Clc1ccc(/C=C/C(=O)[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c(Cl)c1
+Clc1ccc(/C=N/N/C(=N\N=C\c2ccc(Cl)cc2Cl)/N/N=C/c2ccc(Cl)cc2Cl)c(Cl)c1
+Clc1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(Cl)c1
+Clc1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)s1
+Clc1ccc(/C=N\N=C\c2ccc(Cl)cc2)cc1
+Clc1ccc(/C=N\NC(=S)N[C@@H]2CN3CC[C@@H]2CC3)cc1
+Clc1ccc(/C=c/2\sc3nnc(CCC(=O)Nc4cc(Cl)c(Cl)cc4Cl)n3c2=O)c(Cl)c1
+Clc1ccc(/C=c\2/sc3nc4ccccc4n3c2=O)c(Cl)c1
+Clc1ccc(O)c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+Clc1ccc(OCC(=O)O[C@@H]2CN3CC[C@@H]2CC3)cc1
+Clc1ccc([C@@H]2O[C@@H](C)[C@H](C)O2)c(Cl)c1
+Clc1ccc([N+](=O)[O-])c(/C=N/NC(=S)NC23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+Clc1ccc([N+](=O)[O-])c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+Clc1ccc(c(Cl)c1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1
+Clc1ccc(cc1)/C=c/1\sc2nnc(CCC(=O)Nc3c(C)cccc3C)n2c1=O
+Clc1ccc(cc1)/C=c\1/sc2nc(nn2c1=O)c1ccccc1
+Clc1ccc(cc1)/N=N/N1CN2CN(/N=N/c3ccc(Cl)cc3)CN(C2)C1
+Clc1ccc(cc1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1
+Clc1ccc(cc1)C(=O)N/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1
+Clc1ccc(cc1)C(=O)N/N=C/c1ccc(cc1Br)N1CC[C@]2(CCCCC2)CC1
+Clc1ccc(cc1)C(=O)N/N=C/c1ccc(cc1Cl)N1CC[C@@]2(CCCCC2)CC1
+Clc1ccc(cc1)C1CC/C(=C\2/C(=C(O)c3ccccc3C2=O)O)/CC1
+Clc1ccc(cc1)CN[C@H](C)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Clc1ccc(cc1)Cn1c(NC(=O)C(=O)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)nc2ccccc12
+Clc1ccc(cc1)Cn1c(NC(=O)NC23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)nc2ccccc12
+Clc1ccc(cc1)N/N=C/1\C(=O)O[C@H](OC1=O)c1ccccc1
+Clc1ccc(cc1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+Clc1ccc(cc1)S(=O)(=O)/N=C/1\C=C/C(=c\2/sc3ccccc3n2C)/C=C1
+Clc1ccc(cc1)S(=O)(=O)[C@H](C)[C@@H]1OC[C@@]2(CO1)CO[C@@H](OC2)[C@H](C)S(=O)(=O)c1ccc(Cl)cc1
+Clc1ccc(cc1)S(=O)O[Sn@](C)(C)OS(=O)c1ccc(Cl)cc1
+Clc1ccc(cc1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+Clc1ccc(cc1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O
+Clc1ccc(cc1)[C@@H]1N[C@@H](C[C@]2(SS[C@]3(C[C@@H](N[C@@H](C3)c3ccc(Cl)cc3)c3ccc(Cl)cc3)S2)C1)c1ccc(Cl)cc1
+Clc1ccc(cc1)[C@@H]1N[C@H](C[C@@](S)(S)C1)c1ccc(Cl)cc1
+Clc1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Clc1ccc(cc1)[C@@H]1O[C@H](C)[C@@H](C)O1
+Clc1ccc(cc1)[C@@]1(C)OC(=O)/C(=C\c2ccc(s2)[N+](=O)[O-])/C(=O)O1
+Clc1ccc(cc1)[C@@]1(C)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O
+Clc1ccc(cc1)[C@@]1(O)CCN(CC1)C[C@@H]1N2CC[C@H](CC2)C1=O
+Clc1ccc(cc1)[C@@]1(O)CCN(CC1)[C@@H]1C[C@H]1c1ccccc1
+Clc1ccc(cc1)[C@@]1(c2ccccc2)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O
+Clc1ccc(cc1)[C@H]1CC(=O)C[C@@H](c2ccc(Cl)cc2)[C@@]21C(=O)NC(=O)NC2=O
+Clc1ccc(cc1)[C@H]1C[C@@]2(SS[C@]3(C[C@@H](c4ccc(Cl)cc4)N([C@@H](C3)c3ccc(Cl)cc3)C(=O)C(F)(F)F)S2)C[C@@H](c2ccc(Cl)cc2)N1C(=O)C(F)(F)F
+Clc1ccc(cc1)[C@H]1N(CC/N=C\c2ccc(Cl)cc2)CCN1CC/N=C\c1ccc(Cl)cc1
+Clc1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Clc1ccc(cc1)[C@]1(C)OC(=O)/C(=C/c2ccc(s2)[N+](=O)[O-])/C(=O)O1
+Clc1ccc(cc1)[C@]1(C)O[C@@H](C)[C@H](C)O1
+Clc1ccc(cc1)c1nc2=C(N)N=[S@](=O)(O)N=c2nc1c1ccc(Cl)cc1
+Clc1ccc(cc1)c1nc2cc(ccc2[nH]1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Clc1ccc(cc1)c1nnc(o1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Clc1ccc(cc1)c1nnn(C)n1
+Clc1ccc(cc1)c1sc2nnc(n2n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Clc1ccc(cc1)n1c(=S)[nH]nc1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Clc1ccc(cc1Cl)[C@@H]1OC[C@]2(CO1)CO[C@@H](OC2)c1ccc(Cl)c(Cl)c1
+Clc1ccc2CN3Cc4ccc(Cl)cc4[C@@H](C3)c2c1
+Clc1ccc2Sc3ccccc3N([C@@H]3C[C@H](C3)N(C)C)c2c1
+Clc1ccc2[nH]cc(C(=O)C(=O)N[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c2c1
+Clc1ccc2c(NO[N+]2[O-])c1
+Clc1ccc2c([N+](=O)[O-])c3cc(C)[n+]([O-])nc3n2n1
+Clc1ccc2c(c1)CN1Cc3cc(Cl)ccc3[C@H]2C1
+Clc1ccc2c(c1)[C@@H]1[C@H]3c4ccccc4[C@H](c4ccccc34)[C@H]2c2ccccc12
+Clc1ccc2c(c1)[C@H](NC(=O)[C@@]13C[C@H]4C[C@H](C[C@H](C4)C3)C1)c1cc(Cl)cc(Cl)c21
+Clc1ccc2c(c1)[C@H](N[C@]13C[C@@H]4C[C@@H](C[C@@H](C4)C3)C1)c1cc(Cl)cc(Cl)c21
+Clc1ccc2c(c1)[n+]([O-])c1c3oc4CCCCc4c3ccc1[n+]2[O-]
+Clc1ccc2c(c1)[n+]([O-])c1c3oc4ccccc4c3ccc1[n+]2[O-]
+Clc1ccc2c(c1)c(cc1nc3cc4nc5cc(c6ccccc6)c6cc(Cl)ccc6n5c(=O)c4cc3c(=O)n21)c1ccccc1
+Clc1ccc2c(ccnc2c1)/C=C/1\N2CC[C@H](CC2)C1=O
+Clc1ccc2c(ccnc2c1)N[C@H]1CC[C@@H](CC1)N1CCCCC1
+Clc1ccc2c(ccnc2c1)N[C@H]1CC[C@@H](CC1)N1CCOCC1
+Clc1ccc2c(ccnc2c1)N[C@H]1CC[C@H](CC1)NC1CCCCC1
+Clc1ccc2c(cnc3ccccc23)n1
+Clc1ccc2c(no[n+]2[O-])c1
+Clc1ccc2cc3cc(C)[n+]([O-])nc3n2n1
+Clc1ccc2n[se]nc2c1
+Clc1ccc2n[se]nc2n1
+Clc1ccc2nc(Oc3ccccc3)nc(=O)n2n1
+Clc1ccc2nc3ccccc3c(=O)n2n1
+Clc1ccc2nncn2n1
+Clc1ccc2nnnn2n1
+Clc1ccc2nsnc2c1
+Clc1ccc2nsnc2c1Cl
+Clc1ccc2nsnc2c1NC1=NCCN1
+Clc1ccc2nsnc2n1
+Clc1ccc2oc(=O)c(cc2c1)C(=O)Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Clc1cccc(/N=C/c2ccc(cc2)N2CC[C@@]3(CCCCC3)CC2)c1
+Clc1cccc(Cl)c1C[N@+]12CN3CN(CN(C3)C2)C1
+Clc1cccc(c1)C(=O)N/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1
+Clc1cccc(c1)N/C(=[N+]\1/[C@H](C)CCC[C@H]1C)/c1ccccc1
+Clc1cccc(c1)NC(=O)ON1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)[C@@H](Cl)[C@H](Cl)[C@@]2(Cl)[C@@]1(Cl)Cl
+Clc1cccc(c1)c1nc2cccc3c4cccnc4Cn1c23
+Clc1cccc2c1[C@](O)(c1ccccc1)c1c(Cl)cccc1[C@@]2(O)c1ccccc1
+Clc1ccccc1/C=C/CN1CC[C@](O)(CC1)c1ccccc1
+Clc1ccccc1/C=N/N/C(=N\N=C\c1ccccc1Cl)/N/N=C/c1ccccc1Cl
+Clc1ccccc1OP(=O)(Oc1ccccc1Cl)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Clc1ccccc1[C@@H](/N=C/c1ccccc1Cl)/N=C/c1ccccc1Cl
+Clc1ccccc1c1[nH]c2ccc(cc2n1)C12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1
+Clc1cnn2cnnc2c1N
+Clc1cnn2nnnc2c1N
+Clc1nc(Cl)c2n[se]nc2c1Cl
+Clc1nc(Cl)c2nsnc2c1
+Clc1nc(Cl)nc(c1)O[C@@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3
+Clc1nc(Cl)nc(c1)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Clc1nc(Cl)nc(n1)N[C@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Clc1nc(N)nc(c1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Clc1nc(nc(n1)N[C@@]12C[C@H]3C[C@@H](C[C@H](C3)C2)C1)N[C@@]12C[C@H]3C[C@@H](C[C@H](C3)C2)C1
+Clc1nc2cc3c(oc4ccccc34)cc2n2cccc12
+Clc1nc2cn[nH]c2c(n1)N(C)C
+Clc1nnn(n1)c1ccccc1
+Clp1[nH]c2ncncc2[nH]1
+Cn1c(=O)n(C)c(=O)c2c1nc1sc3ncccc3c(=O)n21
+Cn1c(=O)n2n(c1=O)[C@H]1[C@H]3[C@H]4[C@@H]2[C@]25COC[C@@]15[C@@H]3[C@@H]42
+Cn1c2c(nc3sc4ccccc4c(=N)n23)c(=O)n(C)c1=O
+Cn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2cc3ccccc3cc12
+Cn1c2cc3ccccc3cc2n(C)c2cc3ccccc3cc12
+Cn1c2ccccc2c2c3sc4c5c(sc4c3sc2c1=O)c(=O)n(C)c1ccccc51
+Cn1c2ccccc2c2cnn3c(nnc3c12)c1ccccc1
+Cn1c2ccccc2c2cnn3cnnc3c12
+Cn1cc[n+](c1)[Pt+2]12[n+]3ccccc3c3cccc(=c4cccc[n+]14)[n+]23.[O-][Cl](=O)(=O)=O
+Cn1cc[n+](c1)[Pt+2]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23.[O-][Cl](=O)(=O)=O
+Cn1nnc(n1)c1nnn(C)n1
+F/C(=C(\F)/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)/C(F)(F)C(F)(F)C(F)(F)C(F)(F)C(F)(F)F
+F/C(=C(\F)/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)/C(F)(F)C(F)(F)C(F)(F)C(F)(F)C(F)(F)F
+FC(F)(Cl)C(O)([C@@H]1CCC/C/1=N/N=C/1\CCC[C@H]1C(O)(C(F)(F)Cl)C(F)(F)Cl)C(F)(F)Cl
+FC(F)(F)/C(=N\Nc1ccccc1)/SS/C(=N\Nc1ccccc1)/C(F)(F)F
+FC(F)(F)C(F)(F)/C(=N/Nc1ccccc1)/SS/C(=N/Nc1ccccc1)/C(F)(F)C(F)(F)F
+FC(F)(F)C1=C([S+]2[Co]34(SC(=C([S+]4[Co]42(S1)SC(=C(S4)C(F)(F)F)C(F)(F)F)C(F)(F)F)C(F)(F)F)SC(=C(S3)C(F)(F)F)C(F)(F)F)C(F)(F)F
+FC(F)(F)C1=C([S+]2[Fe]34(SC(=C([S+]4[Fe]42(S1)SC(=C(S4)C(F)(F)F)C(F)(F)F)C(F)(F)F)C(F)(F)F)SC(=C(S3)C(F)(F)F)C(F)(F)F)C(F)(F)F
+FC(F)(F)S(=O)(=O)[O-].c1ccc(cc1)C1=C2C=CC3=C(c4ccccc4)C4=[N+]5C(=C(c6ccccc6)C6=CC=C7C(=C8C=CC1=[N+]8[Zn@@+2]5([NH+]67)[NH+]23)c1cc[n+](cc1)[Pt+2]([n+]1ccc(cc1)C1=C2C=CC3=[N+]2[Zn@@+2]25[NH+]6C1=CC=C6C(=C1C=CC(=[N+]51)C(=C1C=CC(=C3c3ccccc3)[NH+]21)c1ccccc1)c1ccccc1)([n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)[n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)C=C4
+FC(F)(F)S(=O)(=O)[O-].c1ccc(cc1)C1=C2C=CC3=C(c4ccccc4)C4=[N+]5C(=C(c6ccccc6)C6=CC=C7C(=C8C=CC1=[N+]8[Zn@@+2]5([NH+]67)[NH+]23)c1cc[n+](cc1)[Pt@@+2]([n+]1ccc(cc1)C1=C2C=CC3=[N+]2[Zn@@+2]25[NH+]6C1=CC=C6C(=C1C=CC(=[N+]51)C(=C1C=CC(=C3c3ccccc3)[NH+]21)c1ccccc1)c1ccccc1)([n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)[n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)C=C4
+FC(F)(F)[C@@H]1CC[C@@H](CC1)[C@@]1(O)[C@@H]2CC[C@H]1C=C2
+FC(F)(F)[Co]12345(N6CCCN6[B+3]([n+]6[n-]ccc6)[n+]6cccn16)C1C4=C3C2=C51
+FC(F)(F)[Co]12345(n6cccn6[B+3]([n+]6[n-]ccc6)[n+]6cccn16)C1=C3C4=C2C51
+FC(F)(F)[S@@](=O)(=[OH+])[O-].CC12=C3(C)C4(=C5(C)C1(C)[Ru+]167892345C2=C1C7=C9(C#CC13=C4C5=C7C9=C1[Ru+]1%10%11%1234579C3(=C1(C)C%11(C)C%10(=C%123C)C)C)C8=C62)C
+FC(F)(F)[S@@](=O)(=[OH+])[O-].CC12=C3(C)C4(=C5(C)C1(C)[Ru+]167892345C2=C6C8=C9(C#CC34=C5C6=C8C9=C3[Ru+]3%10%11%1245689C4(=C3(C)C%11(C)C%10(=C%124C)C)C)C7=C12)C
+FC(F)(F)[S@@](=O)(=[OH+])[O-].CC12=C3(C)C4(=C5(C)[C@@]1(C)[Ru+]167892345C2=C6C8=C9(/N=N/C34=C5C6=C8C9=C3[Ru+]3%10%11%1245689C4(=C3(C)[C@@]%11(C)C%10(=C%124C)C)C)C7=C12)C
+FC(F)(F)[S@@](=O)(=[OH+])[O-].CC12=C3(C)C4(=C5(C)[C@]1(C)[Ru+]167892345C2=C1C7=C9(/C=C/C13=C4C5=C7C9=C1[Ru+]1%10%11%1234579C3(=C1(C)[C@]%11(C)C%10(=C%123C)C)C)C8=C62)C
+FC(F)(F)c1ccc(cc1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+FC(F)(F)c1ccc(cc1)[C@H]1ON=C(c2ccccc2)N1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+FC(F)(F)c1ccc2[C@@H]3c4ccccc4[C@H](c2c1)c1ccccc31
+FC(F)(F)c1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+FC(F)(F)c1cccc(c1)[C@@]1(O)CCN(CC1)[C@@H]1C[C@H]1c1ccccc1
+FC(F)(F)c1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+FC(F)(F)c1nnn(n1)[Au]P(c1ccccc1)(c1ccccc1)c1ccccc1
+FC(F)([Co]12345(n6cccn6[BH+3][n+]6cccn16)C1=C3C4=C2C51)C(F)(F)F
+FC(F)Oc1ccccc1[C@H]1C(=C(C)NC(=C1C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C)C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+FC1=C(F)C(=C(F)C(=[C-]1[Au+][NH+]1P([Au+]P(c2ccccc2)(c2ccccc2)[NH+]([Au+][C-]2=C(F)C(=C(F)C(=C2F)F)F)P([Au+]P1(c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1)F)F
+FC1=[C-]([Au+][NH+]2P([Au+]P(c3ccccc3)(c3ccccc3)[NH+]([Au+][C-]3=C(F)C(=C(F)C(=C3F)F)F)P([Au+]P2(c2ccccc2)c2ccccc2)(c2ccccc2)c2ccccc2)(c2ccccc2)c2ccccc2)C(=C(F)C(=C1F)F)F
+FCCN(N=O)C(=O)N[C@@H]1CC[C@@H](CC)CC1
+FCCN(N=O)C(=O)N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1
+FCCN(N=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+FCCNC(=O)N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1
+FCCNC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+FCCNC(=O)N[C@H]1CC[C@@H](CC1)NC(=O)NCCF
+FS(=O)(=O)[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+F[B-](F)(F)F.C12=C3C4=C5[C@@H]1[Fe+]16782345C2=C6C7=C1[C@@H]82
+F[B-](F)(F)F.C12=C3C4=C5[C@@H]1[Fe+]16782345C2=C6C7=C1[C@H]82
+F[B-](F)(F)F.[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[C@H+]([C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+F[B-](F)(F)F.[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[CH+]([C@@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+F[C@@H]1O[C@]1(F)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+F[C@]1(C(F)(F)F)C(F)(F)[C@](F)(F)C(F)(F)[C@@](F)(C(F)(F)F)[C@@]1(F)F
+Fc1c(F)c(F)c(c(F)c1F)[C@]1(O)[C@@H]2CC[C@H]1CC2
+Fc1c(F)c(c(F)c(F)c1[C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)[C@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82
+Fc1ccc(/C=C/C(=O)Nc2cccc(NC(=O)/C=C\c3ccc(F)cc3)n2)cc1
+Fc1ccc(F)c(/C=C/C(=O)N2CC[C@H](CC2)[C@@H](Cc2ccccc2)N(C)C(=O)C(C)C)c1
+Fc1ccc(NCCNC(=O)[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)cc1
+Fc1ccc(cc1)/C=C/C(=O)N1CC[C@@]2(CC1)N(CN(C)C2=O)c1ccccc1
+Fc1ccc(cc1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Fc1ccc(cc1)C(=O)C[N@+]12CN3CN(CN(C3)C2)C1
+Fc1ccc(cc1)C(=O)N[C@H]1CCN(CC1)C(=O)[C@H](C)Sc1ccc(Cl)cc1
+Fc1ccc(cc1)C(C(=O)N[C@H]1CN2CC[C@@H]1CC2)c1ccc(F)cc1
+Fc1ccc(cc1)CSc1nnc(n1C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Fc1ccc(cc1)N(CCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Fc1ccc(cc1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Fc1ccc(cc1)NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Fc1ccc(cc1)O/C=C\1/N2CC[C@@H](CC2)C1=O
+Fc1ccc(cc1)[C@@]1(C)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O
+Fc1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Fc1ccc(cc1)c1[nH]c(cc1c1ccncc1)[C@H]1CC[NH+](CC1)C[C@H]1[NH2+]C[C@H](O)C1
+Fc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+Fc1cccc(/N=C/c2ccc(cc2)N2CC[C@@]3(CCCCC3)CC2)c1
+Fc1cccc(c1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Fc1cccc(c1)c1nnn(C)n1
+Fc1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Fc1ccccc1/C=c\1/sc2nc3ccccc3n2c1=O
+Fc1ccccc1NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Fc1ccccc1c1sc2nnc(n2n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Fc1cnc(nc1O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+I.CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1cccn(COC(=O)C(C)C)c1
+I.CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1cccn(COC(=O)C2CCCCC2)c1
+I.CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1cccn(COC(=O)CC(C)(C)C)c1
+I.CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1cccn(COC(=O)CC(C)C)c1
+I.CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1ccn(COC(=O)C(C)C)cc1
+I.CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1ccn(COC(=O)C2CCCCC2)cc1
+I.CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1ccn(COC(=O)CC(C)(C)C)cc1
+I.CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1ccn(COC(=O)CC(C)C)cc1
+I.CC(C)NC(=O)OCc1c(c2cccn(COC(=O)C(C)(C)C)c2)n2CCCc2c1COC(=O)NC(C)C
+I.CC(C)NC(=O)OCc1c(c2cccn(COC(=O)C3CC3)c2)n2CCCc2c1COC(=O)NC(C)C
+I.CC(C)NC(=O)OCc1c(c2cccn(COC(=O)Cc3ccccc3)c2)n2CCCc2c1COC(=O)NC(C)C
+I.CC(C)NC(=O)OCc1c(c2ccn(COC(=O)C3CC3)cc2)n2CCCc2c1COC(=O)NC(C)C
+I.CC(C)NC(=O)OCc1c(c2ccn(COC(=O)Cc3ccccc3)cc2)n2CCCc2c1COC(=O)NC(C)C
+I.CC(C)NC(=O)OCc1c(c2ccn(cc2)COC(=O)C(C)(C)C)n2CCCc2c1COC(=O)NC(C)C
+I.CC(C)Oc1ccc2[nH]c3c(C)c4ccn(C)cc4c(C)c3c2c1
+I.CCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1
+I.CCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1
+I.CCC(CC)C(=O)OCn1ccc(cc1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C
+I.CCC(CC)C(=O)OCn1cccc(c1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C
+I.CCCC(=O)OCn1ccc(cc1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C
+I.CCCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1
+I.CCCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1
+I.CCCC(=O)OCn1cccc(c1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C
+I.CCCCC(=O)OCn1ccc(cc1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C
+I.CCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1
+I.CCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1
+I.CCCCC(=O)OCn1cccc(c1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C
+I.CCCCCC(=O)OCn1ccc(cc1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12
+I.CCCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1
+I.CCCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1
+I.CCCCCC(=O)OCn1cccc(c1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12
+I.CCCCCCC(=O)OCn1ccc(cc1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12
+I.CCCCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1
+I.CCCCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1
+I.CCCCCCC(=O)OCn1cccc(c1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12
+I.CCCCCCCC(=O)OCn1ccc(cc1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12
+I.CCCCCCCC(=O)OCn1cccc(c1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12
+I.CCOc1ccc2[nH]c3c(C)c4ccn(C)cc4c(C)c3c2c1
+I.COc1ccc2[nH]c3c(C)c4ccn(COC(=O)c5ccccc5)cc4c(C)c3c2c1
+I.Cn1ccc2c(C)c3[nH]c4ccc(OCC(F)(F)F)cc4c3c(C)c2c1
+I.Cn1ccc2c(C)c3[nH]c4ccc(Oc5ccccc5)cc4c3c(C)c2c1
+I.Cn1ccc2c(c1)c(C)c1c3c(ccc(O)c3OCC(F)(F)F)[nH]c1c2C
+I.Cn1cccc(O)c1
+I.O=C(OCn1ccc2c(c1)c(C)c1c([nH]c3ccccc13)c2C)c1ccccc1
+IC.O=C(N1CCN(CC1)C(=O)[C@@H]1C[C@H]2CCN1CC2)[C@@H]1C[C@@H]2CCN1CC2
+IC[C@@H]1OC(=O)C[C@]2(CC=CC[C@@]32OCCO3)C1
+IC[C@@H]1O[C@H](CI)C[S@@](=O)(=O)C1
+IC[C@@]1(C)CO[C@@](OC1)(C1CCCCC1)c1ccccc1
+IP1P2P(c3ccccc13)P(I)c1ccccc21
+I[C-]1C(=[O+][Ru+3]23([O+]=C1C)([O+]=C(C)[C-](I)C(=[O+]2)C)[O+]=C(C)[C-](I)C(=[O+]3)C)C
+I[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(I)C6=C12
+I[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+I[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(I)C6=C12
+I[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+I[C@@H]1[C@@H](I)[C@@H]2C[C@H]1[C@@H]1[C@H]2[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)[C@@]2(Cl)Cl)Cl
+I[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Ic1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(O)c(I)c1
+Ic1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1
+Ic1ccc(/C=N\NC(=S)N[C@@H]2CN3CC[C@@H]2CC3)cc1
+Ic1ccc(cc1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1
+Ic1ccc2c(c1)[C@@H]1c3ccccc3[C@H]2c2ccccc12
+Ic1cccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+Ic1ccccc1C[N@+]12CN3CN(CN(C3)C2)C1
+N#C/C(=C(/N)\C#N)/N=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+N#C/C(=C(/N)\C#N)/N=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+N#C/C(=C(\N)/C#N)/N=C/C=N/C(=C(\N)/C#N)/C#N
+N#C/C(=C/1\C=C/C(=N\OC(=O)Nc2ccccc2)/C=C1)/c1ccccc1
+N#C/C(=C/1\C=C/C(=N\OC(=O)c2ccccc2)/C=C1)/c1ccccc1
+N#C/C(=C\1/[SH+][Cu+2]2([SH+]1)[SH+]/C(=C(/C#N)\C(=O)c1ccccc1)/[SH+]2)/C(=O)c1ccccc1.c1ccc(cc1)[AsH](c1ccccc1)(c1ccccc1)c1ccccc1
+N#C/C(=C\C=C\C1CCCCC1)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]
+N#C/C(=C\C=C\C1CCCCC1)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1CC[C@@H](CC1)NC(=O)C)/[C@H]1CC[C@@H](C)CC1
+N#C/C(=C\[C@@H]1CC[C@H](CC1)N(C)C)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1CC[C@H](CC1)N(C)C)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1CC[C@H](CC1)NC(=O)C)/[C@@H]1CC[C@@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1CC[C@H](CC1)NC(=O)C)/[C@H]1CC[C@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1C[C@@H](Br)CC[C@@H]1O)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1C[C@@H](Br)CC[C@@H]1O)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1C[C@H](Br)C[C@H](Br)[C@H]1O)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1C[C@H](Br)C[C@H](Br)[C@H]1O)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1C[C@H](Cl)C[C@H](Cl)[C@H]1O)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1C[C@H](Cl)C[C@H](Cl)[C@H]1O)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@@H]1[C@H](Cl)CCC[C@H]1Cl)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@H]1CC[C@H](CC1)C(C)C)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@H]1CC[C@H](CC1)C(C)C)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]
+N#C/C(=C\[C@H]1[C@H](Cl)CCC[C@H]1Cl)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]
+N#C/C(=C\c1cc(Cl)cc(Cl)c1O)/[C@@H](c1ccc2OCOc2c1)/C(=C/c1cc(Cl)cc(Cl)c1O)/C#N
+N#C/C(=C\c1ccc(O)c(O)c1)/C(=O)N[C@H]1CC[C@@H](CC1)C[C@H]1CC[C@@H](CC1)NC(=O)/C(=C/c1ccc(O)c(O)c1)/C#N
+N#C/C=C\c1cn(cc1/C=C/C#N)S(=O)(=O)c1ccc(C)cc1
+N#C/N=C\1/[SH+][Co+2]2([SH+]1)[SH+]/C(=N/C#N)/[SH+]2.CCC[N+](CCC)(CCC)CCC
+N#C/N=C\1/[SH+][Pt+2]2([SH+]1)[SH+]/C(=N/C#N)/[SH+]2.CCC[N+](CCC)(CCC)CCC
+N#C/N=C\N1CC[C@@H](CC1)Cc1ccccc1
+N#C/N=C\N1C[C@H]2CC[C@H](CC2)C1
+N#CBn1ccc(cc1)C(=O)NNCc1ccc(F)cc1
+N#CBn1ccc(cc1)C(=O)NNCc1ccc(OC)c(OC)c1
+N#CBn1ccc(cc1)C(=O)NNCc1cccc(c1)C(F)(F)F
+N#CBn1ccc(cc1)C(=O)NNCc1ccccc1
+N#CBn1ccc(cc1)C(=O)NN[C@H](C)c1ccc(Cl)cc1Cl
+N#CBn1ccc(cc1)C(=O)NN[C@H](C)c1ccc(OC)cc1OC
+N#CBn1ccc(cc1)C(=O)NN[C@H](C)c1cccc(F)c1
+N#CBn1ccc(cc1)C(=O)NN[C@H](C)c1ccccc1F
+N#CBn1cccc(c1)C(=O)NN[C@H](C)c1ccccc1
+N#CC(=N)N[C@@H]1CC[C@@H](CC1)[C@H]1CC[C@@H](O)CC1
+N#CC(=N)N[C@H]1CC[C@@H](CC1)[C@@H]1CC[C@@H](N)CC1
+N#CC(=c1c2nsnc2c(=C(C#N)C#N)c2nsnc12)C#N
+N#CC(=c1cc/c(=c\2/ccc(=C(C#N)C#N)s2)/s1)C#N
+N#CC(=c1ccc(=C(C#N)C#N)c2nsnc12)C#N
+N#CC(=c1ccc(=C2N3CCC[C@H]3CN2[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1)C#N
+N#CC(C#N)(CC/C(=N\c1ccc(cc1)[N+](=O)[O-])/NC(C)(C)C)CC/C(=N\c1ccc(cc1)[N+](=O)[O-])/NC(C)(C)C
+N#CC(C#N)[C@@H]1c2ccccc2[C@H]([N+](=O)[O-])c2ccccc12
+N#CC(C#N)[C@H]1c2ccccc2[C@@H]([N+](=O)[O-])c2ccccc12
+N#CC(C)(C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+N#CC(C)(C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+N#CC1(C#N)C(C#N)(C#N)[C@@]21CCCC[C@@H]2C
+N#CC1(C#N)C(C#N)(C#N)[C@]21CCCC[C@@H]2Cl
+N#CC1(C#N)C(C)(C)[C@@H](C[Fe]2345(C#[O+])(C#[O+])[C@H]6C4=C3C2=C56)C1(C#N)C#N
+N#CC1(C#N)[C@@H]2CC[C@@H](CC2)C1(C#N)C#N
+N#CC1(C#N)[C@H](C=C[C@@]21OCCCO2)c1ccccc1
+N#CC1(C#N)[C@H]2c3ccccc3[C@H](c3ccccc23)C1(C#N)C#N
+N#CC1=C(C#N)[C@H]2CC[C@@H]1CC2
+N#CC1=C(C)/C(=c\2/o/c(=C\3/C(=O)N(/N=C/c4ccc(Cl)cc4)C(=O)C(=C3C)C#N)/c3nccnc23)/C(=O)N(/N=C/c2ccc(Cl)cc2)C1=O
+N#CCC(=O)N/N=C/1\CCC/C(=N\NC(=O)CC#N)/[C@H]1C(=O)CCCC(=O)Nc1c(C)cccc1C
+N#CCC/N=C/1\C=C/C(=C(/c2ccccc2)\c2ccc(NCCC#N)cc2)/C=C1
+N#CCC/N=C\1/C=C/C(=C(/c2ccc(NCCC#N)cc2)\c2ccc(Cl)cc2Cl)/C=C1
+N#CCC/N=C\1/C=C/C(=C(/c2ccc(NCCC#N)cc2)\c2ccccc2Cl)/C=C1
+N#CCC/[N+](=C/1\C=C/C(=C(/c2ccc(cc2)N(C)CCC#N)\c2ccc(Nc3ccccc3)c3ccccc23)/C=C1)/C
+N#CCC/[N+](=C/1\C=C/C(=C(/c2ccc(cc2)Nc2ccc(cc2)NC(=O)C)\c2ccc(cc2)N(C)CCC#N)/C=C1)/C
+N#CCCCCS[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+N#CCCCC[N@@+]12CN3CN(CN(C3)C2)C1
+N#CCCN1C[C@H]2CC[C@H](CC2)C1
+N#CCCO[C@@H]1[C@@H](OCCC#N)[C@@H](OCCC#N)[C@H](OCCC#N)[C@H](OCCC#N)[C@@H]1OCCC#N
+N#CCC[C@H]1C(=[O+][Cu@]2([O+]=C1C)[O+]=C(C)[C@H](CCC#N)C(=[O+]2)C)C
+N#CC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+N#CC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+N#CN/C(=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/Nc1ccncc1
+N#CN1CC[C@H]2C[C@]3(OCCO3)CC[C@H]2C1
+N#CNc1nc(CCC)c(C)c(n1)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+N#CS[Co]1234([S+]=C([N-][N+]3=C(C)c3cccc[n+]13)N1C[C@@H]3CC[C@@H](CC3)C1)[S+]=C([N-][N+]4=C(C)c1cccc[n+]21)N1C[C@H]2CC[C@H](CC2)C1
+N#CS[Co]1234([S+]=C([N-][N+]3=C(C)c3cccc[n+]13)N1C[C@H]3CC[C@H](CC3)C1)[S+]=C([N-][N+]4=C(C)c1cccc[n+]21)N1C[C@H]2CC[C@H](CC2)C1
+N#C[C@@H](NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccc(OC)c(OC)c1
+N#C[C@@H](N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccccc1C(F)(F)F
+N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@H]1CCc1ccccc1
+N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@H]1c1ccc(Cl)c(Cl)c1
+N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@H]1c1ccc(cc1)[C@@H]1[C@H](C#N)C(=O)NC(=O)[C@H]1C#N
+N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@]1(C)CC(C)C
+N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@]1(CC)c1ccccc1
+N#C[C@@H]1C(=O)NC(=O)[C@H](C#N)[C@@]21CCCC2
+N#C[C@@H]1C(=O)NC(=O)[C@H](C#N)[C@@]21CCN(CC2)Cc1ccccc1
+N#C[C@@H]1C(=O)NC(=O)[C@H](C#N)[C@]21CCCCC2
+N#C[C@@H]1C(=O)NC(=O)[C@H](C#N)[C@]21CCN(C)CC2
+N#C[C@@H]1C[C@@]2(C(=O)C1=O)c1ccccc1c1ccccc21
+N#C[C@@H]1C[C@@]2(CCC1=O)c1ccccc1c1ccccc21
+N#C[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+N#C[C@@H]1C[C@]2(CC/C/1=N\NC(=O)N)c1ccccc1c1ccccc21
+N#C[C@@](CCC(=O)/C=C/c1ccccc1)(CCC(=O)/C=C/c1ccccc1)S(=O)(=O)c1ccc(C)cc1
+N#C[C@@](OC/C=C/c1ccccc1)(OC/C=C/c1ccccc1)c1cc2Cc3cc(cc(Cc4cc(cc(Cc5cc(cc(Cc(c1)c2OC/C=C/c1ccccc1)c5OC/C=C/c1ccccc1)C(C)(C)C)c4OC/C=C/c1ccccc1)[C@@](C#N)(OC/C=C/c1ccccc1)OC/C=C/c1ccccc1)c3OC/C=C/c1ccccc1)C(C)(C)C
+N#C[C@@]1(C)C[C@]2(OCCO2)CC(C)(C)C1
+N#C[C@@]1(NNc2ccccc2)CC[C@@H](CC1)C(C)(C)C
+N#C[C@@]12[C@@H]3[C@@H]4[C@H]2[C@@H]2[C@H]1[C@H]3[C@]42C(=O)N(C)C(C)C
+N#C[C@@]12[C@H]3[C@]4([C@@H]1[C@@]1(C(=O)C(C)(C)C)[C@@H]2[C@]3(C(=O)C(C)(C)C)[C@@]41C(=O)N(C)C(C)(C)C)C(=O)C(C)(C)C
+N#C[C@H](NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1ccccc1
+N#C[C@H](N[C@H](C)c1ccccc1)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+N#C[C@H](c1ccc(cc1)N(C)C)N1CCCN([C@H](C#N)c2ccc(cc2)N(C)C)[C@@H]1c1ccc(cc1)N(C)C
+N#C[C@H](c1ccccc1)/C(=N\NC(=O)C(=O)NN)/C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+N#C[C@H](c1ccccc1)N1CCCN([C@H](C#N)c2ccccc2)[C@H]1c1ccc(cc1)N(C)C
+N#C[C@H]1C(=O)NC(=O)[C@H](C#N)[C@@H]1c1ccc(Cl)cc1Cl
+N#C[C@H]1C(=O)NC(=O)[C@H](C#N)[C@]21c1ccccc1Oc1ccccc21
+N#C[C@H]1C(=[O+][Mn@@]2([O+]=C1C)[O+]=C(C)[C@H](C#N)C(=[O+]2)C)C
+N#C[C@H]1C[C@@]2(OCCO2)CCN1C(=O)c1ccccc1
+N#C[C@H]1C[C@@]2([N+](=O)[O-])c3ccccc3[C@@H]1c1ccccc21
+N#C[C@H]1C[C@@]21c1ccccc1C(=O)c1ccccc21
+N#C[C@H]1C[C@]2([N+](=O)[O-])c3ccccc3[C@H]1c1ccccc21
+N#C[C@H]1[C@@H]2CC[C@]3(OCCO3)C[C@@H]2CCN1C(=O)c1ccccc1
+N#C[C@H]1[C@H](C#N)[C@H]1C#N.N#C[C@@H]1[C@H](C#N)[C@H]1C#N
+N#C[C@](C#N)(CC/C(=N\c1c(Cl)cccc1Cl)/NC(C)(C)C)CC/C(=N\c1c(Cl)cccc1Cl)/NC(C)(C)C
+N#C[C@](C#N)(CC/C(=N\c1ccc(cc1)[N+](=O)[O-])/NC(C)(C)C)CC/C(=N\c1ccc(cc1)[N+](=O)[O-])/NC(C)(C)C
+N#C[C@](c1ccccc1)([C@H](CC(=O)c1ccccc1)c1ccccc1)[C@H](CC(=O)c1ccccc1)c1ccccc1
+N#C[C@]1(/N=N/c2ccccc2)CC[C@@H](CC1)C(C)(C)C
+N#C[C@]1(O)C(C)(C)[C@](O)(C#N)[C@@]1(C)C
+N#C[C@]1(c2oc3ccccc3n2)C(=O)C(=O)N([C@H]2[C@H]3C[C@@H]4C[C@H](C3)C[C@H]2C4)C(=O)C1=O
+N#C[C@]12C(=O)N(C)C(=O)[C@@]1(C#N)[C@]12CCCC1
+N#C[C@]12C(=O)N(C)C(=O)[C@]2(C#N)[C@@]1(C)C
+N#C[C@]12C(=O)NC(=O)[C@]2(C#N)[C@]1(C)C
+N#C[C@]12C(=O)NC(=O)[C@]2(C#N)[C@]21CCCC2
+N#C[C@]12C(=O)NC(=O)[C@]2(C#N)[C@]21CCCCC2
+N#C[C@]12CCCC[C@H]2CC[C@]2(OCCO2)C1
+N#C[C@]12CC[C@H](c3ccccc13)c1ccccc21
+N#C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+N#C[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)N(C)C(C)(C)C
+N#C[C@]12[C@H]3C(=O)C=CC(=O)[C@H]3[C@H](c3ccccc13)c1ccccc21
+N#C[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)N(C(C)C)C(C)C
+N#Cc1c(=O)nc2[nH]n3c(nnc4c3ccc3ccccc43)c2c1c1ccc(Cl)cc1
+N#Cc1c(C)cc(C)n(/N=C/[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c1=O
+N#Cc1c(C)cc(C)n(/N=C/[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c1=O
+N#Cc1c(Cl)cc(cc1Cl)[C@@]1(OS(=O)(=O)c2ccc(C)cc2)[C@@H]2CC[C@H]1CC2
+N#Cc1c(NCCCN2CCOCC2)c2ccccc2n2c1n(C)c1ccccc21.Cc1ccc(cc1)S(=O)(=O)O
+N#Cc1c(NCCCn2cncc2)c2ccccc2n2c1n(C)c1ccccc21.Cc1ccc(cc1)S(=O)(=O)O
+N#Cc1c(NCCc2ccccn2)c2ccccc2n2c1n(C)c1ccccc21.Cc1ccc(cc1)S(=O)(=O)O
+N#Cc1c(NCc2ccco2)c2ccccc2n2c1n(C)c1ccccc21.Cc1ccc(cc1)S(=O)(=O)O
+N#Cc1c(sc2c1c1ccccc1oc1=c2c(=O)c2ccccc2c1=O)NC(=O)C(F)(F)F
+N#Cc1c2c3ccccc3ccn2c2nc3ccccc3nc12
+N#Cc1c[nH]n2c1n[n+]([O-])c1ccc(Cl)cc21
+N#Cc1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+N#Cc1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+N#Cc1ccc2c(ccc3ncccc23)n1
+N#Cc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+N#Cc1cccc(c1)N1C(=O)[C@H]2[C@H]3C=C[C@@H]([C@H]2C1=O)[C@H]1C(=O)N(c2cccc(C#N)c2)C(=O)[C@@H]31
+N#Cc1ccccc1/N=C(\CC[C@](C#N)(C#N)CC/C(=N\c1ccccc1C#N)/NC(C)(C)C)/NC(C)(C)C
+N#Cc1ccccc1c1nc2ccc(N)c3C(=O)c4ccccc4c(n1)c23
+N#Cc1cnc(N)nc1NC[C@]1(COC(=O)C)C[C@@H](CCc2ccccc2)C1
+N#Cc1cnn2c1n[n+]([O-])c1ccc(Cl)cc21
+N#Cc1nnn(n1)c1ccccc1
+N(=C\c1ccc(/C=N\Nc2nc3ccccc3s2)cc1)/Nc1nc2ccccc2s1
+N(=C\c1ccco1)\C[C@H]1CC[C@@H](C/N=C\c2ccco2)CC1
+N.Clc1cc(cc(C(=O)O)c1O)C(=CCC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1cc(Cl)c(O)c(c1)C(=O)O
+N/C(=C\S(=O)(=O)c1ccccc1)/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+N/N=C(\C)/C(=N\N)/C
+N/N=C/1\C(=C\c2ccccc2)\CCC\C1=C/c1ccccc1
+N/N=C/1\C(=N/N)\C(C)(C)C[S@](=O)(=O)CC1(C)C
+N/N=C/1\[C@@H]2CN3CCN(C2)C[C@@]1(C3)c1ccc(cc1)[N+](=O)[O-]
+N/N=C/1\[C@H]2CN3CCN(C2)C[C@]1(C3)c1ccc(cc1)[N+](=O)[O-]
+N/N=C/c1nc2ncnc3ccn1c23
+N/N=C\C=N\N
+N/N=c/1\c2ccccc2c2cc3c(cc12)/c(=N\N)/c1ccccc31
+N1=C[NH+]2[Cu+2]3456N7CCN3CN(CN5CCN4CN(C7)C2=N1)C1=NN=C[NH+]61
+N=C(CSSCC(=N)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+N=C(CSSCC(=N)N[C@@]1(C)CC[C@H](CC1)C(C)(C)C)N[C@@]1(C)CC[C@@H](CC1)C(C)(C)C
+N=C(CSSc1ccccc1)NC[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+N=C(N/N=C/c1cccc(c1)[N+](=O)[O-])C(=N)N/N=C\c1cccc(c1)[N+](=O)[O-]
+N=C(N/N=C/c1ccccc1[N+](=O)[O-])C(=N)N/N=C\c1ccccc1[N+](=O)[O-]
+N=C(N/N=C\c1cccc(c1)[N+](=O)[O-])C(=N)N/N=C/c1cccc(c1)[N+](=O)[O-]
+N=C(N/N=C\c1ccccc1[N+](=O)[O-])C(=N)N/N=C/c1ccccc1[N+](=O)[O-]
+N=C(NCCCCCS[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)CSSCC(=N)NCCCCCS[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1.OS(=O)(=O)O
+N=C(NC[C@@H](C)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)CSS(=O)(=O)O
+N=C(NC[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)CS(=O)(=O)O
+N=C(NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)CSP(=O)(O)O
+N=C(NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)CSS(=O)(=O)O
+N=C(\N(C)/N=C/c1ccccc1)/N(C)/N=C\c1ccccc1
+N=C(\N/N=C/c1cc(Br)cc(Br)c1O)/N/N=C\c1cc(Br)cc(Br)c1O
+N=C(\N/N=C/c1cc(Cl)ccc1O)/N/N=C\c1cc(Cl)ccc1O
+N=C(\N/N=C/c1ccc(C)cc1)/N/N=C\c1ccc(C)cc1
+N=C(\N/N=C/c1ccc(cc1)OCc1cn2ccccc2[n+]1C)/N/N=C\c1ccc(cc1)OCc1cn2ccccc2[n+]1C
+N=C(\N/N=C/c1ccc2OCOc2c1)/N/N=C\c1ccc2OCOc2c1
+N=C(\N/N=C/c1cccc2ccccc12)/N/N=C/c1cccc2ccccc12
+N=C(\N/N=C/c1ccccc1)/N/N=C\c1ccccc1
+N=C(\N/N=C/c1ccccc1O)/N/N=C\c1ccccc1O
+N=C(\N/N=C/c1ccncc1)/N/N=C\c1ccncc1
+N=C(\N/N=C\c1ccc(cc1)c1cn2ccsc2[n+]1C)/N/N=C\c1ccc(cc1)c1cn2ccsc2[n+]1C
+N=C(\N/N=C\c1ccccc1Cl)/N/N=C\c1ccccc1Cl
+N=C1N=C(CS(=O)C)C(=N1)CS(=O)C
+N=C\1/C=C/C(=C(\c2ccc(N)cc2)/c2ccc(N)c(C)c2)/C=C1
+N=C\1/C=C/C(=N\Cc2ccc(N)cc2)/C=C1
+N=C\1/NC(=O)[C@@H](C(=O)N1)c1ccccc1
+N=C\1/N[C@](O)(c2ccccc2)[C@](O)(N1)c1ccccc1
+N=C\1/S[C@]23CCCN3C(=O)[C@@]3(CCCN3C2=O)S1
+N=c1[nH][nH]/c(=S\2/[Pt@@](Cl)(Cl)/S(=c\3/[nH][nH]c(=N)s3)/[Pt@@]2(Cl)Cl)/s1
+N=c1[nH]c(=N)c2c([nH]o[n+]2[O-])n1
+N=c1[nH]c2[nH]c[n+]3c2c(=[S+][Hg]3[C@@]23C4=C5C6=C2[Fe]27893456[C@@H]3C8=C7C2=C93)[nH]1
+N=c1[nH]c2n(c(=O)nc3sc(Nc4ccccc4)nc23)c2sc(Nc3ccccc3)nc12
+N=c1[nH]c2n(c(=S)nc3sc(Nc4ccccc4)nc23)c2sc(Nc3ccccc3)nc12
+N=c1[nH]n2c(nnc(c3ccccc3)c2c2ccccc2)n1
+N=c1[nH]onc1c1n(O)onc1c1no[nH]c1=N
+N=c1ccn(CC(=O)N2CC[C@@]3(CC2)SS[C@]2(CCN(CC2)C(=O)Cn2ccc(=N)[nH]c2=O)S3)c(=O)[nH]1
+N=c1ccn(c(=O)[nH]1)[C@H]1O[C@H](COC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[C@@H](O)[C@@H]1O
+N=c1ccn2c(n1)O[C@H]1[C@H](OC(=O)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)[C@@H](COC(=O)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)O[C@@H]21
+N=c1sc2c([nH]1)c1cccc3cccc2c13
+NC(=N)N/N=C(\C(=O)O)/C(=N\NC(=N)N)/C(=O)O
+NC(=N)N/N=C/1\CC[C@@H](CC1)C1CCCCC1
+NC(=N)N/N=C\1/C(C)(C)/C(=N\NC(=N)N)/[C@@]1(C)C
+NC(=N)N/N=c/1\c(=N/NC(=N)N)\c2cc3ccccc3cc2\c1=N\NC(=N)N
+NC(=N)N/N=c/1\c(=N\NC(=N)N)\c2ccccc2\c1=N\NC(=N)N
+NC(=N)NCCN1C[C@@H]2CC[C@@H](CC2)C1.OS(=O)(=O)O
+NC(=N)SCc1ccc2nsnc2c1
+NC(=N)S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+NC(=N)c1ccc(cc1)/N=N/c1c(C)nc2ccc3c4c(ccc3c2c1O)nc(C)c(/N=N\c1ccc(cc1)C(=N)N)c4O
+NC(=O)N/N=C(\C)/[C@@H]1CC[C@H](CC1)c1ccccc1
+NC(=O)N/N=C/1\CC[C@@H](CC1)C1CCCCC1
+NC(=O)N/N=C/1\CC[C@@H](CC1)c1ccccc1
+NC(=O)N/N=C/1\CC[C@H](CCOC(=O)c2ccccc2)CC1
+NC(=O)N/N=C/1\C[C@@H](C/C(=N\NC(=O)N)/C[C@H](C1)C(=O)O)C(=O)O
+NC(=O)N/N=C\1/C(C)(C)/C(=N\NC(=O)N)/C1(C)C
+NC(=O)N/N=C\1/CC[C@@H](CC1)CC1CCCCC1
+NC(=O)NOC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+NC(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+NC(=O)Oc1ccc(cc1)[C@H]1CC(=O)[C@@H](C(=O)N)C(=O)C1
+NC(=O)[C@@H]1C(=O)NC(=O)[C@H](C(=O)N)[C@@]1(C)C
+NC(=O)[C@@H]1CCN(CC1)/N=N/c1c(C)n[nH]c1C(F)(F)F
+NC(=O)[C@@H]1CC[C@H](CC1)C(C)(C)C.NC(=O)[C@@H]1CC[C@H](CC1)C(C)(C)C
+NC(=O)[C@@H]1C[C@@H](C[C@@H](C1)C(=O)N)C(=O)N
+NC(=O)[C@@]12O[C@H]3C[C@H](C[C@H](C3)O2)O1
+NC(=O)[C@H](OC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccccc1
+NC(=O)[C@H]1C[C@]2(c3ccccn3)c3ccccc3[C@H]1c1ccccc21
+NC(=O)[C@H]1C[C@]21c1ccccc1c1ccccc21
+NC(=O)[C@H]1O[C@]21CCCC2
+NC(=O)c1nnn(n1)c1ccccc1
+NC(=S)N/N=C/1\CC[C@@H](CC1)C1CCCCC1
+NC(=S)N/N=C/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+NC(=S)N/N=C/c1ccc(cn1)OC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+NC(=S)N/N=C/c1nc2ncnc3ccn1c23
+NC(=S)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+NC12=C3C4=C5[Ru+]6789%10234(C1=C56N)C1(C)C9(=C8(C)C7(=C%101C)C)C.FC(F)(F)[S@@](=O)(=[OH+])[O-]
+NC12=C3[Ru+]456789%102(C(=C14)C5=C36N)C1(C)C9(=C8(C)C7(=C%101C)C)C.FC(F)(F)[S@@](=O)(=[OH+])[O-]
+NC1=C(/N=N/c2ccc(cc2)[N+](=O)[O-])C(=N[S@](=O)(=N1)O)N
+NC1=N[S@](=O)(=NC(=C1/N=N/c1ccc(cc1)[N+](=O)[O-])N)O
+NC1=[S+][Fe+2]234([S+]=C(N)c5cccc(=c6cccc[n+]36)[n+]45)[n+]3ccccc3c3cccc1[n+]23.[O-]S(=O)(=O)[O-]
+NC1=[S+][Fe+2]234([S+]=C(N)c5cccc(c6cccc[n+]26)[n+]45)[n+]2ccccc2c2cccc1[n+]32.[O-]S(=O)(=O)[O-]
+NC1=[S+][Fe]234([S+]=C(N)c5cccc(c6cccc[n+]26)[n+]35)[n+]2cccc(c2)c2cccc1[n+]42
+NC1=c2nc(c3ccccc3)c(nc2=N[S@@](=O)(=N1)O)c1ccccc1
+NC1NC(N)C2=C(N)[N+](=O)[C-]3C=CC=CC3=C2N1
+NCC(C)C.[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)B([C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+NCC(C)C.[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)B([C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+NCCCO[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+NCCN1C(=O)[C@@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@@H]2C1=O
+NCCN1C[C@@H]2CC[C@@H](CC2)C1.CC(=O)O
+NCCN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+NCCS[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+NC[C@@H](C)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+NC[C@@H](O)C[N+]1(C[C@H](O)CN[Pt@@+2]21[OH+]C(=O)CC(=O)[OH+]2)Cc1ccccc1.CS(=O)C
+NC[C@@H](O)[C@@H]1O[C@@](C)(C)O[C@@H]1[C@H](O)CN
+NC[C@@H]1CCC[C@@]2(OCCO2)C1
+NC[C@@H]1CC[C@@H]1CN.OB1O[C@H](C)[C@@H](C)[C@@H](C)O1
+NC[C@@H]1C[C@H]2CC[C@@H]1CC2.O=C1C[C@H]2CC[C@]1(CS(=O)(=O)O)C2(C)C
+NC[C@@H]1O[Mo]234O[C@@H](CN)O[Mo]4(O1)(O[C@H](CN)O2)O[C@@H](CN)O3
+NC[C@@]1(N2CCCC2)[C@H]2CCCC[C@H]12
+NC[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+NC[C@@]12[C@@H]3[C@H]4[C@H]5[C@@H]3[C@@H]1[C@H]5[C@@H]24
+NC[C@H](O)CN1C[C@H](O)CN[Pt@]21OC(=O)CC(=O)O2
+NC[C@H](O)C[N+]1(C[C@@H](O)CN[Pt@@]21OC(=O)CC(=O)O2)Cc1ccccc1
+NC[C@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+NC[C@]1(C)C[C@]2(OCCO2)CC(C)(C)C1
+NN1C(=N[NH+]2C1=[S+][Fe@+2]12[Cl-][Fe@@+2]2([S+]=C3N(N)C(=N[NH+]23)c2ccccc2)[Cl-]1)c1ccccc1
+NN1C(=N[NH+]2C1=[S+][Fe@@+2]12[Cl-][Fe@+2]2([S+]=C3N(N)C(=N[NH+]23)c2ccccc2)[Cl-]1)c1ccccc1
+NNC(=O)CSc1n[nH]c(n1)C1=C(C)NO[N+]1[O-]
+NNC(=O)CSc1n[nH]c(n1)c1c(C)no[n+]1[O-]
+NNC(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+NNC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)NN)C6=C12
+NNC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)NN)C6=C12
+NNC(=O)[C@@H]1CC2=C(C1)C[C@@H](C2)C(=O)NN
+NNC(=O)[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+NNC(=O)[C@@H]1[C@@H](C(=O)NN)[C@@H]2c3ccccc3[C@H]1c1ccccc21
+NNC(=O)[C@@H]1[C@@H](C(=O)O)[C@@H]2c3ccccc3[C@H]1c1ccccc21
+NNC(=O)[C@H]1[C@@H](C(=O)NN)[C@@H]1C(=O)NN
+NNC(=O)[C@H]1[C@@H]2CCCC[C@@H]12
+NNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+NNC(=S)N/N=C\1/C(C)(C)/C(=N/NC(=S)NN)/C1(C)C
+NN[C@@]12CC[C@@H](c3ccccc13)c1ccccc21
+NN[C@H](C)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+NN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+NNc1ccc2nccn2n1
+NNc1ccc2nnc(Cl)n2n1
+NNc1nnc2c3ccccc3CCc3cc4cc(C)oc4c1c23
+N[C@@H]1CC(=O)[C@@H](C[C@@H]2C(=O)C[C@H](N)CC2=O)C(=O)C1
+N[C@@H]1CC[C@H](CC1)CC1CCCCCC1.OS(=O)(=O)O
+N[C@@H]1CC[C@H](CC1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1.OS(=O)(=O)O
+N[C@@H]1CC[C@H](CC1)N(C)C.[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-]
+N[C@@H]1CC[C@H](CC1)OC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+N[C@@H]1CC[C@H](CCCC2CCCC2)CC1.OS(=O)(=O)O
+N[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+N[C@@]1(N[C@](N)(C(F)(F)F)C(F)(F)[C@](F)(F)C1(F)F)C(F)(F)F
+N[C@@]12CC[C@@H](c3ccccc13)c1ccccc21
+N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+N[C@H](C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)N.OS(=O)(=O)O
+N[C@H]1CC[C@@H](CC1)C[C@@H]1C[C@H]2CC[C@@H]1C2.OS(=O)(=O)O
+N[C@H]1CC[C@@H](CC1)N(C)C.[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-]
+N[C@H]1CC[C@H](CC1)[C@@H]1CC[C@H](CC1)NC(=N)C(=N)N[C@H]1CC[C@H](CC1)[C@@H]1CC[C@@H](N)CC1
+N[C@]12CC[C@](N)(c3ccccc13)c1ccccc21
+N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+N[Pt](Cl)(Cl)(Cl)(Cl)n1cccc2ccccc12
+N[Pt](Cl)(Cl)(Cl)(Cl)n1csc2ccccc12
+N[Pt](Cl)(Cl)(Cl)(Cl)n1cscc1
+N[Pt](Cl)(Cl)n1csc2ccccc12
+N[Pt](Cl)(Cl)n1cscc1
+Nc1c(/N=N/c2ccc(cc2)c2ccc(cc2)/N=N/c2cc(c3ccccc3c2N)[S@](=O)(=[OH+])[O-])cc(c2ccccc12)[S@@](=O)(=[OH+])[O-].[O-][Pt+2]1([O-])N[C@@H]2CCCC[C@H]2N1
+Nc1c(/N=N/c2ccc(cc2)c2ccc(cc2)/N=N/c2cc(c3ccccc3c2N)[S@](=O)(=[OH+])[O-])cc(c2ccccc12)[S@@](=O)(=[OH+])[O-].[O-][Pt@@+2]1([O-])N[C@@H]2CCCC[C@H]2N1
+Nc1c2nc3ccccc3n2c2nc3ccccc3nc2c1S(=O)(=O)c1ccccc1
+Nc1cc2c(nc3c4ccccc4ccc3[n+]2c2cccc3ccccc23)c2ccccc12.Nc1cc2c(nc3c4ccccc4c(N)cc3[n+]2c2cccc3ccccc23)c2ccccc12
+Nc1ccc(cc1)C(=O)N/N=C/c1ccc(cc1Br)N1CC[C@]2(CCCCC2)CC1
+Nc1ccc(cc1)S(=O)(=O)N[C@@H]1CC[C@@H](CC1)NS(=O)(=O)c1ccc(N)cc1
+Nc1ccc(cc1)S(=O)(=O)N[C@@H]1CC[C@H](CC1)NS(=O)(=O)c1ccc(N)cc1
+Nc1ccc(cc1)S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Nc1ccc(cc1)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Nc1ccc2C[C@@H]3c4ccccc4[C@H](Cc2c1)c1ccccc31
+Nc1ccc2[nH]/c(=[S+]/[Pt@](Cl)(Cl)/[S+]=c\3/[nH]c4ccc(N)cc4s3)/sc2c1
+Nc1ccc2c(c1)[C@@H](N1C[C@@H]3CC[C@@H](CC3)C1)c1ccccc21
+Nc1ccc2n[se]nc2c1
+Nc1ccc2nsnc2c1
+Nc1cccc(c1)[C@]1(C)[C@@H]2C(=O)NC(=O)[C@H]1C(=O)NC2=O
+Nc1ccccn1N
+Nc1cnn2cnnc2c1Cl
+Nc1cnn2nnnc2c1
+Nc1cnn2nnnc2c1Cl
+Nc1nc(Cl)c(N)c(n1)N[C@@]12C[C@H]3C[C@@H](C[C@H](C3)C2)C1
+Nc1nc(N)c2=C(N)[N+](=O)[C-]3C=CC=CC3=c2n1
+Nc1nc(N)c2c(ccc3nc(C)c(C)nc23)n1
+Nc1nc(N)c2nc(S[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(N)nc2n1
+Nc1nc(S)nc(c1)C(=O)N[C@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3
+Nc1nc(nc2nc3c4cccc5cccc(c3nc12)c45)c1ccccc1
+Nc1ncnc2=NC=N[S@@](=O)(=c12)O
+Nn1c2ccccc2nc2c1c1cccc3cccc2c13
+Nn1cccc2ccccc12
+Nn1ccccc1
+O/C=c\1/cc2cc(/C(=N\N)/c3ccccc3)c3nnc(c4ccccc4)c3cc2c1
+O/N=C(/C(=N/NC(=O)Cc1ccccc1)/C)\C(=N\NC(=O)Cc1ccccc1)\C
+O/N=C(/C(=N/NC(=O)c1ccccc1)/C)\C(=N\NC(=O)c1ccccc1)\C
+O/N=C(/C)\[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+O/N=C(/C[N@@+]12CN3CN(CN(C3)C2)C1)\c1ccc(I)cc1
+O/N=C(/C[N@@+]12CN3CN(CN(C3)C2)C1)\c1ccccc1
+O/N=C(\C(=N\O)\[C@H](C#N)c1ccc(Cl)cc1)/[C@H](C#N)c1ccc(Cl)cc1
+O/N=C(\C)/C(=N\O)/C
+O/N=C(\c1ccccc1)/[C@@H]1[C@H](c2ccccc2)[C@H]1/C(=N/O)/c1ccccc1.ClC1=C(c2ccccc2)[C@@H](CC1=O)c1ccccc1
+O/N=C/1\C(=N\NC(=S)N)\CC(C)(C)C\C1=N/NC(=S)N
+O/N=C/1\C(=O)N/C(=N)/NC1=O
+O/N=C/1\C=C/C(=C(\C#N)/c2ccc(Cl)cc2)/C=C1
+O/N=C/1\C=C/C(=N\O)/C2=C1[C@@H]1c3ccccc3[C@@]2(C(=O)OC)c2ccccc12
+O/N=C/1\C=C/C(=N\O)/C2=C1[C@@H]1c3ccccc3[C@H]2c2ccccc12
+O/N=C/1\C[C@@H](c2ccccc2)N(C)[C@@H](C1)c1ccccc1
+O/N=C/1\C[C@@H](c2ccccc2)N(C)[C@@H](C1)c1ccccc1.O=C1C[C@H]2CC[C@]1(CS(=O)(=O)O)C2(C)C
+O/N=C/1\C[C@@H](c2ccccc2)N(N=O)[C@@H](C1)c1ccccc1
+O/N=C/1\C[C@@]2(CC[C@]1(CC2)Cc1ccccc1)N1CCOCC1
+O/N=C/1\C[C@]2(CC[C@@]1(CC2)c1ccccc1)N1CCOCC1
+O/N=C/1\[C@@]2(CCCC=C2)N(O)C(=O)[C@@]21CCCCC2
+O/N=C/1\[C@@]2(CCCC=C2)NC(=O)[C@@]21CCCCC2
+O/N=C/1\[C@](C)(C)/C(=N/O)/[C@@]1(C)C
+O/N=C/1\[C@]2(CCCCC2)N(O)C(=O)[C@@]21CCCCC2
+O/N=C/c1[nH]c(Cc2[nH]c(/C=N\O)c(C)c2C(=O)OCC)c(C(=O)OCC)c1C
+O/N=C/c1cnn(n1)c1ccccc1
+O/N=C/c1nc2ncnc3ccn1c23
+O/N=C\1/C=C/C(=C(/C#N)\c2cccc3ccccc23)/C=C1
+O/N=C\1/C[C@H]2CCCC[C@H]2C/C1=N\O
+O/N=C\1/[C@@H](CCC[C@H]1CN(C)C)CN(C)C
+O/[P@@H](=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)/c1ccccc1
+O/[P@@H](=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/OCC(C)(C)N
+O/[P@H](=N/[N+]1(C)CCCCC1)/NN1CCCCC1
+O1CCN(CC1)[C@@]12O[C@@]3(N4CCOCC4)[C@@H]4[C@H]5C[C@H]([C@@H]6[C@H]5[C@H]3[C@H]26)[C@H]14
+O1CC[N+]2(CC1)Cc1c(ccc3ccccc13)[OH+][Cu@+2]12[Cl-][Cu@@+2]2([OH+]c3ccc4ccccc4c3C[N+]32CCOCC3)[Cl-]1
+O1CC[N+]2(CC1)Cc1c(ccc3ccccc13)[OH+][Cu@@+2]12[Cl-][Cu@+2]2([OH+]c3ccc4ccccc4c3C[N+]32CCOCC3)[Cl-]1
+O1CN2c3nonc3N3COCN4[C@@H]3[C@@H]2N(C1)c1nonc41
+O1C[C@@H]1C[N@@+]12CN3CN(CN(C3)C2)C1
+O1C[C@H]1CN1CC[C@@H](CC1)[C@@H]1CCN(CC1)C[C@H]1OC1
+O1NC2=N[C@H]3N=C4NONC4=N[C@@H]3N=C2N1
+O1[C@@H]2[C@@H]1[C@@H]1O[C@H]1[C@H]1O[C@H]1[C@@H]1O[C@@H]21
+O1[C@@H]2[C@H]3O[C@H]3[C@@H]3O[C@@H]3[C@H]12
+O1[C@H]2[C@@H]1[C@@H]1C[C@H]2[C@@]23O[C@]13[C@@H]1C[C@H]2[C@H]2O[C@@H]12
+O1[Si@@H]2[Si@H]3O[Si@H]3[Si@@H]3O[Si@@H]3[Si@H]12
+O=C(/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1ccco1
+O=C(/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1cccs1
+O=C(/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1ccco1
+O=C(/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1cccs1
+O=C(/C=C/c1ccccc1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(/C=C/c1ccccc1)O[C@@H](COC(=O)/C=C/c1ccccc1)COC(=O)/C=C/c1ccccc1
+O=C(/C=C/c1ccccc1)[C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82
+O=C(/C=C/c1cccnc1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(/C=C/c1cccnc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(/C=C/c1ccco1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(/C=C/c1ccco1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(/C=C/c1cccs1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(/C=C/c1cccs1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(/C=C\1/[C@@]2(CCCC=C2)NC(=O)[C@@]21CCCCC2)c1ccccc1
+O=C(/C=c/1\[nH]c2ccc(cc2nc1NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-])c1ccccc1
+O=C(/C=c/1\[nH]c2ccc(cc2nc1N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-])c1ccccc1
+O=C(/C=c/1\s/c(=C/C(=O)c2ccccc2)/s1)c1ccccc1
+O=C(/N=C\1/C(=O)[C@@]2(CCCCC2)[C@@]2(N=C(OC2=O)c2ccccc2)[C@]21CCCCC2)c1ccccc1
+O=C(/N=S/1\CCCC1)C(Cl)(Cl)Cl
+O=C(C(=O)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1c[nH]c2ccc(cc12)[N+](=O)[O-]
+O=C(C(=O)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1c[nH]c2ccc(cc12)[N+](=O)[O-]
+O=C(C(Cc1ccccc1)Cc1ccccc1)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82
+O=C(C(Cc1ccccc1)Cc1ccccc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82
+O=C(C=P(c1ccccc1)(c1ccccc1)c1ccccc1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(CC(=O)N1N=C(C)[C@H](/N=N/c2ccc(cc2)[S@](=O)(=O)c2ccc(/N=N/[C@H]3C(=NN(C(=O)CC(=O)Nc4ccccc4Cl)C3=O)C)cc2)C1=O)Nc1ccccc1Cl
+O=C(CC(=O)c1ccccc1)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(CC(=O)c1sc(Nc2ccccc2)nc1C)C(=O)N[C@@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3
+O=C(CCC1CCCCC1)O[C@H]1CC[C@H](CC1)C(C)C
+O=C(CCCC(=O)N/N=C(\C)/c1ccccc1)N/N=C(/C)\c1ccccc1
+O=C(CCCCC(=O)N/N=C(/C)\c1ccc(C)cc1)N/N=C(\C)/c1ccc(C)cc1
+O=C(CCCCC(=O)O[C@H](CC[C@@H]1CCCO1)CC[C@H]1CCCO1)O[C@@H](CC[C@@H]1CCCO1)CC[C@@H]1CCCO1
+O=C(CCCCCCC(=O)C[N@+]12CC[C@H](CC1)[C@@H](O)C2)C[N@+]12CC[C@H](CC1)[C@@H](O)C2
+O=C(CCCCCCCCc1ccn2c(=c3cc(C)ccn3[Ru+2]342(n2ccccc2=c2ccccn32)n2ccccc2=c2ccccn42)c1)NC1C2CC3CC(C2)CC1C3
+O=C(CCN(C(C)C)C(C)C)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(CCN1C[C@@H]2CC[C@@H](CC2)C1)c1ccccc1O
+O=C(CCN1C[C@H]2CC[C@H](CC2)C1)c1ccccc1
+O=C(CCN1C[C@H]2CC[C@H](CC2)C1)c1ccco1
+O=C(CCN1C[C@H]2CC[C@H](CC2)C1)c1cccs1
+O=C(CCSCCC(=O)N/N=C(/C)\c1ccc(cc1)OC(=O)C)N/N=C(\C)/c1ccc(cc1)OC(=O)C
+O=C(CCSCCC(=O)N/N=C(/C)\c1ccc(cc1)OS(=O)(=O)C)N/N=C(\C)/c1ccc(cc1)OS(=O)(=O)C
+O=C(CCSCCC(=O)N/N=C(/C)\c1ccccc1)N/N=C(\C)/c1ccccc1
+O=C(CCSCCC(=O)N/N=C(/C)\c1ccccc1O)N/N=C(\C)/c1ccccc1O
+O=C(CC[C@@H](C)[C@H]1CC[C@@H]2[C@@H]3CC[C@@H]4C[C@@H](O)CC[C@@]4(C)[C@@H]3C[C@@H](O)[C@@]12C)Nc1ccc(cc1)[S@](=O)(=O)c1ccc(cc1)NC(=O)CC[C@H](C)[C@@H]1CC[C@@H]2[C@@H]3CC[C@@H]4C[C@@H](O)CC[C@@]4(C)[C@@H]3C[C@@H](O)[C@@]12C
+O=C(CCc1ccccc1)N[C@@H]1CC[C@@H](CC1)c1ccc(O)c(C)c1
+O=C(CCc1n[nH]c2s/c(=C/c3ccccc3[N+](=O)[O-])/c(=O)n12)Nc1cc(Cl)c(Cl)cc1Cl
+O=C(CCc1n[nH]c2s/c(=C\c3ccc(cc3)[N+](=O)[O-])/c(=O)n12)Nc1ccc(Cl)c(Cl)c1
+O=C(CCc1n[nH]c2s/c(=C\c3cccc(c3)[N+](=O)[O-])/c(=O)n12)Nc1ccc(C)cc1
+O=C(CCc1nnc2s/c(=C/c3ccccc3[N+](=O)[O-])/c(=O)n12)Nc1cc(Cl)c(Cl)cc1Cl
+O=C(CCc1nnc2s/c(=C\C=C\c3ccccc3)/c(=O)n12)Nc1ccc(C)cc1
+O=C(CCc1nnc2s/c(=C\c3ccc(Cl)c(Cl)c3)/c(=O)n12)Nc1ccc(Cl)c(Cl)c1
+O=C(CCc1nnc2s/c(=C\c3ccc(cc3)N(C)C)/c(=O)n12)Nc1c(C)cccc1C
+O=C(CCc1nnc2s/c(=C\c3ccc(cc3)[N+](=O)[O-])/c(=O)n12)Nc1ccc(Cl)c(Cl)c1
+O=C(CCc1nnc2s/c(=C\c3ccc4OCOc4c3)/c(=O)n12)Nc1cc(Cl)ccc1Cl
+O=C(CCc1nnc2s/c(=C\c3cccc(c3)[N+](=O)[O-])/c(=O)n12)Nc1ccc(C)cc1
+O=C(CCc1nnc2s/c(=C\c3ccccc3)/c(=O)n12)Nc1cc(Cl)ccc1Cl
+O=C(CCc1nnc2s/c(=C\c3ccccc3Cl)/c(=O)n12)Nc1cc(Cl)ccc1Cl
+O=C(CN1CCN(CC1)c1ccccn1)O[C@H]1[C@@H](OC(=O)CN2CCN(CC2)c2ccccn2)[C@H](OC(=O)CN2CCN(CC2)c2ccccn2)[C@H](OC(=O)CN2CCN(CC2)c2ccccn2)[C@@H](OC(=O)CN2CCN(CC2)c2ccccn2)[C@H]1OC(=O)CN1CCN(CC1)c1ccccn1
+O=C(CN1C[C@@H]2CC[C@@H](CC2)C1)N1c2ccccc2NC(=O)C1(C)C
+O=C(CNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC[C@H]1CC1(Cl)Cl
+O=C(COC(=O)c1ccc2c(c1)C(=O)N(c1ccc(Cl)cc1)C2=O)N[C@H]1CC[N@@H+](CC1)C1CC1
+O=C(COc1ccc(Cl)cc1Cl)O[C@H]1[C@H](OC(=O)COc2ccc(Cl)cc2Cl)[C@@H](OC(=O)COc2ccc(Cl)cc2Cl)[C@H](OC(=O)COc2ccc(Cl)cc2Cl)[C@@H](OC(=O)COc2ccc(Cl)cc2Cl)[C@@H]1OC(=O)COc1ccc(Cl)cc1Cl
+O=C(CSCC(=O)N/N=C(\C)/c1ccccc1)N/N=C(/C)\c1ccccc1
+O=C(C[C@](O)(CCc1ccccc1)c1ccccc1)N1CC[C@@](O)(CC1)c1ccccc1
+O=C(C[N+]12CN3CN(CN(C3)C2)C1)c1cccc(c1)[N+](=O)[O-]
+O=C(C[N@+]12CN3CN(CN(C3)C2)C1)c1cccc(c1)[N+](=O)[O-]
+O=C(C[N@+]12CN3CN(CN(C3)C2)C1)c1cccc2ccccc12
+O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccc(O)c(O)c1
+O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccc(cc1)c1ccccc1
+O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccc2CCCCc2c1
+O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccc2ccccc2c1
+O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccccc1
+O=C(Cc1ccccc1)C/C(=N/CC/N=C(/C)\CC(=O)Cc1ccccc1)/C
+O=C(Cc1ccccc1)O[C@@H]1CN2CC[C@@H]1CC2
+O=C(Cc1nc2nncn2/c/1=C/C(=O)C(c1ccccc1)c1ccccc1)C(c1ccccc1)c1ccccc1
+O=C(Cc1sc2ccccc2n1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Cn1c(=N)[nH]c2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Cn1c2ccccc2n(CC(=O)NC23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1=N)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(Cn1cc(F)c(=O)[nH]c1=O)N1CC[C@]2(CC1)SS[C@@]1(CCN(CC1)C(=O)Cn1cc(F)c(=O)[nH]c1=O)S2
+O=C(Cn1cnc2n(C)c(=O)n(C)c(=O)c12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(N(C)C(C)(C)C)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)N(C)C(C)(C)C
+O=C(N(C)c1ccccc1)[C@H]1[C@@H]2c3ccccc3[C@@H](c3ccccc23)[C@@H]1C(=O)N(C)c1ccccc1
+O=C(N/N=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)OC(C)(C)C
+O=C(N/N=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1ccccn1
+O=C(N/N=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)OC(C)(C)C
+O=C(N/N=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1ccccn1
+O=C(N/N=C/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccncc1
+O=C(N/N=C/c1ccc(cc1)N(C)C)C(=O)N/N=C\c1ccc(cc1)N(C)C
+O=C(N/N=C/c1ccc(cc1)N1CC[C@@]2(CCCCC2)CC1)c1ccccc1
+O=C(N/N=C/c1ccc(cc1)N1CC[C@@]2(CCCCC2)CC1)c1cccnc1
+O=C(N/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1)c1ccc(Cl)c(Cl)c1
+O=C(N/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1)c1ccccc1O
+O=C(N/N=C/c1ccc(cc1)[N+](=O)[O-])C(=O)N/N=C\c1ccc(cc1)[N+](=O)[O-]
+O=C(N/N=C/c1ccccc1[N+](=O)[O-])C(=O)N/N=C\c1ccccc1[N+](=O)[O-]
+O=C(N/N=C\c1ccc(cc1)[N+](=O)[O-])C(=O)N/N=C/c1ccc(cc1)[N+](=O)[O-]
+O=C(N/N=C\c1ccc(cc1)c1cn2ccccc2[n+]1C)C(=O)N/N=C/c1ccc(cc1)c1cn2ccccc2[n+]1C
+O=C(N/N=C\c1ccccc1[N+](=O)[O-])C(=O)N/N=C/c1ccccc1[N+](=O)[O-]
+O=C(N1C(C)(C)C(C)(C)C(C)(C)C(C)(C)C1(C)C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(N1CCCCC1)[C@@H]1[C@H]2CC[C@H](CC2)[C@H]1C(=O)N1CCCCC1
+O=C(N1CCN(CC1)C(=O)[C@@H]1C[C@@H]2CCN1CC2)[C@@H]1C[C@H]2CCN1CC2
+O=C(N1CCN(CC1)C(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(N1CCOCC1)[C@@H]1[C@H]2CC[C@H](CC2)[C@H]1C(=O)N1CCOCC1
+O=C(N1CCOCC1)[C@]12O[C@@H]3C[C@@H](C[C@@H](C3)O2)O1
+O=C(N1CC[C@]2(CC1)SS[C@@]1(CCN(CC1)C(=O)C(F)(F)F)S2)C(F)(F)F
+O=C(NC(C)(C)CCC(C)(C)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NC(C)(C)[C@H]1CC[C@@](C)(CC1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NC1CCCCC1)N(O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCC(C)(C)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCC1CC1)[C@@H]1[C@@H]2c3ccccc3[C@H]([C@H]1C(=O)O)c1ccccc21
+O=C(NCCC(=O)N)CCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(NCCC(=O)N)CCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(NCCCC(=O)N)CCC[C@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+O=C(NCCCC(=O)NCCC(=O)N)CCNC(=O)CCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(NCCCC(=O)NCCC(=O)N)CCNC(=O)CCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(NCCCCCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCCCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCCCCCNC(=O)N(O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N(O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCCCCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCN(C)C(=O)[C@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1)[C@H]1[C@@H](c2ccccc2)[C@@H]1c1ccccc1
+O=C(NCCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NCCNc1ccccc1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(NCC[N+](C)(C)C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NC[C@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1)CN1[C@@H]2CC[C@H]1C[C@H](O)C2.OC(=O)C(=O)O
+O=C(NCc1ccccc1)[C@@H](C[C@@H](C(=O)NCc1ccccc1)/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C)/C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C
+O=C(NCc1ccccc1)[C@H](C[C@H](C(=O)NCc1ccccc1)/C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C)/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C
+O=C(NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccncc1
+O=C(NNC(=O)[C@H]1[C@H]2CCCC[C@H]12)[C@H]1[C@H]2CCCC[C@H]12
+O=C(NNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NNc1ccccc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(NOC(C)(C)C)N1[C@H]2c3ccccc3[C@@H]1c1ccccc21
+O=C(N[C@@H]1CCCC[C@@H]1NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(N[C@@H]1CC[C@@H](CC1)C(C)C)Nc1ccccc1
+O=C(N[C@@H]1CC[C@@H](CC1)C[C@@H]1CC[C@H](CC1)NC(=O)c1cc(O)c(O)c(O)c1)c1cc(O)c(O)c(O)c1
+O=C(N[C@@H]1CC[C@H](CC1)C(C)(C)C)C(Cl)(Cl)Cl.O=C(N[C@H]1CC[C@@H](CC1)C(C)(C)C)C(Cl)(Cl)Cl
+O=C(N[C@@H]1CC[C@H](CC1)C(C)(C)C)c1ccccc1
+O=C(N[C@@H]1CC[C@H](CC1)C(C)C)Nc1ccccc1.O=C(N[C@H]1CC[C@@H](CC1)C(C)C)Nc1ccccc1
+O=C(N[C@@H]1CC[C@H](CC1)CC1CCCCC1)NC1CCCCC1.O=C(N[C@H]1CC[C@@H](CC1)CC1CCCCC1)NC1CCCCC1
+O=C(N[C@@H]1CC[C@H](CC1)CC1CCCCC1)Nc1cccc(Cl)c1.O=C(N[C@@H]1CC[C@H](CC1)CC1CCCCC1)Nc1cccc(Cl)c1
+O=C(N[C@@H]1CC[C@H](CC1)CC1CCCCC1)c1ccccc1.O=C(N[C@H]1CC[C@@H](CC1)CC1CCCCC1)c1ccccc1
+O=C(N[C@@H]1CC[C@H](CC1)C[C@@H]1CC[C@H](CC1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(N[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21)N[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+O=C(N[C@@H]1[C@@H]2C[C@H]3C[C@@H](C2)C[C@@H]1C3)C(=O)CC(=O)c1c(C)[n+]([O-])c2ccccc2[n+]1[O-]
+O=C(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(F)(F)F
+O=C(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1[n+]([O-])c2ccccc2[n+]([O-])c1N
+O=C(N[C@H]1CC[C@@H](CC1)CC1CCCCC1)C(Cl)Cl.O=C(N[C@@H]1CC[C@H](CC1)CC1CCCCC1)C(Cl)Cl
+O=C(N[C@H]1CC[C@@]21CC2)c1ccc2ccccc2c1
+O=C(N[C@H]1C[C@@]2(OC1=O)C=C(Cl)C(=O)C(=C2)Cl)OC(C)(C)C
+O=C(N[C@H]1[C@@H](c2ccccc2)[C@@H]1c1ccccc1)[C@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1
+O=C(N[C@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3)C(=O)CC(=O)c1c(C)[n+]([O-])c2ccccc2[n+]1[O-]
+O=C(N[C@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3)c1ccncn1
+O=C(N[C@]12CC[C@H](CC1)C2)[C@@]12CC[C@@H](CC1)C2
+O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)/C=C(/Nc1ccccc1O)\c1ccccc1
+O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)Nc1nc2ccccc2n1Cc1ccccc1
+O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)c1c[nH]c2ccccc12
+O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1c(O)c2ccccc2n(C)c1=O
+O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)n1cnc2c(N)ncnc12
+O=C(N[C@]12O[C@@H]3C[C@@H](C[C@@H](C3)O2)O1)N[C@]12O[C@@H]3C[C@@H](C[C@@H](C3)O2)O1
+O=C(Nc1[nH]c2ccccc2n1)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Nc1ccc(CCc2ccc(cc2)NC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Nc1ccc(cc1)C1=NCCN1)[C@H]1CC[C@@H](CC1)C(=O)Nc1ccc(cc1)C1=NCCN1
+O=C(Nc1ccc(cc1)Cc1ccc(cc1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Nc1ccc(cc1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C1CCCCC1
+O=C(Nc1ccc(cc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C1CCCCC1
+O=C(Nc1ccc(cc1)c1ccc(cc1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Nc1ccc(cc1)c1ccccc1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(Nc1ccc(cc1)c1ccccc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(Nc1ccc2c(O)cc(cc2c1)S(=O)(=O)[OH+][Pt@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+]S(=O)(=O)c1cc(O)c2ccc(NC(=O)c3ccccc3)cc2c1)c1ccccc1
+O=C(Nc1ccc2c(c1)Cc1cc(ccc21)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Nc1cccc(c1)C(F)(F)F)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(Nc1cccc2ccccc12)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(Nc1cccc2ccccc12)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(Nc1cccc2cccnc12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Nc1ccccc1)[C@@]1(Br)C[C@]2(C[C@](Br)(C2)C(=O)Nc2ccccc2)C1
+O=C(Nc1ccccc1)c1n[n+](c2cc(ccc2Cl)S(=O)(=O)[O-])n([nH]1)c1ccccc1Cl
+O=C(Nc1ccccc1)c1n[n+](c2cc(ccc2Cl)S(=O)(=O)[O-])n(n1)c1ccccc1Cl
+O=C(Nc1nc2ccccc2n1C)C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(Nc1ncccn1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Nc1nnc(s1)S(=O)(=O)N)C12C[C@H]3C[C@@H](C[C@H](C3)C2)C1
+O=C(Nc1scc(n1)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1cc2cc(ccc2oc1=O)[N+](=O)[O-]
+O=C(Nc1scc(n1)[C@@]12C[C@H]3C[C@H](C[C@@H](C3)C2)C1)[C@@H]1C(=O)N[C@]2(C)Oc3ccccc3[C@@H]1C2
+O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1c(O)c2ccccc2n(C)c1=O
+O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1c(O)nc2ccccc2c1O
+O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1cc2c(ccc3ccccc23)oc1=O
+O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1cc2cc(ccc2oc1=O)[N+](=O)[O-]
+O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1cc2ccccc2oc1=O
+O=C(O/N=C/1\c2ccccc2[C@H](Br)[C@@H](Br)c2ccccc12)c1cc(cc(c1)[N+](=O)[O-])[N+](=O)[O-]
+O=C(O/N=C\1/c2ccccc2[C@H](Br)[C@@H](Br)c2ccccc12)c1cc(cc(c1)[N+](=O)[O-])[N+](=O)[O-]
+O=C(OC(C)(C)C)N[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41NC(=O)OC(C)(C)C
+O=C(OC(C)(C)C)[C@@H]1C(=O)[C@@H](C(=O)OC(C)(C)C)[C@@]23CCCC[C@]13[C@@H](C(=O)OC(C)(C)C)C(=O)[C@H]2C(=O)OC(C)(C)C
+O=C(OC/C=C/1\CN2CC[C@@H]1CC2)[C@](O)(C1CCCC1)c1ccccc1
+O=C(OC12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1)c1ccc(cc1)NCC1=C(Br)C(=O)C=CC1=O
+O=C(OC1=C2CC[C@@]3(OCCO3)[C@@]2(C)CCC21OCCO2)c1ccccc1
+O=C(OCC(Cl)(Cl)Cl)N1[C@@H]2[C@H]3O[C@H]3[C@@H]([C@@H]3O[C@H]23)N1C(=O)OCC(Cl)(Cl)Cl
+O=C(OCCN1CCN(CCCN2c3ccccc3Sc3ccc(cc23)C(F)(F)F)CC1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(OCCN1CCN(CCCN2c3ccccc3Sc3ccc(cc23)C(F)(F)F)CC1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(OC[C@@H]1C[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)C2(Cl)Cl)Cl)[C@H]1[C@@]2(Cl)C(=C(Cl)[C@@](Cl)([C@H]1C(=O)OC[C@@H]1C[C@@]3(Cl)C(=C(Cl)[C@]1(Cl)C3(Cl)Cl)Cl)[C@@]2(Cl)Cl)Cl
+O=C(OC[C@@]12CO[C@@]3(C)CC[C@](C)(OC1)N23)C(O)(c1ccccc1)c1ccccc1
+O=C(OC[C@H]1OCO[C@@H](COC(=O)c2ccccc2)[C@H]2O[C@@](C)(C)O[C@@H]12)c1ccccc1
+O=C(OC[C@]12COCN2COC1)Nc1ccc(Cl)cc1
+O=C(OC[C@]12CO[C@]3(C)CC[C@@](C)(OC1)N23)C(C)(C)C
+O=C(OCc1ccccc1)/N=C/1\C=C/C(=N\C(=O)OCc2ccccc2)/C=C1
+O=C(OCc1ccccc1)NC1=C(C)NO[N+]1[O-]
+O=C(OCc1ccccc1)N[C@@H]1CC[C@@H](CC1)C(=O)O
+O=C(OCc1ccccc1)N[C@H]1C(=O)N[C@@H](CCc2ccccc2)NC1=O
+O=C(OCc1ccccc1)N[C@H]1C[C@@]2(OC1=O)C=C(I)C(=O)C(=C2)I
+O=C(OCc1ccccc1)Nc1c(C)no[n+]1[O-]
+O=C(OCc1ccccc1)[C@@H](N[Pd@](Cl)(Cl)N[C@H](C(=O)OCc1ccccc1)c1ccccc1)c1ccccc1
+O=C(OCc1ccccc1)[C@@H](N[Pt@](Cl)(Cl)N[C@H](C(=O)OCc1ccccc1)c1ccccc1)c1ccccc1
+O=C(ON[C@@H]1CC[C@H](CC1)CC1CCCCC1)c1ccccc1
+O=C(O[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C(O)(c1ccccc1)c1ccccc1
+O=C(O[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C(O)(c1ccccc1)c1ccccc1
+O=C(O[C@@H](COC(=O)c1ccccc1)[C@@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1
+O=C(O[C@@H](COC(c1ccccc1)(c1ccccc1)c1ccccc1)[C@@H]1O[C@@](C)(C)O[C@H]1[C@H](COC(c1ccccc1)(c1ccccc1)c1ccccc1)OC(=O)c1ccccc1)c1ccccc1
+O=C(O[C@@H](CO[C@H]1O[C@@H](COC(=O)c2ccccc2)[C@H](OC(=O)c2ccccc2)[C@@H](OC(=O)c2ccccc2)[C@H]1OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)[C@@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1
+O=C(O[C@@H]([C@@H]1O[C@@H](OC[C@H]1OC(=O)c1ccccc1)c1ccccc1)[C@@H]1O[C@@H](OC[C@H]1OC(=O)c1ccccc1)c1ccccc1)c1ccccc1
+O=C(O[C@@H]([C@H](COC(=O)c1ccccc1)OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1
+O=C(O[C@@H]([C@H](COC(=O)c1ccccc1)OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1
+O=C(O[C@@H]1C(C)(C)OC(=O)[C@@]21c1ccccc1c1ccccc21)c1ccc(cc1)[N+](=O)[O-]
+O=C(O[C@@H]1C(C)(C)OC(=O)[C@]21c1ccccc1c1ccccc21)c1ccc(cc1)[N+](=O)[O-]
+O=C(O[C@@H]1C(C)(C)[C@H](OC(=O)C(Cl)(Cl)Cl)[C@@]1(C)C)C(Cl)(Cl)Cl
+O=C(O[C@@H]1CCC=C(C)[C@@]21CCCC2)c1cc(cc(c1)[N+](=O)[O-])[N+](=O)[O-]
+O=C(O[C@@H]1CCC=C(C)[C@]21CCCC2)c1cc(cc(c1)[N+](=O)[O-])[N+](=O)[O-]
+O=C(O[C@@H]1CC[C@@H](CC1)C(C)(C)C)[C@H]1CC[C@H](CC1)C(C)(C)C
+O=C(O[C@@H]1CC[C@H](CC1)C(C)(C)C)c1ccc(cc1)[N+](=O)[O-]
+O=C(O[C@@H]1CC[C@H](CC1)C(C)(C)C)c1ccccc1
+O=C(O[C@@H]1CC[C@H](CC1)[Si](C)(C)C)c1ccccc1
+O=C(O[C@@H]1CN2CC[C@@H]1CC2)CC(=O)c1ccccc1
+O=C(O[C@@H]1CN2CC[C@H]1CC2)[C@@](O)(Cc1ccccc1)C1CC1
+O=C(O[C@@H]1C[C@H]2C=C[C@@H]1[C@@]12CC1)c1ccccc1C(=O)O
+O=C(O[C@@H]1[C@@H](OC(=O)C(Cl)Cl)[C@H](OC(=O)C(Cl)Cl)[C@@H](OC(=O)C(Cl)Cl)[C@H](OC(=O)C(Cl)Cl)[C@H]1OC(=O)C(Cl)Cl)C(Cl)Cl
+O=C(O[C@H]([C@H](COC(=O)c1ccccc1)OC(=O)c1ccccc1)[C@@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1
+O=C(O[C@H]1CC[C@@H](CC1)C(C)(C)C)c1ccc(cc1)[N+](=O)[O-]
+O=C(O[C@H]1CN2CC[C@@H]1CC2)[C@H](c1ccccc1)C1(O)CCCC1
+O=C(O[C@H]1CN2CC[C@H]1CC2)[C@@](O)(c1ccccc1)c1cccc2CC(C)(C)Oc12
+O=C(O[C@H]1[C@H](COC(=O)c2ccccc2)O[C@@H](c2nn[nH]n2)[C@@H]1OC(=O)c1ccccc1)c1ccccc1
+O=C(O[C@H]1[C@H]2CCN(CC2)[C@H]1CN1CCC(=CC1)c1ccccc1)C(O)(c1ccccc1)c1ccccc1
+O=C(O[C@]12CCCC[C@@H]2[C@@]2(CCCCC2)N=N1)c1ccccc1
+O=C(O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC(C)(C)C(=O)O
+O=C(O[Sn@@](OC(=O)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)(c1ccccc1)c1ccccc1)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+O=C(Oc1ccc(cc1)[N+](=O)[O-])CN(C(=O)OC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)OC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(Oc1ccc(cc1)[N+](=O)[O-])CN(C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(Oc1ccccc1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(Sc1ccccc1)[C@H]1O[C@@]21CCCCC2
+O=C([C@H]1CC[C@@H](CC1)c1ccccc1)c1ccccc1
+O=C([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+O=C([OH+][Ti]12345678([OH+]C(=O)C(F)(F)C(F)(F)F)(C9=C3C2=C1[C@H+]49)C1=C6C7=C5[C@@H+]81)C(F)(F)C(F)(F)F
+O=C(c1ccccc1)N1S(=O)[C@@]2(c3ccccc3c3ccccc23)C(C)(C)[C@H]1N1CCCC1
+O=C(c1ccccc1)N1S[C@]2(c3ccccc3c3ccccc23)C(C)(C)[C@H]1N1CCCC1
+O=C(c1ccccc1)[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@-]9(C(=O)c2ccccc2)C7=C41
+O=C(c1ccccc1)[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@@-]9(C(=O)c2ccccc2)C7=C41
+O=C(c1ccccc1)[C@-]12[Ru+2]3456789(C(=C26)C3=C15)C1=C8[C@@-]9(C(=O)c2ccccc2)C7=C41
+O=C(c1ccccc1)[C@@-]12[Ru+2]3456789(C(=C26)C3=C15)C1=C8[C@-]9(C(=O)c2ccccc2)C7=C41
+O=C(c1ccccc1)[C@@H]1C(=[O+][Cu@@]2([O+]=C1c1ccccc1)[O+]=C(c1ccccc1)[C@@H](C(=O)c1ccccc1)C(=[O+]2)c1ccccc1)c1ccccc1
+O=C(c1ccccc1)[C@@H]1[C@@H](N=N[C@@]21c1ccccc1Oc1ccccc21)c1ccccc1
+O=C(c1ccccc1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(c1ccccc1)[C@H]1[C@H](/C=C/c2ccccc2)[C@@H](C(=O)c2ccccc2)[C@H]1/C=C/c1ccccc1
+O=C(c1ccccc1)c1ccc2[nH]c(=O)c3ccccc3ssc3ccccc3c(=O)[nH]c2c1
+O=C(c1ccccc1)c1ccc2n[se]nc2c1
+O=C(c1ccccc1)c1ccccc1NC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C(c1ccccc1)n1c(Cc2ccccc2)nc2cc(ccc12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(c1ccccn1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C(c1ccncc1)N1C[C@H](C(=O)NCC(C)(C)N2CCOCC2)[C@]2(CC[NH2+]CC2)C1
+O=C(c1nccc2ccccc12)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C(c1nccc2ccccc12)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C/C=C(/N(C)C)\[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C/C=C(/N(C)C)\[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1/C(=C/c2ccc(cc2)N(C)C)/CC/C/1=C/c1ccc(cc1)N(C)C
+O=C1/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/CCC/C/1=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/CCC/C/1=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/COC/C/1=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/COC/C/1=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1/C(=C\c2ccco2)/CC[C@@H]2C[C@@]3(OCCO3)CC[C@@]12C
+O=C1C(=O)[C@@H]2c3ccccc3[C@H]1c1ccccc21
+O=C1C=C2[C@H](C)CC[C@]3(OCCO3)[C@]2(C)C[C@@H]1O
+O=C1C=CC(=O)C(=C1)CNc1ccc(cc1)C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C1C=CC(=O)C2=C1[C@@H]1c3ccccc3[C@@]2([N+](=O)[O-])c2ccccc12
+O=C1C=CC(=O)C2=C1[C@H]1c3ccccc3[C@]2([N+](=O)[O-])c2ccccc12
+O=C1C=CC(=O)C2=C1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+O=C1C=CC(=O)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C1C=CC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12
+O=C1C=CC(=O)[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+O=C1C=CC(=O)[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+O=C1C=CC(=O)[C@H]2[C@H]1[C@@H]1C=C[C@H]2[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+O=C1C=CC(=O)c2c3c([C@H]4c5ccccc5[C@@H]3c3ccccc43)c3[C@@H]4c5ccccc5[C@@H](c5ccccc45)c3c12
+O=C1C=C[C@]2(C=C1)C[C@@H](NC(=O)C(F)(F)F)C(=O)O2
+O=C1C=C[C@]2(C=C1)C[C@@H](NC(=O)OCc1ccccc1)C(=O)O2
+O=C1C=C[C@]2(OCCO2)CC[C@@H]1c1cccc(c1)C1(C)OCCO1
+O=C1CC(=O)N([C@H]2CC[C@@H](CC2)C2CCCCC2)C(=O)N1
+O=C1CC(=O)O[Pt@@]2(O1)N[C@H]1CCCC[C@@H]1[C@H]1CCCC[C@@H]1N2
+O=C1CC(=O)O[Pt@@]2(OC(=O)C1)N[C@@H]1CCCC[C@H]1N2
+O=C1CC(=O)O[Pt@]2(O1)N[C@H]1CCCC[C@@H]1N2
+O=C1CC(=O)O[Ti]23456789(O1)([C@@H]1C4=C3C2=C51)[C@H]1C8=C7C6=C91
+O=C1CC(C)(C)C[C@@H]2C[C@@]3(OCCO3)CC[C@]12C
+O=C1CCCC2=C1[C@@]1(O[C@@H]3C=CC=CN23)C(=O)c2ccccc2C1=O
+O=C1CCCN1c1ccc(Cl)c(c1)NC(=O)C(=O)N[C@H]1CC[N@@H+](CC1)C1CC1
+O=C1CCC[C@H]2[C@H]1CCC[C@]12OCCO1
+O=C1CCC[C@]23[C@@H]4CCC[C@@H]4[C@@]13[C@H]1CCC[C@@H]21
+O=C1CC[C@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]19C7=C23
+O=C1CC[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]19C7=C23
+O=C1CC[C@@H](C(=O)N1)N1C(=O)[C@H]2[C@@H]3CC[C@@H](CC3)[C@H]2C1=O
+O=C1CC[C@@]2(C)C(=C1)CC[C@@H]1[C@@H]3CC[C@H](O[Si@](C)(C)O[C@H]4CC[C@H]5[C@H]6CCC7=CC(=O)CC[C@]7(C)[C@H]6CC[C@]45C)[C@@]3(C)CC[C@H]21
+O=C1CC[C@@]2(C)C(=C1)CC[C@H]1[C@@H]2CC[C@]2(C)[C@H](CC[C@@H]12)O[Si@](O[C@H]1CC[C@H]2[C@H]3CCC4=CC(=O)CC[C@]4(C)[C@H]3CC[C@]12C)(O[C@H]1CC[C@H]2[C@H]3CCC4=CC(=O)CC[C@]4(C)[C@H]3CC[C@]12C)c1ccccc1
+O=C1CC[C@@]2(CCC[C@@]3(CCC(=O)CC3)C2=O)CC1
+O=C1CC[C@@]2(C[C@@H]1N)c1ccccc1c1ccccc21
+O=C1CC[C@@]2(OCCO2)C[C@H]1CCS(=O)c1ccccc1
+O=C1CC[C@H](C(=O)N1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+O=C1CC[C@H](C(=O)N1)N1C(=O)[C@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@H]2C1=O
+O=C1CC[C@H](C[C@@]21CCCC2)C(C)(C)C
+O=C1CC[C@]2(C)C(=C1C)CCC[C@@]12OCCO1
+O=C1CC[C@]2(CC1)[C@@H](O)c1ccccc1C2(C)C
+O=C1CC[C@]2(OCCO2)C[C@@H]1C
+O=C1CC[C@]2(OCCO2)C[C@H]1CCSc1ccccc1
+O=C1CC[C@]2(OCCO2)C[C@H]1[C@H]1C=CCC1
+O=C1CC[C@]2(OCCO2)[C@@H](C)c2cc(N)c(C)cc2N1Cc1ccccc1
+O=C1CN(C(=O)CN1c1ccccc1)N1C(=O)CS[C@@H]1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C1CN(c2ccccc2)C(=O)CN1/N=C/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C1CN2CCN3CC(=O)NC(=O)[C@H]3[C@H]2C(=O)N1
+O=C1CS[C@@H](N1c1nccs1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=C1C[C@@H](C(=O)O)[C@@]2(CCCCCC2)O1
+O=C1C[C@@H](Sc2ccccc2)[C@@]2(OCCO2)[C@@H](C1)Sc1ccccc1
+O=C1C[C@@H](c2ccccc2)[C@]2([C@@H](C1)c1ccccc1)C(=O)c1ccccc1C2=O
+O=C1C[C@@H]2CCCC[C@@H]2[C@@]21SCCS2
+O=C1C[C@@H]2[C@H](CC[C@]32OCCO3)c2ccc3ccccc3c12
+O=C1C[C@@](C)(C)CC(=O)C1C(CC[C@@H]1CCCCC1=O)C1C(=O)C[C@@](C)(C)CC1=O
+O=C1C[C@@]2(C)[C@@H](CC[C@@H]2C2(C)OCCO2)[C@H]2CC[C@H]3C[C@]4(OCCO4)CC[C@]3(C)[C@@H]12
+O=C1C[C@H](O)C(=O)[OH+][Pt@+2]2(NCCN2)[OH+]1
+O=C1C[C@H](c2ccco2)[C@]2(C(=O)CCCC2=O)[C@@H](C1)c1ccco1
+O=C1C[C@H]2CC[C@]1(CS(=O)(=O)O)C2(C)C.C1CCN2C[C@@H]3C[C@@H](CN4CCCC[C@@H]34)[C@H]2C1
+O=C1C[C@H]2[C@H]3C[C@H](C3)[C@@H](C1)N2C
+O=C1C[C@H]2[C@H]3C[C@]4(OCCO4)[C@@H]4[C@H]3C[C@H]2[C@H]14
+O=C1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+O=C1C[C@]2(C)C[C@]3(OC[C@](C)(C)CO3)C[C@@]2(C)C1
+O=C1C[C@]23CCCCCCCCCC[C@]3(C1)CC(=O)C2
+O=C1C[C@]23CCC[C@]3(C1)CC(=O)C2
+O=C1C[N@+]23CCO[Fe]453(O1)OC(=O)C[N@+]5(CC2)CC(=O)O4
+O=C1C[N@@+]23CC[N@+]45CC(=O)O[Mo]675(=O)(OC(=O)C4)O[Mo]37(=O)(O1)(OC(=O)C2)O6
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Al]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Ba]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Ca]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Cd]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Co]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Cu]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Fe]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Mg]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Mn]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Ni]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Pb]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Zn]35(O1)(OC(=O)C2)OC(=O)C4
+O=C1Cc2ccccn2[Pt@](N)(Cl)O1
+O=C1N(Cc2ccccc2)[C@@H]2C[S@@](=O)(=O)C[C@@H]2N1Cc1ccccc1
+O=C1N(Cl)[C@@H]2N(Cl)C(=O)N(Cl)[C@@H]2N1Cl
+O=C1N(NC(=O)[C@H]2[C@@H]3c4ccccc4[C@H]([C@@H]12)c1ccccc31)c1ccccc1
+O=C1N(O)[C@@]2(CCCC=C2)C(=O)N[C@]21CCCCC2
+O=C1N([Hg]c2ccccc2)C(=O)[C@@H]2[C@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl
+O=C1N([Hg]c2ccco2)C(=O)[C@@H]2[C@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+O=C1N([Hg]c2cccs2)C(=O)[C@@H]2[C@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl
+O=C1N(c2ccc(cc2)S(=O)(=O)N)C(=O)[C@H]2[C@@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+O=C1N(c2ccc3c(Cc4ccccc34)c2)C(=O)[C@H]2[C@@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl
+O=C1N(c2cccc3ccccc23)C(=O)[C@H]2[C@@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+O=C1N(c2ccccc2)C(=O)[C@@H]2[C@@H]1[C@@]1(C=C3c4ccccc4N(C(=O)c4ccccc4)[C@]23[C@@H]2C(=O)N(c3ccccc3)C(=O)[C@@H]12)[N+](=O)[O-]
+O=C1N(c2ccccc2)C(=O)[C@@H]2[C@@H]1[C@]1(C=C3c4ccccc4N(C(=O)c4ccccc4)[C@@]23[C@@H]2C(=O)N(c3ccccc3)C(=O)[C@@H]12)[N+](=O)[O-]
+O=C1N(c2ccccc2)C(=O)[C@H]2[C@@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl
+O=C1N(c2ccccc2)C(=O)[C@H]2[C@@H]1[C@H]1c3ccccc3[C@@H]2[S@]1(=O)=O
+O=C1N2Cc3c4OCCOCCNCCOCCOc5ccc6OCCOCCNCCOCCOc(cc4)c3CN3C(=O)N4Cc6c5CN1[C@]4(c1ccccc1)[C@]23c1ccccc1
+O=C1N2O[C@@H]3CCC[C@]2(C3)C(=O)[C@]21CCCCC2
+O=C1N=C(NC2CCCCC2)[C@]2(CCN(CC2)C[C@H]2COc3ccccc3O2)N1c1ccccc1
+O=C1NC(=O)C2=C1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+O=C1NC(=O)[C@@H]2C(=O)NC(=O)[C@H]1[C@@H]2c1c(Cl)cccc1Cl
+O=C1NC(=O)[C@@]2(C(=O)N1)[C@@H](CC(=O)C[C@H]2c1ccc(cc1)N(C)C)c1ccc(cc1)N(C)C
+O=C1NC(=O)[C@@]2(CC=CC[C@@H]2C(C)C)C(=O)N1
+O=C1NC(=O)[C@@]2(CC[C@@H](CC2)C2CCCCC2)N1
+O=C1NC(=O)[C@@]2(C[C@@]2(C)c2ccccc2)C(=O)N1
+O=C1NC(=O)[C@@]2(C[Si](C)(C)CC[C@@H]2C)C(=O)N1
+O=C1NC(=O)[C@H](C1)N1C(=O)[C@H]2[C@@H]3CC[C@@H](CC3)[C@H]2C1=O
+O=C1NC(=O)[C@H]2C(=O)NC(=O)[C@@H]1[C@@]12CCc2ccccc12
+O=C1NC(=O)[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+O=C1NC(=O)[C@]2(CC(=C(C)C[C@@H]2C)C)C(=O)N1
+O=C1NC(=O)[C@]2(CCN(CC2)C[C@H]2COc3ccccc3O2)C(=O)N1
+O=C1NC(=O)[C@]2(CC[C@@H](CC2)C2CCCCC2)N1
+O=C1NC(=O)[C@]2(C[C@@H]3CC[C@H]2C3)C(=O)N1
+O=C1NC(=O)[C@]2(Nc3cc(Cl)c(Cl)cc3N(C)[C@@H]2O)C(=O)N1
+O=C1NC(=O)[C@]2(O[C@@H]3c4ccccc4C=NN3C3=C2C(=O)CCC3)C(=O)N1
+O=C1NC(=O)[C@]23[C@H]4CC[C@H](C=C4)[C@@]13C(=O)NC2=O
+O=C1NCCCC[C@H]1NC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)N[C@@H]3CCCCNC3=O)C6=C12
+O=C1NCCCC[C@H]1NC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1NCCCC[C@H]1NC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)N[C@@H]3CCCCNC3=O)C6=C12
+O=C1NCCCC[C@H]1NC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1NCN(c2ccccc2)[C@@]21CCN(CC2)C[C@H]1COc2ccccc2O1
+O=C1NC[C@H]2CC[C@]3(OCCO3)C[C@H]2C1
+O=C1NNC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12
+O=C1NN[C@H]2NC(=O)[C@@]3(NN2C1=O)c1ccccc1c1ccccc31
+O=C1N[C@@H](C)[C@]2(O1)c1ccccc1c1ccccc21
+O=C1N[C@@H](c2ccco2)N(C)[C@@]21CCN(CC2)Cc1ccccc1
+O=C1N[C@@H]2C[C@@H]3CCC[C@H](c4ccccc4)[C@H]3[C@@]2(O)[C@]21CCCCC2
+O=C1N[C@@H]2NC(=O)N[C@@H]2N1
+O=C1N[C@@]2(CCCC2)C(=O)N[C@@H]1Cc1ccccc1
+O=C1N[C@@]2(CCCC2)[C@H]2CCCC[C@@]12O
+O=C1N[C@@]2(CCCC=C2)[C@](O)(c2ccccc2)[C@]21CCCCC2
+O=C1N[C@@]2(CCCCC2)[C@@H](C)[C@@]21CCCCC2
+O=C1N[C@@]2(CCCCC2)[C@H](N)[C@@]21CCCCC2
+O=C1N[C@@]2(CCCCC2)[C@H](O)[C@@]21CCCCC2
+O=C1N[C@@]2(CCCCC2)[C@H]([N+](C)(C)C)[C@]21CCCCC2
+O=C1N[C@@]2(CCCCCC2)[C@@H]2CCCCCC[C@]12O
+O=C1N[C@@]2(NC(=O)N[C@@]2(N1)c1ccccc1)c1ccccc1
+O=C1N[C@H]2C[S@](=O)(=O)C[C@H]2N1
+O=C1N[C@](C)(C2CC2)C(=O)N1C[NH+]1CC[C@H](CC1)c1nc2ccccc2o1
+O=C1N[C@]2(CCC=CC2)C(=O)[C@@]21CCCCC2
+O=C1N[C@]2(CCCC2)C(=O)[C@]21CCCC2
+O=C1N[C@]2(CCCC2)[C@](O)(CCc2ccccc2)[C@@]21CCCC2
+O=C1N[C@]2(CCCC=C2)[C@H](O)[C@@]21CCCCC2
+O=C1N[C@]2(CCCC=C2)[C@](C)(O)[C@]21CCCCC2
+O=C1N[C@]2(CCCC=C2)[C@](O)(C#Cc2ccccc2)[C@]21CCCCC2
+O=C1Nc2ccccc2/C/1=c/1\sc2nc3ccccc3n2c1=O
+O=C1Nc2ccccc2[C@@]1(O)CC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1Nc2ccccc2[C@@]1(O)CC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1Nc2ccccc2[C@@]1(O)CC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C1OC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@@]2(Br)c2ccccc12
+O=C1OC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@@]2(O)c2ccccc12
+O=C1OC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12
+O=C1OC(=O)[C@@]2(C)[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12
+O=C1OC(=O)[C@H]2C[C@@H]3[C@H](C[C@H]12)[C@]1(Cl)C(=C(Cl)[C@@]3(Cl)[C@@]1(Cl)Cl)Cl
+O=C1OC(=O)[C@H]2[C@@H]1[C@@H]1[C@@H]3C(=O)OC(=O)[C@@H]3[C@H]2C(=C1c1ccccc1)c1ccccc1
+O=C1OC(=O)[C@H]2[C@@H]1[C@H]1C=C[C@@H]2[C@]1(c1ccccc1)c1ccccc1
+O=C1OC(=O)[C@H]2[C@@H]1[C@H]1c3ccccc3[C@]2(C)c2ccccc12
+O=C1OC(=O)[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+O=C1OC(=O)[C@H]2[C@H]1[C@H]1C=C[C@@H]2[C@@]1(c1ccccc1)c1ccccc1
+O=C1OC(=O)[C@H]2[C@H]1[C@H]1CC[C@@H]2[C@]1(c1ccccc1)c1ccccc1
+O=C1OC(=O)[C@]2(C)c3ccccc3[C@H]1c1ccccc21
+O=C1OC(=O)[C@]23CC[C@H](CC2)[C@H]2CC[C@@]13CC2
+O=C1OC2=C(CCCC2)[C@H](N2CCCCC2)[C@]21SCCCS2
+O=C1OCC[C@]21CCCC[C@]12OCCO1
+O=C1OC[C@@H]2C[C@@H]3c4ccccc4[C@]12c1ccccc31
+O=C1OC[C@]2(CO1)C[C@H]1C=C[C@@H]2C1
+O=C1O[C@@H]2[C@H](O1)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl
+O=C1O[C@@]2(CCCC2)OC(=O)/C/1=C\C=C\c1ccc(o1)[N+](=O)[O-]
+O=C1O[C@H]2CC[C@@H]3[C@@H](O)C[C@H](O)[C@H]3C[C@H]2[C@@H]1CNC[C@H]1CC[C@@H](CC1)C(=O)O
+O=C1O[C@H]2[C@@H](O1)[C@@H]1c3ccccc3[C@H]2c2ccccc12
+O=C1O[C@]2(CCCC2)OC(=O)/C/1=C\C=C\c1ccc(o1)[N+](=O)[O-]
+O=C1O[C@]2(CCCC2)O[C@H]1c1ccccc1
+O=C1O[C@]2(CC[C@@]3(CC2)OC(=O)C(=C)C3)CC1=C
+O=C1O[Mn]2345OC(=O)C[N@@+]4(C1)C[C@@H](C)[N@@+]5(CC(=O)O2)CC(=O)O3
+O=C1O[Mo]23(=O)(OC(=O)C[C@@](O)(C1)C(=O)O2)O[Mo]12(=O)(OC(=O)C[C@](O)(CC(=O)O1)C(=O)O2)O3
+O=C1O[Pd@]23OC(=O)[C@H](Cc4nc[nH]c4)N3CN2[C@H]1Cc1nc[nH]c1
+O=C1O[Pt@@]2(N[C@@H]3CCCC[C@@H]3N2)OC1=O
+O=C1O[Pt@@]2(N[C@H]3CCCC[C@@H]3N2)OC(=O)C(=C1O)O
+O=C1O[Pt@@]2(N[C@H]3CCCC[C@@H]3N2)OC(=O)c2cc(ccc12)[N+](=O)[O-]
+O=C1O[Pt@](N)(NC2CCC2)OC(=O)[C@H]2CCCC[C@H]12
+O=C1O[Pt@]2(NC[C@H]3CCCC[C@H]3N2)OC1=O
+O=C1O[Pt@]2(N[C@@H]3CCCC[C@H]3N2)OC(=O)[C@@H]1C
+O=C1O[Pt@]2(N[C@H]3CCCC[C@@H]3N2)OC(=O)c2cc(ccc12)[N+](=O)[O-]
+O=C1O[Pt@]2(OC1=O)N[C@H](c1ccccc1)[C@H](N2)c1ccccc1
+O=C1O[Ti]23456789(OC1=O)([C@@H]1C4=C3C2=C51)[C@@H]1C8=C7C6=C91
+O=C1Oc2c(=C1C(C)(C)C)n1nnnc1c2C(C)(C)C
+O=C1P2(=O)[OH+][Pt@@+2]3(N[C@H]4CCCC[C@H]4N3)[OH+]P1(=O)[OH+][Pt@@+2]1(N[C@H]3CCCC[C@@H]3N1)[OH+]2
+O=C1[C@@H](C)[N@+]2(CCCCCC2)[C@@H](C)CC1(c1ccccc1)c1ccccc1
+O=C1[C@@H](Sc2ccccc2)[C@@H](c2ccccc2)[C@@H]1Sc1ccccc1
+O=C1[C@@H]2CCN(CC2)/C/1=C\c1ccc(OCc2ccccc2)c(OCc2ccccc2)c1
+O=C1[C@@]2(CO[C@@]3(CCCCC3)OC2)CC[C@]21CO[C@@]1(CCCCC1)OC2
+O=C1[C@@]2(C[C@@H]3C=C[C@H]2C3)C(=O)[C@]21C[C@@H]1C=C[C@H]2C1
+O=C1[C@@]2(Cl)[C@]3(Cl)[C@]4(Cl)[C@@]2(Cl)[C@]2(Cl)[C@@]1(Cl)[C@@]3(Cl)[C@]2(Cl)[C@@]4(Cl)Cl
+O=C1[C@@]2(Cl)[C@]3(Cl)[C@]4(Cl)[C@@]2(Cl)[C@]2(Cl)[C@@]1(Cl)[C@@]3(Cl)[C@]2(Cl)[C@]4(Cl)Cl
+O=C1[C@H]2CC=CC[C@@H]2C(=O)[C@]21CCc1ccccc21
+O=C1[C@H]2CCC[C@H]1[C@@]1(O)CCCC[C@@H]1[C@H]2[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1[C@H]2CCC[C@H]1[C@@]1(O)CCCC[C@@H]1[C@H]2[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=C1[C@H]2CCN(CC2)[C@@H]1CN1CC[C@]2(CC1)C(=O)NCN2c1ccccc1
+O=C1[C@H]2C[C@]3(OCCO3)C[C@@H](C1=O)N2Cc1ccccc1
+O=C1[C@H]2[C@@H](N[C@@H](c3ccccc3)[C@@H]1[C@@H](N[C@H]2c1ccccc1)c1ccccc1)c1ccccc1
+O=C1[C@H]2[C@H](C[C@@]32SCCS3)[C@@]2(C)OC[C@H](c3ccccc3)N12
+O=C1[C@H]2[C@H]3C=C[C@H](C3)[C@H]2C(=O)[C@@]1(Br)Br
+O=C1[C@H]2[C@H]3CC[C@H](C3)[C@@H]2[C@@H](O)[C@H]2[C@H]3CC[C@H](CC3)[C@@H]12
+O=C1[C@H]2[C@H]3CC[C@H](C3)[C@H]2C(=O)[C@H]2[C@H]3CC[C@H](CC3)[C@@H]12
+O=C1[C@]2(C)CN3C[C@@]1(C)C(=O)[C@@](C)(C3)C2=O
+O=C1[C@]2(CCC[C@@]31CO[C@]1(CCCCC1)OC3)CO[C@@]1(CCCCC1)OC2
+O=C1[C@]2(Cl)[C@H]3CC[C@@H]4[C@@H]5CC[C@H]3[C@@]1(Cl)[C@]5(Cl)[C@]24Cl
+O=C1[OH+][Pt@@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]C(=O)[C@H]1N
+O=C1c2cc3nc4c(nc3cc2C(=O)c2ccccc12)c1ccccc1c1ccccc41
+O=C1c2cccc(NC(=O)c3ccc4C(=O)c5ccccc5c5ncnc3c45)c2C(=O)c2ccccc12
+O=C1c2ccccc2C(=O)C2=C1[C@H]1c3ccccc3[C@@H]2c2ccccc12
+O=C1c2ccccc2C(=O)[C@@H]2[C@@H]1C(=O)c1ccccc1C2=O
+O=C1c2ccccc2C(=O)[C@@H]2[C@H]1[C@H]1[C@@H]2C(=O)c2ccccc2C1=O
+O=C1c2ccccc2C(=O)[C@H]2[C@@H]1[C@H]1c3ccccc3[C@@H]2c2ccccc12
+O=C1c2ccccc2C(=O)c2c1c1c(c3c2c2ccccc2n3C)n(C)c2ccccc12
+O=C1c2ccccc2C(=O)c2c1ccc1nc3c4cccc5cc6ccccc6c(c3nc21)c45
+O=C1c2ccccc2C(=O)c2c1sc1nc3c(=O)n(C)c(=O)n(C)c3n21
+O=C1c2ccccc2c2ccc(cc12)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=C1c2ccccc2c2nc(/C=C/c3ccccc3)cc3c4ccccc4nc1c23
+O=C1c2ccccc2c2nc(cc3c2c1nc1ccccc31)c1cccnc1
+O=C1c2ccccc2c2nc(cc3c2c1nc1ccccc31)c1cccs1
+O=C1c2ccccc2c2nc(cc3c2c1nc1ccccc31)c1ccncc1
+O=C1c2ccccc2c2nc(cc3c4ccccc4nc1c23)c1ccccc1
+O=C1c2ccccc2c2nc3ccc4C(=O)c5ccccc5c5nc6ccc1c2c6c3c45
+O=C1c2ccccc2c2nccc3c2c1nc1ccccc31
+O=C1c2ccccc2c2nccc3ccnc1c23
+O=C1c2cccnc2C(=O)c2c1nc1ccccc1c2c1ccc2c3c(nc4ccccc24)C(=O)c2cccnc2c13
+O=C1c2cccnc2c2nc(/C=C/c3ccccc3)cc3c2c1nc1ccccc31
+O=C1c2cccnc2c2nc(cc3c2c1nc1ccccc31)c1ccccc1
+O=C1c2cccnc2c2nc(cc3c2c1nc1ccccc31)c1cccnc1
+O=C1c2cccnc2c2nc(cc3c2c1nc1ccccc31)c1ccncc1
+O=C1c2cccnc2c2nc(cc3c4ccccc4nc1c23)c1ccccn1
+O=C1c2cccnc2c2nccc3c2c1nc1ccccc31
+O=C1c2cccnc2c2nccc3c4CCCCc4nc1c23
+O=C1c2cccnc2c2nccc3ccnc1c23
+O=C1c2cn(C)c(=O)cc2c2nc3ccccc3c3ccnc1c23
+O=C1c2nc(C)c(C)nc2C(=O)C2=C1[C@H]1c3ccccc3[C@@H]2c2ccccc12
+O=C1c2scnc2c2nccc3c2c1nc1ccccc31
+O=C=Nc1ccc2n(CC)c3ccc4n5cccc5c(=O)[nH]c4c3c2c1
+O=CC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=CC/C=C/C=C(\NC(=O)C)/S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=CC/C=C/[C@@H](OC(=O)C)[C@@H](NC(=O)C)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=CN(C)C.Oc1nc2nc3c(nc2c(O)n1)c1cccc2cccc3c12
+O=CNNc1ccc2nnc(Cl)n2n1
+O=CN[C@]12C(=O)NC(=O)[C@@]1(C(=O)O)[C@]12CCCCC1
+O=CO[C@@H]1CC[C@@]2(C)[C@@H](CC[C@@H]3[C@H]4CC[C@H]([C@H](C)CCC(=O)N[C@]56C[C@@H]7C[C@@H](C[C@@H](C7)C6)C5)[C@]4(C)CC[C@@H]23)C1
+O=CO[C@@H]1CC[C@@]2(C)[C@@H](CC[C@@H]3[C@H]4CC[C@H]([C@H](C)CCC(=O)N[C@]56C[C@@H]7C[C@@H](C[C@@H](C7)C6)C5)[C@]4(C)[C@@H](OC=O)C[C@@H]23)C1
+O=CO[C@@H]1CC[C@@]2(C)[C@H](C1)C[C@@H](OC=O)[C@H]1[C@H]3CC[C@@H]([C@H](C)CCC(=O)N[C@]45C[C@@H]6C[C@@H](C[C@@H](C6)C5)C4)[C@]3(C)[C@H](OC=O)C[C@H]21
+O=CO[C@@H]1[C@](C)(C)[C@@H](OC=O)[C@@]1(C)C.O=CO[C@H]1[C@](C)(C)[C@H](OC=O)[C@@]1(C)C
+O=CO[C@]12c3ccccc3[C@](C)(c3ccccc13)[C@@]1(OC=O)c3ccccc3[C@]2(C)c2ccccc12
+O=C[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+O=C[C@@]1(CC[C@@H](CC1)C(C)(C)C)NS(=O)(=O)c1ccc(C)cc1
+O=C[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+O=C[C@@]12CC=C3O[C@H]4O[C@]5(CCCCC5)O[C@H]4[C@H]3[C@H]2C(=O)C=CC1=O
+O=C[C@H](O)[C@@H](O)[C@@H](O)[C@H](O)CON1C[C@H](O)[C@H](O)[C@@H](O)C1
+O=C[C@]12[C@H]3C(=O)NC(=O)[C@H]3[C@H](c3ccccc13)c1ccccc21
+O=Cc1c2c3[nH]c4ccccc4c3ccn2c2ccccc12
+O=Cc1ccc(cc1)c1nnc2n[nH]c(=S)n2n1
+O=Cc1ccc2[N+]([O-])ONc2c1
+O=Cc1ccc2c(no[n+]2[O-])c1
+O=Cc1cnn(n1)c1ccccc1
+O=Cc1nc2ccccc2cc1C[N@+]12CN3CN(CN(C3)C2)C1
+O=Cc1nc2ncnc3ccn1c23
+O=Cc1nnc2n[nH]c(=S)n2n1
+O=NN(C)C(=O)N[C@H]1CC[C@H](CC1)NC(=O)N(C)N=O
+O=NN([C@H]1CC[C@@H](CC1)C(=O)O)C(=O)N[C@@H]1CC[C@H](CC1)C(=O)O
+O=NN([C@H]1CC[C@@H](O)CC1)C(=O)N[C@@H]1CC[C@H](O)CC1
+O=NN1CN2CN(N=O)CN(C2)C1
+O=NN1[C@H]2c3ccccc3[C@@H]1c1ccccc21
+O=NO[Pd@]1(Cl)N[C@@H]2CCCC[C@H]2N1
+O=N[C@H]1C(=O)N/C(=N)/NC1=O
+O=Nc1c(N)nc(n(C)c1=O)[S+](C)[Pd@@](Cl)(Cl)[S+](C)c1nc(N)c(N=O)c(=O)n1C
+O=Nc1cc2nc3c(nc2cc1N=O)c1ccccc1c1ccccc31
+O=P(N1CC1)(N1CC1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=P(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)(N1CC1)N1CC1
+O=P(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N1CC1)c1ccccc1
+O=P(OCc1ccccc1)(OCc1ccccc1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=P(Oc1ccccc1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N1CC1
+O=P(Oc1ccccc1)(Oc1ccccc1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=P(c1ccccc1)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+O=P1(OCC2(CO1)COP(=O)(OC2)N1C[C@H]2CC[C@H](CC2)C1)N1C[C@@H]2CC[C@@H](CC2)C1
+O=P12CN3CN(C1)C[N@@+](C)(C3)C2
+O=S(=O)(/N=C/1\C=C/C(=N\S(=O)(=O)c2ccccc2)/C=C1)c1ccccc1
+O=S(=O)(CCCN1CCOCC1)[OH+][Pt@+2]1(N[C@@H]2CCCC[C@@H]2N1)[OH+]S(=O)(=O)CCCN1CCOCC1
+O=S(=O)(CCCNC1CCCCC1)[OH+][Pt@@+2]1(N[C@H]2CCCC[C@H]2N1)[OH+]S(=O)(=O)CCCNC1CCCCC1
+O=S(=O)(N[C@@H]1CC[C@@H](CC1)CC1CCCCC1)c1ccccc1
+O=S(=O)(N[C@@H]1C[C@@H]2CC[C@H]1CC2)c1ccccc1
+O=S(=O)(OCC1(COS(=O)(=O)c2ccccc2)C[C@H]2c3ccccc3[C@@H]1c1ccccc21)c1ccccc1
+O=S(=O)(S[C@@H](S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=S(=O)(c1ccccc1)N1[C@@H]2[C@H]3CC[C@H](CC3)[C@H]12
+O=S(=O)(c1ccccc1)[C@@H]1CN2O[C@@]1(C[C@]12CCCCC1)S(=O)(=O)c1ccccc1
+O=S(O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(C)(C)C
+O=S(O[Sn@@](C)(C)OS(=O)c1ccc(cc1)C(C)(C)C)c1ccc(cc1)C(C)(C)C
+O=S1(=O)C(=C[C@@]21C[C@H]1c3ccccc3[C@@H]2c2ccccc12)c1ccccc1
+O=S1(=O)C=C[C@@]21C[C@H]1c3ccccc3[C@@H]2c2ccccc12
+O=S1(=O)CC[C@@]21C[C@@H]1c3ccccc3[C@H]2c2ccccc12
+O=S1(=O)CC[N@+]23CCC[N@@+]4(CCC2)CC[SH+][Ni@@+]134
+O=S1(=O)C[C@@H](N2CCCCC2)[C@]21C[C@H]1c3ccccc3[C@@H]2c2ccccc12
+O=S1(=O)C[C@@]2(N3CCCC3)[C@H]3c4ccccc4[C@H](c4ccccc34)[C@@H]12
+O=S1(=O)N[C@H](c2ccccc2)[C@@H]2N3CC[C@@H](CC3)C2=N1
+O=S1(=O)O[C@H]2OS(=O)(=O)O[C@H]2O1
+O=S1(=O)O[Pt@@]2(N[C@@H]3CCCCC[C@H]3N2)O1
+O=S1(=O)O[Pt@]2(N[C@H]3CCC[C@@H]3N2)O1
+O=S1(=O)[OH+][Pt@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]S(=O)(=O)c2ccccc12
+O=S1(=O)[OH+][Pt@@+2]2(N[C@@H]3CCCC[C@H]3N2)[OH+]S(=O)(=O)c2cccc1c2
+O=S1(=O)c2ccccc2c2nccc3ccnc1c23
+O=S1OC[C@@H](CO1)n1cnc2c1n(C)c(=O)n(C)c2=O
+O=S=N[C@@H]1CC[C@@H](C)CC1.CO[C@@H]1CC[C@@H](C=O)CC1
+O=[Cl](=O)(=O)O[Cu@@](/[S+]=c\1/cccc[nH]1)(/[S+]=c\1/cccc[nH]1)O[Cl](=O)(=O)=O
+O=[N+]1[C@@H]2[C@H]3CC[C@H](C3)[C@H]2[N+](=O)[Co]23451[C@H]1C4=C3C2=C51
+O=[N+]1[CH-]N=C2NNNC2=C1N
+O=[S@@](=O)(/C=C/c1cccnc1)/C=C/c1cccnc1
+O=[S@@]1(=O)CC(C1)[C@H]1CCS1(=O)=O
+O=[S@@]1(=O)CCN(CC1)[C@H]1CCS(=O)(=O)C1
+O=[S@@]1(=O)C[C@@H](NCc2ccccc2)[C@H](NCc2ccccc2)C1
+O=[S@@]1(=O)C[C@@](C)(Br)[C@@](C)(Br)C1
+O=[S@@]1(=O)[C@@H](CC[C@H]1Cc1ccccc1)Cc1ccccc1
+O=[S@@]1(=O)[C@H](c2ccccc2)c2c(sc(c3ccccc3)c2[C@@H]1c1ccccc1)c1ccccc1
+O=[S@]1(=O)C[C@@H]2[C@H](C1)[C@@]1(O[C@@]2(c2ccccc2)c2ccccc12)c1ccccc1
+O=[S@]1(CC[S@](=O)(c2ccccc2)[Pt@]1(Cl)Cl)c1ccccc1
+O=[Se](O[Sn@@](O[Se](=O)c1ccccc1)(O[Se](=O)c1ccccc1)c1ccccc1)c1ccccc1
+O=[Se]1O[Pt@@]2(O1)N[C@H]1CCCC[C@@H]1N2
+O=[Se]1[OH+][Pt@+2]2([OH+]1)N[C@H]1CCCC[C@@H]1N2
+O=[Sn](c1ccccc1)c1ccccc1.O=[Sn]([C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82
+O=[Sn](c1ccccc1)c1ccccc1.O=[Sn]([C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82
+O=c1/c(=C/c2ccc3OCOc3c2)/sc2nnc(Cc3ccccc3)n12
+O=c1/c(=C/c2ccc3OCOc3c2)/sc2nnc(c3ccco3)n12
+O=c1/c(=C/c2cccc3ccccc23)/sc2nc3ccccc3n12
+O=c1/c(=C/c2ccccc2[N+](=O)[O-])/sc2[nH]c3ccccc3n12
+O=c1/c(=C/c2ccccc2[N+](=O)[O-])/sc2[nH]nc(c3ccco3)n12
+O=c1/c(=C/c2ccccc2[N+](=O)[O-])/sc2nc3ccccc3n12
+O=c1/c(=C/c2ccccc2[N+](=O)[O-])/sc2nnc(c3ccco3)n12
+O=c1/c(=C/c2ccccn2)/sc2nc3cc4OCCOc4cc3n12
+O=c1/c(=C/c2ccco2)/sc2nc3ccccc3n12
+O=c1/c(=C\C=C\c2ccccc2)/sc2nc3ccccc3n12
+O=c1/c(=C\c2ccc(cc2)/C=c\2/sc3nc4ccccc4n3c2=O)/sc2nc3ccccc3n12
+O=c1/c(=C\c2ccccc2)/sc2nc(nn12)c1ccccc1
+O=c1/c(=C\c2ccccc2[N+](=O)[O-])/sc2[nH]nc(c3cccnc3)n12
+O=c1/c(=C\c2ccccc2[N+](=O)[O-])/sc2nnc(c3cccnc3)n12
+O=c1[nH][nH]c(=O)n2c3cc(oc3cc12)c1ccccc1
+O=c1[nH]c(=O)c2c([nH]1)n(CC(O)C(O)C(O)COP(=O)(O)O)c1cc(C)c(C)cc1[n+]2S(=O)(=O)[O-]
+O=c1[nH]c(=O)c2c(n1)n(CC(O)C(O)C(O)COP(=O)(O)O)c1cc(C)c(C)cc1[n+]2S(=O)(=O)[O-]
+O=c1[nH]c(=O)n(cc1C)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=c1[nH]c(=O)n(cc1C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=c1[nH]c(=O)n(cc1F)CC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=c1[nH]c(=O)n(cc1F)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=c1[nH]c2cc3c(oc4ccccc34)cc2n2cccc12
+O=c1[nH]c2cccc3CCCn(c23)c(c1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=c1[nH]c2ccccc2[nH]c(c1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=c1c(Cl)c2cc3c(cc2c2ccccc12)nc1ccccc1n3C1CCCCC1
+O=c1c(Cl)c2cc3c(cc2c2ccccc12)nc1ccccc1n3c1ccccc1
+O=c1c2c(ccc3ccccc23)oc2ccc3ccccc3c12
+O=c1c2c(nc3sc4ccccc4c(=O)n23)n(C)c(=O)n1C
+O=c1c2c(nc3sc4nc5ccccc5nc4n23)n(C)c(=O)n1C
+O=c1c2c(sc3CCCCc23)nc2sn3c(=O)c4c(sc5CCCCc45)nc3n12
+O=c1c2c3sc4ccccc4[nH]c3ccc2c(=O)c2ccccc12
+O=c1c2cc3[nH]c4ccccc4c(=O)c3cc2[nH]c2ccccc12
+O=c1c2cc3ccccc3cc2oc2cc3ccccc3cc12
+O=c1c2cccc3c4ccccc4c4sc5ccccc5n1c4c23
+O=c1c2cccc3cccc(c23)/c/1=c\1/c(=O)c2cccc3cccc1c23
+O=c1c2ccccc2c(=O)c2c(cc3sc4c(ccc5c4c(=O)c4ccccc4c5=O)[nH]c3c12)NC(=O)c1ccc2C(=O)c3ccccc3c3nsc1c23
+O=c1c2ccccc2c(=O)c2c1c(c1ccccc1)c1c(c2c2ccccc2)c(=O)c2ccccc2c1=O
+O=c1c2ccccc2c(=O)c2c1c1c(=O)c3ccccc3c(=O)c1c1c2c(=O)c2ccccc2c1=O
+O=c1c2ccccc2c(=O)n2n1[C@H](c1ccccc1)N(O[C@@]12CCCCC1)C(C)(C)C
+O=c1c2ccccc2c2c1c1c3ccccc3c(=O)c1c1c2c(=O)c2ccccc12
+O=c1c2ccccc2n2nnc3ccc(NCCCNCCNCCCNc4ccc5nnn6c5c4c(=O)c4ccccc64)c1c23.CS(=O)(=O)O
+O=c1c2ccccc2n2nnc3cccc1c23
+O=c1c2ccccc2nc2sc3nc4ccccc4c(=O)n3n12
+O=c1c2ccccc2ncn1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=c1c2ccncc2cc2c3[nH]c4ccccc4c3ccn12
+O=c1cc[nH]c(C)c1OC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O=c1ccn(CC(=O)N2CC[C@]3(CC2)SS[C@@]2(CCN(CC2)C(=O)Cn2ccc(=O)[nH]c2=O)S3)c(=O)[nH]1
+O=c1n(C)c(=O)n2[C@H]3CC[C@H](CC3)n12
+O=c1n(c2ccccc2)c(=O)n2[C@H]3CC[C@H](CC3)n12
+O=c1n(c2ccccc2)c(=O)n2[C@H]3[C@H]4[C@@H]5[C@H]4[C@H]4[C@H]([C@@H]34)[C@@H]5n12
+O=c1n(c2ccccc2)c(=O)n2n1[C@H]1C[C@@H]3c4ccccc4[C@H]1[C@H]2[C@@]13CC1
+O=c1n(c2ccccc2)c(=O)n2n1[C@](C)(C13C[C@H]4C[C@H](C[C@H](C4)C3)C1)[C@@]2(C)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O=c1n(cnc2ccccc12)/N=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=c1n(cnc2ccccc12)/N=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O=c1n2c(cc3ccccc23)c(=O)n2c1cc1ccccc21
+O=c1n2c(nc3ccccc23)c(=O)n2c1nc1ccccc21
+O=c1oc(=O)c2c1c1c(=O)oc(=O)c1c1c(=O)oc(=O)c21
+O=c1oc2c3ccccc3c3ccccc3c2c2oc3c(c12)c1ccccc1c1ccccc31
+O=c1oc2cc3ccccc3cc2c2c3ccccc3ccc12
+O=c1oc2ccccc2c(O)c1C(c1c(=O)oc2ccccc2c1O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82
+O=c1oc2ccccc2c(O)c1C(c1c(=O)oc2ccccc2c1O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82
+OB(O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OB(O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82.OB(O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(B(O)O)C6=C12
+OB(O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OB(O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82.OB(O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(B(O)O)C6=C12
+OC(=O)/C=C(\C)/[As]12(O[C@@](C)(O1)[C@H]1CC[C@H]3CCC[C@H]13)O[C@@](C)(O2)[C@@]12CCC[C@H]2CCC1
+OC(=O)/C=C/C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+OC(=O)/C=C/C(=O)O.O=C(O[C@@H]1CN2CC[C@H]1CC2)C1CC(=O)N(C)C(=O)C1
+OC(=O)C(=O)O.O[C@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(Cc1ccccc1)c1ccco1
+OC(=O)C/N=C(\c1ccccc1)/C(=N\CC(=O)O)/c1ccccc1
+OC(=O)C1(C[C@@]23CC[C@@]3(C1)C[C@](C2)(C(=O)O)C(=O)O)C(=O)O
+OC(=O)C1=C(C(=O)O)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl
+OC(=O)CC(=O)[C@@H](C(=O)O)[C@H](CCc1ccccc1)[C@H](C(=O)O)C(=O)CC(=O)O
+OC(=O)CCC/N=C(\c1ccccc1)/C(=N\CCCC(=O)O)/c1ccccc1
+OC(=O)CCCC(=O)N[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+OC(=O)CCN1C(=O)[C@@]2(Cl)[C@@]3(Cl)C=C[C@@](Cl)([C@@]2(Cl)C1=O)[C@@]3(Cl)Cl
+OC(=O)CCON1C(=O)[C@]2(CCCCC2)C[C@]21CCCCC2
+OC(=O)CC[C@@](C)(c1ccc(cc1)OC(=O)Nc1ccc(cc1)/N=N/c1ccccc1)c1ccc(cc1)OC(=O)Nc1ccc(cc1)/N=N/c1ccccc1
+OC(=O)CC[C@H](NC(=O)c1ccc(NCc2ccc3nc4nnnn4c(N)c3n2)cc1)C(=O)O
+OC(=O)CN1C(=O)[C@@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@@H]2C1=O
+OC(=O)COc1c(Cl)cc(/N=C/c2ccc(cc2)N2CC[C@@]3(CCCCC3)CC2)cc1Cl
+OC(=O)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OC(=O)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OC(=O)C[C@@H]1NCC[C@]21OCCO2
+OC(=O)C[C@@]12C[C@@]3(C)C[C@](Br)(C1)C[C@@](Br)(C2)C3
+OC(=O)C[C@H]1CCC[C@@H](CC(=O)O)[C@]1(C)C
+OC(=O)C[C@H]1CC[C@@H](CC1)/C(=C\[C@H]1CC[C@@H](CC1)N(C)C)/[C@H]1CC[C@@H](CC1)CC(=O)O
+OC(=O)C[C@]1(CC[C@@H](OCc2ccccc2)CC1)C(=O)O
+OC(=O)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+OC(=O)C[C@]12C[C@@H]3C[C@](CC(=O)O)(C1)C[C@](C3)(CC(=O)O)C2
+OC(=O)C[C@]12[C@H]3[C@@H]4[C@H]5[C@H]([C@@H]1[C@@H]35)[C@H]24
+OC(=O)C[N+]1(CC(=O)O)[C@@H]2CCCC[C@H]2[N+](CC(=O)O)(CC(=O)O)[Pt@]1(Cl)Cl
+OC(=O)C[N+]1(CC(=O)O)[C@H]2CCCC[C@H]2[N+](CC(=O)O)(CC(=O)O)[Pd@@]1(Cl)Cl
+OC(=O)C[N@@+]12CC(=O)O[Rh]342([O-])OC(=O)C[N@+]4(CC(=O)O3)[C@H](C)C1
+OC(=O)C[N@@+]12CC(=O)O[Rh]342([O-])OC(=O)C[N@@+]4(CC(=O)O3)[C@H](C)C1
+OC(=O)C[N@@+]12CC[N@+]34CC(=O)O[Rh]24([O-])(OC(=O)C1)OC(=O)C3
+OC(=O)C[N@@+]12CC[N@@+]34CC(=O)O[Rh]24([O-])(OC(=O)C1)OC(=O)C3
+OC(=O)Cc1ccccn1[Pt](N)(Cl)Cl
+OC(=O)Cc1nnn(C)n1
+OC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OC(=O)[C@@H](C)[S@](=O)(=O)[C@@H](C)C(=O)O
+OC(=O)[C@@H](Cl)C12C[C@]3(C)C[C@@](C)(C[C@@](C)(C3)C2)C1
+OC(=O)[C@@H](NC(C)(C)C)[C@]12C[C@]3(C)C[C@@](C)(C[C@@](C)(C3)C2)C1
+OC(=O)[C@@H](N[Pd@](Cl)(Cl)N[C@@H](C(=O)O)c1ccccc1)c1ccccc1
+OC(=O)[C@@H](N[Pt@](Cl)(Cl)N[C@@H](C(=O)O)c1ccccc1)c1ccccc1
+OC(=O)[C@@H]([C@@H](C)[C@H](C(=O)O)S(=O)(=O)O)S(=O)(=O)O
+OC(=O)[C@@H]1CCN1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+OC(=O)[C@@H]1CC[C@H](CC1)CC1CCC1.OC(=O)[C@@H]1CC[C@H](CC1)CC1CCC1
+OC(=O)[C@@H]1CS[C@]2(CCCC2)N1
+OC(=O)[C@@H]1C[C@@H](C[C@@H](C1)C(=O)O)C(=O)O
+OC(=O)[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+OC(=O)[C@@H]1C[C@@]21c1ccccc1c1ccccc21
+OC(=O)[C@@H]1N[Pt@@](Cl)(Cl)N[C@@H]1C(=O)O
+OC(=O)[C@@H]1[C@@H](Br)[C@]2(C)c3ccccc3[C@@]1(C)c1ccccc21
+OC(=O)[C@@H]1[C@@H](C(=O)O)[C@@H](C(=O)O)[C@H]1C(=O)O
+OC(=O)[C@@H]1[C@@H](C(=O)O)[C@@H]2c3ccccc3[C@H]1c1ccccc21
+OC(=O)[C@@H]1[C@@H](C(=O)O)[C@H]2c3ccccc3[C@@H]1c1ccccc21
+OC(=O)[C@@H]1[C@@H](C(=O)O)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl
+OC(=O)[C@@H]1[C@@H]2C[C@H]([C@@H]1C(=O)O)[C@H](C(=O)O)[C@H]2C(=O)O
+OC(=O)[C@@H]1[C@@H]2C[C@H]3C[C@@H]2C[C@@H]13
+OC(=O)[C@@H]1[C@@](Br)(c2ccccc2)[C@]1(Br)c1ccccc1
+OC(=O)[C@@H]1[C@H](c2ccccc2)[C@H](C(=O)O)[C@H]1c1ccccc1
+OC(=O)[C@@H]1[C@](C)(C)[C@H](C(=O)O)[C@]1(C)C
+OC(=O)[C@@]1(Br)C[C@@]21c1ccccc1c1ccccc21
+OC(=O)[C@@]1(N)C[C@@](O)(c2ccccc2)[C@@](O)(C1)c1ccccc1
+OC(=O)[C@@]12CC=CC[C@]2(CC=CC1)C(=O)O
+OC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+OC(=O)[C@H](N)CSC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OC(=O)[C@H](N)CSC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OC(=O)[C@H](c1ccccc1)[S@@](=O)(=O)[C@H](C(=O)O)c1ccccc1
+OC(=O)[C@H]1CCCC[C@]21OCCO2
+OC(=O)[C@H]1CC[C@@H](CC1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+OC(=O)[C@H]1CC[C@@H](NCc2ccccc2)CC1
+OC(=O)[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+OC(=O)[C@H]1C[C@]2(SCCS2)CC[C@@H]1c1ccccc1
+OC(=O)[C@H]1[C@@H](C(=O)O)[C@H](C(=O)O)[C@H]1C(=O)O
+OC(=O)[C@H]1[C@@H]2C=CC=CC=C[C@@H]12
+OC(=O)[C@H]1[C@@H]2c3ccccc3[C@H]([C@H]1C)c1ccccc21
+OC(=O)[C@H]1[C@H](C(=O)O)[C@]1(C)C
+OC(=O)[C@H]1[C@H]2c3ccccc3[C@@H]([C@@H]1Br)c1ccccc21
+OC(=O)[C@]1(C)C[C@]21c1ccccc1c1ccccc21
+OC(=O)[C@]1(c2ccccc2)[C@H](C)[C@H]1C
+OC(=O)[C@]12C(=O)NC(=O)[C@@]1(C(=O)O)[C@@]12CCCCC1
+OC(=O)[C@]12C(=O)NC(=O)[C@]2(C(=O)O)[C@@]1(C)C
+OC(=O)[C@]12CC[C@H](c3ccccc13)c1ccccc21
+OC(=O)[C@]12[C@@H]3CC[C@@H](CC3)[C@]2(C(=O)O)[C@@H]2CC[C@H]1C2
+OC(=O)[C@]12[C@@H]3CC[C@@H](O3)[C@]2(C(=O)O)[C@H]2CC[C@@H]1O2
+OC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)O
+OC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42I
+OC(=O)c1c(Br)cc(/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)cc1Br
+OC(=O)c1cc(ccc1Cl)/N=C/1\C=C/C(=C(\c2ccccc2)/c2ccc(cc2)Nc2ccc(Cl)c(c2)C(=O)O)/C=C1
+OC(=O)c1ccc(cc1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+OC(=O)c1ccc2C(=O)c3ccccc3c3ncnc1c23
+OC(=O)c1ccc2[N+]([O-])ONc2c1
+OC(=O)c1ccc2c(no[n+]2[O-])c1
+OC(=O)c1ccc2n[se]nc2c1
+OC(=O)c1cccc2[C@@H]3CC[C@H](c12)c1c3cccc1C(=O)O
+OC(=O)c1ccccc1c1c2ccc3ccccc3c2cc2ccc3ccccc3c12
+OC(=O)c1ccccc1c1ccccc1C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+OC(=O)c1cnccc1[C@@]12[C@@H](C(=N)NN1c1ccccc1)C(=N)NN2c1ccccc1
+OC(=O)c1nnn(Cc2ccccc2)n1
+OC(=O)c1nnn(n1)c1ccccc1
+OC(c1ccccc1)(c1ccccc1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OC(c1ccccc1)(c1ccccc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OC(c1ccccc1)(c1ccccc1)[C@@H]1CC[C@@H](C(O)(c2ccccc2)c2ccccc2)[S@]1(=O)=O
+OC(c1ccccc1)(c1ccccc1)[C@@H]1C[C@@H]2CC[C@H]1CC2
+OC(c1ccccc1)(c1ccccc1)[C@@H]1C[C@]2(C1)C[C@H](C2)C(O)(c1ccccc1)c1ccccc1
+OC=O.CN(Cc1ccccc1)[C@@H]1CC[C@H](CC1)C(=O)O
+OCC(C)(CO)N1C(=O)[C@H]2[C@@H]3c4ccccc4[C@@H](c4ccccc34)[C@H]2C1=O
+OCC1=C(CO)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl
+OCCC1=NNN(N1)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OCCCCCCCCCCCOc1ccc(cc1)[C@H]1OC[C@@]2(CO1)CO[C@@H](OC2)c1ccc(OCCCCCCCCCCCO)cc1
+OCCCC[C@@H]([C@@H](C(=O)C)C(=O)OCC)[C@@H](C(=O)C)C(=O)OCC
+OCCCC[C@H]1CO[C@@]2(CCCC2)O1
+OCCCN1CC[C@@]2(CC1)SS[C@]1(CCN(CCCO)CC1)S2
+OCCC[C@@]1(O)C[C@@H](CC[C@@]21OCCO2)C(C)(C)C
+OCCN(CCO)C(=O)c1ccc2[N+]([O-])ONc2c1
+OCCN(CCO)C(=O)c1ccc2c(no[n+]2[O-])c1
+OCCN(CCO)c1ccnc2ccc3nn(C)nc3c12
+OCCN(C[C@@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1)C1CCCCC1
+OCCN1CCN(CC1)c1ccc2NONc2c1[N+](=O)[O-]
+OCCN1CCN(CC1)c1ccc2nonc2c1[N+](=O)[O-]
+OCCN1CCN(CC1)c1ccnc2ccc3nn(C)nc3c12
+OCCN1CC[C@]2(CC1)SS[C@]1(CCN(CCO)CC1)S2
+OCCN1N=C(C[C@H]1[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OCCN1N=C(C[C@H]1[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OCCN1NC(C)C(C1C1[CH][CH][CH][CH][CH]1)N1ON1C1C(C)NN(CCO)C1C1[CH][CH][CH][CH][CH]1
+OCCNC(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+OCCNC(=O)c1ccc2c(NO[N+]2[O-])c1
+OCCNC(=O)c1ccc2c(no[n+]2[O-])c1
+OCCNCC/N=C\1/CC/C(=N/CCNCCO)/CC1
+OCCNCCNc1ccc2nnn3c2c1c(=O)c1cc(Cl)ccc31
+OCCNCCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31
+OCCNCCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31.OC(=O)[C@@H](C)O
+OCCNCCNc1ccc2nnn3c2c1c(=O)c1ccccc31
+OCCNCCNc1ccnc2ccc3nn(C)nc3c12
+OCCN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+OCCOC(=O)[C@H]1C[C@@H]2C[C@H]1[C@@]1(OCCO1)C2
+OCCOC[C@H]1O[C@@](C)(C)O[C@H]1COCCO
+OCCO[C@H]1[C@@]2(CCCCC2)NC(=O)[C@@]21CCCCC2
+OCCO[C@H]1[C@]2(CCCCC2)NC(=O)[C@@]21CCCCC2
+OCCOc1nc(nc(NS(=O)(=O)c2ccc(cn2)C(C)C)c1Oc1ccccc1OC)c1ccnc(c1)c1nn[nH]n1
+OCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OCC[C@@]1(C)C(=O)N/C(=N)/NC1=O
+OCC[C@H]1CCN(CC/C=C/2\c3cc(ccc3Sc3cc(F)ccc23)C(F)(F)F)CC1
+OCC[C@]1(CCC(C)C)C(=O)N/C(=N)/NC1=O
+OCC[N@+]12CCO[Ni+2]342(OCC1)OCC[N@@+]4(CCO)CCO3.[O-][Cl](=O)(=O)=O
+OCC[N@+]12CN3CN(CN(C3)C2)C1
+OCC[N@@+]12CCO[Ni+2]342(OCC1)OCC[N@+]4(CCO)CCO3.[O-][Cl](=O)(=O)=O
+OCC[S@@]1(=O)CC[S@@](=O)(CCO)[Pd@@]1(Cl)Cl
+OCCc1nnn(C)n1
+OCCc1nnn(n1)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OCCc1nnnn1C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OCCc1nnnn1C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+OCN1C(=O)N(CO)[C@H]2N(CO)C(=O)N(CO)[C@@H]12
+OCOc1ccc2[nH]c3cc4c([nH]c5ccc(OCO)cc5c4=O)cc3c(=O)c2c1
+OC[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(CO)C6=C12
+OC[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(CO)C6=C12
+OC[C@@H](C)CCC(=O)[C@H](C)[C@@H]1[C@]2(SCCS2)C[C@@H]2[C@H]3CC[C@@H]4C[C@@H](O)CC[C@@]4(C)[C@@H]3CC[C@]12C.CC(=O)O
+OC[C@@H](O)C(=O)O[Pt@]1(N[C@@H]2CCCC[C@@H]2N1)OC(=O)[C@H](O)CO
+OC[C@@H](O)COc1ccc2c(NO[N+]2[O-])c1
+OC[C@@H](O)COc1ccc2c(no[n+]2[O-])c1
+OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](N)c1nnc2n[nH]c(=S)n2n1
+OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)C(=O)O[Pt@]1(NC[C@H](C)N1)OC(=O)[C@H](O)[C@H](O)[C@H](O)[C@H](O)CO
+OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)[C@H](Nc1ccc(cc1)[S@@](=O)(=O)c1ccc(cc1)N[C@@H]([C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)CO)S(=O)(=O)O)S(=O)(=O)O
+OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)c1cnn(n1)c1ccccc1
+OC[C@@H](O)[C@@H](O)[C@@H](O)c1cnn(n1)c1ccccc1
+OC[C@@H](O)[C@@H](O)c1cnn(n1)c1ccccc1
+OC[C@@H](O)[C@@H]1O[C@@](C)(C)O[C@@H]1[C@H](O)CO
+OC[C@@H](O)[C@H](O[C@H]1O[C@@H](CO)[C@H](O)[C@@H](O)[C@@H]1O)[C@@H](O)c1cnn(n1)c1ccccc1
+OC[C@@H](O)[C@H]1OC(=O)C(=C1O)Nc1ccc(cc1)[S@](=O)(=O)c1ccc(cc1)NC1=C(O)[C@H](OC1=O)[C@@H](O)CO
+OC[C@@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+OC[C@@H]1CO[C@H](O1)C(CC)CC.CCC(CC)[C@H]1OC[C@H](O)CO1
+OC[C@@H]1CO[C@H](O1)c1ccccc1.O[C@@H]1CO[C@H](OC1)c1ccccc1
+OC[C@@H]1C[C@@]21c1ccccc1c1ccccc21
+OC[C@@H]1C[C@H](C[C@H]1CO)n1ccc(=N)[nH]c1=O
+OC[C@@H]1C[C@H](C[C@H]1CO)n1ccc(=O)[nH]c1=O
+OC[C@@H]1C[C@H]2C[C@@H]1[C@]1(OCCO1)C2
+OC[C@@H]1O[C@@H]([C@H](O)[C@@H]1O)c1cnn2c(=O)[nH]ncc12
+OC[C@@H]1O[C@@H](c2cnn(n2)c2ccccc2)[C@H](O)[C@H]1O
+OC[C@@H]1O[C@H](C[C@@H]1O)n1c(=O)[nH]c(=O)c2nc3c(ccc4cc5ccccc5cc34)nc12
+OC[C@@H]1O[C@H](O)[C@@H](O)[C@H](O)[C@@H]1O.O[C@H]1[C@@H](O)[C@@H](O)[C@H](O)[C@@H](O)[C@@H]1O
+OC[C@@H]1O[C@H](OC[C@@H](O)[C@@H](O)[C@@H](O)c2cnn(n2)c2ccccc2)[C@@H](O)[C@H](O)[C@H]1O
+OC[C@@H]1O[C@H](O[C@@H](CO)[C@H]2O[C@@H](O[C@H]12)c1ccccc1)c1ccccc1
+OC[C@@H]1O[C@H]([C@@H](O)[C@H]1O)n1c(=O)[nH]/c(=N)/[nH]c1=O
+OC[C@@H]1O[C@H]([C@@H]2OP(=O)(O[C@H]12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)n1cc(Br)c(=O)[nH]c1=O
+OC[C@@H]1O[C@H]([C@@H]2OP(=O)(O[C@H]12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)n1cc(F)c(=O)[nH]c1=O
+OC[C@@H]1O[C@H]([C@@H]2OP(=O)(O[C@H]12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)n1ncc(=O)[nH]c1=O
+OC[C@@H]1[C@@H](CO)[C@@H]2CC[C@H]1[C@]2(c1ccccc1)c1ccccc1
+OC[C@@H]1[C@@H](CO)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl
+OC[C@@H]1[C@H](CO)[C@@H]2CC[C@H]1[C@@]2(Cc1ccccc1)Cc1ccccc1
+OC[C@@]1(C)C=C2C(=C(C)[C@@]3(CC3)C(=O)[C@]2(C)O)[C@H]1O
+OC[C@@]1(C)C=C2C(=C(C)[C@]3(CC3)[C@](C)(O)C2=O)[C@H]1O
+OC[C@@]1(C)[C@H](CC[C@]21OCCO2)C=C(C)C
+OC[C@@]1(CNc2cc(Cl)nc(N)n2)C[C@H](CCCCc2ccccc2)C1
+OC[C@@]1(CNc2cc(Cl)nc(N)n2)C[C@H](Cc2ccccc2)C1
+OC[C@@]1(CNc2nc(N)nc(Cl)c2/N=N/c2ccc(Cl)cc2)C[C@@H](OCc2ccccc2)C1
+OC[C@@]1(CNc2nc(N)nc(Cl)c2N)C[C@@H](Cc2ccccc2)C1
+OC[C@@]1(CNc2nc(N)nc(Cl)c2N)C[C@H](CCc2ccccc2)C1
+OC[C@@]1(CNc2nc(N)ncc2Cl)C[C@H](CCc2ccccc2)C1
+OC[C@@]1(CNc2nc(N)ncc2N)C[C@@H](CCc2ccccc2)C1
+OC[C@@]1(O)C[C@@H](CNc2cc(Cl)nc(N)n2)C1
+OC[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+OC[C@@]12CCCC[C@H]2C[C@@]2(OCCO2)CC1
+OC[C@@]12CO[C@H](c3ccc(cc3)NC(=O)C)N2[C@H](OC1)c1ccc(cc1)NC(=O)C
+OC[C@@]12C[C@@]3(OCCO3)CC[C@H]2[C@H](C)C=C[C@H]1O
+OC[C@@]12[C@@H]3[C@H]4[C@H]5[C@@H]3[C@@H]1[C@H]5[C@@H]24
+OC[C@H](/N=C/[C@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18)[C@@H](O)c1ccc(cc1)[N+](=O)[O-]
+OC[C@H](/N=C/[C@@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18)[C@@H](O)c1ccc(cc1)[N+](=O)[O-]
+OC[C@H](O)COP1(=O)O[Pt@@]2(N[C@H]3CCCC[C@@H]3N2)O1
+OC[C@H](O)[C@H](O)[C@@H](O)CO.OC(=O)c1ccccc1
+OC[C@H](O)[C@H](O)[C@@H](O)c1nnc2n[nH]c(=S)n2n1
+OC[C@H](O)[C@H](O)[C@H](O)[C@@H](O)c1nnc2n[nH]c(=S)n2n1
+OC[C@H](O)[C@H](O)[C@H](O)c1cnn(n1)c1ccc(Br)cc1
+OC[C@H](O)[C@H](O)[C@H](O)c1cnn(n1)c1ccccc1
+OC[C@H](O)[C@H](O)c1cnn(n1)c1ccccc1
+OC[C@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1
+OC[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21
+OC[C@H]1C[C@](O)(CNc2cc(Cl)nc(N)n2)C1
+OC[C@H]1N[Pt@](Cl)(Cl)N[C@H]1CO
+OC[C@H]1O[C@@H](C[C@@H]1O)n1cc(C)c(NC[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)nc1=O
+OC[C@H]1O[C@@H]([C@@H](O)[C@@H]1O)n1ccc(NC[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)nc1=O
+OC[C@H]1O[C@@H]([C@@H](O)[C@@H]1O)n1ccc(cc1=O)OC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+OC[C@H]1O[C@@H]([C@H](O)[C@H]1O)n1c[n+](c2c(O)ncnc12)[Pt@@](N)(N)[n+]1cn([C@H]2O[C@H](CO)[C@H](O)[C@H]2O)c2ncnc(O)c12
+OC[C@H]1O[C@@H]([C@H](O)[C@H]1O)n1ccc(N)[n+](c1=O)[Pt@](I)(I)[n+]1c(N)ccn([C@H]2O[C@H](CO)[C@H](O)[C@H]2O)c1=O
+OC[C@H]1O[C@H](O)[C@H](N[Pt@](Cl)(Cl)N[C@@H]2[C@@H](O)O[C@H](CO)[C@H](O)[C@H]2O)[C@@H](O)[C@@H]1O
+OC[C@H]1O[C@H]1CC[C@H]1O[C@](C)(C)O[C@H]1CC[C@@H]1O[C@@H]1CO
+OC[C@H]1[C@@H](CO)[C@H]2c3ccccc3[C@@H]1c1ccccc21
+OC[C@H]1[C@@H](CO)[C@]1(c1ccccc1)c1ccccc1
+OC[C@]1(C)C=C2C(=C(C)[C@@]3(CC3)[C@@](C)(O)C2=O)[C@H]1O
+OC[C@]1(C)C=C2C(=C(C)[C@@]3(CC3)[C@](C)(O)[C@@H]2O)[C@H]1O
+OC[C@]1(C)CCC[C@@]21OCCO2
+OC[C@]1(CNc2nc(N)nc(Cl)c2/N=N/c2ccc(Cl)cc2)C[C@H](OCc2ccccc2)C1
+OC[C@]1(CNc2nc(N)nc(Cl)c2N)C[C@@H](OCc2ccccc2)C1
+OC[C@]1(C[C@H](Cc2ccccc2)C1)Cn1ccc(=O)[nH]c1=O
+OC[C@]1(O)C[C@H](COc2cc(Cl)nc(N)n2)C1
+OC[C@]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+ON(=O)c1ccc2c(c1)n1c(N3CCCC3)n3ccccc3c1c1c3ccccn3c(N3CCCC3)n21.O[Cl](=O)(=O)=O
+ON1C(=O)C[C@@H]2[C@H]1C=C[C@]12CCCC1
+ON1C(=O)[C@@]2(CCCCC2)C(=N)[C@@]21CCCCC2
+ON1C(C)(C)CC(/N=C\C=N\C2CC(C)(C)N(O)C(C)(C)C2)CC1(C)C
+ONC(=O)C[C@@]12[C@H]3[C@H]4[C@@H]1[C@H]1[C@@H]2[C@@H]3[C@@]41CC(=O)NO
+ONC(=O)[C@@H]1CCCC[C@@]21OCCO2
+ONC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)NO
+ON[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+OP(=O)(O)O[C@@H]1[C@@H](OP(=O)(O)O)[C@@H](OP(=O)(O)O)[C@H](OP(=O)(O)O)[C@H](OP(=O)(O)O)[C@@H]1OP(=O)(O)O
+OP(=O)(O)O[C@H]1[C@H](OP(=O)(O)O)[C@@H](OP(=O)(O)O)[C@@H](OP(=O)(O)O)[C@@H](OP(=O)(O)O)[C@@H]1OP(=O)(O)O
+OP(=O)(O)O[Pt@]1(O)N[C@@H]2CCCC[C@H]2N1
+OS(=O)(=O)O.C1CCN2C[C@@H]3C[C@@H](CN4CCCC[C@@H]34)[C@H]2C1
+OS(=O)(=O)O[Pt@@]1(O)N[C@@H]2CCC[C@H]2N1
+OS(=O)(=O)SCCN[C@H]1CC[C@H](NCCSS(=O)(=O)O)CC1
+OS(=O)(=O)[C@@]1(F)C(F)(F)C(F)(F)[C@](F)(C(F)(F)C1(F)F)C(F)(F)C(F)(F)C(F)(F)C(F)(F)F
+OS(=O)(=O)c1ccc2cc3nn(nc3cc2c1)c1ccc(/C=C/c2ccc(cc2S(=O)(=O)O)n2nc3cc4cc(ccc4cc3n2)S(=O)(=O)O)c(c1)S(=O)(=O)O
+O[C@@H](C(C)(C)C)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)N(C)C(C)(C)C
+O[C@@H](C/C=C(\[C@@H](O)S(=O)(=O)O)/[C@@H](O)S(=O)(=O)O)S(=O)(=O)O
+O[C@@H](C/N=C(\CC(=O)c1ccccc1)/c1ccccc1)C/N=C(\CC(=O)c1ccccc1)/c1ccccc1
+O[C@@H](CNC(=O)/C=C/c1cccc(c1)[N+](=O)[O-])CNC(=O)/C=C/c1cccc(c1)[N+](=O)[O-]
+O[C@@H](COc1ccc2c(C)cc(=O)oc2c1C(=O)C)CN1CC[C@@](O)(CC1)c1ccccc1
+O[C@@H]([C@@H]1CC[C@H]([C@@H](O)C(C)(C)C)[S@@]1(=O)=O)C(C)(C)C
+O[C@@H]([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+O[C@@H](c1ccccc1)[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@-]9([C@@H](O)c2ccccc2)C7=C41
+O[C@@H](c1ccccc1)[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@@-]9([C@@H](O)c2ccccc2)C7=C41
+O[C@@H]1C(C)(C)[C@H](O)[C@]1(C)C
+O[C@@H]1C/[N+](=C\c2ccccc2)/[Pt@]2(OC(=O)CC(=O)O2)/[N+](=C/c2ccccc2)/C1
+O[C@@H]1CCCC[C@@H]2[C@@H]1C(=O)N[C@@]12CCCCC1
+O[C@@H]1CCCC[C@@H]2[C@@H]1NC(=O)[C@]12CCCCC1
+O[C@@H]1CCCN[C@@H]1CN(C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O[C@@H]1CCC[C@@]21CCCC2
+O[C@@H]1CCN(CC1)C[C@@H]1NC(=O)[C@H](CN2CC[C@H](O)CC2)NC1=O
+O[C@@H]1CCN(C[C@H]1CN[C@@]12C[C@@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)OCc1ccccc1
+O[C@@H]1CCN(Cc2ccccc2)C[C@@H]1CN[C@@]12C[C@@H]3C[C@H](C[C@H](C3)C2)C1
+O[C@@H]1CCN(Cc2ccccc2)C[C@H]1CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O[C@@H]1CCNC[C@@H]1CNC12C[C@H]3C[C@@H](C[C@@H](C3)C2)C1
+O[C@@H]1CC[C@@H](CC1)C(C)(C)[C@@H]1CC[C@H](O)CC1
+O[C@@H]1CC[C@@]2(OCCO2)C[C@H]1C
+O[C@@H]1CC[C@H](CC1)C(C)C.O[C@@H]1CC[C@H](CC1)C(C)C
+O[C@@H]1CC[C@]2(C)C(=CCC[C@@]32OCCO3)C1(C)C
+O[C@@H]1CC[C@]2(CC1)NC(=O)[C@@]1(CCCCC1)[C@]2(O)c1ccccc1
+O[C@@H]1CC[C@]23C4=C5C6=C2[Fe]27893456C3=C8[C@]19C7=C23
+O[C@@H]1C[C@@H](C[Hg]OC(=O)c2ccccc2)O[C@H](C[Hg]OC(=O)c2ccccc2)C1
+O[C@@H]1C[C@@H](c2ccccc2)N(C)[C@@H](C1)c1ccccc1
+O[C@@H]1C[C@@H]2CC[C@H]1[C@]12OCCO1
+O[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21
+O[C@@H]1C[C@](C)(C)C[C@H](O)C1(C)C
+O[C@@H]1[C@@H](C)[C@H](N[C@H](c2ccccc2)[C@@H]1C)c1ccccc1
+O[C@@H]1[C@@H](COC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)O[C@@H]([C@H]1O)n1cnc2c(N)ncnc12
+O[C@@H]1[C@@H](COC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)O[C@@H]([C@H]1O)n1cnc2c(S)ncnc12
+O[C@@H]1[C@@H](O)[C@@H]2C[C@H]1[C@@H]1[C@H]2[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)[C@@]2(Cl)Cl)Cl
+O[C@@H]1[C@@H](O)[C@@H]2c3ccccc3[C@H]1c1ccccc21
+O[C@@H]1[C@@H](SCc2ccccc2)OC[C@H]2O[C@]3(CCCCC3)O[C@@H]12
+O[C@@H]1[C@@H]2CCC[C@H]1[C@@]1(O)CCCC[C@@H]1[C@]12CCCCC1
+O[C@@H]1[C@@H]2[C@]3(C)O[C@]4(C)[C@H]1[C@]1(C)O[C@@]2(C)[C@H]3[C@@H](O)[C@H]41
+O[C@@H]1[C@H](O)[C@H](O)[C@](O)(CNCc2ccccc2)[C@@H](O)[C@H]1O
+O[C@@H]1[C@H]2[C@@H]3CC[C@@H](C3)[C@@H]2[C@@H](C2OCCO2)[C@@H]2[C@H]3CC[C@H](CC3)[C@H]12
+O[C@@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(Cc1ccccc1)c1ccccc1
+O[C@@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(Cc1ccccc1)c1cccs1
+O[C@@]1(CCN(CC1)C1CC1)c1cccc(c1)C(F)(F)F
+O[C@@]1(CSC[C@@]1(O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+O[C@H](C/N=C(/C)\CC(=O)c1ccccc1)C/N=C(/C)\CC(=O)c1ccccc1
+O[C@H](CCCN[Pt@@](Cl)(Cl)NCCC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]
+O[C@H](CCCN[Pt](Cl)(Cl)NCCC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]
+O[C@H](CCN[Pt@@](Cl)(Cl)NCC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]
+O[C@H](CCN[Pt](Cl)(Cl)NCC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]
+O[C@H](CNC(=O)/C=C/c1cccc(c1)[N+](=O)[O-])CNC(=O)/C=C/c1cccc(c1)[N+](=O)[O-]
+O[C@H](CNC(=O)/C=C/c1ccccc1)CNC(=O)/C=C/c1ccccc1
+O[C@H](CN[Pt@@](Cl)(Cl)NC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]
+O[C@H](CN[Pt](Cl)(Cl)NC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]
+O[C@H](COC(=O)c1ccccc1)[C@H](O)[C@H](O)COC(=O)c1ccccc1
+O[C@H](COC(=O)c1ccccc1)[C@H]1O[C@@H](O[C@@H]1[C@H](O)COC(=O)c1ccccc1)c1ccccc1
+O[C@H](COC(=O)c1ccccc1)[C@H]1O[C@@H](O[C@@H]1[C@H](O)COC(=O)c1ccccc1)c1ccccc1.C1OCOCO1
+O[C@H](COc1ccccc1)Cn1cc/c(=N)/cc1
+O[C@H](C[S@@](=O)(=O)C[C@H](O)c1ccccc1)c1ccccc1
+O[C@H]([C@H]1CCCCN1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O[C@H](c1ccccc1)[C@@H](C)C(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O[C@H](c1nccc2ccccc12)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O[C@H](c1nccc2ccccc12)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+O[C@H]1/C(=C/c2ccccc2)/CNC/C/1=C\c1ccccc1
+O[C@H]1C(=O)O[Pt@]2(N[C@@H]3CCCC[C@@H]3N2)OC1=O
+O[C@H]1CC(=C[C@@H](O)[C@H]1O)C(=O)[OH+][Pt@@+2]1(N[C@@H]2CCCC[C@@H]2N1)[OH+]C(=O)C1=C[C@@H](O)[C@@H](O)[C@@H](O)C1
+O[C@H]1CCCCCCCCCC[C@@]21OCCO2
+O[C@H]1CCN(CC1)C1(CCCCC1)c1ccccc1
+O[C@H]1CCN(Cc2ccccc2)C[C@@H]1CN(C(=O)C)[C@@]12C[C@@H]3C[C@@H](C[C@H](C3)C2)C1
+O[C@H]1CC[C@@H](CC1)N1C(=O)c2ccccc2C1=O
+O[C@H]1CC[C@@H](CC1)[C@H]1[C@H]([C@H]2CC[C@@H](O)CC2)[C@H]2CCCC[C@@H]2[C@@H]2CCCC[C@H]12
+O[C@H]1CC[C@@H]2[C@@H]3CC[C@@H]4Cc5nc6C[C@@]7(C)[C@@H](CC[C@@H]8[C@@H]9CC[C@H](O)[C@@]9(C)CC[C@H]78)Cc6nc5C[C@@]4(C)[C@@H]3CC[C@@]12C
+O[C@H]1CC[C@H](CC1)C(C)(C)[C@@H]1CC[C@H](O)CC1
+O[C@H]1CC[C@H](CC1)NS(=O)(=O)c1ccc(N)cc1
+O[C@H]1CN/C(=N)/NC1
+O[C@H]1CNC[C@H](O)CNC1.Cc1ccc(cc1)S(=O)(=O)O
+O[C@H]1CO[C@@H](c2cnn(n2)c2ccccc2)[C@@H]1O
+O[C@H]1C[C@@H]2N[Pt@@](Cl)(Cl)N[C@H]2C[C@H]1O
+O[C@H]1C[C@@]2(SCCS2)CC2(SCCS2)C1
+O[C@H]1C[C@H](c2ccccc2)[C@@]2([C@H](O)c3ccccc3[C@H]2O)[C@@H](C1)c1ccccc1
+O[C@H]1[C@@H](COP2(=O)O[Pt@]3(N[C@H]4CCCC[C@H]4N3)O2)O[C@@H]([C@@H]1O)n1cnc2c(N)ncnc12
+O[C@H]1[C@@H](O)[C@@H](O)[C@H](O)[C@@H](O)[C@@H]1O
+O[C@H]1[C@@H]2CCN(CC2)[C@@H]1CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O[C@H]1[C@@H]2CN3CCN(C2)C[C@@]1(C3)c1ccccc1
+O[C@H]1[C@@H]2[C@]3(C)O[C@@]4(C)[C@H]5C[C@@H]3[C@]2(C)O[C@@]5(C)[C@@H]14
+O[C@H]1[C@@]2(SCCS2)CC[C@]2(C)CCCC[C@@]12C
+O[C@H]1[C@H](O)CN(OC/C=C/c2ccccc2)C[C@H]1O
+O[C@H]1[C@H](O)[C@H](O)[C@H](O)[C@H](O)[C@H]1O
+O[C@H]1[C@H]2CCN(CC2)[C@H]1CN1CCC(=CC1)c1ccccc1
+O[C@H]1[C@]2(CCCC2)[C@@H](O)[C@@]21CCCC2
+O[C@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(Cc1ccccc1)c1cccc2ccccc12
+O[C@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(c1ccccc1)c1cccs1
+O[C@]1(C#Cc2ccccc2)c2ccccc2[C@@](O)(C#Cc2ccccc2)c2ccccc12
+O[C@]1(CCCCCCCC[C@](O)(CCCCCCCC1)c1ccccc1)c1ccccc1
+O[C@]1(CC[C@@H](CC1)C(C)(C)C)Cc1ccccc1
+O[C@]1(CC[C@H](CC1)C(C)(C)C)C#C[C@]1(O)CC[C@@H](CC1)C(C)(C)C
+O[C@]1([C@H]2CCN(CC2)[C@H]1CN1CCOCC1)c1ccccc1
+O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O[C@]12[C@H]3CCC[C@H]1CCC[C@@H]2CCC3
+O[Cl](=O)(=O)=O.C1CCN(C1)c1n2ccccc2c2n1c1ccccc1n1c(N3CCCC3)n3ccccc3c21
+O[Cl](=O)(=O)=O.O1CCN(CC1)c1n2ccccc2c2n1c1ccccc1n1c2c2ccccn2c1N1CCOCC1
+O[Ni](O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+O[Se](=O)(=O)O[Pt@]1(O)N[C@@H]2CCCC[C@H]2N1
+Oc1c2OCN(Cc2c(C(=O)O)c2CN(COc12)C1CCCCC1)C1CCCCC1
+Oc1cc(CCNC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)ccc1O
+Oc1cc(CN[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)nc(O)n1
+Oc1cc(Nc2ccc3nn(C)nc3c2)c2c(ccc3nn(C)nc23)n1
+Oc1cc(cc2cc(cc(NS(=O)(=O)c3ccc4[OH+][Pt@+2]5(N[C@@H]6CCCC[C@H]6N5)[OH+]C(=O)c4c3)c12)[S@](=O)(=[OH+])[O-])[S@](=O)(=[OH+])[O-]
+Oc1cc(cc2cc(cc(NS(=O)(=O)c3ccc4[OH+][Pt@@+2]5(N[C@@H]6CCCC[C@H]6N5)[OH+]C(=O)c4c3)c12)[S@](=O)(=[OH+])[O-])[S@](=O)(=[OH+])[O-]
+Oc1cc(ccc1/C=N/c1ccccc1)[S@](=O)(=O)c1ccc(/C=N/c2ccccc2)c(O)c1
+Oc1cc2[nH]c3cccc(C)c3c(=O)c2c2[nH]c3cccc(C)c3c(=O)c12
+Oc1cc2c(cc1O)[C@]1(C)CC[C@@]2(C)c2cc(O)c(O)cc12
+Oc1ccc(O)c(CNc2ccc(cc2)C(=O)OC[C@]23C[C@H]4C[C@@H](C[C@H](C4)C3)C2)c1
+Oc1ccc(O)c(CNc2ccc(cc2)C(=O)O[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c1
+Oc1ccc(O)c2c1C(=O)c1sc3nc4c(c(=O)n(C)c(=O)n4C)n3c1C2=O
+Oc1ccc(O)c2c1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+Oc1ccc(c(O)c1)/C(=N/N=C(/C)\c1ccc(O)cc1O)/C
+Oc1ccc(cc1)/N=C/1\CC/C(=C(\c2ccccc2)/c2ccc(cc2)Nc2ccc(O)cc2)/CC1
+Oc1ccc(cc1)C(=O)CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Oc1ccc(cc1)C(=O)O[C@@H]1CN2CC[C@H]1CC2
+Oc1ccc(cc1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+Oc1ccc(cc1)[C@@H]1CC(=O)[C@H](C(=O)Nc2ccccc2)C(=O)C1
+Oc1ccc(cc1)[C@@H]1N[Pt@@](Cl)(Cl)N[C@H]1c1ccc(O)cc1
+Oc1ccc(cc1)[C@@H]1N[Pt@](Cl)(Cl)N[C@@H]1c1ccc(O)cc1
+Oc1ccc(cc1)[C@@]1(Cl)[C@](Cl)(C(F)(F)F)[C@@]1(Cl)C(F)(F)F
+Oc1ccc(cc1)[C@@]1(N=C(Nc2ccc(cc2)[S@](=O)(=O)c2ccc(cc2)NC2=N[C@@](c3ccc(O)cc3)(c3ccccc23)c2ccccc2O)c2ccccc12)c1ccccc1O
+Oc1ccc(cc1)[C@H]1N(C2CCCCC2)[C@H](c2ccc(O)cc2)N(C2CCCCC2)[C@H](c2ccc(O)cc2)N1C1CCCCC1
+Oc1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Oc1ccc(cc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Oc1ccc(cc1CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1ccccc1
+Oc1ccc2c(c1)[C@]13CCCC[C@@H]3[C@H](N(C)CC1)[C@@]12CC1
+Oc1ccc2c3c1c(O)nnc3c1cccc3cccc2c13
+Oc1ccc2cc(C(=O)Nc3scc(n3)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(=O)oc2c1
+Oc1ccc2ccccc2c1/C=N/C[C@H]1CC[C@@H](C/N=C/c2c(O)ccc3ccccc23)CC1
+Oc1ccc2ccccc2c1/C=c/1\sc2nc3ccccc3n2c1=O
+Oc1cccc(c1)[C@@H]1N[Pt@@](Cl)(Cl)N[C@H]1c1cccc(O)c1
+Oc1cccc(c1)[C@@H]1N[Pt@](Cl)(Cl)N[C@@H]1c1cccc(O)c1
+Oc1cccc(c1)[C@@H]1N[Pt@](Cl)(Cl)N[C@H]1c1cccc(O)c1
+Oc1ccccc1/C(=N\CC/N=C(\C)/c1ccccc1O)/C
+Oc1ccccc1/C=N/N/C(=N/N=C/c1ccccc1O)/N/N=C/c1ccccc1O
+Oc1ccccc1/C=N/N1/C(=N\c2ccccc2)/C(=N\c2ccccc2)/N(C1=S)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Oc1ccccc1/C=N/[C@@H]1CC[C@@H](CC1)C[C@H]1CC[C@H](CC1)/N=C/c1ccccc1O
+Oc1ccccc1/C=c\1/sc2nc3ccccc3n2c1=O
+Oc1ccccc1C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Oc1ccccc1C(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+Oc1ccccc1[C@@H](N(C)/N=C\c1ccccc1O)N(C)/N=C\c1ccccc1O
+Oc1ccccc1[C@H](/N=C/c1ccccc1O)/N=C/c1ccccc1O
+Oc1ccccc1[C@H]1N(CC/N=C\c2ccccc2O)CCN1CC/N=C\c1ccccc1O
+Oc1ccccc1[C@H]1[N+]2=Cc3ccccc3[OH+][Zr]34562([OH+]c2ccccc2C=[N+]14)[OH+]c1ccccc1C=[N+]5[C@H](c1ccccc1O)[N+]6=Cc1ccccc1[OH+]3
+Oc1ccccc1[Hg]N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl
+Oc1ccn(CC(=O)N2CC[C@@]3(CC2)SS[C@]2(CCN(CC2)C(=O)Cn2ccc(O)cc2=O)S3)c(=O)c1
+Oc1ccnc2c1C(=O)c1nc3ccccc3c3ccnc2c13
+Oc1nc(N)c2nc3c4cccc5cccc(c3nc2n1)c45.Oc1nc(O)c2nc3c4cccc5cccc(c3nc2n1)c45
+Oc1nc(S)nc(c1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Oc1nc2c(nc1N[C@@]13C[C@H]4C[C@H](C[C@H](C4)C3)C1)c(=O)oc1ccccc21
+Oc1nc2cc3cn[nH]c3cc2c(O)n1
+Oc1nc2ccccc2c2ccccc2nc(O)c2ccccc12
+Oc1ncccc1OC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+Oc1nnc(O)c2nc3c(nc12)c1nc2c(O)nnc(O)c2nc1c1nc2c(O)nnc(O)c2nc31
+Oc1on[n+](c1)[C@]12CC[C@H](c3ccccc13)c1ccccc21
+S1C[C@@]23CSC[C@@]3(C1)CC2
+S=C(N/N=C(/C)\c1ccccn1)N1CC[C@@H](CC1)[C@@H]1CCN(CC1)C(=S)N/N=C(/C)\c1ccccn1
+S=C(N/N=C(/C)\c1nccnc1C)N1CC[C@@H](CC1)c1ccccc1
+S=C(N/N=C(\C)/c1cccc(n1)/C(=N\NC(=S)N1CCCC1)/C)N1CCCC1
+S=C(N/N=C(\C)/c1ccccn1)N1C[C@@H]2CC[C@@H](CC2)C1
+S=C(N/N=C(\C)/c1ccccn1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+S=C(N/N=C(\C)/c1ccncn1)N1C[C@H]2CC[C@H](CC2)C1
+S=C(N/N=C(\C)/c1cnccn1)N1C[C@@H]2CC[C@@H](CC2)C1
+S=C(N/N=C/1\C(=O)N(C)c2ccccc12)NC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+S=C(N/N=C/C=C/c1ccc(cc1)N(C)C)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/C=C/c1ccccc1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/C=C/c1ccccc1[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/C=C/c1ccccc1[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1c(F)c(F)c(F)c(F)c1F)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1c(F)cccc1Cl)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1c(O)ccc2ccccc12)N[C@@H]1CN2CC[C@@H]1CC2
+S=C(N/N=C/c1c(O)ccc2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1c2ccccc2cc2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1c[nH]c2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1cc(Br)ccc1O)N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C/c1cc(Cl)ccc1O)N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C/c1cc(ccc1O)[N+](=O)[O-])N[C@@H]1CN2CC[C@@H]1CC2
+S=C(N/N=C/c1cc(ccc1O)[N+](=O)[O-])N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C/c1cc2OCOc2cc1[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1cc2OCOc2cc1[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc(Cl)c(Cl)c1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc(Cl)c(c1)[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc(Cl)c(c1)[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc(Cl)cc1Cl)N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C/c1ccc(cc1)C(=O)O)N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C/c1ccc(cc1)N(C)C)N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C/c1ccc(cc1)N(C)C)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc(cc1)OCc1ccccc1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc(cc1)[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc(cc1)[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc(cc1Cl)N(C)C)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc(o1)[N+](=O)[O-])NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+S=C(N/N=C/c1ccc(o1)[N+](=O)[O-])N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+S=C(N/N=C/c1ccc2OCOc2c1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccc2ccc3cccc4ccc1c2c34)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1cccc(OCc2ccccc2)c1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1cccc(c1)[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1cccc(c1)[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1cccc2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccccc1C(=O)O)N[C@@H]1CN2CC[C@@H]1CC2
+S=C(N/N=C/c1ccccc1C)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccccc1Cl)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C/c1ccccc1O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(N/N=C\c1cc(Cl)ccc1[N+](=O)[O-])N[C@@H]1CN2CC[C@@H]1CC2
+S=C(N/N=C\c1cc(Cl)ccc1[N+](=O)[O-])N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C\c1ccc(Cl)c(c1)[N+](=O)[O-])N[C@@H]1CN2CC[C@@H]1CC2
+S=C(N/N=C\c1ccc(Cl)c(c1)[N+](=O)[O-])N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C\c1ccc2OCOc2c1)N[C@@H]1CN2CC[C@@H]1CC2
+S=C(N/N=C\c1cccc(I)c1)N[C@@H]1CN2CC[C@@H]1CC2
+S=C(N/N=C\c1cccc(O)c1)N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C\c1cccc(c1)[N+](=O)[O-])N[C@@H]1CN2CC[C@@H]1CC2
+S=C(N/N=C\c1cccc(c1)[N+](=O)[O-])N[C@@H]1CN2CC[C@H]1CC2
+S=C(N/N=C\c1ccccc1[N+](=O)[O-])N[C@H]1CN2CC[C@@H]1CC2
+S=C(N/N=C\c1ccccc1[N+](=O)[O-])N[C@H]1CN2CC[C@H]1CC2
+S=C(NCCCNC(=S)N/N=C(\C)/c1ccccn1)N/N=C(/C)\c1ccccn1
+S=C(NCc1ccccc1)NNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC1CCCCC1
+S=C(NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)Nc1ccc(Cl)cc1
+S=C(NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)Nc1ccccc1
+S=C(NNC1=Nc2ccccc2/C/1=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+S=C(NN[C@@H](C)c1ncc2ccccc2c1)N1C[C@@H]2CC[C@@H](CC2)C1
+S=C(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NP(=O)(Oc1ccccc1)Oc1ccccc1
+S=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[Sn](c1ccccc1)(c1ccccc1)c1ccccc1
+S=C(Nc1ccc(cc1)S(=O)(=O)N1CCCCC1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+S=C(S[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(SC(=S)N(C)C)C6=C12)N(C)C
+S=C1NC(=O)/C(=C\c2cccc(n2)/C=C/2\SC(=S)NC2=O)/S1
+S=C1NC(=O)[C@]2(CC(=C(C)C[C@@H]2C)C)C(=O)N1
+S=C1NC/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/N1
+S=C1NC/C(=C\[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/N1
+S=C=N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+S=c1[nH][nH]c(CCC(=O)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)n1
+S=c1[nH]nc(n1N)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+S=c1[nH]nc2nnc(CCCc3nnc4n[nH]c(=S)n4n3)nn12
+S=c1[nH]nc2nnc(nn12)c1cccc(c1)c1nnc2n[nH]c(=S)n2n1
+S=c1[nH]nc2nnc(nn12)c1nnc2n[nH]c(=S)n2n1
+S=c1s/c(=C/c2ccccc2)/c2nc3ccccc3n12
+S=c1sc(=S)c2c([nH]1)n(C)c(=O)n(C)c2=O
+S=c1sc2c(s1)c(OCc1cc(cc(c1)C(C)(C)C)C(C)(C)C)c1sc(=S)sc1c2OCc1cc(cc(c1)C(C)(C)C)C(C)(C)C
+S=c1sc2n[nH]c(=S)n2[nH]1.c1cccnc1
+S=c1sc2sc(=S)sc2s1
+SC#N.C1CN2CCN1[Cu@+2]12N2CCN1CC2
+SC#N.C1CN2CCN1[Ni@+2]12N2CCN1CC2
+SCC(=N)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+SC[C@@H](Nc1c2cccc(C(=O)NCCN(C)C)c2n(C)c2ccccc12)C(=O)O.COS(=O)(=O)O
+SP1(=[O+][Ti]23456789([O+]=P(S)(SS1)c1ccccc1)(C1=C4C3=C2[C@@H]51)C1=C7C8=C6[C@H]91)c1ccccc1
+S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+Sc1nc(O)c2nc([nH]c2n1)/C(=C/c1ccc(cc1)/C=C(/NC(=O)c1ccccc1)\c1nc2c(O)nc(S)nc2[nH]1)/NC(=O)c1ccccc1
+Sc1nc2nc3c(nc2c(O)n1)c1ccccc1c1ncccc31
+Sc1ncc2[C@H]3c4ccccc4[C@@H](c2n1)c1ccccc31
+[B@]123[C@@]45[B@]67[B@@]89[C@]1(B2468)B3579
+[BH3-][N+]12CN3CN(CN(C3)C2)C1
+[BH3-][N@+]12CN3CN(CN(C3)C2)C1
+[Br-].BrC(=C)C[N+]12CN3CN(CN(C3)C2)C1
+[Br-].BrC(=C)C[N@@+]12CN3CN(CN(C3)C2)C1
+[C@@H]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)[C@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+[C@@H]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)C([C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+[C@@H]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)[C@]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+[CH-]1N=c2[nH]nnc2=C(N)[N+]1=O
+[Ca+2].Nc1nc(O)c2c(n1)n(c[n+]2[Cu@+2]1(NCCN1)[n+]1cn([C@@H]2O[C@@H](COP(=[OH+])([O-])[O-])[C@H](O)[C@@H]2O)c2nc(N)nc(O)c12)[C@@H]1O[C@@H](COP(=[OH+])([O-])[O-])[C@H](O)[C@@H]1O
+[Ca+2].Nc1nc(O)c2c(n1)n(c[n+]2[Cu@@+2]1(NCCN1)[n+]1cn([C@@H]2O[C@@H](COP(=[OH+])([O-])[O-])[C@H](O)[C@@H]2O)c2nc(N)nc(O)c12)[C@@H]1O[C@@H](COP(=[OH+])([O-])[O-])[C@H](O)[C@@H]1O
+[Cl-].CC1=CC(=[N+]2C(=S3[Pt@+2]42N1C(=S4[Pt@@+2]13S2=C(c3ccccc3)N3C(=CC(=[N+]4C(=S1[Pt@+2]234)c1ccccc1)C)C)c1ccccc1)c1ccccc1)C
+[Cl-].CC1=CC(=[N+]2C(=S3[Pt@@+2]4(S5=C(c6ccccc6)N6C(=CC(=[N+]7C(=S4[Pt@@+2]567)c4ccccc4)C)C)S4=C(c5ccccc5)N1[Pt@+2]234)c1ccccc1)C
+[Cl-].Cl[Cu+]12[n+]3c(cccc3=c3cccc[n+]23)c2cccc[n+]12
+[Cl-].Cl[Cu+]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23
+[Cl-].O=C(N/N=C/1\[C@](C)(C)/C(=N\NC(=O)C[N+](C)(C)C)/[C@@]1(C)C)C[N+](C)(C)C
+[Cl-].O=C(N/N=C\1/[C@](C)(C)/C(=N/NC(=O)C[N+](C)(C)C)/[C@]1(C)C)C[N+](C)(C)C
+[Cl-].OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)[C@@H]1N[C@H]2C[S+]1[Pd@+2]1([OH+]C(=O)[C@@H]3N[C@@H]([C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)CO)[S+]1C3)[OH+]C2=O
+[Cl-].OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)[C@@H]1N[C@H]2C[S+]1[Pd@+2]1([OH+]C(=O)[C@H]3C[S+]1[C@@H](N3)[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)CO)[OH+]C2=O
+[Cl-].OC[P+](CO)(CO)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[Cl-].OC[P+](CO)(CO)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[Cl-].[Cl-].N=C(N/N=C/c1ccc(cc1)c1cn2cc(C)ccc2[n+]1C)N/N=C/c1ccc(cc1)c1cn2cc(C)ccc2[n+]1C
+[Cl-].[Cl-].N=C(N/N=C/c1ccc(cc1)c1cn2ccsc2[n+]1C)N/N=C/c1ccc(cc1)c1cn2ccsc2[n+]1C
+[Cl-].[Cl-].N=C(\N/N=C/c1ccc(cc1)c1cn2cc(C)ccc2[n+]1C)/N/N=C/c1ccc(cc1)c1cn2cc(C)ccc2[n+]1C
+[Cl-].[Cl-].N=C(\N/N=C/c1ccc(cc1)c1cn2ccsc2[n+]1C)/N/N=C/c1ccc(cc1)c1cn2ccsc2[n+]1C
+[Cl-][Hg][C@@]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(Cl)C6=C12
+[Cl-][Hg][C@@]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[Cl-][Hg][C@]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(Cl)C6=C12
+[Cl-][Hg][C@]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[Cl-][Nb]12345678([Cl-])(C9=C4[C@-]7(C3=C19)[Si](C)(C)C)C1=C6[C@-]8(C5=C21)[Si](C)(C)C
+[Cl-][Nb]12345678([Cl-])(C9=C4[C@@-]7(C3=C19)[Si](C)(C)C)C1=C6[C@-]8(C5=C21)[Si](C)(C)C
+[Cl-][Zr]12345678([Cl-])(C9=C2C3=C1[C-]49)C1(=C7(C)C6(=C5(C)[C@-]81C)C)C
+[Cl-][Zr]12345678([Cl-])(C9=C2C3=C1[C-]49)C1(=C7(C)C6(=C5(C)[C@@-]81C)C)C
+[ClH+][Co+2]12([ClH+])([O+]=C3NCNC4[N-][NH+]1CC34)[O+]=C1NCNC3[N-][NH+]2CC13
+[ClH+][Co+2]12([ClH+])([O+]=c3nc[nH]c4[n-][n+]1cc34)[O+]=c1nc[nH]c3[n-][n+]2cc13
+[F-]B(F)(F)F.N[C@@]12CC[C@@](c3ccccc13)(c1ccccc21)[N+](C)(C)C
+[F-]B(F)(F)F.N[C@]12CC[C@](c3ccccc13)(c1ccccc21)[N+](C)(C)C
+[F-]P(F)(F)(F)(F)F.C[C@-]12C3=C4C5=C1[Co+3]16782345C2=C7[C@@-]8(C)C6=C12
+[F-]P(F)(F)(F)(F)F.C[C@@-]12C3=C4C5=C1[Co+3]16782345C2=C7[C@-]8(C)C6=C12
+[Hg]([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+[I-].C[C@@H]([N+](C)(C)C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[I-].C[C@@H]([N+](C)(C)C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[I-].c1ccc(cc1)[P+](C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)(c1ccccc1)c1ccccc1
+[I-].c1ccc(cc1)[P+](C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)(c1ccccc1)c1ccccc1
+[NH-]=[N+]=CC(=O)[C@@H](OC(=O)C)[C@@H](OC(=O)C)[C@H](OC(=O)C)C(=O)C=[N+]=[NH-]
+[NH-]=[N+]=CC(=O)[C@@H](OC(=O)C)[C@H](OC(=O)C)[C@H](OC(=O)C)C(=O)C=[N+]=[NH-]
+[NH-]=[N+]=NC(=O)[C@@]1(Br)CC[C@@H]2c3ccccc3[C@@](C1)([N+](=O)[O-])c1ccccc21
+[NH-]=[N+]=NC(=O)[C@@]1(Br)CC[C@H]2c3ccccc3[C@](C1)([N+](=O)[O-])c1ccccc21
+[NH-]=[N+]=NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[NH-]=[N+]=NC12C[C@H]3[C@@H]4CC5C[C@H]3[C@H](C2)[C@@H](C5)[C@@H]4C1
+[NH-]=[N+]=NC12C[C@]3(C)C[C@@](C)(C[C@@](C)(C3)C2)C1
+[NH-]=[N+]=N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1
+[NH-]=[N+]=N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[NH-]=[N+]=N[C@]12C[C@@H]3[C@H]4C[C@@H]5C[C@H]([C@H]4C1)[C@H](C2)[C@H]3C5
+[NH-]=[N+]=Nc1cc(N)c2nn[nH]n2[nH]1
+[NH-]=[N+]=Nc1cc(N)c2nnnn2n1
+[NH-]=[N+]=Nc1cc2c(NO[N+]2[O-])cc1[N+](=O)[O-]
+[NH-]=[N+]=Nc1cc2c(no[n+]2[O-])cc1[N+](=O)[O-]
+[NH-]=[N+]=Nc1ccc(cc1)/C=C/1\C[C@@H](C/C(=C\c2ccc(N=[N+]=[NH-])cc2)/C1=O)C(C)(C)C
+[NH-]=[N+]=Nc1ccc(cc1)/C=C/1\C[C@H](C/C(=C\c2ccc(N=[N+]=[NH-])cc2)/C1=O)C(C)(C)C
+[Na+].O=C1[OH+][Pt@+2]2(N[C@@H]3CCCC[C@H]3N2)[OH+]P1(=O)[O-]
+[Na+].O=C1[OH+][Pt@@+2]2(N[C@@H]3CCCC[C@H]3N2)[OH+]P1(=O)[O-]
+[Na+].[Cl-][Ru](Cl)(Cl)(Cl)(/[O+]=S/1\CCCC1)[n+]1ccc2ccccc2c1
+[Na+].[Cl-][Ru](Cl)(Cl)(Cl)(/[O+]=S\1/CCCC1)[n+]1ccc2ccccc2c1
+[Na+].[O-][S@](=O)(=[OH+])[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[S@](=O)(=[OH+])[O-]
+[Na+].[O-][S@](=O)(=[OH+])[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[S@](=O)(=[OH+])[O-]
+[NaH].CCCCCCCCCCCCCCCCCCSC[C@@]12[C@H](COS(=O)(=O)O)[C@@H](COS(=O)(=O)O)[C@@H](c3ccccc13)c1ccccc21
+[NaH].Cl.Cn1ccccc1.O=C(Nc1ccc(cc1)S(=O)(=O)c1ccc(cc1)NC(=O)c1cc(ccc1O)S(=O)(=O)O)c1cc(ccc1O)S(=O)(=O)O
+[NaH].Nc1c(/N=N/c2ccc(cc2)[S@@](=O)(=O)c2ccc(/N=N/c3c4ccc(cc4cc(c3N)S(=O)(=O)O)S(=O)(=O)O)cc2)c2ccc(cc2cc1S(=O)(=O)O)S(=O)(=O)O
+[NaH].Nc1c(/N=N/c2ccc(cc2)[S@@](=O)(=O)c2ccc(/N=N/c3cc(c4cccc(c4c3N)S(=O)(=O)O)S(=O)(=O)O)cc2)cc(c2cccc(c12)S(=O)(=O)O)S(=O)(=O)O
+[NaH].O=C(Nc1ccccc1)c1n[n+](c2cc(c(cc2Cl)[N+](=O)[O-])S(=O)(=O)O)n([nH]1)c1cc(c(cc1Cl)[N+](=O)[O-])S(=O)(=O)[O-]
+[NaH].O=C(Nc1ccccc1)c1n[n+](c2cc(c(cc2Cl)[N+](=O)[O-])S(=O)(=O)O)n(n1)c1cc(c(cc1Cl)[N+](=O)[O-])S(=O)(=O)[O-]
+[NaH].OS(=O)(=O)c1cc(/N=N/c2ccc(cc2)[S@](=O)(=O)c2ccc(/N=N/c3cc(c4cccnc4c3O)S(=O)(=O)O)cc2)c(O)c2ncccc12
+[NaH].Oc1c(/N=N/c2ccc(C(=O)Nc3ccc(cc3)[S@@](=O)(=O)c3ccc(cc3)NC(=O)c3ccc(/N=N/c4cc(c5cccnc5c4O)S(=O)(=O)O)cc3S(=O)(=O)O)c(c2)S(=O)(=O)O)cc(c2cccnc12)S(=O)(=O)O
+[NaH].Oc1ccc(cc1/N=N/c1ccc(cc1)[S@@](=O)(=O)c1ccc(/N=N/c2cc(ccc2O)S(=O)(=O)O)cc1)S(=O)(=O)O
+[NaH].Oc1nccc(CN[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c1O
+[O+]#C[Cr](C#[O+])(C#[O+])(C#[O+])(C#[O+])/[S+]=C\1/[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3
+[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C1C3(=C5(N)C4(=C26)C)C
+[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C1C3=C5(NC(C)(C)C)C4=C26
+[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C2C4=C5(N(C)C)C3=C16
+[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C2C5(=C3C1=C46/C=C/c1ccc(cc1)[N+](=O)[O-])C(F)(F)F
+[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C4(/C=C/c4ccc(cc4)[N+](=O)[O-])C1=C3C5(=C26)C(F)(F)F
+[O+]#C[Fe+]1234(C#[O+])(/C=C/CCC/C=C/[Fe+]5678(C#[O+])(C#[O+])[C@H]9C7=C6C5=C89)[C@@H]5C3=C2C1=C45.F[B-](F)(F)F
+[O+]#C[Fe+]1234(C#[O+])(/C=C/CCC/C=C/[Fe+]5678(C#[O+])(C#[O+])[C@H]9C7=C6C5=C89)[C@H]5C3=C2C1=C45.F[B-](F)(F)F
+[O+]#C[Fe+]1234(C#[O+])(/C=C/CCCC/C=C/[Fe+]5678(C#[O+])(C#[O+])C9=C6C7=C5[C@@H]89)C5=C3C2=C1[C@H]45.F[B-](F)(F)F
+[O+]#C[Fe+]1234(C#[O+])(/C=C/CCCC/C=C/[Fe+]5678(C#[O+])(C#[O+])C9=C6C7=C5[C@H]89)C5=C3C2=C1[C@H]45.F[B-](F)(F)F
+[O+]#C[Fe]123(C#[O+])(C#[O+])C4=C2C3(=C14)S(=O)(=O)Cl
+[O+]#C[Fe]1234(C#[O+])(C5=C2C3=C1[C@H]45)[C@@H]1COC(C(F)(F)F)(C(F)(F)F)C1(C)C
+[O+]#C[Fe]1234(C#[O+])(C[C@]56CC[C@@H](CC6=O)C5)[C@H]5C3=C2C1=C45
+[O+]#C[Fe]1234([C@@H]5C3=C2C1=C45)([C@@H]1CNC(=O)C1(C)C)P(c1ccccc1)(c1ccccc1)c1ccccc1
+[O+]#C[Fe]12345(C#[O+])(C6=C2C3=C1[C@@H]46)C1=C5(C)[C@H]2[C@@H](CC3=C4C5=C2[Fe+]345(C#[O+])(C#[O+])C#[O+])C1.[F-]P(F)(F)(F)(F)F
+[O+]#C[Fe]12345(C#[O+])(C6=C2C3=C1[C@H]46)C1=C5(C)[C@H]2[C@@H](CC3=C4C5=C2[Fe+]345(C#[O+])(C#[O+])C#[O+])C1.[F-]P(F)(F)(F)(F)F
+[O+]#C[MnH+]12(C#[O+])(C#[O+])[H-][MnH+]2(C#[O+])(C#[O+])(C#[O+])[P-]1(Br)N(C(C)C)C(C)C
+[O+]#C[MnH2+]12(C#[O+])(C#[O+])[H-][MnH2+]2(C#[O+])(C#[O+])(C#[O+])[P-]1(Br)N(C(C)C)C(C)C
+[O+]#C[Mo]1234(/N=N/c5ccc(C)cc5)([C@H]5C3=C2C1=C45)P(c1ccccc1)(c1ccccc1)c1ccccc1
+[O+]#C[Mo]1234(C#[O+])(/N=N/c5ccc(C)cc5)[C@H]5C3=C2C1=C45
+[O+]#C[Mo]1234(C#[O+])(/N=N/c5ccc(cc5)[N+](=O)[O-])[C@@H]5C3=C2C1=C45
+[O+]#C[Mo]1234(C#[O+])(/N=N/c5ccc(cc5)[N+](=O)[O-])[C@H]5C3=C2C1=C45
+[O+]#C[Mo]1234(C#[O+])(C#[O+])(c5ccs(=O)c5C)[C@@H]5C3=C2C1=C45
+[O+]#C[Rh@@]1(Cl)[AsH](C[AsH](c2ccccc2)(c2ccccc2)[Rh@](Cl)(C#[O+])[AsH](C[AsH]1(c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1
+[O+]#C[W+]12345(C#[O+])([OH+]/[N+]/1=C(\C)/C=C(C)C)[C@@H]1C4=C3C2=C51
+[O+]#[N+][Mn]123456([C@@H]7C3=C2C1=C47)C(=O)[Mn]12346([N+]#[O+])([C@H]6C3=C2C1=C46)C5=O
+[O-]/C(=N\c1nccs1)/[C@H](C)[NH+]1CC[C@@H](CC1)n1c(=O)[nH]c2ccccc12
+[O-]/C(=N\c1nccs1)/[C@H](C)[NH+]1CC[C@H](CC1)n1c(=O)[nH]c2ccccc12
+[O-]/N(/O)=C\1/C=C([N+](=O)[O-])C2(OC3C(O2)C(COP(=O)(O)OP(=O)(O)OP(=O)(O)O)OC3n2cnc3c(N)ncnc23)C(=C1)[N+](=O)[O-]
+[O-]/N(=C/1\C=C([N+](=O)[O-])C2(OC3C(O2)C(COP(=O)(O)OP(=O)(O)OP(=O)(O)O)OC3n2cnc3c(N)ncnc23)C(=C1)[N+](=O)[O-])/O
+[O-]C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[O-]C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[O-]C(=O)C(C)(C)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[O-]C(=O)C(C)(C)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[O-]C(=O)C(Cl)(Cl)Cl.OC(=O)C(Cl)(Cl)Cl.C12=C3C4=C5[C@@H]1[Fe+]16782345C2=C6C7=C1[C@@H]82
+[O-]C(=O)C(Cl)(Cl)Cl.OC(=O)C(Cl)(Cl)Cl.C12=C3C4=C5[C@H]1[Fe+]16782345C2=C6C7=C1[C@H]82
+[O-]C(=O)C1([NH2+]C[C@@H]2COCC2)CC[S@@](=O)(=O)CC1
+[O-]C(=O)C1([NH2+]C[C@@H]2COCC2)CC[S@](=O)(=O)CC1
+[O-]C(=O)CCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[O-]C(=O)CCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[O-]C(=O)CC[C-]1C2=C3C4=C1[Fe+]1567234[C@@H]2C6=C5C1=C72
+[O-]C(=O)CC[C-]1C2=C3C4=C1[Fe+]1567234[C@H]2C6=C5C1=C72
+[O-]C(=O)CC[C@@]12C3=C4C5=C1[Fe+]16782345[C@@H]2C7=C6C1=C82.[Cl-][Fe](Cl)(Cl)Cl
+[O-]C(=O)CC[C@]12C3=C4C5=C1[Fe+]16782345[C@H]2C7=C6C1=C82.[Cl-][Fe](Cl)(Cl)Cl
+[O-]C(=O)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[O-]C(=O)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+[O-]C(=O)[C@-]12C3=C4C5=C1[Co+3]16782345C2=C7[C@-]8(C(=O)[O-])C6=C12.[F-]P(F)(F)(F)(F)F
+[O-]C(=O)[C@@-]12C3=C4C5=C1[Co+3]16782345C2=C7[C@@-]8(C(=O)[O-])C6=C12.[F-]P(F)(F)(F)(F)F
+[O-]C(=O)[C@H]([NH2+]C(C)(C)C)C12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1
+[O-]C(=O)[C@H]([NH2+]C(C)(C)C)[C@]12C[C@]3(C)C[C@@](C)(C[C@@](C)(C3)C2)C1
+[O-]S(=O)(=O)O.C1CCc2ccc3c[n+]4c(ccc5ccccc45)n3c2C1
+[O-]S(=O)(=O)O.c1ccc2ccc3n4c(ccc5ccccc45)c[n+]3c2c1
+[O-]S(=O)(=O)[O-].C1[C@@H]2C[C@@H]3C[C@H]1CC(C2)(C3)N[Cd+2](NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-]S(=O)(=O)[O-].C1[C@@H]2C[C@@H]3C[C@H]1C[C@](C2)(C3)N[Cd@@+2](N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-]S(=O)(=O)[O-].O[Cu+2](O)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-]S(=O)(=O)[O-].O[Cu+2](O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-]S(=O)(=O)[O-].O[Mg+2](O)(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-]S(=O)(=O)[O-].O[Mg+2](O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-]S(=O)(=O)[O-].O[Zn+2](O)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-]S(=O)(=O)[O-].O[Zn+2](O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][Cl](=O)(=O)=O.C[C@@]1(Cc2ccccc2)C[N@+]21CCCCC2
+[O-][Cl](=O)(=O)=O.C[C@@]1(Cc2ccccc2)C[N@@+]21CCCCC2
+[O-][Cl](=O)(=O)=O.C[N@+]12C[C@@H]3C[C@H](C1)C[N@@+](C)(C3)[BH2+]2
+[O-][Cl](=O)(=O)=O.C[N@@+]12C[C@H]3C[C@@H](C1)C[N@+](C)(C3)[BH2+]2
+[O-][Cl](=O)(=O)=O.O1CC/S(=[O+]\[Hg+2](/[O+]=S\2/CCOCC2)(/[O+]=S/2\CCOCC2)(/[O+]=S\2/CCOCC2)(/[O+]=S/2\CCOCC2)/[O+]=S/2\CCOCC2)/CC1
+[O-][Cl](=O)(=O)=O.O1CC/S(=[O+]\[Hg+2](/[O+]=S\2/CCOCC2)(/[O+]=S\2/CCOCC2)(/[O+]=S\2/CCOCC2)(/[O+]=S\2/CCOCC2)/[O+]=S\2/CCOCC2)/CC1
+[O-][Cl](=O)(=O)=O.c1ccc(cc1)CC[N@+]12CC[N@+](CCc3ccccc3)(CC1)C2
+[O-][Cl](=O)(=O)=O.c1ccc(cc1)CC[N@@+]12CC[N@@+](CCc3ccccc3)(CC1)C2
+[O-][Cl](=O)(=O)=O.c1ccc(cc1)C[N@+]12CC[N@@+](CC1)(Cc1ccccc1)C2
+[O-][Cl](=O)(=O)=O.c1ccc(cc1)C[N@@+]12CC[N@+](CC1)(Cc1ccccc1)C2
+[O-][Cl](=O)(=O)=O.c1ccc(cc1)[C@@H]1O[C@@]2(CCCCC2)C[N@@+]21CCCC2
+[O-][Cl](=O)(=O)=O.c1ccc(cc1)[C@@H]1O[C@]2(CCCCC2)C[N@@+]21CCCC2
+[O-][Cl](=O)(=O)=O.c1ccc(cc1)[C@H]1C[N@+]2(CCCC2)CC2(CCCCC2)O1
+[O-][Cl](=O)(=O)=O.c1ccc(cc1)[C@H]1C[N@@+]2(CCCC2)CC2(CCCCC2)O1
+[O-][Cl](=O)(=O)=[OH+].C1CC[N@+]2(CC1)C[C@@]12Cc2ccccc2c2ccccc2C1
+[O-][Cl](=O)(=O)=[OH+].C1CC[N@+]2(CC1)C[C@]12Cc2ccccc2C1
+[O-][Cl](=O)(=O)=[OH+].C1CC[N@@+]2(CC1)C[C@]12Cc2ccccc2C1
+[O-][Cl](=O)(=O)=[OH+].C1CC[N@@+]2(CC1)C[C@]12Cc2ccccc2c2ccccc2C1
+[O-][N+](=O)/C(=C(/N[C@H](C)C12C[C@H]3C[C@@H](C[C@H](C3)C2)C1)\N[C@@H](C)C12C[C@H]3C[C@H](C[C@@H](C3)C2)C1)/C(=C(Cl)Cl)Cl
+[O-][N+](=O)/C=C/1\[SH+][Co+3]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2.c1ccc(cc1)CP(c1ccccc1)(c1ccccc1)c1ccccc1
+[O-][N+](=O)/C=C/1\[SH+][Ni+2]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2.c1ccc(cc1)CP(c1ccccc1)(c1ccccc1)c1ccccc1
+[O-][N+](=O)/C=C/1\[SH+][Pt+2]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2.c1ccc(cc1)CP(c1ccccc1)(c1ccccc1)c1ccccc1
+[O-][N+](=O)/C=C\1/[SH+][Co+3]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2.c1ccc(cc1)CP(c1ccccc1)(c1ccccc1)c1ccccc1
+[O-][N+](=O)/C=C\1/[SH+][Ni+2]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2.c1ccc(cc1)CP(c1ccccc1)(c1ccccc1)c1ccccc1
+[O-][N+](=O)/C=C\1/[SH+][Pt+2]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2.c1ccc(cc1)CP(c1ccccc1)(c1ccccc1)c1ccccc1
+[O-][N+](=O)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)C1=C[C-]2C(=[N+]([O-])[C@@]3(CCCCC3)[N+]2=O)C=C1
+[O-][N+](=O)C1=C[C-]2C(=[N+]([O-])[C@]3(CCCCC3)[N+]2=O)C=C1
+[O-][N+](=O)C1CCC(CC1)C1=C(N=C2CCCCC2C2CCCCC2=N1)c1ccc(cc1)[N+](=O)[O-]
+[O-][N+](=O)Cc1cnc2[nH]ncn2[nH]1
+[O-][N+](=O)Cc1cnc2nncn2n1
+[O-][N+](=O)O.NC(=N)N/N=C(/C=C/c1ccccc1O)\C=C\c1ccccc1O
+[O-][N+](=O)O.NC(=N)N/N=C(\C=C\c1ccccc1O)/C=C/c1ccccc1O
+[O-][N+](=O)O.NC(=N)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)O.NC(=N)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)O[Ca](O[N+](=O)[O-])(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)O[Ca](O[N+](=O)[O-])(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)O[Co]123(O[N+](=O)[O-])[N@+]4(CC[N@+]1(CC[N@+]3(CC[N@@+]2(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1
+[O-][N+](=O)O[Co]123(O[N+](=O)[O-])[N@+]4(CC[N@@+]1(CC[N@+]2(CC[N@+]3(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1
+[O-][N+](=O)O[Co]1234([S+]=C([N-][N+]3=C(C)c3cccc[n+]13)N1C[C@H]3CC[C@H](CC3)C1)[S+]=C([N-][N+]4=C(C)c1cccc[n+]21)N1C[C@@H]2CC[C@@H](CC2)C1
+[O-][N+](=O)O[Co]1234([S+]=C([N-][N+]3=C(C)c3cccc[n+]13)N1C[C@H]3CC[C@H](CC3)C1)[S+]=C([N-][N+]4=C(C)c1cccc[n+]21)N1C[C@H]2CC[C@H](CC2)C1
+[O-][N+](=O)O[Cu]123(O[N+](=O)[O-])[N@+]4(CC[N@+]1(CC[N@+]3(CC[N@@+]2(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1
+[O-][N+](=O)O[Cu]123(O[N+](=O)[O-])[N@+]4(CC[N@@+]1(CC[N@+]2(CC[N@+]3(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1
+[O-][N+](=O)O[Pd@@](O[N+](=O)[O-])(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)O[Pd](O[N+](=O)[O-])(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)O[Pt@@]1(O)N[C@@H]2CCCC[C@H]2N1
+[O-][N+](=O)O[Pt@]1(O)N[C@@H]2CCCC[C@H]2N1
+[O-][N+](=O)O[Zn]123(O[N+](=O)[O-])[N@+]4(CC[N@+]1(CC[N@+]3(CC[N@@+]2(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1
+[O-][N+](=O)O[Zn]123(O[N+](=O)[O-])[N@+]4(CC[N@@+]1(CC[N@+]2(CC[N@+]3(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1
+[O-][N+](=O)[C@@H](/C=N/c1ccccc1)/C=N/c1ccccc1
+[O-][N+](=O)[C@@H]([C@H](CC(=O)c1ccccc1)c1ccccc1)[C@H](CC(=O)c1ccccc1)c1ccccc1
+[O-][N+](=O)[C@@H]1C(=[O+][Cu@@]2([O+]=C1C)[O+]=C(C)[C@@H]([N+](=O)[O-])C(=[O+]2)C)C
+[O-][N+](=O)[C@@H]1C(=[O+][Cu@]2([O+]=C1C)[O+]=C(C)[C@H]([N+](=O)[O-])C(=[O+]2)C)C
+[O-][N+](=O)[C@@H]1CC[C@@H](CC1)C1=CS[C@H]2CCCC[C@@H]2N1
+[O-][N+](=O)[C@@]1(Br)CC[C@](Br)(CC1)[N+](=O)[O-]
+[O-][N+](=O)[C@@]1(C)C=C[C@]2(C=C1)OC(=O)C(C)(C)O2
+[O-][N+](=O)[C@@]1(C)CO[C@@H](/C=C/c2ccccc2)OC1
+[O-][N+](=O)[C@@]1(C)CO[C@@H](CCc2ccccc2)OC1
+[O-][N+](=O)[C@@]1(C)CO[C@@H](OC1)Cc1ccccc1
+[O-][N+](=O)[C@@]1(C)CO[C@]2(OC1)C(C)(C)[C@@]1(OC[C@@](C)(CO1)[N+](=O)[O-])C2(C)C
+[O-][N+](=O)[C@@]1(C[Se]c2ccccc2)CC[C@H](CC1)C(C)(C)C
+[O-][N+](=O)[C@@]1(Cl)CC[C@](Cl)(CC1)[N+](=O)[O-]
+[O-][N+](=O)[C@@]12CC[C@@H](c3ccccc13)c1ccccc21
+[O-][N+](=O)[C@@]12c3ccccc3[C@H](C[C@]2(Br)C(=O)Cl)c2ccccc12
+[O-][N+](=O)[C@H](/C=N/c1ccccc1)/C=N/c1ccccc1
+[O-][N+](=O)[C@H]([C@H](CC(=O)c1ccccc1)c1ccccc1)[C@H](CC(=O)c1ccccc1)c1ccccc1
+[O-][N+](=O)[C@H]1CC[C@H](CC1)C1=CS[C@H]2CCCC[C@@H]2N1
+[O-][N+](=O)[C@H]1C[C@@]21c1ccccc1c1ccccc21
+[O-][N+](=O)[C@H]1C[C@]21c1ccccc1c1ccccc21
+[O-][N+](=O)[C@H]1[C@@H](c2ccccc2)[C@@]21c1ccccc1c1ccccc21
+[O-][N+](=O)[C@H]1[C@@H](c2ccccc2)[C@]21c1ccccc1c1ccccc21
+[O-][N+](=O)[C@]1(Br)CC[C@@](Br)(CC1)[N+](=O)[O-]
+[O-][N+](=O)[C@]1(C)C=C[C@@]2(C=C1)OC(=O)C(C)(C)O2
+[O-][N+](=O)[C@]1(C)CO[C@H](/C=C/c2ccccc2)OC1
+[O-][N+](=O)[C@]1(C)CO[C@H](CCc2ccccc2)OC1
+[O-][N+](=O)[C@]1(C)CO[C@H](OC1)Cc1ccccc1
+[O-][N+](=O)[C@]1(C)CO[C@]2(OC1)C(C)(C)[C@@]1(OC[C@](C)(CO1)[N+](=O)[O-])C2(C)C
+[O-][N+](=O)[C@]1(C[Se]c2ccccc2)CC[C@@H](CC1)C(C)(C)C
+[O-][N+](=O)[C@]1(Cl)CC[C@@](Cl)(CC1)[N+](=O)[O-]
+[O-][N+](=O)[C@]12CC[C@H](c3ccccc13)c1ccccc21
+[O-][N+](=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)[C@]12c3ccccc3[C@@H](C[C@]2(Br)C(=O)Cl)c2ccccc12
+[O-][N+](=O)[O-].C1CC[C@H]2N[Cu@+2]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3
+[O-][N+](=O)[O-].C1CC[C@H]2N[Cu@@+2]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3
+[O-][N+](=O)[O-].C1CC[C@H]2N[Ni@+2]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3
+[O-][N+](=O)[O-].C1CC[C@H]2N[Ni@@+2]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3
+[O-][N+](=O)[O-].C1CC[C@H]2N[Pt@+2]3(N[C@@H]2C1)[OH+][Pt@@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+][Pt@@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+]3
+[O-][N+](=O)[O-].C1CC[C@H]2N[Pt@@+2]3(N[C@@H]2C1)[OH+][Pt@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+][Pt@@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+]3
+[O-][N+](=O)[O-].C1C[C@@]2(CC[C@H]1C2)[N+]#[C-][Mn+]([C-]#[N+][C@@]12CC[C@@H](CC1)C2)([C-]#[N+][C@@]12CC[C@@H](CC1)C2)([C-]#[N+][C@]12CC[C@H](CC1)C2)([C-]#[N+][C@@]12CC[C@@H](CC1)C2)[C-]#[N+][C@@]12CC[C@@H](CC1)C2
+[O-][N+](=O)[O-].C1C[C@]2(CC[C@@H]1C2)[N+]#[C-][Mn+]([C-]#[N+][C@]12CC[C@H](CC1)C2)([C-]#[N+][C@]12CC[C@H](CC1)C2)([C-]#[N+][C@@]12CC[C@@H](CC1)C2)([C-]#[N+][C@@]12CC[C@@H](CC1)C2)[C-]#[N+][C@@]12CC[C@@H](CC1)C2
+[O-][N+](=O)[O-].CC1=[O+][Pt@+2]2([O+]=C(C)[CH-]1)N[C@@H]1CCCC[C@H]1N2
+[O-][N+](=O)[O-].CC1=[O+][Pt@@+2]2([O+]=C(C)[CH-]1)N[C@@H]1CCCC[C@H]1N2
+[O-][N+](=O)[O-].C[N+]12CN3CN(CN(C3)C2)C1
+[O-][N+](=O)[O-].C[N@+]12CN3CN(CN(C3)C2)C1
+[O-][N+](=O)c1c(C)no[n+]1[O-]
+[O-][N+](=O)c1c(O)c2[nH]onc2c2nn([nH]c12)c1ccccc1
+[O-][N+](=O)c1c2ccc(Cl)[nH]n2c2n[n+]([O-])c(C)cc12
+[O-][N+](=O)c1c2nn(nc2c2nonc2c1O)c1ccccc1
+[O-][N+](=O)c1c[nH]n([nH]1)c1ccccc1
+[O-][N+](=O)c1cc(Br)c2c(c1)C(=O)c1cc(cc([N+](=O)[O-])c21)[N+](=O)[O-].c1ccc2ccc3cc4c(ccc5ccccc45)cc3c2c1
+[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-].C1CC[C@@H]2CCCCN2C1
+[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-].C1CC[C@H]2CCCCN2C1
+[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-].C1CN2CCC[C@@H]2C1
+[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-].C1CN2CCC[C@H]2C1
+[O-][N+](=O)c1cc([N+](=O)[O-])c2NONc2c1O
+[O-][N+](=O)c1cc([N+](=O)[O-])c2NO[N+]([O-])c2c1Nc1ccccc1
+[O-][N+](=O)c1cc([N+](=O)[O-])c2[nH]n(c3ccccc3)[n+]([O-])c2c1
+[O-][N+](=O)c1cc([N+](=O)[O-])c2nn(c3ccccc3)[n+]([O-])c2c1
+[O-][N+](=O)c1cc([N+](=O)[O-])c2no[n+]([O-])c2c1Nc1ccccc1
+[O-][N+](=O)c1cc([N+](=O)[O-])c2nonc2c1O
+[O-][N+](=O)c1cc(cc(c1)[N+](=O)[O-])c1nnc(o1)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)c1cc(cc(c1)[N+](=O)[O-])c1nnc(o1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)c1cc(ccc1F)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)C1(Cl)Cl)Cl
+[O-][N+](=O)c1cc(ccc1F)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl
+[O-][N+](=O)c1cc(ccc1N/N=C(/c1ccccc1)\C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])\c1ccccc1)[N+](=O)[O-]
+[O-][N+](=O)c1cc(ccc1N/N=C(\c1ccccc1)/C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/c1ccccc1)[N+](=O)[O-]
+[O-][N+](=O)c1cc(ccc1N/N=C/1\C=C[C@](C)(C=C1)C(C)(Cl)Cl)[N+](=O)[O-]
+[O-][N+](=O)c1cc(ccc1N/N=C/1\C=C[C@](C)(C=C1)C(Cl)(Cl)Cl)[N+](=O)[O-]
+[O-][N+](=O)c1cc(ccc1N/N=C/1\[C@@H]2CC[C@H]1CC2)[N+](=O)[O-]
+[O-][N+](=O)c1cc(ccc1N/N=C/1\[C@H]2CC[C@@H]1CC2)[N+](=O)[O-]
+[O-][N+](=O)c1cc(ccc1N/N=C/C12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[N+](=O)[O-]
+[O-][N+](=O)c1cc(ccc1N/N=C/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-]
+[O-][N+](=O)c1cc(ccc1N/N=C\1/C=C[C@@](C)(C=C1)C(C)(Cl)Cl)[N+](=O)[O-]
+[O-][N+](=O)c1cc(ccc1N/N=C\1/C=C[C@@](C)(C=C1)C(Cl)(Cl)Cl)[N+](=O)[O-]
+[O-][N+](=O)c1cc2n[nH][nH]c2c2[nH]onc12
+[O-][N+](=O)c1cc2nn[nH]c2c2nonc12
+[O-][N+](=O)c1ccc(cc1)/C=N/C12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)C1=C(N=c2ccccc2=c2ccccc2=N1)c1ccc(cc1)[N+](=O)[O-]
+[O-][N+](=O)c1ccc(cc1)CSc1nnc(n1C)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)CSc1nnc(n1C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)Cn1c2cc3c(Cl)c(=O)c4CCCCc4c3cc2nc2ccccc12
+[O-][N+](=O)c1ccc(cc1)Cn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2ccccc12
+[O-][N+](=O)c1ccc(cc1)[C@@H](/N=C/c1ccc(cc1)[N+](=O)[O-])/N=C/c1ccc(cc1)[N+](=O)[O-]
+[O-][N+](=O)c1ccc(cc1)[C@@H]1N2CCCC[C@@H]2[C@@H]2CCCCN12
+[O-][N+](=O)c1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1C12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)[C@@]12CCCC(=O)[C@@H]1[C@@H]1C(=O)CCC[C@]21c1ccc(cc1)[N+](=O)[O-]
+[O-][N+](=O)c1ccc(cc1)[C@H](/N=C/c1ccc(cc1)[N+](=O)[O-])/N=C/c1ccc(cc1)[N+](=O)[O-]
+[O-][N+](=O)c1ccc(cc1)[C@H]1N2CCCC[C@H]2[C@H]2CCCCN12
+[O-][N+](=O)c1ccc(cc1)[C@H]1O[C@H]1C(=O)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)[C@]12CCCC(=O)[C@H]1[C@H]1C(=O)CCC[C@@]21c1ccc(cc1)[N+](=O)[O-]
+[O-][N+](=O)c1ccc(cc1)c1nnc(o1)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)c1nnc(o1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](=O)c1ccc(cc1)n1[nH]c2ccc3[n+]([O-])onc3c2n1
+[O-][N+](=O)c1ccc(cc1)n1nc2c(ccc3[n+]([O-])onc23)n1
+[O-][N+](=O)c1ccc2[n+]3C(N(C)C)N4CCCCC4c3c3n(c2c1)c(N(C)C)[n+]1ccccc31.[O-][Cl](=O)(=O)=O
+[O-][N+](=O)c1ccc2[nH][se][nH]c2c1
+[O-][N+](=O)c1ccc2[nH]c3c([nH]c2c1)c1cccc2cccc3c12
+[O-][N+](=O)c1ccc2[nH]c3c4cccc5cc6ccccc6c(c3[nH]c2c1)c45
+[O-][N+](=O)c1ccc2[nH]s[nH]c2c1
+[O-][N+](=O)c1ccc2c(c1)[C@@H](N1C[C@@H]3CC[C@@H](CC3)C1)c1ccccc21
+[O-][N+](=O)c1ccc2c(c1)n1c(N(C)C)[n+]3ccccc3c1c1c3ccccn3c(N(C)C)[n+]21.[O-][Cl](=O)(=O)=O
+[O-][N+](=O)c1ccc2c(no[n+]2[O-])c1
+[O-][N+](=O)c1ccc2c3ccccc3[C@H](N3C[C@@H]4CC[C@@H](CC4)C3)c2c1
+[O-][N+](=O)c1ccc2n[se]nc2c1
+[O-][N+](=O)c1ccc2nc3c(nc2c1)c1cccc2cccc3c12
+[O-][N+](=O)c1ccc2nc3c4cccc5cc6ccccc6c(c3nc2c1)c45
+[O-][N+](=O)c1ccc2nsnc2c1
+[O-][N+](=O)c1cccc(/C=C/C(=O)[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c1
+[O-][N+](=O)c1cccc(/C=C/C(=O)[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c1
+[O-][N+](=O)c1cccc(/C=N/C23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+[O-][N+](=O)c1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1
+[O-][N+](=O)c1cccc(/C=c/2\sc3[nH]c4ccccc4n3c2=O)c1
+[O-][N+](=O)c1cccc(/C=c/2\sc3nc4ccccc4n3c2=O)c1
+[O-][N+](=O)c1cccc(/N=N/c2ccc(c(O)c2)C(=O)[OH+][Pt@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]C(=O)c2ccc(/N=N/c3cccc(c3)[N+](=O)[O-])cc2O)c1
+[O-][N+](=O)c1cccc(/N=N/c2ccc(c(O)c2)C(=O)[OH+][Pt@@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]C(=O)c2ccc(/N=N/c3cccc(c3)[N+](=O)[O-])cc2O)c1
+[O-][N+](=O)c1cccc(c1)[C@@H]1OC[C@@]2(CO1)CO[C@H](OC2)c1cccc(c1)[N+](=O)[O-]
+[O-][N+](=O)c1cccc(c1)[C@@H]1OC[C@]2(CO1)CO[C@@H](OC2)c1cccc(c1)[N+](=O)[O-]
+[O-][N+](=O)c1cccc(c1)[C@H]1O[C@H]1C(=O)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1cccc(c1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1cccc(c1)c1n[n+](c2ccc(cc2)c2ccc(cc2)[n+]2nc(nn2c2ccccc2)c2cccc(c2)[N+](=O)[O-])n(n1)c1ccccc1
+[O-][N+](=O)c1cccc(c1)c1nn(c2ccccc2)[n+](n1)c1ccc(cc1)c1ccc(cc1)[n+]1nc([nH]n1c1ccccc1)c1cccc(c1)[N+](=O)[O-]
+[O-][N+](=O)c1cccc2c1[C@@H]1c3ccccc3[C@H]2c2ccccc12
+[O-][N+](=O)c1cccc2c1[C@H]1c3ccccc3[C@@H]2c2ccccc12
+[O-][N+](=O)c1cccc2c3NONc3ccc12
+[O-][N+](=O)c1cccc2c3nonc3ccc12
+[O-][N+](=O)c1ccccc1/C=N/C12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+](=O)c1ccccc1[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(c3ccccc3[N+](=O)[O-])C6=C12
+[O-][N+](=O)c1ccccc1[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(c3ccccc3[N+](=O)[O-])C6=C12
+[O-][N+](=O)c1cnc(c2scc(/C=N/N3CC[S@@](=O)(=O)CC3)n2)n1C
+[O-][N+](=O)c1cnc(c2scc(/C=N/N3CC[S@](=O)(=O)CC3)n2)n1C
+[O-][N+](=O)c1cnc2[nH]s[nH]c2c1N
+[O-][N+](=O)c1cnc2nsnc2c1N
+[O-][N+](=O)c1cnn(n1)c1ccccc1
+[O-][N+](C)(C)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+[O-][N+](C)(C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+[O-][N+]1ONc2[nH]c(=N)[nH]c(=N)c12
+[O-][N+]1ONc2cc(ccc12)[N+](=O)[O-]
+[O-][S@](=O)(=[OH+])C(F)(F)F.C1C23=C4(C5=C6C7=C2[Ru+2]34567)C23=C4C5=C6C7=C13[Ru+2]24567
+[O-][S@](=O)(=[OH+])C(F)(F)F.C1C23=C4C5=C6C7=C3([Ru+2]24567)C23=C41C1=C5C6=C2[Ru+2]34156
+[O-][S@](=O)(=[OH+])C(F)(F)F.C[C@@]12[Ru+]3456789%10(C%11=C4C6=C8(/C=C/C46=C8C%12=C%13C%14=C4[Ru+]4%15%16%1768%12%13%14C6(=C%16(C)C%15(=C4(C)[C@]%176C)C)C)C5=C3%11)C(=C2%10C)(C)C7(=C19C)C
+[O-][S@](=O)(=[OH+])C(F)(F)F.C[C@@]12[Ru+]3456789%10(C%11=C4C6=C8(/N=N/C46=C8C%12=C%13C%14=C4[Ru+]4%15%16%1768%12%13%14C6(=C%16(C)C%15(=C4(C)[C@]%176C)C)C)C5=C3%11)C(=C2%10C)(C)C7(=C19C)C
+[O-][n+]1c(N)c(C(=O)NC23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[n+]([O-])c2ccccc12
+[O-][n+]1c([nH]n(C)c2[nH]c(=O)n(C)c(=O)c12)c1ccc2OCOc2c1
+[O-][n+]1c([nH]n(C)c2[nH]c(=O)n(C)c(=O)c12)c1cccnc1
+[O-][n+]1c(nn(C)c2nc(=O)n(C)c(=O)c12)c1ccc2OCOc2c1
+[O-][n+]1c(nn(C)c2nc(=O)n(C)c(=O)c12)c1cccnc1
+[O-][n+]1nc2c(cc3ccc(Cl)[nH]n23)cc1C
+[OH-][H+]([OH-])[OH-].O=C1CN2C(=O)CN3C4=[S+][Cu@]56OC(=O)CN5C(=O)CN6C4=[S+][Cu@@]23O1
+[OH2-][H+]([OH2-])[OH2-].O=C1CN2C(=O)CN3C4=[S+][Cu@]56OC(=O)CN5C(=O)CN6C4=[S+][Cu@@]23O1
+[OH]#C[Ru]123456(C(=O)[Ru]789%102(C#[OH])(C1=O)C1(=C9(C)C8(=C7(C)[C@]%101C)C)C)[C@]1(C)C5(=C4(C)C3(=C61C)C)C
+[OH]#C[Ru]123456([C@@H]7C3=C2C1=C47)C(=O)[Ru]12346(C#[OH])([C@H]6C3=C2C1=C46)C5=O
+[SeH]=C(N/N=C(\C)/c1ccccn1)N1C[C@H]2CC[C@H](CC2)C1
+[Se]1CCCS[C@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]9(SCCC1)C7=C23
+[Se]1CCCS[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]9(SCCC1)C7=C23
+[nH]1ncc(c1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14
+[se]1nc2cc(ccc2n1)c1ccc2n[se]nc2c1
+c1c[nH]c(n1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14
+c1c[nH]c(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+c1cc(/N=C/[C@@]23C4=C5C6=C2[Fe]27893456[C@@H]3C8=C7C2=C93)c2cccc(/N=C/[C@@]34C5=C6C7=C3[Fe]389%104567[C@H]4C9=C8C3=C%104)c2c1
+c1cc(CSP234N5CCN2CCN4CCN3CC5)cc(c1)CSP123N4CCN1CCN3CCN2CC4
+c1cc(ccc1/C=C/[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)/C=C/[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+c1cc(ccc1/N=C/[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)/N=C/[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+c1cc(ccc1/N=C/[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)c1ccc(cc1)/N=C/[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+c1cc(ccc1CSP123N4CCN1CCN3CCN2CC4)CSP123N4CCN1CCN3CCN2CC4
+c1cc2cccc3[C@H]4[C@@H](c(c1)c23)[C@H]1c2cccc3cccc([C@@H]41)c23
+c1cc2ncc3cccc4ncc(c1)c2c34
+c1cc2nnc3cccc4nnc(c1)c2c34
+c1cc2onc3c4cccc5onc(c(c1)c23)c45
+c1cc[n+](cc1)[C@@H]1c2ccccc2[C@@H]([n+]2ccccc2)c2ccccc12
+c1cc[n+]2cc3c(ccc4cc5cccc[n+]5cc34)cc2c1
+c1cc[n+]2cc3ccc4cc5cccc[n+]5cc4c3cc2c1
+c1ccc(/C=C/C=C(\C=C\c2ccccc2)/C=C/c2ccccc2)cc1
+c1ccc(/C=N\N=C\c2ccccn2)nc1
+c1ccc(CSP234N5CCN2CCN4CCN3CC5)c(c1)CSP123N4CCN1CCN3CCN2CC4
+c1ccc(cc1)/C(=C(\N=N\C(c1ccccc1)(c1ccccc1)c1ccccc1)/c1ccccc1)/N=N\C(c1ccccc1)(c1ccccc1)c1ccccc1
+c1ccc(cc1)/C(=N\N=C(\c1ccccc1)/c1cccs1)/c1cccs1
+c1ccc(cc1)/C=C/c1nnnn1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+c1ccc(cc1)/C=N/C/N=C\c1ccccc1
+c1ccc(cc1)/C=N/CC/N=C\c1ccccc1
+c1ccc(cc1)/C=N/Nc1nnn(n1)Cc1ccccc1
+c1ccc(cc1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+c1ccc(cc1)/C=N\N=C\c1ccccc1
+c1ccc(cc1)/N=C/1\[C@H]2CCN(CC2)[C@H]1C(c1ccccc1)c1ccccc1
+c1ccc(cc1)/N=C/c1nc2ncnc3ccn1c23
+c1ccc(cc1)/N=C\1/c2sccc2/C(=N/c2ccccc2)/c2sccc12
+c1ccc(cc1)/N=N/c1ccc(cc1)/N=C/[C@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18
+c1ccc(cc1)/N=N/c1ccc(cc1)/N=C/[C@@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18
+c1ccc(cc1)C#C[Ti]12345678(C#Cc9ccccc9)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@H]81
+c1ccc(cc1)C#Cc1c2ccccc2c(C#Cc2ccccc2)c2oc3c(ccc4ccccc34)c12
+c1ccc(cc1)C1=C(N=c2ccccc2=c2ccccc2=N1)c1ccccc1
+c1ccc(cc1)C1=NNN(N1)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+c1ccc(cc1)CC[N@+]12CN3CN(CN(C3)C2)C1
+c1ccc(cc1)CN1CC[C@@]2(CC1)SS[C@]1(CCN(CC1)Cc1ccccc1)S2
+c1ccc(cc1)CN1[C@@H]2c3ccccc3[C@H]1c1ccccc21
+c1ccc(cc1)COc1ccc2[nH]c3c(ncc4[nH]c5ccccc5c34)c2c1
+c1ccc(cc1)COc1nc2cc(ccc2[nH]1)C12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1
+c1ccc(cc1)CP(c1ccccc1)([C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82)[C@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82
+c1ccc(cc1)CSc1nc2nn[nH]c2c(n1)N1CCCCC1
+c1ccc(cc1)C[C@@]12N=N[C@@](Cc3ccccc3)([C@@H]3C=C[C@H]13)[C@@H]1C=C[C@H]21
+c1ccc(cc1)C[C@H]1N[C@H](Cc2ccccc2)N2[C@H](Cc3ccccc3)N12
+c1ccc(cc1)C[N@@+]12CN3CN(CN(C3)C2)C1
+c1ccc(cc1)Cn1cnc2nnn3ncnc3c12
+c1ccc(cc1)Cn1cnc2nnn3nnnc3c12
+c1ccc(cc1)N/N=C/c1nc2ncnc3ccn1c23
+c1ccc(cc1)N/N=C\1/C(=C/c2ccccc2)/CCC/C1=C\c1ccccc1
+c1ccc(cc1)N/N=C\1/S/C(=N/c2ccccc2)/C(=N/c2ccccc2)/S1
+c1ccc(cc1)N=c1c2c(ccc3ccccc23)oc2ccc3ccccc3c12
+c1ccc(cc1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+c1ccc(cc1)N[C@H]1CCN(CC1)C1(CCCCC1)c1ccccc1
+c1ccc(cc1)N[C@H]1CC[C@@H](CC1)/C(=C/1\C=C/C(=N\c2ccccc2)/C=C1)/[C@H]1CC[C@@H](CC1)Nc1ccccc1
+c1ccc(cc1)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+c1ccc(cc1)P([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82
+c1ccc(cc1)P(c1ccccc1)(c1ccccc1)[Pd@]12SCC[S+]2[Pd@@]2(SCC[S+]12)P(c1ccccc1)(c1ccccc1)c1ccccc1
+c1ccc(cc1)P(c1ccccc1)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(P(c3ccccc3)c3ccccc3)C6=C12
+c1ccc(cc1)[C@@H]([C@H](c1ccccc1)[C@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82)[C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82
+c1ccc(cc1)[C@@H]1OC[C@@]2(CO1)CO[C@H](OC2)c1ccccc1
+c1ccc(cc1)[C@@H]1Oc2ccccc2[C@@]2(SCCS2)C1
+c1ccc(cc1)[C@@H]1[C@@H](c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+c1ccc(cc1)[C@@H]1[C@@H](c2ccccc2)[C@H](c2ccccc2)[C@H]1c1ccccc1
+c1ccc(cc1)[C@@H]1[C@H](c2ccnc3c4ccccc4ccc23)[C@@H](c2ccccc2)[C@H]1c1ccnc2c1ccc1ccccc21
+c1ccc(cc1)[C@@H]1c2cccc3[C@@H](c4ccccc4)c4cccc5c4[C@@H](c23)c2c1cccc2[C@H]5c1ccccc1
+c1ccc(cc1)[C@@]12c3ccccc3[C@H]2c2ccccc12
+c1ccc(cc1)[C@H]1CO[C@]2(CCCC2)O1
+c1ccc(cc1)[C@H]1ON=C(c2ccccc2)N1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+c1ccc(cc1)[C@H]1SC[C@H]2CO[C@@]3(CCCCC3)N12
+c1ccc(cc1)[C@H]1[C@@H](c2nc3ccccc3o2)[C@H](c2ccccc2)[C@H]1c1nc2ccccc2o1
+c1ccc(cc1)[C@]12CN(Cc3ccccc13)Cc1ccccc21
+c1ccc(cc1)[Ge@@](c1ccccc1)([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+c1ccc(cc1)[Pb@@](c1ccccc1)([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+c1ccc(cc1)[Si@@](c1ccccc1)([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82
+c1ccc(cc1)[Sn](S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)(c1ccccc1)c1ccccc1
+c1ccc(cc1)c1c(nn(c2ccccc2)c2=c3ccccc3=CSc12)c1ccccc1
+c1ccc(cc1)c1c2ccc3ccccc3c2cc2ccc3ccccc3c12
+c1ccc(cc1)c1ccc(c2ccccc2)p1c1ccccc1
+c1ccc(cc1)c1ccc2c(c1)c1nc3ccccc3nc1c1ccccc21
+c1ccc(cc1)c1cnn2nnnc2n1
+c1ccc(cc1)c1cnnc2c3c(nnc(c4ccccc4)c3c3ccccc3)nn12
+c1ccc(cc1)c1n[n+](c2ccccc2c2ccccc2)n(n1)c1ccccc1
+c1ccc(cc1)c1nc2cc3c(cc2n2cccc12)oc1ccccc31
+c1ccc(cc1)c1nnn(CCn2nnc(n2)c2ccccc2)n1
+c1ccc(cc1)c1nnn(n1)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82
+c1ccc(cc1)c1nnn(n1)c1ccccc1
+c1ccc(cc1)c1nnn(n1)n1nnc(n1)c1ccccc1
+c1ccc(cc1)c1nnnn1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+c1ccc(cc1)c1sc(c2ccccc2)c2[C@@H](c3ccccc3)c3c(sc(c4ccccc4)c3[C@@H](c3ccccc3)c12)c1ccccc1
+c1ccc(cc1)c1sc(c2ccccc2)c2c1nn1ccc3ccccc3c21
+c1ccc(cc1)p1c2ccccc2c2ccccc12
+c1ccc(cn1)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+c1ccc(nc1)C1=C(N=c2ccccc2=c2ccccc2=N1)c1ccccn1
+c1ccc(nc1)S[C@@]12[C@H]3[C@@H]4[C@H]5[C@@H]([C@H]14)[C@@H]2[C@@H]35
+c1ccc(nc1)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+c1ccc(nc1)[C@H]1[C@@H](c2ccccn2)[C@H](c2ccccn2)[C@@H]1c1ccccn1
+c1ccc(nc1)[C@]12c3ccccc3[C@@H]2c2ccccc12
+c1ccc2=c3ccc4c5c3c(=c2c1)ccc5c1ccc2=c3ccccc3=c3ccc4c1c23
+c1ccc2=c3ccccc3=c2c1
+c1ccc2C3=NC4=NC(=NC5=NC(=NC6=NC(=NC(=N3)c2c1)c1ccccc61)c1ccccc51)c1ccccc41
+c1ccc2C=C/C(=C\[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)/c2c1
+c1ccc2C=C/C(=C\[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)/c2c1
+c1ccc2C=[N+]3CCC[O+]4[Cu@@]3(Oc2c1)[O+]1CCC[N+]2=Cc3ccccc3O[Cu@]412
+c1ccc2C[C@H]3[C@@H](Cc2c1)[C@H]1c2ccccc2[C@@H]3c2ccccc12
+c1ccc2Cc3cc(ccc3c2c1)/N=C\1/CC/C(=N\c2ccc3c(c2)Cc2ccccc32)/CC1
+c1ccc2Cc3ccccc3C(=C[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)c2c1
+c1ccc2Cc3ccccc3C(=C[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)c2c1
+c1ccc2Sc3ccccc3N(C[C@H]3CN4CC[C@@H]3CC4)c2c1
+c1ccc2Sc3ccccc3N([C@H]3CN4CC[C@H]3CC4)c2c1
+c1ccc2[n-]n3c4ccc5[nH]onc5c4n[n+]3c2c1
+c1ccc2[n-]n3c4ccc5nonc5c4n[n+]3c2c1
+c1ccc2[nH]/c(=c\3/[nH]c4ccccc4[se]3)/[se]c2c1
+c1ccc2[nH]c3c4cc5ccccc5n4ccc3c2c1
+c1ccc2[nH]cc(CC/N=C/[C@]34C5=C6C7=C3[Fe]389%104567[C@H]4C9=C8C3=C%104)c2c1
+c1ccc2c(c1)CN1Cc3ccccc3[C@@H]2C1
+c1ccc2c(c1)OC[C@@]12CC[C@]2(OCCO2)C=C1
+c1ccc2c(c1)Oc1ccccc1[C@]12S[C@@]21c1ccccc1Oc1ccccc21
+c1ccc2c(c1)Sc1nccc3ccnc2c13
+c1ccc2c(c1)[C@@H]1CCCC[C@H]2c2ccccc12
+c1ccc2c(c1)[C@@H]1O[C@H]2c2ccccc12
+c1ccc2c(c1)[C@@H]1[C@@H]3COC[C@@H]3[C@H]2c2ccccc12
+c1ccc2c(c1)[C@@H]1[C@H]3c4ccccc4[C@H](c4ccccc34)[C@H]2c2ccccc12
+c1ccc2c(c1)[C@H]1CCC[C@@H]2c2ccccc12
+c1ccc2c(c1)[C@H]1[C@@H]3O[C@@H]3[C@@H]2c2ccccc12
+c1ccc2c(c1)[nH]c1c[n+]3c(c[n+]21)[nH]c1ccccc31
+c1ccc2c(c1)[nH]c1cc3c(cc21)[nH]c1ccccc31
+c1ccc2c(c1)c1nc3cc4nc5c(nc4cc3nc1c1ccccc21)c1ccccc1c1ccccc51
+c1ccc2c(c1)c1oc3cccc4c3c3c1c1c(cccc21)oc3c1ccccc41
+c1ccc2c(c1)cc1ccc3cc4ccccc4c4nnc2c1c34
+c1ccc2c(c1)ccc1OCN(Cc21)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+c1ccc2c(c1)ccc1c[n+]3c(ccc4ccccc34)cc21
+c1ccc2c(c1)ccc1cc3c(cc21)c1ccccc1c1ccccc31
+c1ccc2c(c1)ccc1cc3cc4cc5c(ccc6ccccc56)cc4cc3cc21
+c1ccc2c(c1)ccc1ccc3ccc4ccc5ccccc5c4c3c21
+c1ccc2c(c1)ccc1nc3c(nc21)c1ccccc1c1ccccc31
+c1ccc2c(c1)ccc1nc3c4cccc5cccc(c3nc21)c45
+c1ccc2c(c1)oc1ccc3nsnc3c21
+c1ccc2c(n1)ccc1nc3c(ccc4ncccc34)nc21
+c1ccc2cc3[nH]c4cc5ccccc5cc4[nH]c3cc2c1
+c1ccc2cc3c(ccc4c3ccc3ccccc43)cc2c1
+c1ccc2cc3c(ccc4c[n+]5ccccc5cc34)c[n+]2c1
+c1ccc2cc3n[se]nc3cc2c1
+c1ccc2cc3oc4cc5ccccc5cc4c3cc2c1
+c1ccc2ccc(/N=C/[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)cc2c1
+c1ccc2ccc(/N=C/[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)cc2c1
+c1ccc2ccc3c(ccc4sc5ccccc5[n+]34)c2c1
+c1ccc2ccc3c4ccc5ccccc5c4ccc3c2c1
+c1ccc2ccc3cc4c(ccc5ccccc45)cc3c2c1
+c1ccc2cnc3cc4c(ncc5ccccc45)cc3c2c1
+c1ccc2n[se]nc2c1
+c1ccc2nc(SSN3C[C@@H]4CC[C@@H](CC4)C3)sc2c1
+c1ccc2nc(sc2c1)NC(Nc1nc2ccccc2s1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+c1ccc2nc3c(nc2c1)c1cccc2cccc3c12
+c1ccc2nc3c(sc4nc5ccccc5n34)nc2c1
+c1ccc2ncc3cc4c(cc3c2c1)[nH]c1ccccc41
+c1ccc2ncn(C[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)c2c1
+c1ccc2ncn(C[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)c2c1
+c1ccc2nnn(C[C@@]34C5=C6C7=C3[Fe]389%104567[C@H]4C9=C8C3=C%104)c2c1
+c1ccc2nsnc2c1
+c1ccc2oc3cc4c(cc3c2c1)n1nnnc1c1cccn41
+c1ccc2oc3cc4c(ncc5cccn45)cc3c2c1
+c1ccc2oc3cc4c(nnc5cccn45)cc3c2c1
+c1cnc2c(c1)ccc1CN(COc21)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+c1cnc2n[se]nc2c1
+c1cnc2nsnc2c1
+c1cnn(c1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14
+c1coc2=c(o1)occo2
+c1csc(c1)C[N@+]12CN3CN(CN(C3)C2)C1
+c1csc(c1)C[N@@+]12CN3CN(CN(C3)C2)C1
+c1csc(c1)c1nnc(o1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+c1csc(c1)c1sc2nnc(n2n1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1
+c1csc(n1)NC(Nc1nccs1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+c1nc2[nH]c[n+]3c2c(=[S+][Hg+]3[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)[n-]1
+c1nc2[nH]c[n+]3c2c(=[S+][Hg+]3[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)[n-]1
+c1ncc([nH]1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14
+c1ncn(n1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14
+c1ncn(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+n1ccc(cc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+n1ccn(c1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14
+n1ccn(c1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1
+n1nc2sc1[SH+][Cu+2]1345[SH+]c6nnc(s6)N6CN3CCN1CN2CN4CCN5C6
+n1nc2sc1[SH+][Ni+2]1345[SH+]c6nnc(s6)N6CN3CCN1CN2CN4CCN5C6
+n1ncn(c1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14
+s1ccc(c1)C[N@+]12CN3CN(CN(C3)C2)C1
diff --git a/test/py/smiles/doOBabelTests.sh b/test/py/smiles/doOBabelTests.sh
new file mode 100755
index 0000000..de9f3fe
--- /dev/null
+++ b/test/py/smiles/doOBabelTests.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+# This script is based on the cansmiles_shuffle.sh script in Open Babels test suite
+
+niter=${1:-20}
+echo "$0: $niter shuffles per molecule";
+
+n=0
+errors=0
+logfile=log.txt
+tmpfile=tmp.smi
+canfile=tmp.can
+
+unset xpg_echo
+
+rm -f smiles.py
+
+cat nci.smi | while read -r smiles ; do
+	# Generate N random SMILES for this molecule
+	echo "Processing $smiles"
+	smiles=$(echo $smiles | sed 's/[0-9]*$//' \
+		| sed -e 's/\\/-/g' -e 's/\//-/g'						\
+		)
+	n=$(expr $n + 1)
+	(
+	i=0
+	while test $i -lt $niter ; do
+		echo $smiles
+		i=`expr $i + 1`
+	done;
+	) | obabel -i smi -xC -o smi 2> $logfile | sed 's/[[:space:]]*$//' > $tmpfile
+	sed -i 's/\(.*\)/smiles("\1")/' $tmpfile
+
+	# Canonicalize them: They should all come out the same
+	mod nopost -f $tmpfile \
+		-e "with open('out/_test.smi', 'w') as f:" \
+		-e "	for a in inputGraphs:" \
+		-e "		f.write(a.smiles)" \
+		-e '		f.write("\n")' &> /dev/null
+	if test $? -ne 0; then
+		echo "ERROR start log:"
+		cat out/log.txt
+		echo "ERROR stop log"
+		break;
+	fi
+	sort -u out/_test.smi > $canfile
+
+	# We should only have one SMILES now.  Any more (or zero) is an error.
+	count=$(cat $canfile | wc -l)
+	if [ "$count" -ne "1" ] ; then
+		echo ""
+		echo "error: Record $n: Got $count SMILES for one molecule:"
+		cat $canfile
+		echo "input smiles:"
+		cat $tmpfile
+		echo "output file:"
+		cat out/*_test.smi
+		echo "log file:"
+		cat $logfile
+		echo ""
+		errors=`expr $errors + 1`
+		break
+	fi
+	(
+		cat $canfile
+		echo $smiles
+	) | obabel -i smi -o can 2>> $logfile | sort -u > $tmpfile
+	newcount=$(wc -l $tmpfile)
+	if [ "$count" -ne "1" ]; then
+		echo ""
+		echo "error 2: Record $n: not the same output molecule as input molecule:"
+		echo -n "input: "
+		echo $smiles | obabel -i smi -o can 2> /dev/null
+		echo -n "output: "
+		cat $canfile
+		errors=$(expr $errors + 1)
+	fi;
+	echo "$smiles" | obabel -i smi -xC -o smi 2> /dev/null | sed 's/[[:space:]]*$//' | \
+		sed 's/\(.*\)/smiles("\1")/' >> smiles.py
+done
+
+echo ""
+echo "$n SMILES tested, $errors errors."
+rm $logfile $tmpfile $canfile
+mod clean
diff --git a/test/py/smiles/genSymbolJumpTable.py b/test/py/smiles/genSymbolJumpTable.py
new file mode 100644
index 0000000..0410366
--- /dev/null
+++ b/test/py/smiles/genSymbolJumpTable.py
@@ -0,0 +1,155 @@
+data = list()
+data.append((1, "H", "Hydrogen"))
+data.append((2, "He", "Helium"))
+data.append((3, "Li", "Lithium"))
+data.append((4, "Be", "Beryllium"))
+data.append((5, "B", "Boron"))
+data.append((6, "C", "Carbon"))
+data.append((7, "N", "Nitrogen"))
+data.append((8, "O", "Oxygen"))
+data.append((9, "F", "Fluorine"))
+data.append((10, "Ne", "Neon"))
+data.append((11, "Na", "Sodium"))
+data.append((12, "Mg", "Magnesium"))
+data.append((13, "Al", "Aluminium"))
+data.append((14, "Si", "Silicon"))
+data.append((15, "P", "Phosphorus"))
+data.append((16, "S", "Sulfur"))
+data.append((17, "Cl", "Chlorine"))
+data.append((18, "Ar", "Argon"))
+data.append((19, "K", "Potassium"))
+data.append((20, "Ca", "Calcium"))
+data.append((21, "Sc", "Scandium"))
+data.append((22, "Ti", "Titanium"))
+data.append((23, "V", "Vanadium"))
+data.append((24, "Cr", "Chromium"))
+data.append((25, "Mn", "Manganese"))
+data.append((26, "Fe", "Iron"))
+data.append((27, "Co", "Cobalt"))
+data.append((28, "Ni", "Nickel"))
+data.append((29, "Cu", "Copper"))
+data.append((30, "Zn", "Zinc"))
+data.append((31, "Ga", "Gallium"))
+data.append((32, "Ge", "Germanium"))
+data.append((33, "As", "Arsenic"))
+data.append((34, "Se", "Selenium"))
+data.append((35, "Br", "Bromine"))
+data.append((36, "Kr", "Krypton"))
+data.append((37, "Rb", "Rubidium"))
+data.append((38, "Sr", "Strontium"))
+data.append((39, "Y", "Yttrium"))
+data.append((40, "Zr", "Zirconium"))
+data.append((41, "Nb", "Niobium"))
+data.append((42, "Mo", "Molybdenum"))
+data.append((43, "Tc", "Technetium"))
+data.append((44, "Ru", "Ruthenium"))
+data.append((45, "Rh", "Rhodium"))
+data.append((46, "Pd", "Palladium"))
+data.append((47, "Ag", "Silver"))
+data.append((48, "Cd", "Cadmium"))
+data.append((49, "In", "Indium"))
+data.append((50, "Sn", "Tin"))
+data.append((51, "Sb", "Antimony"))
+data.append((52, "Te", "Tellurium"))
+data.append((53, "I", "Iodine"))
+data.append((54, "Xe", "Xenon"))
+data.append((55, "Cs", "Caesium"))
+data.append((56, "Ba", "Barium"))
+data.append((57, "La", "Lanthanum"))
+data.append((58, "Ce", "Cerium"))
+data.append((59, "Pr", "Praseodymium"))
+data.append((60, "Nd", "Neodymium"))
+data.append((61, "Pm", "Promethium"))
+data.append((62, "Sm", "Samarium"))
+data.append((63, "Eu", "Europium"))
+data.append((64, "Gd", "Gadolinium"))
+data.append((65, "Tb", "Terbium"))
+data.append((66, "Dy", "Dysprosium"))
+data.append((67, "Ho", "Holmium"))
+data.append((68, "Er", "Erbium"))
+data.append((69, "Tm", "Thulium"))
+data.append((70, "Yb", "Ytterbium"))
+data.append((71, "Lu", "Lutetium"))
+data.append((72, "Hf", "Hafnium"))
+data.append((73, "Ta", "Tantalum"))
+data.append((74, "W", "Tungsten"))
+data.append((75, "Re", "Rhenium"))
+data.append((76, "Os", "Osmium"))
+data.append((77, "Ir", "Iridium"))
+data.append((78, "Pt", "Platinum"))
+data.append((79, "Au", "Gold"))
+data.append((80, "Hg", "Mercury"))
+data.append((81, "Tl", "Thallium"))
+data.append((82, "Pb", "Lead"))
+data.append((83, "Bi", "Bismuth"))
+data.append((84, "Po", "Polonium"))
+data.append((85, "At", "Astatine"))
+data.append((86, "Rn", "Radon"))
+data.append((87, "Fr", "Francium"))
+data.append((88, "Ra", "Radium"))
+data.append((89, "Ac", "Actinium"))
+data.append((90, "Th", "Thorium"))
+data.append((91, "Pa", "Protactinium"))
+data.append((92, "U", "Uranium"))
+data.append((93, "Np", "Neptunium"))
+data.append((94, "Pu", "Plutonium"))
+data.append((95, "Am", "Americium"))
+data.append((96, "Cm", "Curium"))
+data.append((97, "Bk", "Berkelium"))
+data.append((98, "Cf", "Californium"))
+data.append((99, "Es", "Einsteinium"))
+data.append((100, "Fm", "Fermium"))
+data.append((101, "Md", "Mendelevium"))
+data.append((102, "No", "Nobelium"))
+data.append((103, "Lr", "Lawrencium"))
+data.append((104, "Rf", "Rutherfordium"))
+data.append((105, "Db", "Dubnium"))
+data.append((106, "Sg", "Seaborgium"))
+data.append((107, "Bh", "Bohrium"))
+data.append((108, "Hs", "Hassium"))
+data.append((109, "Mt", "Meitnerium"))
+data.append((110, "Ds", "Darmstadtium"))
+data.append((111, "Rg", "Roentgenium"))
+data.append((112, "Cn", "Copernicium"))
+data.append((113, "Uut", "Ununtrium"))
+data.append((114, "Fl", "Flerovium"))
+data.append((115, "Uup", "Ununpentium"))
+data.append((116, "Lv", "Livermorium"))
+data.append((117, "Uus", "Ununseptium"))
+data.append((118, "Uuo", "Ununoctium"))
+
+assert(all(len(a[1]) <= 3 for a in data))
+data = sorted(data, key=lambda a: a[1])
+data1 = [a for a in data if len(a[1]) == 1]
+data2 = [a for a in data if len(a[1]) == 2]
+data3 = [a for a in data if len(a[1]) == 3]
+
+with open("out/data1.cpp", "w") as f:
+	for a in data1:
+		print("case '", a[1], "': return ", a[1], ";", sep="", file=f)
+with open("out/data2.cpp", "w") as f:
+	firstChar = set(a[1][0] for a in data2)
+	for c1 in firstChar:
+		print("case '", c1, "':", sep="", file=f)
+		secondChar = set(a[1][1] for a in data2 if a[1][0] == c1)
+		print("switch(c2) {", file=f)
+		for c2 in secondChar:
+			print("case '", c2, "': return ", c1+c2, ";", sep="", file=f)
+		print("default: return Invalid;", file=f)
+		print("}", file=f)
+with open("out/data3.cpp", "w") as f:
+	firstChar = set(a[1][0] for a in data3)
+	for c1 in firstChar:
+		print("case '", c1, "':", sep="", file=f)
+		secondChar = set(a[1][1] for a in data3 if a[1][0] == c1)
+		print("	switch(c2) {", file=f)
+		for c2 in secondChar:
+			print("	case '", c2, "':", sep="", file=f)
+			thirdChar = set(a[1][2] for a in data3 if a[1][0] == c1 and a[1][1] == c2)
+			print("		switch(c3) {", file=f)
+			for c3 in thirdChar:
+				print("		case '", c3, "': return ", c1+c2+c3, ";", sep="", file=f)
+			print("		default: return Invalid;", file=f)
+			print("		}", file=f)
+		print("	default: return Invalid;", file=f)
+		print("}", file=f)
diff --git a/test/py/smiles/nci.smi b/test/py/smiles/nci.smi
new file mode 100644
index 0000000..8e3b939
--- /dev/null
+++ b/test/py/smiles/nci.smi
@@ -0,0 +1,1044 @@
+CC=1C(=O)C=CC(C1)=O	1
+S(Sc1nc2ccccc2s1)c1nc2ccccc2s1	2
+N(=O)(=O)c1cc([N+](=O)[O-])cc(c1O)Cl	3
+N(=O)(=O)c1sc(=N)[nH]c1	4
+O=C1c2c(C(=O)c3c1cccc3)ccc(c2)N	5
+C(=O)(O)c1c(c2c3c(oc4c2ccc(c4Br)=O)c(Br)c(O)cc3)cccc1	6
+O=C1c2c(C(=O)C(=C1N(C)C)Cl)cccc2	7
+N(=O)(=O)c1c2c(C(=O)c3ccccc3C2=O)ccc1C	8
+C(/C(=N/O)C)(=N/O)C	9
+P(c1ccccc1)(c1ccccc1)c1ccccc1	10
+C(C)(C)(C)c1c(O)cc(C(C)(C)C)c(c1)O	11
+O=C1N(N=C(C1)C)c1ccccc1	12
+Nc1c2c(cc(Cl)cc2)ncc1	13
+C(CCCCC)[C@@H]1CCCCN1	14
+C(=O)c1c2c(cc3c1cccc3)cccc2	15
+BrN1C(=O)CCC1=O	16
+C(CCCCCCCCCCCCCC)c1c(N)ccc(c1)O	17
+O(CCOc1c(cccc1)c1ccccc1)c1c(cccc1)c1ccccc1	18
+C(CCC)SCC	19
+Oc1c2c(nc(NC(C)=O)cc2)ncc1	20
+Cc1c2c(nc(c1)O)nc(N)cc2	21
+Oc1c2c(ncc1C(OCC)=O)nc(N)cc2	22
+N(=C/c1ccccc1)/c1cc(C)ccn1	23
+C([N+](C)(C)C)c1ccccc1	24
+C([N+](C)(C)C)(=O)c1ccccc1	25
+C(CCI)(c1ccccc1)(c1ccccc1)c1ccccc1	26
+C([N+](C)(C)C)c1c(C)cc(C)cc1C	27
+C([C@@](C)(O)c1ccc([N+](=O)[O-])cc1)C(=O)O	28
+C(=O)(c1ccc(C)cc1)c1ccc(Cl)cc1	29
+C(=N/O)/c1ccc(O)cc1	30
+Nc1c(C)cc(C)cc1C	31
+C(=O)(c1ccc([N+](=O)[O-])cc1)c1ccc(C)cc1	32
+C(C)(O)(c1ccccc1)c1ccccc1	33
+C(=N/O)/c1cc([N+](=O)[O-])ccc1	34
+Oc1c2c(ncc1[N+](=O)[O-])cc(Cl)cc2	35
+Clc1c2c(ncc1C)cccc2C	36
+C([C@@H](OC(N)=O)c1ccccc1)(CC)(CC)c1ccccc1	37
+C(/[C@@H](C#N)c1ccccc1)(Cc1ccccc1)=N/O	38
+C([C@@H](O)c1ccccc1)c1ccccc1	39
+C(c1ccc(OC)cc1)c1ccc(OC)cc1	40
+N([C@@H](c1c(C)cccc1)c1ccccc1)(C)C	41
+N(=O)(=O)c1c(N)c([N+](=O)[O-])cc(c1)OC	42
+C(=N/N)(/c1ccccc1)c1ccccc1	43
+C(=N/O)/c1ccc(OC)cc1	44
+C(/N=C(\c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1	45
+C(=N\c1ccccc1)(/c1ccccc1)c1ccccc1	46
+Oc1c(c(C)nc2c1cccc2)c1ccccc1	47
+C(C)C1=[O+][Cu]2([O+]=C(CC)CC(=[O+]2)CC)[O+]=C(C1)CC	48
+C([C@@H](C(=O)O)c1ccccc1)c1ccccc1	49
+C(C)c1c(N)cc(C)nc1	50
+O(c1c(c(C)nc2c1cccc2)c1ccccc1)c1ccccc1	51
+C([C@@H](C#N)c1ccccc1)(c1ccccc1)c1ccccc1	52
+N([C@@H](C#N)C)(C)C	53
+O=C1c2c(cccc2)C[C@@H]1C(C)=O	54
+C(S(Cc1ccccc1)=O)c1ccccc1	55
+C([C@]([C@@H](C)c1ccccc1)(C)c1ccccc1)#N	56
+Cc1c2c(nc(n1)O)CCCC2	57
+C(NC(c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1	58
+Oc1c2c(c(c3ccccc3)nn1)cccc2	59
+C(C(N)=O)(C)(C)c1ccccc1	60
+C(C(=O)O)(c1ccccc1)(c1ccccc1)c1ccccc1	61
+[N+](Cc1ccccc1)(CCC)(CCC)CCC	62
+C(C(=O)c1ccccc1)c1c(C)cc(C)cc1C	63
+C(OC)(c1ccccc1)(c1ccccc1)c1ccccc1	64
+C([C@@H](OC(=O)c1c(C(=O)O)cccc1)c1ccccc1)(CC)(CC)CC	65
+C(Cc1ccccc1)(C(C)=O)(c1ccccc1)c1ccccc1	66
+C(S(Cc1ccccc1)(=O)=O)c1ccccc1	67
+C(C(OC(C)(C)C)=O)(c1ccccc1)c1ccccc1	68
+C(Cc1ccccc1)(C#N)(c1ccccc1)c1ccccc1	69
+C(=C\c1ccccc1)(/C)c1ccccc1	70
+C([C@@H](C#N)c1ccccc1)c1ccccc1	71
+C([C@H]([C@@](C)(O)c1ccccc1)c1ccccc1)(=O)O	72
+C([C@H]([C@@H](C)c1ccccc1)c1ccccc1)(=O)O	73
+C(=N/O)/c1ccc(Cl)cc1	74
+C(OC)(c1ccccc1)c1ccccc1	75
+C(NC(=O)c1ccccc1)(c1ccccc1)c1ccccc1	76
+C([N+](Cc1ccccc1)(C)C)c1ccccc1	77
+C(=C/c1ccccc1)/C1=[O+][Cu]2([O+]=C(CC(=[O+]2)/C=C/c2ccccc2)c2ccccc2)[O+]=C(C1)c1ccccc1	78
+C(=N/O)/c1cc2c(OCO2)cc1	79
+C(NC(=O)c1ccccc1)(C(OCC)=O)C(OCC)=O	80
+Nc1ccc(Cl)nc1	81
+C(c1ccccc1)(c1ccccc1)N1CCCCC1	82
+Oc1c2c(c(C)c(Cl)cc2)ncc1C(OCC)=O	83
+C(=C/C(N(CC)CC)=O)/c1ccccc1	84
+C([N+](C)(C)C)c1ccc([N+](=O)[O-])cc1	85
+C([N+](C)(C)C)c1cc([N+](=O)[O-])ccc1	86
+C([C@@H](c1ccccc1)N1CCCCC1)C(=O)c1ccccc1	87
+C(N(C)C)(OC)(c1ccccc1)c1ccccc1	88
+C(CCN(C)C)(=O)c1ccccc1	89
+N(CCCC)(CCCC)C(C)=O	90
+C(O)c1c(C)cccc1	91
+N(CCC(OC)=O)(CC)CC	92
+C([C@@H](Cl)c1ccccc1)c1ccccc1	93
+C(C(CC(C)=O)=O)C(C)C	94
+N(CCC#N)(CC)CC	95
+C(C#N)c1ccc(OC)cc1	96
+N(Cc1ccccc1)(C)c1ccccc1	97
+C(C#N)(C)(C)c1ccc(OC)cc1	98
+C([C@@H](O)c1ccccc1)(CC)(CC)c1ccccc1	99
+C(=C(/OC(=O)c1ccccc1)C)/c1ccccc1	100
+N(C(C)=O)(CC)CC	101
+O([C@@H](c1ccccc1)N1CCCCC1)CCCC	102
+N(CCCCCCCC)(CC)CC	103
+O([C@@H](C)c1ccccc1)CC	104
+N(C(CC)=O)(CC)CC	105
+C(OCCCC)(OCCCC)c1ccccc1	106
+C([Si](C)(C)C)c1ccccc1	107
+N(CCCCCCN(CC)CC)c1c2c(ncc1)cc(Cl)cc2	108
+C(C)(=O)c1cc(C)c(O)c(c1)C	109
+S(N(CC)CC)(=O)(=O)c1ccc(C(OCC)=O)cc1	110
+C(C)(=O)c1ccncc1	111
+C([N+](C)(C)C)c1c(C)c(C)c(C)cc1C	112
+C(C(F)F)(CO)(F)F	113
+C(C(C(F)F)(F)F)(C(CO)(F)F)(F)F	114
+C(C(C(C(F)F)(F)F)(F)F)(C(C(CO)(F)F)(F)F)(F)F	115
+C(C(C(F)F)(F)F)(C(COC(CCCC(OCC(C(C(C(F)F)(F)F)(F)F)(F)F)=O)=O)(F)F)(F)F	116
+C(C(COC(CC(CC(OCC(C(C(C(F)F)(F)F)(F)F)(F)F)=O)C)=O)(F)F)(C(C(F)F)(F)F)(F)F	117
+[Si](OCC(C(C(C(C(C(F)F)(F)F)(F)F)(F)F)(F)F)(F)F)(OCC(C(C(C(C(C(F)F)(F)F)(F)F)(F)F)(F)F)(F)F)(OC(C)(C)C)OC(C)(C)C	118
+C(OCC(C(C(C(F)F)(F)F)(F)F)(F)F)(=O)c1c(C(OCC(C(C(C(F)F)(F)F)(F)F)(F)F)=O)cccc1	119
+CN1c2c(Sc3c1cccc3)cccc2	120
+C(C)N1c2c(Sc3c1cccc3)cccc2	121
+C(C)N1c2c([S@@](=O)c3c1cccc3)cc([N+](=O)[O-])cc2	122
+CN1c2c(S(=O)c3c1cccc3)cccc2	123
+C(CCl)(=O)c1cc2c(Sc3ccccc3N2)cc1	124
+C(CC[N+](CC)(CC)[O-])N1c2c(S(=O)c3c1cccc3)cccc2	125
+C(OC)(=O)c1c2c(Sc3ccccc3N2)ccc1	126
+C(C)(=O)N1c2c(Sc3c1cccc3)ccc(c2)C(CCl)=O	127
+C(C)(=O)N1c2c(c3c(cccc3)cc2)Sc2c1cccc2	128
+c12c(sc(n1)c1ccccc1)cc1ccccc1c2	129
+O=C1Nc2c(cccc2)SC1	130
+[Se]([Se]N1CCOCC1)N1CCOCC1	131
+N(CC)(CC)N=O	132
+N(CCC)(CCC)N=O	133
+N(CC(C)C)(CC(C)C)N=O	134
+N(CCCC)(CC)N=O	135
+N(N=O)(C)c1ccccc1	137
+N(=O)N1CCCCC1	138
+N(=O)N1CCOCC1	139
+C(/C=C/C(OCCCC)=O)(OCCCC)=O	140
+C(CBr)(=O)O	141
+C(CCl)(=O)O	142
+C(/C=C/C(=O)O)(=O)c1ccccc1	143
+C(=O)(O)c1c(N)cccc1	144
+P(=O)(O)(O)c1ccccc1	145
+S(=O)(=O)(O)c1ccccc1	146
+S(=O)(=O)(O)c1c(N)cccc1	147
+N(=O)(=O)c1c(Cl)c([N+](=O)[O-])cc(c1)S(=O)(=O)O	148
+C(=O)(O)c1ccccc1	149
+N(=O)(=O)c1cc(Cl)c(C(=O)O)cc1	150
+C(=C(/CCCC)C(=O)O)/c1cc(Cl)c(O)c(c1)Cl	151
+C(=C\c1cc(Br)c(O)c(c1)Br)(/C(=O)O)c1ccc(I)cc1	155
+C(=C\c1cc(Cl)c(O)c(c1)Cl)(/C(=O)O)c1ccc(I)cc1	156
+C(=C\c1cc(I)c(O)c(c1)I)(/C(=O)O)c1ccc(I)cc1	157
+C(=C(/C(=O)O)C)/c1ccc(O)cc1	158
+C(=C\c1c(O)c(Br)cc(c1)Br)(/C(=O)O)c1ccccc1	159
+C(=C\c1cc(Br)c(O)c(c1)Br)(/C(=O)O)c1ccccc1	160
+C(=C\c1cc(Cl)c(O)c(c1)Cl)(/C(=O)O)c1ccccc1	161
+C(=C\c1cc(O)ccc1)(/C(=O)O)c1ccccc1	162
+S(=O)(=O)(O)c1c(/C=C/c2c(S(=O)(=O)O)cc(N)cc2)ccc(c1)N	163
+C(CS(=O)(=O)O)S(=O)(=O)O	164
+C(=O)(O)[C@@H]1[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O1)O	165
+C(CO)(=O)O	166
+C([C@@H](C(=O)O)Br)(C)C	167
+S(=O)(=O)(O)c1c2c(c(N)cc1)cccc2	168
+N(C(OCC)=O)(c1cc2c(c(O)cc(c2)S(=O)(=O)O)cc1)c1ccccc1	169
+C(=O)(O)c1ccccn1	171
+C([C@@H](Br)C)(=O)O	172
+C([C@@H](C)Cl)(=O)O	173
+C(C(=O)O)CCl	174
+C([C@@H](CBr)Br)(=O)O	175
+C(=O)(O)c1nc(C(=O)O)ccc1	176
+C(=O)(O)c1ccc(C(=O)O)nc1	177
+C(=O)(O)c1c(C(=O)O)cncc1	178
+C(C(=O)O)(C)=O	179
+C(=O)(O)c1c(O)cccc1	180
+C(=O)(O)c1c(O)c([N+](=O)[O-])cc(c1)[N+](=O)[O-]	181
+C(=O)(O)c1c(O)c([N+](=O)[O-])ccc1	182
+C(=O)(O)c1cc([N+](=O)[O-])ccc1O	183
+C([C@@H](C(=O)O)Br)CC	184
+C([C@@H](O)[C@@H]1C(=O)[C@@H](C)C[C@@H](C1)C)C1CC(=O)NC(C1)=O	185
+CC1=C2C(C(O)=C(C1=O)C(=O)O)=CO[C@H]([C@@H]2C)C	186
+O(CCCC)C(N)=O	187
+N(C(OCCCl)=O)c1c(C)cccc1	188
+N(C(OCCCl)=O)c1ccccc1	189
+C(NCC=C)(OCC)=O	190
+Cc1ccc(S)cc1	191
+S(Sc1c([N+](=O)[O-])cc([N+](=O)[O-])cc1)c1c([N+](=O)[O-])cc([N+](=O)[O-])cc1	192
+C(#CC1(O)CCCC1)C1(O)CCCC1	193
+C(C(=O)c1ccccc1)(c1ccccc1)(c1ccccc1)c1ccccc1	194
+C(C(N)=O)NC	195
+C(/C=C/c1cccnc1)(=O)c1ccccc1	196
+C(/C=C/c1ccccn1)(=O)c1ccccc1	197
+C([C@@H]([C@@H](O)c1ccccn1)C)(=O)c1ccccc1	198
+N(C(C)=O)c1cc(C)cc(c1)C	200
+S(=O)(=O)(O)c1c2c(C(=O)c3c(S(=O)(=O)O)cccc3C2=O)ccc1	201
+S(=O)(=O)(O)c1c2c(C(=O)c3cccc(c3C2=O)S(=O)(=O)O)ccc1	202
+S(Sc1c([N+](=O)[O-])cccc1)c1c([N+](=O)[O-])cccc1	203
+N(=C/c1ccccc1)/c1ccc(Cl)nc1	204
+C(=O)(O)c1c(NC(Nc2c(C(=O)O)cccc2)=O)cccc1	205
+C(C)(C)(O)c1c2c(c(C(C)(C)O)ccc2)ccc1	206
+C(OCCC(OC)=N)(=O)c1ccccc1	207
+S(=O)(=O)(c1ccc(C)cc1)c1ccc(C)cc1	208
+C(SSC(=O)c1ccccc1)(=O)c1ccccc1	209
+C(CCC(=O)O)(CCC(=O)O)(C)C	210
+S(Sc1ccc(CC(=O)O)cc1)c1ccc(CC(=O)O)cc1	211
+S(Cl)(=O)(=O)c1ccc(Oc2ccc(S(Cl)(=O)=O)cc2)cc1	212
+S(Sc1c(C(=O)O)cccc1)c1c(C(=O)O)cccc1	213
+O(c1ccc(C(C)=O)cc1)c1ccc(C(C)=O)cc1	214
+O(C(CCC)=O)c1c(C(=O)O)cccc1	215
+C(C)(C)c1ccc(/C=C/C(=O)O)cc1	216
+S(N)(=O)(=O)c1ccc(NC(C)=O)cc1	217
+N(=O)(=O)c1cc(Cl)c(N)c(c1)Cl	218
+O(c1ccc([C@@H](C)O)cc1)c1ccc([C@@H](C)O)cc1	219
+S(Sc1ccc(NC(CCCCCCCCCCC)=O)cc1)c1ccc(NC(CCCCCCCCCCC)=O)cc1	220
+C(CCC(=O)c1ccc(Br)cc1)(=O)c1ccc(Br)cc1	222
+C(=O)(O)c1c(OC(CCCCC)=O)cccc1	223
+C(C)(=S)N1CCCCC1	224
+C(C)(=O)c1c2c(c(C(C)=O)ccc2)ccc1	225
+C(CCCCCN)(OCC)=O	226
+S(Cc1ccccc1)(=O)(=O)c1ccc(C)cc1	227
+C([C@@H](C(=O)O)N)CCCCC[C@@H](C(=O)O)N	228
+Sc1c2c(c(S)ccc2)ccc1	229
+C(/C=C/c1ccccn1)(=O)c1ccc(N)cc1	231
+C(N(C)C)CC#N	232
+C([C@@H](C(OCC)=O)C(C)=O)C(OCC)=O	233
+C(#C/C(=C/CCC)C)C=1CCCCC1	234
+O(CCC#N)C(C)=O	235
+C(OCC)(=O)N1CCCCC1	236
+C(OCCC#N)(=O)c1ccccc1	237
+C(C)(=O)N1CCCCC1	239
+c12c3c(ccc1CCCC2)CCCC3	240
+C(OCCCC)OCCCC	241
+S([C@@H](CC(C)=O)c1ccccc1)CCSCCS[C@@H](CC(C)=O)c1ccccc1	243
+C[C@@]12[C@@H](OC([C@@H]([C@@H](OC)c3ccccc3)[Hg]Br)=O)C[C@@H](C1(C)C)CC2	244
+C(CC(=O)c1ccccc1)(c1ccccc1)(c1ccccc1)c1ccccc1	245
+C(SC(C)=S)C(C)C	246
+Clc1c(Cl)ccc(c1)N	247
+P(F)(=O)(O)O	248
+P(N)(N)(=O)c1ccccc1	250
+Nc1nc(N)ncn1	251
+S(N)(N)(=O)=O	252
+O(B1OB(O)O1)B1OB(O)O1	253
+P(NC1CCCCC1)(Oc1ccccc1)(Oc1ccccc1)=O	254
+P(OCCCC)(=O)(N1CCOCC1)N1CCOCC1	255
+O([P](N)(=O)c1ccccc1)CC	256
+Cc1nc(N)nc(n1)N	257
+P(NN)(NN)(=S)c1ccccc1	258
+N(NC(NN)=S)c1ccccc1	259
+S(NCC)(NCC)(=O)=O	260
+C(NNC(N)=S)(CC(C)=O)(C)C	261
+P(Nc1ccccc1)(Nc1ccccc1)(Nc1ccccc1)=O	262
+N(S(=O)(=O)O)(S(=O)(=O)O)S(=O)(=O)O	263
+C(C(NN)=O)(NN)=O	264
+C(=N/NC(Nc1nnn[nH]1)=O)/c1c(O)cccc1	265
+C(NNC(N)=O)(NNC(N)=O)=O	266
+C(=N/NC(N)=S)/c1ccccc1	267
+C(=N\NC(N/N=C(\C)c1ccccc1)=S)(/C)c1ccccc1	268
+C(=N\N=C(/C)c1ccc(Cl)cc1)(/C)c1ccc(Cl)cc1	269
+N(C(OCC)=O)c1nnn[nH]1	270
+S(C)(N)(=O)=O	271
+N(C(OCC)=O)C(N)=O	272
+C(#N)c1c2c(nc3c1cccc3)cccc2	273
+C(C(=O)c1ccc(Cl)cc1)(=O)c1ccc(Cl)cc1	274
+C(NCCCCCCNC(=O)c1ccccc1)(=O)c1ccccc1	275
+C([C@@H](CC(=O)c1ccccc1)N1CCN(Cc2ccccc2)CC1)(=O)c1ccccc1	276
+C(=O)(O)c1ccc(Cl)nc1	277
+O=C1C(=C(O)C(=O)c2c1cccc2)C1CCCCC1	278
+C([C@@H](Cc1ccccc1)N1CCCCC1)(=O)c1ccccc1	279
+Clc1c2c(cc([nH]2)c2ccccc2)cc(c1)Cl	281
+N(N)c1c(C(=O)O)cccc1	282
+N(=O)(=O)c1cc(N)cc(c1)N	283
+N(=O)(=O)c1cc([N+](=O)[O-])cc(c1)N	284
+C[C@@]12C(C)(C)[C@@H](C(C1=O)=O)CC2	285
+N(=O)(=O)c1c(N)c(C)ccc1	286
+C(OCC)(OCC)c1ccccc1	287
+C(=O)(O)c1c(NN)ccc(c1)I	288
+N(=O)(=O)c1c(Br)ccc(c1)C	289
+Brc1c2c(cc([nH]2)c2ccccc2)cc(c1)Br	290
+C(=C1\N=C(c2ccccc2)OC1=O)/c1ccccc1	291
+C[C@@H]1CCOCO1	292
+N(=O)(=O)c1cc(C)c(I)cc1	293
+N(=O)(=O)c1c(I)ccc(c1)C	294
+C(CCC(=O)O)c1ccccc1	295
+C(=O)(c1c(O)ccc(c1)C)c1ccccc1	296
+C(=O)(c1cc(C)c(O)cc1)c1ccccc1	297
+C(=C(/C(=O)O)C#N)/c1ccccc1	298
+N(C(C)=O)c1c(C(=O)O)cc(I)cc1	299
+S(=O)(=O)(O)c1cc(Br)c(N)c(c1)Cl	300
+C(C(=O)O)c1cc2c(cccc2)cc1	301
+C(=O)(O)c1c(N)ccc(c1)I	302
+Clc1c2c(c(=O)[nH][nH]2)ccc1	303
+O=C1N(C)N=C(C1)C	304
+Nc1c(Br)cccc1Br	305
+N(C(C)=O)c1cc(Br)cc(c1)C	306
+C(C(OCC)=O)C1(O)CCCCC1	307
+N(Nc1cc(Br)cc(c1)Br)c1cc(Br)cc(c1)Br	308
+N(Nc1c(C)cccc1)c1c(C)cccc1	309
+N(=N/c1ccc(c2ccccc2)cc1)/c1ccc(c2ccccc2)cc1	310
+N(C(CCl)=O)c1ccccc1	311
+c1([C@H]([C@@H](C(=O)c2ccccc2)N2CCOCC2)N2CCOCC2)ccccc1	312
+S(N(N=O)C)(=O)(=O)c1ccc(C)cc1	313
+C(NC(C(NCc1ccccc1)=O)=O)c1ccccc1	314
+N([C@@H](C(=O)c1ccccc1)c1ccccc1)(C(C)=O)c1ccccc1	315
+C(=C/C=C/c1ccccc1)/c1ccccc1	316
+N(C(C(NC1CCCCC1)=O)=O)C1CCCCC1	317
+C(N1C(=O)[C@H](O)CC1)c1ccccc1	318
+O=C1N(CC[C@@H]1O)C1CCCCC1	319
+N(C(CN(C(C)=O)c1ccc(Cl)cc1)=O)(CC(=O)O)c1ccc(Cl)cc1	320
+N(C(C(OCC)=O)=O)(CCC(=O)O)c1ccccc1	321
+Oc1c(C2=NCCN2)cccc1	322
+Br[C@H]([C@@H](C(CBr)=O)Br)c1ccccc1	323
+C(NCCNCCO)(=O)c1c(O)c([N+](=O)[O-])cc(c1)[N+](=O)[O-]	324
+C(N1C[C@H](C(OC)=O)C(C1=O)=O)c1ccccc1	325
+C(OCC)(=O)[C@H]1C(=O)C(=O)N(C1)C	326
+C(OCC)(=O)[C@H]1CN(CC)C(C1=O)=O	327
+C(OCC)(=O)[C@H]1CN(CCC)C(C1=O)=O	328
+C(OCC)(=O)[C@H]1CN(C(C)C)C(C1=O)=O	329
+C(OCC)(=O)[C@H]1C(=O)C(=O)N(C1)CCCC	330
+C(OCC)(=O)[C@H]1CN(CC(C)C)C(C1=O)=O	331
+C(OCC)(=O)[C@H]1CN(C(C)(C)C)C(C1=O)=O	332
+O=C1N(C[C@H](C1=O)C(OCC)=O)c1ccccc1	333
+C(N1C[C@H](C(OCC)=O)C(C1=O)=O)c1ccccc1	334
+C(OCC)(=O)[C@H]1C(=O)C(=O)N(C1)CCc1ccccc1	335
+N(C(C)C)(C(C)C)N=O	336
+N(N=O)(C1CCCCC1)C1CCCCC1	337
+N(Cc1ccccc1)(Cc1ccccc1)N=O	338
+N(=O)N1CCN(N=O)CC1	339
+Brc1c(C)c(C)c(C)c(c1C)C	340
+C(OC)c1c(C)cc(C)cc1C	341
+C(=O)(c1cc(C)c(O)c(c1)C)c1ccccc1	342
+C(CC)(CC)(C#N)c1ccccc1	343
+C(CN(C)C)c1c(C)cc(C)cc1C	344
+C(C(OCC)=O)(C(C)=O)C(C)=O	345
+N(=O)(=O)c1c2c(ccc1)cccn2	346
+C([C@@H](CCCC)CC)(CC(C)=O)=O	347
+C(CC(C)=O)c1ccc(Cl)cc1	348
+C(N(C)C)c1cc(OC)ccc1C	349
+C(CN(C)C)c1c(C)c(C)c(C)cc1C	351
+C([N+](C)(C)C)c1c(C[N+](C)(C)C)cccc1	352
+N(CCCN(CC)CC)c1c2c(nc3c1ccc(c3)Cl)ccc(c2)OC	353
+C(COC)(=O)c1ccccc1	354
+C(C(CCCCC)=O)C(CC)=O	356
+C([C@@H](O)c1ccccc1)(CC)(CC)CC	357
+C([C@@H](O)c1ccccc1)C(OC(C)(C)C)=O	358
+Clc1c2c(Sc3c(Cl)ccc(c3N2)Cl)c(Cl)cc1C#N	359
+C(/C=C/c1ccc(N(C)C)cc1)(=O)c1ccccc1	360
+C([C@@](C)(O)c1ccccc1)C(N(CCCC)CCCC)=O	361
+C([C@@H](C#N)c1ccccc1)(OCC)=O	362
+C(N(C)C)(c1ccccc1)c1ccccc1	363
+C([C@@H](O)c1ccc(Cl)cc1)(=O)c1ccc(Cl)cc1	364
+C(C(CC(C)C)=O)C(CCC)=O	365
+N(CCCC#N)(CC)CC	366
+C([C@@H](C(OC)=O)CC)(=O)c1ccccc1	367
+c1([C@H]([C@@H](C(=O)c2ccc(NC(C)=O)cc2)N2CCOCC2)N2CCOCC2)ccccc1	368
+C([C@H]([C@@H](C(=O)c1ccccc1)N1CCOCC1)N1CCOCC1)(=O)c1ccccc1	369
+C(/C=C/c1ccccc1)(=O)c1ccc(/N=C/c2ccccc2)cc1	370
+C(/C=C/c1ccccc1)(=O)c1ccc(N)cc1	371
+C(/C=C/c1ccc(N(C)C)cc1)(=O)c1ccc(NC(OCC)=O)cc1	372
+C(/C=C/c1ccc(N(C)C)cc1)(=O)c1ccc(NC(C)=O)cc1	373
+N(CC)(CC)c1ccc(/C=C/C(=O)c2ccc(NC(C)=O)cc2)cc1	374
+N(C[S](=O)=O)c1ccc(OCCCC)nc1	375
+O=C1c2c(C(=O)C(=C1CCCc1ccc(Oc3ccccc3)cc1)O)cccc2	377
+C(=O)(O)c1c(Cl)nccc1	378
+S(CC(=O)O)c1c(C(=O)O)cccc1	379
+O=C1C2=C(C(=O)c3c1cccc3)CCCC2	380
+N(CCCN(CCCCC)CCCCC)c1c2c(nc3c1CCCC3)ccc(c2)OC	381
+C(N(CCCC)CCCC)(=[NH2])c1c(C)cc(C)cc1C	382
+C(=O)(O)c1ccc(N)nc1	383
+N(CCCN(CCCCC)CCCCC)c1c2c(nc3c1CCCC3)ccc(c2)Cl	384
+C(=C\c1ccccc1)(/[N+](=O)[O-])c1ccccc1	385
+C(=O)(O)c1c2c(nc3c1cccc3)cccc2	386
+C([C@@H](CC(=O)c1ccccc1)N1CCC(C)CC1)(=O)c1ccccc1	387
+N([C@H]([C@@H](O)c1ccc(Cl)cc1)c1ccc(Cl)cc1)CCO	389
+C([C@@H](CC(=O)c1ccccc1)N1[C@@H](C)CCCC1)(=O)c1ccccc1	390
+C([C@@H](NCCO)c1ccc(Cl)cc1)(=O)c1ccc(Cl)cc1	391
+S(C)c1nc(SC)nc(n1)C	392
+N(=O)(=O)N1C(=O)CCC1=O	393
+N(=O)(=O)N1C(=O)CCC1=O	394
+O=C1c2c(cccc2)C(N1[N+](=O)[O-])=O	395
+O=C1c2c(cccc2)C(N1[N+](=O)[O-])=O
+C(O)c1ccccc1	396
+C(=C/[C@@H](CCCC)CC)/c1nc2c(cccc2)cc1	397
+P(=O)(c1ccccc1)(c1ccccc1)c1ccccc1	398
+C(CC#N)n1c2c(cccc2)c2c1cccc2	399
+C(C(=O)O)c1c(F)cccc1	401
+C(C(=O)O)c1ccc(F)cc1	402
+C(=O)(O)C1CCOCC1	403
+C(=O)(O)C1(C(=O)O)CCOCC1	404
+O[C@@H](c1nc2ccccc2[nH]1)c1ccccc1	405
+C(Oc1ccccc1)(Oc1ccccc1)C(=O)O	406
+C(C)(=O)c1cc2c(c3ccccc3s2)cc1	407
+C(C)(=O)c1cc2c(c3ccc(cc3s2)C(C)=O)cc1	408
+C(OC)(=O)c1c(Br)c([N+](=O)[O-])ccc1	409
+O=S1(=O)c2c(Oc3c1cccc3)cccc2	410
+O(CCCCCCCCCCCC)c1ccc(C(=O)O)cc1	411
+C(=N/[C@@H](CC/N=C/c1c(O)cccc1)C)/c1c(O)cccc1	412
+C(C)O
+S(CC)c1nc(C=O)cc(n1)O	413
+C(CNCCc1sc(C)nc1C)c1sc(C)nc1C	414
+C(NN)(=O)C1C(C(NN)=O)C1C(NN)=O	415
+O([P](N(C(C)C)C(C)C)(=O)c1ccc([N+](=O)[O-])cc1)[P](N(C(C)C)C(C)C)(=O)c1ccc([N+](=O)[O-])cc1	416
+P(=O)(O)(O)c1ccc(N)cc1	417
+C[C@@H]1N[C@@H](C)SC(S1)C	418
+P(=O)(O)(O)c1cc([N+](=O)[O-])ccc1	419
+P(=O)(O)(O)c1ccc([N+](=O)[O-])cc1	420
+C(C(OCC)=O)([Si](C)(C)C)(C)C	421
+C([C@@H](C(OCC)=O)C(C)C)(CC(C)C)=O	422
+O(CCO)c1c(Cl)cc(Cl)cc1	423
+C(CCCCCCCCCCCCCCCC)C1=NCCN1	424
+C(NC[C@H]1CCCO1)[C@@H]1CCCO1	425
+N(=N/c1cc(OC)c(N)cc1)/c1c(OC)cccc1	426
+Clc1c(O)ccc(c1)O	427
+[N+](C)(=O)[O-]	428
+C(NCC)(NCC)=O	429
+O(CC(=O)O)c1c(Cl)cc(Cl)c(c1)Cl	430
+Nc1ccccn1	431
+[Sb](Cl)(Cl)(c1ccccc1)(c1ccccc1)c1ccccc1	432
+N(C)(C)c1ccc(c2ccc(N(C)C)cc2)cc1	433
+N(C)C1CCCCC1	434
+C(Cl)(c1ccccc1)(c1ccccc1)c1ccccc1	435
+C(C)[n+]1c2c(ccc1)cccc2	436
+C(C(=O)O)CS	437
+P(Oc1c(C)cccc1)(Oc1c(C)cccc1)(Oc1c(C)cccc1)=O	438
+c12c(Sc3ccccc3S1)cccc2	439
+C(NCC)(OCC)=O	440
+C(CO)(C)(C)N	441
+C(/CC)(=N/O)C	442
+C(CNCCN)NCCN	443
+N(C(C)=O)c1ccc(Cl)cc1	444
+C([C@@H](CN)O)CC	445
+N(CCN)CCN	446
+C(S(=O)(=O)O)CBr	447
+N(/Cl)=C1/C=CC(=O)C=C1	448
+C(=O)c1c2c(ccc(c2)OC)ncc1	449
+Cc1c(N)nccc1	450
+C(CO)(F)(F)F	451
+C(=O)(O)C1CCCCC1	452
+C(S(=O)(=O)O)CC(C)C	453
+N(C(OCC)=O)CCCC	454
+C(CC)(C)(C)c1c(O)cc(C(CC)(C)C)c(c1)O	455
+N(/NC(N)=O)=C(\C)C	456
+N(C(CCCCCCCCCCC)=O)(CCCC)CCCC	457
+O=C1c2c(C(=O)c3c1cccc3)cccc2N	458
+C(#N)c1c(N)nc(C)nc1	459
+Cc1cc(C)nc(c1)C	460
+N(CCN)CCO	461
+C[C@@H]1CCCCN1	462
+S(=O)(=O)(O)O
+O=C1N2[C@@H]3[C@@]4([C@@H]5[N@@](CC=6[C@@H]([C@@H]3[C@@H](C1)OCC6)C5)CC4)c1c2cc(OC)c(c1)OC	463
+c12c(Sc3ccccc3O1)cccc2	464
+[Bi](c1ccccc1)(c1ccccc1)c1ccccc1	465
+C([C@@](C(=O)O)(CC)C)CC	466
+C(CCCC)(C(=O)O)(CC)CC	467
+C(C(C(=O)O)(C)C)CCCCCCC	468
+C(CCCCCCCC)(C(=O)O)(CC)CC	469
+C([C@@](CCCC)(C(=O)O)CC)CCCCCCC	470
+C(Cc1ccccc1)(C(=O)O)(CC)CC	471
+C([C@@](CCCC)(C(=O)O)CC)c1ccccc1	472
+N(C(Nc1c(C)cccc1)=[NH2])c1c(C)cccc1	473
+C1CNCCN1	474
+Cc1cc2c(cccc2)cn1	475
+C(C)[n+]1c2c(ccc1C)cccc2	476
+O[Ti]12(O)(O[C@H](C)C(O2)=O)O[C@@H](C)C(O1)=O	477
+[As](c1ccccc1)(c1ccccc1)c1ccccc1	478
+C([C@]1(C(=O)NC(N1)=O)c1cccnc1)c1ccccc1	479
+C([C@@H](NC(CCCC)=O)O)([C@@H](C)Cl)(Cl)Cl	480
+N(C(CBr)=O)c1ccc(Cl)cc1	481
+N(C(CBr)=O)c1ccc(C)cc1	482
+N(C(C(Cl)(Cl)Cl)=O)c1ccccc1	483
+S([Hg]c1ccccc1)c1nc2ccccc2s1	484
+C([C@@H](C#N)c1ccccc1)(C#N)C#N	485
+N(C(=O)c1c(O)cccc1)c1c2c(ccc1)cccc2	486
+N(C(=O)c1c(O)cccc1)c1cc2c(cccc2)cc1	487
+C(=C/c1ccccn1)/c1ccc(Cl)cc1	488
+C(=C/c1ccncc1)/c1ccc(Cl)cc1	489
+C(=C(\C#N)C#N)/c1ccccc1	490
+C(=C(\C#N)C#N)/c1cc([N+](=O)[O-])ccc1	491
+C(=C(\C#N)C#N)/c1ccc(Cl)cc1	492
+C(=C(/C#N)C#N)/c1c(Cl)cc(Cl)cc1	493
+C(=C(/C#N)C#N)/c1cc(Cl)c(Cl)cc1	494
+N(C(/C=C/c1ccccc1)=O)c1ccccc1	495
+N(CCCCCCC)P(Cl)(Cl)=S	496
+P(NCCC)(NCCC)(NCCC)=S	497
+P(NCCCCCCC)(NCCCCCCC)(NCCCCCCC)=S	498
+P(NCCCCCCCC)(NCCCCCCCC)(NCCCCCCCC)=S	499
+P(NCCCCCCCCCCCC)(NCCCCCCCCCCCC)(NCCCCCCCCCCCC)=S	500
+N(/O)=C1\C(C)(C)[C@H]2CC[C@@]1(C)C2	501
+C(=N/Nc1ccccc1)/c1ccco1	502
+S=c1[nH]c2c(cccc2s1)c1ccccc1	503
+O=C1c2c(C(=O)c3c1cccc3)ccc(c2Cl)C	504
+C([C@H]([C@@H](CBr)Br)Br)Br	505
+C([C@@H](C1CCCCC1)c1ccccc1)#N	506
+C([C@@](C)(O)c1ccccc1)(C)C	507
+C(CCCO)CCO	508
+O=C1C=C(c2ccccc2)CC1	509
+C(CCC#N)CCN	510
+C(CCC(=O)O)(OC)=O	511
+C(CC(=O)O)c1ccc(C)cc1	512
+C([C@@H](CO)O)CC	513
+O([C@@](CC)(C#N)C)C(C)=O	514
+O([C@]([C@@](OC(C)=O)(C#N)C)(C#N)C)C(C)=O	515
+C(SC)(=[NH2])N
+S(=O)(=O)(O)O	516
+C([C@H]([C@@H](C(OC)=O)O)O)(OC)=O	517
+O([C@@H](C(C)C)C)C(C)=O	518
+C(CCC#N)(=O)c1ccccc1	520
+O=C1c2c3c(ccc2C(O1)=O)cccc3	521
+[N+](C)(C)(C)[C@H]1CS(=O)(=O)C=C1	522
+C(C#C)(C)(C)O	523
+C[C@@H]1C(=O)CCCC1	524
+C(CCCCCCCC=C)COC(C)=O	525
+N(C(CCC(=O)O)=O)(CC)CC	526
+C(OC(C)=O)[C@@H]1[C@@H](COC(C)=O)[C@@H](C)C=C[C@@H]1C	527
+N(/Cl)=C1/C=C(Br)C(=O)C(=C1)Br	528
+C(C)[n+]1c2c(cc(C)cc2)ccc1C	529
+N(C(=O)c1c(O)cccc1)c1ccc(C(=O)O)cc1	530
+C(Nc1ccccc1)(=O)c1c(OCC(=O)O)cccc1	531
+C(=C(\C#N)C#N)/c1ccc(Br)cc1	532
+C(CNc1ccccc1)n1c2c(cccc2)sc1=S	533
+C(SC#N)c1cc([N+](=O)[O-])ccc1O	536
+O=C1c2c(C(=O)C(=C1Cl)Cl)cccc2	537
+O([C@@H](C(=O)O)C)c1c(cccc1)c1ccccc1	538
+N(=C/c1c(O)cccc1)/c1ccc([Hg]OC(C)=O)cc1	539
+N(=O)(=O)c1c(SC#N)ccc(c1)[N+](=O)[O-]	540
+C(Cl)c1cc([N+](=O)[O-])ccc1O	541
+C(=C(\C#N)C#N)/c1c(Cl)cccc1	542
+S(N)(=O)(=O)c1cc(SC#N)c(N)cc1	543
+O(C[C@H]1CO1)c1cc([N+](=O)[O-])ccc1	544
+C([C@@H](C#N)c1cc(Cl)c(Cl)cc1)(C#N)C#N	545
+P(NC1CCCCC1)(NC1CCCCC1)(NC1CCCCC1)=S	546
+N(C(CBr)=O)c1c(C)cccc1	547
+S(N)(=O)(=O)c1ccc(NC(CBr)=O)cc1	549
+S(Sc1cc(S(N)(=O)=O)ccc1N)c1cc(S(N)(=O)=O)ccc1N	550
+C[C@@]12[C@@H](OC(CN(CCCCC)CCCCC)=O)C[C@@H](C1(C)C)CC2	551
+C(COC)CN	552
+C(NCO)(C=C)=O	553
+Oc1nc2c(cccc2)cc1	554
+C(OC(N[C@@H](CCC(=O)O)C(=O)O)=O)c1ccccc1	555
+C(OC(C)=O)[C@H]1[C@@H](COC(C)=O)[C@@H]2CC[C@@H]1C2	556
+C(OC(C)=O)[C@@H]1[C@@H](COC(C)=O)[C@@H](C)CCC1	557
+C=C1CCCC=C1	560
+C(OC/C=C/COC(OC)=O)(OC)=O	561
+C(/CC(C)C)(=N/O)C	562
+O(C(C)=O)[C@@H]1[C@@H](OC(C)=O)CCCC1	563
+N(CCC[C@@H](Br)C)(CC)CC	564
+O(C(C)=O)[C@@]1(C)[C@@](OC(C)=O)(C)C(=O)OC1=O	565
+C([C@@H](OC=O)C)C(C)C	566
+C([C@@H](OC(C)=O)C)C(C)C	567
+O([C@@H](CC(C)C)C)C(CCC)=O	568
+O([C@@H](CC(C)C)C)C(CC(C)C)=O	569
+O([C@@H](CC(C)C)C)C(CCCCCC)=O	570
+C(O[C@@H](CC(C)C)C)(=O)c1ccc(OC)cc1	571
+C(Cl)c1c(C)cc(C)cc1	574
+O=C1c2c(cccc2)C(N1CCCCBr)=O	575
+N(CCCCCCCCCCCO)(CCCCCC)CCCCCC	576
+C(=O)(O)c1c(Cl)cc(Cl)cc1	578
+Fc1ccc(N)cc1	579
+C(Cc1ccc(N)cc1)c1ccc(N)cc1	580
+C(C(C)=O)c1ccc([N+](=O)[O-])cc1	581
+C(CC)(=O)c1ccc([N+](=O)[O-])cc1	582
+C(CC)(=O)c1cc(C(CC)=O)cc(c1)C(CC)=O	583
+C(=C/C(/C=C/c1c(Cl)cccc1)=O)/c1c(Cl)cccc1	584
+N(N=O)(c1ccccc1)c1ccccc1	585
+C(/C=C/c1ccccc1)(=O)c1c(C)c([N+](=O)[O-])cc(c1)[N+](=O)[O-]	586
+C(C(C)=O)c1ccc(c2ccccc2)cc1	587
+O(C)c1c2c(c([N+](=O)[O-])cc1OC)nccc2	588
+O=C1C(=CC(=O)C(=C1)c1ccc(OC)cc1)c1ccc(OC)cc1	589
+C(=C)N1C(=O)CCC1=O	590
+Clc1cc2c(NC(=O)CS2)cc1	591
+Oc1c2c(cc(c1C#N)C)cccc2	592
+Clc1c2c(cc(Cl)cc2)ncc1	593
+C(Cc1ccc(Cl)cc1)c1ccc(Cl)cc1	594
+C(CCCCCCC)(CCCCCCC)=O	595
+N(=O)(=O)c1c(Br)c([N+](=O)[O-])cc(c1C)[N+](=O)[O-]	596
+C(=O)(O)c1cc(N)c(C)cc1	597
+c1(cc(nc(c1)c1cccnc1)c1cccnc1)c1ccccc1	598
+C(=C(/C(=O)O)C)/c1c2c(ccc1OC)cccc2	599
+C(CC(C(C)(C)C)=O)(c1ccccc1)c1ccccc1	600
+C(=O)(O)c1c(C)c(Br)c(C)cc1C	601
+C(C(CCCCCCCCC=C)=O)CCCCCCCC=C	602
+C(CNC(C)=O)NC(C)=O	603
+C(C=C)C1(O)C(=C(c2ccccc2)C(=C1c1ccccc1)c1ccccc1)c1ccccc1	604
+C(Cl)(=O)c1c2c(c([N+](=O)[O-])ccc2)ccc1	605
+C(N)(=O)[C@@]1(C)C(C)(C)[C@@H](C(=O)O)CC1	606
+O=C1c2c(C(=O)c3c1cccc3)ccc(c2)C	607
+N(=O)(=O)c1ccc(CCc2ccc([N+](=O)[O-])cc2)cc1	608
+N(=O)(=O)c1c(C(=O)O)cccc1OC	609
+C(Br)(Br)(Br)c1nc2c(cccc2)cc1	610
+C(CCl)[C@H]1C(=O)N[C@@H](CCCl)C(N1)=O	611
+C(CCCC(=O)c1ccc(C)cc1)(=O)c1ccc(C)cc1	612
+Brc1nc(Br)ccc1	613
+N(=O)(=O)c1c2c(c(N)cc1)cccc2	614
+C(C)(=O)c1c(O)cccc1O	615
+C(=O)(c1c(C)cccc1)c1c(C)cccc1	616
+N(=O)(=O)c1cc(C(C)=O)ccc1C	617
+Cc1c2c(ccc1)cc[nH]2	618
+C(CCCC)(=O)c1cc(OC)cc(c1)OC	619
+C(OCC)(=O)c1cc2c(cccc2)oc1=O	620
+C(=O)(O)C1CCC(C(=O)O)CC1	621
+C(=O)(O)C=1CC[C@@H](C)CC1	622
+C(=O)(c1c(O)cccc1)c1ccccc1	623
+C(C(OC)=O)(O)(c1ccccc1)c1ccccc1	624
+C(CCC(=O)O)(=O)c1cc(OC)c(OC)cc1	625
+Clc1c2c(c3c(c(Cl)ccn3)cc2)ncc1	626
+C(=N/C(NC(N)=S)=S)/c1ccc(OC)cc1	627
+N(C(/N=C/CC)=S)C(N)=S	628
+C1[C@@H](O1)[C@@H]1CO1	629
+C(Br)[C@H]1CO1	630
+C(OCC=C)[C@H]1CO1	631
+O(C[C@H]1CO1)c1c2c(ccc1)cccc2	632
+C(OCCCl)[C@H]1CO1	633
+O(C[C@H]1CO1)c1c(Cl)cc(Cl)cc1	634
+O(C[C@H]1CO1)c1ccccc1	635
+C(CBr)(CBr)O	636
+C1[C@@H](O1)c1ccccc1	637
+C(CCCCCCC(=O)O)[C@H]1[C@@H](CCCCCCCC)O1	638
+S(NN)(=O)(=O)c1ccc(NC(C)=O)cc1	639
+C(NN)(=O)c1ccc(N)cc1	640
+C(NN)(=O)c1c(O)ccc(c1)N	641
+C(NN)(=O)c1c(N)cccc1	642
+S(NN)(=O)(=O)c1ccccc1	643
+C(NN)(=O)c1ccccc1	644
+C(NN)(=O)c1cc(OC)nc(c1)OC	645
+C(/C=C/C)(NN)=O	646
+C(NN)(=O)c1ccc(O)cc1	647
+C(NN)(=O)c1ccc(C(C)C)cc1	648
+C(C(NN)=O)C(NN)=O	649
+I(Cl)Cl
+Cc1[n+](C)cccc1	650
+Oc1c2c(c(O)nn1)cccc2	651
+C(NN)(=O)c1c(O)cccc1	652
+C(NN)(=O)c1cccs1	653
+CC=1OC(=O)CC1	654
+C[C@H]1OC(=O)C=C1	655
+C([C@@H](O)[C@@H]1[C@@H](O)[C@@H](O)C(O1)=O)=O	656
+N(C(C)=O)c1ccc(/C=N/O)cc1	657
+C(/C(=O)c1ccccc1)(=N/O)c1ccccc1	658
+C(/[C@@H](O)c1ccccc1)(=N/O)c1ccccc1	659
+C(/C(C)=O)(=N/O)C	660
+N(CC)(CC)[C@@H]1/C(=N/O)CCCC1	661
+N(=O)(=O)c1oc(/C=N/O)cc1	662
+C(/C=C/c1ccc(OC)cc1)(=N/O)c1ccccc1	663
+C(/CCc1ccc(OC)cc1)(=N/O)c1ccccc1	664
+C([N+](C)(C)C)[C@@H]1COCCO1	665
+C([C@@H](C(NO)=O)N)c1ccc(O)cc1	667
+O(OC(C)=O)C(C)=O	669
+C(OOC(CCCCCCCCCCC)=O)(CCCCCCCCCCC)=O	670
+C(OOC(=O)c1ccccc1)(=O)c1ccccc1	671
+C(OO)(C)(C)C	672
+O(OC(C)(C)C)C(C)(C)C	673
+C(OOC(C)(C)C)(=O)c1ccccc1	674
+C(OOC(=O)c1ccccc1)(=O)c1ccccc1	675
+C(OOC(CCC(=O)O)=O)(CCC(=O)O)=O	676
+N=c1sc(c2ccccc2)n[nH]1	677
+S=c1[nH]c(c2ccccc2)cs1	678
+c12c(nsn1)cccc2	679
+S=C1NCCS1	680
+Cc1c(C)sc([nH]1)=S	681
+N(C(Nc1ccc(N(C)C)cc1)=S)c1ccc(OCCCC)cc1	682
+N(C(Nc1c(CC)cccc1)=S)c1c(CC)cccc1	683
+N(C(Nc1ccccc1)=S)c1ccccc1	686
+N(C(Nc1ccc(C)cc1)=S)c1ccc(C)cc1	687
+N(NC(NNc1ccccc1)=S)c1ccccc1	688
+C(NN)(NN)=S	689
+N(C(C)=O)c1ccc(/C=N/NC(NN)=S)cc1	690
+C(=N/NC(NN)=S)/c1ccccc1	691
+C(=N/NC(NN)=S)/c1ccco1	692
+N(=O)(=O)c1ccc(/C=N/NC(NN)=S)cc1	693
+N(=O)(=O)c1cc(/C=N/NC(NN)=S)ccc1	694
+C(=N/NC(NN)=S)/c1cccnc1	695
+C(=N/NC(NN)=S)/c1ccc[nH]1	696
+C(=N/NC(NN)=S)/c1nc2c(cccc2)cc1	697
+C(=N/NC(NN)=S)/c1c2c(ncc1)cccc2	698
+C(=N/NC(NN)=S)/c1cccs1	699
+S(NNC(N)=S)(=O)(=O)c1ccccc1	700
+C(NNC(N)=S)(=O)c1ccccc1	701
+C(NNC(N)=S)(=O)c1ccc([N+](=O)[O-])cc1	702
+C(NNC(N)=S)(=O)c1cc([N+](=O)[O-])ccc1	703
+N(C(NN)=S)c1ccccc1	704
+C(=N\NC(N)=S)(/C)c1ccc(Cl)cc1	705
+C(=C/C=N/NC(N)=S)/c1ccccc1	706
+C(=N\NC(N)=S)(/C)c1cccs1	707
+C(=N/NC(N)=S)(/C(=N/O)C)C	708
+C(=N/NC(N)=S)(/CC)C	709
+C(/C(=N/NC(N)=S)C)C(OCC)=O	710
+N(/NC(N)=S)=C(\C)C	711
+C(=N/NC(N)=S)/c1ccc(OC)cc1	712
+C(=N\NC(N)=S)(/C)c1ccccc1	713
+N(C(C)=O)c1ccc(/C=N/NC(NCC(C)C)=S)cc1	714
+N(/NC(N)=S)=C/C=C/C	716
+N(/NC(N)=S)=C1/CCCCC1	717
+S(CC)(=O)(=O)c1ccc(/C=N/NC(N)=S)cc1	718
+C(/CCCCCC)=N/NC(N)=S	719
+C(=N\NC(N)=S)(/C)c1ccc(O)cc1	720
+N(/NC(N)=S)=C1/c2c(cccc2)NC1=O	721
+C(=N\NC(N)=S)(/C)c1ccc(OC)cc1	722
+C(=N/NC(N)=S)/c1c2c(ccc1)cccc2	723
+C(=N/NC(N)=S)/c1cc([N+](=O)[O-])ccc1O	724
+N(=O)(=O)c1sc(/C=N/NC(N)=S)cc1	725
+C(=N/NC(N)=S)/[C@@H]1[C@@H]2C(C)(C)[C@@H](C2)CC1	726
+C(=N/NC(N)=S)/c1cc2c(OCO2)cc1	727
+C(=N/NC(N)=S)/c1ccc(OCCC)cc1	728
+C(=N/NC(N)=S)/c1ccccn1	729
+C(=N/NC(N)=S)/c1cccnc1	730
+C(=N/NC(N)=S)/c1ccncc1	731
+C(=N/NC(N)=S)/c1c2c(ncc1)cccc2	732
+C(=N/NC(N)=S)/c1c(O)cccc1	733
+C(=N/NC(N)=S)/c1cccs1	734
+C(=N/NC(N)=S)/c1cc(OC)c(O)cc1	735
+C(=N/c1ccccc1)/c1ccccc1	736
+N(C)(C)C=1S[Zn]2(SC(N(C)C)=[S+]2)[S+]1	737
+C(CC(C)(C)C)(C)(C)c1ccc(OCCOCCSC(=[NH2])N)cc1	738
+Nc1c2c(ncc(n2)CNc2ccc(C(N[C@@H](CCC(=O)O)C(=O)O)=O)cc2)nc(n1)N	739
+Nc1c2c(ncc(n2)CN(C)c2ccc(C(N[C@@H](CCC(=O)O)C(=O)O)=O)cc2)nc(n1)N	740
+C[C@@]12[C@@H]([C@@H]3[C@@H]([C@@]4(C)C(=CC(=O)CC4)CC3)[C@@H](C2)O)CC[C@@]1(C(COC(C)=O)=O)O	741
+O(C[C@@H](C(=O)O)N)C(C=[N+]=[N-])=O	742
+Nc1c2c(nc(n1)N)[nH]cn2	743
+Clc1c2c(ncn1)[nH]cn2	744
+P(=O)(N1CC1)(N1CC1)N1CCOCC1	745
+O(C(N)=O)CC	746
+C(NC)(C)=O	747
+C(N)=O	748
+Oc1c2c(nc(n1)N)[nH]nn2	749
+O(S(C)(=O)=O)CCCCOS(C)(=O)=O	750
+C([C@@H](C(=O)O)N)CSCC	751
+Sc1c2c(nc(n1)N)[nH]cn2	752
+c12c([nH]cn1)ncnc2	753
+C([C@@H](C(=O)O)N)c1cccs1	754
+Sc1c2c(ncn1)[nH]cn2	755
+Oc1c2c(nc(n1)O)[nH]nn2	756
+O(C)c1c2c3c([C@H](NC(C)=O)CCc2cc(c1OC)OC)cc(=O)c(cc3)OC	757
+O[C@@H]([C@@H]([C@@H](CO)O)O)[C@@H](C=O)N	758
+c12c([nH]cn1)cccc2	759
+Oc1c2c(nc(n1)N)[nH]nc2	760
+C(C)(=O)c1cccnc1	761
+N(CCCl)(CCCl)C	762
+S(C)(C)=O	763
+N([C@@H](C(Cl)Cl)O)C(C)=O	764
+C(N[C@@H](C(Cl)Cl)O)(=O)c1ccccc1	765
+C(C(N[C@@H](C(Cl)Cl)O)=O)c1ccccc1	766
+C(/C(=N/O)Cl)(=O)c1ccc(C)cc1	767
+N(C(C)=O)c1ccc(C(CCl)=O)cc1	768
+C(/C(=N/O)Cl)(=O)c1ccc(c2ccccc2)cc1	769
+O=C1c2c(cccc2)C(N1O)=O	770
+N(C(SCCC(N)=O)=S)(CC)CC	771
+C(SCCC(N)=O)(=S)N1CCOCC1	772
+C(CCCCCCCCCCCCCC)c1ccc(O)cc1	773
+C(CCCCCCCCCCCCCC)c1cc(O)c(O)cc1	774
+C(CCCCCCCCCCCCCC)c1c(O)cc(O)cc1	775
+C(CCCCCCCCCCCCCC)c1cc(O)cc(c1)O	776
+B(OC)(OC)OC	777
+B(OCCC)(OCCC)OCCC	778
+B(OCCCC)(OCCCC)OCCCC	779
+B(OCCCCC)(OCCCCC)OCCCCC	780
+B(OCCCCCC)(OCCCCCC)OCCCCCC	781
+B(O[C@@H](CC(C)C)C)(O[C@@H](CC(C)C)C)O[C@@H](CC(C)C)C	782
+B(OCCCCCCCC)(OCCCCCCCC)OCCCCCCCC	783
+B(OC(CC(C)C)CC(C)C)(OC(CC(C)C)CC(C)C)OC(CC(C)C)CC(C)C	784
+B(OCCCCCCCCCCCC)(OCCCCCCCCCCCC)OCCCCCCCCCCCC	785
+B(OCCCCCCCCCCCCCCCCCC)(OCCCCCCCCCCCCCCCCCC)OCCCCCCCCCCCCCCCCCC	786
+O(C(C[C@@H](OB1OC(C)(C)C[C@@H](O1)C)C)(C)C)B1OC(C)(C)C[C@@H](O1)C	788
+C(Oc1ccccc1)(=O)c1ccc(C)cc1	789
+C[C@@]12[C@@H]3[C@@H]([C@@H]4[C@@](C)([C@@H]([C@@H](CCCC(C)C)C)CC4)CC3)C[C@@H]([C@@]1(Br)C[C@@H](Cl)CC2)Br	790
+C(CCCC)(C(=O)O)C(=O)O	791
+N(C(N)=S)c1c(Br)cc(Br)cc1Br	792
+C(CC(=O)c1ccccc1)(CC(=O)c1ccccc1)c1ccccn1	793
+C(CC(=O)c1ccccc1)(CC(=O)c1ccccc1)c1ccncc1	794
+C(=C/c1ccc(CC)cn1)/c1ccc([N+](=O)[O-])cc1	795
+C(C[C@@H](O)c1ccncc1)(=O)c1ccccc1	796
+C(/C=C/c1ccccn1)(=O)c1ccc(Cl)cc1	797
+C(/C=C/c1ccccc1)(=O)c1ccccn1	798
+C(/C=C/c1ccccn1)(=O)c1ccccc1	799
+C(/C=C/c1ccccc1)(C#Cc1ccccc1)(C#Cc1ccccc1)O	800
+C(=O)(c1ccc(C)cc1)c1ccc(O)cc1	801
+Brc1c2c(cc3c1cccc3)cccc2	803
+N(=O)(=O)c1c2c(cc(c1O)C(OC)=O)cccc2	804
+C(=O)(O)c1oc(C(=O)O)cc(c1O)=O	805
+B(Oc1ccccc1)(Oc1ccccc1)Oc1ccccc1	806
+B(Oc1c(C)cccc1)(Oc1c(C)cccc1)Oc1c(C)cccc1	807
+B(Oc1c(Cl)cccc1)(Oc1c(Cl)cccc1)Oc1c(Cl)cccc1	808
+C(CCCCCCCCCCCCCCCCCC)(CO)CO	809
+CN1[C@@H](CCC1)[C@@H]1CCCNC1	811
+C([C@@H](CCc1ccccc1)C(C)=O)(OCC)=O	812
+C(CC(C)=O)c1ccccc1	813
+C(CCCCCC)CCCCCS	814
+O(CCCN)C(C)C	815
+C(C(OC=O)(C)C)(OCC)OCC	816
+CC1CSSC1	817
+C(=O)(C1CCCCC1)c1ccccc1	818
+C(OCCC(C)C)(OCCC(C)C)OCCC(C)C	819
+C(C(C(=O)O)(F)F)(C(F)(F)F)(F)F	820
+OC1[C@@H](C)CCC[C@@H]1C	821
+C(C)c1ccncc1	822
+S(SCCCCCCCCCCCCCCCC)CCCCCCCCCCCCCCCC	823
+C(=O)(c1c(C)cc(C)cc1)c1ccccc1	825
+C(C)(C)(C)c1ccc(C(C)=O)cc1	826
+C(C(OCC)=O)(C(OCC)=O)CCCCCCC	827
+C(C)C1(C)OCCO1	829
+C(=C/C(=O)O)/c1ccncc1	830
+C(C(OCC)=O)(C(OCC)=O)CCCCC(C(OCC)=O)C(OCC)=O	831
+C([C@@H](CC(OCC)=O)c1ccccc1)(C(OCC)=O)C(OCC)=O	832
+C(C)(=O)c1c(C)cc(C)c(c1)C	833
+C(#CCO)CO	834
+C(=C1/c2c(cccc2)C=C1)/c1ccccc1	835
+C(C(=O)O)(C(=O)O)(C)C	836
+O([C@@H](C(=O)O)c1ccccc1)C(C)C	837
+c12n(nnn1)cccc2	838
+c12n(nnc1)cccc2	839
+N(=O)(=O)c1c2n(cc(c1)C)nnn2	840
+C(CCCC)(CCCC)C(=O)O	843
+C(C)(=C)[C@@H]1CCC(C)=CC1	844
+C[C@H]1CC(C)=CC(C1)=O	845
+CC=1C[C@@H](CC(C1)=O)c1ccccc1	846
+N(CCCN)C(C)C	847
+C(C(C)(C)C)(C(C)(C)C)=O	848
+O(CC=C)c1c(C)ccc(c1)C	849
+C(CCCCC)CCCCS	850
+C(CCCCCCS)CCCCCC	851
+C(CC)(=O)c1ccc(C)cc1	852
+CC1(C)Oc2ccc(cc2C1)Br	853
+C(CS)(CS)C	854
+C(SC(=[NH2])N)CCCCSC(=[NH2])N	855
+C(CCC)(=O)c1c(OC)ccc(c1)C	856
+C(CCCC)(=O)c1cc(C)c(OC)cc1	857
+N(=O)(=O)c1ccc(CC)cc1	858
+S(OCCCCl)(=O)(=O)c1ccc(C)cc1	859
+C(CC)c1c(C)c(C)ccc1O	860
+C(CBr)(=O)c1c(C)cc(C)cc1C	861
+C(SCCCCCCCCCCCC)(SCCCCCCCCCCCC)SCCCCCCCCCCCC	862
+N(=O)(=O)c1ccc(/C=N/N=C/c2ccc([N+](=O)[O-])cc2)cc1	863
+C(=N/N=C/c1c(O)cccc1)/c1c(O)cccc1	864
+C(=N/N=C/c1ccc(Cl)cc1)/c1ccc(Cl)cc1	865
+C(=N\N=C(/C)c1cc([N+](=O)[O-])ccc1)(/C)c1cc([N+](=O)[O-])ccc1	866
+C(=C/C=N/N=C/C=C/c1ccccc1)/c1ccccc1	867
+C(=N/CC/N=C/c1ccc(O)cc1)/c1ccc(O)cc1	868
+N(=C/c1ccc(Cl)cc1)/c1ccc([N+](=O)[O-])cc1	869
+[Cu]123[N+](=Cc4ccccc4O3)CC[N+]1=Cc1ccccc1O2	870
+[Zn]123[N+](=Cc4ccccc4O3)CC[N+]1=Cc1ccccc1O2	872
+C(C(OCCCCCCCCCCCCCCCC)=O)C(OCCCCCCCCCCCCCCCC)=O	873
+C(=C/c1ccccc1)/c1ccc(Cl)cc1	874
+C(C[C@@H](N(C)C)C)(CCC(=O)O)(c1ccccc1)c1ccccc1	875
+C(C[C@@H](N(C)C)C)([C@@H](CC)O)(c1ccccc1)c1ccccc1	876
+C(C[C@@H]([N+](C)(C)C)C)(C(CC)=O)(c1ccccc1)c1ccccc1	877
+C(C[C@@H]([N+](C)(C)C)C)(c1ccccc1)c1ccccc1	878
+Cl(=O)(=O)(=O)O
+C(CN(C)C)C1(CCN(C)C)c2c(CCC1=O)cccc2	879
+C1[C@H]2[C@@H](CCCC2)NCC1	880
+C(=O)c1cc([N+](=O)[O-])ccc1O	881
+N(=O)(=O)c1cc(O)c(C(=O)O)cc1	882
+O(Cc1ccccc1)c1c(C(=O)O)ccc(c1)[N+](=O)[O-]	883
+C(C#N)(c1ccccc1)c1ccccc1	884
+C(=O)(c1cc(N)c(N(C)C)cc1)c1cc(N)c(N(C)C)cc1	885
+C(=O)(O)c1c(N)c(Br)cc(c1)Br	886
+C(CCCCCCCCCCCCCCCS)CCCCCCCCCCCCCCC	887
+C(CCCCCCCC)CCC(N)=O	889
+C(C#N)(C)(C)C	890
+O(C(C(C)(C)C)=O)CC(C)(C)C	891
+C(C(C)(C)C)(C(C)C)=O	892
+C(C(CC(C)(C)C)(C)C)(OCC(C)(C)C)=O	893
+C(C(OCC(C)(C)C)=O)(CC)CC	894
+C(OCC(C)(C)C)(=O)c1ccccc1	895
+C(C(C)(C)C)C(CC)=O	896
+C(C(CCCCC)(C)O)CCCC	897
+C(C(C)(C)O)CCCC	898
+C(C(CC)(C)C)(C(C)(C)C)=O	899
+C(C(C)C)(CC)(CC)O	900
+C(CCCCC)(CCCC)(CCCC)O	901
+C(CCCC)(C(C)C)(C(C)C)O	902
+C([C@@](CC)(C)O)CCCC	903
+C(C(C)(C)C)C(C)(C)O	904
+C(C(CCCC)(CCCC)O)C(C)(C)C	905
+C(C(OCCC)=O)(CC(C)(C)C)CC(C)(C)C	906
+C(CC[C@@H](C(=O)O)O)CCCCCCCCCCCCC	907
+C([C@@](CCC)(C)O)(C)(C)C	908
+C([C@@H](C(Cl)=O)C)C(C)(C)C	909
+C(CCCCCCC)CCCCCC#N	910
+C(=C\C)(/C)c1ccccc1	911
+C([C@@H](C(C)=O)C)(C)(C)C	912
+C(C(C(C)(C)C)=O)(C(C)(C)C)(C)C	913
+C(C(C)C)(C(C)=O)(C)C	914
+C(CCC)(CCC)(CCC)C#N	915
+C(CC(C)(C)C)(CCC)=O	916
+C(CCCCC)(CCCCC)(CC)O	917
+C(CCCC)(CCCC)(CC)O	918
+C(CCCC)(CCCC)(CCC)O	919
+C(CCCCCCC)(CCCCCCC)(CCCCCCC)O	920
+C(CCCCC)(CCCCC)(CCCC)O	921
+C([C@@](CCCC)(C)O)C(C)(C)C	922
+C(CCl)(C)(C)c1ccccc1	923
+C(CCCCCCCCCCCCCCC)[C@@H](C(OCC)=O)Br	924
+C(CCl)(C)(C)c1ccc(C(CCl)(C)C)cc1	925
+C([C@@H](C(=O)O)C)C(C)(C)C	926
+C(CCCCCC)(CCCCCC)(CCCCCC)O	927
+C(CC(C)(C)C)(CC(C)(C)C)C(CC)=O	928
+C(Cl)c1ccco1	929
+C(CC(C)(C)C)(CC)(CC)O	930
+C(CCCCCCCCCCC)CCC/C=C/C(=O)O	931
+C(C(C)(C)C)OC=O	932
+C(CCCCC)(C(C)(C)C)=O	933
+C([C@@](CCCCC)(C)O)C(C)(C)C	934
+C(C(C)=O)(C)(C)C	935
+C([C@@H](CC(C)(C)C)C)(OCC(C)(C)C)=O	936
+C(OCC(C)(C)C)(CC(C)C)=O	937
+C(C(=O)O)(CC)(CC)CC	938
+C([C@@H](C)O)(C)(C)C	939
+C(CC(C)C)(C(C)C)=O	940
+C([C@@](C(C)C)(C)O)C(C)(C)C	941
+N(=O)(=O)c1c2c(c(O)nnc2O)ccc1	942
+C(CCCC)(CCCC)(CCCC)O	943
+C(C(C)(C)C)C(C)=O	944
+C(C(C)(C)C)OC(C)=O	945
+O(C(CC)=O)CC(C)(C)C	946
+C(C(CCl)(C)C)(C(C)(C)C)=O	947
+C(CCCCC)(CCC)(CCC)O	948
+C(CC(C)(C)C)(OCC)=O	949
+C(CCCCCC)(C(=O)O)=O	950
+C(C(C)(C)C)(CCCC)(CCCC)O	951
+C(C(C(C(C)C)(C)C)=O)(C(C)(C)C)(C)C	952
+C(CCCCCCCCCCCCCCC)(CCCCCCCCCCCCCCC)=O	953
+C(CCC(C)C)(C(C)C)(C(C)C)O	954
+C([C@@](C(C)(C)C)(C(=O)O)C)C(C)(C)C	955
+C(CO)(C)(C)c1ccccc1	956
+C(CC(C)(C)O)(C)(C)c1ccccc1	957
+C(C(C)(C)C)C(CC(C)(C)C)=O	958
+C(OCC)(=O)c1ccccn1	959
+C(OCCCC)(=O)c1ccccn1	960
+C(OCCCCCC)(=O)c1ccccn1	961
+C(OCCCCCCCC)(=O)c1ccccn1	962
+C(OCCCCCCCCCC)(=O)c1ccccn1	963
+C(C)c1ccccn1	964
+C(C)c1ccncc1	965
+C(CC)c1ccccn1	966
+C(CC)c1ccncc1	967
+C(CC)c1nc(C)ccc1	968
+C(CCC)c1ccccn1	969
+C(CCC)c1ccncc1	970
+C(CCC)c1nc(C)ccc1	971
+C(CCCC)c1nc(C)ccc1	972
+C(CCCCC)c1nc(C)ccc1	973
+C(CCCCC)(CCCCC)c1ccccn1	974
+C([C@@](C#C)(C)O)C	975
+C(=C/CO)/CO	976
+C(C#N)(C)(C)O	977
+C([C@@](C#C)(C)O)C(C)C	978
+O(C(C)=O)[C@@H]1[C@@H](OC(C)=O)[C@@H](Sc2c(Cl)ccc(c2)Cl)O[C@@H]([C@@H]1OC(C)=O)COC(C)=O	979
+S(C#N)c1c2c(c(N)c(c1)SC#N)cccc2	980
+N(CC)(CC)c1ccc(SSc2ccc(N(CC)CC)cc2)cc1	981
+S(Sc1c(Cl)ccc(c1)Cl)c1c(Cl)ccc(c1)Cl	982
+O(C(C)=O)[C@@H]1[C@@H](Sc2c3c(ccc2)cccc3)O[C@@H](COC(C)=O)[C@@H]([C@@H]1OC(C)=O)OC(C)=O	983
+O(C(C)=O)[C@@H]1[C@@H](OC(C)=O)[C@@H](Sc2c(NC(C)=O)cc(Cl)cc2)O[C@@H]([C@@H]1OC(C)=O)COC(C)=O	984
+S(Sc1c(N)cc(Cl)cc1)c1c(N)cc(Cl)cc1	985
+C(C)(=O)c1ccc(SSc2ccc(C(C)=O)cc2)cc1	986
+N(CCC)(CCC)c1ccc(SC#N)cc1	987
+N(CC)(CC)c1ccc(SC#N)cc1	988
+N(C)(C)c1ccc(SSc2ccc(N(C)C)cc2)cc1	989
+S(Sc1ccc(Br)cc1)c1ccc(Br)cc1	992
+N(Cc1ccccc1)(CC)c1ccc(SC#N)cc1	993
+S(Sc1ccc(C)cc1)c1ccc(C)cc1	994
+S(Sc1ccc(OC)cc1)c1ccc(OC)cc1	995
+N([C@@H]1O[C@@H](CO)[C@@H](O)[C@@H]([C@@H]1O)O)c1ccc(OCC)cc1	996
+S([C@@H]1[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O1)CO)c1c(Cl)ccc(c1)Cl	997
+N(=O)(=O)c1c(N/N=C(/CC(C)C)CC(C)C)ccc(c1)[N+](=O)[O-]	998
+N(=O)(=O)c1c(N/N=C/c2ccccc2)cccc1	999
+N(C(NC(C)=O)C)C(C)=O	1000
+C(NC(C)=O)NC(C)=O	1002
+N(Cc1ccccc1)(CC(=O)O)CC(=O)O	1003
+N(CC(=O)O)(CC(=O)O)C(C)C	1004
+C(/N=C/c1ccccc1)(/N=C/c1ccccc1)c1ccccc1	1005
+C(C(C)(C)C)[C@@]1(C)NC(=O)NC1=O	1006
+C(C(OCC)=O)(C(OCC)=O)C(C)C	1007
+N([C@@H](c1c(O)c2c(cccn2)cc1)c1ccccc1)c1ccccc1	1008
+N([C@@H](c1oc(CO)cc(c1O)=O)c1ccccc1)c1ccccc1	1009
+N([C@@H](c1c(O)c2c(cccn2)cc1)c1ccccc1)c1ccc([N+](=O)[O-])cc1	1010
+N([C@@H](c1c(O)c2c(cccn2)cc1)c1ccccc1)c1ccc(C(=O)O)cc1	1011
+N([C@@H](c1c(O)c2c(cccn2)cc1)c1ccccc1)c1c(C(=O)O)cccc1	1012
+N([C@@H](c1c(O)c2c(cccn2)cc1)c1ccccc1)c1cc(C)ccn1	1014
+N([C@@H](c1c(O)c2c(cccn2)cc1)c1ccccc1)c1c(C(OCC)=O)cccc1	1015
+N([C@@H](c1oc(CO)cc(c1O)=O)c1ccccc1)c1cc(Cl)ccc1	1017
+N(/N=C(/CCCCCC)C)c1c([N+](=O)[O-])cc([N+](=O)[O-])cc1	1018
+C([C@@](CC)(C)N)(=O)O	1019
+C(C)[C@@]1(C)C(=O)NC(N1)=O	1020
+C(CCCCC)[C@@]1(C)NC(=O)NC1=O	1021
+N(=O)(=O)c1cc(C)c(O)cc1	1022
+C(CC)[C@]1(NC(=O)NC1=O)c1ccccc1	1023
+O=C1C2(NC(N1)=O)CCCC2	1024
+C([C@@](CC)(C)O)#C[C@@](CC)(C)O	1025
+C(=O)(O)C1(N)CCCC1	1026
+C(C(Br)(C)C)(C(Br)Br)=O	1027
+C(/C=C/c1ccccc1)(NC(OCC)=O)NC(OCC)=O	1028
+C(C(C)C)CO	1029
+C(O)[C@H]1[C@@H](O)[C@@H](O)C(O1)=O	1031
+N(C(N[C@@H](C#N)C)=O)[C@@H](C(N)=O)C	1032
+N(C(NC(C#N)(C)C)=O)C(C(N)=O)(C)C	1033
+C(NC(OCC)=O)(NC(OCC)=O)CC	1034
+C(NC(OCC)=O)(NC(OCC)=O)C	1035
+C([C@@H](CC)Cl)(NC(OCC)=O)NC(OCC)=O	1036
+C(NC(OCC)=O)(NC(OCC)=O)CCl	1037
+C(NC(OCC)=O)(NC(OCC)=O)C(Cl)Cl	1038
+Oc1c(c2c(nc3ccccc3n2)c2c(O)cc(O)cc2)ccc(c1)O	1039
+N(CCN(C)C)(CC(=O)O)CC(=O)O	1040
+N(CCN(CC)CC)(CC(=O)O)CC(=O)O	1041
+N(CC(=O)O)(CC(=O)O)CC	1042
+c1ccncc1	42
+O(C(C)=O)c1c(S(=O)(=O)O)ccc(c1)NC(C)=O	1043
+N(CCC([N+](=O)[O-])(C)C)(CC(=O)O)CC(=O)O	1044
+C(CCN)([N+](=O)[O-])(C)C	1045
+c1(NC(C2CC2)=O)nc2c3c(cccc3)CCc2cn1		42
+c12-c3c(cc(N)cc3)Cc1cccc2 		42
+c12c3c(ccc2)c(ccc4)c5c4cccc5c3ccc1		42
+c12c3c4c5c1c1c6c7c5c5c8c4c4c9c3c3c%10c9c9c%11c4c8c4c8c5c7c5c7c6c6c%12c%13c7c7c5c8c5c4c%11c4c9c8c%10c9c%10c8c8c4c5c7c8c%13c%10c%12c4c9c3c2c4c16		42
+[H+]	42
+[H][H]	42
+[HH]	42
+O	42
+[OH-]	42
+[O-]	42
+[O+]	42
+[OH3+]	42
+CC(C)C(=O)O	42
+n1ccccc1	42
+[nH]1cccc1	42
+[H]n1cccc1	42
+CC(C)(N)Cc1ccccc1	42
+C(OP([O-])(=O)[O-])C1(OC(O)CC1(O))	42
+Cn1cnc2n(C)c(=O)n(C)c(=O)c12	42
+Cn1cnc2c1c(=O)n(C)c(=O)n2C	42
+CCN(CC)C(=O)	42
+CCN(C=O)CC	42
+COc1cccc(C#N)c1	42
+COc(c1)cccc1C#N	42
+COc1cccc(CN)c1	42
+COc(cc1)ccc1C#N	42
+COc1ccc(CN)cc1	42
+CC(C)C(=O)O	42
+N1CCCCC1	42
+C1NCCCC1	42
+C1CNCCC1	42
+C1CCNCC1	42
+C1CCCNC1	42
+C1CCCCN1	42
+[NH]1CCCC1	42
+c1ccccc1-c2ccccc2	42
+c1ccc(cc1)-c2ccccc2	42
+C1=NC=N1	42
diff --git a/test/py/smiles/notes.txt b/test/py/smiles/notes.txt
new file mode 100644
index 0000000..14010ca
--- /dev/null
+++ b/test/py/smiles/notes.txt
@@ -0,0 +1 @@
+The test data as well as scripts here is based on tests in GGL and in Open Babel.
diff --git a/test/py/smiles/problematic.py b/test/py/smiles/problematic.py
new file mode 100644
index 0000000..d5f5154
--- /dev/null
+++ b/test/py/smiles/problematic.py
@@ -0,0 +1,22 @@
+smiles("C(C1C(C=O)=C(C)C=1(CO))")
+smiles("CC1=CC(C)=C1(O)")
+smiles(R"CN(C)C1=NC(=C2C=CC=C12)N(C)C")
+smiles(R"CC12=C3(C)[Ru+]456789%101(C1=C5C8(=C6C4=C71N)N)C2(C)C%10(=C39C)C")
+smiles(R"CC12=C3(C)[Ru+]456789%101(C1=C7(N)C4=C6C8(=C51)N)C2(C)C%10(=C39C)C")
+smiles(R"CC1=C(CC2=C(C)N=S(=O)(O)N=C2C)C(=NS(=O)(=N1)O)C")
+smiles(R"CCCCCCCCCCCCCCCCCCOc1ccc2C3=NC4=NC(=NC5=NC(=NC6=NC(=NC(=N3)c2c1)c1cc(OCCCCCCCCCCCCCCCCCC)ccc61)c1ccc(OCCCCCCCCCCCCCCCCCC)cc51)c1cc(OCCCCCCCCCCCCCCCCCC)ccc41")
+smiles(R"c1ccc(cc1)C1=C2C=CC3=C(c4ccccc4)C4=[N+]5C(=C(c6ccccc6)C6=CC=C7C(=C8C=CC1=[N+]8[Zn@@+2]5([NH+]67)[NH+]23)c1cc[n+](cc1)[Pt+2]([n+]1ccc(cc1)C1=C2C=CC3=[N+]2[Zn@@+2]25[NH+]6C1=CC=C6C(=C1C=CC(=[N+]51)C(=C1C=CC(=C3c3ccccc3)[NH+]21)c1ccccc1)c1ccccc1)([n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)[n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)C=C4")
+smiles(R"c1ccc(cc1)C1=C2C=CC3=C(c4ccccc4)C4=[N+]5C(=C(c6ccccc6)C6=CC=C7C(=C8C=CC1=[N+]8[Zn@@+2]5([NH+]67)[NH+]23)c1cc[n+](cc1)[Pt@@+2]([n+]1ccc(cc1)C1=C2C=CC3=[N+]2[Zn@@+2]25[NH+]6C1=CC=C6C(=C1C=CC(=[N+]51)C(=C1C=CC(=C3c3ccccc3)[NH+]21)c1ccccc1)c1ccccc1)([n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)[n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)C=C4")
+smiles(R"NC1=C(/N=N/c2ccc(cc2)[N+](=O)[O-])C(=N[S@](=O)(=N1)O)N")
+smiles(R"NC1=N[S@](=O)(=NC(=C1/N=N/c1ccc(cc1)[N+](=O)[O-])N)O")
+smiles(R"[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C1C3(=C5(N)C4(=C26)C)C")
+smiles(R"C1C23=C4(C5=C6C7=C2[Ru+2]34567)C23=C4C5=C6C7=C13[Ru+2]24567")
+smiles(R"C1C23=C4C5=C6C7=C3([Ru+2]24567)C23=C41C1=C5C6=C2[Ru+2]34156")
+smiles(R"c1ccc2C3=NC4=NC(=NC5=NC(=NC6=NC(=NC(=N3)c2c1)c1ccccc61)c1ccccc51)c1ccccc41")
+graphLike = GraphPrinter()
+molLike = GraphPrinter()
+graphLike.withIndex = True
+graphLike.collapseHydrogens = True
+molLike.setMolDefault()
+molLike.withIndex = True
+#for a in inputGraphs: a.print(graphLike, molLike)
diff --git a/test/py/smiles/rhea.py b/test/py/smiles/rhea.py
new file mode 100644
index 0000000..92dfdb5
--- /dev/null
+++ b/test/py/smiles/rhea.py
@@ -0,0 +1,4305 @@
+
+smiles(R"[Ag+]")
+smiles(R"[As](=O)([O-])(C)C")
+smiles(R"[Br-]")
+smiles(R"C")
+smiles(R"[C@@]123[C@]4(C2)[C@@H](CC[C@H]1[C@]1([C@](CC3)([C@H](CC1)[C@@H](CCC(=C)C(C)C)C)C)C)[C@@H]([C@H](CC4)O)C")
+smiles(R"[C@@]123[C@]4(C2)[C@H](C([C@H](CC4)O)(C)C)CC[C@H]1[C@]1([C@](CC3)([C@H](CC1)C(CCC=C(C)C)C)C)C")
+smiles(R"[C@@]123c4c5O[C@H]2[C@H](C=C[C@H]1[C@@H](Cc4ccc5OC)[NH+](CC3)C)O")
+smiles(R"[C@]123[C@]4([C@@H]([C@]56[C@@H](CC4=O)C(O[C@H]5CC(=O)OC6)(C)C)CC[C@]2([C@@H](OC(=O)[C@H]1O3)c1ccoc1)C)C")
+smiles(R"[C@]123C(=C(C[C@]4([C@@H]1[NH+](CC3)CC=C4)CC)C(=O)OC)Nc1c2ccc(c1)O")
+smiles(R"[C@]123C(=C(C[C@]4([C@@H]1[NH+](CC3)CC=C4)CC)C(=O)OC)Nc1c2ccc(c1)OC")
+smiles(R"[C@]123[C@](CCCC1(C)C)(CC=C([C@H]2C3)C)C")
+smiles(R"[C@]123[C@]([C@@H](/C(=C/C4=N/C(=C\c5[nH]c(Cc6[nH]c([C@]1(C)O)c(c6CCC(=O)[O-])CC(=O)[O-])c(c5CC(=O)[O-])CCC(=O)[O-])/[C@H]([C@@]4(CC(=O)[O-])C)CCC(=O)[O-])/N2)CCC(=O)[O-])(CC(=O)O3)C")
+smiles(R"[C@]123[C@@H]4C(=O)C=C[C@H]1[C@@H](Cc1c2c(O4)c(cc1)O)[NH+](CC3)C")
+smiles(R"[C@@]123[C@H]([C@]4([C@H](CC2)[C@](CCC4)(C)C=O)C)CC[C@@H](C1)C(=C)C3")
+smiles(R"[C@@]123[C@H]([C@]4([C@H](CC2)[C@](CCC4)(C)CO)C)CC[C@@H](C1)C(=C)C3")
+smiles(R"[C@]123[C@@H](C(C(=C)[C@@H](C1)CC3)(C)C)CC[C@H]2C")
+smiles(R"[C@@]123[C@H](C([C@@H](CC1)O3)(C)C)CC[C@H]1[C@]2(CC[C@@]2([C@@]1(CC[C@](C2)(CCC=C(C)C)C)C)C)C")
+smiles(R"[C@]123[C@@H](Nc4c2ccc(c4)OC)[C@](C[C@]2([C@@H]1[NH+](CC3)CC=C2)CC)(C(=O)OC)O")
+smiles(R"[C@@]123[C@@H](N(c4c2ccc(c4)OC)C)[C@](C[C@]2([C@@H]1[NH+](CC3)CC=C2)CC)(C(=O)OC)O")
+smiles(R"[C@@]123[C@@H](N(c4c2ccc(c4)OC)C)[C@]([C@@H]([C@]2([C@@H]1[NH+](CC3)CC=C2)CC)OC(=O)C)(C(=O)OC)O")
+smiles(R"[C@@]123[C@@H](N(c4c2ccc(c4)OC)C)[C@]([C@@H]([C@]2([C@@H]1[NH+](CC3)CC=C2)CC)O)(C(=O)OC)O")
+smiles(R"[C@@]123[C@@H](N(c4c2ccc(c4)O)C)[C@]([C@@H]([C@]2([C@@H]1[NH+](CC3)CC=C2)CC)O)(C(=O)OC)O")
+smiles(R"c12c3c4c5c6c1[C@]1(O[C@H]7c2c(c(c3C(=O)C[C@@]4(O[C@H]2c5c(c(c6C(=O)C1)O)[C@H](O[C@@H]2C)C)O)O)[C@H](O[C@@H]7C)C)O")
+smiles(R"c12c3c4c(c(c2[O-])C)O[C@](O/C=C/[C@@H]([C@H](C)[C@@H](OC(=O)C)[C@@H](C)[C@H](O)[C@H](C)[C@@H](O)[C@H](/C=C/C=C(\C(=O)Nc(c(/C=N/N2CC[NH+](CC2)C)c3O)c1O)/C)C)OC)(C4=O)C")
+smiles(R"c12=C3C4=NC(=Cc5n6c(c(c5C)C=C)C=C5N=C(C=c(n1[Mg]6)c(c2C(=O)[C-]3C(=O)OC)C)C(=C5C)C=C)C(=C4CCC(=O)[O-])C")
+smiles(R"c12c3c4O[C@@](C3=O)(O/C=C/[C@@H]([C@@H]([C@H]([C@H]([C@@H]([C@@H]([C@H]([C@H](/C=C/C=C(\C(=O)Nc(c(c1c(c4C)[O-])O)cc2OCC(=O)[O-])/C)C)O)C)O)C)OC(=O)C)C)OC)C")
+smiles(R"c12c3c(c4c(c1c1c([nH]2)c(Cl)ccc1)c(=O)[nH]c4=O)c1c(n3[C@H]2[C@@H]([C@H]([C@@H]([C@H](O2)CO)OC)O)O)c(Cl)ccc1")
+smiles(R"c12c3c(c4c(c1c1c([nH]2)c(Cl)ccc1)c(=O)[nH]c4=O)c1c(n3[C@H]2[C@@H]([C@H]([C@@H]([C@H](O2)CO)O)O)O)c(Cl)ccc1")
+smiles(R"c12c3c(c4c(c1c1c([nH]2)c(Cl)ccc1)c(=O)[nH]c4=O)c1c([nH]3)c(Cl)ccc1")
+smiles(R"[C@@]12(C3=C([C@@]4(C(CC3)[C@@H]([C@H](CC4)O)C)C)CC[C@@]1([C@H](CC2)[C@@H](CCC(=C)C(C)C)C)C)C")
+smiles(R"c12c3c(c4c(c(=O)o3)C(=O)CC4)c(cc2O[C@@H]2[C@H]1C=CO2)OC")
+smiles(R"c12c3c(c4c(c(=O)o3)C(=O)CC4)c(cc2O[C@@H]2[C@H]1CCO2)OC")
+smiles(R"c12C3(C=C4C(=O)c2c(c(c2c1C(=O)[C@](O2)(O/C=C/[C@@H]([C@@H]([C@H]([C@H]([C@@H]([C@@H]([C@H]([C@H](/C=C/C=C(\C(=O)N4)/C)C)O)C)O)C)OC(=O)C)C)OC)C)C)O)OC(=O)CO3")
+smiles(R"[C@]12(C3(CC([C@@]1(CCC2)C)C(=CC3)C)C)C")
+smiles(R"c12c3c(Cc1cc(cc2)N(C(=O)C)O)cccc3")
+smiles(R"c12c3c(C(c1cccc2)O)cccc3")
+smiles(R"c12c3c(ccc1cccc2)ccc(c3O)O")
+smiles(R"c12c3c(ccc1C[C@@H]1[C@H]4[C@@]2([C@@H](O3)[C@H](C=C4)O)CC[NH+]1C)O")
+smiles(R"c12c3c(ccc1CC(=O)c1c(CCN(C2)C)cc2c(c1)OCO2)OCO3")
+smiles(R"c12c3c(ccc1CC(=O)c1c(CC(N(C2)C)O)cc2c(c1)OCO2)OCO3")
+smiles(R"c12c3cccc1[C@@H]1[C@@H](Cc2c([nH]3)C(C=C)(C)C)[NH+](C[C@@H]([C@@H]1OC(=O)C)C)C")
+smiles(R"c12c3cccc1[C@@H]1[C@@H](Cc2c[nH]3)[NH+](C[C@@H]([C@@H]1O)C)C")
+smiles(R"c12c3cccc1[C@@H]1[C@@H](Cc2c[nH]3)[NH+](C[C@@H]([C@@H]1OC(=O)C)C)C")
+smiles(R"c12c3c(c(cc1O[C@@H]1[C@H]2C=CO1)OC)c(=O)c1c(o3)cccc1OC")
+smiles(R"c12c3c(ccc(c3)C[C@H]3C(=O)N[C@@H](Cc(c2)ccc1O)C(=O)N3)O")
+smiles(R"c12c3c(cc(c(c3)O)OC)CC[n+]1cc1c(c2)ccc(c1OC)OC")
+smiles(R"C12(C3=C([C@](C(=N3)Cc3c(c(c([nH]3)CC3=C([C@@](C(=N3)/C=C(\N2)/[C@H]([C@@]1(CC(=O)[O-])C)CCC(=O)[O-])(CC(=O)[O-])C)CCC(=O)[O-])CC(=O)[O-])CCC(=O)[O-])(CCC(=O)[O-])C)CC(=O)[O-])C(=O)C")
+smiles(R"[C@@]12(C3=C([C@](C(=N3)CC3=N[C@](C(=C3CCC(=O)[O-])CC(=O)[O-])(CC3=C([C@@](C(=N3)/C=C(\N2)/[C@H]([C@@]1(CC(=O)[O-])C)CCC(=O)[O-])(CC(=O)[O-])C)CCC(=O)[O-])C)(CCC(=O)[O-])C)CC(=O)[O-])C")
+smiles(R"C12(C3=C([C@](C(=N3)CC3=N[C@](C(=C3CCC(=O)[O-])CC(=O)[O-])(CC3=C([C@@](C(=N3)/C=C(\N2)/[C@H]([C@@]1(CC(=O)[O-])C)CCC(=O)[O-])(CC(=O)[O-])C)CCC(=O)[O-])C)(CCC(=O)[O-])C)CC(=O)[O-])C(=O)C")
+smiles(R"c12c3c([C@@H]4[C@H]([NH+](CC(=C4)C)C)C1)cccc3[nH]c2")
+smiles(R"c12c3c(C(=O)c1cccc2)cccc3")
+smiles(R"[C@@]12([C@]3([C@@H]([C@]45[C@@H](CC3=O)C(O[C@H]4CC(=O)OC5)(C)C)CC[C@@]1(C)[C@H](c1ccoc1)O[C@@H]1O[C@H](CO)[C@H]([C@H](O)[C@H]1O)O)C)[C@H](O2)C(=O)[O-]")
+smiles(R"[C@@]12([C@]3([C@@H]([C@@]4([C@@H](CC3=O)C(O[C@H]4CC(=O)[O-])(C)C)CO)CC[C@]1([C@H](c1ccoc1)O)C)C)[C@H](O2)C(=O)[O-]")
+smiles(R"[C@@]12([C@]3([C@@H]([C@@]4([C@H](C([C@H](CC4)O)(C)C)CC3)C)CC[C@@H]1[C@H]1[C@H](C(=C)C)CC[C@@]1(CC2)C)C)C")
+smiles(R"[C@@]12([C@]3([C@@H]([C@@]4([C@H](C([C@H](CC4)O)(C)C)CC3)C)CC[C@@H]1[C@H]1[C@H](C(O)(C)C)CC[C@@]1(CC2)C)C)C")
+smiles(R"[C@@]12([C@]3([C@H](CC[C@@H]1[C@@]1([C@@H](CC2)C(CCC1)(C)C)C)[C@H](CC3)C(=C)CCC=C(C)C)C)C")
+smiles(R"[C@@]12([C@@]3([C@H]([C@H](CC1)C)C[C@H](C2(C)C)CC3)C)O")
+smiles(R"C12(C3(Cl)C4(C5(Cl)C3(Cl)C(Cl)(Cl)C2(Cl)C5(Cl)C1(Cl)C4=O)Cl)Cl")
+smiles(R"C12(C3(Cl)C4(C5(Cl)C3(Cl)C(Cl)(Cl)C2(Cl)C5(Cl)C1(Cl)C4O)Cl)Cl")
+smiles(R"c12c3c(nc(cc3O)C(=O)[O-])c(=O)cc1oc1c(n2)c(C(=O)CC(C(=O)[O-])[NH3+])ccc1")
+smiles(R"c12c3c(O[C@@H]4[C@H]3CCO4)cc(c1c(=O)c1c(o2)cccc1OC)OC")
+smiles(R"c12c3c(O[C@@H]4[C@H]3C=CO4)cc(c1c(=O)c1c(o2)cccc1O)OC")
+smiles(R"c12c3c(O[C@@H]4[C@H]3CCO4)cc(c1c(=O)c1c(o2)cccc1O)OC")
+smiles(R"c12c3c(sc1C=C[C@@H]([C@@H]2O)O)cccc3")
+smiles(R"C12C(C1(C)C)/C=C(/CC/C=C(/CC/C=C(/CC2)\C)\C)\C")
+smiles(R"C12CC2(CCC1(C)O)C(C)C")
+smiles(R"c12c(c3c4c5c1c1c(cccc1)n5[C@]1(O[C@@H](n4c4c3cccc4)C[C@@H]([NH2+]C)[C@H]1OC)C)C(=O)NC2")
+smiles(R"c12c(c3c4c5c1c1c(cccc1)n5[C@]1(O[C@@H](n4c4c3cccc4)C[C@@H]([NH2+]C)[C@H]1O)C)C(=O)NC2")
+smiles(R"C12(C(C3CC2C1C3)(C)C)C")
+smiles(R"c12c(c3c(c(c1ccc(=O)o2)O)cco3)OC")
+smiles(R"c12cc3c(cc1C[C@H](O2)C(C)(C)O)ccc(=O)o3")
+smiles(R"[C@]12(C(=C3[C@@](CC2)(CCC(C3)(C)C)C)CC[C@H]2[C@]1(CC[C@@H]1[C@@]2(CC[C@@H](C1(C)C)O)C)C)C")
+smiles(R"c12c([C@]3(C(=CC(=C(C3=O)C(=O)C)[O-])O1)C)c(c(c(c2C(=O)C)O)C)[O-]")
+smiles(R"C12C(c3c(O2)cc(cc3)OC)COc2c1ccc(c2)O")
+smiles(R"c12C=C3[N+]4=C(C5=c6n7c(=CC8=[N+]9C(=Cc(c(c1C)C=C)n2[Mg-2]479)C(=C8CC)C)c(C)c6C(=O)[C@@H]5C(=O)OC)[C@@H](CCC(=O)OC/C=C(/CCC[C@@H](CCC[C@@H](CCCC(C)C)C)C)\C)[C@@H]3C")
+smiles(R"C12=CC3=[N+]4C(=C([C@@]3(CC(=O)[O-])C)CCC(=O)[O-])C[C@]3(C(=C(C5=CC6=[N+]7C(=C([C@]6(CCC(=O)[O-])C)CC(=O)[O-])C6(N2[Co-2]47N35)[C@]([C@@H]1CCC(=O)[O-])(CC(=O)OC6C)C)CCC(=O)[O-])CC(=O)[O-])C")
+smiles(R"C12=CC3=[N+]4C(=C([C@@]3(CC(=O)[O-])C)CCC(=O)[O-])C[C@]3(C(=C(C5=CC6=[N+]7C(=C(N2[Co-2]47N35)[C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C)[C@@H]([C@]6(CCC(=O)[O-])C)CC(=O)[O-])CCC(=O)[O-])CC(=O)[O-])C")
+smiles(R"C12=CC3=[N+]4C(=C([C@@]3(CC(=O)[O-])C)CCC(=O)[O-])C[C@]3(C(=C(C5=[N+]3[Co-2]34N2[C@]([C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C)(C1=C([C@](C(=[N+]31)C5)(CCC(=O)[O-])C)CC(=O)[O-])C)CCC(=O)[O-])CC(=O)[O-])C")
+smiles(R"C12=CC3=[N+]4C(=C([C@@]3(CC(=O)[O-])C)CCC(=O)[O-])C[C@]3(C(=C(C5=[N+]3[Co-2]34N2[C@]([C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C)([C@H]1[C@@H]([C@](C(=[N+]31)C5C)(CCC(=O)[O-])C)CC(=O)[O-])C)CCC(=O)[O-])C)C")
+smiles(R"C12=C(C3=[N+]4C(=C([C@@]3(CC(=O)[O-])C)CCC(=O)[O-])C[C@]3(C(=C(C5=[N+]3[Co-2]34N2[C@]([C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C)([C@H]1[C@@H]([C@](C(=[N+]31)C5C)(CCC(=O)[O-])C)CC(=O)[O-])C)CCC(=O)[O-])C)C)C")
+smiles(R"C12=CC3=[N+]4C(=C([C@@]3(CC(=O)[O-])C)CCC(=O)[O-])C[C@]3(C(=C(C5=[N+]3[Co-2]34N2[C@]([C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C)([C@H]1[C@@H]([C@](C(=[N+]31)C5)(CCC(=O)[O-])C)CC(=O)[O-])C)CCC(=O)[O-])CC(=O)[O-])C")
+smiles(R"C12=CC3=[N+]4C(=Cc5c(c(c6n5[Co-2]54N2C2([C@]([C@@H]1CCC(=O)[O-])(CC(=O)OC2C)C)C1=C([C@](C(=[N+]51)C6)(CCC(=O)[O-])C)CC(=O)[O-])CCC(=O)[O-])CC(=O)[O-])[C@H]([C@@]3(CC(=O)[O-])C)CCC(=O)[O-]")
+smiles(R"c12C=C3[N+]4=C(C=c5n6c(=CC7=[N+]8C(=Cc(c(c1C)C=C)n2[Fe-2]468)C(=C7C=C)C)c(C)c5CCC(=O)[O-])C(=C3C)CCC(=O)[O-]")
+smiles(R"c12C=c3n4c(C=c5n6c(=Cc7n8c(=Cc(c(c1C)C=C)n2[Mg]468)c(C)c7C=C)c(C)c5CCC(=O)[O-])c(c3C)CCC(=O)[O-]")
+smiles(R"c12C=c3n4c(C=c5n6c(=Cc7n8c(=Cc(c(c1C)C=C)n2[Mg]468)c(C)c7C=C)c(C)c5CCC(=O)OC)c(c3C)CCC(=O)[O-]")
+smiles(R"c12C=c3n4c(C=c5n6c(=Cc7n8c(=Cc(c(c1C)C=C)n2[Mg]468)c(C)c7C=C)c(C)c5CCC(=O)OC)c(c3C)CCC(=O)O")
+smiles(R"c12C=c3n4c(C=c5n6c(=Cc7n8c(=Cc(c(c1C)C=C)n2[Mg]468)c(C)c7C=C)c(C)c5C(CC(=O)OC)O)c(c3C)CCC(=O)O")
+smiles(R"c12C=c3n4c(C=c5n6c(=Cc7n8c(=Cc(c(c1C)C=C)n2[Mg]468)c(C)c7C=C)c(C)c5C(=O)CC(=O)OC)c(c3C)CCC(=O)O")
+smiles(R"C12=C(C3=[N+]4C(=CC5=[N+]6C(=C(C7=[N+]8[C@]([C@@]([C@@H]7CCC(=O)N)(C)CC(=O)N)([C@@H]7N1[Co-3]468([n+]1c4cc(C)c(cc4n(c1)[C@H]1O[C@H](CO)[C@H]([C@H]1O)OP(=O)([O-])OC(CNC(=O)CC[C@@]2([C@H]7CC(=O)N)C)C)C)C#N)C)C)[C@@]([C@@H]5CCC(=O)N)(C)CC(=O)N)C([C@@H]3CCC(=O)N)(C)C)C")
+smiles(R"c12=CC3=[N+]4C(=Cc5n6c(C=C7[N+]8=C(C=c(n2[Fe-2]468)c(c1C)[C@H](CC/C=C(\C)/CC/C=C(/CCC=C(C)C)\C)O)C(=C7C=C)C)c(C)c5CCC(=O)[O-])C(=C3C)CCC(=O)[O-]")
+smiles(R"C12=C(C3=[N+]4C(=CC5=[N+]6C(=C(C7=[N+]8[C@]([C@@H]9N1[Co-3]468([n+]1c4cc(C)c(cc4n(c1)[C@H]1O[C@H](CO)[C@H]([C@H]1O)OP(=O)(O[C@@H](CNC(=O)CC[C@]2(C)[C@H]9CC(=O)N)C)[O-])C)[OH2+])(C)[C@]([C@@H]7CCC(=O)N)(CC(=O)N)C)C)[C@@]([C@@H]5CCC(=O)N)(C)CC(=O)N)C([C@@H]3CCC(=O)N)(C)C)C")
+smiles(R"C12=C(C3=[N+]4C(=CC5=[N+]6C(=C(C7=[N+]8[Co-2]946N1[C@@H]([C@@]8(C)[C@]([C@@H]7CCC(=O)N)(CC(=O)N)C)[C@H](CC(=O)N)[C@@]2(C)CCC(=O)NC[C@H](OP(=O)(O[C@@H]1[C@H](O[C@H](n2c[n+]9c4cc(C)c(cc24)C)[C@@H]1O)CO)[O-])C)C)[C@](C)([C@@H]5CCC(=O)N)CC(=O)N)C([C@@H]3CCC(=O)N)(C)C)C")
+smiles(R"C12=C(C3=[N+]4C(=CC5=[N+]6C(=C(C7=[N+]8[Co-3]946N1[C@@H]([C@@]8(C)[C@]([C@@H]7CCC(=O)N)(CC(=O)N)C)[C@H](CC(=O)N)[C@@]2(C)CCC(=O)NC[C@H](OP(=O)(O[C@@H]1[C@H](O[C@H](n2c[n+]9c4cc(C)c(cc24)C)[C@@H]1O)CO)[O-])C)C)[C@](C)([C@@H]5CCC(=O)N)CC(=O)N)C([C@@H]3CCC(=O)N)(C)C)C")
+smiles(R"C12=C(C3=[N+]4C(=CC5=[N+]6C(=C(C7=[N+]8[Co-4]946N1[C@@H]([C@@]8(C)[C@]([C@@H]7CCC(=O)N)(CC(=O)N)C)[C@H](CC(=O)N)[C@@]2(C)CCC(=O)NC[C@H](OP(=O)(O[C@@H]1[C@H](O[C@H](n2c[n+]9c4cc(C)c(cc24)C)[C@@H]1O)CO)[O-])C)C)[C@](C)([C@@H]5CCC(=O)N)CC(=O)N)C([C@@H]3CCC(=O)N)(C)C)C")
+smiles(R"c12=CC3=NC(=C4c5n6c(C=C7N=C(C=c(c(c1C)C=C)n2[Mg]6)C(=C7CC)C)c(c5C(=O)[C-]4C(=O)OC)C)C(=C3C)CCC(=O)[O-]")
+smiles(R"c12=CC3=NC(=C4c5n6c(C=C7N=C(C=c(c(c1C)C=C)n2[Mg]6)C(=C7C=C)C)c(c5C(=O)[C-]4C(=O)OC)C)[C@@H](CCC(=O)[O-])[C@@H]3C")
+smiles(R"c12=CC3=NC(=C4c5n6c(C=C7N=C(C=c(c(c1C)C=C)n2[Mg]6)C(=C7CC)C)c(c5C(=O)[C-]4C(=O)OC)C)[C@@H](CCC(=O)[O-])[C@@H]3C")
+smiles(R"c12=CC3=NC(=C4c5n6c(C=C7N=C(C=c(c(c1C)C=C)n2[Mg]6)C(=C7CC)C=O)c(c5C(=O)[C-]4C(=O)OC)C)[C@@H](CCC(=O)[O-])[C@@H]3C")
+smiles(R"c12=CC3=NC(=C4c5n6c(C=C7N=C(C=c(c(c1C)C=C)n2[Mg]6)C(=C7CC)CO)c(c5C(=O)[C-]4C(=O)OC)C)[C@@H](CCC(=O)[O-])[C@@H]3C")
+smiles(R"c\1/2=C/C3=N/C(=C/4\c5[nH]c(/C=C/6\N=C(/C=c(/c(c1C)C=C)\[nH]2)C(=C6CC)C)c(c5C(=O)C4)C)/[C@@H](CCC(=O)[O-])[C@@H]3C")
+smiles(R"c\1/2=C/C3=N/C(=C/4\c5[nH]c(/C=C/6\N=C(/C=c(/c(c1C)C=C)\[nH]2)C(=C6CC)C)c(c5C(=O)[C@@H]4C(=O)[O-])C)/[C@@H](CCC(=O)[O-])[C@@H]3C")
+smiles(R"c\1/2=C/C3=N/C(=C/4\c5[nH]c(/C=C/6\N=C(/C=c(/c(c1C)C=C)\[nH]2)C(=C6CC)C)c(C)c5C(=O)[C-]4C(=O)OC)/[C@@H](CCC(=O)[O-])[C@@H]3C")
+smiles(R"C\1/2=C\C3=NC(=C([C@@]3(CC(=O)[O-])C)CCC(=O)[O-])C[C@@]3([NH+]/C(=C\C4=N[C@H]([C@H](CC(=O)[O-])[C@]4(CCC(=O)[O-])C)[C@]([NH+]1)([C@@](CC(=O)[O-])([C@@H]2CCC(=O)[O-])C)C)/C(=C3CC(=O)[O-])CCC(=O)[O-])C")
+smiles(R"C\1/2=C(\C3=N/C(=C\C4=N/C(=C(\C5=N[C@H]([C@H](CC(=O)[O-])[C@]5(CCC(=O)[O-])C)[C@]([NH+]1)([C@@](CC(=O)N)([C@@H]2CCC(=O)[O-])C)C)/C)/[C@@H](CCC(=O)[O-])C4(C)C)/[C@H]([C@@]3(CC(=O)N)C)CCC(=O)[O-])/C")
+smiles(R"C\1/2=C(\C3=N/C(=C\C4=N/C(=C(\C5=N[C@H]([C@H](CC(=O)[O-])[C@]5(CCC(=O)[O-])C)[C@]([NH+]1)([C@@](CC(=O)[O-])([C@@H]2CCC(=O)[O-])C)C)/C)/[C@@H](CCC(=O)[O-])C4(C)C)/[C@H]([C@@]3(CC(=O)[O-])C)CCC(=O)[O-])/C")
+smiles(R"c\1/2=C/C3=N/C(=C\c4[nH]c(/C=C/5\N=C(/C=c(/c(c1C)C=C)\[nH]2)C(=C5C=C)C)c(C)c4CCC(=O)[O-])/C(=C3C)CCC(=O)[O-]")
+smiles(R"C\1/2=C/C3=[NH+]C(=C([C@@]3(CC(=O)[O-])C)CCC(=O)[O-])C[C@]3(C(=C(C(=N3)C(C3=N[C@@H]([C@](N2)([C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C)C)[C@@H]([C@]3(CCC(=O)[O-])C)CC(=O)[O-])C)CCC(=O)[O-])C)C")
+smiles(R"c12Cc3[nH]c(Cc4[nH]c(Cc5[nH]c(Cc(c(c1C)C=C)[nH]2)c(C)c5C=C)c(C)c4CCC(=O)[O-])c(c3C)CCC(=O)[O-]")
+smiles(R"c12c(c(c3c(c1c(cc(n2)C(=O)[O-])C(=O)[O-])[nH]c(c3)C(=O)[O-])O)O")
+smiles(R"c12c(c(c3c(c1)ccc(=O)o3)OC)occ2")
+smiles(R"c12c(c(c3c(c1)oc(=O)cc3)O)cco2")
+smiles(R"C12CCC3C(=C)C1(CCCC(C)(C)C23)C")
+smiles(R"[C@]12(C=C([C@@]3(CC[C@H]([C@]23CCC1)C)C)C)C")
+smiles(R"[C@@]12(CCC[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)C1)C(=O)[O-])OC2=O)C")
+smiles(R"[C@]12(CCC[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)(C1)O)C(=O)[O-])COC2=O)C")
+smiles(R"[C@]12(CCC[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)(C1)O)C(=O)OC)OC2=O)C")
+smiles(R"[C@]12(CCC[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)(C1)O)C(=O)[O-])OC2=O)C")
+smiles(R"[C@]12(CCC[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)[C@@H](CC[C@@H]34)C1)C(=O)OC)OC2=O)C")
+smiles(R"[C@]12([C@@](CC[C@]3([C@H]4C(=CC[C@@H]13)C([C@H](CC4)O)(C)C)C)(C)[C@H](CC2)[C@@H](CCC=C(C)C)C)C")
+smiles(R"c12c(cccc1)ccc(c2O)O")
+smiles(R"C12C=C(CCC1=C(CCCC2(C)C)C)C")
+smiles(R"C12C=C(CCC1C(=CCCC2(C)C)C)C")
+smiles(R"C12C=C(CCC1C(=C)CCCC2(C)C)C")
+smiles(R"[C@@]12(C(CCCC1=C)(C)C)CCC(=CC2)C")
+smiles(R"c12c(cccc1CC=C(C)C)[nH]cc2C[C@@H](C(=O)[O-])[NH2+]C")
+smiles(R"c12c(cccc1CC=C(C)C)[nH]cc2C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"[C@@]12(C(=C(CCC1)C)C[C@@H](CC2)C(C)(C)O)C")
+smiles(R"c12ccccc1c(ccn2)C")
+smiles(R"c12ccccc1cc(cn2)C")
+smiles(R"c12ccc(cc1cccn2)O")
+smiles(R"c12cccc(c1cccn2)O")
+smiles(R"c12ccccc1c(cc(=O)[nH]2)C")
+smiles(R"c12ccccc1cc(c(=O)[nH]2)C")
+smiles(R"c12cc(ccc1ccc(=O)[nH]2)O")
+smiles(R"c12ccc(cc1ccc(=O)[nH]2)O")
+smiles(R"c12cccc(c1ccc(=O)[nH]2)O")
+smiles(R"c12cc(c(cc1CC[NH2+]C2Cc1ccc(c(c1)OC)O)OC)O")
+smiles(R"c12c(cccc1)c(c[nH]2)CC(=O)NCCCC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c12c(cccc1)CC[NH+](C2Cc1ccccc1)C")
+smiles(R"c12c(cccc1)C([NH2+]CC2)Cc1ccccc1")
+smiles(R"c12c(cccc1)C(=O)CC2")
+smiles(R"c12c(cccc1)N=C1[C@H]3N4[C@H]5C[C@@]21[C@@H](C5[C@H](/C(=C\C)/C4)C3)OC(=O)C")
+smiles(R"c12c(cccc1)N=C1[C@H]3N4[C@H]5C[C@@]21[C@@H](C5[C@H](/C(=C\C)/[C@H]4O)C3)OC(=O)C")
+smiles(R"c12c(cccc1)N=C1[C@H]3N4[C@H]5C[C@@]21[C@@H](C5[C@H](/C(=C\C)/[C@H]4O[C@@H]1O[C@@H]([C@@H](O)[C@@H]([C@H]1O)O)CO)C3)OC(=O)C")
+smiles(R"c12c(cccc1)N[C@H]1[C@H]3N4[C@H]5C[C@@]21[C@@H](C5[C@H](/C(=C\C)/[C@H]4O)C3)OC(=O)C")
+smiles(R"c12cc(c(cc1nc[nH]2)C)C")
+smiles(R"c12ccc(cc1nc([nH]2)NC(=O)OC)SCCC")
+smiles(R"c12ccc(cc1nc([nH]2)NC(=O)OC)S(=O)CCC")
+smiles(R"c12c(cccc1)N(C(=O)C2=O)C(=O)C")
+smiles(R"c12c(cccc1[nH]cc2C[C@H]1C(=O)/C(=C(\C)/[O-])/C(=O)N1)CC=C(C)C")
+smiles(R"c12c(cc(cc1O/C(=C\c1cc(c(cc1)O)O)/C2=O)[O-])O")
+smiles(R"c12c(c(c(c(c1O)C/C=C(/CCC(=O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)O)\C)OC)C)COC2=O")
+smiles(R"c12c(c(c(c(c1O)C/C=C(/CCC(=O)[O-])\C)OC)C)COC2=O")
+smiles(R"c12c(c(ccc1)OCC(C[NH2+]C(C)(C)C)O)CCCC2=O")
+smiles(R"c12c(c(ccc1)OCC(C[NH2+]C(C)(C)C)O)CCCC2O")
+smiles(R"c12c(c(cc(c1)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)COC(=O)CC(=O)[O-])O)O)O)O)c(=O)c(co2)c1ccc(cc1)OC")
+smiles(R"c12c(c(cc(c1)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)c(=O)c(co2)c1ccc(cc1)OC")
+smiles(R"c12c(cc(cc1O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)[O-])[o+]c(c(c2)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO[C@H]1[C@@H]([C@@H]([C@H]([C@@H](O1)C)O)O)O)O)O)O)c1ccc(cc1)O")
+smiles(R"c12c(cc(cc1O[C@@H](CC2=O)c1ccc(cc1)O)[O-])O")
+smiles(R"c12c(c(cc(c1O)C)O)cccc2")
+smiles(R"c12c(cc(c(c1)OC)OC)[C@@H]1N(CC2)Cc2c([C@@H]1C)ccc(c2OC)OC")
+smiles(R"c12c(ccc(c1)O)c(=O)c(co2)c1ccc(cc1)OC")
+smiles(R"c12c(c(cc(c1)OC)O)C(=O)OC(C2)C")
+smiles(R"c12c(ccc(c1)O)[nH]cc2CCNC(=O)C")
+smiles(R"c12c(ccc(c1)O)[nH]cc2CC=O")
+smiles(R"c12c(ccc(c1O)O)ccc(=O)o2")
+smiles(R"c12c(cc(cc1)O)OC[C@H](C2=O)c1c(cc(cc1)OC)O")
+smiles(R"c12c(cc(cc1)O)OC[C@H](C2O)c1c(cc(cc1)OC)O")
+smiles(R"c12c(cc(cc1)O)OC[C@H]([C@H]2O)c1c(cc(cc1)OC)O")
+smiles(R"c12c(ccc(c1O)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)ccc(=O)o2")
+smiles(R"c12c(c(cc(c1)O)O)C(=O)CC(C2)O")
+smiles(R"c12c(c(cc(c1)O)O)C(=O)O[C@@H](C2)C")
+smiles(R"c12c(cc(c(c1)O)O)[nH]cc2")
+smiles(R"c12c(cc(cc1[O-])O)[o+]c(c(c2)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO[C@H]1[C@@H]([C@@H]([C@H]([C@@H](O1)C)O)O)O)O)O)O)c1ccc(cc1)O")
+smiles(R"c12c(cc(cc1O)O)O[C@@H]([C@H]([C@H]2O)O)c1ccc(O)c(c1)O")
+smiles(R"c12c(cc(cc1)O)sc(n2)C1=N[C@H](CS1)C(=O)[O-]")
+smiles(R"c12c(cccc2)CCC1O")
+smiles(R"c12c(cccc2C)cccn1")
+smiles(R"c12c(cccc2C)ccc(=O)[nH]1")
+smiles(R"c12c(cccc2Cl)cccn1")
+smiles(R"c12c(cccc2Cl)ccc(=O)[nH]1")
+smiles(R"c12c(cccc2)[nH]cc1O")
+smiles(R"c12c(cccc2O)cccn1")
+smiles(R"c12c(cccc2O)ccc(=O)[nH]1")
+smiles(R"c12c(c(c(c(c2)[O-])[C@@H]2O[C@@H]([C@H]([C@@H]([C@H]2O)O)O)CO)O)c(=O)cc(o1)c1cc(c(cc1)O)OC")
+smiles(R"c12c(c(c(cc2O)[O-])CC=C(C)C)OCC(C1=O)c1c(cc(cc1)O)O")
+smiles(R"c12c(c(c(cc2O)O)CCC(C)(C)O)OCC(C1=O)c1ccc(cc1O)O")
+smiles(R"c12c(cc(c(c2)O)OC)CC[NH2+]C1Cc1cc(c(cc1)O)O")
+smiles(R"C12(C(C(=C)CCC1)C=C(CC2)C(C)C)C")
+smiles(R"C12=CC(=C(C)C)CC[C@@H]2[C@@]2([C@@H](CC1)C(CCC2)(C)C)C")
+smiles(R"C12[C@](CCC[C@@H]1C)(C)CCC=C2")
+smiles(R"[C@]12(CCC[C@@]([C@H]1[C@@H]([C@@]13CC(=C)C(CC[C@@H]23)(C1)O)C(=O)[O-])(C)C(=O)[O-])C=O")
+smiles(R"C12=CCC(=C[C@@H]1[C@H](CC[C@@H]2C)C(C)C)C")
+smiles(R"C12=CC(=CC[C@@H]2[C@@]2([C@@H](CC1)C(CCC2)(C)C)C)C(C)C")
+smiles(R"c12c(c(CCC(=O)[O-])c([nH]2)Cc2c(c(c([nH]2)Cc2[nH]c(Cc3[nH]c(C1)c(c3CCC(=O)[O-])C)c(c2CCC(=O)[O-])C)C)CCC(=O)[O-])C")
+smiles(R"C12=C(CC[C@@H]1C)[C@H](CC[C@H](C2)C(=C)C)C")
+smiles(R"C12=C(CC[C@@H]3[C@@]1(CCCC3(C)C)C)CC(=CC2)C(C)C")
+smiles(R"[C@]12(C(=CC[C@H]3[C@]1(CC[C@@H]1[C@@]3(CC[C@@H](C1(C)C)O)C)C)[C@H]1[C@@](CC2)(CCC(C1)(C)C)C)C")
+smiles(R"[C@]12(C(=CC[C@H]3[C@]1(CC[C@@H]1[C@@]3(CC[C@@H]([C@]1(C)CO)O)C)C)[C@H]1[C@@](CC2)(CCC(C1)(C)C)C)C")
+smiles(R"[C@@]12([C@](CC[C@@H]3[C@@]4([C@@H](CC=C13)C([C@H](CC4)O)(C)C)C)(C)[C@@H](CC2)[C@H](CCC=C(C)C)C)C")
+smiles(R"C12=C(CC[C@@H]3[C@H]([C@@H]1[C@@H](CC2)C)C3(C)C)C")
+smiles(R"[C@]12(C(=CC[C@H](C1)C(=C)C)[C@@H](C[C@H]([C@H]2C)O)O)C")
+smiles(R"C12=CCC[C@H]([C@@]1(C[C@@H](CC2)C(=C)C)C)C")
+smiles(R"c12c(c(ccn1)O)cccc2")
+smiles(R"c12c(ccc(n1)O)cccc2")
+smiles(R"c12c(ccc(n2)O)cccc1O")
+smiles(R"c12c(cc(c([o+]2)c2ccc(c(c2)O)O)O[C@@H]2O[C@@H]([C@@H](O)[C@@H]([C@H]2O)O)CO[C@@H]2O[C@@H](C)[C@@H]([C@H]([C@H]2O)O)O)c(cc(c1)O)O[C@H]1[C@@H]([C@@H](O)[C@@H]([C@@H](CO)O1)C)C")
+smiles(R"c12c(ccc(=O)[nH]1)cccc2")
+smiles(R"c12c(c(c(c(=O)o2)NC(=O)c2cc(c(cc2)O)CC=C(C)C)[O-])ccc(c1C)O[C@H]1[C@@H]([C@@H]([C@H](C(O1)(C)C)OC)OC(=O)N)O")
+smiles(R"C12=CC[C@H]3[C@]([C@@]1(CC[C@@]1([C@H]2[C@H]([C@@H](CC1)C)C)C)C)(CC[C@@H]1[C@@]3(CC[C@@H](C1(C)C)O)C)C")
+smiles(R"C12=CC[C@H]3C[C@H](CC[C@@]3([C@H]1CC[C@]1([C@H]2CC[C@@H]1[C@H](C)CCC=C(C)C)C)C)O")
+smiles(R"C12=CC[C@H](C[C@@]1([C@@H](CCC2)C)C)C(=C)C")
+smiles(R"c12c(C[C@@H](CC1)C)occ2C")
+smiles(R"[C@@]12(C(C[C@@H](C[C@]1(O2)C)O)(C)C)/C=C/C(=C\C=O)/C")
+smiles(R"[C@@]12(CC[C@@H](CC1=O)C2(C)C)C")
+smiles(R"[C@@]12(CC[C@@H](C[C@@H]1O)C2(C)C)C")
+smiles(R"[C@]12(C(=C[C@H]([C@H]3[C@]1(CC[C@@H]1[C@@]3(CC[C@@H](C1(C)C)O)C)C)O)[C@H]1[C@@](CC2)(CCC(C1)(C)C)C)C")
+smiles(R"c12c(c(c([nH]1)Cc1c(c(c([nH]1)Cc1[nH]c(Cc3[nH]c(C2)c(c3CC(=O)[O-])CCC(=O)[O-])c(c1CCC(=O)[O-])CC(=O)[O-])CC(=O)[O-])CCC(=O)[O-])CC(=O)[O-])CCC(=O)[O-]")
+smiles(R"c12c(c(c([nH]2)Cc2c(c(c([nH]2)Cc2[nH]c(Cc3[nH]c(C1)c(c3CCC(=O)[O-])C)c(c2CCC(=O)[O-])C)C)CCC(=O)[O-])C)CCC(=O)[O-]")
+smiles(R"c12c(CC(=O)c3c(CCN(C2)C)cc2c(c3)OCO2)ccc(c1OC)OC")
+smiles(R"c12c(cc([O-])c(c1O[C@@H](CC2=O)c1ccc(cc1)O)CC=C(C)C)O")
+smiles(R"c12c(cc([O-])c(c1O[C@@H](CC2=O)c1ccc(cc1O)O)CC=C(C)C)O")
+smiles(R"c12c(cc(O)c(c1O[C@@H](CC2=O)c1ccc(cc1O)O)C[C@H](C(=C)C)CC=C(C)C)O")
+smiles(R"[C@]12(C(=CC(=O)[C@H]3[C@]1(CC[C@@H]1[C@@]3(CC[C@@H](C1(C)C)O)C)C)[C@H]1[C@@](CC2)(CCC(C1)(C)C)C)C")
+smiles(R"[C@]12(C(=CC(=O)[C@H]3[C@]1(CC[C@@H]1[C@@]3(CC[C@@H](C1(C)C)O)C)C)[C@H]1[C@@](CC2)(CC[C@](C1)(C)C=O)C)C")
+smiles(R"[C@]12(C(=CC(=O)[C@H]3[C@]1(CC[C@@H]1[C@@]3(CC[C@@H](C1(C)C)O)C)C)[C@H]1[C@@](CC2)(CC[C@](C1)(C)CO)C)C")
+smiles(R"c12c(C(C(=O)N1)C)cccc2")
+smiles(R"c12cc(c(=O)[nH]c1C=CC(C2O)O)C")
+smiles(R"c12c(CC(=O)O[C@@H]3[C@H]([C@H](OC4O[C@@H]([C@@H]([C@@H]([C@H]4O)O)O)CO)[C@H]([C@@H]([C@@H]3O)O)O)O)c[nH]c1cccc2")
+smiles(R"[C@@]12([C@]([C@H]3[C@@](CC2)(CCC(C3)(C)C)C)(CC[C@@]2([C@@H]1CC[C@]1([C@H]2CCC(=O)[C@@H]1C)C)C)C)C")
+smiles(R"c12C[C@@H]3[C@H]4[C@]5(c1c(O[C@H]5C(=O)C=C4)c(cc2)OC)CC[NH+]3C")
+smiles(R"C12=C([C@@H]([C@@]3([C@@H](CC(=O)[O-])C(O[C@H]3CC(=O)[O-])(C)C)CO)CC[C@]2([C@@H](OC(=O)C1)c1ccoc1)C)C")
+smiles(R"C12=C[C@@H](C(=C[C@@]31c1c(ccc(c1O)OC)C[C@H]2[NH+](CC3)C)OC)O")
+smiles(R"C12=C[C@@H](C(=C[C@@]31c1c(ccc(c1O)OC)C[C@H]2[NH+](CC3)C)OC)OC(=O)C")
+smiles(R"c12c(c(ncn1CC[C@@H](C(=O)[O-])[NH3+])NCC=C(C)C)ncn2")
+smiles(R"c12c(c(nc(n2)O)O)nc(c(n1)O)O")
+smiles(R"c12c(c[nH]c1cccc2)CC#N")
+smiles(R"C12=C(C(=O)c3c([C@]1(O)C)cccc3O)C(=O)[C@@]1(C(=O)C(=C([C@@H]([NH+](C)C)[C@@H]1C2)[O-])C(=O)N)O")
+smiles(R"c12c(C(=O)C3=C([C@]4([C@@H](C[C@@H]3[C@@]1(O)C)[C@@H](C(=C(C4=O)C(=O)N)[O-])[NH+](C)C)O)[O-])c(ccc2)O")
+smiles(R"c12c(C(=O)C(C(C1=O)(C/C=C(/CCC[C@@H](CCC[C@@H](CCCC(C)C)C)C)\C)O)C)cccc2")
+smiles(R"C12=CC(=O)C(=C[C@@]31c1c(ccc(c1O)OC)C[C@H]2[NH+](CC3)C)OC")
+smiles(R"[C@@]12(CC(=O)C(=C)[C@H]1C2)C(C)C")
+smiles(R"c12c(C(=O)C[C@H](O1)c1ccc(cc1)O)ccc(c2)O")
+smiles(R"c12c(c(=O)c(co1)c1ccc3c(c1)OCO3)c(cc(c2)[O-])O")
+smiles(R"c12c(c(=O)cc(o1)c1ccccc1)c(c(c(c2)O)O)O")
+smiles(R"c12c(c(=O)cc(o1)c1ccc(cc1)O)c(cc(c2)O[C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO)O")
+smiles(R"c12c(c(=O)c(co1)c1ccc(cc1)OC)c(cc(c2)[O-])O")
+smiles(R"c12c(c(=O)c(co1)c1cc(c(cc1)OC)O)ccc(c2)O")
+smiles(R"c12c(c(=O)cc(o1)c1ccc(O)c(c1)OC)c(cc(c2)[O-])O")
+smiles(R"c12c(C(=O)C(CO2)c2ccc(cc2)OC)c(cc(c1)[O-])O")
+smiles(R"C12CC(=O)C(C(=O)C1)(C)C2(C)C")
+smiles(R"C12=CC(=O)[C@H]3[C@@](C2CC[C@]2([C@]1(CC[C@@H]2[C@@H]([C@@H](CCC(C)(C)O)O)C)O)C)(C[C@@H]([C@@H](C3)OC(=O)CCCCCCCCCCCCCCC)O)C")
+smiles(R"C12=CC(=O)[C@H]3[C@@]([C@H]1CC[C@@]1(C)[C@]2(CC[C@@H]1[C@H](C)[C@@H](CCC(C)(C)O)O)O)(C[C@@H]([C@@H](C3)O)O)C")
+smiles(R"C12=CC(=O)[C@H]3[C@@]([C@H]1CC[C@@]1(C)[C@]2(CC[C@@H]1[C@H](C)[C@@H](CCC(C)(C)O)O)O)(C[C@@H](C(=O)C3)O)C")
+smiles(R"C12=CC(=O)C(=O)C=C1C[C@@H](N2)C(=O)[O-]")
+smiles(R"C12=CC(=O)C(=O)C=C1C[C@H](N2)C(=O)[O-]")
+smiles(R"c12c(c(=O)[n-]c(=O)n1)cc1c(cc(cc1)O)n2C[C@@H]([C@@H]([C@@H](CO)O)O)O")
+smiles(R"c12c(c(=O)[n-]c(=O)n1)cc1c(cc(cc1)O)n2C[C@@H]([C@@H]([C@@H](COP(=O)(O[C@H](C(=O)N[C@@H](CCC(=O)N[C@@H](CCC(=O)[O-])C(=O)[O-])C(=O)[O-])C)[O-])O)O)O")
+smiles(R"c12c(c(=O)[n-]c(=O)n1)cc1c(cc(cc1)O)n2C[C@@H]([C@@H]([C@@H](COP(=O)(O[C@H](C(=O)N[C@@H](CCC(=O)[O-])C(=O)[O-])C)[O-])O)O)O")
+smiles(R"c12c(c(=O)[n-]c(=O)n1)cc1c(cc(cc1)O)n2C[C@@H]([C@@H]([C@@H](COP(=O)(O[C@H](C(=O)[O-])C)[O-])O)O)O")
+smiles(R"c12c(c(=O)[n-]c(=O)n1)nc(c(C)n2C[C@@H]([C@@H]([C@@H](CO)O)O)O)C")
+smiles(R"c12c(c(=O)[nH]cc1)cccc2")
+smiles(R"c12c(c(=O)[nH]c(=O)[nH]1)[nH]c(=O)[nH]2")
+smiles(R"c12c(C(=O)OC1=O)c(cc(=O)c(c2)O)[O-]")
+smiles(R"[C@@]12([C@H]3C(=CC[C@@H]1[C@@]1([C@](CC2)(C)[C@H]2[C@@](CC1)(CCC(C2)(C)C)C)C)C([C@H](CC3)O)(C)C)C")
+smiles(R"[C@@]12([C@H]3[C@@]([C@H](C(=O)CC3)C)(CC[C@@H]1[C@@]1([C@](C[C@@](CC1)(CCC=C(C)C)C)(CC2)C)C)C)C")
+smiles(R"[C@@]12([C@@H]3[C@H]([C@H]4[C@@](CC3)(C)[C@H](CC4)[C@@H]([C@@H](O)[C@H](O)[C@H](C(C)C)C)C)CC[C@H]2C[C@@H](CC1)O)C")
+smiles(R"c12[C@H]3N(C/C(=C/C)/[C@H](C3)C(C(=O)OC)C=O)CCc1c1c([nH]2)cccc1")
+smiles(R"[C@@]12([C@H](C1)C(=C)[C@@H](C2)O)C(C)C")
+smiles(R"[C@]12([C@H](c3c(OC2)c2c(cc3)OC(C=C2)(C)C)Oc2c1ccc(c2)O)O")
+smiles(R"[C@]12([C@H](c3c(OC2)cc2c(c3)C=CC(O2)(C)C)Oc2c1ccc(c2)O)O")
+smiles(R"[C@]12([C@H](c3c(OC2)cc2c(c3)C[C@H](O2)C(=C)C)Oc2c1ccc(c2)O)O")
+smiles(R"c12[C@H](Cc3ccc(cc3)O)[NH2+]CCc1cc(c(c2)O)OC")
+smiles(R"c12[C@@H](Cc3cc(Oc4ccc(cc4)C[C@H]4c5c(cc(c(c5)O)OC)CC[NH+]4C)c(cc3)O)[NH+](CCc1cc(c(c2)O)OC)C")
+smiles(R"[C@]12([C@H](CC[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)C1)C(=O)[O-])OC2=O)O)C")
+smiles(R"[C@]12([C@H](C=C[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)(C1)O)C(=O)OC)OC2=O)O)C")
+smiles(R"[C@]12([C@H](CC[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)(C1)O)C(=O)OC)OC2=O)O)C")
+smiles(R"[C@]12([C@H](C=C[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)(C1)O)C(=O)[O-])OC2=O)O)C")
+smiles(R"[C@]12([C@H](CC[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)(C1)O)C(=O)[O-])OC2=O)O)C")
+smiles(R"[C@]12([C@H](C=C[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)(C1)O)C(=O)[O-])OC2=O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)C")
+smiles(R"[C@]12([C@H](CC[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)[C@@H](CC[C@@H]34)C1)C(=O)OC)OC2=O)O)C")
+smiles(R"[C@]12([C@H](C(CCC1)(C)C)CC[C@@H]1[C@]32CC[C@@]([C@@H](C1)C3)(C)O)C")
+smiles(R"[C@]12([C@H](C(=CCC1)C)C[C@@H](CC2)C(C)(C)O)C")
+smiles(R"[C@@]12([C@@H](C[C@@H](CC1)C2(C)C)O)C")
+smiles(R"[C@@]12([C@@H](C[C@@H](CC1)C2(C)C)OP(=O)(OP(=O)([O-])[O-])[O-])C")
+smiles(R"[C@@]12([C@H](C[C@@H](CC1=O)C2(C)C)O)C")
+smiles(R"[C@]12([C@H](C([C@H](CC1)O)(C)C)CCC1=C2CC[C@@]2([C@@]1(CC[C@@]1([C@H]2CC(CC1)(C)C)C)C)C)C")
+smiles(R"[C@]12([C@H](C([C@H](CC1)O)(C)C)CC[C@@]1([C@@H]2CC[C@@]2(C1=CC[C@@]1([C@H]2CC(CC1)(C)C)C)C)C)C")
+smiles(R"[C@]12([C@H](C([C@H](CC1)O)(C)C)CC[C@@]1([C@@H]2CC[C@H]1[C@@](CC/C=C(/CCC=C(C)C)\C)(O)C)C)C")
+smiles(R"[C@]12([C@H](C(C(=O)CC1)CCc1c(ccc(c1)O)C)CCC2=O)C")
+smiles(R"[C@@]12([C@H]([C@H]3[C@@]([C@@]4(C(=CC(=O)C=C4)CC3)C)(CC2)O)CCC1=O)C")
+smiles(R"[C@]12([C@H]([C@H]3[C@@H]([C@@]4(C(=CC3)C[C@H](CC4)O)C)CC1)CC[C@@H]2[C@@]([C@@H](CCC(C)C)O)(C)O)C")
+smiles(R"[C@@]12([C@H]([C@H]3[C@@H]([C@@]4(C(=CC3)CC(=O)CC4)C)CC2)CC[C@@H]1[C@@H](CCCC(C)C)C)C")
+smiles(R"[C@@]12([C@H]([C@H]3[C@@H]([C@@]4(C(=CC(=O)C=C4)CC3)C)CC2)CCC1=O)C")
+smiles(R"[C@@]12([C@H]([C@H]3[C@@H]([C@@]4(C(=CC(=O)CC4)CC3)C)CC2)CC[C@@H]1[C@@H](CCCC(C)C)C)C")
+smiles(R"[C@@]12([C@H]([C@H]3[C@@H]([C@@]4(C(=CC(=O)CC4)CC3)C)CC2)CC[C@@H]1[C@@H](CCCC(CO)C)C)C")
+smiles(R"[C@]12([C@H]([C@H]3[C@@H]([C@@]4([C@@H](CC3)CC(=O)CC4)C)CC1)CC[C@@H]2[C@@H]([C@H](C[C@H](C(C)C)C)O)C)C")
+smiles(R"[C@@]12([C@H]([C@H]3[C@@H]([C@@]4([C@H](C[C@H]3O)C[C@@H](CC4)O)C)CC2)CC[C@@H]1[C@@H](CCCC(C)C)C)C")
+smiles(R"[C@]12([C@H]([C@H](C[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)C1)C(=O)OC)OC2=O)O)O)C")
+smiles(R"[C@]12([C@H]([C@H](C[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)C1)C(=O)[O-])OC2=O)O)O)C")
+smiles(R"[C@]12([C@H]([C@H](C[C@@]3([C@@H]1[C@@H]([C@@]14CC(=C)C(CC[C@@H]34)(C1)O)C(=O)[O-])OC2=O)O)O)C")
+smiles(R"[C@@]12([C@@H]([C@@H](CC[C@@H]1O)C)[C@H]1[C@@H](CC2)C1(C)C)C")
+smiles(R"[C@]12([C@H]([C@@H](C(=O)CC1)CCc1c(ccc(c1O)O)C)CCC2=O)C")
+smiles(R"[C@@]12([C@H](Oc3c1cc1c(c3)OCO1)c1c(OC2)cc(cc1)OC)O")
+smiles(R"c12c(nc3c(cc(c(c3)C)C)n1)c(=O)[nH]c(=O)[nH]2")
+smiles(R"c12c(nc3c(cc(c(c3)C)C)n2C[C@@H]([C@@H]([C@@H](CO)O)O)O)c(=O)[n-]c(=O)n1")
+smiles(R"c12c(nc3c(n1C[C@@H]([C@@H]([C@H](O)COP(=O)([O-])[O-])O)O)cc(c(c3)C)C)c(=O)[n-]c(=O)n2")
+smiles(R"c12cnc(c(c1C(=O)OC2)O)C")
+smiles(R"c12c(nccc1C(=O)[O-])cccc2")
+smiles(R"c12c([n+](ccc1[N+](=O)[O-])[O-])cccc2")
+smiles(R"c12c(ncc(c1O)O)cccc2")
+smiles(R"c12c(NCC(=N1)CNc1ccc(C(=O)[O-])cc1)nc([nH]c2=O)N")
+smiles(R"c12c(N=C(CN1)C(=O)C(C)O)c(=O)[nH]c(n2)N")
+smiles(R"c12c(NC(CN1)C(=O)C(C)O)c(=O)[nH]c(n2)N")
+smiles(R"c12c(N=C(CN1)C(=O)C(C)O)c(=O)[nH]c(=O)[nH]2")
+smiles(R"c12c(NC(CN1)C(=O)[O-])c(=O)[nH]c(n2)N")
+smiles(R"c12c(NCC(=N1)COP(=O)(OP(=O)([O-])[O-])[O-])nc(nc2O)N")
+smiles(R"c12c(nc(cn2)C(C(C)O)O)c(=O)[nH]c(n1)N")
+smiles(R"c12c(NC(CN2)C(C(C)O)O)c(=O)[nH]c(n1)N")
+smiles(R"c12c(N=C(CN2)[C@@H]([C@@H](C)O)O)c(=O)nc([nH]1)N")
+smiles(R"c12c(N=C(CN2)[C@@H]([C@H](C)O)O)c(=O)nc([nH]1)N")
+smiles(R"c12c(N=C(CN2)[C@H]([C@H](C)O)O)c(=O)nc([nH]1)N")
+smiles(R"c12c(nc(cn2)CNc2ccc(cc2)C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-])c(=O)[nH]c(n1)N")
+smiles(R"c12c(N=C(CN2)CO)c(nc(n1)N)O")
+smiles(R"c12c(NC(C(=O)C(=O)C)CN1)c(=O)[nH]c(n2)N")
+smiles(R"c12c(N[C@H]3[C@@H](N1)C(=C([S-])[C@H](O3)COP(=O)([O-])OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@H](n3c4ncnc(c4nc3)N)O1)O)O)S)nc(N)[nH]c2=O")
+smiles(R"c12c(N[C@@H](C)[C@H]3[N+]2=CN(c2ccc(cc2)C[C@@H]([C@@H]([C@@H](CO[C@H]2O[C@@H]([C@H]([C@H]2O)O)COP(=O)(O[C@H](C(=O)[O-])CCC(=O)[O-])[O-])O)O)O)[C@@H]3C)nc([nH]c1=O)N")
+smiles(R"c12c(N[C@@H](C)[C@H]3N2CN(c2ccc(cc2)C[C@@H]([C@@H]([C@@H](CO[C@H]2O[C@@H]([C@H]([C@H]2O)O)COP(=O)(O[C@H](C(=O)[O-])CCC(=O)[O-])[O-])O)O)O)[C@@H]3C)nc([nH]c1=O)N")
+smiles(R"c12c(N[C@H]([C@@H](N1C)[C@@H](C)Nc1ccc(cc1)C[C@@H]([C@@H]([C@@H](CO[C@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(O[C@H](C(=O)[O-])CCC(=O)[O-])[O-])O)O)O)C)nc([nH]c2=O)N")
+smiles(R"c12c(N[C@H]([C@@H](N1)[C@@H](C)Nc1ccc(cc1)C[C@@H]([C@@H]([C@@H](CO[C@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(O[C@H](C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-])CCC(=O)[O-])[O-])O)O)O)C)nc([nH]c2=O)N")
+smiles(R"c12c(N[C@H]([C@@H](N1)[C@@H](C)Nc1ccc(cc1)C[C@@H]([C@@H]([C@@H](CO[C@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(O[C@H](C(=O)[O-])CCC(=O)[O-])[O-])O)O)O)C)nc([nH]c2=O)N")
+smiles(R"c12c(N([C@H](CN1)CNc1ccc(cc1)C(=O)N[C@@H](CCC(=O)[O-])C(=O)[O-])C)c(=O)[nH]c(n2)N")
+smiles(R"c12c(N[C@H](CN2)[C@@H]([C@H](C)O)O)c(=O)nc([nH]1)N")
+smiles(R"c12c(ncn(c1N)C)ncn2")
+smiles(R"c12c(ncnc1N)[nH]cn2")
+smiles(R"c12c(nc([nH]1)C(=O)[O-])[nH]c(=O)[nH]c2=O")
+smiles(R"c12c(nc[nH]1)ncnc2")
+smiles(R"c12c(nc[nH]c1=O)nc[nH]2")
+smiles(R"c12c(nc([nH]c2=O)N)N[C@@H](C)C(=N1)[C@@H](C)Nc1ccc(cc1)C[C@H](O)[C@@H]([C@@H](CO[C@@H]1[C@H](O)[C@H](O)[C@@H](COP(=O)(O[C@H](C(=O)[O-])CCC(=O)[O-])[O-])O1)O)O")
+smiles(R"c12c(nc(N)[nH]c1=O)[nH]cn2")
+smiles(R"c12c[nH]c3c1c([C@@H]1[C@H]([N+](=CC(=C1)C)C)C2)ccc3")
+smiles(R"c12c[nH]c3c1c([C@@H]1[C@H]([N+](=CC(C1)C)C)C2)ccc3")
+smiles(R"c12c[nH]c3c1c([C@@H]1[C@H]([NH+](C)C[C@@H](C1)C)C2)ccc3")
+smiles(R"c12c[nH]c3c1c([C@H]([C@H]([NH2+]C)C2)/C=C(/C=O)\C)ccc3")
+smiles(R"c12c[nH]c3c1c([C@H]([C@H]([NH2+]C)C2)/C=C(/CO)\C)ccc3")
+smiles(R"c12c[nH]c3c1c([C@H]([C@H]([NH2+]C)C2)CC(C=O)C)ccc3")
+smiles(R"c12c([nH]c3c(cc(c(c3)C)C)n2C[C@@H]([C@@H]([C@@H](CO)O)O)O)c(=O)[nH]c(=O)[nH]1")
+smiles(R"c12c([nH]c3c(n1C[C@@H]([C@@H]([C@H](O)COP(=O)([O-])[O-])O)O)cc(c(c3)C)C)c(=O)[nH]c(=O)[nH]2")
+smiles(R"c12c([nH]c(cn1c(=O)c(n2)[C@H](CC)C)c1c2c(cccc2)[nH]c1)CCCNC(=[NH2+])N")
+smiles(R"c12c([nH]cn2)ncnc1NCC=C(C)C")
+smiles(R"c12c([nH]c(=O)c(c2)C)ccc(c1O)O")
+smiles(R"[C@@]12([C@](O1)(C[C@H](CC2(C)C)O)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/[C@]12[C@](O1)(C[C@H](CC2(C)C)O)C)\C)\C)/C)/C")
+smiles(R"[C@@]12(CO1)C[C@@H]([C@@H]([C@H]([C@H](O[C@H]1C[C@@H]([C@H]([C@@H](O1)C)O)OC)[C@H](C(=O)O[C@@H]([C@@H]([C@@H]([C@H](C2=O)C)O)C)C)C)C)O[C@H]1[C@@H]([C@H](C[C@H](O1)C)[NH+](C)C)O)C")
+smiles(R"[C@@]12(CO1)C[C@@H]([C@@H]([C@H]([C@H](O[C@@H]1O[C@H]([C@@H]([C@H](C1)OC)O)C)[C@H](C(=O)O[C@@H]([C@@H]([C@@H]([C@H](C2=O)C)O)C)C)C)C)O)C")
+smiles(R"[C@@]12(CO1)C[C@@H]([C@@H]([C@H]([C@H](O[C@@H]1O[C@H]([C@@H]([C@H](C1)O)O)C)[C@H](C(=O)O[C@@H]([C@@H]([C@@H]([C@H](C2=O)C)O)C)C)C)C)O)C")
+smiles(R"[C@@]12(CO1)C[C@@H]([C@H](O[C@H]1[C@@H]([C@H](C[C@H](O1)C)[NH+](C)C)OP(=O)([O-])[O-])[C@H]([C@H](O[C@H]1C[C@@H]([C@H]([C@@H](O1)C)O)OC)[C@H](C(=O)O[C@@H]([C@@H]([C@@H]([C@H](C2=O)C)O)C)C)C)C)C")
+smiles(R"c12c(oc3c(n1)cccc3)cc(=O)c(c2)N")
+smiles(R"c12c(oc3c(o1)cccc3)cc(=O)c(=O)c2")
+smiles(R"c12c(oc(c(c1=O)[O-])c1ccc(cc1)O)cc(cc2O)O")
+smiles(R"c12c(oc(c(c1=O)[O-])c1ccc(cc1)OC)cc(cc2O)O")
+smiles(R"c12c(oc(c(c1=O)[O-])c1cc(c(cc1)O)O)cc(cc2O)O")
+smiles(R"c12c(oc(cc2=O)c2cc(c(cc2)O)O)cc([O-])c(c1O)[C@@H]1O[C@H](CO)[C@H]([C@H](O)[C@H]1O)O")
+smiles(R"c12C(=O)C(=C(C(=O)c1cccc2)C/C=C(/CCC[C@@H](CCC[C@@H](CCCC(C)C)C)C)\C)C")
+smiles(R"[C@@]12(C(=O)C[C@@H](CC1)C2(C)C)C")
+smiles(R"c12c(=O)cc(oc1cc(cc2O)O)C")
+smiles(R"c12c(=O)cc(oc2cc(c(c1O)OC)O)c1ccccc1")
+smiles(R"c12c(O[C@@H](CC1=O)c1ccccc1)cccc2")
+smiles(R"c12c(O[C@H]([C@H](C1=O)O)c1cc(c(cc1)O)O)cc(cc2O)[O-]")
+smiles(R"c12c(O[C@@H]([C@H]([C@H]1O)O)c1ccc(cc1)O)cc(cc2O)O")
+smiles(R"c12c(O[C@@H](C(=O)N1O)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)cc(cc2)OC")
+smiles(R"C12=[N+]3C(=C(c4c(c(c5n4[Co-2]43N3C(=C2)[C@]([C@@H](C3=CC2=[N+]4C(=C5)C(=C2CC(=O)[O-])CCC(=O)[O-])CCC(=O)[O-])(CC(=O)[O-])C)CCC(=O)[O-])CC(=O)[O-])C)[C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C")
+smiles(R"C12=[N+]3C(=Cc4c(c(c5n4[Co-2]43N3C(=C2)[C@]([C@@H](C3=CC2=[N+]4C(=C5)C(=C2CC(=O)[O-])CCC(=O)[O-])CCC(=O)[O-])(CC(=O)[O-])C)CCC(=O)[O-])CC(=O)[O-])[C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C")
+smiles(R"C12=[N+]3C(=C(c4c(c(c5n4[Co-2]43N3C(=C2)[C@]([C@@H](C3=CC2=[N+]4C(=C(C2CC(=O)[O-])CCC(=O)[O-])C5)CCC(=O)[O-])(CC(=O)[O-])C)CCC(=O)[O-])CC(=O)[O-])C)[C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C")
+smiles(R"C12=[N+]3C(=Cc4c(c(c5n4[Co-2]43N3C(=C2)[C@]([C@@H](C3=CC2=[N+]4C(=C(C2CC(=O)[O-])CCC(=O)[O-])C5)CCC(=O)[O-])(CC(=O)[O-])C)CCC(=O)[O-])CC(=O)[O-])[C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C")
+smiles(R"C12=[N+]3C(=Cc4n5c(C=C6[N+]7=C(C=c8n(c(=C1)c(c8CCC(=O)[O-])C)[Fe-2]357)[C@@]([C@@]6(C)O)(CCC(=O)[O-])O)c(c4C)C=C)C(=C2C)C=C")
+smiles(R"C12=[N+]3[C@@]([C@@](CC(=O)N)([C@@H]2CCC(=O)N)C)(C)[C@@H]2N4C(=C(C5=[N+]6C(=CC7=[N+](C(=C1C)[C@]([C@@H]7CCC(=O)N)(CC(=O)N)C)[Co-2]346C[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c3c(nc1)c(ncn3)N)C([C@@H]5CCC(=O)N)(C)C)C)[C@](CCC(=O)NC[C@H](OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c3c(nc1)c(=O)[nH]c(n3)N)[O-])[O-])C)([C@H]2CC(=O)N)C")
+smiles(R"C12=[N+]3[C@@]([C@@](CC(=O)N)([C@@H]2CCC(=O)N)C)(C)[C@@H]2N4C(=C(C5=[N+]6C(=CC7=[N+](C(=C1C)[C@]([C@@H]7CCC(=O)N)(CC(=O)N)C)[Co-2]346C[C@H]1O[C@@H](n3c4ncnc(N)c4nc3)[C@@H]([C@@H]1O)O)C([C@@H]5CCC(=O)N)(C)C)C)[C@](CCC(=O)NC[C@@H](C)O)([C@H]2CC(=O)N)C")
+smiles(R"C12=[N+]3[C@@]([C@@](CC(=O)N)([C@@H]2CCC(=O)N)C)(C)[C@@H]2N4C(=C(C5=[N+]6C(=CC7=[N+](C(=C1C)[C@]([C@@H]7CCC(=O)N)(CC(=O)N)C)[Co-2]346C[C@H]1O[C@@H](n3c4ncnc(N)c4nc3)[C@@H]([C@@H]1O)O)C([C@@H]5CCC(=O)N)(C)C)C)[C@](CCC(=O)NC[C@@H](C)OP(=O)([O-])[O-])([C@H]2CC(=O)N)C")
+smiles(R"C12=[N+]3[C@@]([C@@](CC(=O)N)([C@@H]2CCC(=O)N)C)(C)[C@@H]2N4C(=C(C5=[N+]6C(=CC7=[N+](C(=C1C)[C@]([C@@H]7CCC(=O)N)(CC(=O)N)C)[Co-2]346C[C@H]1O[C@@H](n3c4ncnc(N)c4nc3)[C@@H]([C@@H]1O)O)C([C@@H]5CCC(=O)N)(C)C)C)[C@](CCC(=O)[O-])([C@H]2CC(=O)N)C")
+smiles(R"C12=[N+]3[C@@]([C@@](CC(=O)[O-])([C@@H]2CCC(=O)[O-])C)(C)[C@@H]2N4C(=C(C5=[N+]6C(=CC7=[N+](C(=C1C)[C@]([C@@H]7CCC(=O)[O-])(CC(=O)N)C)[Co-2]346)C([C@@H]5CCC(=O)[O-])(C)C)C)[C@](CCC(=O)[O-])([C@H]2CC(=O)[O-])C")
+smiles(R"c12NC3C(Nc1nc(N)[nH]c2=O)OC1C(OP(=O)(OC1)[O-])C3=O")
+smiles(R"C12=N/C(=C\c3c(c(c([nH]3)/C=C/3\N=C(/C=C/4\N/C(=C\2)/[C@]([C@@H]4CCC(=O)[O-])(CC(=O)[O-])C)C(=C3CCC(=O)[O-])CC(=O)[O-])CCC(=O)[O-])CC(=O)[O-])/[C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C")
+smiles(R"C12=N/C(=C\c3c(c(c([nH]3)Cc3[nH]c(Cc4[nH]c(C2)c(c4CCC(=O)[O-])CC(=O)[O-])c(c3CCC(=O)[O-])CC(=O)[O-])CCC(=O)[O-])CC(=O)[O-])/[C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C")
+smiles(R"C12=N/C(=C\c3c(c(c([nH]3)Cc3[nH]c(/C=C/4\[NH+]/C(=C\2)/[C@]([C@@H]4CCC(=O)[O-])(CC(=O)[O-])C)c(c3CCC(=O)[O-])CC(=O)[O-])CCC(=O)[O-])CC(=O)[O-])/[C@]([C@@H]1CCC(=O)[O-])(CC(=O)[O-])C")
+smiles(R"C12=N[C@@]([C@@](CC(=O)N)([C@@H]2CCC(=O)N)C)(C)[C@@H]2N(/C(=C(\C3=N/C(=C\C4=N/C(=C\1/C)/[C@]([C@@H]4CCC(=O)N)(CC(=O)N)C)/C([C@@H]3CCC(=O)N)(C)C)/C)/[C@](CCC(=O)NC[C@@H](C)O)([C@H]2CC(=O)N)C)[Co]")
+smiles(R"C12=N[C@@]([C@@](CC(=O)N)([C@@H]2CCC(=O)[O-])C)(C)[C@@H]2N(/C(=C(\C3=N/C(=C\C4=N/C(=C\1/C)/[C@]([C@@H]4CCC(=O)[O-])(CC(=O)N)C)/C([C@@H]3CCC(=O)[O-])(C)C)/C)/[C@](CCC(=O)[O-])([C@H]2CC(=O)[O-])C)[Co]")
+smiles(R"C12=N[C@@]([C@@](CC(=O)N)([C@@H]2CCC(=O)[O-])C)(C)[C@@H]2N(/C(=C(\C3=N/C(=C\C4=N/C(=C\1/C)/[C@]([C@@H]4CCC(=O)[O-])(CC(=O)N)C)/C([C@@H]3CCC(=O)[O-])(C)C)/C)/[C@](CCC(=O)[O-])([C@H]2CC(=O)[O-])C)[Co+]")
+smiles(R"C12=N[C@@]([C@@](CC(=O)N)([C@@H]2CCC(=O)[O-])C)(C)[C@@H]2N(/C(=C(\C3=N/C(=C\C4=N/C(=C\1/C)/[C@]([C@@H]4CCC(=O)[O-])(CC(=O)N)C)/C([C@@H]3CCC(=O)[O-])(C)C)/C)/[C@](CCC(=O)[O-])([C@H]2CC(=O)[O-])C)[Co+]C[C@H]1O[C@@H](n2c3ncnc(N)c3nc2)[C@@H]([C@@H]1O)O")
+smiles(R"C12=N[C@@]([C@@](CC(=O)[O-])([C@@H]2CCC(=O)[O-])C)(C)[C@@H]2N=C(C(C3=N[C@](CC4=N/C(=C\1/C)/[C@]([C@@H]4CCC(=O)[O-])(CC(=O)[O-])C)(C)C(=C3CCC(=O)[O-])C)C)[C@](CCC(=O)[O-])([C@H]2CC(=O)[O-])C")
+smiles(R"C12=N[C@@]([C@@](CC(=O)[O-])([C@@H]2CCC(=O)[O-])C)(C)[C@@H]2N(/C(=C(\C3=N/C(=C\C4=N/C(=C\1/C)/[C@]([C@@H]4CCC(=O)[O-])(CC(=O)[O-])C)/C([C@@H]3CCC(=O)[O-])(C)C)/C)/[C@](CCC(=O)[O-])([C@H]2CC(=O)[O-])C)[Co+]")
+smiles(R"c12N[C@@H]3[C@H](Nc1nc(N)[nH]c2=O)O[C@@H](C(=C3S)[S-])COP(=O)([O-])[O-]")
+smiles(R"c12n([C@@H]3O[C@@H]([C@H](C3)O)COP(=O)([O-])[O-])c(=O)[nH]c1c(=O)[nH]c(n2)N")
+smiles(R"c12n([C@@H]3O[C@@H]([C@H](C3)O)COP(=O)(OP(=O)([O-])[O-])[O-])cnc1c(=O)[nH]c(n2)N")
+smiles(R"c12n([C@@H]3O[C@@H]([C@H](C3)O)COP(=O)(OP(=O)([O-])[O-])[O-])c(=O)[nH]c1c(=O)[nH]c(n2)N")
+smiles(R"c12n([C@@H]3O[C@@H]([C@H](C3)O)COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-])cnc1c(=O)[nH]c(n2)N")
+smiles(R"c12n([C@@H]3O[C@@H]([C@H](C3)O)COP(=O)(OP(=O)(OP(=O)([O-])O)[O-])[O-])c(=O)[nH]c1c(=O)[nH]c(n2)N")
+smiles(R"c12n([C@@H]3O[C@@H]([C@H]([C@H]3O)O)COP(=O)([O-])[O-])cnc1c(=O)[nH]c(=O)[nH]2")
+smiles(R"c12ncn(c1c(=O)[nH]c(=O)[nH]2)C")
+smiles(R"C12=NC(=NC(=O)C1=NC(CN2)C(C(C)O)O)N")
+smiles(R"C12=NC(=NC(=O)C1(NC(CN2)C(C(C)O)O)O)N")
+smiles(R"C12=NC(=NC(=O)C1=N[C@H](CN2)[C@@H]([C@@H](C)O)O)N")
+smiles(R"C12=NC(=NC(=O)C1(N[C@H](CN2)[C@@H]([C@@H](C)O)O)O)N")
+smiles(R"C12=NC(=O)NC(=O)C1(NC(=O)N2)O")
+smiles(R"C12(OC(C(CC2)CC(=O)O1)(C)C)C")
+smiles(R"c12occ(c(=O)c1ccc(c2)O)c1c(cc(cc1)OC)O")
+smiles(R"c12oc(c(c(=O)c1c(c(c(c2)OC)OC)O)OC)c1cc(c(cc1)O)O")
+smiles(R"c12oc(c(c(=O)c1c(cc(c2)OC)O)OC)c1cc(c(cc1)O)O")
+smiles(R"c12oc(c(c(=O)c1c(cc(c2OC)O)O)[O-])c1cc(c(cc1)O)O")
+smiles(R"c12oc(c(c(=O)c1c(c(c(c2)OC)O)O)OC)c1cc(c(cc1)O)O")
+smiles(R"c12oc(cc(=O)c1c(cc(c2)[O-])O)c1ccc(cc1)OC")
+smiles(R"c12oc(c(c(=O)c1c(cc(c2)[O-])O)OC)c1cc(c(cc1)O)O")
+smiles(R"c12O[C@@H]([C@H](Cc1c(cc(c2)O)O)O)c1cc(c(cc1)O)O")
+smiles(R"c12oc(=O)cc(c1cccc2)O")
+smiles(R"c12oc(=O)cc(c1ccc(c2)O)C")
+smiles(R"c12oc(=O)cc(c1ccc(c2)OC(=O)C)C")
+smiles(R"c12oc(=O)ccc2cc2c(c1)occ2")
+smiles(R"c12oc(=O)ccc2cc(c(c1)O)OC")
+smiles(R"C1[C@@]23C(=C(C([C@@H]1CC3)(C)C)C)CC[C@@H]2C")
+smiles(R"C1[C@@]23C(=C(C([C@@H]1CC3)(C)C)C)[C@@H](C[C@@H]2C)O")
+smiles(R"C1[C@@]23C(=C(C([C@@H]1CC3)(C)C)C)[C@H](C[C@@H]2C)O")
+smiles(R"C1[C@@]23C(=C(C([C@@H]1CC3)(C)C)C)C(=O)C[C@@H]2C")
+smiles(R"c1c2c(c3c(c4c(c5c(cc4)cc4c(c5)OCO4)N(C3)C)c1OC)OCO2")
+smiles(R"c1c2c(c3c(c4c(c5c(cc6c(c5)OCO6)c(c4)OC)N(C3)C)c1OC)OCO2")
+smiles(R"C1C2=C([C@]3(CC[C@@H](C([C@@H]3C1)(C)C)O)C)CC[C@]1(C2=CC[C@@H]1[C@@H](CCC=C(C)C)C)C")
+smiles(R"[C@@]1(/C/2=C(/c3c(c(c([nH]3)Cc3c(c(c(/C=C/4\N=C(/C=C(/[C@H]1CCC(=O)[O-])\[NH+]2)[C@]([C@@H]4CCC(=O)[O-])(CC(=O)[O-])C)[nH]3)CC(=O)[O-])CCC(=O)[O-])CCC(=O)[O-])CC(=O)[O-])\C)(CC(=O)[O-])C")
+smiles(R"c1c2c(cc3c1OCO3)c1cc3c(c[n+]1CC2)c(c(cc3)OC)OC")
+smiles(R"c1c2c(cc3c1OCO3)c1c(cc2OC)c2c(c[n+]1C)c1c(cc2OC)OCO1")
+smiles(R"c1c2c(cc3c1OCO3)ccc1c2[n+](cc2c1c(cc1c2OCO1)OC)C")
+smiles(R"c1c2c(cc3c1OCO3)[C@@H]1Cc3c(CN1CC2)c(c(cc3)OC)OC")
+smiles(R"c1c2c(cc3c1OCO3)[C@H]1Cc3c(CN1CC2)c(c(cc3)OC)OC")
+smiles(R"c1c2c(cc3c1OCO3)[C@@H]1Cc3c(C[N@@+]1(CC2)C)c(c(cc3)OC)OC")
+smiles(R"c1c2c(c(c3c1oc(=O)cc3)OC)cco2")
+smiles(R"c1(c2c(c(c3c1oc(=O)cc3)OC)cco2)OC")
+smiles(R"C1C2C(C(C(=C1)C)C2)(C)C")
+smiles(R"c1c2c(ccc1)c(c[nH]2)CC[NH3+]")
+smiles(R"c1c2c(ccc1O)cccn2")
+smiles(R"c1c2c(ccc1O)[C@H]1[C@@](CO2)(c2c(cc(cc2)O)O1)O")
+smiles(R"c1c2c(c(cc1O[C@@H]1O[C@@H]([C@@H](O)[C@@H]([C@H]1O[C@@H]1O[C@@H]([C@@H](O)[C@@H]([C@H]1O)O)C(=O)[O-])O)C(=O)[O-])O)c(=O)cc(c1ccc(c(c1)O)O[C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)C(=O)[O-])o2")
+smiles(R"c1c2c(c(cc1O[C@@H]1O[C@@H]([C@@H](O)[C@@H]([C@H]1O[C@@H]1O[C@@H]([C@@H](O)[C@@H]([C@H]1O)O)C(=O)[O-])O)C(=O)[O-])O)c(=O)cc(c1ccc(O)c(c1)O)o2")
+smiles(R"c1c2c(cc(c1OC)O[C@H]1[C@H](O)[C@H]([C@@H]([C@H](O1)CO)O)O)oc(=O)cc2")
+smiles(R"c1c2c(cc(c1O)O)[C@H]([NH2+]CC2)C[C@H]1[C@@H](C=C)[C@@H](OC=C1C(=O)OC)O[C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO")
+smiles(R"c1(c2c(c(cc1O)O)C(=O)C=C(C2=O)[O-])C1=C(C(=O)c2c(C1=O)c(cc(c2)O)O)[O-]")
+smiles(R"c1c2c(c(cc1O)O)C(=O)C(=C(C2=O)[O-])C1=C(C(=O)c2c(C1=O)c(cc(c2)O)O)[O-]")
+smiles(R"C1(C2CCC(=C)C1C2)(C)C")
+smiles(R"[C@]1([C@]2(CCC(=CC2)C)C)(C(=C)CCC1)C")
+smiles(R"C1(c2ccccc2)CO1")
+smiles(R"c1(c2c(cccc2)[nH]c1)C1=N[C@H](CS1)C(=O)[O-]")
+smiles(R"c1(c2c(cccc2)[nH]c1)c1sccn1")
+smiles(R"c1c2cc(c(cc2[nH]c1C(=O)[O-])O)O")
+smiles(R"c1(c2cccc(c2O)O)ccccc1N")
+smiles(R"C1(c2c(cc(cc2)O)O)C(=O)c2c(OC1)cc(cc2)O")
+smiles(R"c1c2c(cc(c(c3ccc(O)c(c3)O)[o+]2)O[C@@H]2O[C@@H]([C@@H](O)[C@H](O)[C@H]2O)CO[C@@H]2O[C@H]([C@H](O)[C@@H](O)[C@H]2O)C)c(cc1O)[O-]")
+smiles(R"c1c2c(cc(c(c3cc(O)c(cc3)O)[o+]2)O[C@@H]2O[C@@H]([C@@H]([C@@H]([C@H]2O[C@H]2[C@@H]([C@H]([C@@H](CO2)O)O)O)O)O)CO)c(cc1[O-])[O-]")
+smiles(R"c1c2c(cc(c(c3cc(O)c(cc3)O)[o+]2)O[C@@H]2O[C@@H]([C@@H]([C@@H]([C@H]2O)O)O)CO)c(cc1O)[O-]")
+smiles(R"c1c2c(CC[C@@H]3[C@@H]2CC[C@@]2([C@H](CC[C@@H]32)O)C)cc(c1)O")
+smiles(R"c1(c2c(c(cc(n2)C(=O)[O-])O)ccc1O)O")
+smiles(R"c1c2c(cc(c([o+]2)c2ccc(O)c(c2)O)O[C@@H]2O[C@@H]([C@H]([C@@H]([C@H]2O[C@@H]2O[C@@H]([C@H]([C@@H]([C@H]2O)O)O)C(=O)[O-])O)O)CO)c(cc1O)O")
+smiles(R"c1c2c(cc(c([o+]2)c2ccc(O)c(c2)O)O[C@@H]2O[C@@H]([C@H]([C@@H]([C@H]2O)O)O)CO)c(cc1O)[O-]")
+smiles(R"c1c2c(cc(c([o+]2)c2cc(c(O)cc2)O)O[C@@H]2O[C@H](CO)[C@H]([C@H](O)[C@H]2O)O)c(cc1O[C@@H]1O[C@H](CO)[C@H]([C@H](O)[C@H]1O)O)[O-]")
+smiles(R"c1c2c(cc(c([o+]2)c2cc(c(O)cc2)O)O[C@@H]2O[C@H](CO)[C@H]([C@H](O)[C@H]2O)O)c(cc1[O-])O[C@@H]1O[C@H](CO)[C@H]([C@H](O)[C@H]1O)O")
+smiles(R"c1c2c(cc(c([o+]2)c2cc(O)c(cc2)O)O[C@@H]2O[C@@H]([C@@H]([C@H](O)[C@H]2O[C@@H]2OC[C@@H](O)[C@@H]([C@H]2O)O)O)CO[C@@H]2O[C@@H]([C@@H](O)[C@@H]([C@H]2O)O)CO)c(cc1O)O")
+smiles(R"c1c2c(cc(c([o+]2)c2cc(O)c(cc2)O)O[C@@H]2O[C@@H]([C@@H]([C@H](O)[C@H]2O[C@@H]2OC[C@@H](O)[C@@H]([C@H]2O)O)O)CO[C@@H]2O[C@@H]([C@@H](O)[C@@H]([C@H]2O)O)COC(=O)/C=C/c2ccc(cc2)O)c(cc1O)O")
+smiles(R"C1[C@]2([C@@](C[C@H](C1)O)(O)[C@@H](C[C@@H]1[C@@H]2CC[C@]2([C@H]1CC[C@@H]2[C@@H](CCCC(C)C)C)C)O)C")
+smiles(R"[C@]1([C@@]2(CC[C@H](C2(C)C)C1)C)(O)C")
+smiles(R"C1[C@@]2(C=CC[NH+]3[C@@H]2[C@]2(c4c(cccc4)NC2=C1C(=O)OC)CC3)CC")
+smiles(R"c1c2c(cc(O)c1)[C@@H](C[C@@H]1[C@@H]2CC[C@]2([C@H]1CC[C@@H]2O)C)O")
+smiles(R"c1c2CC[C@](Oc2c(c(c1O)C)C)(CCC[C@@H](CCC[C@@H](CCCC(C)C)C)C)C")
+smiles(R"c1(c2cccs2)sc(cc1)C#CCCO")
+smiles(R"c1(c2cccs2)sc(cc1)C#CCCOC(=O)C")
+smiles(R"c1(c2cccs2)sc(cc1)C#CC(O)COC(=O)C")
+smiles(R"C1[C@]2(C[C@H]2C(=C1)C)[C@@H](CCC=C(C)C)C")
+smiles(R"C1[C@]2(C[C@H]2C(=C1)C)[C@H](CCC=C(C)C)C")
+smiles(R"C1(=C2C([C@@H](CC1)CC1C(=C)[C@H](CC[C@]1(CC2)C)O)(C)C)C")
+smiles(R"C1(=C2C([C@@H](CC1)CC1C(=C)[C@H](CC[C@]1(CC2)C)OC(=O)C)(C)C)C")
+smiles(R"C1(=C2C([C@@H](C[C@@H]1O)CC1C(=C)[C@H](CC[C@]1(CC2)C)O)(C)C)C")
+smiles(R"C1c2c([C@@H](N3[C@@H]1C(=O)N1[C@H](C3=O)CCC1)C=C(C)C)[nH]c1c2cccc1")
+smiles(R"c1(c2c(C(=O)c3c(C2=O)cccc3OC)c(c2c1C[C@](C[C@@H]2O[C@H]1C[C@@H]([C@@H]([C@@H](O1)C)O)[NH3+])(C(=O)C)O)O)O")
+smiles(R"c1(c2c(C(=O)c3c(C2=O)cccc3OC)c(c2c1C[C@](C[C@@H]2O[C@H]1C[C@@H]([C@@H]([C@@H](O1)C)O)[NH3+])(C(=O)CO)O)O)O")
+smiles(R"C1C2=CC(=O)CC[C@@]2([C@@H]2[C@@H](C1)[C@@H]1CC[C@@H]([C@]1(CC2)C)O)C")
+smiles(R"C1C2=CC(=O)CC[C@@]2([C@@H]2[C@@H](C1)[C@@H]1CC[C@@H]([C@]1(CC2)C)OC(=O)C)C")
+smiles(R"c1(c2c(c(=O)cc(c3ccccc3)o2)c(O)cc1O[C@@H]1O[C@H](C(=O)[O-])[C@H]([C@H](O)[C@H]1O)O)OC")
+smiles(R"c1(c2c(c(=O)cc(c3ccccc3)o2)c(O)cc1O)OC")
+smiles(R"c1c2c(c(=O)cc(c3ccccc3)o2)c(O)c(O)c1O[C@@H]1O[C@H](C(=O)[O-])[C@H]([C@H](O)[C@H]1O)O")
+smiles(R"c1c2c(c(=O)cc(c3ccc(cc3)O)o2)c(O)c(c1[O-])[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1OC1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)O)O)CO")
+smiles(R"c1c2c(c(=O)cc(c3ccc(cc3)O)o2)c(O)c(O)c1O[C@@H]1O[C@H](C(=O)[O-])[C@H]([C@H](O)[C@H]1O)O")
+smiles(R"c1c2c(c(=O)cc(c3ccc(O)c(c3)O)o2)c(cc1O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)C(=O)[O-])O")
+smiles(R"c1c2c(C(=O)C[C@@H](c3cc(O)c(cc3)OC)O2)c(cc1O[C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO[C@@H]1O[C@H]([C@H](O)[C@@H](O)[C@H]1O)C)O")
+smiles(R"c1c2c(C(=O)C[C@@H](c3cc(O)c(cc3)OC)O2)c(cc1[O-])O")
+smiles(R"c1c2c(C(=O)C[C@H](O2)c2ccc(cc2)O)c(cc1OC)O")
+smiles(R"c1c2c(c(=O)cc(o2)c2ccc(O)c(c2)O)c(cc1O[C@H]1[C@@H]([C@@H](O)[C@H](O)[C@@H](CO)O1)O)O")
+smiles(R"c1c2c(c(=O)cc(o2)c2ccc(O)c(c2)O)c(cc1[O-])O")
+smiles(R"c1c2c(c(=O)c(c(o2)c2cc(O)c(O)c(c2)O)[O-])c(cc1O)O")
+smiles(R"C1[C@]2([C@@H](C(=C)C1)C2)C(C)C")
+smiles(R"C1[C@@]2([C@H](C(=C)C1)C2)C(C)C")
+smiles(R"C1[C@@]2([C@H]([C@@H](C1=O)C)C2)C(C)C")
+smiles(R"C1[C@@]2([C@H]([C@@H]([C@@H]1O)C)C2)C(C)C")
+smiles(R"c1(c2c([nH]c1)cccc2)C[C@@H](C(=O)[O-])NO")
+smiles(R"c1(c2c([nH]c1)cccc2)C[C@@H](C(=O)[O-])N(O)O")
+smiles(R"c1c2c(OC[C@]3(c4c(cc(cc4)O)O[C@@H]23)O)cc(O)c1CC=C(C)C")
+smiles(R"c1(c2c(O)cccc2)ccccc1")
+smiles(R"c1(c2c(O)c(ccc2)O)ccccc1")
+smiles(R"c1c2O[C@H](c3ccc(c(c3)O)O)[C@H](C(=O)c2c(cc1[O-])O)O")
+smiles(R"C1CC1(C(=O)[O-])[NH3+]")
+smiles(R"C1C=C2[C@]34[C@H](C1=O)Oc1c3c(C[C@H]2[NH+](CC4)C)ccc1OC")
+smiles(R"C1CC2(C3C(C(C1)(C)C)C2CC=C3C)C")
+smiles(R"c1cc2c(c3c1c1c(c4c(cc1)cc1c(c4)OCO1)N(C3)C)OCO2")
+smiles(R"c1cc2c(c3c1c1c(c4c(cc1)cc1c(c4)OCO1)[n+](C)c3)OCO2")
+smiles(R"c1cc2c(c3c1cc1c(c3)OCO1)N(Cc1c2c(cc2c1OCO2)O)C")
+smiles(R"c1c(c2c(cc1O)cccc2O)O")
+smiles(R"c1c(c2c(cc1O)[o+]c(c(c2)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)c1cc(c(c(c1)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)O)O)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO")
+smiles(R"c1c(c2c(cc1O)[o+]c(c(c2)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)c1cc(c(c(c1)O)O)O)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO")
+smiles(R"c1c(c2c(cc1O)[o+]c(c(c2)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)COC(=O)CC(=O)[O-])c1cc(c(c(c1)O)O)O)[O-]")
+smiles(R"c1cc2ccc3C=C[C@@H]([C@@H](c3c2cc1)O)O")
+smiles(R"C1CC2=C(CC[C@@]2(CC2=C(CC[C@H]2[C@H]1C)C)C)C(C)C")
+smiles(R"C1C[C@]2(CCCC(=C2C=C1C(C)C)C)C")
+smiles(R"C1CC2(CCCC(=C2C=C1C(C)C)C)C")
+smiles(R"c1c(c2c(c([C@H]3[C@H](O[C@@H]4O[C@@H]([C@@H](O)[C@H](O)[C@H]4O)CO)[C@H]([C@@H]([C@H](O3)CO)O)O)c1[O-])oc(cc2=O)c1ccc(cc1)O)O")
+smiles(R"C1=C([C@]2(CC[C@H](C2)C(=C)C)[C@@H](CC1)C)C")
+smiles(R"C1C(=C2[C@]([C@@H]3[C@H]1CC(C3)(C)C)(C)CC2)C")
+smiles(R"C1C=C2C[C@H](CC[C@@]2([C@H]2CC[C@@]3(C(=O)CC[C@H]3[C@H]12)C)C)O")
+smiles(R"C1C=C2C[C@H](CC[C@@]2([C@H]2CC[C@@]3(C(=O)CC[C@H]3[C@H]12)C)C)OS(=O)(=O)[O-]")
+smiles(R"C1CC2C[C@@H]([C@H](C(=O)OC)C1[NH+]2C)O")
+smiles(R"C1CC2C[C@@H]([C@H](C(=O)OC)C1[NH+]2C)OC(=O)c1ccccc1")
+smiles(R"c1cc2c(C(=O)c3c(ccc(c3O)O)C2=O)cc1")
+smiles(R"c1cc2c(C(=O)c3c(ccc(c3O)O[C@H]3[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O3)C2=O)cc1")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@]23[C@@H]1[C@@H]1CC[C@@H]([C@]1(C[C@H]2O3)C)C(=O)C)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2(C2=CC[C@@]3(C)[C@H]([C@H]12)CC[C@@H]3C(=O)C)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC=C([C@]1(CC2)C)C(=O)C)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC[C@@]([C@]1(CC2)C)(C(=O)C)O)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC[C@@]([C@]1(CC2)C)(C(O)C)O)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC[C@@]([C@]1(CC2=O)C)(C(=O)CO)O)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC[C@@]([C@]1(C[C@@H]2O)C)(C(=O)COC(=O)C)O)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC[C@@]([C@]1(C[C@@H]2O)C)(C(=O)CO)O)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC[C@@]([C@]1(C[C@@H]2O)C)(C(=O)COS(=O)(=O)[O-])O)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC[C@@H]([C@]1(CC2)C)C(=O)C)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC[C@@H]([C@]1(CC2)C)C(=O)CO)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1CC[C@@H]([C@]1(C[C@H]2O)C)C(=O)C)C")
+smiles(R"C1CC2=CC(=O)CC[C@@]2([C@@H]2[C@@H]1[C@@H]1C[C@H]([C@@H]([C@]1(CC2)C)C(=O)C)O)C")
+smiles(R"C1CC2CC(=O)[C@H](C(=O)OC)C1[NH+]2C")
+smiles(R"C1=C(C2[C@@H]3[C@H](C1)[C@@]2(CC[C@H]3C(C)C)C)C")
+smiles(R"C1=C([C@]2([C@@H](CC1=O)C)C[C@@H](CC2)C(=C)C)C")
+smiles(R"C1C[C@]2([C@@H](CC[C@@H]2C(=O)C)[C@@H]2CC[C@@H]3CC(=O)CC[C@@]3([C@@H]12)C)C")
+smiles(R"C1C[C@]2([C@@H](CC[C@@H]2C(=O)C)[C@@H]2CC[C@H]3CC(=O)CC[C@@]3([C@@H]12)C)C")
+smiles(R"C1=C([C@]2([C@@H](C[C@@H]1O)C)C[C@@H](CC2)C(=C)C)C")
+smiles(R"c1cc2c(OC[C@]3(c4c(cc(cc4)O)O[C@@H]23)O)c(c1O)CC=C(C)C")
+smiles(R"c1cc2c(OC[C@H]3c4c(cc(cc4)O)O[C@@H]23)cc1O")
+smiles(R"c1c(c2c(O[C@@H]([C@H](C2=O)O)c2ccc(O)c(c2)O)c(c1O)O)O")
+smiles(R"c1cc2c(oc(=O)cc2)c2c1occ2")
+smiles(R"c1cc2c(oc(=O)cc2)c2c1O[C@@H](C2)C(O)(C)C")
+smiles(R"c1(c(c2[nH]c1Cc1c(c(c([nH]1)Cc1c(c(c(Cc3[nH]c(C2)c(c3CC(=O)[O-])CCC(=O)[O-])[nH]1)CCC(=O)[O-])CC(=O)[O-])CCC(=O)[O-])CC(=O)[O-])CC(=O)[O-])CCC(=O)[O-]")
+smiles(R"c1(Cc2[nH]cc(c2CC(=O)[O-])CCC(=O)[O-])[nH]c(Cc2[nH]c(Cc3[nH]c(c(CC(=O)[O-])c3CCC(=O)[O-])CO)c(c2CCC(=O)[O-])CC(=O)[O-])c(c1CCC(=O)[O-])CC(=O)[O-]")
+smiles(R"C1(=CC=C2[C@]34[C@H]1Oc1c3c(C[C@H]2[NH+](CC4)C)ccc1OC)OC")
+smiles(R"c1ccc2c(c1)cccc2")
+smiles(R"c1ccc2c(c1)CCC(=O)O2")
+smiles(R"c1(ccc2c(c1)C(=O)CC[C@]12OC([C@@H]([C@@H]1O)O)O)C(=O)[O-]")
+smiles(R"c1ccc2c(c1)C(=O)C=C(C2=O)C")
+smiles(R"c1(ccc2c(c1)[n+]1cn2[C@H]2O[C@H](CO)[C@H]([C@H]2O)OP(=O)(O[C@@H](CNC(=O)CC[C@]2(C3=C(C4=[N+]5[Co-3]671(N3[C@@H]([C@@]1([N+]6=C([C@H]([C@@]1(CC(=O)N)C)CCC(=O)N)C(=C1[N+]7=C(C=C5C([C@@H]4CCC(=O)N)(C)C)[C@@H](CCC(=O)N)[C@]1(C)CC(=O)N)C)C)[C@@H]2CC(=O)N)C)C)C)C)[O-])O")
+smiles(R"c1(ccc2c(c1)[n+]1cn2[C@H]2O[C@H](CO)[C@H]([C@H]2O)OP(=O)(O[C@@H](CNC(=O)CC[C@]2(C3=C(C4=[N+]5[Co-4]671N3[C@@H]([C@@]1([N+]6=C([C@H]([C@@]1(CC(=O)N)C)CCC(=O)N)C(=C1[N+]7=C(C=C5C([C@@H]4CCC(=O)N)(C)C)[C@@H](CCC(=O)N)[C@]1(C)CC(=O)N)C)C)[C@@H]2CC(=O)N)C)C)C)O)O")
+smiles(R"c1(cc(c2c(c1)n(c1c(c2=O)cccc1)C)O)O")
+smiles(R"c1ccc2c(c1)[nH]cc2CC(=O)N")
+smiles(R"c1ccc2c(c1)[nH]c(c(c2=O)[O-])C")
+smiles(R"c1(ccc2c(c1)occ(c2=O)c1ccccc1)OC")
+smiles(R"c1(ccc2c(c1)OC(C(C2=O)c1ccc(cc1)OC)O)O")
+smiles(R"c1(cc(c2c(c1)oc(cc2=O)c1ccc(cc1)O)O)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O[C@H]1[C@@H]([C@@](CO1)(O)CO)O)O)O)CO")
+smiles(R"c1ccc2cccc3C(=O)C(=O)c1c23")
+smiles(R"c1(cc(c2ccccc2c1O)O)C(=O)[O-]")
+smiles(R"C1CCC2=CC[C@@H](C[C@@]2([C@H]1C)C)C(=C)C")
+smiles(R"c1(c(Cc2c(c(c([nH]2)C=O)C)CC)[nH]c2/C(=C\3/[C@H]([C@@H](C(=N3)/C=C\3/C(=C(C(=O)N3)C=C)C)C)CCC(=O)[O-])/[C-](C(=O)c12)C(=O)OC)C")
+smiles(R"c1(c(Cc2c(c(c([nH]2)C=O)C)CC)[nH]c2/C(=C\3/[C@H]([C@@H](C(=N3)CC3C(=C(C(=O)N3)C=C)C)C)CCC(=O)[O-])/[C-](C(=O)c12)C(=O)OC)C")
+smiles(R"c1c(c(c2c(c(=O)c(c(o2)c2ccc(O)c(c2)O)[O-])c1O)O)O")
+smiles(R"C1C(=C)C2[C@@H]3[C@H](C1)[C@@]2(CC[C@H]3C(C)C)C")
+smiles(R"C1CC[C@]2([C@H](C1(C)C)CC[C@]([C@@H]2C/C=C(/C)\C=C)(O)C)C")
+smiles(R"C1CC[C@]2([C@H](C1(C)C)CC[C@]([C@@H]2CC[C@@](C=C)(C)O)(O)C)C")
+smiles(R"C1CC[C@@]2([C@H](CCC[C@]2(C1)C)C)O")
+smiles(R"C1(=C/C(=C/2\C(=NC(=O)C(=C2)[O-])O)/C(=NC1=O)O)[O-]")
+smiles(R"C1=C(C[C@@]2(C(=O)C(=C[C@H]2[C@]2([C@@H]([C@H]([C@]3(C(C)(C)[C@H]3[C@H]12)OC(=O)CCC)OC(=O)CCC)C)O)C)O)CO")
+smiles(R"C1=C(C[C@@]2(C(=O)C(=C[C@H]2[C@]2([C@@H]([C@H]([C@]3(C(C)(C)[C@H]3[C@H]12)OC(=O)CCC)O)C)O)C)O)CO")
+smiles(R"C1CCC([C@]1(C1=CC=C(CC1)C)C)(C)C")
+smiles(R"C1(CCCC1)O")
+smiles(R"C1CCCC1=O")
+smiles(R"c1cccc2c1c1c(s2)ccc(c1O)O")
+smiles(R"C1(C(=CCC2C1(CCCC2(C)C)C)C)CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C")
+smiles(R"c1cccc2c1c(cc(n2)C(=O)[O-])O")
+smiles(R"c1cccc2c1C=CC(O2)(C(=O)[O-])O")
+smiles(R"c1(ccc(c2c1C[C@@H]1C(=C([C@]3([C@@H](C1)[C@@H](C(=C(C3=O)C(=O)N)[O-])[NH+](C)C)O)[O-])C2=O)O)N(C)C")
+smiles(R"c1cccc2c1c(c[nH]2)CC(O)C(=O)[O-]")
+smiles(R"c1c(ccc2c1c(c[nH]2)CC(=O)[O-])O")
+smiles(R"C1CC(CC2C1(C)O2)C(=C)C")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2)cc(c(c1O)C(=O)CCCCC)O)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc2c(c1O)[C@@H]1CCC[C@](O2)(O1)C)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc2c(c1O)[C@H]1[C@@H](O2)OCC1)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc2c(c1O)[C@@H]([C@H](O2)O)CCC(=O)C)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc2c(c1O)[C@@H]([C@H](O2)O)CCOC(=O)C)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc2c(c1O)[C@@H]([C@H](O2)O)CCO)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc(c(c1O)[C@H](CCCCC)O)O)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc(c(c1O)[C@H](CCC[C@@H](C)O)O)O)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc(c(c1O)[C@H](CCC[C@H](C)O)O)O)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc(c(c1O)[C@H](CCCC(=O)C)O)O)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc(c(c1O)[C@@H](CO)CCC(=O)C)[O-])O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc(c(c1O)[C@@H](CO)CCOC(=O)C)[O-])O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc(c(c1O)[C@@H](CO)CCO)O)O)O")
+smiles(R"c1(cc(cc2c1C(=O)c1c(C2=O)cc(c(c1O)C(=O)CCCCC)O)[O-])O")
+smiles(R"c1ccc(c2c1C(=O)C=C(C2=O)[O-])O")
+smiles(R"c1c(cc(c2c1C(=O)C(=CC2=O)[O-])O)O")
+smiles(R"c1cc(cc2c1c(=O)c(co2)c1ccc(cc1)O)O")
+smiles(R"c1cc(cc2c1c(=O)c(co2)c1ccc(cc1O)O)O")
+smiles(R"c1cccc2c1C(=O)N(C(C(=O)N2)Cc1ccccc1)C")
+smiles(R"c1cccc2c1nc1c(cc(cc1)OCCC(C)CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CCC=C(C)C)n2")
+smiles(R"c1cc(cc2c1nccc2[C@H]([C@@H]1C[C@@H]2[C@](C[N@@H+]1CC2)(C=C)O)O)OC")
+smiles(R"c1cccc2c1NC(=O)C2=C")
+smiles(R"c1cccc2c1[nH]c1c(cc(cc1)OCCC(C)CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CCC=C(C)C)[nH]2")
+smiles(R"c1cc(cc2c1[nH]cc2CCNC(=O)C)OC")
+smiles(R"c1cccc2c1[nH]cc2C/C=N/O")
+smiles(R"c1cccc2c1[nH]c(=O)cc2C(=O)[O-]")
+smiles(R"c1c(cc(c2c1oc(cc2=O)c1cc(c(c(c1)OC)OC)OC)O)[O-]")
+smiles(R"c1c(cc(c2c1oc(cc2=O)c1cc(c(c(c1)OC)O)OC)O)[O-]")
+smiles(R"c1c(ccc2c1OC(C(C2=O)c1ccc(cc1)O)O)O")
+smiles(R"c1c(cc(c2c1oc(cc2=O)c1cc(c(c(c1)O)O)OC)O)[O-]")
+smiles(R"c1c(cc(c2c1[o+]c(c(c2)[O-])c1cc(c(cc1)O)O)[O-])O")
+smiles(R"c1c(cc(c2c1OC(C(C2=O)c1ccc(cc1)O)O)O)[O-]")
+smiles(R"c1c(cc(c2c1oc(cc2=O)c1cc(c(c(c1)O)O)O)O)[O-]")
+smiles(R"c1c(cc(c2c1oc(c(c2=O)[O-])c1cc(c(c(c1)OC)O)O)O)O")
+smiles(R"c1cccc2c1OC(C(=O)N2)O")
+smiles(R"c1cccc2c1OC(C(=O)N2O)O")
+smiles(R"c1cccc2c1O[C@@H](CC2O)c1ccccc1")
+smiles(R"c1c(ccc2c1O[C@H]([C@@H](C2=O)c1ccc(cc1)O)O)O")
+smiles(R"c1(c(ccc2ccccc12)C(=O)[O-])O")
+smiles(R"c1(ccc(c2ccc(cc12)C(=O)[O-])O)O")
+smiles(R"c1(cc(cc2cc(cc(c12)O)O)O)O")
+smiles(R"C1(=C(/C(=C/c2cc(c(cc2)O)CC=C(C)C)/OC1=O)[O-])c1cc(c(cc1)O)CC=C(C)C")
+smiles(R"C1(=C(/C(=C/c2ccc(cc2)O)/OC1=O)[O-])c1ccc(cc1)O")
+smiles(R"C1CCC(C2=CC[C@@H]([C@]([C@H]12)(CC[C@](C=C)(C)O)C)C)(C)C")
+smiles(R"C1CCC(C2=CC[C@@H]([C@]([C@H]12)(CC[C@@](C=C)(C)O)C)C)(C)C")
+smiles(R"C1CCC(C2=CC[C@@H]([C@]([C@H]12)(CC/C(=C/CO)/C)C)C)(C)C")
+smiles(R"C1CCC(C2=CC[C@@H]([C@]([C@H]12)(CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C)C)C)(C)C")
+smiles(R"c1cccc2cccnc12")
+smiles(R"c1cccc2ccncc12")
+smiles(R"C1(CCC[C@]2([C@H]1CC[C@@H]1[C@]32C[C@H](C(=C1)C)CC3)C)(C)C")
+smiles(R"C1(CCC[C@]2([C@H]1CC[C@H]1C[C@H]3C[C@@]21CCC3=C)C)(C)C")
+smiles(R"[C@]1(CCC[C@@]2([C@@H]1[C@@H]([C@@]13CC(=C)[C@H](CC[C@@H]23)C1)C=O)C)(C)C(=O)[O-]")
+smiles(R"[C@]1(CCC[C@@]2([C@@H]1[C@@H]([C@@]13CC(=C)[C@@H](CC[C@@H]23)C1)C(=O)[O-])C)(C)C(=O)[O-]")
+smiles(R"c1cccc2NC(=O)Cc12")
+smiles(R"c1cccc2NC(=O)C(c12)O")
+smiles(R"c1cccc2[nH]ccc12")
+smiles(R"c1cccc2[nH]cc(c12)CC(=O)[O-]")
+smiles(R"c1cccc2[nH]cc(c12)C(=O)[O-]")
+smiles(R"c1cccc2[nH]cc(c(=O)c12)[O-]")
+smiles(R"c1ccccc1")
+smiles(R"c1c(cc(c(c1Br)[O-])Br)C#N")
+smiles(R"c1(cc(c(c(c1)Br)[O-])Br)C(=O)[O-]")
+smiles(R"c1(ccc(cc1)Br)SCC(=O)C(=O)[O-]")
+smiles(R"c1ccc(cc1)C")
+smiles(R"c1(ccccc1)c1ccccc1")
+smiles(R"c1(ccccc1)C=C")
+smiles(R"c1cccc(c1)CC")
+smiles(R"c1cc(ccc1C(c1ccc(cc1)O)(C)C)O")
+smiles(R"c1cc(ccc1C(c1ccc(cc1)O)(C)CO)O")
+smiles(R"c1cc(ccc1)/C=C/c1cc(cc(c1)O)O")
+smiles(R"C1=C(CC=C(C1)C(C)C)C")
+smiles(R"C1=C(CCC(=C1)C(C)C)C")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C/C(=C/C1C(/C=C(/C=C/C=C(/C=C/C2=C(CCCC2(C)C)C)\C)\C)O1)/C)/C")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C1=C(CCCC1(C)C)C)\C)\C)/C)/C")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C1C(=CCCC1(C)C)C)\C)\C)/C)/C")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C/C(=C/C(C(/C=C(/C=C/C=C(/C=C/C1=C(CCCC1(C)C)C)\C)\C)O)O)/C)/C")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C=C(/CCC=C(C)C)\C)\C)\C)/C)/C")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C=C(/C=O)\C)\C)\C)/C)/C")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/[C@H]1C(=C[C@@H](CC1(C)C)O)C)\C)\C)/C)/C")
+smiles(R"C1CC(C(=C(C1)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C=C(/C(=O)[O-])\C)\C)\C)/C)/C)(C)C")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/CO)\C)\C)/C)/C")
+smiles(R"C1CCC(C(=C1C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=O)\C)\C)/C)/C)(C)C")
+smiles(R"C1CCC(C(=C1C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=O)\C)/C)/C)(C)C")
+smiles(R"c1(cc(cc(c1)CCCCCCC/C=C\C/C=C\CC=C)O)O")
+smiles(R"c1(cc(cc(c1)CCCCCCC/C=C\C/C=C\CC=C)O)OC")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C/C(=C\CO)/C)/C")
+smiles(R"C1CCC(C(=C1C)/C=C/C(=C/C=C/C(=C/C=C/C=O)/C)/C)(C)C")
+smiles(R"C1(=C(CCCC1(C)C)C)/C=C/C(=C/C=C\C(=C\COC(=O)CCCCCCCCCCCCCCC)\C)/C")
+smiles(R"C1CCC(=C(C1(C)C)/C=C/C(=C/C=C\C(=C\C=O)\C)/C)C")
+smiles(R"c1(c(c(c(c(c1C)CCCCCCCCCC)O)OC)OC)O")
+smiles(R"C1(C(=C(CCC1)C)/C=C/C(=C/C=C/C(=C/CO)/C)/C)(C)C")
+smiles(R"C1(C(=C(CCC1)C)/C=C/C(=C/C=C/C(CCO)C)/C)(C)C")
+smiles(R"C1(C(=C(CCC1)C)C=CC(=CC=CC(=CCO)C)C)(C)C")
+smiles(R"C1C(C(=C(CC1)C)/C=C/C(=C/C=C/C(=C/C=O)/C)/C)(C)C")
+smiles(R"C1C(C(=C(CC1)C)C=CC(=CC=CC(=CC=O)C)C)(C)C")
+smiles(R"C1CC(C(=C(C1)C)/C=C/C(=C/C=C\C(=C\CO)\C)/C)(C)C")
+smiles(R"C1(CCCC(=C1/C=C/C(=C/C=C/C(=C/COC(=O)CCCCCCCCCCCCCCC)/C)/C)C)(C)C")
+smiles(R"C1(CCCC(=C1C=CC(=CC=CC(=CC(=O)[O-])C)C)C)(C)C")
+smiles(R"C1CCC(C(=C1C)/C=C/C(=C/C=C/C(=O)C)/C)(C)C")
+smiles(R"C1CCC(=C(C1(C)C)/C=C/C(=O)C)C")
+smiles(R"C1(=CCC(CC1)C(=C)C)C=O")
+smiles(R"C1(CCCC(=C1/C=C/C(=C\OC1OC(=O)C(=C1)C)/C)C)(C)C")
+smiles(R"c1(ccc(cc1)C(=C(Cl)Cl)c1ccc(cc1)Cl)Cl")
+smiles(R"c1cccc(c1)C(CC#N)C(=O)OC")
+smiles(R"c1(ccccc1)/C=C/CO")
+smiles(R"c1ccccc1/C=C/C=O")
+smiles(R"c1c(ccc(c1)/C=C/C(=O)CC(=O)/C=C/c1ccc(c(c1)OC)O)O")
+smiles(R"c1cccc(c1/C=C/C(=O)C(=O)[O-])O")
+smiles(R"c1(c(ccc(c1)/C=C/C(=O)NCC(=O)[O-])O)OC")
+smiles(R"c1c(cccc1)CCC(=O)[O-]")
+smiles(R"c1(c(ccc(c1)CC=C)O)OC")
+smiles(R"c1cc(ccc1CCC(=O)OCc1ccccc1)OC(=O)[C@H]1CC[C@@H](CC1)C[NH3+]")
+smiles(R"c1c(c(ccc1/C=C/C(=O)OCCCCCCCCCCCCCCCC(=O)[O-])O)OC")
+smiles(R"c1(c(cc(cc1)/C=C/C=O)OC)O")
+smiles(R"c1(c(cc(cc1)/C=C/CO)OC)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO")
+smiles(R"c1c(ccc(c1)/C=C\C(=O)[O-])O")
+smiles(R"c1ccc(c(c1)/C=C\C(=O)[O-])O")
+smiles(R"c1(ccc(cc1)/C=C\C(=O)[O-])O[C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO")
+smiles(R"C1(=CCC(=CC1)C)[C@@H](CCC=C(C)C)C")
+smiles(R"C1(=CCC(=CC1)C)[C@@H](CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)C")
+smiles(R"c1(ccc(cc1)C[C@@H](C(=O)N[C@H](C(=O)N[C@H](C(=O)N1[C@@H](CCC1)C(=O)N[C@@H](Cc1ccccc1)C(=O)[O-])Cc1cnc[nH]1)[C@@H](C)CC)NC(=O)[C@@H](NC(=O)[C@@H](NC(=O)[C@H](CC(=O)[O-])[NH3+])CCCNC(=[NH2+])N)C(C)C)O")
+smiles(R"c1(ccc(cc1)C[C@@H](C(=O)N[C@H](C(=O)N[C@H](C(=O)N1[C@@H](CCC1)C(=O)[O-])Cc1cnc[nH]1)[C@@H](C)CC)NC(=O)[C@@H](NC(=O)[C@@H](NC(=O)[C@H](CC(=O)[O-])[NH3+])CCCNC(=[NH2+])N)C(C)C)O")
+smiles(R"c1ccc(cc1)C[C@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(ccc(cc1)C[C@@H](C(=O)[O-])N(O)O)O")
+smiles(R"c1(ccccc1)C(C[NH2+]C)O")
+smiles(R"c1cc(ccc1CC[NH2+]C)O")
+smiles(R"c1(ccccc1)CC[NH3+]")
+smiles(R"C1(CCC(C=C1)CC([NH3+])C(=O)[O-])O")
+smiles(R"c1(ccccc1)C/C=N\O")
+smiles(R"c1cc(ccc1)C(C#N)O")
+smiles(R"c1ccccc1C/C=N/O")
+smiles(R"c1(ccccc1)CC=O")
+smiles(R"c1(ccccc1)CC(=O)C")
+smiles(R"c1cccc(c1)CC(=O)C(=O)[O-]")
+smiles(R"c1c(ccc(c1)CC(=O)C(=O)[O-])O")
+smiles(R"C1(CC=C(C=C1)CC(=O)C(=O)[O-])O")
+smiles(R"C1(CCC(C=C1)CC(=O)C(=O)[O-])O")
+smiles(R"c1ccccc1CC(=O)N")
+smiles(R"c1ccccc1CC(=O)[O-]")
+smiles(R"c1ccccc1C(C(=O)OC)CC(=O)[O-]")
+smiles(R"c1c(cccc1)C(C(=O)[O-])CO")
+smiles(R"c1cc(c(c(c1)C)C(=O)[O-])O")
+smiles(R"c1c(c(ccc1CC(=O)[O-])O)O")
+smiles(R"C1(=CC=C(CC1)[C@@H](CCC=C(C)C)C)C")
+smiles(R"c1ccccc1[C@H](CC(=O)[O-])[NH3+]")
+smiles(R"c1ccccc1[C@H](/C(=N/C)/C)O")
+smiles(R"c1c(c(ccc1[C@H](C[NH2+]C)O)O)O")
+smiles(R"c1cc(ccc1)[C@H](C#N)O")
+smiles(R"c1cccc(c1)[C@H](C)O")
+smiles(R"c1cccc(c1)[C@@H](C(=O)[O-])O")
+smiles(R"c1cccc(c1)[C@H](C(=O)[O-])O")
+smiles(R"c1(ccc(cc1)Cl)CC#N")
+smiles(R"c1(ccc(cc1)Cl)CC(=O)[O-]")
+smiles(R"c1(c(c(c(c(c1Cl)Cl)Cl)Cl)Cl)[O-]")
+smiles(R"c1(c(c(cc(c1Cl)Cl)Cl)Cl)[O-]")
+smiles(R"c1(c(cc(cc1)Cl)Cl)O")
+smiles(R"c1(c(c(c(c(c1Cl)Cl)[O-])Cl)Cl)[O-]")
+smiles(R"c1(c(cccc1)Cl)C(=O)[O-]")
+smiles(R"c1(ccccc1)CNC=O")
+smiles(R"c1cccc(c1)CN=C=S")
+smiles(R"c1ccccc1C[NH3+]")
+smiles(R"c1(ccccc1)C=O")
+smiles(R"c1cc(ccc1)CO")
+smiles(R"C1CC(CC(C1C)O)C(=C)C")
+smiles(R"c1(c(cccc1)C(=O)/C=C/C=C(\C(=O)[O-])/O)N")
+smiles(R"c1ccc(c(c1)C(=O)C[C@@H](C(=O)[O-])[NH3+])NC=O")
+smiles(R"c1ccc(c(c1)C(=O)C[C@H](C(=O)[O-])[NH3+])NC=O")
+smiles(R"c1ccccc1C(=O)C(C)O")
+smiles(R"c1cc(ccc1C(=O)C)O")
+smiles(R"c1(ccccc1)COC(=O)C")
+smiles(R"c1ccccc1C(=O)C(=O)C")
+smiles(R"c1cc(ccc1C(=O)CO)O")
+smiles(R"c1(c(cccc1)C=O)NC=O")
+smiles(R"c1(c(c(c(cc1)C)O)N)C(=O)[O-]")
+smiles(R"c1(c(ccc(c1)C)O)O")
+smiles(R"c1(c(cccc1C)O)O")
+smiles(R"c1c(c(ccc1)C=O)O")
+smiles(R"c1cccc(c1)C(=O)[O-]")
+smiles(R"c1ccccc1C(=O)OC")
+smiles(R"c1cccc(c1)C(=O)OCc1ccccc1")
+smiles(R"C1CC(CC=C1C(=O)[O-])C(=C)C")
+smiles(R"C1CC(CC(C1(C)O)O)C(=C)C")
+smiles(R"c1c(c(ccc1)C(=O)OCC(CC)CCCC)C(=O)OCC(CC)CCCC")
+smiles(R"c1(c(c(cc(c1C(=O)[O-])CCCCC)O)C/C=C(/C)\CCC=C(C)C)O")
+smiles(R"c1(c(c(cc(c1C(=O)[O-])CCCCC)O)C/C=C(/CCC=C(C)C)\C)O")
+smiles(R"c1(cc(cc(c1C(=O)[O-])CCCCC)O)O")
+smiles(R"c1(ccccc1C(=O)OC)N")
+smiles(R"c1(ccccc1C(=O)[O-])C=O")
+smiles(R"c1(c(ccc(c1)C=O)OC)OC")
+smiles(R"c1cccc(c1C(=O)[O-])C(=O)CCC(=O)[O-]")
+smiles(R"c1(c(c(c(c(c1)C)O)OC)OC)O")
+smiles(R"c1c(c(ccc1)C(=O)[O-])C(=O)[O-]")
+smiles(R"c1cc(ccc1C(=O)[O-])C(=O)[O-]")
+smiles(R"c1cccc(c1C(=O)[O-])NC")
+smiles(R"c1cccc(c1C(=O)[O-])NC=O")
+smiles(R"c1cccc(c1C(=O)[O-])NC(=O)C")
+smiles(R"c1(ccccc1C(=O)[O-])NC(=O)c1ccccc1")
+smiles(R"c1(ccccc1C(=O)[O-])NC(=O)CC(=O)[O-]")
+smiles(R"c1c(cc(cc1C(=O)[O-])N)O")
+smiles(R"c1(ccc(cc1C(=O)[O-])[N+](=O)[O-])N")
+smiles(R"c1(ccc(cc1C(=O)[O-])[N+](=O)[O-])O")
+smiles(R"c1c(c(ccc1C=O)O)O")
+smiles(R"c1cc(c(cc1)C(=O)[O-])O")
+smiles(R"c1cc(ccc1C(=O)[O-])OC")
+smiles(R"c1c(c(ccc1C(=O)[O-])O)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"c1cc(c(cc1C(=O)[O-])O)O")
+smiles(R"C1(C(C(=CC=C1)C(=O)[O-])O)O")
+smiles(R"c1(ccc(cc1)C=O)S(=O)(=O)[O-]")
+smiles(R"c1(ccc(cc1)CO)S(=O)(=O)[O-]")
+smiles(R"c1(ccccc1)CSC#N")
+smiles(R"c1(c(cccc1)I)O")
+smiles(R"c1(cc(c(c(c1)I)Oc1cc(I)c(O)c(c1)I)I)CC(C(=O)[O-])[NH3+]")
+smiles(R"c1(cc(c(c(c1)I)Oc1cc(I)c(O)c(c1)I)I)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(cc(c(c(c1)I)Oc1cc(I)c(OS(=O)(=O)[O-])c(c1)I)I)CC(C(=O)[O-])[NH3+]")
+smiles(R"c1cc(ccc1)N")
+smiles(R"c1(ccccc1)NC")
+smiles(R"c1cccc(c1)N(C)C")
+smiles(R"C1CCCCC1NC=O")
+smiles(R"c1(ccc(cc1NC(=O)c1ccccc1)OC)C(=O)[O-]")
+smiles(R"c1(ccccc1N)C(=O)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(c(cccc1)N)C(=O)CC(=O)C(=O)[O-]")
+smiles(R"c1(ccc(cc1)N(C(=O)C)O)c1ccccc1")
+smiles(R"c1(ccc(cc1)N)C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-]")
+smiles(R"c1(c(cccc1)N)C(=O)[O-]")
+smiles(R"c1cc(ccc1N)C(=O)[O-]")
+smiles(R"c1(ccc(cc1N)C(=O)[O-])O")
+smiles(R"C1CCCCC1[NH3+]")
+smiles(R"c1(ccccc1)/[N+](=N/c1ccc(cc1)N(C)C)/[O-]")
+smiles(R"c1(ccc(cc1)N)O")
+smiles(R"c1(ccccc1)NO")
+smiles(R"c1(ccccc1)N(=O)(C)C")
+smiles(R"c1(ccc(cc1)NOC(=O)C)c1ccccc1")
+smiles(R"c1(cc(ccc1N)O)C(=O)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(cccc(c1N)O)C(=O)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(ccc(cc1)N=O)N(C)C")
+smiles(R"c1(ccc(cc1)NO)N(C)C")
+smiles(R"c1c(ccc(c1N)O)O")
+smiles(R"c1c(ccc(c1)[N+](=O)[O-])[C@H]([C@H](NC(=O)C(Cl)Cl)COC(=O)C)O")
+smiles(R"c1c(ccc(c1)[N+](=O)[O-])[C@H]([C@H](NC(=O)C(Cl)Cl)CO)O")
+smiles(R"c1cccc(c1[N+](=O)[O-])[O-]")
+smiles(R"c1(c(cccc1)N)S(=O)(=O)[O-]")
+smiles(R"c1ccccc1O")
+smiles(R"C1CCCCC1=O")
+smiles(R"C1CCCCC1O")
+smiles(R"c1(ccc(cc1)O)C")
+smiles(R"c1cc(cc(c1)O)C")
+smiles(R"c1ccccc1OC")
+smiles(R"c1(c(cc(cc1)Oc1c(cc(cc1I)C[C@@H](C(=O)[O-])[NH3+])I)I)O")
+smiles(R"c1c(cc(cc1O)c1ccccc1)O")
+smiles(R"c1(ccccc1O)c1ccccc1S(=O)[O-]")
+smiles(R"c1(cc(c(cc1)Oc1cc(I)c(O)c(I)c1)I)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(ccc(cc1)O)c1cn2c(c(n1)Cc1ccccc1)nc(c2OS(=O)(=O)[O-])Cc1ccccc1")
+smiles(R"c1(ccc(cc1)O)c1cn2c(c([nH]1)Cc1ccccc1)nc(c2=O)Cc1ccccc1")
+smiles(R"c1(ccc(cc1)O)c1cn2c(c([nH]1)Cc1ccccc1)nc(c2=O)Cc1ccc(cc1)O")
+smiles(R"c1(ccc(cc1)O)c1cnc(c(n1)Cc1ccccc1)NC(=O)Cc1ccccc1")
+smiles(R"c1(ccc(cc1)O)c1cnc(c(n1)Cc1ccccc1)NC(=O)Cc1ccc(cc1)O")
+smiles(R"c1cc(ccc1O)C=C")
+smiles(R"c1(ccc(cc1)OCc1cc(oc1)CNC=O)CCNC(=O)CC[C@H](NC(=O)CC[C@H](NC(=O)CC[C@H](C(=O)[O-])[C@H](C(=O)[O-])CCC(=O)[O-])C(=O)[O-])C(=O)[O-]")
+smiles(R"c1(ccc(cc1)OCc1cc(oc1)C[NH3+])CCNC(=O)CC[C@H](NC(=O)CC[C@H](NC(=O)CC[C@H](C(=O)[O-])[C@H](C(=O)[O-])CCC(=O)[O-])C(=O)[O-])C(=O)[O-]")
+smiles(R"c1cc(ccc1O)/C=C/C")
+smiles(R"c1cc(ccc1OC)/C=C/C")
+smiles(R"C1=C(CCC(C1=O)C(=C)C)C")
+smiles(R"c1c(cc(cc1OC)/C=C/c1ccc(cc1)O)OC")
+smiles(R"c1(c(c(c(cc1O)C/C=C(/[CH])\C)O)C)C")
+smiles(R"c1(cc(ccc1O)/C=C/C)OC")
+smiles(R"c1c(ccc(c1)O)/C=C/C(=O)C")
+smiles(R"c1(ccc(cc1)O)/C=C/C(=O)CC(=O)/C=C/c1ccc(cc1)O")
+smiles(R"c1cc(ccc1O)/C=C/COC(=O)C")
+smiles(R"c1(cc(ccc1O)/C=C/C(=O)NCCc1ccc(cc1)O)OC")
+smiles(R"c1c(ccc(c1)O)/C=C/C(=O)NCCCCNC(=[NH2+])N")
+smiles(R"c1(ccc(cc1)O)/C=C/C(=O)[O-]")
+smiles(R"c1(cccc(c1)O)/C=C/C(=O)[O-]")
+smiles(R"c1(ccccc1O)/C=C/C(=O)[O-]")
+smiles(R"c1cccc(c1O)CCC(=O)[O-]")
+smiles(R"c1(cccc(c1O)CCC(=O)[O-])O")
+smiles(R"c1(ccc(cc1O)C[C@@H]1[NH+](CCc2c1cc(c(c2)OC)O)C)O")
+smiles(R"c1cc(ccc1O)C[C@@H](C(=O)N[C@H](C(=O)[O-])CCCNC(=[NH2+])N)[NH3+]")
+smiles(R"c1cc(ccc1O)C[C@@H](C(=O)[O-])NO")
+smiles(R"c1(ccc(cc1)O)CC#N")
+smiles(R"c1(cc(ccc1[O-])CC[NH3+])N(=O)=O")
+smiles(R"c1(ccc(cc1)O)C(C[NH3+])O")
+smiles(R"c1(ccc(cc1O)CC[NH3+])O")
+smiles(R"c1cc(ccc1O)C/C=N\O")
+smiles(R"c1(c(c(c(c(c1)O)C)C)O)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(\C)/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"c1(cc(ccc1[O-])CC=O)[N+](=O)[O-]")
+smiles(R"c1(cc(ccc1[O-])CC(=O)[O-])[N+](=O)[O-]")
+smiles(R"c1(ccc(cc1)O)C(C(=O)[O-])O")
+smiles(R"C1(C(=CC=CC1O)C)(C(=O)[O-])O")
+smiles(R"c1(ccc(cc1O)[C@H](C[NH3+])O)O")
+smiles(R"c1(ccc(cc1)O)[C@@H](C(=O)[O-])O")
+smiles(R"c1(ccccc1OC)I")
+smiles(R"c1(c(cccc1)O)CO")
+smiles(R"c1(cc(ccc1)O)CO")
+smiles(R"c1c(ccc(c1)O)C=O")
+smiles(R"c1cc(cc(c1)O)C=O")
+smiles(R"c1cc(cc(c1)OC)O")
+smiles(R"c1c(cc(c(c1O)C(=O)c1c(cc(cc1C(=O)OC)O)OC)O)C")
+smiles(R"c1c(cc(c(c1O)C(=O)c1c(cc(cc1C(=O)[O-])O)OC)O)C")
+smiles(R"c1c(cc(c(c1OC(=O)c1cc(c(c(c1)O)O)O)O)O)C(=O)[O-]")
+smiles(R"c1c(ccc(c1OC)OC)/C=C/C")
+smiles(R"c1c(c(c(cc1)OC)O)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/[CH])\C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"c1c(c(c(cc1)OC)O)C/C=C(/[CH])\C")
+smiles(R"c1cc(cc(c1OC)OC)CO")
+smiles(R"c1ccc(c(c1)OC(=O)C)C(=O)[O-]")
+smiles(R"c1c(ccc(c1)OC(=O)[C@H]1CC[C@@H](CC1)C[NH3+])CCC(=O)[O-]")
+smiles(R"c1(ccc(cc1)O)C(=O)[O-]")
+smiles(R"c1(cccc(c1)O)C(=O)[O-]")
+smiles(R"c1(cc(ccc1O)CO)OC")
+smiles(R"c1(cc(c(c(c1)OC)O)OC)/C=C/C(=O)[O-]")
+smiles(R"c1(cc(c(c(c1)OC)O)OC)/C=C/C(=O)OC[C@H]1OC(=O)[C@@H]([C@H]([C@@H]1O)O)O")
+smiles(R"c1(cc(c(c(c1)OC)O)OC)/C=C/C(=O)OC(C(=O)[O-])C(=O)[O-]")
+smiles(R"C1(C=CC(C=C1)O)(C(=O)[O-])CC(=O)C(=O)[O-]")
+smiles(R"c1(c(ccc(c1)O)C(=O)[O-])NC(=O)c1ccccc1")
+smiles(R"c1cccc(c1O)N")
+smiles(R"c1(c(c(ccc1)O)N)C(=O)[O-]")
+smiles(R"c1(ccc(cc1)O)[O]")
+smiles(R"c1(ccc(cc1)O)O")
+smiles(R"c1cc(cc(c1)O)O")
+smiles(R"c1ccc(c(c1)O)O")
+smiles(R"C1CCC(CC1=O)O")
+smiles(R"c1(cc(cc(c1)O)O)C")
+smiles(R"c1(c(c(ccc1)O)O)CC")
+smiles(R"c1(c(ccc(c1)O)O)C/C=C(/CCC=C(C)C)\C")
+smiles(R"c1c(c(c(cc1)O)O)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/[CH])\C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"c1(c(ccc(c1)O)O)C/C=C(/CCC=C(C)C)\CO")
+smiles(R"c1c(c(c(cc1)O)O)C/C=C(/[CH])\C")
+smiles(R"c1(cc(c(cc1)O)OC)/C=C/C(=O)CC(=O)/C=C/c1cc(c(cc1)O)OC")
+smiles(R"c1(cc(c(cc1)O)OC)/C=C/C(=O)CC(=O)CCc1cc(c(cc1)O)OC")
+smiles(R"c1(cc(c(cc1)O)OC)CCC(=O)CC(=O)CCc1cc(c(cc1)O)OC")
+smiles(R"c1c(ccc(c1O)O)/C=C/C(=O)NCCCC[NH3+]")
+smiles(R"c1(cccc(c1O)O)/C=C/C(=O)[O-]")
+smiles(R"c1c(cc(c(c1)O)O)CCC(=O)[O-]")
+smiles(R"c1cc(cc(c1O)O)/C=C/C(=O)O[C@H](Cc1cc(O)c(cc1)O)C(=O)[O-]")
+smiles(R"c1c(ccc(c1O)O)C[C@H](C(=O)[O-])O")
+smiles(R"c1cc(cc(c1O)OC)C(=O)[O-]")
+smiles(R"c1(cc(cc(c1O)O)Cl)Cl")
+smiles(R"c1(ccc(cc1)O)OC(=O)C")
+smiles(R"c1(c(c(cc(c1O)OC)O)C)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"c1(c(c(c(c(c1O)OC)OC)O)C)C/C=C(/[CH])\C")
+smiles(R"c1(c(ccc(c1)O)O)C(=O)[O-]")
+smiles(R"c1c(c(c(cc1)O)O)C(=O)[O-]")
+smiles(R"c1c(c(c(cc1O)O)C(=O)[O-])C")
+smiles(R"c1(cc(c(cc1)O)O)C(=O)Oc1c(c(cc(c1)O)O)C(=O)[O-]")
+smiles(R"c1(c(c(c(c(c1O)OC)O)O)C)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"c1(c(c(c(cc1)O)O)C(=O)[O-])C(=O)[O-]")
+smiles(R"c1(c(cc(c(c1)O)O)C(=O)[O-])C(=O)[O-]")
+smiles(R"c1(cc(c(cc1)[O-])O)[N+](=O)[O-]")
+smiles(R"c1(c(cc(cc1)O)O)O")
+smiles(R"c1(cc(cc(c1)O)O)O")
+smiles(R"c1c(c(c(cc1O)O)O)C")
+smiles(R"c1(c(cc(cc1O)O)O)C(=O)c1ccccc1")
+smiles(R"c1(c(cc(cc1O)O)O)C(=O)CC(C)C")
+smiles(R"c1(cc(c(c(c1)O)O)O)C(=O)[O-]")
+smiles(R"c1(c(c(ccc1)O)O)S(=O)(=O)[O-]")
+smiles(R"c1(ccc(cc1)OS(=O)(=O)[O-])c1cn2c(c([nH]1)Cc1ccccc1)nc(c2=O)Cc1ccc(cc1)OS(=O)(=O)[O-]")
+smiles(R"c1(ccc(cc1)OS(=O)(=O)[O-])c1cnc(c(n1)Cc1ccccc1)NC(=O)Cc1ccc(cc1)OS(=O)(=O)[O-]")
+smiles(R"c1(ccc(cc1)S(=O)(=O)[O-])C(=O)[O-]")
+smiles(R"C1CC(=C)C=C2[C@H]1[C@H](CC[C@@H]2[C@H](CCC=C(C)C)C)C")
+smiles(R"C1C(=C)C=CC(C1)C(C)C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)CC[C@@H](C2)O)/[C@@H]2CC[C@H]([C@H](C)CCCC(C)C)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)CC[C@@H](C2)O)/[C@@H]2CC[C@H]([C@H](C)CCCC(C)(C)O)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)CC[C@@H](C2)O)/[C@@H]2CC[C@H]([C@H](C)/C=C/[C@@H](C(C)C)C)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)CC[C@@H](C2)O)/[C@@H]2CC[C@H]([C@H](C)CC[C@H](C(C)(C)O)O)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)[C@H](C[C@@H](C2)O)O)/[C@@H]2CC[C@H]([C@H](C)CCCC(C)(C)O)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)[C@H](C[C@@H](C2)O)O)/[C@@H]2CC[C@H]([C@H](C)CC[C@H](C(C)(C)O)O)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)[C@H](C[C@@H](C2)O)O)/[C@@H]2CC[C@H]([C@H](C)CCC(=O)C(C)(C)O)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)[C@H](C[C@@H](C2)O)O)/[C@@H]2CC[C@H]([C@H](C)CC(C(=O)C(C)(C)O)O)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)[C@H](C[C@@H](C2)O)O)/[C@@H]2CC[C@H]([C@H](C)CC=O)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)[C@H](C[C@@H](C2)O)O)/[C@@H]2CC[C@H]([C@H](C)CCO)[C@@]12C")
+smiles(R"C1CC/C(=C\C=C\2/C(=C)[C@H](C[C@@H](C2)O)O)/[C@@H]2CC[C@H]([C@H](C)CC(=O)[O-])[C@@]12C")
+smiles(R"C1(=CCC(=C(C)C)CC1)C")
+smiles(R"C1=C(CCC(=CCCC(=C1)C)C)C(C)C")
+smiles(R"C1C=C(CCC=C(CCC1=C(C)C)C)C")
+smiles(R"C1C=C(CCC=C(CCC1C(=C)C)C)C")
+smiles(R"C1(CC=C(CCC=C(CC=C1)C)C)(C)C")
+smiles(R"C1(=CCCC(=CCC(C=CC1=O)(C)C)C)C")
+smiles(R"C1(=CCCC(=CCC(C=CC1O)(C)C)C)C")
+smiles(R"C1(CCCC(=CCCC(=C)C=C1)C)(C)C")
+smiles(R"C1/C(=C(\CCC=C(C)C)/C)/CCC(=C1)C")
+smiles(R"C1C(=CC/C(=C(/CCC=C(C)C)\C)/C1)C")
+smiles(R"C1C=C(CCC=C(CC[C@H]1C(=C)C)C)C")
+smiles(R"C1C=C(CCC=C(CC[C@H]1C(=C)C=O)C)C")
+smiles(R"C1C=C(CCC=C(CC[C@H]1C(=C)CO)C)C")
+smiles(R"C1C=C(CCC=C(CC[C@H]1C(=C)C(=O)[O-])C)C")
+smiles(R"C1CC=C(CC[C@@H](C=CC1=C)C(C)C)C")
+smiles(R"C1CC=C(CC[C@H](C=CC1=C)C(C)C)C")
+smiles(R"C1CC(=C(C)C)C(=O)C[C@@H]1C")
+smiles(R"c1(cccc(CC(=O)[O-])c1)O")
+smiles(R"C1CC(=CC[C@@H]1/C(=C/CC=C(C)C)/C)C")
+smiles(R"C1C=C(C=C[C@H]1[C@@H](CCC=C(C)C)C)C")
+smiles(R"C1C=C(CC[C@@H]1C(O)(C)C)C")
+smiles(R"C1C=C(CC[C@H]1C(O)(C)C)C")
+smiles(R"C1C(C(=C(C[C@H]1O)C)/C=C/C(=C/C=C/C(=C/C=O)/C)/C)(C)C")
+smiles(R"[C@]1(C=CC=C[C@@H]1O)(C(=O)[O-])O")
+smiles(R"C1(CC/C(=C\C(=O)C(=O)[O-])/C=C1)O")
+smiles(R"C1CCC([C@H]2[C@]1([C@@H]1[C@@](CC2)([C@H]2[C@](CC1)([C@@H]([C@](CC2)(C)O)CC[C@H](C1=CCC(=CC1)C)C)C)C)C)(C)C")
+smiles(R"C1CCC([C@@H]2[C@@]1([C@H]1[C@H](CC2)[C@@H](C(=CC1)C=C)C)C)(C)C")
+smiles(R"C1CCC([C@@H]2[C@@]1([C@H]1[C@H](CC2)[C@@H](C(=C[C@H]1O)C=C)C)C)(C)C")
+smiles(R"C1CCC([C@H]2CC[C@@]34CC(=C)[C@@H](CC[C@H]4[C@]12C)C3)(C)C")
+smiles(R"C1CCC([C@H]2CC[C@@]34C=C([C@@H](CC[C@H]4[C@]12C)C3)C)(C)C")
+smiles(R"C1CCC([C@@H]2CC[C@]3([C@@]4(CC[C@@H]5[C@](CC[C@H](O)C5(C)C)([C@H]4CC[C@@H]3[C@@]12C)C)C)C)(C)C")
+smiles(R"C1CC[C@@]([C@@H]2CCc3cc(ccc3[C@@]12C)C(C)C)(C)C=O")
+smiles(R"C1CC[C@@]([C@@H]2CCc3cc(ccc3[C@@]12C)C(C)C)(C)CO")
+smiles(R"C1CC[C@@]([C@@H]2CCc3cc(ccc3[C@@]12C)C(C)C)(C)C(=O)[O-]")
+smiles(R"C1CC[C@@]([C@@H]2CC=C3C=C(CC[C@@H]3[C@@]12C)C(C)C)(C)CO")
+smiles(R"C1CC[C@@]([C@@H]2CC=C3C[C@](CC[C@@H]3[C@@]12C)(C=C)C)(C)C=O")
+smiles(R"C1CC[C@@]([C@@H]2CC=C3C[C@](CC[C@@H]3[C@@]12C)(C=C)C)(C)CO")
+smiles(R"C1CC[C@@]([C@@H]2CCC3=CC(=CC[C@@H]3[C@@]12C)C(C)C)(C)C=O")
+smiles(R"C1CC[C@@]([C@@H]2CCC3=CC(=CC[C@@H]3[C@@]12C)C(C)C)(C)CO")
+smiles(R"C1CC[C@@]([C@@H]2CC=C3C=C(CC[C@@H]3[C@@]12C)C(C)C)(C)C(=O)[O-]")
+smiles(R"C1CC[C@]([C@@H]2CC=C3C=C(CC[C@@H]3[C@@]12C)C(C)C)(C=O)C")
+smiles(R"C1CC[C@]([C@@H]2CC=C3C=C(CC[C@@H]3[C@@]12C)C(C)C)(C(O)O)C")
+smiles(R"C1CCC([C@@H]2CC[C@@]3([C@H](CC[C@@H]4[C@]5(CC[C@@H]([C@@H]5CC[C@@]34C)C(=C)C)C)[C@@]12C)C)(C)C")
+smiles(R"C1CCC([C@@H]2CC[C@@]3([C@H](CC[C@@H]4[C@]5(CC[C@@H]([C@@H]5CC[C@@]34C)C(C)(C)O)C)[C@@]12C)C)(C)C")
+smiles(R"C1=C(CC[C@@H]2C(=C)CC[C@@H](C(C)C)[C@H]12)C")
+smiles(R"C1=C(CC[C@@H]2C(=C)CC[C@H](C(C)C)[C@@H]12)C")
+smiles(R"C1=C(CC[C@H]2C(=C)CC[C@@H](C(C)C)[C@H]12)C")
+smiles(R"C1CCC([C@@H]2CC=C([C@@H]([C@@]12C)CC/C(=C/CO)/C)C)(C)C")
+smiles(R"C1=C(CC[C@@H]2C(=CC[C@@H](C(C)C)[C@H]12)C)C")
+smiles(R"C1=C(CC[C@@H]2[C@@H](C(=C)CC1)CC2(C)C)C")
+smiles(R"C1=C(CC[C@@H]2[C@H](C(=C)CC1)CC2(C)C)C")
+smiles(R"C1=C(CC[C@H]2[C@H](C(=C)CC1)CC2(C)C)C")
+smiles(R"C1=C(CC[C@@H](C1)C(=C)C)CO")
+smiles(R"C1=C(C=C[C@H](C1)[C@H](CCC=C(C)C)C)C")
+smiles(R"C1=C(CC[C@@H](C1=O)C(=C)C)C")
+smiles(R"C1(=CC=C[C@@H]([C@H]1[NH3+])O)C(=O)[O-]")
+smiles(R"C1(=CC=C[C@@H]([C@@H]1O)O)CC")
+smiles(R"C1(=CC=C([C@H]([C@H]1O)O)C(=O)[O-])C(C)C")
+smiles(R"c1c(ccc[n+]1C)C(=O)[O-]")
+smiles(R"c1c(c(c(c(n1)C)O)CO)CO")
+smiles(R"C1CCCC(=N1)C(=O)[O-]")
+smiles(R"c1(c(c(c(cn1)COP(=O)([O-])[O-])C=O)O)C")
+smiles(R"C1=CC=C(C(=N)C1=O)C(=O)[O-]")
+smiles(R"C1CCCC[NH2+]1")
+smiles(R"C1CC(CC(=O)C1C)C(=C)C")
+smiles(R"C1=CC=CC(=O)C1=O")
+smiles(R"c1c(ccc(O)c1OC)/C=C/CO")
+smiles(R"c1c(ccc(O)c1OC)/C=C/COC(=O)C")
+smiles(R"c1ccc(c(O)c1O)O")
+smiles(R"C1C(CCC(O)(C)C1=O)C(=C)C")
+smiles(R"C1=CC(=C(C(=O)C)C(=O)[C@]1(c1c(O)c(C)c(O)c(c1O)C(=O)C)C)[O-]")
+smiles(R"C1/C(=C/C)/C(=O)O[C@@H]2CCN3CC=C(COC(=O)[C@](O)([C@@H]1C)C)[C@H]23")
+smiles(R"C1/C(=C/C)/C(=O)O[C@@H]2CC[N+]3(CC=C(COC(=O)[C@](O)([C@@H]1C)C)[C@H]23)[O-]")
+smiles(R"C1=CC=C(C(=O)[O-])[C@@H]([C@H]1OC(=C)C(=O)[O-])[NH3+]")
+smiles(R"C1=CC=C(C(=O)[O-])[C@@H]([C@H]1OC(=C)C(=O)[O-])O")
+smiles(R"C1(=C/C(=C\C(=O)[O-])/OC1=O)Cl")
+smiles(R"[C@]1(C(=C)[C@H]2CC[C@@H]1C2)(CCC=C(C)C)C")
+smiles(R"C1(=CC[C@H](CC1)C1=CCCC(C1)(C)C)C")
+smiles(R"C1(=CC[C@H](CC1)C(=C)CCC=C(C)C)C")
+smiles(R"C1(=C(C[C@H](CC1(C)C)O)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/[C@]12[C@](O1)(C[C@H](CC2(C)C)O)C)\C)\C)/C)/C")
+smiles(R"C1(=C(C[C@H](CC1(C)C)O)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C1=C(CCCC1(C)C)C)\C)\C)/C)/C")
+smiles(R"C1(=C(C[C@H](CC1(C)C)O)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C1=C(C[C@H](CC1(C)C)O)C)\C)\C)/C)/C")
+smiles(R"C1(=C(C[C@H](CC1(C)C)O)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=O)\C)\C)/C)/C")
+smiles(R"C1(=C(C[C@H](CC1(C)C)O)C)C=O")
+smiles(R"C1(=C(C[C@H](CC1(C)C)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C1=C(C[C@H](CC1(C)C)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)C)\C)\C)/C)/C")
+smiles(R"C1(=CC[C@@H](CC1=O)C(=C)C)C")
+smiles(R"C1(=CC[C@H](CC1=O)C(=C)C)C")
+smiles(R"C1=C(C[C@H]([C@@H](C1=O)O)[NH3+])C(=O)[O-]")
+smiles(R"C1=C(C)[C@H]([C@H](C=C1)O)O")
+smiles(R"c1c(C[C@@H](C(=O)[O-])[N+](C)(C)C)nc[nH]1")
+smiles(R"c1c(C[C@@H](C(=O)[O-])O)[nH]cn1")
+smiles(R"c1c(C[C@@H](NC(=O)CC(=O)[O-])C(=O)[O-])c2c([nH]1)cccc2")
+smiles(R"c1cc(Cl)c(cc1NC(=O)CC(=O)[O-])Cl")
+smiles(R"C1(CC(C=N1)O)C(=O)[O-]")
+smiles(R"c1cc(cnc1)[C@H]1[NH+](C)CCC1")
+smiles(R"c1cc(c[n+](c1)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)CO)C(=O)N")
+smiles(R"c1(cc(c(nc1)C)O)C(=O)[O-]")
+smiles(R"c1cc(cnc1O)[C@@H]1[NH+](C)CCC1")
+smiles(R"c1cc(cnc1O)[C@H]1[NH+](C)CCC1")
+smiles(R"c1(c(ccn(c1=O)C)OC)C#N")
+smiles(R"c1(ccc(nc1)O)C(=O)[O-]")
+smiles(R"c1(ccc(nc1O)O)C(=O)[O-]")
+smiles(R"c1ccc[nH]1")
+smiles(R"C1CCCOC1=O")
+smiles(R"C1(C(C(C(OC1OP(=O)([O-])[O-])CO)O)O)NC(=O)C")
+smiles(R"c1c(cc(O)c2c1O[C@]1(C(=CC(=O)C=C1OC)C(=O)OC)C2=O)C")
+smiles(R"c1c(cc(O)c2c1O[C@@]1(C(=CC(=O)C=C1OC)C(=O)OC)C2=O)C")
+smiles(R"[C@]1(C(=CC(=O)CC1(C)C)C)(/C=C/C(=C\C=O)/C)O")
+smiles(R"[C@]1(C(=CC(=O)CC1(C)C)C)(/C=C/C(=C\C(=O)[O-])/C)O")
+smiles(R"C1CCC(=O)CC1=O")
+smiles(R"c1(cc(c(=O)cc(c1)O)[O-])C(=O)[O-]")
+smiles(R"c1c(cc(OC)c(O)c1O)C(=O)[O-]")
+smiles(R"c1ccc(O[C@H]2[C@@H]([C@H]([C@@H]([C@@H](CO)O2)O)O)O)c(c1)/C=C\C(=O)[O-]")
+smiles(R"C1CCC(=O)C(=O)C1")
+smiles(R"c1c(C)c(=O)[nH]c(=O)n1[C@H]1C[C@H](O)[C@H](O1)COP(=O)(OP(=O)([O-])OC1O[C@@H]([C@H](O)[C@H](O)[C@H]1O)CO)[O-]")
+smiles(R"c1c(C)c(=O)[nH]c(=O)n1[C@H]1C[C@H](O)[C@H](O1)COP(=O)(OP(=O)([O-])OC1O[C@@H]([C@H](O)[C@H](O)[C@H]1O)C(=O)[O-])[O-]")
+smiles(R"c1c(C)c(=O)[nH]c(=O)n1[C@H]1C[C@H](O)[C@H](O1)COP(=O)(OP(=O)([O-])OC1O[C@@H](C(=O)[C@H](O)[C@H]1O)C)[O-]")
+smiles(R"c1c(c(c(=O)oc1/C=C/CCCC/C=C/C=C/C)C=O)OC")
+smiles(R"c1c(c(c(=O)oc1/C=C/CCCC/C=C/C=C/C)CO)OC")
+smiles(R"c1c(cc(=O)oc1C(=O)[O-])C(=O)[O-]")
+smiles(R"C1C[C@H]2C3=CC[C@H]4[C@H](C)[C@@H](O)CC[C@]4(C)[C@H]3CC[C@@]2([C@H]1[C@H](C)CCC(=C)C(C)C)C")
+smiles(R"C1C[C@H]2C3=CC[C@H]4[C@H](C)[C@@H](O)CC[C@]4(C)[C@H]3CC[C@@]2([C@H]1[C@H](C)CC/C(=C/C)/C(C)C)C")
+smiles(R"C1=C([C@H]2[C@@]3([C@H]1CC(C3)(C)C)[C@@H]([C@@H](C2)O)C)C(=O)[O-]")
+smiles(R"C1=C([C@H]2[C@@]3([C@H]1CC(C3)(C)C)[C@@H](C(=O)C2)C)C(=O)[O-]")
+smiles(R"C1(=C[C@H]2[C@@]3([C@H]1CC(=O)O[C@H]3C)CC(C2)(C)C)C(=O)[O-]")
+smiles(R"C1(=C[C@H]2[C@@]3([C@H]1COC(=O)[C@@]13CO1)CC(C2)(C)C)C(=O)[O-]")
+smiles(R"C1(=C[C@H]2[C@@]3([C@H]1COC(=O)[C@@]13CO1)C=C([C@H]2C)C)C(=O)[O-]")
+smiles(R"C1(=C[C@H]2[C@@]3([C@H]1COC(=O)C3=C)CC(C2)(C)C)C(=O)[O-]")
+smiles(R"C1(=C[C@H]2[C@@]3([C@H]1COC(=O)[C@H]3C)CC(C2)(C)C)C(=O)[O-]")
+smiles(R"C1(C[C@@H]2[C@]3([C@@H](CC[C@H]3C(=C2)C)C)C1)(C)C")
+smiles(R"C1(C[C@@H]2[C@]3([C@@H](CC[C@H]3C(=C2)C=O)C)C1)(C)C")
+smiles(R"C1(C[C@@H]2[C@]3([C@@H](CC[C@H]3C(=C2)CO)C)C1)(C)C")
+smiles(R"C1(=C([C@H]2[C@@](CC1)(CCC(C2)(C)C)C)CC[C@H]1C(=CC[C@@H]2[C@@]1(CC[C@@H](C2(C)C)O)C)C)C")
+smiles(R"C1(=C([C@H]2[C@@](CC1)(CC[C@H]([C@@H]2C)C)C)CC[C@H]1C(=CC[C@@H]2[C@@]1(CC[C@@H](C2(C)C)O)C)C)C")
+smiles(R"C1C([C@@H]2CC[C@@]34[C@@H]([C@]2(CC1)C)CC[C@H](C3)[C@](C4)(C)O)(C)C")
+smiles(R"C1C([C@@H]2CC=C3[C@H]([C@]2(CC1)C)CC[C@@](C3)(C)C=C)(C)C")
+smiles(R"C1[C@@]([C@@H]2CC=C3[C@H]([C@]2(CC1)C)CC[C@@](C3)(C)C=C)(C=O)C")
+smiles(R"C1[C@@]([C@@H]2CC=C3[C@H]([C@]2(CC1)C)CC[C@@](C3)(C)C=C)(CO)C")
+smiles(R"C1[C@@]([C@@H]2CC=C3[C@H]([C@]2(CC1)C)CC[C@@](C3)(C)C=C)(C(=O)[O-])C")
+smiles(R"C1=C[C@H]2CCCC[C@H]2[C@H](c2cc(c(c(=O)o2)C=O)OC)[C@H]1C")
+smiles(R"C1=C([C@H]2C[C@@H]3CCC(=C(CC[C@@]2(CC1)C)C3(C)C)C)C")
+smiles(R"C1(C[C@@H]2[C@]([C@@H](C1)O)(CC[C@@]1(C2=CC[C@H]2[C@]1(CC[C@@H]1[C@@]2(CC[C@@H]([C@@]1(CO)C)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O[C@@H]1O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)CO)O)O)C(=O)[O-])C)C)C)C)(C)C")
+smiles(R"C1C[C@@H]2C[C@@H](CC[C@@]2([C@H]2CC[C@@]3(C(=O)CC[C@H]3[C@H]12)C)C)O")
+smiles(R"C1C[C@H]2C[C@@H](CC[C@@]2([C@H]2CC[C@@]3(C(=O)CC[C@H]3[C@H]12)C)C)O")
+smiles(R"C1C[C@@H]2CC(=O)CC[C@]2(C)[C@@H]2[C@@H]1[C@@H]1CC[C@@]([C@]1(CC2=O)C)(C(=O)CO)O")
+smiles(R"C1C[C@H]2CC(=O)CC[C@]2(C)[C@@H]2[C@@H]1[C@@H]1CC[C@@]([C@]1(CC2=O)C)(C(=O)CO)O")
+smiles(R"C1C[C@H]2[C@H]3[C@@H]1C(=C)[C@@]2(CC[C@@H]3C(C)C)C")
+smiles(R"C1C[C@@H]2[C@@H]([C@@]3(C1=CC(=O)CC3)C)CC[C@@]1(C(=O)CC[C@@H]21)C")
+smiles(R"C1C[C@@H]2[C@H]([C@H]1C)C=C(CC=C2C)C(C)C")
+smiles(R"C1C[C@@H]2C(O[C@]1(C)CC2)(C)C")
+smiles(R"C1(C[C@H]([C@@]2(CC[C@]3([C@]4([C@@H]([C@@]5([C@H]([C@]([C@H](CC5)O[C@H]5[C@@H]([C@H]([C@@H]([C@H](O5)C(=O)[O-])O)O)O)(CO)C)CC4)C)CC=C3[C@@H]2C1)C)C)C)O)(C)C")
+smiles(R"C1(C[C@H]([C@@]2(CC[C@]3([C@]4([C@@H]([C@@]5([C@H]([C@]([C@H](CC5)O)(CO)C)CC4)C)CC=C3[C@@H]2C1)C)C)C)O)(C)C")
+smiles(R"C1C[C@@H](C[C@]23[C@H](C[C@@H]4[C@@H]([C@@]12C)CC[C@]1([C@H]4CC[C@@H]1[C@@H](CCCC(C)C)C)C)O3)O")
+smiles(R"C1C[C@@H](C[C@@]23[C@@H](C[C@@H]4[C@@H]([C@@]12C)CC[C@]1([C@H]4CC[C@@H]1[C@@H](CCCC(C)C)C)C)O3)O")
+smiles(R"C1C[C@@H](CC2=CC=C3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)CCC=C(C)C)C)O")
+smiles(R"C1C[C@@H](CC2=CC=C3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)/C=C/[C@@H](C(C)C)C)C)O")
+smiles(R"C1C[C@@H](CC2=CC=C3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)/C=C/[C@@H](C(C)C)C)C)OC(=O)CCCCCCCCCCCCCCC")
+smiles(R"C1C[C@@H](CC2=CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)/C=C/C(=C)C(C)C)C)O")
+smiles(R"C1C[C@@H](CC2=CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)CCC(=C)C(C)C)C)O")
+smiles(R"C1C[C@@H](CC2=CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)/C=C/C(=C)C(C)C)C)OC(=O)C")
+smiles(R"C1C[C@@H](CC2=CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCCC(C)C)C)C)O")
+smiles(R"C1C[C@@H](CC2=CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)CC[C@@H](C(C)C)C)C)O")
+smiles(R"C1C[C@@H](C[C@@]2(CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)/C=C/[C@@H](C(C)C)C)C)O)O")
+smiles(R"C1C[C@@H](CC2=CC[C@H]3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)CCC=C(C)C)C)O")
+smiles(R"C1C[C@@H](CC2=CC[C@H]3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)CCCC(C)C)C)O")
+smiles(R"C1C[C@@H](CC2=CC[C@H]3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)CCCC(C)C)C)OC(=O)CCCCCCC/C=C\CCCCCCCC")
+smiles(R"C1C[C@@H](CC2=CC[C@H]3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)CCCC(C)(C)O)C)O")
+smiles(R"C1C[C@@H](CC2=CC[C@H]3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)CCCC(C)CO)C)O")
+smiles(R"C1C[C@@H](CC2=CC[C@H]3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)[C@@H](CCC(C)C)O)C)O")
+smiles(R"C1C[C@@H](CC2=CC[C@@H]3[C@@H]([C@@]12C)CC[C@@]1(C)[C@H]3C[C@@H]2O[C@]3(CC[C@@](O3)(C)CO)[C@H]([C@H]12)C)O")
+smiles(R"C1C[C@@H](CC2=CC[C@@H]3[C@@H]([C@@]12C)CC[C@@]1(C)[C@H]3C[C@@H]2O[C@]3(CC[C@@](O3)(C)CO)[C@H]([C@H]12)C)O[C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO")
+smiles(R"C1C[C@@H](CC2=CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)CC[C@@]1(C(C)C)[C@@H](C)O1)C)O")
+smiles(R"C1C[C@H](CC2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1O)C)O")
+smiles(R"C1C[C@@H](CC2=CC[C@@H]3[C@H](CC[C@]4(C)[C@H](CC[C@@H]34)C(=O)C)[C@@]12C)O")
+smiles(R"C1C[C@@H](CC2=C[C@H]([C@H]3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)CCCC(C)C)C)O)O")
+smiles(R"C1C[C@@H](CC2=C[C@H]([C@H]3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)CCCC(C)(C)O)C)O)O")
+smiles(R"C1C[C@@H](CC2=C[C@H]([C@H]3[C@H]4[C@](CC[C@@H]3[C@@]12C)([C@H](CC4)[C@H](C)CCCC(C)CO)C)O)O")
+smiles(R"C1=C[C@H](CCC1=C)C(C)C")
+smiles(R"C1C[C@@H](CC=C1C)C(=C)C")
+smiles(R"C1C[C@H](CC=C1C)C(=C)C")
+smiles(R"C1=C[C@H](CCC=C(CC[C@H]1C(C)(C)O)C)C")
+smiles(R"C1C[C@H](C(=C)C)C(=O)C[C@@H]1C")
+smiles(R"C1C[C@@H](C([C@H]2[C@]1(C1=C(CC2)[C@](CC1)([C@@H](CC/C=C(/CCC=C(C)C)\C)C)C)C)(C)C)O")
+smiles(R"C1C[C@H](C[C@H]2[C@@]1(C)[C@H]1CC[C@]3([C@@H](CC[C@@H]3[C@H](C)[C@H](C[C@H](C(C)C)C)O)[C@@H]1CC2)C)O")
+smiles(R"C1C[C@H](C[C@@H]2[C@]1([C@@H]1[C@@H](CC2)[C@H]2[C@](CC1)([C@@H]([C@@H](CCC(=O)NCC(=O)[O-])C)CC2)C)C)O")
+smiles(R"C1C[C@H](C[C@@H]2[C@]1([C@@H]1[C@@H](CC2)[C@H]2[C@](CC1)([C@@H]([C@@H](CCC(=O)NCC(=O)[O-])C)CC2)C)C)OS(=O)(=O)[O-]")
+smiles(R"C1C[C@H](C[C@@H]2[C@]1([C@@H]1[C@@H](C[C@@H]2O)[C@H]2[C@](CC1)([C@H](CC2)[C@@H](CCC(=O)[O-])C)C)C)O")
+smiles(R"C1C[C@H](C[C@@H]2[C@]1([C@@H]1[C@@H](C[C@H]2O)[C@H]2[C@](CC1)([C@H](CC2)[C@@H](CCC(=O)[O-])C)C)C)O")
+smiles(R"C1C[C@H](C[C@@H]2[C@]1([C@@H]1[C@@H]([C@@H](C2)OS(=O)(=O)[O-])[C@H]2[C@](CC1)([C@H](CC2)[C@@H](CCC(=O)NCC(=O)[O-])C)C)C)O")
+smiles(R"C1C[C@H](C[C@@H]2[C@]1([C@@H]1[C@@H]([C@@H]([C@@H]2O)O)[C@H]2[C@](CC1)([C@H](CC2)[C@@H](CCC(=O)NCCS(=O)(=O)[O-])C)C)C)O")
+smiles(R"C1C[C@@H](C[C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=C)C(C)C)C)C)O")
+smiles(R"C1C[C@@H](C[C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC=C(C)C)C)C)O")
+smiles(R"C1C[C@@H](C[C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)CCCC(C)C)C)O")
+smiles(R"C1C[C@@H](C[C@@H]2CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=C)C(C)C)C)C)O")
+smiles(R"C1C[C@@H](C[C@@H]2CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)CCCC(C)C)C)O")
+smiles(R"C1C[C@@H](C([C@@H]2CC[C@]3([C@H]([C@@]12C)CC[C@@H]1[C@@]3(CC/C/1=C(/CCC=C(C)C)\C)C)C)(C)C)O")
+smiles(R"C1C[C@@H](C([C@@H]2CC[C@@]3([C@@H]([C@@]12C)C(=O)C=C1[C@]3(CC[C@@]2([C@H]1C[C@@](CC2)(C)C(=O)[O-])C)C)C)(C)C)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)O")
+smiles(R"C1C[C@@H](C([C@@H]2CC[C@@H]3[C@]4([C@@]12C4)CC[C@]1([C@]3(CC[C@@H]1[C@@H](CC[C@H](C(=C)C)C)C)C)C)(C)C)O")
+smiles(R"C1C[C@@H](C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1(C)[C@@H]2[C@H](C[C@@H]31)O[C@@]1([C@H]2C)CC[C@@H](CO1)C)O")
+smiles(R"C1C[C@@H](C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1(C)[C@@H]2[C@H](C[C@@H]31)O[C@@]1([C@H]2C)CC[C@@H](CO1)C)O[C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO")
+smiles(R"C1C[C@H](C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)NCCS(=O)(=O)[O-])C)C)O")
+smiles(R"C1C[C@H](C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)NCCS(=O)(=O)[O-])C)C)OS(=O)(=O)[O-]")
+smiles(R"C1C[C@H](C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C)O")
+smiles(R"C1C[C@@H](C[C@@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1C(=O)C)C)O")
+smiles(R"C1C[C@@H](C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1C(=O)C)C)O")
+smiles(R"C1C[C@@H](C[C@@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1O)C)O")
+smiles(R"C1C[C@H](C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)C[C@@H]([C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C)O)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)NCC(=O)[O-])C)C)O)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)NCCS(=O)(=O)[O-])C)C)O)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C)O)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@@]12C)C[C@@H]([C@]1([C@H]3CC[C@@H]1[C@H](C)CCCC(C)C)C)O)O)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@@]12C)C[C@@H]([C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)NCC(=O)[O-])C)C)O)O)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@@]12C)C[C@@H]([C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C)O)O)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@@]12C)C[C@H]([C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C)O)O)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@@]12C)CC(=O)[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C)O)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@@H](O)[C@@H]3C(C[C@H](O)[C@]4(C)[C@H](CC[C@@H]34)[C@@H](CC[C@H](C(COS(=O)(=O)[O-])CO)O)C)[C@@]12C)O")
+smiles(R"C1C[C@H](C[C@H]2C[C@@H](O)[C@H]3[C@@H]4CC[C@@H]([C@]4([C@H](C[C@@H]3[C@@]12C)O)C)[C@@H](CC[C@H](C(CO)CO)O)C)O")
+smiles(R"C1C[C@H](C[C@@H]2C[C@@H](O)[C@H]3[C@@H]4CC[C@H]([C@@H](CCCO)C)[C@]4([C@H](C[C@@H]3[C@@]12C)O)C)O")
+smiles(R"C1C[C@H](C[C@@H]2C[C@@H](O)[C@H]3[C@@H]4CC[C@H]([C@@H](CCCOS(=O)(=O)[O-])C)[C@]4([C@H](C[C@@H]3[C@@]12C)O)C)O")
+smiles(R"C1C[C@H](C[C@H]2CC(=O)[C@@H]3[C@@H]([C@@]12C)C[C@@H]([C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C)O)O")
+smiles(R"C1C[C@@H](C[C@H]([C@]1(C)O)O)C(=C)C")
+smiles(R"C1C[C@H](C[C@@H]([C@@]1(C)O)O)C(=C)C")
+smiles(R"C1(=C)[C@H](C([C@H](CC1)O)(C)C)CC/C(=C/CCC1=C(CC[C@@]2([C@H]1CC(CC2)(C)C)C)C)/C")
+smiles(R"C1C[C@@H](C[C@@H]([C@@H]1C)O)C(=C)C")
+smiles(R"C1C[C@@H](C[C@@H]([C@H]1C)O)C(=C)C")
+smiles(R"C1C[C@@H](C[C@H]([C@@H]1C)O)C(=C)C")
+smiles(R"C1C[C@@H](C[C@H]([C@H]1C)O)C(=C)C")
+smiles(R"C1C[C@H](C[C@@H]([C@@H]1C)O)C(=C)C")
+smiles(R"C1C[C@H](C[C@@H]([C@H]1C)O)C(=C)C")
+smiles(R"C1C[C@H](C[C@H]([C@@H]1C)O)C(=C)C")
+smiles(R"C1C[C@H](C[C@H]([C@H]1C)O)C(=C)C")
+smiles(R"C1C[C@@H](CC(=O)[C@@H]1C)C(=C)C")
+smiles(R"C1C[C@@H](CC(=O)[C@H]1C)C(=C)C")
+smiles(R"C1C[C@H](CC(=O)[C@@H]1C)C(=C)C")
+smiles(R"C1C[C@H](CC(=O)[C@H]1C)C(=C)C")
+smiles(R"C1C[C@H]([C@H]2[C@@]3([C@@H]1C)[C@@H]2[C@](CC3)(O)C)C(C)C")
+smiles(R"C1C[C@H]([C@H]2[C@@]3([C@@H]1C)[C@@H]2C(=C)CC3)C(C)C")
+smiles(R"C1C[C@H]([C@@H]2CC[C@]3(CC(C)([C@H]1[C@]23O)C)C)C")
+smiles(R"C1=C[C@@H]([C@@H](C(=C1)/C=C/C(=O)[O-])O)O")
+smiles(R"C1(=C[C@@H]([C@@H](C=C1C(=O)[O-])O)O)C(=O)[O-]")
+smiles(R"C1=C[C@@H]([C@@H](C=C1)O)O")
+smiles(R"C1=C([C@H]([C@@H](C=C)[C@@H](O1)O[C@H]1[C@H](O)[C@H]([C@H](O)[C@H](O1)CO)O)C[C@H]1c2c(CC[NH2+]1)c1c(cccc1)[nH]2)C(=O)OC")
+smiles(R"[C@@]1(C[C@H]([C@@H]([C@@H](C1)O)O)OC(=O)/C=C/c1cc(c(cc1)O)O)(O)C(=O)[O-]")
+smiles(R"C1(=C[C@H]([C@H]([C@@H](C1)O)O)O)C(=O)[O-]")
+smiles(R"[C@]1(C[C@H]([C@@H](C(=O)C1)O)O)(C(=O)[O-])O")
+smiles(R"c1(C[C@H](NC(=O)CC[NH3+])C(=O)[O-])cncn1C")
+smiles(R"c1(C[C@H]([NH3+])C=O)c[nH]cn1")
+smiles(R"c1(C[C@H]([NH3+])C(=O)[O-])c[nH]cn1")
+smiles(R"C1C[C@@H](O)[C@]2(CC[C@@H]3c4c(CC[C@H]3[C@H]12)cc(cc4)O)C")
+smiles(R"C1C[C@@H](O)[C@]2(CC[C@@H]3c4c(CC[C@H]3[C@H]12)cc(cc4)O[C@@H]1O[C@H](C(=O)[O-])[C@H]([C@@H]([C@H]1O)O)O)C")
+smiles(R"C1C[C@H](O)[C@]2([C@H]3[C@]1([C@@H]1CC[C@](CC1=C[C@H]3OC2=O)(C=C)C)C)C")
+smiles(R"C1C[C@H](O)C([C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@]3(CC[C@@H]1[C@H](C)CCC=C(C)C)C)C)(C)C")
+smiles(R"C1C[C@H](O)C([C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@]3(CC[C@@H]1[C@H](C)CCCC(C)C)C)C)(C)C")
+smiles(R"C1C[C@H](O)C([C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)CCC=C(C)C)C)(C)C")
+smiles(R"C1C[C@H](O)[C@@]([C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC=C(C)C)C)C)(C)C(=O)[O-]")
+smiles(R"C1C[C@H](O)[C@]([C@@H]2CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCCC(C)C)C)C)(C)CO")
+smiles(R"C1C[C@H](O)[C@@]([C@@H]2CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCCC(C)C)C)C)(C)C=O")
+smiles(R"C1C[C@H](O)C([C@@H]2CC[C@H]3[C@]4([C@](CC=C3[C@@]12C)([C@H](CC4)[C@H](C)CCC=C(C)C)C)C)(C)C")
+smiles(R"C1C[C@H](O)[C@H]([C@@H]2CCC3=C([C@@]12C)CC[C@]1(C3=CC[C@@H]1[C@H](C)CCC(=C)C(C)C)C)C")
+smiles(R"C1C[C@H](O)[C@H]([C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC=C(C)C)C)C)C")
+smiles(R"C1C[C@H](O)[C@H]([C@@H]2CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCCC(C)C)C)C)C")
+smiles(R"C1C[C@@H](O)[C@H]([C@@H]2CC[C@]3([C@H]([C@@]12C)[C@@H](C[C@@H]1[C@@]3(C[C@H](OC(=O)C)/C/1=C(\C(=O)[O-])/CCC=C(C)C)C)O)C)C")
+smiles(R"C1C[C@H](OC(=O)CCCCCCCCCCCCCCC)C([C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@]3(CC[C@@H]1[C@H](C)CCC=C(C)C)C)C)(C)C")
+smiles(R"c1ccncc1")
+smiles(R"c1ccncc1C(=O)CCC[NH2+]C")
+smiles(R"c1cc(ncc1C(=O)CCC[NH2+]C)O")
+smiles(R"c1ccncc1C(=O)CCC=O")
+smiles(R"c1ccncc1C(=O)CCC(=O)[O-]")
+smiles(R"c1cc(ncc1C(=O)CCC(=O)[O-])O")
+smiles(R"c1(c(c(ncc1CO)C)O)C[NH3+]")
+smiles(R"c1c(cncc1)C(=O)N")
+smiles(R"c1(c(cnc(c1O)C)C=O)CO")
+smiles(R"c1(c(cnc(c1O)C)COP(=O)([O-])[O-])C[NH3+]")
+smiles(R"c1(c(cnc(c1O)C)COP(=O)([O-])[O-])CO")
+smiles(R"C1CC(=N[C@@H](C1)C(=O)[O-])C(=O)[O-]")
+smiles(R"c1cc(nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OP(=O)([O-])OC1O[C@H](C)[C@H](C[C@@H]1O)O)N")
+smiles(R"c1cc(nc(=O)n1[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])[O-])N")
+smiles(R"c1c(c(nc(=O)n1[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])[O-])N)CO")
+smiles(R"c1cc(nc(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])O[C@@]1(C[C@@H](O)[C@@H](O)[C@H](O1)[C@H](O)CO)C(=O)[O-])N")
+smiles(R"c1cc(nc(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])[O-])N")
+smiles(R"C1CC[NH2+]C[C@@H]1C(=O)N")
+smiles(R"c1(C(C[NH3+])O)ccccc1")
+smiles(R"c1(c(c[nH]c(=O)n1)C)N")
+smiles(R"c1cc(N)nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC1O[C@H](C)C(=O)[C@H](O)[C@H]1O)[O-])[O-]")
+smiles(R"c1cc(N)nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC1O[C@@H]([C@H](C[C@H]1O)O)C)[O-])[O-]")
+smiles(R"c1cc(N)nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC1O[C@@H]([C@@H](O)[C@@H]([C@H]1O)O)CO)[O-])[O-]")
+smiles(R"c1cc(N)nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC1O[C@@H](C(=O)C[C@H]1O)C)[O-])[O-]")
+smiles(R"c1cc(N)nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OCC(O)C(O)C(CO)O)[O-])[O-]")
+smiles(R"c1cc(N)nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OCC(O)CO)[O-])[O-]")
+smiles(R"c1cc(N)nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@@H](C[C@H]1O)O)C)[O-])[O-]")
+smiles(R"c1cc(N)nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H](C[C@H]1O)O)C)[O-])[O-]")
+smiles(R"c1cc(N)nc(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H](C(=O)C[C@H]1O)C)[O-])[O-]")
+smiles(R"c1(C/C(=N/O)/[S-])ccccc1")
+smiles(R"C1(CC(=O)[C@@]2(CC[C@]3([C@]4([C@@H]([C@@]5([C@H]([C@]([C@H](CC5)O)(CO)C)CC4)C)CC=C3[C@@H]2C1)C)C)C)(C)C")
+smiles(R"c1(cc(O)c2ccccc2c1O)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C")
+smiles(R"C1(=C(C(=O)c2ccccc2C1=O)C)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C")
+smiles(R"c1(cc(O)c2ccccc2c1O)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"C1(=CC(=O)c2ccccc2C1=O)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"c1(c(c(O)c2ccccc2c1O)C)C/C=C(/[CH])\C")
+smiles(R"C1(=C(C(=O)c2ccccc2C1=O)C)C/C=C(/[CH])\C")
+smiles(R"c1(cc(O)c2ccccc2c1O)C/C=C(/[CH])\C")
+smiles(R"C1(=CC(=O)c2ccccc2C1=O)C/C=C(/[CH])\C")
+smiles(R"C1CC(=O)[C@]2(CC[C@@H]3c4c(CC[C@H]3[C@H]12)cc(cc4)O)C")
+smiles(R"C1CC(=O)[C@]2(CC[C@@H]3c4c(CC[C@H]3[C@H]12)cc(cc4)OS(=O)(=O)[O-])C")
+smiles(R"C1CC(=O)[C@]2([C@H]3[C@]1([C@@H]1CC[C@](CC1=C[C@H]3OC2=O)(C=C)C)C)C")
+smiles(R"c1(c(c(=O)c2c(o1)cc(cc2O)OC)OC)c1cc(c(cc1)OC)O")
+smiles(R"c1(c(c(=O)c2c(o1)cc(cc2O)[O-])OS(=O)(=O)[O-])c1cc(c(cc1)O)O")
+smiles(R"c1(c(c(=O)c2c(o1)cc(cc2O)[O-])OS(=O)(=O)[O-])c1cc(c(cc1)O)OS(=O)(=O)[O-]")
+smiles(R"c1(c(c(=O)c2c(o1)cc(cc2O)[O-])OS(=O)(=O)[O-])c1cc(c(cc1)OS(=O)(=O)[O-])O")
+smiles(R"c1(c(c(=O)c2c(o1)cc(cc2O)OS(=O)(=O)[O-])OS(=O)(=O)[O-])c1cc(c(cc1)O)OS(=O)(=O)[O-]")
+smiles(R"C1(=CC(OC(=C1)C(=O)[O-])O)C(=O)[O-]")
+smiles(R"C1=CC(=O)C(=C2[C@]1(CC[C@H]1[C@@H](C(=O)O[C@H]21)C)C)C")
+smiles(R"C1CC(=O)C(=C2[C@]1(CC[C@H]1[C@@H](C(=O)O[C@H]21)C)C)C")
+smiles(R"C1CC(=O)C=C2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC[C@H](C)C(=O)[O-])C)C")
+smiles(R"C1CC(=O)C=C2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1C(O)C=O)C")
+smiles(R"C1CC(=O)C=C2C=C[C@@H]3[C@@H]([C@@]12C)C[C@@H]([C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C)O")
+smiles(R"C1CC(=O)C=C2C[C@H]([C@H]3[C@H]4[C@]([C@H](CC4)[C@H](C)CCCC(C)C)(C)[C@H](C[C@@H]3[C@@]12C)O)O")
+smiles(R"C1CC(=O)C=C2C[C@H]([C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)CCCC(C)C)C)O")
+smiles(R"C1CC(=O)C=C2C[C@H]([C@@H]3[C@@H]([C@@]12C)C[C@@H]([C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C)O)O")
+smiles(R"c1cc(O)c(cc1/C=C/C(=O)[O-])OC")
+smiles(R"c1c(c(O)ccc1C=O)OC")
+smiles(R"C1=CC(=O)C=CC1=O")
+smiles(R"C1(=CC(=O)C(=C(C1=O)C)C)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(\C)/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"C1(=C(C(=O)C(=CC1=O)C/C=C(/[CH])\C)C)C")
+smiles(R"C1=CC(=O)C=C(C1=O)[O-]")
+smiles(R"C1(=CC(=O)C=C(C1=O)OC)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"C1(=C(C(=O)C=C(C1=O)OC)C)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"C1(=C(C(=O)C(=C(C1=O)OC)OC)C)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"C1(=C(C(=O)C(=C(C1=O)OC)[O-])C)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"C1(=C(C(=O)C(=C(C1=O)OC)OC)C)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"C1(=C(C(=O)C(=C(C1=O)OC)OC)C)C/C=C(/[CH])\C")
+smiles(R"C1(=CC(=O)C(=C(C)C)CC1)C")
+smiles(R"C1CC(=O)C[C@H]2[C@@]1(C)[C@H]1CC[C@]3([C@@H](CC[C@@H]3[C@H](C)[C@@H](O)[C@@H]([C@H](C(C)C)C)O)[C@@H]1CC2)C")
+smiles(R"C1CC(=O)C([C@@H]2CCC3=C([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC=C(C)C)C)C)C")
+smiles(R"C1CC(=O)C[C@@H]2CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCCC(C)C)C)C")
+smiles(R"C1CC(=O)C[C@@H]2CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC[C@H](C)C(=O)[O-])C)C")
+smiles(R"C1CC(=O)C[C@@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CCC1=O)C")
+smiles(R"C1CC(=O)C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CCC1=O)C")
+smiles(R"C1CC(=O)C[C@@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)CCCC(C)C)C")
+smiles(R"C1CC(=O)C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@H](C)CCCC(C)C)C")
+smiles(R"C1CC(=O)C[C@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC(=O)[O-])C)C")
+smiles(R"C1CC(=O)C[C@@H]2CC[C@@H]3[C@@H]([C@@]12C)CC[C@@]1([C@H](CC[C@@H]31)O)C")
+smiles(R"c1c(c(=O)ccn1C[C@@H](C(=O)[O-])[NH3+])[O-]")
+smiles(R"C1CC(=O)[C@H]([C@@H]2CC=C3[C@@H]([C@@]12C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCCC(C)C)C)C)C")
+smiles(R"C1(=CC(=O)[C@H]([C@@H](C1)O)O)C(=O)[O-]")
+smiles(R"C1=C(C(=O)[C@@H]([C@H]([C@@H]1O)O)O)[O-]")
+smiles(R"c1(cc(oc(=O)c1)C)[O-]")
+smiles(R"c1(CC(=O)C(=O)[O-])cc(c(cc1)O)O")
+smiles(R"C1CC(=O)N(C1=O)CC")
+smiles(R"C1CC(=O)NCCCCCC(=O)NCCC1")
+smiles(R"c1(c(c(=O)[nH]c(n1)N)N)NC[C@@H]([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)O")
+smiles(R"c1c(c(=O)[nH]c(=O)n1[C@H]1C[C@H](O)[C@H](O1)COP(=O)(OP(=O)([O-])OC1O[C@@H]([C@@H]([NH3+])[C@@H]([C@H]1O)O)C)[O-])C")
+smiles(R"c1c(c(=O)[nH]c(=O)n1[C@H]1C[C@H](O)[C@H](O1)COP(=O)(OP(=O)([O-])O[C@H]1O[C@@H]([C@@H]([NH3+])[C@@H]([C@H]1O)O)C)[O-])C")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@H]1[C@H](O)[C@H](O)[C@@H](COP(=O)(OP(=O)([O-])O[C@@H]2[C@H](O)[C@H]([C@@H](CO2)O)O)[O-])O1")
+smiles(R"c1c(c(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H](C1)O)COP(=O)([O-])[O-])C")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OP(=O)([O-])OC1OC(C)C(C(C1O)O)O")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OP(=O)([O-])OC1OC[C@@H]([C@@H]([C@H]1O)O)O")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OP(=O)([O-])OC1O[C@@H](C)[C@@H]([C@H]([C@H]1O)O)O")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OP(=O)([O-])O[C@@H]1[C@H](O)[C@@H](O)[C@@H](O1)CO")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OP(=O)([O-])O[C@H]1OC[C@@H]([C@@H]([C@H]1O)O)O")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC1O[C@@H]([C@@H]([C@@H]([C@H]1NC(=O)C)O)OS(=O)(=O)[O-])CO)[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC1O[C@@H]([C@@H]([C@@H]([C@H]1NC(=O)C)O)OS(=O)(=O)[O-])COS(=O)(=O)[O-])[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@@H]([C@@H]([C@H]1NC(=O)C)O)O)CO)[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@@H]1[C@@H]([C@H]([C@H]([C@@H](O1)C)NC(=O)C)O)NC(=O)C)[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)(OP(=O)(OC1O[C@H](C)C(=O)[C@H](O)[C@H]1O)[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)CC(CCCCCCCCCCC)O)OC(=O)CC(O)CCCCCCCCCCC)O)CO)[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)OC(=C)C(=O)[O-])O)CO)[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)[NH3+])C)[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@@H]1NC(=O)C)O)O)CO)[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])OC(=O)C[C@H](O)CCCCCCCCCCC)O)CO)[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@H](O)[C@H]1NC(=O)C)O)COP(=O)([O-])O[C@@H]1[C@@H]([C@@H](O)[C@H]([C@@H](CO)O1)O)O)[O-])[O-]")
+smiles(R"c1cc(=O)[nH]c(=O)n1[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)(OP(=O)(O[C@@H]1O[C@@H](C(=O)[C@@H]([C@H]1NC(=O)C)O)C)[O-])[O-]")
+smiles(R"c1(cc(=O)[nH]c(=O)[nH]1)C(=O)[O-]")
+smiles(R"c1(c(c(=O)[nH]c(=O)[nH]1)N)NC[C@@H]([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)O")
+smiles(R"c1(c(C(=O)OCC(CCCC)CC)cccc1)C(=O)[O-]")
+smiles(R"C1(=CC(=O)O[C@@H](C1(C)C)CC(=O)SCCNC(=O)CCNC(=O)[C@@H](C(COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1OP(=O)([O-])[O-])O)n1c2c(nc1)c(ncn2)N)[O-])[O-])(C)C)O)C")
+smiles(R"C\1(=C\C(=O)[O-])/OC(=O)C=C1")
+smiles(R"C1([C@H]2[C@](CCC1)([C@H](C(=CC2)C)CO)C)(C)C")
+smiles(R"C1([C@H]2C(=C)CC[C@@H]1C2)(C)C")
+smiles(R"C1([C@H]2CCC(=C)[C@@H]1C2)(C)C")
+smiles(R"C1[C@@H]2C(=C)[C@H](CC[C@]2([C@H]([C@@H](C2=C([C@H](C[C@@H]1C2(C)C)OC(=O)C)C)OC(=O)C)OC(=O)C)C)OC(=O)C")
+smiles(R"C1[C@@H]2C(=C)[C@H](C[C@@H]([C@]2([C@H]([C@@H](C2=C([C@H](C[C@@H]1C2(C)C)OC(=O)C)C)OC(=O)C)OC(=O)C)C)O)OC(=O)C")
+smiles(R"C1([C@H]2[C@@]([C@@H]3[C@]([C@@]4(CC[C@]5(CCC(C=C5[C@H]4CC3)(C)C)C)C)(CC2)C)(CC[C@@H]1O)C)(C)C")
+smiles(R"C1([C@H]2[C@@]([C@@H]3[C@@](CC2)([C@]2(C(=CC3)[C@H]3[C@@](CC2)([C@@H](CC(C3)(C)C)O)C)C)C)(CC[C@@H]1O)C)(C)C")
+smiles(R"[C@@]1([C@H]2[C@@]([C@@H]3[C@@](CC2)([C@]2(C(=CC3)[C@H]3[C@@](CC2)([C@@H](CC(C3)(C)C)O)C)C)C)(CC[C@@H]1O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)O[C@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O[C@H]1[C@@H]([C@@H]([C@H]([C@@H](O1)C)O)O)O)C)(CO)C")
+smiles(R"C1[C@@H]2C([C@H](C(=C1)C)C2)(C)C")
+smiles(R"C1[C@H]2C[C@H]([C@@H]3[C@@H]([C@]2(CC[C@H]1O)C)C[C@H](O)[C@@]1(C)[C@H]3CC[C@@H]1[C@@H](CCC[C@@H](C)C=O)C)O")
+smiles(R"C1[C@H]2C[C@H]([C@@H]3[C@@H]([C@]2(CC[C@H]1O)C)C[C@H](O)[C@@]1(C)[C@H]3CC[C@@H]1[C@@H](CCC[C@@H](C)CO)C)O")
+smiles(R"C1[C@H]2[C@@H]3[C@]2([C@]([C@H]1C3)(C)CCC=C(C)C)C")
+smiles(R"C1([C@H]2[C@@H](C(=CO1)C)CC[C@@H]2C)O")
+smiles(R"C1[C@H]2[C@H](O)C[C@](C1=O)(C)C2(C)C")
+smiles(R"C1[C@@H]2C(O[C@](C)(CC2)C1=O)(C)C")
+smiles(R"C1[C@@H]2C(O[C@](C)(CC2)[C@@H]1O)(C)C")
+smiles(R"C1[C@@H]2C(O[C@](C)(CC2)[C@H]1O)(C)C")
+smiles(R"C1[C@@H]2N3C/C(=C/C)/[C@H](C[C@H]3c3c1c1c(cccc1)[nH]3)[C@@]2(C=O)C(=O)OC")
+smiles(R"C1[C@H]2N3C/C(=C/C)/[C@H](C[C@H]3c3c1c1c(cccc1)[nH]3)[C@H]2CO")
+smiles(R"C1[C@@H]2N3C/C(=C/C)/[C@H](C[C@H]3c3c1c1c(ccc(c1)O)[nH]3)[C@H]2CO")
+smiles(R"C1[C@H]2O[C@@H]1O[C@@H]([C@H]2C/C=C\CCCC(=O)[O-])/C=C/[C@H](CCCCC)O")
+smiles(R"c1([C@@H]2O[C@@H]([C@H]([C@@H]([C@H]2O)O)O)CO)c(c2c(cc1[O-])oc(cc2=O)c1ccc(cc1)O)O")
+smiles(R"C1[C@@H]2OO[C@H]1[C@@H]([C@H]2C/C=C\CCCC(=O)NCCO)/C=C/[C@H](CCCCC)O")
+smiles(R"C1[C@@H]2OO[C@H]1[C@@H]([C@H]2C/C=C\CCCC(=O)[O-])/C=C/[C@H](CCCCC)O")
+smiles(R"C1[C@@H]([C@@]2([C@@H]([C@]3([C@@H]1OC3)OC(=O)C)[C@@H]([C@@]1(C[C@@H](C(=C(C1(C)C)[C@H](C2=O)OC(=O)C)C)O)O)OC(=O)c1ccccc1)C)O")
+smiles(R"C1[C@@H]([C@@]2([C@@H]([C@]3([C@@H]1OC3)OC(=O)C)[C@@H]([C@@]1(C[C@@H](C(=C(C1(C)C)[C@H](C2=O)O)C)O)O)O)C)O")
+smiles(R"C1[C@@H]([C@@]2([C@@H]([C@]3([C@@H]1OC3)OC(=O)C)[C@@H]([C@@]1(C[C@@H](C(=C(C1(C)C)[C@@H](O)C2=O)C)O)O)OC(=O)c1ccccc1)C)O")
+smiles(R"C1[C@@H](CC(=C(C1(C)C)/C=C/C(=C/C=C\C(=C\C=O)\C)/C)C)O")
+smiles(R"C1[C@H](CC=C(C1)C)[C@@](CCC=C(C)C)(C)O")
+smiles(R"C1[C@@H](CC(=C(C1(C)C)/C=C/C(=O)C)C)O")
+smiles(R"[C@@]1([C@H](C=C(C=C1)C(=O)[O-])O)(C(=O)[O-])O")
+smiles(R"C1([C@H](CC=C([C@H]1CC/C(=C/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)C)O)(C)C")
+smiles(R"C1[C@@H](CC([C@H]2CC[C@@]34C=C([C@@H](CC[C@H]4[C@]12C)C3)C)(C)C)O")
+smiles(R"C1[C@@H](CC[C@@](O)(C)C1=O)C(=C)C")
+smiles(R"C1[C@H](CC[C@](O)(C)C1=O)C(=C)C")
+smiles(R"C1[C@H](C[C@@H]2C(=C(C1)C)CC[C@@H]2C)C(=C)C")
+smiles(R"C1[C@@H](C[C@H]2CC[C@@H]1[NH+]2C)O")
+smiles(R"C1[C@H](C[C@H]2CC[C@@H]1[NH+]2C)O")
+smiles(R"C1[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@]2(C1)C)CC[C@]1([C@H]3CC[C@@H]1[C@@H](CCC[C@@H](C)C(=O)[O-])C)C)O)O")
+smiles(R"C1[C@H](C[C@H]2C[C@H]([C@@H]3[C@@H]([C@]2(C1)C)C[C@@H]([C@]1([C@H]3CC[C@@H]1[C@@H](CCC[C@@H](C)C(=O)[O-])C)C)O)O)O")
+smiles(R"C1[C@H](C[C@H](N=C1C(=O)[O-])C(=O)[O-])O")
+smiles(R"C1[C@H](CC[NH+]2C[C@@H]3C[C@@H](CN4C(=O)CCC[C@H]34)[C@@H]12)O")
+smiles(R"C1[C@@H](C([C@](O1)(C)O)(O)O)O")
+smiles(R"C1([C@@H]([C@H]1C=C(C)C)COP(=O)(OP(=O)([O-])[O-])[O-])(C)C")
+smiles(R"C1([C@H]([C@H]([C@@]2(CC[C@]3([C@]4([C@@H]([C@@]5([C@H]([C@]([C@H](CC5)O)(CO)C)CC4)C)CC=C3[C@@H]2C1)C)C)C)O)O)(C)C")
+smiles(R"C1[C@@H]([C@@H](C[C@H]2C(=O)C=C3[C@@H]([C@@]12C)CC[C@]1([C@]3(CC[C@@H]1[C@](C)([C@@H](CCC(C)(C)O)O)O)O)C)O)O")
+smiles(R"C1[C@H]([C@@H]([C@@H](C=C1C(=O)[O-])O)O)OC(=O)/C=C/c1ccc(cc1)O")
+smiles(R"C1[C@@H]([C@H]([C@@H]([C@H]([C@@H]1[NH3+])O)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)[NH3+]")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@@H](CO)O1)O)O)NS(=O)(=O)[O-])O")
+smiles(R"C1[C@H]([C@H]([C@@H]([C@@H](CO)O1)O)O)O")
+smiles(R"C1([C@H]([C@H]([C@@H]([C@H](O1)[C@H](CO)O)O)O)O)OC[C@H]1OC(O[C@H]2C(O[C@@H]3[C@H](C(O[C@@H]4[C@@H]([C@H](O[C@@H]([C@H]4OP(=O)([O-])[O-])[C@H](COC4[C@H]([C@H]([C@@H]([C@H](O4)[C@H](CO)O)O)O)O)O)O[C@@H]4[C@@H]([C@@H](O[C@@H]5[C@@H](C[C@](O[C@@H]5[C@@H](CO)O)(OC[C@@H]5[C@H]([C@@H]([C@H]([C@@H](O5)OC[C@@H]5[C@H]([C@@H]([C@H]([C@H](O5)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-])C(=O)[O-])O[C@@]5(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C5)O)O)[C@@H](CO)O)O[C@@H]([C@H]4OP(=O)([O-])[O-])[C@H](CO)O)O)O)O[C@@H]([C@H]3O)COC3[C@@H]([C@H]([C@H]([C@H](O3)CO)O)O)O)O)O[C@@H]([C@H]([C@@H]2O)O)CO)[C@@H]([C@H]([C@@H]1O)O)O")
+smiles(R"C1([C@H]([C@H]([C@@H]([C@H](O1)[C@H](CO)O)O)O)O)OC[C@@H]([C@H]1O[C@@H]([C@H]([C@H]([C@@H]1OP(=O)([O-])[O-])OC1[C@@H]([C@H]([C@@H]([C@H](O1)COC1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O)OC1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)OC1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@@H]([C@@H](O[C@@H]2[C@@H](C[C@](O[C@@H]2[C@@H](CO)O)(OC[C@@H]2[C@H]([C@@H]([C@H]([C@@H](O2)OC[C@@H]2[C@H]([C@@H]([C@H]([C@H](O2)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-])C(=O)[O-])O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)O[C@@H]([C@H]1OP(=O)([O-])[O-])[C@H](CO)O)O)O")
+smiles(R"C1([C@H]([C@H]([C@@H]([C@H](O1)[C@H](CO)O)O)O)O)OC[C@@H]([C@H]1O[C@@H]([C@H]([C@H]([C@@H]1OP(=O)([O-])[O-])OC1[C@@H]([C@H]([C@@H]([C@H](O1)COC1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O)OC1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@@H]([C@@H](O[C@@H]2[C@@H](C[C@](O[C@@H]2[C@@H](CO)O)(OC[C@@H]2[C@H]([C@@H]([C@H]([C@@H](O2)OC[C@@H]2[C@H]([C@@H]([C@H]([C@H](O2)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-])C(=O)[O-])O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)O[C@@H]([C@H]1OP(=O)([O-])[O-])[C@H](CO)O)O)O")
+smiles(R"C1([C@H]([C@H]([C@@H]([C@H](O1)[C@H](CO)O)O)O)O)OC[C@@H]([C@H]1O[C@@H]([C@H]([C@H]([C@@H]1OP(=O)([O-])[O-])OC1[C@@H]([C@H]([C@@H]([C@H](O1)COC1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O)O)O)O)O[C@@H]1[C@@H]([C@@H](O[C@@H]2[C@@H](C[C@](O[C@@H]2[C@@H](CO)O)(OC[C@@H]2[C@H]([C@@H]([C@H]([C@@H](O2)OC[C@@H]2[C@H]([C@@H]([C@H]([C@H](O2)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-])C(=O)[O-])O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)O[C@@H]([C@H]1OP(=O)([O-])[O-])[C@H](CO)O)O)O")
+smiles(R"C1([C@H]([C@H]([C@@H]([C@H](O1)[C@H](CO)O)O)O)O)OC[C@@H]([C@H]1O[C@@H]([C@H]([C@H]([C@@H]1OP(=O)([O-])[O-])OC1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@@H]([C@@H](O[C@@H]2[C@@H](C[C@](O[C@@H]2[C@@H](CO)O)(OC[C@@H]2[C@H]([C@@H]([C@H]([C@@H](O2)OC[C@@H]2[C@H]([C@@H]([C@H]([C@H](O2)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-])C(=O)[O-])O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)O[C@@H]([C@H]1OP(=O)([O-])[O-])[C@H](CO)O)O)O")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O)O)O)O")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)COC(=O)C)O)O)O)O")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O)O)O")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)OC(=O)C")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)OC(C(=O)N[C@H](C(=O)NC(CCC(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@H](C)C(=O)N[C@@H](C(=O)[O-])C)C(=O)[O-])C)C)NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)OC(C(=O)N[C@H](C(=O)NC(CCC(=O)N[C@@H](CCCC[NH3+])C(=O)[O-])C(=O)[O-])C)C)NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"C1([C@@H]([C@H]([C@H]([C@H](O1)CO)O)O[C@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)NC(=O)C)O")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@H](C)C(=O)N[C@@H](C)C(=O)N[C@H](CCC(=O)N[C@@H](C(=O)[O-])CCC[C@@H](C(=O)[O-])[NH3+])C(=O)[O-])NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@H](C)C(=O)N[C@@H](C)C(=O)N[C@H](CCC(=O)[O-])C(=O)NCCCC[C@H](C(=O)[O-])[NH3+])NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@H](C)C(=O)N[C@@H](C)C(=O)N[C@H](CCC(=O)[O-])C(=O)N[C@H](C(=O)[O-])CCCC[NH3+])NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@H](C)C(=O)N[C@@H](C)C(=O)N[C@H](CCC(=O)[O-])C(=O)[O-])NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"C1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@H](C)C(=O)N[C@@H](C)C(=O)[O-])NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"C1([C@@H]([C@@H]([C@H]([C@@H](O1)C)O)O)O)O")
+smiles(R"C1([C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)OP(=O)([O-])OC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"C1[C@H]([C@H]([C@H]([C@@H](O1)O)O)O)O")
+smiles(R"C1[C@H]([C@@H]([C@H]([C@H](OC/C(=C\CNc2c3c([nH]cn3)ncn2)/C)O1)O)O)O")
+smiles(R"C1([C@@H]([C@H]([C@@H](CO1)O)O)O)O")
+smiles(R"C1[C@@H]([C@H]([C@H](O)C(CO)(O)O1)O)O")
+smiles(R"c1([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)nc[nH]c1")
+smiles(R"C1[C@H]([C@H](CSS1)O)O")
+smiles(R"C1[C@H](C=N[C@@H]1C(=O)[O-])O")
+smiles(R"C1[C@@H](C(=O)[C@](O1)(C)O)O")
+smiles(R"c1([C@@H](C(=O)C(=O)[O-])C)c[nH]c2c1cccc2")
+smiles(R"C1[C@H](OC=C(C1=O)[O-])CO")
+smiles(R"C1[C@H](O)[C@H](C/C=C\CCCC(=O)NCCO)[C@H]([C@@H]1O)/C=C/[C@H](CCCCC)O")
+smiles(R"C1[C@H](O)[C@H](C/C=C\CCCC(=O)[O-])[C@H]([C@@H]1O)/C=C/[C@H](CCCCC)O")
+smiles(R"C1[C@@H](O[C@@H]([C@H]1O)COP(=O)(OP(=O)([O-])[O-])[O-])n1c(=O)nc(cc1)N")
+smiles(R"C1[C@H](O)[C@@H](NC(=O)C)[C@@H](O[C@@]1(C(=O)[O-])O)C(C(O)CO)OC(=O)C")
+smiles(R"C1[C@H](O)[C@@H](NC(=O)C)[C@@H](O[C@@]1(C(=O)[O-])O)[C@@H]([C@H](O)COC(=O)C)O")
+smiles(R"c1(Cl)c(Cl)cc(cc1)N")
+smiles(R"c1c(nc2c(c1O)C=CC(C2O)O)C(=O)[O-]")
+smiles(R"c1c(nc2c(c3c(cc([nH]3)C(=O)[O-])C(=O)C2=O)c1C(=O)[O-])C(=O)[O-]")
+smiles(R"c1(c(nc(c(c1)c1c(nc(c(c1)O)O)O)O)O)O")
+smiles(R"c1c[n+](c(c(c1)CCO)C)Cc1c(nc(C)nc1)N")
+smiles(R"c1(c[n+](ccc1)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-])C(=O)N")
+smiles(R"c1(c(ncc(c1C=O)CO)C)O")
+smiles(R"c1(cnc(c(c1C(=O)[O-])O)C)CO")
+smiles(R"c1c(nc(c(c1O)/C=C/C(=O)C(=O)[O-])O)C(=O)[O-]")
+smiles(R"c1(cnccn1)C(=O)N")
+smiles(R"c1(cncn1[C@H]1[C@H](O)[C@@H]([C@H](O1)COP(=O)([O-])[O-])O)NC(=O)[O-]")
+smiles(R"c1(c(ncn1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-])C(=O)[O-])N")
+smiles(R"c1(c(nc(nc1)C)N)C[n+]1csc(c1C)CCOP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"c1(c(nc(nc1)C)N)CO")
+smiles(R"c1(c(nc(nc1)C)N)COP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"c1(cnc(nc1N)C)C[n+]1csc(c1C)CCO")
+smiles(R"c1(cnc(nc1N)C)C[n+]1csc(c1C)CC(=O)[O-]")
+smiles(R"c1(c(nc[nH]1)C(=O)N)N")
+smiles(R"C1CNC(=O)[C@@H](CC1)[NH3+]")
+smiles(R"C1CNC(=O)[C@H](CC1)[NH3+]")
+smiles(R"C1(CNC(=O)NC1=O)C")
+smiles(R"c1cn(c(=O)[nH]c1=O)[C@H]1[C@H](O)[C@H](O)[C@@H](COP(=O)(OP(=O)([O-])OC2OC[C@]([C@H]2O)(O)CO)[O-])O1")
+smiles(R"c1(c(ncs1)C)CCO")
+smiles(R"c1(c[nH]c2c1cccc2CC=C(C)C)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(c[nH]c2c1cccc2)/C=C(/C(=O)[O-])\N")
+smiles(R"c1(c[nH]c2c1cccc2)C[C@@H](C(=O)[O-])[NH2+]C")
+smiles(R"c1(c[nH]c2c1cccc2)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(c[nH]c2c1cccc2)C[C@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(c[nH]c2c1cccc2Cl)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(c[nH]c2c1cccc2Cl)CC(=N)C(=O)[O-]")
+smiles(R"c1(c[nH]cn1)/C=C/C(=O)[O-]")
+smiles(R"c1(c(=O)c2c(oc1)cc(cc2)O)c1cc2c(OCO2)cc1")
+smiles(R"c1(c(=O)c2c(oc1)cc(cc2)O)c1ccccc1")
+smiles(R"c1(C(=O)/C=C/c2ccc(cc2)O)c(cc(cc1)O)O")
+smiles(R"c1(C(=O)/C=C/c2ccc(cc2)O)c(cc(cc1)O)OC")
+smiles(R"c1(C(=O)CCc2ccc(cc2)O)c(cc(cc1O)O)O")
+smiles(R"c1c(O)c(cc(c1)C[C@@H](C(=O)[O-])[NH3+])O")
+smiles(R"C1C(=O)C(CCC1)O")
+smiles(R"C1C(=O)C=C(CC1O)O")
+smiles(R"C1C(=O)C[C@H]2CC[C@@H]1[NH+]2C")
+smiles(R"c1(C(=O)CC[NH3+])c(ccc(c1)O)N")
+smiles(R"c1c(O[C@H]2[C@H](O)[C@@H](O)[C@@H]([C@H](O2)CO)O)ccc(c1)/C=C/C(=O)[O-]")
+smiles(R"C1=CO[C@@H]2Oc3cc(c4c(=O)c5c(cccc5oc4c3[C@H]12)O)O")
+smiles(R"C1C(=O)[C@H](C/C=C\CCCC(=O)[O-])[C@H]([C@@H]1O)/C=C/C(=O)CCCCC")
+smiles(R"C1C(=O)[C@H]([C@@H](C(CO)O1)O)O")
+smiles(R"C1C(=O)[C@@H]([C@H]([C@H]1O)C/C=C\CCCC(=O)[O-])/C=C/C(=O)CCCCC")
+smiles(R"C1C(=O)[C@@H]([C@H]([C@@H]1O)CCC(=O)CCCCC)C/C=C\CCCC(=O)[O-]")
+smiles(R"C1(C(=O)[C@H]([C@@H]([C@@H](CO)O1)O)O)O")
+smiles(R"C1C(=O)CNC1C(=O)[O-]")
+smiles(R"c1(COC(=O)C(C(=O)C)C)ccccc1")
+smiles(R"C1=C([O-])C(=O)CO[C@@H]1CO")
+smiles(R"c1(C(=O)NCCCCNC(=[NH2+])N)ccccc1")
+smiles(R"c1(c(=O)[nH]c(=O)[nH]c1)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)CO")
+smiles(R"c1(c(=O)[nH]c(=O)[nH]c1)CO")
+smiles(R"c1(C(=O)Oc2cc(c(c(c2)O)C(=O)[O-])C)c(cc(cc1O)O)C")
+smiles(R"C1C(=O)O[C@]2(CC(=O)[C@H]1C2(C)C)C")
+smiles(R"C1C(=O)O[C@@]2(CC(=O)[C@@H]1C2(C)C)C")
+smiles(R"c1(C(=O)[O-])ccc(cc1)Cl")
+smiles(R"c1(C(=O)[O-])ccc[nH]1")
+smiles(R"[C@@]1(C(=O)[O-])(C[C@H]([C@@H]([C@@H](C1)O)OC(=O)/C=C/c1cc(c(cc1)O)OC)O)O")
+smiles(R"[C@@]1(C(=O)[O-])(C[C@H]([C@@H]([C@@H](C1)O)O)O)O")
+smiles(R"C1(C(=O)[O-])CSSC1")
+smiles(R"C1CSSC1CCCCC(=O)N")
+smiles(R"C1CSSC1CCCCC(=O)[O-]")
+smiles(R"C1[n+]2c(c3c(cc(c(c3)OC)OC)C1)cc1c(c2)c(c(cc1)OC)OC")
+smiles(R"c1nc2c(ncn2[C@H]2[C@H](O)[C@H](O)[C@H](O2)COP(=O)([O-])[O-])c(=N)n1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"C1N=c2ncncc2=NC1")
+smiles(R"c1nc(c2c(n1)n(cn2)[C@@H]1O[C@@H]([C@H]([C@H]1OP(=O)([O-])[O-])O)COP(=O)(OP(=O)([O-])OC1O[C@H](CO)[C@H]([C@H]1O)O)[O-])N")
+smiles(R"c1nc(c2c(n(cn2)[C@H]2[C@@H]([C@@H]([C@@H](COP(=O)(OP(=O)(OC3O[C@@H]([C@H]([C@@H]([C@@H]3O)O)O)[C@@H](CO)O)[O-])[O-])O2)O)O)n1)N")
+smiles(R"c1nc(c2c(n(cn2)[C@H]2[C@@H]([C@@H]([C@@H](COP(=O)(OP(=O)(OC3O[C@@H]([C@H]([C@@H]([C@@H]3O)O)O)[C@H](CO)O)[O-])[O-])O2)O)O)n1)N")
+smiles(R"c1nc(c2c(n(cn2)[C@H]2[C@@H]([C@@H]([C@@H](COP(=O)(OP(=O)(O[C@@H]3O[C@@H]([C@H]([C@@H]([C@@H]3O)O)O)[C@@H](CO)O)[O-])[O-])O2)O)O)n1)N")
+smiles(R"c1nc(c2c(n(cn2)[C@H]2[C@@H]([C@@H]([C@@H](COP(=O)(OP(=O)(O[C@@H]3O[C@@H]([C@H]([C@@H]([C@@H]3O)O)O)[C@H](CO)O)[O-])[O-])O2)O)O)n1)N")
+smiles(R"C1(=NCCC1)C(=O)[O-]")
+smiles(R"c1[n+](ccc(c1[O-])[O-])C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(N(C)C)ccc(cc1)N")
+smiles(R"c1nc(cn1C)CC[NH3+]")
+smiles(R"c1nc(c(nc1c1c[nH]c2c1cccc2)CCCNC(=[NH2+])N)NC(=O)[C@@H](C)CC")
+smiles(R"C1=NCC(=O)N1")
+smiles(R"c1ncnc2c1ncn2[C@@H]1O[C@H](CO)[C@@H](O)C1")
+smiles(R"c1ncnc2c1ncn2[C@@H]1O[C@H](CO)[C@@H](O)[C@H]1O")
+smiles(R"c1(ncnc2c1[nH]cn2)NCCC(CO)C")
+smiles(R"c1(nc(nc(n1)NCC)NC(C)C)Cl")
+smiles(R"c1(nc(nc(n1)NCC)NC(C)C)O")
+smiles(R"c1(nc([nH]c1)CCC([NH2+]C)C(=O)[O-])C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C1(NC(=O)NC1CCCCCC(=O)[O-])C")
+smiles(R"c1n(c(=O)[nH]c(=O)c1C)[C@H]1C[C@@H]([C@H](O1)COP(=O)([O-])OP(=O)([O-])O[C@H]1O[C@H](C)C(=O)[C@@H]([C@H]1O)O)O")
+smiles(R"c1n(c(=O)[nH]c(=O)c1C)[C@H]1C[C@H](O)[C@H](O1)COP(=O)(OP(=O)([O-])OC1O[C@H]([C@]([C@H]1O)(O)CO)C)[O-]")
+smiles(R"c1n(c(=O)[nH]c(=O)c1C)[C@H]1C[C@H](O)[C@H](O1)COP(=O)(OP(=O)([O-])OC1O[C@H](C)[C@@H]([C@@H]([C@H]1O)O)[NH3+])[O-]")
+smiles(R"c1n(c(=O)[nH]c(=O)c1C)[C@H]1C[C@H](O)[C@H](O1)COP(=O)(OP(=O)([O-])O[C@H]1O[C@H](C)[C@@H]([C@@H]([C@H]1O)O)[NH3+])[O-]")
+smiles(R"c1n(c(=O)[nH]c(=O)c1C)[C@H]1C[C@H](O)[C@H](O1)COP(=O)(OP(=O)([O-])O[C@H]1O[C@H](C(=O)[C@H]([C@H]1O)O)C)[O-]")
+smiles(R"c1([nH]c(c(c1C)CCC(=O)[O-])/C=C/1\N=C(C(=C1CCC(=O)[O-])C)/C=C\1/C(=C(C=C)C(=O)N1)C)/C=C/1\NC(=O)C(=C1C=C)C")
+smiles(R"c1([nH]c(c(c1C)CCC(=O)[O-])Cc1[nH]c(c(C)c1CCC(=O)[O-])/C=C\1/C(=C(C=C)C(=O)N1)C)/C=C/1\NC(=O)C(=C1C=C)C")
+smiles(R"c1([nH]c(cc1)O)C(=O)[O-]")
+smiles(R"c1[nH]cc(n1)CC(=O)[O-]")
+smiles(R"c1[nH]c(c(n1)CC(=O)[O-])O")
+smiles(R"c1([nH]ccn1)[N+](=O)[O-]")
+smiles(R"c1[nH]cnc1CC(=O)COP(=O)([O-])[O-]")
+smiles(R"c1(/N=N/c2ccccc2)ccc(cc1)N(C)C")
+smiles(R"C1(=N)N(CC(=O)N1)C")
+smiles(R"c1([N+](=O)[O-])ccc(cc1)N")
+smiles(R"c1([N+](=O)[O-])ccc(cc1)[O-]")
+smiles(R"C1(NS(=O)(=O)[O-])CCCCC1")
+smiles(R"C1(=O)c2c3c(ccc2)O[Fe-3]245(O3)Oc3c(O2)c(C(=O)N[C@H]2COC(=O)[C@H](COC(=O)[C@H](COC2=O)N1)NC(=O)c1c(c(O5)ccc1)O4)ccc3")
+smiles(R"C1(=O)c2c(c(cc(c2C(=O)C2=C1[C@H](O)[C@H](O[C@@H]2C)C)O)O)c1c2cc(cc(c2c(c2c1[C@H](O)[C@H](O[C@@H]2C)C)O)O)O")
+smiles(R"C1(=O)[C@]2(C)CC(=O)[C@@H](C1)C2(C)C")
+smiles(R"C1Oc2c([C@@H]3[C@@]1(O)c1c(O3)cc3c(c1)OCO3)ccc(c2)O")
+smiles(R"c1(oc2c(c(=O)c1[O-])c(cc(c2)O)O)c1cc(c(c(c1)OC)O)OC")
+smiles(R"C1(=O)c2c(C(=O)c3c1cc(cc3O)C)c(cc(c2)[O-])OC")
+smiles(R"c1(=O)c2c(nc([nH]1)N)NCC(=N2)[C@@H]([C@H](O)CO)O")
+smiles(R"c1(=O)c2c(nc([nH]1)N)NCC(=N2)[C@@H]([C@H](O)COP(=O)([O-])[O-])O")
+smiles(R"c1(=O)c2c(nc([nH]1)N)NCC(=N2)[C@@H]([C@H](OP(=O)([O-])[O-])CO)O")
+smiles(R"c1(=O)c2c(nc([nH]1)N)[nH]cc2C(=O)[O-]")
+smiles(R"c1(=O)c2c(n(c(=O)[nH]1)[C@H]1[C@@H]([C@@H]([C@H](O1)CO)O)O)[nH]c(=O)[nH]2")
+smiles(R"c1(=O)c2c(occ1c1cc(c(cc1)OC)O)cc(cc2O)[O-]")
+smiles(R"C1(=O)/C(=C/c2ccccc2)/NC(=O)[C@@H](N1)CC(C)C")
+smiles(R"c1(=O)/c(=C/c2ccccc2)/[nH]c(=O)/c(=C/C(C)C)/[nH]1")
+smiles(R"C1(=O)CCC(C1)C#N")
+smiles(R"C1(=O)CCC(C1)C(=O)[O-]")
+smiles(R"C1(=O)CCCC=C1")
+smiles(R"c1(O)c(cc(cc1)/C=C/c1ccc(O)c(c1)OC)OC")
+smiles(R"c1(O)c(cc(cc1)C=C)OC")
+smiles(R"C1(=O)C=CC=CC1=N")
+smiles(R"C1(=O)C=C(C)[C@@](C(C1)(C)C)(/C=C/[C@H](O)C)O")
+smiles(R"C1(=O)C=C(C)[C@@](C(C1)(C)C)(/C=C/C(=O)C)O")
+smiles(R"C1(=O)CCCCCO1")
+smiles(R"C1(=O)CCCCC(O1)O")
+smiles(R"C1(=O)C(=C)CCO1")
+smiles(R"C1(=O)C(=C(C(=O)c2ccccc12)C/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CC/C=C(/CCC=C(C)C)\C)C")
+smiles(R"C1(=O)C(=C(C(=O)C(=C1C)CCCCCCCCCC)OC)OC")
+smiles(R"C1(=O)C(=CC(=O)C(=C1OC)OC)C")
+smiles(R"C1(=O)C[C@@H](CC[C@@H]1C(C)C)C")
+smiles(R"c1(=O)ccn(c(=O)[nH]1)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"c1(=O)c(c[nH]c(=O)[nH]1)C")
+smiles(R"c1(=O)cc(oc2c1c(cc(c2)[O-])O)c1ccc(cc1)O")
+smiles(R"c1(=O)cc(oc2c1c(c(c(c2)O)O)O)c1ccc(cc1)O")
+smiles(R"c1(O[C@H]2[C@H](O)[C@H]([C@@H]([C@H](O2)CO)O)O)ccc(cc1)O")
+smiles(R"C1(=O)[C@H]2N(C(=O)/C/1=C(/C)\[O-])C(C)(C)[C@@H]1Cc3c4c(c[nH]c4ccc3)[C@H]21")
+smiles(R"[C@]1(O[C@H]2O[C@@H]([C@H]([C@@H]([C@H]2O)O)O)CO)(O[C@@H]([C@H]([C@@H]1O)O)CO[C@@]1(O[C@@H]([C@H]([C@@H]1O)O)CO[C@@]1(O[C@@H]([C@H]([C@@H]1O)O)CO)CO)CO)CO")
+smiles(R"[C@]1(O[C@H]2O[C@@H]([C@H]([C@@H]([C@H]2O)O)O)CO)(O[C@@H]([C@H]([C@@H]1O)O)CO[C@@]1(O[C@@H]([C@H]([C@@H]1O)O)CO)CO)CO")
+smiles(R"[C@]1(O[C@H]2O[C@@H]([C@H]([C@@H]([C@H]2O)O)O)CO)(O[C@@H]([C@H]([C@@H]1O)O)CO[C@@]1(O[C@@H]([C@H]([C@@H]1O)O)CO)CO)CO[C@@]1(O[C@@H]([C@H]([C@@H]1O)O)CO)CO")
+smiles(R"C1(=O)[C@@H](CC[C@H](C1)C)C(C)C")
+smiles(R"C1(=O)[C@H]([C@H](C=C1)CCCCCCCC(=O)[O-])C/C=C\CC")
+smiles(R"[C@]1(O[C@@H]([C@H]([C@@H]1O)O)CO)(CO)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O)O)O)O)O)O")
+smiles(R"[C@@]1(O[C@@H]([C@H]([C@@H]1O)O)CO)(OCC1(O[C@@H]([C@H]([C@@H]1O)O)CO)O)CO")
+smiles(R"C1(O[C@H]([C@H]([C@H]([C@@H]1O)O)O)CO)OP(=O)([O-])[O-]")
+smiles(R"C1(O[C@@H]([C@H]([C@@H]([C@@H]1O)O)O)COP(=O)([O-])[O-])O")
+smiles(R"C1(=O)[C@@H]([C@@H]([C@H]([C@@H]([C@H]1O)O)O)O)O")
+smiles(R"C1(=O)[C@@H]([C@H]([C@@H]([C@H]([C@H](C[C@H](C(=O)[C@@H]([C@H]([C@H]([C@H](O1)CC)C)O)C)C)C)O)C)O)C")
+smiles(R"C1(=O)[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O")
+smiles(R"C1(=O)[C@H]([C@H]([C@@H]([C@H](O1)C=O)O)O)O")
+smiles(R"C1(=O)[C@H]([C@H](O[C@@H]([C@@H]1O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H](C[C@@H]1O)n1c(=O)[nH]c(=O)c(c1)C)[O-])[O-])O")
+smiles(R"C1O[C@@H]([C@H](O)[C@H]([C@@H]1O)O)OP(=O)([O-])[O-]")
+smiles(R"C1(=O)[C@@H]([C@H](O)[C@H]([C@@H](O)C)O1)O")
+smiles(R"C1O[C@@H]([C@H](O)[C@@H](O)[C@H]1O)O[C@H]1[C@@H]([C@@H]([C@@H]([C@H]([C@@H]1O)O)OC(=O)Cc1c[nH]c2c1cccc2)O)O")
+smiles(R"C1(=O)[C@@H](NC(=O)[C@@H](N1)CC(C)C)Cc1ccccc1")
+smiles(R"C1(=O)[C@@H](O)[C@@H]([C@@H](O)[C@@H](C1)O)O")
+smiles(R"C1(=O)[C@@H](O)[C@@H]([C@@H](O)[C@@H]([C@H]1O)O)O")
+smiles(R"C1(=O)[C@H](O)[C@H]([C@H](O)[C@@H](O)[C@H]1O)OC")
+smiles(R"C1(O)[C@H](O)[C@@H](O[C@@H]2[C@H](O)[C@@H](O)[C@H](O)[C@H](O2)CO)[C@H](O)[C@H](O1)CO")
+smiles(R"C1(O)[C@H](O)[C@H](O)[C@H](O1)CSCC[C@H]([NH3+])C(=O)[O-]")
+smiles(R"C1(O)[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO[C@H]1[C@H](O)[C@@H](O)[C@@H](O)CO1")
+smiles(R"C1(OC(=O)C=C1C)CC(=O)[O-]")
+smiles(R"C1(OC(=O)C=C1)(CC(=O)[O-])C")
+smiles(R"C1OC(=O)[C@H](COC(=O)[C@H](COC(=O)[C@H]1NC(=O)c1cccc(O)c1O)NC(=O)c1cccc(O)c1O)NC(=O)c1c(c(ccc1)O)O")
+smiles(R"C1OC(=O)[C@H](O)[C@H]([C@@H]1O)O")
+smiles(R"C1(=O)NC(C(=C1C)C=C)Cc1[nH]c(c(c1C)CC)Cc1[nH]c2c(c1C)C(=O)C/C/2=C/1\[C@H]([C@@H]([C@H]([NH+]1)C(=O)[O-])C)CCC(=O)[O-]")
+smiles(R"C1(=O)NC(C(=C1C)C=C)Cc1[nH]c(c(c1C)CC)Cc1[nH]c2c(c1C)c(=O)c(=O)/c/2=C/1\[C@H]([C@@H]([C@H](N1)C(=O)[O-])C)CCC(=O)[O-]")
+smiles(R"C1(=O)NC(CC1)C(=O)[O-]")
+smiles(R"C1(=O)NCCC(=O)N1")
+smiles(R"C1(=O)N[C@@H](CC1)C(=O)[O-]")
+smiles(R"C1(=O)N[C@H](CC1)C(=O)[O-]")
+smiles(R"c1(=O)nc(N)cc[nH]1")
+smiles(R"c1(=O)n(c(=O)c2c(n1C)ncn2C)C")
+smiles(R"C1(=O)NC(=O)[C-](C(=O)N1)C")
+smiles(R"C1(=O)[N-]C(=O)[CH-]C(=O)N1")
+smiles(R"c1(=O)n(c(=O)[nH]c2c1n(cn2)C)C")
+smiles(R"c1(=O)[nH]cc[nH]1")
+smiles(R"c1(=O)[nH]c(nc2c1N=C(CN2)[C@@H]([C@@H]1OP(=O)(OC1)[O-])O)N")
+smiles(R"c1(=O)[nH]c(nc2c1N=C(CN2)CNc1ccc(cc1)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-])N")
+smiles(R"c1(=O)[nH]c(nc2c1N=C(CN2)COP(=O)(OP(=O)([O-])[O-])[O-])N")
+smiles(R"c1(=O)[nH]c(nc2c1N[C@@H]1[C@H](N2)O[C@H](COP(=O)([O-])[O-])C2=C1S[Mo](=O)(=O)S2)N")
+smiles(R"c1(=O)[nH]c(nc2c1N[C@@H]1[C@H](N2)O[C@H](COP(=O)([O-])[O-])C2=C1S[W](=O)(=O)S2)N")
+smiles(R"c1(=O)[nH]c(nc2c1ncn2[C@@H]1O[C@@H]([C@H]([C@H]1O)OP(=O)(OP(=O)([O-])[O-])[O-])COP(=O)([O-])OP(=O)([O-])OP(=O)([O-])[O-])N")
+smiles(R"c1(=O)[nH]c(nc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])[O-])N")
+smiles(R"c1(=O)[nH]c(nc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])NCCCC[C@@H](C(=O)OC)NC(=O)C)N")
+smiles(R"c1(=O)[nH]c(nc2c1[n+](cn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])[O-])C)N")
+smiles(R"c1(=O)[nH]c(nc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])[O-])N")
+smiles(R"c1(=O)[nH]c(nc2c1[n+](cn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])[O-])C)N")
+smiles(R"c1(=O)[nH]c(nc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])OP(=O)([O-])[O-])N")
+smiles(R"c1(=O)[nH]c(nc2c1ncn2[C@@H]1O[C@H](CO)[C@@H](O)[C@H]1O)N")
+smiles(R"c1(=O)[nH]c(nc2c1ncn2[C@@H]1O[C@H](CO)[C@@H](OP(=O)([O-])[O-])[C@H]1O)N")
+smiles(R"c1(=O)[nH]c(=O)c2c(n1C)ncn2C")
+smiles(R"c1(=O)[nH]c(=O)n(c2c1[nH]cn2)C")
+smiles(R"c1(=O)[nH]c(=O)[nH]c2c1nc[nH]2")
+smiles(R"C1(=O)O[C@@H]([C@@H]([C@@H]1O)O)[C@H](C=O)O")
+smiles(R"[Ca+2]")
+smiles(R"C[As](=O)(O)[O-]")
+smiles(R"CBr")
+smiles(R"C=C")
+smiles(R"C#C")
+smiles(R"CC12OC1CC1CC2C1(C)C")
+smiles(R"Cc1c2CC[C@](Oc2c(c(c1O)C)C)(CCC[C@@H](CCC[C@@H](CCCC(C)C)C)C)C")
+smiles(R"C(c1ccc(cc1)Cl)(c1ccc(cc1)Cl)C(Cl)(Cl)Cl")
+smiles(R"Cc1c(c(c(c(O)c1C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)OC)OC)O")
+smiles(R"Cc1c(cc(c(O)c1C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)OC)O")
+smiles(R"CC1CC(=O)OC(CC1)C(C)C")
+smiles(R"C(=C\1/[C@H](C/C=C\CC)O1)/C=C\CCCCCCCC(=O)[O-]")
+smiles(R"C([C@]1([C@@H](COP(=O)(OP(=O)(O1)[O-])[O-])O)C)O")
+smiles(R"C(c1c(nc(nc1)C)N)[n+]1csc(c1C)CCOP(=O)([O-])[O-]")
+smiles(R"C(c1c(nc(nc1)C)N)[n+]1csc(c1C)CCOP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-]")
+smiles(R"C(c1c(nc(nc1)C)N)OP(=O)([O-])[O-]")
+smiles(R"C=CC")
+smiles(R"C(=C\[C@]12[C@](O1)(C[C@H](CC2(C)C)O)C)/C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\[C@]12[C@](O1)(C[C@H](CC2(C)C)O)C)/C)/C)\C)/C")
+smiles(R"C(=C\c1ccc(cc1)O)/c1cc(cc(c1)O)O")
+smiles(R"C(=C\c1ccc(cc1)O)/c1cc(cc(c1)O)OC")
+smiles(R"C(Cc1cc(ccc1)O)C(=O)[O-]")
+smiles(R"C(C(c1cc(c(cc1)O)O)O)O")
+smiles(R"C(=C\C1=C(C)CCCC1(C)C)/C(=C/C=C/C(=C/C=C/C=C(\C)/C=C/C=C(\C)/C=C/C=C(/C=C/C=C(C)C)\C)/C)/C")
+smiles(R"C=C(C1CC(=O)OC(CC1)C)C")
+smiles(R"C(=C)(C1CC(=O)OC(CC1)(C)O)C")
+smiles(R"C=C(C1COC(=O)C(CC1)C)C")
+smiles(R"C(=C)C(=C)C")
+smiles(R"CC(=CCc1c(O)ccc2c1O[C@H]1c3ccc(O)cc3OC[C@@H]21)C")
+smiles(R"C(CC=C(C)C)[C@]1([C@@H]2CCC(=C)[C@H]1C2)C")
+smiles(R"C(CC=C(C)C)[C@]1([C@@H]2CC=C([C@H]1C2)C)C")
+smiles(R"C(CC=C(C)C)[C@@]1([C@@H]2CC=C([C@H]1C2)C)C")
+smiles(R"C(CC/C=C\C=C\1/O[C@H]1CCCCC)CCCCC(=O)[O-]")
+smiles(R"C(=C)(CCC=C(C)C)C=C")
+smiles(R"CC(=CC/C=C(/C=C)\C)C")
+smiles(R"C(=C(\CCC=C(C)C)/C)/Cc1c(ccc(c1)C(=O)[O-])O")
+smiles(R"C(=C\C/C=C(/C=C)\C)(/CCC=C(C)C)\C")
+smiles(R"C(=C\CCC(=C)C=C)(/CCC=C(C)C)\C")
+smiles(R"C(CCCCCCCCCCCCCC)CC")
+smiles(R"C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C1=C(CCCC1(C)C)C)\C)\C)/C)/C=C/C1=C(CCCC1(C)C)C")
+smiles(R"C(=C\C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(\C)/C=C=C1[C@@](C[C@H](CC1(C)C)O)(O)C)\C)/C)\C)/[C@]12O[C@@]2(C[C@H](CC1(C)C)O)C")
+smiles(R"C(=C\C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(/C)\C=C=C1[C@@](C[C@H](CC1(C)C)O)(O)C)/C)\C)\C)/[C@]12O[C@@]2(C[C@H](CC1(C)C)O)C")
+smiles(R"C(=C(\CCC=C(C)C)/C)/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/Cc1c(c(cc(c1)C(=O)[O-])OC)O)/C)/C)/C)/C")
+smiles(R"C(/C=C(/CCC=C(C)C)\C)C/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/Cc1cc(cc(c1O)O)C(=O)[O-])/C)/C)/C)/C")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/Cc1c(C)c(O)c2ccccc2c1O)/C)/C)/C)/C)/C)/C)C")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\C=C(C)C)/C)/C)\C)(/C=C/C=C(C)C)\C")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\C=C(C)C)/C)/C)\C)(/CCC=C(C)C)\C")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\CC/C=C(/CCC=C(C)C)\C)/C)\C)(/CCC=C(C)C)\C")
+smiles(R"C(=C\CC/C(=C/C=C/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)(/CCC=C(C)C)\C")
+smiles(R"C(=C\CC/C(=C/C=C\C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)(/CCC=C(C)C)\C")
+smiles(R"CC(=CCC/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/CCC=C(C)C)\C)\C)/C)/C)C")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)C")
+smiles(R"CC(=C)C(CC/C(=C/CC/C(=C/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)C")
+smiles(R"CC(=C)C(CC/C(=C/CC/C(=C/CC/C=C(/CC/C=C(/CCC(C(=C)C)C)\C)\C)/C)/C)C")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/Cc1c(C)c(O)c2ccccc2c1O)/C)/C)/C)/C)/C)/C)/C)C")
+smiles(R"C(=C(\C=C\C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C=C\C=C(\C=C\C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C")
+smiles(R"C(=C(\C=C\C=C(\C)/CC/C=C(/CCC=C(C)C)\C)/C)/C=C\C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C")
+smiles(R"C(=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C=C\C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C")
+smiles(R"C(=C\C=C(\CCC=C(C)C)/C)\C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C)\C=C/C=C(/CCC=C(C)C)\C)\C)/C)\C")
+smiles(R"C(=C\C=C\C=C(\C=C\C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)(/C=C/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)\C")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\C=C(\C=C\C=C(C)C)/C)/C)/C)\C)(/C=C/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\C=C(\CCC=C(C)C)/C)/C)/C)\C)(/C=C/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\C=C(\CCC=C(C)C)/C)/C)/C)\C)(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)\C)(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(=C\CC/C(=C/C=C/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)/C)(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)/C)/C)/C)C")
+smiles(R"C(/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)c1c(c(cc(c1)O)OC)O")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\COP(=O)(OP(=O)([O-])[O-])[O-])/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)C")
+smiles(R"C(/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)O")
+smiles(R"C(/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)OP(=O)(OP(=O)(O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)O[C@@H](C(=O)N[C@H](C(=O)N[C@@H](C(=O)[O-])CCC(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@@H](C(=O)N[C@H](C)C(=O)[O-])C)C)C)NC(=O)C)[O-])[O-]")
+smiles(R"C(/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)OP(=O)(OP(=O)(O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@@H](C(=O)N[C@H](C(=O)N[C@@H](C(=O)[O-])CCC(=O)N[C@@H](CCCC[NH3+])C(=O)N[C@@H](C(=O)N[C@H](C)C(=O)[O-])C)C)C)NC(=O)C)[O-])[O-]")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\COP(=O)(OP(=O)([O-])[O-])[O-])/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)C")
+smiles(R"C(/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)C/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\COP(=O)([O-])[O-])/C)/C)/C)/C)/C)/C)/C")
+smiles(R"C(/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)C/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\COP(=O)(OP(=O)([O-])[O-])[O-])/C)/C)/C)/C)/C)/C)/C")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\COP(=O)(OP(=O)([O-])[O-])[O-])/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)C")
+smiles(R"C(=C(C)C)CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CO)/C)/C)/C)/C)/C)/C)/C)/C)/C)/C")
+smiles(R"C(=C(C)C)CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/COP(=O)([O-])[O-])/C)/C)/C)/C)/C)/C)/C)/C)/C)/C")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\COP(=O)([O-])[O-])/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)C")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\COP(=O)(OP(=O)([O-])[O-])[O-])/C)/C)/C)/C)/C)/C)/C)/C)/C)/C)C")
+smiles(R"C(=C(\C)/CCC=C(C)C)/CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C/CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C)/C)/C)/C)/C)/C)/C)/C")
+smiles(R"C(=C(\C)/CCC=C(C)C)/CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C)/C)/C)/C)/C)/C)/C)/C")
+smiles(R"CC(=CCC/C(=C/CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\CC/C(=C\COP(=O)([O-])[O-])/C)/C)/C)/C)/C)/C)/C)/C)/C)C")
+smiles(R"C(=C\C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\C=C(\CCC=C(C)C)/C)/C)/C)\C)\C)/C=C(/C=C/CC(C)(O)C)\C")
+smiles(R"C(C=C(C)C)C/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/CC/C(=C/COC(=O)c1ccc(cc1)O)/C)/C)/C)/C)/C)/C)/C)/C")
+smiles(R"C(=C(\CCC=C(C)C)/C)/CC/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C=C(/C=C/CC(C)(C)O)\C)\C)\C)/C)/C")
+smiles(R"C(=C(\CCC=C(C)C)/C)/CC/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C=C(/C=C/CC(C)(C)OC)\C)\C)\C)/C)/C")
+smiles(R"C(/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)OP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"C(CCCCCCCCCCCCCCCC)CCCCCCCCC(=O)[O-]")
+smiles(R"C(CCCCCCCCCCCCC)CCCCCCCCCC(=O)[O-]")
+smiles(R"C(C/C=C(\C)/CC/C=C(/CCC=C(C)C)\C)/C(=C/CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C)/C")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\C=C(\CCCC(O)(C)C)/C)/C)/C)\C)(/C=C/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\C=C(\CCCC(O)(C)C)/C)/C)/C)\C)(/C=C/C=C(/CCCC(O)(C)C)\C)\C")
+smiles(R"C(=C\C/C=C\CC)\C/C=C\C/C=C\C/C=C\CCCC(=O)NCCO")
+smiles(R"C(=C\CCCCC)\C/C=C\C/C=C\C/C=C\CCCC(=O)NCCO")
+smiles(R"C(=C\C/C=C\CC)\CCC/C=C/C=C/C=C\CCCC(=O)[O-]")
+smiles(R"C(=C\C=C\C(=C\C=C\C=C(\C=C\C=C(\C=C\C=C(\C=O)/C)/C)/C)\C)(/C=C/C=C(/C=O)\C)\C")
+smiles(R"C(CCCCCCCCCCCC)CCCC[C@H]([C@H](CO)[NH3+])O")
+smiles(R"C(CCCCCCCCCCCC)CCCC[C@H]([C@H](COP(=O)([O-])[O-])[NH3+])O")
+smiles(R"C(=C\C/C=C\CCCCC)\CCCCCCCCO")
+smiles(R"C(=C\CCCCCCCC)\CCCCCCCCO")
+smiles(R"C(CCCCCCCCC)CCCCCCCC=O")
+smiles(R"C(/C=C\C/C=C\CCCCC)CCCCCCC(=O)NCCO")
+smiles(R"C(=C\C/C=C\CCCCC)\CCCCCCCC(=O)[O-]")
+smiles(R"C(=C\CCCCCCCC)\CCCCCCCC(=O)[O-]")
+smiles(R"C(CCCCCCCCCC)CCCCCC(C=O)O")
+smiles(R"C(=C\C/C=C\C/C=C\C/C=C\C/C=C\CCCC(=O)[O-])\CC")
+smiles(R"C(CCCCCCCCCCCC)CCC[C@H]([C@H]([C@H](CO)[NH3+])O)O")
+smiles(R"C(CCCCCCCCCCCC)CCC[C@H]([C@H]([C@H](COP(=O)([O-])[O-])[NH3+])O)O")
+smiles(R"C(C/C=C\C/C=C\C/C=C\C/C=C\CCCC(=O)[O-])CCC")
+smiles(R"C(C/C=C\C/C=C\C/C=C\C/C=C\CCCC(=O)OC(CO)CO)CCC")
+smiles(R"C(CCCCCCCCCC)CCCC[C@H]([C@H](C)[NH3+])O")
+smiles(R"C(=C\CCCCCCCCCCCCC)/[C@H]([C@H](COC1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)[NH3+])O")
+smiles(R"C(CCCCCCCCCC)CCCC[C@H]([C@H](CO)[NH3+])O")
+smiles(R"CCCCCCCCCCCCCCC[C@H]([C@H](COP(=O)([O-])O[C@H]1[C@@H]([C@H]([C@@H]([C@H]([C@H]1O)O)O)O)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)NC(=O)CCCCCCCCCCCCCCCCCCCCCCC)O")
+smiles(R"C(=C\CCCCCCCCCCCCC)/[C@H]([C@H](COP(=O)([O-])[O-])[NH3+])O")
+smiles(R"C(CCCCCCCCCC)CCCC[C@H]([C@H](COP(=O)([O-])[O-])[NH3+])O")
+smiles(R"CCCCCCCCCCCCCCC[C@H](C[NH3+])O")
+smiles(R"C(=C\CCCCCCCCCCCCC)/C=O")
+smiles(R"C(CCCCCCCC)CCCCCCC=O")
+smiles(R"C(CCCCCCCC)CCCCCCCO")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C(=C/CO)/C)/C)/C)C")
+smiles(R"CC(=CCC/C(=C/CC/C(=C/CC/C(=C/CO)/C)/CO)/C)C")
+smiles(R"CCCCCCCCCCCCCCCC(=O)[C@@H]([NH3+])C")
+smiles(R"CCCCCCCCCCCCCCCC(=O)C[NH3+]")
+smiles(R"C(CCCCCCCC)CCCCCC(C=O)O")
+smiles(R"C(CCCCCCCCCC)CCCCC(=O)[O-]")
+smiles(R"C(CCCCCCCC)CCCCCC(C(=O)[O-])O")
+smiles(R"C(CCCCCCCCCCCCCCC(=O)[O-])O")
+smiles(R"CC(CCCC(CCCC(CCC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C)C)C)C")
+smiles(R"C(/C=C\CCCCC)/C=C\C=C\C=C\[C@H]1[C@@H](CCCC(=O)[O-])O1")
+smiles(R"CCCCCCCCCCCCCC[C@H]([C@H]([C@H](CO)NC(=O)[C@H]([C@@H](CCCCCCCCCCCCCCCCCCCCCCC)O)O)O)O")
+smiles(R"CCCCCCCCCCCCCC[C@H]([C@H]([C@H](CO)NC(=O)[C@H]([C@@H](CCCCCCCCCCCCCCCCCCCCC)O)O)O)O")
+smiles(R"C(CCCCCCC(C)C)CC/C=C/[C@H]([C@H](CO)[NH3+])O")
+smiles(R"C(CCCCCCC(C)C)CCCC[C@H]([C@H](CO)[NH3+])O")
+smiles(R"C(CCCCCCC(C)C)CCCC[C@H]([C@H](COP(=O)([O-])[O-])[NH3+])O")
+smiles(R"C(CCCCCCC(C)C)CC/C=C/[C@H]([C@@H]([NH3+])COP(=O)([O-])[O-])O")
+smiles(R"C(/C=C\CCCCC)/C=C\C=C\C=C\[C@H]([C@@H](O)CCCC(=O)[O-])SC[C@H](NC(=O)CC[C@H]([NH3+])C(=O)[O-])C(=O)NCC(=O)[O-]")
+smiles(R"C(/C=C\CCCCC)/C=C\C=C\C=C\[C@H]([C@@H](O)CCCC(=O)[O-])SC[C@H]([NH3+])C(=O)NCC(=O)[O-]")
+smiles(R"C(/C=C\CCCCC)/C=C\C=C\C=C\[C@H]([C@@H](O)CCCC(=O)[O-])SC[C@H]([NH3+])C(=O)[O-]")
+smiles(R"C(=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C=O")
+smiles(R"C(=C\CCCCCCCCCC(C)C)/C=O")
+smiles(R"C(CCCC)CCCCCCCCCC=O")
+smiles(R"C(CCCC)CCCCCCCCC(C=O)C")
+smiles(R"C(CCCCCCCCCCCCCCO)CCC")
+smiles(R"CC(CCCC(CCCC(CCCC(C=O)C)C)C)C")
+smiles(R"CC(=C)C(CC/C(=C/CC[C@](/C=C/[C@@H](CC/C=C(/CCC=C(C)C)\C)C)(C=C)C)/C)C")
+smiles(R"CC(=C)C(CC/C(=C/CC[C@](/C=C/[C@@H](CC/C=C(/CCC(C(=C)C)C)\C)C)(C=C)C)/C)C")
+smiles(R"C(CCCCCCCCCCCC[C@H]([C@H]([C@H](CO)[NH3+])O)O)C")
+smiles(R"C(CCCCCCCCCCCC[C@H]([C@H]([C@H](COP(=O)([O-])[O-])[NH3+])O)O)C")
+smiles(R"C=C[C@](CC/C=C(/CCC=C(C)C)\C)(O)C")
+smiles(R"C=C[C@@](CC/C=C(/CCC=C(C)C)\C)(O)C")
+smiles(R"C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=O)\C)/C)/C=C/C1=C(CCCC1(C)C)C")
+smiles(R"CC(CCCCCCCCCCCC(=O)[C@H](CO)[NH3+])C")
+smiles(R"CC(=CCC/C(=C/CC[C@](/C=C/[C@@H](CC/C=C(/CCC=C(C)C)\C)C)(C=C)C)/C)C")
+smiles(R"CC(=CCC/C(=C/CC[C@](/C=C/[C@@H](CC/C=C(/CCC(C(=C)C)C)\C)C)(C=C)C)/C)C")
+smiles(R"C(=C\C/C=C\CCCCC)\C=C\[C@@H](C/C=C\CCCC(=O)[O-])OO")
+smiles(R"C(CCCCCCCCCC[C@H]([C@H](CO)NC(=O)CCCCCCCCCCCCCCCCCCCCCCCCC)O)CCCC")
+smiles(R"C(CCCCCCCCCC[C@H]([C@H](CO)NC(=O)C(CCCCCCCCCCCCCCCCCCCCCCCC)O)O)CCCC")
+smiles(R"C(CCCCCCCCCC[C@H]([C@H](CO)NC(=O)CCCCCCCCCCCCCCCCCCCCCCC)O)CCCC")
+smiles(R"C(CCCCCCCCCC[C@H]([C@H](CO)NC(=O)C(CCCCCCCCCCCCCCCCCCCCCC)O)O)CCCC")
+smiles(R"CCCCCCCCCCC[C@H]([C@H](CO)[NH3+])O")
+smiles(R"C(CCCCCCCCCC[C@H]([C@H](CO)[NH3+])O)CC")
+smiles(R"CCCCCCCCCCCC(=O)[C@H](CO)[NH3+]")
+smiles(R"C(CCCCCCCCCCC(=O)[C@H](CO)[NH3+])CC")
+smiles(R"C(CCCCCCCCCCC(=O)[C@H](CO)[NH3+])CCCC")
+smiles(R"C(CCCCCCCCCCC(=O)[C@H](CO)[NH3+])CCCCCC")
+smiles(R"C(/C(=C/CC/C(=C/CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C)/C)/C)C/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(CCCCCCCCC[C@H]([C@H]([C@H](CO)NC(=O)CCCCCCCCCCCCCCCCCCCCCCCCC)O)O)CCCC")
+smiles(R"C(CCCCCCCCC[C@H]([C@H]([C@H](CO)NC(=O)CCCCCCCCCCCCCCCCCCCCCCCCC)O)O)CCCCCC")
+smiles(R"C(CCCCCCCCC[C@H]([C@H]([C@H](CO)NC(=O)C(CCCCCCCCCCCCCCCCCCCCCCCC)O)O)O)CCCC")
+smiles(R"C(CCCCCCCCC[C@H]([C@H]([C@H](CO)NC(=O)CCCCCCCCCCCCCCCCCCCCCCC)O)O)CCCC")
+smiles(R"C(CCCCCCCCC[C@H]([C@H]([C@H](CO)NC(=O)C(CCCCCCCCCCCCCCCCCCCCCC)O)O)O)CCCC")
+smiles(R"C(CCCCCCCCC[C@H]([C@H]([C@H](CO)NC(=O)CCCCCCCCCCCCCCC)O)O)CCCC")
+smiles(R"C(=C\CC/C(=C\CC/C(=C\COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)NC(=O)C)O)NC(=O)C)O)NC(=O)C)O)NC(=O)C)O)NC(=O)C)NC(=O)C)C)[O-])[O-])/C)/C)(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\C)/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C")
+smiles(R"C(=C\CC/C(=C\CC/C(=C\COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)NC(=O)C)O)NC(=O)C)NC(=O)C)C)[O-])[O-])/C)/C)(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\C)/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C")
+smiles(R"C(=C)[C@](CCC=C(C)C)(C)O")
+smiles(R"C(=C)[C@@](CCC=C(C)C)(C)O")
+smiles(R"C(=C)C(CCC=C(C)C)(C)O")
+smiles(R"C(CCCCCCCCC=O)CCC(C)C")
+smiles(R"C(C/C(=C\CCC(C)CCO)/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"CCCCCCCCCC(O)CCCCCCCCCCCC(=O)[O-]")
+smiles(R"C(/C=C\C/C=C\CCCC(=O)[O-])/C=C\C=C\[C@H](CCCCC)O")
+smiles(R"C(/C=C\C/C=C\CCCC(=O)[O-])/C=C\C=C\[C@H](CCCCC)OO")
+smiles(R"C(CCCCCCCCC(=O)[O-])O")
+smiles(R"C(=C\C(C/C=C\CCCC(=O)[O-])O)/[C@@H]1[C@H](C/C=C\CCCCC)O1")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OC1OC[C@H]([C@@H]([C@H]1O)O)O)[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@@H]1O)O)O)CO)[O-])/C)/C=C(\C)/CC/C=C(\C)/CCC=C(C)C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O)CO)[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(O[C@@H]1O[C@@H]([C@H]([C@@H]([C@@H]1O)O)O)CO)[O-])/C)/C=C(\C)/CC/C=C(\C)/CCC=C(C)C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)[O-])/C)/C=C(\C)/CC/C=C(\C)/CCC=C(C)C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)([O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@H]1O[C@@H]([C@H]([C@@H]([C@@H]1O)O)O)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)NC(=O)C)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O)CO)[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(=C(\CCC=C(C)C)/C)/COP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"C(=C(\CCC=C(C)C)/C)(/COP(=O)(OP(=O)([O-])[O-])[O-])\C")
+smiles(R"C(C/C(=C\CCC(C)CCOP(=O)(OP(=O)([O-])[O-])[O-])/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"C(/C=C\CCCCC)[C@H](/C=C/C=C/C=C\[C@H](CCCC(=O)[O-])O)O")
+smiles(R"C(C/C(=C\CC/C(=C\CO)/C)/C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"[C@@](CCC=C(C)C)([C@@H]1[C@@H]2[C@]([C@@]3(CC[C@@H]4[C@](CC[C@@H](C4(C)C)O)([C@H]3CC2)C)C)(CC1)C)(O)C")
+smiles(R"C(C(CCCC)CC)O")
+smiles(R"C(CCCCCC)C=O")
+smiles(R"C(CCCCCCC)O")
+smiles(R"C(/C=C\CCCCCO)/C=C\C=C\C=C\[C@H]([C@@H](O)CCCC(=O)[O-])SC[C@H]([NH3+])C(=O)[O-]")
+smiles(R"C(/C(=C/CCC(C=C)(O)C)/C)O")
+smiles(R"C(/C=C\CCCCCO)[C@H](/C=C/C=C/C=C\[C@H](CCCC(=O)[O-])O)O")
+smiles(R"C(CCCCCCC(=O)NCCO)/C=C\CCCCCC")
+smiles(R"CC(=CCC/C(=C/C(=O)[O-])/C)C")
+smiles(R"C(=CCC(C(=C)C)COP(=O)([O-])OP(=O)([O-])[O-])(C)C")
+smiles(R"C=C(C/C=C(/C)\C=O)C(C)C")
+smiles(R"C(=CCC/C(=C/CO)/C)(C)C")
+smiles(R"C(=C\CC/C(=C/CO)/C)(/CCC=C(C)C)\C")
+smiles(R"C(=C\CC/C(=C\CO)/C)(/CCC=C(C)C)\C")
+smiles(R"C(=C\CC/C(=C/C=O)/C)(/C=O)\C")
+smiles(R"C(=C\CC/C(=C/C=O)/C)(/CO)\C")
+smiles(R"C(=C\CC/C(=C/CO)/C)(/C=O)\C")
+smiles(R"C(=C\CC/C(=C/CO)/C)(/CO)\C")
+smiles(R"C(=C\CC/C(=C/COP(=O)(OP(=O)(OP(=O)(O)[O-])[O-])[O-])/C)(/CCC=C(C)C)\C")
+smiles(R"C(=C\CC/C(=C/CSC[C@@H](C(=O)[O-])[NH3+])/C)(/CCC=C(C)C)\C")
+smiles(R"C(/C=C\CC)[C@@H]1[C@@H](CC(=O)[O-])CCC1=O")
+smiles(R"C(/C=C\C=C\[C@H](CCCC(=O)[O-])OO)/C=C\C/C=C\CCCCC")
+smiles(R"C(C(C)C)CC=O")
+smiles(R"CC(=CCCC(=O)C)C")
+smiles(R"CC(=CCCC(O)C)C")
+smiles(R"CCCCCC(=O)NC")
+smiles(R"CCCCCC(=O)[O-]")
+smiles(R"C(CCCCC(=O)[O-])CCCC=O")
+smiles(R"C(CCCCC(=O)[O-])[NH3+]")
+smiles(R"C(=C\C)\C=C(\C(=O)[O-])/O")
+smiles(R"C(CCCCC(=O)[O-])O")
+smiles(R"CCCC[C@@H](C)[C@@H](O)[C@H](C[C@H](C[C@@H](CCCC[C@H](C[C@@H]([C@H](C)[NH3+])O)O)O)C)O")
+smiles(R"CCCC[C@@H](C)[C@@H](OC(=O)C[C@H](C(=O)[O-])CC(=O)[O-])[C@H](C[C@H](C[C@@H](CCCC[C@H](C[C@@H]([C@H](C)[NH3+])O)O)O)C)OC(=O)C[C@@H](CC(=O)[O-])C(=O)[O-]")
+smiles(R"C(CCC)[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(=C(C)C)CO")
+smiles(R"C(CC)(C)C=O")
+smiles(R"CC(C)CC=O")
+smiles(R"C(CCC)C(=O)N")
+smiles(R"CCCCC(=O)[O-]")
+smiles(R"C(=C\C(=C/C(=O)OC1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)\C)/[C@@]1(C(CC(=O)C=C1C)(C)C)O")
+smiles(R"C(=C\C(=C/C(=O)[O-])\C)/[C@@]1([C@@](CC(=O)C=C1C)(C)CO)O")
+smiles(R"C(=C\C(=C/C(=O)[O-])\C=C/C(=O)[O-])\C(=O)[O-]")
+smiles(R"C(CCCC(=O)[O-])C(CCS)S")
+smiles(R"C(=C(\C=C/C(=O)[O-])/Cl)\C(=O)[O-]")
+smiles(R"C(=C\C=C(/C(=O)[O-])\Cl)(\C(=O)[O-])/Cl")
+smiles(R"C(=C\C(=C/C=O)\O)\C(=O)[O-]")
+smiles(R"C(=C/C=C\C(=O)[O-])(C(=O)[O-])C(=O)[O-]")
+smiles(R"C(=C(\C=C/C(=O)[O-])/C(=O)[O-])\C(=O)[O-]")
+smiles(R"C(/C(=C(\C)/C(=O)[O-])/C(=O)[O-])C(=O)[O-]")
+smiles(R"C([C@](CCC(=O)[O-])(C(=O)[O-])O)C(=O)[O-]")
+smiles(R"C(C(CCC(=O)[O-])(C(=O)[O-])O)C(=O)[O-]")
+smiles(R"C(=C\C=C(/C(=O)[O-])\O)(/C[C@@H](C(=O)[O-])[NH3+])\C=O")
+smiles(R"CC(C)[C@@H]1CCC(=C2CCC(=C[C@@H]12)C)C")
+smiles(R"CC(C)[C@H]1CCC(=C2CCC(=C[C@H]12)C)C")
+smiles(R"C(C[C@]([C@H](CCCCCCCCCC)C(=O)[O-])(C(=O)[O-])O)C(=O)[O-]")
+smiles(R"C(=C\C([C@@H](C/C=C\CCCCC)O)O)/C(C/C=C\CCCC(=O)[O-])O")
+smiles(R"C(CC[C@@H](C(=O)[O-])NC(=O)C)C=O")
+smiles(R"C(CC[C@H](C(=O)[O-])[NH3+])[NH3+]")
+smiles(R"C(C)C(C#N)C")
+smiles(R"C/C(=C/CNc1c2c([nH]cn2)ncn1)/CO")
+smiles(R"C(/C(=C/CNc1c2c([nH]cn2)ncn1)/C)O")
+smiles(R"C(CCCNC(=[NH2+])N)NC(=[NH2+])N")
+smiles(R"C(CCCNC(=O)C)[NH3+]")
+smiles(R"C(CCC[NH2+]CC[C@@H](C(=O)[O-])[NH3+])[NH3+]")
+smiles(R"C(C(C)C)[NH3+]")
+smiles(R"CC(C)(C)[NH3+]")
+smiles(R"C(CCC[NH3+])C(=O)N")
+smiles(R"C(CCC[NH3+])[NH2+]CCC[NH2+]CCC[NH3+]")
+smiles(R"C(C)C(/C=N/O)C")
+smiles(R"C(C)C(/C=N\O)C")
+smiles(R"C(#C)CCO")
+smiles(R"C(CC)C=O")
+smiles(R"C(CCC)O")
+smiles(R"CC(=CC=O)C")
+smiles(R"CC(CCO)C")
+smiles(R"C(CCC=O)C(C(=O)[O-])[NH3+]")
+smiles(R"C(CCC=O)[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(=C\CC(=O)C(=O)[O-])\C(=O)[O-]")
+smiles(R"C(=C(\CC(=O)C(=O)[O-])/C(=O)[O-])\C(=O)[O-]")
+smiles(R"C(C(CC(=O)C(=O)[O-])(C(=O)[O-])O)C(=O)[O-]")
+smiles(R"C(CCC=O)[N+](C)(C)C")
+smiles(R"CCCC(=O)[O-]")
+smiles(R"C(C(CC(=O)[O-])C(=C)C)CC(=O)C")
+smiles(R"C(/C(=C(\C(=O)[O-])/C)/C(=O)[O-])C(=O)[O-]")
+smiles(R"C(=C(\C)/C(=O)[O-])/C(=O)[O-]")
+smiles(R"C(CCC(=O)[O-])C(=O)[O-]")
+smiles(R"C(C(CC(=O)[O-])C(=O)[O-])C(=O)[O-]")
+smiles(R"C(C(CC(=O)[O-])C(=O)[O-])(C(=O)[O-])OC(=O)/C=C\c1cc(c(cc1)O)O")
+smiles(R"C(CCC(=O)[O-])[N+](C)(C)C")
+smiles(R"C(CC(C(=O)[O-])[NH3+])C(=O)NC(C(=O)[O-])CSSCC(C(=O)[O-])NC(=O)CCC(C(=O)[O-])[NH3+]")
+smiles(R"C(C(C)C(=O)[O-])O")
+smiles(R"C(CC(C(=O)[O-])(O)CC(=O)[O-])CSC")
+smiles(R"C(CC(C(=O)[O-])(O)CC(=O)[O-])SC")
+smiles(R"C(C(CC(=O)[O-])O)[N+](C)(C)C")
+smiles(R"C(/C(=C\COP(=O)(OP(=O)([O-])[O-])[O-])/C)C/C=C(/CC/C=C(/CCC=C(C)C)\C)\C")
+smiles(R"CCCCS(=O)(=O)[O-]")
+smiles(R"C=C([C@@H]1CC(=O)O[C@@H](CC1)C)C")
+smiles(R"C=C([C@H]1CC(=O)O[C@@H](CC1)C)C")
+smiles(R"C(C[C@@H]1C(=O)CC[C@]2([C@H]1CCC2=O)C)C(=O)/C(=C/C=C(/C(=O)[O-])\O)/C")
+smiles(R"C(C[C@@H]1C(=O)CC[C@]2([C@H]1CCC2=O)C)C(=O)/C(=C\C=C(\O)/C(=O)[O-])/C")
+smiles(R"C(C[C@@H]1C(=O)CC[C@]2([C@H]1CCC2=O)C)C(=O)[O-]")
+smiles(R"C=C([C@H]1COC(=O)[C@@H](CC1)C)C")
+smiles(R"C([C@]([C@H](CCCCCCCCCC)C(=O)[O-])(C(=O)[O-])O)C(=O)[O-]")
+smiles(R"C(=C\[C@H](C/C=C\CCCCC)OO)/C=C\C/C=C\CCCC(=O)[O-]")
+smiles(R"CC[C@@H](CC(=O)C(=O)[O-])O")
+smiles(R"C(C[C@H]([C@H](C(=O)[O-])[NH3+])C)[NH3+]")
+smiles(R"C(C[C@H](C[NH3+])O)[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C([C@]([C@@H](C(=O)[O-])C)(C(=O)[O-])O)C(=O)[O-]")
+smiles(R"C(C[C@@H](C(=O)[O-])[NH3+])C(=O)N[C@H](C(=O)[O-])CS")
+smiles(R"C(C[C@H](NC(=O)C)C(=O)[O-])C(=O)[O-]")
+smiles(R"C(C[C@H](NC=O)C(=O)[O-])SC")
+smiles(R"C(C[C@H]([NH3+])C=O)C(=O)[O-]")
+smiles(R"C(=C\[C@@H](O)CCCCC)/[C@@H]1[C@@H](C/C=C\CCCC(=O)[O-])C(=O)C[C@H]1O")
+smiles(R"C(=C\[C@@H](OO)C/C=C\CC)/C=C\CCCCCCCC(=O)[O-]")
+smiles(R"C(CCNC(=[NH2+])N)[C@H]([NH2+][C@@H](C(=O)[O-])CCC(=O)[O-])C(=O)[O-]")
+smiles(R"C(CCNC(=O)c1ccccc1)[C@@H](C(=O)[O-])NC(=O)c1ccccc1")
+smiles(R"C(CCNC(=O)C)[NH2+]CCCC=O")
+smiles(R"C(CCNC(=O)N)[C@@H](C(=O)[O-])NC(=O)C")
+smiles(R"C(CC[NH2+]CCCNC(=O)C)C[NH3+]")
+smiles(R"C(CC[NH2+]CCC[NH2+]CCC[NH3+])[NH3+]")
+smiles(R"C(CC[NH2+][C@@H](C)C(=O)[O-])[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(C)(C)[NH3+]")
+smiles(R"C(CC[NH3+])CC[NH3+]")
+smiles(R"C(C(C)[NH3+])C(C(=O)[O-])[NH3+]")
+smiles(R"C(CC[NH3+])[C@@H](C(=O)[O-])NC(=O)C")
+smiles(R"C(CC[NH3+])[NH3+]")
+smiles(R"CC(/C=N/O)C")
+smiles(R"C=CC=O")
+smiles(R"C(=C)CO")
+smiles(R"C(C)C=O")
+smiles(R"C#CCO")
+smiles(R"CC(C)O")
+smiles(R"C(C(CO)c1cc(c(cc1)OC)OC)(O)c1cc(c(cc1)OC)OC")
+smiles(R"C(=C\C=O)(/CCC=C(C)C)\C")
+smiles(R"CCC(=O)C(CC)O")
+smiles(R"C(=C\C=O)(\C=C(/C(=O)[O-])\O)/C(=O)[O-]")
+smiles(R"C(=C\C=O)(/C[C@@H](C(=O)[O-])[NH3+])\C=C(/C(=O)[O-])\O")
+smiles(R"C([C@@](C)(O)C#N)C")
+smiles(R"C(C(C)(O)C#N)C")
+smiles(R"C(CC=O)C[NH3+]")
+smiles(R"C(#CCO)CO")
+smiles(R"C(CCO)C(=O)[O-]")
+smiles(R"C(=C\C(=O)C(=O)[O-])\c1c(cccc1)C(=O)[O-]")
+smiles(R"C(C(C)O)[N+](C)(C)C")
+smiles(R"C(=C)(C(=O)N)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(=C)C(=O)[O-]")
+smiles(R"C#CC(=O)[O-]")
+smiles(R"C(=C\C(=O)[O-])/c1c[nH]cn1")
+smiles(R"C(CC(=O)[O-])(CCCC(CCCC(CCCC(C)C)C)C)C")
+smiles(R"C(=C(\C(=O)[O-])/C)/C=C/C(=C/C=C/C=C(/C=C/C=C(/C(=O)[O-])\C)\C)/C")
+smiles(R"C(CC(=O)[O-])C/C=C\C/C=C\C/C=C\C=C\C(=O)CCCCC")
+smiles(R"C(CC(=O)[O-])CCCCC/C=C\C=C\[C@H](/C=C\CCC)OO")
+smiles(R"C(=C\C(=O)[O-])(/CCC(=O)[O-])\C(=O)[O-]")
+smiles(R"C(=C\C(=O)[O-])(\C=C/C(=O)[O-])/O")
+smiles(R"C(=C\C(=O)[O-])(\C=C(/C(=O)[O-])\O)/C(=O)[O-]")
+smiles(R"C(=C(\C(=O)[O-])/C)/C(=O)[O-]")
+smiles(R"C(=C)(C(=O)[O-])CC(=O)[O-]")
+smiles(R"C(CC(=O)[O-])CNC(=O)C")
+smiles(R"C(=C\C(=O)[O-])\C(=O)CC(=O)C(=O)[O-]")
+smiles(R"C(CC(=O)[O-])(C(=O)C(=O)[O-])C(=O)[O-]")
+smiles(R"C(=C\C(=O)[O-])/C(=O)[O-]")
+smiles(R"C(CC(=O)[O-])C(=O)[O-]")
+smiles(R"C(C(C(=O)[O-])[NH3+])CSSCCC(C(=O)[O-])[NH3+]")
+smiles(R"C(C(C(=O)[O-])N)[NH3+]")
+smiles(R"C(C(CO)O)O")
+smiles(R"C(=C(\C(=O)[O-])/O)/C=C")
+smiles(R"C(=C(\C(=O)[O-])/O)\C=C")
+smiles(R"C(=C(\C(=O)[O-])/O)/C=C/C(=O)[O-]")
+smiles(R"C(=C(\C(=O)[O-])/O)\C=C/C(=O)[O-]")
+smiles(R"C(C(CO)O)(O)C(=O)CO")
+smiles(R"C(CC(SC(=O)C)CCS)CCC(=O)N")
+smiles(R"C(C(CS)O)(CS)O")
+smiles(R"C[C@H]1CC(=O)O[C@@H](CC1)C(C)C")
+smiles(R"C([C@@H]1[C@H]([C@H]([C@H](n2cnc3c(N)ncnc23)O1)O)O)OP(=O)(OP(=O)(OP(=O)(OP(=O)(OP(=O)(OC[C@@H]1[C@H]([C@H]([C@H](n2cnc3c2ncnc3N)O1)O)O)[O-])[O-])[O-])[O-])[O-]")
+smiles(R"C([C@H](Cc1nc[nH]c1)[NH3+])O")
+smiles(R"C([C@@H]([C@](C)(C(=O)[O-])O)C(=O)[O-])C(=O)[O-]")
+smiles(R"C[C@@H](CC(=O)C(=O)[O-])O")
+smiles(R"C([C@@H](CC(=O)[O-])O)[N+](C)(C)C")
+smiles(R"C([C@H](CC(=O)[O-])O)[N+](C)(C)C")
+smiles(R"C([C@@H]([C@@H](/C=C/CCCCCCCCCCCCC)O)[NH3+])OP(=O)(OCC[N+](C)(C)C)[O-]")
+smiles(R"C([C@H]([C@H]([C@@H]([C@@H](CO)O)O)O)O)O")
+smiles(R"C([C@H]([C@H]([C@@H]([C@@H](CO)O)O)O)O)OP(=O)([O-])[O-]")
+smiles(R"C([C@@H]([C@H]([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)O)O)O")
+smiles(R"C[C@@H]([C@@H]([C@H](C(=O)CO)O)O)O")
+smiles(R"C([C@H]([C@H]([C@@H](C(=O)C(=O)[O-])O)O)O)OP(=O)([O-])[O-]")
+smiles(R"C([C@@H]([C@@H]([C@@H](CO)O)O)O)O")
+smiles(R"C([C@@H]([C@H]([C@H](CO)O)O)O)O")
+smiles(R"C([C@H]([C@@H]([C@H](C(=O)[O-])O)O)O)O")
+smiles(R"C([C@H]([C@@H]([C@@H](CO)O)O)O)OP(=O)([O-])[O-]")
+smiles(R"C([C@@H]([C@H]([C@@H](COP(=O)([O-])[O-])O)O)O)O")
+smiles(R"C([C@@H]([C@H]([C@H](O)CO)O)O)O")
+smiles(R"C([C@H]([C@@H](C(=O)C)O)O)[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C([C@H]([C@@H](C(=O)C)O)O)C(=O)C(=O)[O-]")
+smiles(R"C[C@@H]([C@H](C)O)O")
+smiles(R"C[C@H]([C@@H](C)O)O")
+smiles(R"C([C@H]([C@@H](CO)O)O)O")
+smiles(R"C([C@@H]([C@H](O)CO)O)C=O")
+smiles(R"C([C@H](C[N+](C)(C)C)OC(=O)C)C(=O)[O-]")
+smiles(R"C([C@H](C[N+](C)(C)C)O)C(=O)N")
+smiles(R"C([C@H](C)[NH3+])[C@H](C(=O)[O-])[NH3+]")
+smiles(R"C[C@H](C[NH3+])OP(=O)([O-])[O-]")
+smiles(R"C([C@@H](C(=O)C(=O)C)O)O")
+smiles(R"C[C@@H](C(=O)NCC(=O)[O-])[NH3+]")
+smiles(R"C([C@@H](C)O)[NH3+]")
+smiles(R"[C@]([C@@H](C(=O)[O-])C)(C(=O)[O-])(O)C")
+smiles(R"C([C@@H](C(=O)[O-])[NH3+])CCNC(=[NH2+])NO")
+smiles(R"C([C@@H](C(=O)[O-])[NH3+])[C@@H](O)C=O")
+smiles(R"C([C@@H](C(=O)[O-])[NH3+])C[NH2+][C@@H](CC[NH+]1[C@@H](CC1)C(=O)[O-])C(=O)[O-]")
+smiles(R"C([C@@H](C(=O)[O-])[NH3+])SCC(=O)[O-]")
+smiles(R"C([C@@H](C(=O)[O-])[NH3+])SS")
+smiles(R"C([C@@H](C(=O)[O-])N(O)O)c1ccccc1")
+smiles(R"[C@]([C@H](C(=O)[O-])O)(CC)(C)O")
+smiles(R"C([C@H](C(=O)[O-])O)[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C([C@@H](C(=O)[O-])O)S(=O)(=O)[O-]")
+smiles(R"C([C@@H](CO)O)S(=O)(=O)[O-]")
+smiles(R"C([C@H](C(=O)SC)O)OP(=O)([O-])[O-]")
+smiles(R"C([C@H]([NH3+])C(=O)[O-])c1ccccc1")
+smiles(R"C([C@H](NO)C(=O)[O-])c1ccccc1")
+smiles(R"C([C@H](O)C(=O)[O-])C[NH2+][C@@H](CC[NH+]1[C@@H](CC1)C(=O)[O-])C(=O)[O-]")
+smiles(R"C([C@H](O)C(=O)[O-])C[NH2+][C@H](C(=O)[O-])CCN1[C@H](C(=O)[O-])[C@H](C1)O")
+smiles(R"C([C@H](O)C(=O)[O-])C[NH2+][C@H](C(=O)[O-])[C@H](CN1[C@@H](CC1)C(=O)[O-])O")
+smiles(R"C([C@H](O)C(=O)[O-])C[NH2+][C@H](C(=O)[O-])[C@H](CN1[C@H](C(=O)[O-])[C@H](C1)O)O")
+smiles(R"CCl")
+smiles(R"C(Cl)Br")
+smiles(R"C(CNC(=[NH2+])N)S(=O)(=O)[O-]")
+smiles(R"C(CNC(=O)C)C=O")
+smiles(R"C(C[NH2+]C)(O)c1ccc(cc1)O")
+smiles(R"CC[NH3+]")
+smiles(R"C(C[NH3+])c1c[nH]cn1")
+smiles(R"C(C[NH3+])C=O")
+smiles(R"C(C[NH3+])O")
+smiles(R"C(C[NH3+])P(=O)([O-])O")
+smiles(R"C(C[NH3+])S(=O)[O-]")
+smiles(R"CC(=NO)C")
+smiles(R"CCO")
+smiles(R"CC(=O)C")
+smiles(R"C(=C)(Oc1c(c(ccc1)C(=O)[O-])N)C(=O)[O-]")
+smiles(R"C(C(=O)C)CC")
+smiles(R"CC(=O)CCC1=C(C)CCCC1(C)C")
+smiles(R"CC(=O)CCCCCCCCC")
+smiles(R"C(C(=O)C(C(CO)O)O)O")
+smiles(R"CC(=O)C(C)O")
+smiles(R"CC(=O)CC(=O)C(=O)[O-]")
+smiles(R"CC(=O)CC(=O)[O-]")
+smiles(R"C(C(=O)CC(=O)[O-])C(=O)C")
+smiles(R"CC(=O)[C@@](C(=O)[O-])(O)CC")
+smiles(R"C(C(=O)[C@H]([C@@H](CC(=O)[O-])O)O)O")
+smiles(R"CC(=O)[C@H]([C@@H]([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)O)O")
+smiles(R"C(C(=O)[C@H]([C@@H]([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)O)O)OP(=O)([O-])[O-]")
+smiles(R"C(C(=O)[C@H]([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)O)[NH2+]CCCC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(C(=O)[C@@H]([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)O)O")
+smiles(R"C(C(=O)[C@H]([C@@H](C(=O)CO)O)O)O")
+smiles(R"C(C(=O)[C@@H]([C@@H](CO)O)O)O")
+smiles(R"C(C(=O)[C@@H]([C@H](COP(=O)([O-])[O-])O)O)O")
+smiles(R"C(C(=O)[C@@H]([C@@H](COP(=O)([O-])[O-])O)O)OP(=O)([O-])[O-]")
+smiles(R"CC(=O)[C@@H](C)O")
+smiles(R"CC(=O)[C@H](C)O")
+smiles(R"C(CO)[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(C)(O)C=O")
+smiles(R"C(CO)C=O")
+smiles(R"C(CO)CO")
+smiles(R"C(COC(=O)/C=C/c1cc(c(c(c1)OC)O)OC)[N+](C)(C)C")
+smiles(R"CC(=O)C(O)C(O)CO")
+smiles(R"C(=C(\O)/C(=O)[O-])/c1ccccc1")
+smiles(R"C(C(=O)C(=O)[O-])C(C)C")
+smiles(R"[C@](C(=O)C(=O)[O-])(CC)(C)O")
+smiles(R"C(C(=O)C(=O)OCC)(C(=O)OCC)C")
+smiles(R"C(C(=O)C(=O)[O-])[C@@H](CO)O")
+smiles(R"C(C(=O)C(=O)[O-])[C@H](CO)O")
+smiles(R"C(C(=O)C(=O)[O-])[C@@H](O)[C@H](C)O")
+smiles(R"C(C(=O)C(=O)[O-])C[NH2+][C@@H](CC[NH+]1[C@@H](CC1)C(=O)[O-])C(=O)[O-]")
+smiles(R"C(C(=O)C(=O)[O-])C(=O)[O-]")
+smiles(R"C(C(=O)C(=O)[O-])(C(=O)[O-])C")
+smiles(R"C(C(=O)C(=O)[O-])C(=O)OC")
+smiles(R"C(C(=O)C)OP(=O)([O-])[O-]")
+smiles(R"CC(O)COP(=O)([O-])[O-]")
+smiles(R"CC(=O)NCCc1ccccc1")
+smiles(R"C(C(=O)NC)C[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"CC(=O)NCCC[NH2+]CCCC[NH2+]CCC[NH3+]")
+smiles(R"C(C(=O)N[C@H]1[C@@H]([C@@H](O)[C@H](O)[C@H](O1)CO)NC(=O)C)[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"CC(=O)N[C@H]1[C@@H](C)O[C@@H]([C@H](O)[C@H]1O)O[C@@H]1[C@H](O[C@@H](O[C@@H]2[C@H](O[C@H](OP(=O)(OP(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)[O-])[O-])[C@@H]([C@H]2O)NC(=O)C)CO)[C@H]([C@H]1O)NC(=O)C)C(=O)[O-]")
+smiles(R"CC(=O)N[C@H]1[C@@H](O[C@H](CO)[C@@H](O)[C@@H]1O[C@H](C)C(=O)[O-])O")
+smiles(R"C(C(=O)N[C@H](C(=O)[O-])CCC[NH3+])CC(=O)[O-]")
+smiles(R"C(C(=O)N[C@H](C(=O)[O-])CCC=O)CC(=O)[O-]")
+smiles(R"C(C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-])CC(=O)[O-]")
+smiles(R"C(C=O)[NH3+]")
+smiles(R"C(CO)O")
+smiles(R"CC(=O)[O-]")
+smiles(R"C(CO)(O)c1cc(c(cc1)OC)OC")
+smiles(R"C(C(=O)[O-])C#C")
+smiles(R"C(C(=O)[O-])C(C)CCC(C(C)C)O")
+smiles(R"C(C(=O)[O-])(C)C(=C)C(=O)[O-]")
+smiles(R"CC(=O)OCC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(C(=O)[O-])CC[NH3+]")
+smiles(R"C(C(=O)[O-])CC(=O)C=O")
+smiles(R"C(C(=O)[O-])(CC(=O)C(=O)[O-])(C)O")
+smiles(R"C(C(=O)[O-])(CC(=O)[O-])C(C(=O)[O-])O")
+smiles(R"C(C(=O)[O-])[C@](C(=O)[O-])(O)C(C)C")
+smiles(R"C(C(=O)[O-])[C@H](C)CC[C@@H](C(C)C)O")
+smiles(R"C(C(=O)[O-])C=O")
+smiles(R"C(C(=O)[O-])C(=O)C(C)C")
+smiles(R"C(C(=O)[O-])(C(=O)[O-])C")
+smiles(R"C(C(=O)[O-])(C(=O)[O-])[NH3+]")
+smiles(R"C(C(=O)[O-])C[S+](C)C")
+smiles(R"C(C(=O)[O-])NC(=[NH2+])NP(=O)([O-])[O-]")
+smiles(R"C(C(=O)[O-])NC(=O)[C@H]1[NH2+]CCC1")
+smiles(R"C(COP(=O)(OCC(CO)O)[O-])(CO)O")
+smiles(R"C(C=O)P(=O)([O-])O")
+smiles(R"C(COP(=O)([O-])[O-])[NH3+]")
+smiles(R"CC(=O)[S-]")
+smiles(R"CC(=O)SCC[NH3+]")
+smiles(R"C(C=O)S(=O)(=O)[O-]")
+smiles(R"C(CSC)C[NH3+]")
+smiles(R"C(CS)[NH3+]")
+smiles(R"CCS(=O)(=O)[O-]")
+smiles(R"[Cd+2]")
+smiles(R"C(F)C=O")
+smiles(R"C(F)C(=O)[O-]")
+smiles(R"[C@H]12[C@]3(CC(C1)(C)C)[C@H](C(=C2)C(=O)[O-])CC[C@H]3C")
+smiles(R"[C@H]12c3c(cc4c(c3)OCO4)CCN1Cc1c(C2)ccc2c1OCO2")
+smiles(R"[C@H]12c3c(cc(c(c3)OC)OC)CCN1Cc1c(C2)ccc(c1OC)OC")
+smiles(R"[C@H]12[C@@]3(CCC[C@](CC[C@@H]1C(C2)(C)C)(C3)C)O")
+smiles(R"[C@H]12[C@]3(CC([C@@H]1O)(C)C)[C@H](C(=C2)C(=O)[O-])CC[C@H]3C")
+smiles(R"[C@@H]12[C@]3(CC[C@@H](CC3=C[C@H]([C@H]1[C@H]1[C@](CC2)([C@H](CC1)[C@H](C)CC[C@H](C(C)C)O)C)O)O)C")
+smiles(R"[C@@H]12c3c(CC[N+]2=C/C(=C/C)/[C@H](C1)/C(=C/O)/C(=O)OC)c1c([nH]3)cccc1")
+smiles(R"[C@H]12[C@]3([C@@H]([C@](CCC3)(C)C(=O)[O-])CC[C@]31C[C@H](CC2)C(=C)C3)C")
+smiles(R"[C@H]12[C@]3([C@@H]([C@](CCC3)(C)C(=O)[O-])C[C@@H]([C@]31C[C@H](CC2)C(=C)C3)O)C")
+smiles(R"[C@H]12c3c(OC([C@@H]1CCC(=C2)C)(C)C)cc(c(c3O)C(=O)[O-])CCCCC")
+smiles(R"[C@H]12[C@]([C@]3(C(=CC2=O)[C@H]2[C@@](CC3)(CC[C@@](C2)(C(=O)[O-])C)C)C)(CC[C@@H]2[C@@]1(CC[C@@H](C2(C)C)O)C)C")
+smiles(R"[C@H]12[C@]([C@]3(C(=CC2=O)[C@H]2[C@@](CC3)(CC[C@@](C2)(C(=O)[O-])C)C)C)(CC[C@@H]2[C@@]1(CC[C@H](C2(C)C)O)C)C")
+smiles(R"[C@H]12[C@]([C@]3(C(=CC2=O)[C@H]2[C@@](CC3)(CC[C@@](C2)(C(=O)[O-])C)C)C)(CC[C@@H]2[C@@]1(CCC(=O)C2(C)C)C)C")
+smiles(R"[C@@H]12CC=C3C[C@H](CC[C@@]3([C@H]1CC[C@]1([C@H]2CC[C@@H]1[C@H](C)CC[C@@H](C(C)C)O)C)C)O")
+smiles(R"[C@@H]12CC=C3C[C@H](CC[C@@]3([C@H]1CC[C@]1([C@H]2CC[C@@H]1[C@H](C)CC[C@H](C(C)C)O)C)C)O")
+smiles(R"[C@@H]12CC=C3[C@H](CC[C@]4([C@H]3CC[C@@H]4[C@@H](CCCC(C)C)C)C)[C@@]1(C)CC[C@H](O)[C@]2(C(=O)[O-])C")
+smiles(R"[C@@H]12CC[C@](C2)(C)C(=O)C1(C)C")
+smiles(R"[C@H]12[C@@](C(=CCC1)C)(CC[C@H]([C@]2(CCC(=C)C=C)C)C)C")
+smiles(R"[C@H]12[C@@](C(=CCC1)C)(CC[C@H]([C@]2(CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C)C)C)C")
+smiles(R"[C@@H]12[C@](CCCC1=C)(CC[C@H](C2)C(O)(C)C)C")
+smiles(R"[C@@H]12[C@@](CCCC2(C)C)(C2=CC[C@@](C[C@@H]2CC1)(C=C)C)C")
+smiles(R"[C@H]12C(=C[C@@](CC2)(C)C=C)CC[C@@H]2[C@@]1(CCCC2(C)C)C")
+smiles(R"[C@@H]12[C@@](CCCC2(C)C)([C@H]2C(=C[C@](CC2)(C=C)C)CC1)C")
+smiles(R"[C@@H]12[C@@](CCCC2(C)C)([C@H]2C(=C[C@@](CC2)(C=C)C)CC1)C")
+smiles(R"[C@@H]12C(=CC(=CC2)C)[C@H](CC[C@H]1C)C(C)C")
+smiles(R"[C@@H]12C(=CC(=C)CC2)[C@H](CC[C@H]1C)C(C)C")
+smiles(R"[C@H]12C=C(CCC=C(CC[C@H]1C2(C)C)C)C")
+smiles(R"[C@@H]12C=C(CCC=C(CC[C@H]1C(=C)C(=O)O2)C)C")
+smiles(R"[C@H]12C(=CC[C@@H]3[C@@]1(CCCC3(C)C)C)C=C(CC2)C(C)C")
+smiles(R"[C@H]12C(=CC[C@@H]3[C@@]1(CCCC3(C)C)C)C[C@@](CC2)(C)C=C")
+smiles(R"[C@H]12C(=CC[C@@H]3[C@@]1(CC[C@@H](C3(C)C)O)C)[C@H]1[C@](CC2)([C@H](CC1)[C@@H](CCCC(C)C)C)C")
+smiles(R"[C@H]12C(=CC[C@H]3[C@]2(CC[C@@]2([C@@]3(CC[C@](C2)(CCC=C(C)C)C)C)C)C)C([C@H](CC1)O)(C)C")
+smiles(R"[C@H]12C(=CC[C@@H]3[C@]2(C(=O)C[C@]2([C@]3(C[C@H]([C@@H]2[C@@](C(=O)/C=C/C(OC(=O)C)(C)C)(C)O)O)C)C)C)C(C(=O)[C@H](C1)O)(C)C")
+smiles(R"[C@H]12C(=CC[C@@H]3[C@]2(C(=O)C[C@]2([C@]3(C[C@H]([C@@H]2[C@@](C(=O)CCC(OC(=O)C)(C)C)(C)O)O)C)C)C)C(C(=O)[C@H](C1)O)(C)C")
+smiles(R"[C@H]12CC=C([C@H](C1(C)C)C2)C")
+smiles(R"[C@H]12C(=C)C([C@H](CC1)C2)(C)C")
+smiles(R"[C@H]12C(C(=C)[C@H](CC1)C2)(C)C")
+smiles(R"[C@@H]12CC[C@H]([C@@H]3C(=C(CC3)C)[C@@H]1C2(C)C)C")
+smiles(R"[C@@H]12[C@@]([C@@H]3C(=CC2)C[C@@](CC3)(C)C=C)(CCC[C@@]1(C)C(=O)[O-])C")
+smiles(R"[C@@H]12C[C@@H]3C(=C)[C@H](CC[C@]3(C[C@@H](C(=C(CC1)C)C2(C)C)O)C)OC(=O)C")
+smiles(R"[C@H]12[C@]([C@H](CC[C@@H]1C(C)C)C)(CCC(=C2)C)O")
+smiles(R"[C@@H]12C[C@@H](C[C@@H]([C@@H]3[C@H]1O3)N2C)OC(=O)[C@H](CO)c1ccccc1")
+smiles(R"[C@H]12[C@](C(=O)c3c(C1)c(c1c(c3O)c(ccc1)O)C)(C(=O)C(=C([C@H]2[NH+](C)C)[O-])C(=O)N)O")
+smiles(R"[C@H]12CC(=O)N1[C@@H](/C(=C/C[NH3+])/O2)C(=O)[O-]")
+smiles(R"[C@H]12CC(=O)N1[C@@H]([C@H](O2)CC[NH3+])C(=O)[O-]")
+smiles(R"[C@H]12[C@H]3[C@@]([C@H](CC3)CC=O)(CC[C@@H]1[C@@]1(C(CC2)CCCC1)C)C")
+smiles(R"[C@H]12[C@H]3[C@@]([C@H](CC3)CCO)(CC[C@@H]1[C@@]1(C(CC2)CCCC1)C)C")
+smiles(R"[C@H]12[C@@H](c3c(CC1)cc(cc3)O[C@@H]1O[C@H](C(=O)[O-])[C@H]([C@H](O)[C@H]1O)O)CC[C@@]1([C@H](O[C@@H]3[C@@H]([C@@H](O)[C@H](O)[C@H](O3)CO)NC(=O)C)CC[C@@H]21)C")
+smiles(R"[C@H]12[C@@H]([C@@]3(C(=CC1)C[C@H](CC3)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)C)CC[C@@]1(C)[C@H]2CC[C@@H]1[C@@H](CCCC(C)C)C")
+smiles(R"[C@@H]12[C@H](c3c(O2)c(c(cc3)O)CCC(C)(C)O)COc2c1ccc(c2)O")
+smiles(R"[C@@H]12[C@H](c3c(O2)cc(cc3)OC)COc2c1ccc(c2)O")
+smiles(R"[C@H]12[C@@H](CCC3=CC(=O)CC[C@]13C)[C@H]1[C@@](CC2)(C)OC(=O)CC1")
+smiles(R"[C@H]12[C@@H](CCC3=CC(=O)CC[C@]13C)[C@@H]([C@@](CC2)(C)O)CCC(=O)[O-]")
+smiles(R"[C@@H]12[C@@H](CC(=CC1)C)C2(C)C")
+smiles(R"[C@H]12[C@H](CC(=CC1)C)C2(C)C")
+smiles(R"[C@H]12[C@H](C=C(CC1)C)[C@H](CC[C@@]2(C)O)C(C)C")
+smiles(R"[C@H]12[C@H](C=C(CC1)C)[C@@H](CC[C@H]2C)C(=C)C=O")
+smiles(R"[C@H]12[C@H](C=C(CC1)C)[C@@H](CC[C@H]2C)C(=C)CO")
+smiles(R"[C@H]12[C@H](C=C(CC1)C)[C@@H](CC[C@H]2C)C(=C)C(=O)[O-]")
+smiles(R"[C@H]12[C@H](C=C(CC1)C)[C@@H](CC[C@H]2C)[C@@H](C)C=O")
+smiles(R"[C@H]12[C@H](CC(=C([C@H](C[C@]3([C@@H](C(=C)[C@H](CC3)OC(=O)C)[C@@H]1OC(=O)C)C)O)C2(C)C)C)OC(=O)C")
+smiles(R"[C@H]12[C@H](CC(=C([C@H](C[C@]3([C@@H](C(=C)[C@H](CC3)OC(=O)C)[C@@H]1OC(=O)C)C)OC(=O)C)C2(C)C)C)OC(=O)C")
+smiles(R"[C@@H]12[C@@H](C(=CO[C@H]1O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)C(=O)[O-])C[C@@H]([C@@H]2C)O")
+smiles(R"[C@@H]12[C@@H]([C@H](OC1)c1cc(c(cc1)O)OC)CO[C@@H]2c1cc(c(cc1)O)OC")
+smiles(R"[C@H]12[C@H]([C@H](O[C@H]([C@H]1O[C@]1(O2)[C@@H]([C@H]([C@H]([C@H](O1)C(CO)[NH3+])O)O)O)O[C@H]1[C@@H]([C@H](C[C@H]([C@@H]1O)[NH3+])[NH2+]C)OP(=O)([O-])[O-])CO)O")
+smiles(R"[C@@H]12[C@@H](CO[C@H]1c1ccc(c(c1)OC)O)[C@@H](OC2)c1cc(c(cc1)O)OC")
+smiles(R"[C@@H]12[C@@H](NC(=O)N1)CS[C@H]2CCCCC(=O)N")
+smiles(R"[C@@H]12[C@@H](NC(=O)N1)CS[C@H]2CCCCC(=O)[O-]")
+smiles(R"[C@@H]12[C@@H](NC(=O)N1)CS[C@H]2CCCCC(=O)OP(=O)(OC[C@H]1O[C@@H](n2c3c(nc2)c(ncn3)N)[C@@H]([C@@H]1O)O)[O-]")
+smiles(R"[C@@H]12[C@@H](NC(=O)N1)CS(=O)[C@H]2CCCCC(=O)[O-]")
+smiles(R"[C@@H]12[C@H](OP(=O)(O2)[O-])[C@H](O)[C@H]([C@H](O)[C@H]1O)O")
+smiles(R"[C@H]1(c2ccccc2C=C[C@@H]1O)O")
+smiles(R"[C@H]1(c2ccccc2)CO1")
+smiles(R"[C@H]1(c2c(cc(c(c2O)C(=O)[O-])CCCCC)O)[C@@H](CCC(=C1)C)C(=C)C")
+smiles(R"[C@@H]1(c2c(CC[NH2+]1)cc(c(c2)O)O)C[C@H]1[C@@H](C=C)[C@@H](OC=C1C(=O)OC)O[C@@H]1O[C@H](CO)[C@H]([C@H](O)[C@H]1O)O")
+smiles(R"[C@@H]1(c2c(=O)[nH]c(=O)[nH]c2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(CC[C@@]2(C)CCC=C(C)[C@@H]2C1)C(=C)C")
+smiles(R"[C@@H]1(CC[C@]2(C[C@@H](C3=C(C[C@@H]([C@@H](C[C@@H]2C1=C)C3(C)C)O)C)O)C)OC(=O)C")
+smiles(R"[C@H]1(CC[C@@]2([C@H](C1)C(=CCC2)C)C)C(=C)C")
+smiles(R"[C@H]1(CC[C@@]2([C@@H](C1)C(=C)CCC2)C)C(=C)C")
+smiles(R"[C@H]1(C(=CCC1=O)/C=C/[C@H](CCCCC)O)CCCCCCC(=O)[O-]")
+smiles(R"[C@H]1([C@@](C=CC(=C1)C)(O)C(=O)[O-])O")
+smiles(R"[C@H]1(C=CC(=C)CC1)[C@H](CCC=C(C)C)C")
+smiles(R"[C@@H]1(C=C(CCC=C(CC[C@@H]1C(C)C)C)C)O")
+smiles(R"[C@H]1(CCC(=C(C)C)[C@H]([C@@]1(CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)C)CCC=O)C")
+smiles(R"[C@@H]1(C=C(CC[C@@H]1C(=C)C)C)O")
+smiles(R"[C@H]1(C=C(C=C[C@H]1[NH3+])C(=O)[O-])OC(=C)C(=O)[O-]")
+smiles(R"[C@H]1(CCCC[C@H]1O)O")
+smiles(R"[C@H]1(C(=C)CC[C@@H]2[C@@]1(CCCC2(C)C)C)C/C=C(/C=C)\C")
+smiles(R"[C@@H]1(C(=C)CC[C@@H]2[C@@]1(CCCC2(C)C)C)CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C")
+smiles(R"[C@H]1(C(=C)CC[C@@H]2[C@@]1(CCCC2(C)C)C)CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C")
+smiles(R"[C@H]1(C(=C)CC[C@H]2[C@]1(CCCC2(C)C)C)CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C")
+smiles(R"[C@@H]1([C@](CC[C@@H]2[C@@]1(CCCC2(C)C)C)(C)O)CC/C(=C/COP(=O)(OP(=O)([O-])[O-])[O-])/C")
+smiles(R"[C@H]1(C(C)(C)[C@H]2CC[C@@]1(C)C2)O")
+smiles(R"[C@@H]1(C(=CC[C@@H](C1)C(=C)C)C)O")
+smiles(R"[C@H]1(C(=CC[C@@H](C1)C(=C)C)C)O")
+smiles(R"[C@H]1(C(=CC[C@H](C1)C(=C)C)C)O")
+smiles(R"[C@H]1(C[C@](C[C@H]([C@@H]1O)O)(C(=O)[O-])O)OC(=O)/C=C/c1cc(c(cc1)O)O")
+smiles(R"[C@H]1(C=CCC(=O)[C@H]1[NH3+])C(=O)[O-]")
+smiles(R"[C@H]1(CC[C@@H]2[C@@]31CC=C([C@@H](C3)C2(C)C)C)C")
+smiles(R"[C@H]1(CC[C@@H]2[C@@]31CC[C@]([C@@H](C3)C2(C)C)(C)O)C")
+smiles(R"[C@@H]1(C=C[C@@H]2[C@@H]([C@H]1CC[C@@H]1C[C@H](CC(=O)O1)O)CC[C@H](C2)C)C")
+smiles(R"[C@H]1(CC[C@H](C[C@H]1O)C)C(C)(C)O")
+smiles(R"[C@H]1(CC[C@H]([C@H]2[C@@H]1C=C(CC2)C)C)C(=C)C")
+smiles(R"[C@H]1(CC(C[NH2+]1)O)C(=O)[O-]")
+smiles(R"[C@H]1(C(=C(C(=O)O1)[O-])[O])[C@H](CO)O")
+smiles(R"[C@H]1(C[C@H]([C@H](CC1)O)O)C(=O)[O-]")
+smiles(R"[C@@H]1(C[C@H](C[NH2+]1)O)C(=O)[O-]")
+smiles(R"[C@H]1(C[C@@H](C[NH2+]1)O)C(=O)[O-]")
+smiles(R"[C@H]1(C[C@H](C[NH2+]1)O)C(=O)[O-]")
+smiles(R"[C@H]1(CC(=O)[C@H](CC1)O)C(=O)[O-]")
+smiles(R"[C@@H]1([C@@H]2C(=C(CC2)C)[C@@H](CC1)C=C(C)C)C")
+smiles(R"[C@@H]1([C@H]2[C@@H]([C@H](O1)CO)OP(=O)(O2)[O-])n1c2c(nc1)c(=O)[nH]c(n2)N")
+smiles(R"[C@@H]1([C@@H]([C@@]1(CC/C=C(/CCC=C(C)C)\C)C)/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)COP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"[C@@H]1([C@@H](C1(C)C)C(=O)OCc1cc(Oc2ccccc2)ccc1)C=C(Cl)Cl")
+smiles(R"[C@@H]1([C@@H](C1(C)C)C(=O)[O-])C=C(Cl)Cl")
+smiles(R"[C@@H]1([C@@H](c2cccc3cccc1c23)O)O")
+smiles(R"[C@H]1([C@H](C=CC1=O)/C=C/[C@H](CCCCC)O)CCCCCCC(=O)[O-]")
+smiles(R"[C@@H]1([C@H](C(=CC=C1)CCC(=O)[O-])O)O")
+smiles(R"[C@@H]1([C@@H](C=CC=C1C(=O)CCC(=O)[O-])O)C(=O)[O-]")
+smiles(R"[C@@H]1([C@@H](C=C(C=C1)C(=O)[O-])OC(=C)C(=O)[O-])O")
+smiles(R"[C@H]1([C@H](C(=CC=C1)C(=O)[O-])O)O")
+smiles(R"[C@H]1([C@@H](/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)[C@]1(CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)C)COP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H](CC[C@H](C1)C)C(C)C)O")
+smiles(R"[C@H]1([C@@H](CC[C@H](C1)C)C(C)C)O")
+smiles(R"[C@@H]1([C@@H](CC[C@H](C1)C)C(C)C)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO")
+smiles(R"[C@H]1([C@H](C[C@@H]([C@@H](C1=O)O)Nc1ccc(cc1)[N+](=O)[O-])CO)O")
+smiles(R"[C@@H]1([C@@H](C[C@@H]([C@H]([C@@H]1O[C@H]1[C@@H]2[C@H]([C@H]([C@H](O1)CO)O)O[C@]1(O2)O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)C([NH3+])CO)O)[NH2+]C)[NH3+])O")
+smiles(R"[C@@H]1([C@@H](C[C@@H]([C@H]([C@@H]1O[C@H]1[C@@H]2[C@H]([C@H]([C@H](O1)CO)O)O[C@]1(O2)O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)C([NH3+])COP(=O)([O-])[O-])O)[NH2+]C)[NH3+])O")
+smiles(R"[C@H]1([C@@H](CC[NH2+]1)O)C(=O)[O-]")
+smiles(R"[C@H]1([C@H](CC[NH2+]1)O)C(=O)[O-]")
+smiles(R"[C@H]1([C@H](CC(O[C@H]1[C@@H]([C@@H](CO)O)O)(C(=O)[O-])O)O)NC(=O)C")
+smiles(R"[C@H]1([C@H]([C@@H](CC1=O)O)/C=C/[C@H](CCCCC)O)CCCCCCC(=O)[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H](C[C@H](O1)C)[NH+](C)C)O)O[C@H]1[C@H](C[C@H](C(=O)C=C[C@H]([C@@H](CC)OC(=O)[C@@H]1C)C)C)C")
+smiles(R"[C@@H]1([C@@H]([C@H](C[C@](O1)(C(=O)[O-])OP(=O)([O-])OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)nc(cc1)N)O)NC(=O)C)[C@@H]([C@@H](C)O)NC(=O)C")
+smiles(R"[C@@H]1([C@@H]([C@H](C[C@](O1)(C(=O)[O-])OP(=O)([O-])OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)nc(cc1)N)O)NC(=O)C)[C@@H]([C@@H](CO)O)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](C=C1)C(=O)CCC(=O)[O-])C(=O)[O-])O)OC(=C)C(=O)[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](C[C@@H]1[NH3+])O)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](C1)[NH3+])O[C@@H]1[C@@H](CC[C@H](O1)C[NH3+])NC(=O)C)O)O[C@@H]1[C@@H]([C@H]([C@@](CO1)(C)O)[NH2+]C)O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](C1)[NH3+])O[C@@H]1[C@@H](CC[C@H](O1)C[NH3+])[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@](CO1)(C)O)[NH2+]C)O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](C1)[NH3+])O)O)O)[NH3+]")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@@H]([C@H]1NC(=[NH2+])N)O)NC(=[NH2+])N)O[C@@H]1O[C@H]([C@@]([C@H]1O[C@H]1[C@H]([C@@H]([C@H]([C@@H](O1)CO)O)OP(=O)([O-])[O-])[NH2+]C)(C=O)O)C)O)O")
+smiles(R"[C@@H]1([C@H]([C@H]([C@@H]([C@H]([C@@H]1O)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)[NH3+])O)O)O")
+smiles(R"[C@@H]1([C@H]([C@H]([C@@H]([C@H]([C@@H]1O)O)O)O)O)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H]([C@H]1O)O)O)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@@H]([C@H]([C@@H]1O)O)O)O)OP(=O)(OC[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCC/C=C\C/C=C\C/C=C\C/C=C\CCCCC)[O-])O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@@H]([C@H]([C@@H]1O)O)O)O)OP(=O)(OC[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCC/C=C\C/C=C\CCCCC)[O-])O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@@H]([C@H]([C@@H]1O)O)O)O)OP(=O)(OC[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCC/C=C\CCCCCCCC)[O-])O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@@H]([C@H]([C@@H]1O)O)O)O)OP(=O)(OC[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCCCCCCCCCCCC)[O-])O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@@H]([C@H]([C@@H]1O)O)O)O)OP(=O)(OC[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCCCCCCCCCC)[O-])O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@@H]([C@H]([C@@H]1O)O)O)O)OP(=O)(OC[C@@H](COC(=O)CCCCCCCCCCCCCCC)O)[O-])O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@@H]([C@H]([C@@H]1O)O)O)O)OP(=O)(OC[C@@H](CO)O)[O-])O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H]([C@@H]1O)O)OP(=O)([O-])[O-])NC(=[NH2+])N)O)NC(=[NH2+])N")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@@H]([C@H]1O)OP(=O)([O-])[O-])NC(=[NH2+])N)O)NC(=[NH2+])N)O[C@H]1[C@@H]([C@]([C@@H](O1)C)(CO)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])OP(=O)([O-])[O-])O)OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@@H]([C@@H]([C@H]([C@@H]([C@H]1O)OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])O)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@H]([C@H]1OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])O)OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H]([C@@H]1OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@@H]([C@H]([C@@H]1OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@H]([C@H]([C@@H]([C@H]([C@@H]1OP(=O)([O-])[O-])OP(=O)(OP(=O)([O-])[O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H](C[C@H]1[NH3+])O)C[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)COC(=O)N)O)[NH3+])O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H](C[C@H]1[NH3+])O)C[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)[NH3+])O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H](C1=O)O)O)C[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)[NH3+])O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)[NH3+])O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)[NH3+])O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)C[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)COC(=O)N)O)[NH3+])O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)C[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)[NH3+])O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)C[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)[NH3+])O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@@H]([NH3+])C1)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)OP(=O)([O-])[O-])O)C[NH3+])O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)[NH3+])O)[NH3+]")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)[C@H](COC1[C@H]([C@H]([C@@H]([C@H](O1)[C@H](CO)O)O)O)O)O)O)OC1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@@H]([C@@H](O[C@@H]2[C@@H](C[C@](O[C@@H]2[C@@H](CO)O)(OC[C@@H]2[C@H]([C@@H]([C@H]([C@@H](O2)OC[C@@H]2[C@H]([C@@H]([C@H]([C@H](O2)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-])C(=O)[O-])O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)O[C@@H]([C@H]1OP(=O)([O-])[O-])[C@H](CO)O)O")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)[C@H](CO)O)O)OC1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@@H]1[C@@H]([C@@H](O[C@@H]2[C@@H](C[C@](O[C@@H]2[C@@H](CO)O)(OC[C@@H]2[C@H]([C@@H]([C@H]([C@@H](O2)OC[C@@H]2[C@H]([C@@H]([C@H]([C@H](O2)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-])C(=O)[O-])O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)O[C@@H]([C@H]1OP(=O)([O-])[O-])[C@H](CO)O)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@H]([C@@H](O1)C)NC(=O)C)O)NC(=O)C)O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H]([C@@H](O1)C)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@@H]([C@H](C=C(O1)C(=O)[O-])O)O)O)O)O)O)O[C@@H]1[C@H]([C@@H](O[C@@H]([C@H]1O)CO)O)O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H]([C@@H](O1)C)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@H]([C@@H](O[C@@H]([C@H]1O)CO)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)COC(=O)C)O)O)O)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)NC(=O)C)O)NC(=O)C)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)NC(=O)C)O[C@@H]1[C@@H]([C@H]([C@@H](O[C@@H]2[C@@H]([C@H]([C@@H](O[C@H]3[C@@H]([C@H](O[C@H](OP(=O)(OP(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\C)/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)[O-])[O-])[C@@H]3NC(=O)C)C)NC(=O)C)O[C@@H]2CO)NC(=O)C)O)O[C@@H]1CO)NC(=O)C)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O)NC(=O)C)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O)O)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)COP(=O)([O-])[O-])O)O)O)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@H]1[C@@H](C(=O)[C@H]([C@H](O1)CO)O)O)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H]([C@H](O1)CO)OC(=O)N)O)NC(=O)C[C@@H]([NH3+])CCCNC(=O)C[C@H](CCCNC(=O)C[C@H](CCC[NH3+])[NH3+])[NH3+])/[NH+]=C\1/N[C@H]2[C@H](N1)[C@@H](CNC2=O)O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H]([C@H](O1)CO)OC(=O)N)O)NC(=O)C[C@@H]([NH3+])CCCNC(=O)C[C@H](CCCNC(=O)C[C@H](CCC[NH3+])[NH3+])[NH3+])/[NH+]=C\1/N[C@@H]([C@H](N1)[C@@H](C[NH3+])O)C(=O)[O-]")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H]([C@H](O1)CO)OC(=O)N)O)NC(=O)C[C@@H]([NH3+])CCC[NH3+])/[NH+]=C\1/N[C@H]2[C@H](N1)[C@@H](CNC2=O)O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H]([C@H](O1)CO)OC(=O)N)O)NC(=O)C[C@@H]([NH3+])CCC[NH3+])/[NH+]=C\1/N[C@@H]([C@H](N1)[C@@H](C[NH3+])O)C(=O)[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@H]([C@H](O1)CO)O)OC1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)NC(=O)C)OC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)OC(C(=O)N[C@@H](C)C(=O)N[C@@H](C(=O)[O-])CCC(=O)N[C@H](C(=O)N[C@@H](C(=O)N[C@H](C)C(=O)[O-])C)CCCCNC(=O)[C@H](C)[NH3+])C)NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)OC(C(=O)N[C@@H](C)C(=O)N[C@@H](C(=O)[O-])CCC(=O)N[C@H](C(=O)N[C@@H](C(=O)N[C@H](C)C(=O)[O-])C)CCCC[NH3+])C)NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@H]1[C@@H]([C@H](C=C(O1)C(=O)[O-])O)O)NC(=O)C)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@H]([C@H](O1)CO)O)O[C@H]1[C@@H]([C@H](C=C(O1)C(=O)[O-])O)O)NC(=O)C)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@H]([C@H](O1)CO)O)O[C@H]1[C@@H]([C@H](C=C(O1)C(=O)[O-])O)OS(=O)(=O)[O-])NC(=O)C)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@H]([C@H](O1)CO)O)O[C@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)NC(=O)C)OC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O[C@H](C)C(=O)[O-])NC(=O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-])[O-]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)NC(=O)C[C@@H](CCCCCCCCCCC)O)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)[C@H](CS)[NH3+])O[C@H](C(=O)[O-])CC(=O)[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)N")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)NC(=O)C)NC(=O)C)OP(=O)(OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@@H](O1)n1ccc(=O)[nH]c1=O)O)O)[O-]")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)NC(=O)C)NC(=O)C)OP(=O)(OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@@H](O1)n1ccc(=O)[nH]c1=O)O)O)[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)NC(=O)C)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)O[C@@H]1[C@@H](O[C@@H]2[C@@H]([C@H](O[C@H]3[C@@H]([C@H]([C@H](O[C@H]4[C@@H]([C@H]([C@H](NC(=O)C[C@@H](C(=O)[O-])[NH3+])O[C@@H]4CO[C@H]4[C@H]([C@@H]([C@@H]([C@@H](O4)C)O)O)O)NC(=O)C)O)O[C@@H]3CO)NC(=O)C)O)O[C@@H]([C@H]2O)CO[C@@H]2[C@H]([C@H]([C@@H]([C@H](O2)CO)O)O)O[C@H]2[C@@H]([C@H]([C@@H]([C@H](O2)CO)O)O)NC(=O)C)O)O[C@@H]([C@H]([C@@H]1O)O)CO")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)O[C@@H]1[C@@H](O[C@@H]2[C@@H]([C@H](O[C@H]3[C@@H]([C@H]([C@H](O[C@H]4[C@@H]([C@H]([C@H](NC(=O)C[C@@H](C(=O)[O-])[NH3+])O[C@@H]4CO)NC(=O)C)O[C@H]4[C@H]([C@@H]([C@@H]([C@@H](O4)C)O)O)O)O[C@@H]3CO)NC(=O)C)O)O[C@@H]([C@H]2O)CO[C@@H]2[C@H]([C@H]([C@@H]([C@H](O2)CO)O)O)O[C@H]2[C@@H]([C@H]([C@@H]([C@H](O2)CO)O)O)NC(=O)C)O)O[C@@H]([C@H]([C@@H]1O)O)CO")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)O[C@@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@@H]1[C@@H]([C@H](O[C@H]2[C@@H]([C@H]([C@H](O[C@H]3[C@@H]([C@H]([C@H](NC(=O)C[C@@H](C(=O)[O-])[NH3+])O[C@@H]3CO)NC(=O)C)O)O[C@@H]2CO)NC(=O)C)O)O[C@@H]([C@H]1O)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)O[C@@H]1O[C@@H]([C@@H]([C@H]1O)O)CO")
+smiles(R"[C@H]1([C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)NC(=O)C)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)[NH3+])NC(=O)C)OP(=O)(OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@@H](O1)n1ccc(=O)[nH]c1=O)O)O)[O-]")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H]([C@@H](O1)C)O)O)O)O")
+smiles(R"[C@H]1([C@@H]([C@@H]([C@H]([C@@H](O1)C)O)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)c1c(cc(c2c1oc(cc2=O)c1ccc(cc1)O)O)[O-]")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O[C@H]1[C@H]([C@H]([C@H]2[C@H](O1)COC(O2)(C(=O)[O-])C)O)O)O)O)O[C@@H]1[C@H]([C@@H](O[C@@H]([C@H]1O)CO)O[C@H]1[C@@H]([C@H]([C@H](O[C@@H]1CO)OP(=O)(OP(=O)(OC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)[O-])[O-])O)O)O")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O[C@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O)O[C@@H]1[C@H]([C@@H](O[C@@H]([C@H]1O)CO)O[C@H]1[C@@H]([C@H]([C@H](O[C@@H]1CO)OP(=O)(OP(=O)(OC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)[O-])[O-])O)O)O")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)O[C@@H]1[C@@H]([C@@H](O[C@@H]([C@H]1O)CO[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)O[C@H]1[C@@H]([C@H]([C@@H](O[C@@H]1CO)O[C@H]1[C@@H]([C@H]([C@@H](O[C@@H]1CO)NC(=O)C[C@@H](C(=O)[O-])[NH3+])NC(=O)C)O)NC(=O)C)O)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O[C@@H](C(=O)[O-])COP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)O)O[C@@H]1[C@H]([C@@H](O[C@@H]([C@H]1O)CO)O[C@H]1[C@@H]([C@H]([C@H](O[C@@H]1CO)OP(=O)(OP(=O)(OC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)[O-])[O-])O)O)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)NC(=O)C)OP(=O)(OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@@H](O1)n1ccc(=O)[nH]c1=O)O)O)[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)Oc1ccc(cc1)C(=O)[O-]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O[C@@]1(O[C@@H]([C@H]([C@@H]1O)O)CO)CO[C@@]1(O[C@@H]([C@H]([C@@H]1O)O)CO)CO")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)OCc1c(c(c(nc1)C)O)CO")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O[C@H]1[C@@H]([C@H]([C@H](O[C@@H]1CO)O[C@H]1[C@@H]([C@H]([C@H](O[C@@H]1CO)O[C@H]1[C@@H]([C@H]([C@H](O[C@@H]1CO)O)O)O)O)O)O)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O[C@@H]1[C@H]([C@H](O[C@@H]([C@H]1O)CO)O[C@@]1(O[C@@H]([C@H]([C@@H]1O)O)CO)CO)O")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O[C@@H]1[C@H]([C@@H](O[C@@H]([C@H]1O)CO)O[C@H]1[C@@H]([C@H]([C@H](O[C@@H]1CO)OP(=O)(OP(=O)(OC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)[O-])[O-])O)O)O")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O[C@@H]1[C@@H]([C@H](O[C@@H]([C@H]1O)CO)O[C@@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@@H]1C(O[C@@H]([C@H]([C@@H]1O)O)CO)O)O")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O[C@@H]1[C@@H]([C@H](O[C@@H]([C@H]1O)CO)O[C@@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@@H]1C(O[C@@H]([C@H]([C@@H]1O)O)CO)O)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O[C@@H]1[C@@H]([C@H](O[C@@H]([C@H]1O)CO)O)O")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O[C@@H](C(=O)[O-])CO")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O[C@@H](C(=O)[O-])COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)OC(=O)/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C(=O)[O-])\C)\C)/C)/C")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)OC(=O)/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C(=O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)\C)\C)/C)/C")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)O)Oc1c(c(c2c(=O)cc(oc2c1)c1ccccc1)O)OC")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)O)O[C@@H]1[C@@]([C@H]2[C@@]([C@@H]3[C@]([C@@]4(CC[C@]5([C@@H]([C@@H](C(C[C@H]5C4=CC3)(C)C)O)O)C)C)(CC2)C)(CC1)C)(CO)C")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)O)O[C@@H]1[C@@]([C@H]2[C@@]([C@@H]3[C@]([C@@]4(CC[C@]5(C(=O)CC(C[C@H]5C4=CC3)(C)C)C)C)(CC2)C)(CC1)C)(CO)C")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)O)OP(=O)(OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@@H](O1)n1ccc(=O)[nH]c1=O)O)O)[O-]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@H]([C@H](O1)C(=O)[O-])O)O)O)OP(=O)(OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@@H](O1)n1ccc(=O)[nH]c1=O)O)O)[O-]")
+smiles(R"[C@H]1([C@H]([C@H]([C@@H]([C@H](O1)COP(=O)(O[C@@H]1[C@@H]([C@@H](O)[C@@H](CO1)O)O)[O-])O)O)O)O[C@@H]1[C@@H]([C@H](O[C@@H]([C@H]1O)CO)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@H]([C@H](O1)COS(=O)(=O)[O-])O)O[C@H]1[C@@H]([C@H](C=C(O1)C(=O)[O-])O)O)NC(=O)C)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@H]([C@H](O1)COS(=O)(=O)[O-])O)O)NC(=O)C)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@H](O1)O[C@@H]1[C@H](C[C@H]([C@@H]([C@H]1O)O)[NH3+])[NH3+])NC(=O)C)O)O)CO")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@H](O1)O[C@H]1[C@@H]([C@H]([C@@H](C[C@@H]1[NH3+])[NH3+])O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)[NH3+])O)CO)O)[NH3+])O)O)CNC(=O)C")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@H](O1)O[C@H]1[C@H]([C@@H](O[C@@H]1CO)O[C@@H]1[C@@H](O)[C@@H](C[C@@H]([C@H]1O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C[NH3+])[NH3+])[NH3+])O)NC(=O)C)O)O)CO")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@H](O1)O[C@H]1[C@H]([C@@H](O[C@@H]1CO)O[C@@H]1[C@@H](O)[C@@H](C[C@@H]([C@H]1O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C[NH3+])[NH3+])[NH3+])O)[NH3+])O)O)C[NH3+]")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@H](O1)O[C@H]1[C@H]([C@@H](O[C@@H]1CO)O[C@@H]1[C@@H](O)[C@@H](C[C@@H]([C@H]1O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C[NH3+])[NH3+])[NH3+])O)[NH3+])O)O)C=O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@H](O1)O[C@H]1[C@H]([C@@H](O[C@@H]1CO)O[C@@H]1[C@@H](O)[C@@H](C[C@@H]([C@H]1O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C[NH3+])[NH3+])[NH3+])O)[NH3+])O)O)CO")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@@H](O1)OC(=O)c1cc(c(c(c1)O)O)O)O)O)O)COC(=O)c1cc(c(c(c1)O)O)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@@H](O1)OC(=O)c1cc(c(O)c(c1)O)O)OC(=O)c1cc(c(O)c(c1)O)O)OC(=O)c1cc(c(c(c1)O)O)O)OC(=O)c1cc(c(O)c(c1)O)O)COC(=O)c1cc(c(O)c(c1)O)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@@H](O1)OC(=O)c1cc(c(O)c(c1)O)O)OC(=O)c1cc(c(O)c(c1)O)O)OC(=O)c1cc(c(c(c1)O)O)O)O)COC(=O)c1cc(c(O)c(c1)O)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@H](O1)O)NS(=O)(=O)O)O)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)C(=O)O)CO")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H]([C@H](O1)O)NS(=O)(=O)O)O)O[C@@H]1O[C@H]([C@H]([C@@H]([C@H]1O)O)O)C(=O)O)CO")
+smiles(R"[C@H]1([C@@H]([C@@H]([C@H]([C@H](O)[C@H]1O)O)OP(=O)([O-])[O-])O)O")
+smiles(R"[C@@H]1([C@H]([C@H]([C@@H]([C@@H](O)[C@@H]1OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](C(O1)O)NC(=O)C)O)O)CO")
+smiles(R"[C@H]1([C@@H]([C@H]([C@H](CO1)O)O)O)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](C(=O)O[C@H](CC)[C@]([C@@H]([C@H](C(=O)[C@@H](C[C@]1(O)C)C)C)O)(O)C)C)O[C@H]1C[C@]([C@H]([C@@H](O1)C)O)(OC)C)C)O[C@H]1[C@@H]([C@H](C[C@H](O1)C)[NH+](C)C)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](C(=O)O[C@H](CC)[C@]([C@@H]([C@H](C(=O)[C@@H](C[C@]1(O)C)C)C)O)(O)C)C)O[C@H]1C[C@]([C@H]([C@@H](O1)C)O)(O)C)C)O[C@H]1[C@@H]([C@H](C[C@H](O1)C)[NH+](C)C)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](C(=O)O[C@H](CC)[C@@H]([C@@H]([C@H](C(=O)[C@@H](C[C@]1(O)C)C)C)O)C)C)O[C@H]1C[C@]([C@H]([C@@H](O1)C)O)(OC)C)C)O[C@H]1[C@@H]([C@H](C[C@H](O1)C)[NH+](C)C)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](C(=O)O[C@H](CC)[C@@H]([C@@H]([C@H](C(=O)[C@@H](C[C@]1(O)C)C)C)O)C)C)O[C@H]1C[C@]([C@H]([C@@H](O1)C)O)(O)C)C)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](C(=O)O[C@H](CC)[C@@H]([C@@H]([C@H](C(=O)[C@@H](C[C@]1(O)C)C)C)O)C)C)O[C@H]1C[C@]([C@H]([C@@H](O1)C)O)(O)C)C)O[C@H]1[C@@H]([C@H](C[C@H](O1)C)[NH+](C)C)O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H](O1)C=O)O)O)n1cnc2c1ncnc2O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H](O1)CO)O)O)n1cnc2c1ncnc2O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)n1cnc2c1nc[nH]c2=O")
+smiles(R"[C@@H]1([C@@H]([C@@H]([C@H](O1)COP(=O)(OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c2c(c(ncn2)N)nc1)[O-])[O-])[O-])O)O)n1c2c(c(ncn2)N)nc1")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](OC1O)COP(=O)([O-])[O-])O)O)NC(=O)C")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C[C@@H](O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)[C@@H](O[C@@H]2[C@H]([C@@H](O[C@@H]3[C@H]([C@H]([C@@H]([C@H](O3)[C@H](CO)O)O)OC3[C@@H]([C@H]([C@@H]([C@H](O3)CO)O)O)O)O)[C@@H]([C@H](O2)[C@H](CO)O)O)O)[C@H](O1)[C@@H](CO)O)C(=O)[O-])OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C[C@@H](O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)[C@@H](O[C@@H]2[C@H]([C@@H](O[C@@H]3[C@H]([C@H]([C@@H]([C@H](O3)[C@H](CO)O)O)O)O)[C@@H]([C@H](O2)[C@H](CO)O)O)O)[C@H](O1)[C@@H](CO)O)C(=O)[O-])OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C[C@@H](O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)[C@@H](O[C@@H]2[C@H]([C@@H](O)[C@@H]([C@H](O2)[C@H](CO)O)O)O)[C@H](O1)[C@@H](CO)O)C(=O)[O-])OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C[C@@H](O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)[C@@H](O)[C@H](O1)[C@@H](CO)O)C(=O)[O-])OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCC/C=C\CCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C[C@@H](O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)[C@@H](O)[C@H](O1)[C@@H](CO)O)C(=O)[O-])OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCC/C=C\CCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)O)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C[C@@H](O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)[C@@H](O)[C@H](O1)[C@@H](CO)O)C(=O)[O-])OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C[C@@H](O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)O)[C@@H](O)[C@H](O1)[C@@H](CO)O)C(=O)[O-])OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)O)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C[C@@H](O[C@@]2(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C2)O)O)[C@@H](CO)OP(=O)(OCC[NH3+])[O-])[C@@H](O)[C@H](O1)[C@@H](CO)O)C(=O)[O-])OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O)O)[C@@H](CO)O)O)[C@@H](CO)O)O)[C@@H](CO)O)O)[C@@H](CO)O)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O)O)[C@@H](CO)O)O)[C@@H](CO)O)O)[C@@H](CO)O)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O)O)[C@@H](CO)O)O)[C@@H](CO)O)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])O[C@H]1OC[C@@H]([C@@H]([C@H]1O)O)[NH3+])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])O[C@H]1OC[C@@H]([C@@H]([C@H]1O)O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O)O)[C@@H](CO)O)O)[C@@H](CO)O)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)O)O)[C@@H](CO)O)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO[C@@]1(C(=O)[O-])O[C@@H]([C@@H]([C@@H](C1)OP(=O)([O-])[O-])O)[C@@H](CO)O)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1C)O[C@H]1[C@H](C[C@H](C(=O)/C=C/C(=C/[C@@H]([C@H](OC(=O)C[C@H]([C@@H]1C)O)CC)CO[C@H]1[C@@H]([C@@H]([C@@H]([C@H](O1)C)O)OC)OC)/C)C)CC=O)O)N(C)C)O[C@H]1C[C@@]([C@H]([C@@H](O1)C)O)(C)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1C)O[C@H]1[C@H](C[C@H](C(=O)/C=C/C(=C/[C@@H]([C@H](OC(=O)C[C@H]([C@@H]1C)O)CC)CO[C@H]1[C@@H]([C@@H]([C@@H]([C@H](O1)C)O)O)OC)/C)C)CC=O)O)N(C)C)O[C@H]1C[C@@]([C@H]([C@@H](O1)C)O)(C)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1C)O[C@H]1[C@H](C[C@H](C(=O)/C=C/C(=C/[C@@H]([C@H](OC(=O)C[C@H]([C@@H]1C)O)CC)CO[C@H]1[C@@H]([C@@H]([C@@H]([C@H](O1)C)O)O)O)/C)C)CC=O)O)N(C)C)O[C@H]1C[C@@]([C@H]([C@@H](O1)C)O)(C)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCC)OC(=O)C[C@@H](CCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)OP(=O)([O-])O[C@H]1OC[C@@H]([C@@H]([C@H]1O)O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO)OC[C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)O)NC(=O)C[C@@H](CCCCCCCCCCC)O)OC(=O)C[C@@H](CCCCCCCCCCC)O)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO)O[C@@H]1[C@H](C(O[C@@H]([C@H]1O)CO)O)NC(=O)C)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@@H]1CO)O[C@@H]1[C@H](OC([C@H]([C@H]1O)O)O)CO)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@H]1O[C@H]1[C@@H](O[C@@H](C)[C@@]1(C=O)O)O[C@@H]1[C@H]([C@H](O)[C@H]([C@H](O)[C@H]1O)NC(=[NH2+])N)NC(=[NH2+])N)CO)O)O)[NH2+]C")
+smiles(R"[C@@H]1([C@@H]([C@H]([C@@H](O[C@H]1O[C@H]1[C@@H](O[C@@H](C)[C@]1(O)COP(=O)([O-])[O-])O[C@@H]1[C@H]([C@H](O)[C@H]([C@@H]([C@H]1O)OP(=O)([O-])[O-])NC(=[NH2+])N)NC(=[NH2+])N)CO)O)O)[NH2+]C")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](O[C@H]1O[C@H]1[C@H](O)O[C@@H]([C@H]([C@@H]1O)O)C(=O)[O-])C(=O)[O-])O)O)O")
+smiles(R"[C@@H]1([C@H]([C@@H]([C@H](O[C@@H]1O[C@@H](C(=O)[O-])CO)CO)O)O)O")
+smiles(R"[C@H]1([C@H]([C@@H]([C@H](O[C@H]1O)COP(=O)([O-])[O-])O)O)NC(=O)C")
+smiles(R"[C@@H]1([C@@H]([C@H](C(=O)C[C@@H]1[NH3+])O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@@H](NC(=O)C)[C@H]2O[C@@H]1CO2)O[C@@H](C(=O)[O-])C)O")
+smiles(R"[C@@H]1([C@H]([C@@H](OC1)c1cc(c(cc1)O)OC)CO)Cc1ccc(c(c1)OC)O")
+smiles(R"[C@H]1([C@@H]([C@H](OC1)c1cc(c(cc1)O)OC)CO)Cc1ccc(c(c1)OC)O")
+smiles(R"[C@@H]1([C@@H]([C@H](O[C@@]1(CO)O)CO)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](OC1(CO)O)CO)O)O")
+smiles(R"[C@@H]1([C@H]([C@H](OC1(CO)O)CO)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](OC1(CO)O)C(=O)[O-])O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](O[C@@]1(CO)O)COP(=O)([O-])[O-])O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](OC1(CO)O)COP(=O)([O-])[O-])O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](O[C@@]1(CO)OP(=O)([O-])[O-])CO)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](O[C@@]1(CO)OP(=O)([O-])[O-])COP(=O)([O-])[O-])O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](OC1(COP(=O)([O-])[O-])O)COP(=O)([O-])[O-])O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](O[C@@]21CO[C@@]1([C@H]([C@@H]([C@H](O1)CO)O)O)CO2)CO)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](OC([C@@H]1[NH3+])O)CO)O)O")
+smiles(R"[C@@H]1([C@@H]([C@H](OC[C@@H]1O)CO)O)O")
+smiles(R"[C@H]1([C@@H]([C@@H](O[C@H]1c1ccc(cc1)O)c1ccc(cc1)O)C)C")
+smiles(R"[C@H]1([C@@H]([C@@H](O[C@H]1c1ccc(c(c1)O)O)c1ccc(cc1)O)C)C")
+smiles(R"[C@@H]1([C@H]([C@@H](O[C@@H]1CSCC[C@@H](C(=O)[O-])[NH3+])n1c2c(nc1)c(ncn2)N)O)O")
+smiles(R"[C@@H]1([C@H]([C@@H](O[C@@H]1CSCC[C@@H](C(=O)[O-])[NH3+])n1c2c(nc1)c(ncn2)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@@H](O[C@@H]2O[C@@H]([C@@H]([C@@H]([C@H]2O)O)O)CO)[C@@H]([C@H](O1)CO)O)NC(=O)C)O[C@@H]1[C@H]([C@H](O[C@H]2[C@@H]([C@H](C(O[C@@H]2CO)O)O)O)O[C@@H]([C@@H]1O)CO)O")
+smiles(R"[C@H]1([C@H]([C@H](O[C@@H]([C@H]1O)CO)OC[C@H]1OC([C@H]([C@@H]1O)O)(O)CO)O)O")
+smiles(R"[C@H]1([C@H]([C@@H](O[C@@H]([C@@H]1O)CO)O)NC(=O)C)OC1O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)CO")
+smiles(R"[C@H]1([C@H]([C@@H](O[C@@H]([C@@H]1O)CO)O)NC(=O)C)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)C(=O)O")
+smiles(R"[C@H]1([C@H]([C@H](O[C@@H]([C@H]1O)CO)O)NC(=O)C)O[C@@H](C(=O)N[C@H](C(=O)[O-])C)C")
+smiles(R"[C@H]1([C@H]([C@H](O[C@@H]([C@@H]1O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H](C[C@@H]1O)n1c(=O)[nH]c(=O)c(c1)C)[O-])[O-])O)NC(=O)C")
+smiles(R"[C@H]1([C@H]([C@H](O[C@@H]([C@@H]1O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H](C[C@@H]1O)n1c(=O)[nH]c(=O)c(c1)C)[O-])[O-])O)[NH3+]")
+smiles(R"[C@H]1([C@H]([C@H](O[C@@H]([C@@H]1O)C)OP(=O)(OP(=O)(OC[C@H]1O[C@H](C[C@@H]1O)n1c(=O)[nH]c(=O)c(c1)C)[O-])[O-])O)[NH+](C)C")
+smiles(R"[C@H]1([C@H]([C@@H](O[C@@H]([C@@H]1O)COS(=O)(=O)O)O)NC(=O)C)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C(=O)O)O)O)O")
+smiles(R"[C@@H]1([C@@H]([C@@H](O)[C@@H]([C@H]([C@@H]1O)O[C@@H]1O[C@@H](C)[C@@](C=O)(O)[C@H]1O[C@@H]1O[C@H]([C@H](O)[C@@H](O)[C@@H]1[NH2+]C)CO)NC(=[NH2+])N)NC(=[NH2+])N)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@@H]([C@H](O)[C@H]([C@@H]([C@H]1OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H]([C@@H](O)[C@@H]([C@@H](O)[C@@H]1O)O)O)[NH3+]")
+smiles(R"[C@@H]1([C@@H]([C@@H](O)[C@@H]([C@@H](O)[C@@H]1O)OP(=O)([O-])[O-])O)[NH3+]")
+smiles(R"[C@H]1([C@H](COC1=O)Cc1cc(c(cc1)O)OC)Cc1ccc(c(c1)OC)O")
+smiles(R"[C@@H]1([C@@H](C(=O)C(=CC1)[O-])O)CO")
+smiles(R"[C@@H]1([C@H](C(O[C@H]1COP(=O)([O-])[O-])(CO)O)O)O")
+smiles(R"[C@H]1([C@@H](C(O[C@@H]1COP(=O)([O-])[O-])(CO)O)O)O")
+smiles(R"[C@H]1([C@@H](C(O[C@@H]1COP(=O)([O-])[O-])(COP(=O)([O-])[O-])O)O)O")
+smiles(R"[C@H]1([C@H](C(O[C@@H]([C@@H]1O)CO)O)NC(=O)C)O[C@@H]1OC(=C[C@@H]([C@H]1O)O)C(=O)[O-]")
+smiles(R"[C@H]1([C@H](C(O[C@@H]([C@H]1O)COP(=O)([O-])[O-])O)[NH3+])O")
+smiles(R"[C@H]1([C@H](C(O[C@@H]([C@@H]1O)COS(=O)(=O)[O-])O)NC(=O)C)O[C@@H]1OC(=C[C@@H]([C@H]1O)O)C(=O)[O-]")
+smiles(R"[C@@H]1([C@@H](C(=O)[C@@H]([C@H]([C@@H]1O)NC(=[NH2+])N)O)O)O")
+smiles(R"[C@H]1([C@@H](C(=O)[C@@H]([C@H](O1)C(=O)[O-])O)NC(=O)C)OP(=O)(OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@@H](O1)n1ccc(=O)[nH]c1=O)O)O)[O-]")
+smiles(R"[C@H]1([C@@H](O1)c1ccccc1)c1ccccc1")
+smiles(R"[C@@H]1([C@@H](O1)C(=O)[O-])C(=O)[O-]")
+smiles(R"[C@@H]1([C@H](O1)P(=O)(O)[O-])C")
+smiles(R"[C@H]1([C@H](OC([C@@H]([C@H]1O[C@@H](C(=O)[O-])C)NC(=O)C)O)CO)O")
+smiles(R"[C@H]1([C@H](OC([C@@H]([C@H]1O[C@@H](C(=O)[O-])C)NC(=O)C)O)COP(=O)([O-])[O-])O")
+smiles(R"[C@@H]1([C@H](OC([C@@H]([C@H]1O)O)O)C(=O)[O-])O[C@H]1OC(=C[C@@H]([C@H]1O)O)C(=O)[O-]")
+smiles(R"[C@@H]1([C@H](O[C@@H]2[C@H]([C@@H]([C@H]([C@@H]([C@H]2O)O)NC(=[NH2+])N)O)NC(=[NH2+])N)O[C@H]([C@@]1(C=O)O)C)O[C@H]1[C@H]([C@@H]([C@H]([C@@H](O1)CO)O)OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c2c(nc1)c(ncn2)N)[O-])[NH2+]C")
+smiles(R"[C@@H]1([C@H](O[C@@H]2[C@H]([C@@H]([C@H]([C@@H]([C@H]2O)OP(=O)([O-])[O-])NC(=[NH2+])N)O)NC(=[NH2+])N)O[C@H]([C@@]1(CO)O)C)O[C@H]1[C@H]([C@@H]([C@H]([C@@H](O1)CO)O)O)[NH2+]C")
+smiles(R"[C@@H]1([C@@H](O[C@@H]([C@H]1O)COP(=O)(OP(=O)(O[C@H]1[C@@H](O)[C@@H](O)[C@@H]([C@@H](O)[C@@H]1O)O)[O-])[O-])n1c(=O)nc(cc1)N)O")
+smiles(R"[C@@H]1([C@@H](O[C@@H]([C@H]1O)COP(=O)(OP(=O)([O-])OCC[N+](C)(C)C)[O-])n1c(=O)nc(cc1)N)O")
+smiles(R"[C@@H]1([C@@H](O[C@@H]([C@H]1O)COP(=O)(OP(=O)([O-])OCC[NH2+]C)[O-])n1c(=O)nc(cc1)N)O")
+smiles(R"[C@@H]1([C@@H](O[C@@H]([C@H]1O)COP(=O)(OP(=O)([O-])OCC[NH3+])[O-])n1c(=O)nc(cc1)N)O")
+smiles(R"[C@@H]1([C@@H](O[C@@H]([C@H]1O)COP(=O)(OP(=O)([O-])OCC[NH+](C)C)[O-])n1c(=O)nc(cc1)N)O")
+smiles(R"[C@@H]1([C@@H](O[C@@H]([C@H]1O)COP(=O)(OP(=O)([O-])[O-])[O-])n1c(=O)nc(cc1)N)O")
+smiles(R"[C@H]1([C@H](O[C@H]([C@@H]([C@H]1O[C@@H](C(=O)[O-])C)NC(=O)C)O)COP(=O)([O-])[O-])O")
+smiles(R"[C@@H]1([C@@H](O[C@@H]([C@H]([C@@H]1O)O)CO)OC(=O)/C=C/c1cc(c(c(c1)OC)O)OC)O")
+smiles(R"[C@@H]1([C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)OP(=O)([O-])[O-])[NH3+]")
+smiles(R"[C@@H]1([C@@H](O[C@@H]([C@H]([C@@H]1O)O)COP(=O)([O-])[O-])O)O")
+smiles(R"[C@@H]1([C@H](O[C@@H]([C@H]([C@@H]1O)O)COP(=O)([O-])[O-])O)O")
+smiles(R"[C@H]1([C@H](O[C@H]([C@@H]([C@H]1O)O)OC/C(=C\CNc1c2c(ncn1)[nH]cn2)/C)CO)O")
+smiles(R"[C@H]1([C@H](O[C@H]([C@@H]([C@H]1O)O)OC/C(=C/CNc1c2c([nH]cn2)ncn1)/C)CO)O")
+smiles(R"[C@H]1([C@H](O)[C@@H]([C@H]([C@H](O)[C@H]1O)OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@@H](O)[C@H](n2cnc3c2nc(N)[nH]c3=O)O[C@@H]1COP(=O)(OP(=O)([O-])[O-])[O-])OP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"[C@H]1([C@H](O)[C@H](O)[C@H]([C@@H]([C@H]1O)OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@H](O)[C@H](O)[C@H]([C@@H]([C@H]1OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@H](O)[C@H](O)[C@H]([C@H](O)[C@H]1O)O)OC")
+smiles(R"[C@H]1([C@H](O)[C@H](O)[C@H]([C@H](O)[C@H]1O)O)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1([C@H](O)[C@H](O)[C@H]([C@H](O)[C@H]1O)OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1([C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO)O[C@H](C#N)c1ccc(cc1)O")
+smiles(R"[C@@H]1([C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO)OC(=O)/C=C/c1ccccc1")
+smiles(R"[C@H]1([C@H](O)[C@H](OP(=O)([O-])[O-])[C@H]([C@H](O)[C@H]1O)O)OP(=O)(O[C@H]1[C@@H](O)[C@@H](O)[C@@H]([C@@H](O)[C@@H]1O)O)[O-]")
+smiles(R"[C@@H]1([C@@H](O)C(O[C@@H]1COP(=O)([O-])[O-])NC(=O)CNC=O)O")
+smiles(R"[C@@H]1([C@H](OC(=O)[C@@H]([C@H]([C@H](C[C@H](C(=O)C=C1)C)C)O)C)CC)C")
+smiles(R"[C@@H]1(C[NH2+]CCC1)C(=O)[O-]")
+smiles(R"[C@H]1(COC([C@H]([C@@H]1O)O)O)O")
+smiles(R"[C@@H]1(C(O[C@@H]([C@H]([C@@H]1O)O)COP(=O)([O-])[O-])O)O")
+smiles(R"[C@@H]1(C(=O)C(=O)C[C@H]([C@@H]1O)O)O")
+smiles(R"[C@H]1(C(=O)[O-])CC[C@@H](CC1)O")
+smiles(R"[C@H]1(CO)O[C@H](O[C@@H]2[C@@H](CO)O[C@H](O)[C@@H]([C@H]2O)O)[C@@H]([C@H]([C@@H]1O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)O)O")
+smiles(R"[C@H]1(C(=O)[O-])[NH2+]CCCC1")
+smiles(R"[C@@H]1([n+]2cc(ccc2)C(=O)[O-])O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(n2c(cc(=O)[nH]c2=O)C(=O)[O-])O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)nc(c(c2)C)N)O[C@@H]([C@H](C1)O)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)nc(c(c2)C)N)O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)nc(cc2)N)O[C@H]2[C@H]([C@H]1O)OP(=O)(OC2)[O-]")
+smiles(R"[C@@H]1(n2c(=O)nc(cc2)N)O[C@@H]([C@@H]2[C@H]1OP(=O)(O2)[O-])CO")
+smiles(R"[C@@H]1(n2c(=O)nc(cc2)N)O[C@@H]([C@H](C=C1)NC(=O)CC(CCN(C(=[NH2+])N)C)[NH3+])C(=O)[O-]")
+smiles(R"[C@@H]1(n2c(=O)nc(cc2)N)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])OC[C@@H](O)[C@@](CO)(C)OP(=O)([O-])[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)nc(cc2)N)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)c(c2)C)O[C@@H]([C@H](C1)O)CO")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)c(c2)C)O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H](C[C@H]([NH3+])[C@H]1O)C)[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)c(c2)C)O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H](C[C@H]([NH+](C)C)[C@H]1O)C)[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)c(c2)C)O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@H]([NH3+])[C@H]1O)O)C)[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)c(c2)C)O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@H]([NH+](C)C)[C@H]1O)O)C)[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)c(c2)C)O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO)[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)c(c2)C)O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)c(c2)C)O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@@H]2[C@H]1OP(=O)(O2)[O-])CO")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H](C=C1)NC(=O)CC(CCN(C(=[NH2+])N)C)[NH3+])C(=O)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)CO")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)C(=O)[O-])O)O)NC(=O)C)[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O)[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O[C@@H](C(=O)N[C@H](C(=O)N[C@H](CCC(=O)N[C@H](C(=O)N[C@@H](C(=O)N[C@@H](C(=O)[O-])C)C)CCC[C@H](C(=O)[O-])[NH3+])C(=O)[O-])C)C)O)CO)[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)CO)[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])OC1[C@H](O)[C@H]([C@H](O)[C@@H](CO)O1)O)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@@H]1[C@H](O)[C@H]([C@H](O)[C@@H](CO)O1)[NH3+])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@@H]1[C@H](O)[C@H]([C@H](O)[C@@H](CO)O1)O)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@@H]1[C@H](O)[C@H]([C@H](O)[C@@H](CS(=O)(=O)[O-])O1)O)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@@H]1[C@H](O)C(=O)[C@H](O)[C@@H](CO)O1)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@H]1O[C@H]([C@H]([C@H]([C@@H]1NC(=O)C)O)O)C)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@H]1O[C@H]([C@H]([C@H]([C@H]1NC(=O)C)O)O)C)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O)CO)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)OP(=O)([O-])[O-])O)CO)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@H]1O[C@@H](C(=O)[C@@H]([C@H]1NC(=O)C)O)C)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@H]1O[C@H](C(=O)[C@H]([C@H]1NC(=O)C)O)C)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@H]1O[C@H](CO)[C@@H](O)[C@H](OC(=O)C[C@@H](CCCCCCCCCCC)O)[C@H]1NC(=O)C)[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"[C@@H]1(n2c(=O)[nH]c(=O)cc2)O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-]")
+smiles(R"[C@@H]1(Nc2c(cccc2)C(=O)[O-])O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(Nc2c(c(=O)[nH]c(n2)N)NC=O)O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(Nc2c(c(=O)[nH]c(n2)N)N)O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(Nc2c(c(=O)[nH]c(=O)[nH]2)N)O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@H]1(NC(=O)NC1=O)NC(=O)N")
+smiles(R"[C@@H]1(NC(=O)NC(=O)C1)C(=O)[O-]")
+smiles(R"[C@H]1([NH2+]CCc2c1[nH]c1c2cccc1)C[C@H]1[C@H]([C@H](O)OC=C1C(=O)OC)C=C")
+smiles(R"[C@@H]1(Oc2c(cccc2)/C=C/C(=O)[O-])O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO")
+smiles(R"[C@@H]1(Oc2c(cccc2)CO)O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO")
+smiles(R"[C@@H]1(Oc2c(cccc2)CO)O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(O[C@@]2(CO)[C@@H](O)[C@H](O)[C@H](O2)CO[C@@H]2[C@H](O)[C@@H](O)[C@@H](O)[C@H](O2)CO)[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO")
+smiles(R"[C@@H]1(O[C@@]2(CO)[C@@H](O)[C@H](O)[C@H](O2)CO[C@@H]2[C@H](O)[C@@H](O)[C@@H](O)[C@H](O2)CO)[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO[C@@H]1[C@H](O)[C@@H](O)[C@@H](O)[C@H](O1)CO")
+smiles(R"[C@@H]1(O[C@@]2(CO)[C@@H](O)[C@H](O)[C@H](O2)CO)[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO[C@@H]1[C@H](O)[C@@H](O)[C@@H](O)[C@H](O1)CO")
+smiles(R"[C@@H]1(OC([C@@H]([C@@H]1O)O)NC(=O)C[NH3+])COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(OC([C@@H]([C@H]([C@@H]1O)O)O)O)COC(=O)C(=C)CCO")
+smiles(R"[C@@H]1(OC([C@@H]([C@H]([C@@H]1O)O)O)OP(=O)([O-])[O-])CO")
+smiles(R"[C@@H]1(O[C@@H]2[C@H](O)[C@@H](O)[C@H](O)[C@H](O2)CO)[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO")
+smiles(R"[C@@H]1(O[C@@H]2[C@H](O)[C@@H](O)[C@H](O)[C@H](O2)COC(=O)C(C(CCCCCCC/C=C/CCCCCC)O)CCCCCCCCCCCCCC)[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO")
+smiles(R"[C@@H]1(O[C@@H]2[C@H](O)[C@@H](O)[C@H](O)[C@H](O2)COC(=O)C(C(CCCCCCC/C=C/CCCCCC)O)CCCCCCCCCCCCCC)[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)COC(=O)C(C(CCCCCCC/C=C/CCCCCC)O)CCCCCCCCCCCCCC")
+smiles(R"[C@@H]1(O[C@@H]2[C@H](O)[C@@H](O)[C@H](O)[C@H](O2)COP(=O)([O-])[O-])[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO")
+smiles(R"[C@H]1(O[C@@H]([C@@H]2[C@H]1OP(=O)(O2)[O-])CO)n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(OC1O[C@@H]([C@@H]([C@H](O)[C@H]1O)NC(=O)C)C)[O-])[O-])n1cc(c(=O)[nH]c1=O)C")
+smiles(R"[C@H]1(O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(OC1O[C@@H]([C@@H]([C@H](O)[C@H]1O)O)C)[O-])[O-])n1cc(c(=O)[nH]c1=O)C")
+smiles(R"[C@H]1(O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@@H]([C@H](O)[C@H]1O)NC(=O)C)C)[O-])[O-])n1cc(c(=O)[nH]c1=O)C")
+smiles(R"[C@H]1(O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)NC(=O)C)C)[O-])[O-])n1cc(c(=O)[nH]c1=O)C")
+smiles(R"[C@H]1(O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@H]([C@@H]([C@@H](O)[C@H]1O)O)C)[O-])[O-])n1cc(c(=O)[nH]c1=O)C")
+smiles(R"[C@H]1(O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@H]([C@H]([C@@H](O)[C@H]1O)O)C)[O-])[O-])n1cc(c(=O)[nH]c1=O)C")
+smiles(R"[C@H]1(O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H](C(=O)[C@H]1O)O)C)[O-])[O-])n1cc(c(=O)[nH]c1=O)C")
+smiles(R"[C@H]1(O[C@@H]([C@H](C1)O)COP(=O)(OP(=O)([O-])[O-])[O-])n1c(=O)[nH]c(=O)cc1")
+smiles(R"[C@H]1(O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O)O[C@@H]1[C@H]([C@H]([C@@H](O[C@H]1C)O[C@@H]1[C@H]([C@@H](OP(=O)(OP(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C)[O-])[O-])O[C@@H]([C@H]1O)CO)NC(=O)C)O)O")
+smiles(R"[C@H]1(O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O)O[C@@H]1[C@H]([C@H]([C@@H](O[C@H]1C)O[C@@H]1[C@H]([C@@H](OP(=O)(OP(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C)[O-])[O-])O[C@@H]([C@H]1O)CO)NC(=O)C)O)O")
+smiles(R"[C@@H]1(O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])O[C@H](C(=O)[O-])CCC(=O)[O-])OC[C@H]([C@H]([C@H](Cc1ccc(N[C@@H](C2[C@@H](Nc3c(c(=O)[nH]c(n3)N)N2C=O)C)C)cc1)O)O)O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-])n1cnc(C(=O)N)c1NC=O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OP(=O)([O-])OC1O[C@@H]([C@H]([C@@H]([C@@H]1O)O)O)C(=O)[O-])n1cnc2c1nc(N)[nH]c2=O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO)[O-])[O-])n1c2c(nc1)c(=O)[nH]c(N)n2")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCS)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO)[O-])[O-])n1c2c(nc1)c(=O)[nH]c(N)n2")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@H]1O[C@H]([C@H]([C@@H](O)[C@@H]1O)O)CO)[O-])[O-])n1c2c(nc1)c(=O)[nH]c(N)n2")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)O)CSC)n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)O)CSC)n1c2c(nc1)c(ncn2)O")
+smiles(R"[C@@H]1(O[C@H]([C@@H]([C@@H]1O)O)n1c2c(c(ncn2)N)nc1)COP(=O)(OP(=O)([O-])OCC(C(=O)[O-])O)[O-]")
+smiles(R"[C@@H]1(O[C@H]([C@@H]([C@@H]1O)O)n1c2c(c(ncn2)N)nc1)C[S+](CCC[NH3+])C")
+smiles(R"[C@@H]1(O[C@H]([C@@H]([C@@H]1O)O)n1c2c(nc1)c(ncn2)N)C[S+](CCC(=O)C(=O)[O-])C")
+smiles(R"[C@@H]1(O[C@H]([C@@H]([C@@H]1O)O)O[C@H]1[C@@H]([C@H](C[C@H]([C@@H]1O)[NH3+])[NH3+])O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C[NH3+])O)O)[NH3+])COP(=O)([O-])[O-]")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])CO)n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)C(C(=O)NCCC(=O)NCCSC(=O)CC(=O)/C=C/c1cc(c(cc1)O)OC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1cc(c2c(c1O)cccc2)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccc(cc1Cl)Cl)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccc(cc1)Cl)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccccc1C(=O)CCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccccc1NC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccccc1N)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccccc1)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C1=CCCC=C1)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccc(cc1)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1cccc(c1)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccccc1O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C1=CC(CC=C1)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C1=CCCCC1O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C1=CC=CC(C1O)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C1=C(CCC(=O)C1)N)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccco1)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccc(o1)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1cccs1)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)c1ccc(s1)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC12C(C=CC=C1)O2)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)Cc1ccccc1)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC1(CCCCC1)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/1\OC=CC=CC1)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/c1ccccc1)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/c1ccc(cc1)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/c1cc(c(O)c(c1)OC)OC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/c1ccc(O)c(c1)OC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/c1ccc(O)c(c1)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/C=C/c1ccc2c(c1)OCO2)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCCCCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(CCCC(CCCC(CCCC(C)C)C)C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCC/C=C\C/C=C\C/C=C\C/C=C\CCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(C(CCCC(CCCC(CCCC(C)C)C)C)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCC/C=C\C/C=C\C/C=C\CCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCC/C=C\C/C=C\CCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCC/C=C\CCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCCCCCCCCCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCCCCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(C(CCCCCCCCCCCCC)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(CCCCCCCCCCCC(C)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCC(C)CCCC(C)CCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCC/C=C\CCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCCCCCCCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C/C=C\CCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCC/C=C\CCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCC/C=C/CC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCC/C=C\CC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C/C=C\CCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C(\C)/CCC=C(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C=CCCCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(CCCC(=O)[O-])O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCC[C@@H]1[C@H]2[C@@H](CS1)NC(=O)N2)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C/C=C\CC=O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C\CCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C/C=C\CC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C(/CC(=O)[O-])\CCC=C(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C/C(=C/C(=O)[O-])/C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@@](CC(=O)[O-])(C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(CC(=O)[O-])(O)CCC=C(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C(=C/C)/C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C=C(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(CC)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(C)(C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCCO)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/CC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=C)C(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC[C@@H](C)[C@@H]1[C@@]2(C)CC[C@@H]3[C@]4(CC[C@H](C[C@H]4C[C@@H](O)[C@H]3[C@@H]2CC1)O)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC[C@@H](C)[C@H]1CC[C@@H]2[C@]1(C)[C@H](C[C@@H]1[C@]3(CC[C@H](C[C@H]3CC[C@@H]21)O)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC[C@@H](C)[C@H]1CC[C@@H]2[C@]1(C)[C@H](C[C@@H]1[C@]3(CC[C@H](C[C@H]3C[C@@H](O)[C@@H]21)O)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/C[N+](C)(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCC[N+](C)(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCNC(=O)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCC[NH3+])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(C)C(=O)CCC(C)CCCC(C)CCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(C)C(=O)CC[C@@H](C)[C@H]1CC[C@@H]2[C@]1(C)[C@H](C[C@@H]1[C@]3(CC[C@H](C[C@H]3C[C@@H](O)[C@@H]21)O)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@](C(=O)[O-])(C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(C(=O)[O-])(C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@](C(=O)[O-])(O)CC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)/C=C/C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(=C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC=C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(C)CO)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCCO)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@H]1C(=O)C=C(C1(C)C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@H](CCCCCCCCCCCCC)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@H](CCCCC)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@@H](C[N+](C)(C)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@H](C[N+](C)(C)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@H](C)[NH3+])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@@H](C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@H](C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@@H](C(=O)[O-])O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@@H](O)CCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@@H](O)CCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@@H](O)CCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C[C@@H](O)CCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC[NH3+])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(O)c1ccc(O)c(c1)OC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)/C=C/c1ccc(cc1)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(O)CCCCCCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCC/C=C\C/C=C\C/C=C\CCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(O)CCCCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(O)CCCCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCCCCCCCCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCCCCCCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(O)CCCCCCCCCC(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCC=C(C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)C/C=C/CC=O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)C/C=C/CC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(O)CCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)CC(=O)CC(=O)CCCCC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(C(=O)C)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(C(=O)[O-])C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C=C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CCO)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CF)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@@H](Cc1ccccc1)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@H](C)CCC[C@@H](C)[C@H]1CC[C@@H]2[C@]1(C)CC[C@@H]1[C@]3(CC[C@H](C[C@H]3C[C@@H](O)[C@@H]21)O)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@H](C)CCC[C@@H](C)[C@H]1CC[C@@H]2[C@]1(C)[C@H](C[C@@H]1[C@]3(CC[C@H](C[C@H]3C[C@@H](O)[C@@H]21)O)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@H](C)[C@@H](CC[C@@H](C)[C@H]1CC[C@@H]2[C@]1(C)[C@H](C[C@@H]1[C@]3(CC[C@H](C[C@H]3C[C@@H](O)[C@@H]21)O)C)O)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@@H](C)[C@H](C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@@H](CC(=O)[O-])Cc1ccccc1)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@@H](C)CO)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@H](C(=O)[O-])CC)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@@H](C(=O)[O-])C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@H](C(=O)[O-])C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)[C@@H](C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(=O)c1ccccc1)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)C(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC(=O)CS(=O)(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSC=O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCS)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSSC[C@H](NC(=O)CC[C@H]([NH3+])C(=O)[O-])C(=O)NCC(=O)[O-])O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCSSCCNC(=O)CCNC(=O)[C@@H](C(COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1OP(=O)([O-])[O-])O)n1c2c(nc1)c(ncn2)N)[O-])[O-])(C)C)O)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O)CO)O")
+smiles(R"[C@@H]1(O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O)CO)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)CO)O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)OC(=O)CC(=O)[O-])COC(=O)CC(=O)[O-])Oc1c2cc(c(c3ccc(cc3)O)[o+]c2cc(c1)[O-])O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)COC(=O)/C=C/c1cc(c(cc1)O)O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)COC(=O)CC(=O)[O-])Oc1c2cc(c(c3ccc(cc3)O)[o+]c2cc(c1)[O-])O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)COC(=O)/C=C/c1cc(c(cc1)O)O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)COC(=O)CC(=O)[O-])Oc1cc2c(cc(cc2[O-])O)[o+]c1c1cc(c(c(c1)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)COC(=O)CC(=O)[O-])Oc1cc2c(cc(cc2[O-])[O-])[o+]c1c1cc(c(c(c1)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)[n+]1cc(ccc1)C(=O)[O-]")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)Oc1c2cc(c(c3ccc(cc3)O)[o+]c2cc(c1)[O-])O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)COC(=O)/C=C/c1cc(c(cc1)O)O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)OC[C@H]1O[C@@H](OC(=O)/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C(=O)[O-])\C)\C)/C)/C)[C@@H]([C@H]([C@@H]1O)O)O")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)OC[C@H]1O[C@@H](OC(=O)/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C(=O)O[C@@H]2O[C@@H]([C@H]([C@@H]([C@H]2O)O)O)CO)\C)\C)/C)/C)[C@@H]([C@H]([C@@H]1O)O)O")
+smiles(R"[C@H]1(O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)CO)OC[C@@H]([C@@H](/C=C/CCCCCCCCCCCCC)O)[NH3+]")
+smiles(R"[C@@H]1(O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)CO)OC[C@H](COP(=O)([O-])[O-])O")
+smiles(R"[C@@H]1(O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)CO)OC(CO)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(O[C@@H]([C@H]([C@@H]([C@@H]1O)O)O)CO)OC(C(=O)[O-])COP(=O)([O-])[O-]")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)O[C@H]1[C@@H]([C@@H](C(=CO1)C(=O)OC)CC=O)C=C")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)O[C@@H](COP(=O)([O-])[O-])CO")
+smiles(R"[C@H]1(O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)OC/N=[N+](\C)/[O-]")
+smiles(R"[C@@H]1(O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)C(=O)[O-])O")
+smiles(R"[C@@H]1(O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)CO)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(O[C@@H]([C@H]([C@@H]([C@@H]1O)O)O)CO)OP(=O)([O-])[O-]")
+smiles(R"[C@H]1(O[C@H]([C@H]([C@H]([C@@H]1O)O)O)CO)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(O[C@@H]([C@H]([C@@H]([C@@H]1O)O)O)COP(=O)([O-])[O-])O")
+smiles(R"[C@@H]1(O[C@H]([C@@H]([C@H]([C@H]1O)O)O)OC)CO")
+smiles(R"[C@@H]1(O[C@@H]([C@@H]([C@H]([C@@H]1O)O)O)OP(=O)([O-])[O-])CO")
+smiles(R"[C@@H]1(O[C@H]([C@@H]([C@H]([C@@H]1O)O)O)OP(=O)([O-])[O-])CO")
+smiles(R"[C@@H]1(O[C@@H]([C@@H](O)[C@@H]([C@H]1O)O)COP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(O)[C@@H]([C@@H](O)[C@H](O)[C@H](O1)CO)NC(=O)C")
+smiles(R"[C@H]1(O)[C@H]([C@H](O)[C@@H](O)[C@H](O)[C@H]1O[C@H]1O[C@H](CO)[C@H](O)[C@H](O)[C@H]1O)O")
+smiles(R"[C@H]1(O)[C@H](O[C@@H]2[C@H](O)[C@@H](O)C=C(O2)C(=O)[O-])[C@H](O)[C@@H](O)[C@@H](O1)C")
+smiles(R"[C@H]1(O)[C@H](O[C@H]2O[C@@H]([C@H]([C@H](O)[C@H]2O)O)CO)[C@H](O[C@@H]([C@@H]1O)O[C@H]1[C@H](O)[C@H]([C@H](O[C@@H]1CO)O[C@H]1[C@H](O)[C@H]([C@@H](O[C@H]2[C@H](O)[C@H]([C@@H](O[C@H]3[C@H](O)[C@H]([C@@H](O[C@H]4[C@H](O)[C@H]([C@@H](O)O[C@@H]4CO)O)O[C@@H]3CO)O)O[C@@H]2CO)O)O[C@@H]1CO)O)O)CO")
+smiles(R"[C@H]1(O)[C@H](O[C@H]2O[C@@H]([C@H]([C@H](O)[C@H]2O)O)CO)[C@H](O[C@@H]([C@@H]1O)O[C@H]1[C@H](O)[C@H]([C@H](O[C@@H]1CO)O[C@H]1[C@H](O)[C@H]([C@@H](O[C@H]2[C@H](O)[C@H]([C@@H](O[C@H]3[C@H](O)[C@H]([C@@H](O)O[C@@H]3CO)O)O[C@@H]2CO)O)O[C@@H]1CO)O)O)CO")
+smiles(R"[C@H]1(O)[C@H](O[C@H]2O[C@@H]([C@H]([C@H](O)[C@H]2O)O)CO)[C@H](O[C@@H]([C@@H]1O)O[C@H]1[C@H](O)[C@H]([C@H](O[C@@H]1CO)O[C@H]1[C@H](O)[C@H]([C@@H](O[C@H]2[C@H](O)[C@H]([C@@H](O)O[C@@H]2CO)O)O[C@@H]1CO)O)O)CO")
+smiles(R"[C@@H]1(O)[C@H](O)[C@@H]([C@H]([C@@H]([C@H]1OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-])OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(O)[C@H](O)[C@@H]([C@H]([C@H](O)[C@H]1O)O)OC")
+smiles(R"[C@@H]1(O)[C@H](O)[C@H]([C@H](O)[C@H]([C@H]1O)O)OC")
+smiles(R"[C@H]1(O)[C@@H](O)[C@H](n2cnc3c2nc(N)[nH]c3=O)O[C@@H]1COP(=O)(OP(=O)(O[C@H](C(=O)[O-])C)[O-])[O-]")
+smiles(R"[C@H]1(O)[C@@H](O)[C@H](n2cnc3c2nc(N)[nH]c3=O)O[C@@H]1COP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"[C@H]1(O)[C@H](O)[C@H](O[C@@]1(CO)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)CO")
+smiles(R"[C@H]1(O)[C@H](O)[C@H](O[C@@]1(CO)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)CO")
+smiles(R"[C@H]1(O)[C@H](O)[C@H](O[C@@]1(CO)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@H]1(O)[C@H](O)[C@H](O[C@@]1(CO)O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@H]1(O)[C@H](O)[C@H](O[C@@]1(CO)O[C@@H]1[C@@H](C(=O)[C@@H]([C@H](O1)CO)O)O)CO")
+smiles(R"[C@@H]1(O)[C@H](O)[C@H](O[C@H]1Nc1nc(nc(c1N)O)N)COP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(O)[C@H](O)[C@H](O)[C@H]([C@@H]([C@H]1O)OC)O")
+smiles(R"[C@@H]1(O)[C@H](O)[C@H](O)[C@H]([C@H](O)[C@H]1O)OC")
+smiles(R"[C@@H]1(O)[C@H](O)[C@H](O)[C@H]([C@H](O)[C@H]1O)OP(=O)([O-])[O-]")
+smiles(R"[C@@H]1(O)[C@H](O)[C@H](O[C@@H](O)[C@@H]1O)CO")
+smiles(R"[C@H]1(O)[C@@H](O)[C@H](O[C@@H](O)[C@@H]1O)CO")
+smiles(R"[C@H]1(O)[C@@H](O)[C@H](O[C@H](O)[C@@H]1O)CO")
+smiles(R"[C@H]1(O)[C@H](O)[C@H](O[C@@H](O)[C@@H]1O)CO")
+smiles(R"[C@H]1(O)[C@H](O)[C@H](O[C@H](O)[C@@H]1O)CO")
+smiles(R"[C@@H]1(O)[C@H](O)[C@@H](OC(O)[C@H]1O)CO")
+smiles(R"[C@H]1(O)[C@@H](O)[C@H](OC(O)[C@@H]1O)CO")
+smiles(R"[C@H]1(O)[C@H](O)[C@H](OC(O)[C@@H]1O)CO")
+smiles(R"[C@H]1(O)[C@H](O)[C@H](OC(O)[C@H]1O)CO")
+smiles(R"[C@H]1(OC(=O)c2ccccc2)[C@@H]2[C@@]3(CO[C@@H]3C[C@@H]([C@]2(C(=O)[C@@H](C2=C([C@H](C[C@]1(O)C2(C)C)OC(=O)[C@@H]([C@H](c1ccccc1)NC(=O)c1ccccc1)O)C)OC(=O)C)C)O)OC(=O)C")
+smiles(R"[C@H]1(OC(=O)c2ccccc2)[C@@H]2[C@@]3(CO[C@@H]3C[C@@H]([C@]2(C(=O)[C@@H](C2=C([C@H](C[C@]1(O)C2(C)C)OC(=O)[C@@H]([C@H](c1ccccc1)[NH3+])O)C)OC(=O)C)C)O)OC(=O)C")
+smiles(R"[C@H]1(OC(=O)/C=C/c2cc(c(c(c2)OC)O)OC)[C@H](OC(=O)/C=C/c2cc(c(c(c2)OC)O)OC)[C@@H](O)[C@H](O)[C@H](O1)CO")
+smiles(R"[C@@H]1(OC(=O)[C@H]([C@@H]1O)O)[C@H](CO)O")
+smiles(R"[C@H]1(OC(=O)[C@@H]([C@H]1O)O)[C@@H](CO)O")
+smiles(R"[C@@H]1(OC(=O)[C@H]([C@H]1O)O)[C@@H](O)CO")
+smiles(R"[C@@H]1(OC(=O)[C@@H]([C@H]1O)O)CO")
+smiles(R"[C@@H]1(OC(=O)[C@H]([C@@H]1O)O)CO")
+smiles(R"[C@H]1(OC(=O)[C@@H]([C@H]1O)O)CO")
+smiles(R"[C@H]1(OC(=O)[C@H]([C@@H]1O)O)CO")
+smiles(R"[C@@H]1(OC(=O)[C@@H]([C@H]([C@@H]1O)O)O)CO")
+smiles(R"[C@@H]1(OC(=O)[C@@H]([C@H]([C@@H]1O)O)O)COP(=O)([O-])[O-]")
+smiles(R"[C@@H](Cc1c[nH]cn1)(NC(=O)CC[NH3+])C(=O)[O-]")
+smiles(R"[C@@H](CC(C)C)(NC(=O)C)C(=O)[O-]")
+smiles(R"[C@@H](CCCNC(=[NH2+])N)([NH2+]CCC(=O)[O-])C(=O)[O-]")
+smiles(R"[C@H](CCC(=O)NCCCC=O)(C(=O)[O-])[NH3+]")
+smiles(R"[C@H](CCC(=O)N[C@@H](C(=O)[O-])C)(C(=O)[O-])[NH3+]")
+smiles(R"[C@H](CCNC(=O)C)(C(=O)[O-])[NH3+]")
+smiles(R"[C@@H](CC(=O)[O-])(c1ccccc1)[NH3+]")
+smiles(R"[C@@H](CC(=O)OCC)(CCC)O")
+smiles(R"[C@H](CC(=O)OCC)(CCC)O")
+smiles(R"[C@H](CC[Se]C[C@@H](C(=O)[O-])[NH3+])(C(=O)[O-])[NH3+]")
+smiles(R"[C@@H]([C@H](Cc1cc(c(cc1)O)OC)CO)(Cc1ccc(c(c1)OC)O)CO")
+smiles(R"[C@H]([C@@H](Cc1cc(c(cc1)O)OC)CO)(Cc1ccc(c(c1)OC)O)CO")
+smiles(R"[C@@H]([C@@H]([C@H]([C@H](C)O)O)O)(C(=O)[O-])O")
+smiles(R"[C@@H]([C@H]([C@@H]([C@H](CO)O)O)O)(CO)O")
+smiles(R"[C@H]([C@@H]([C@@H]([C@H](CO)O)O)O)(CO)O")
+smiles(R"[C@H]([C@@H]([C@H]([C@@H](CO)O)O)O)(CO)O")
+smiles(R"[C@@H]([C@H]([C@@H]([C@H](CO)O)O)O)(C(=O)[O-])O")
+smiles(R"[C@@H]([C@H]([C@H]([C@@H](CO)O)O)O)(C(=O)[O-])O")
+smiles(R"[C@H]([C@@H]([C@@H]([C@H](CO)O)O)O)(C(=O)[O-])O")
+smiles(R"[C@H]([C@H]([C@@H]([C@H](CO)O)O)O)(C(=O)[O-])O")
+smiles(R"[C@@H]([C@H]([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)O)(C=O)O")
+smiles(R"[C@H]([C@H]([C@@H]([C@@H](O)C(=O)[O-])O)O)(O)C(=O)[O-]")
+smiles(R"[C@H]([C@H]([C@@H](CO)O)O)([C@H](COP(=O)([O-])[O-])O)O")
+smiles(R"[C@H]([C@@H]([C@@H](C(=O)[O-])O)O)([C@H](C(=O)[O-])OC(=O)/C=C/c1cc(c(O)c(c1)OC)OC)O")
+smiles(R"[C@H]([C@@H]([C@@H](C(=O)[O-])O)O)([C@H](C(=O)[O-])O)O")
+smiles(R"[C@@H]([C@H](C)[NH2+]C)(O)c1ccccc1")
+smiles(R"[C@H]([C@@H](C(=O)COP(=O)([O-])[O-])O)(C(=O)C)O")
+smiles(R"[C@@H]([C@@H](C(=O)[O-])[NH3+])(C(=O)[O-])O")
+smiles(R"[C@H]([C@@H](C(=O)[O-])[NH3+])(C(=O)[O-])O")
+smiles(R"[C@H]([C@H](C(=O)[O-])O)(C(=O)[O-])C")
+smiles(R"[C@H]([C@H](C(=O)[O-])O)(C(=O)[O-])O")
+smiles(R"[C@@H]([C@@H](C)OP(=O)([O-])[O-])(NC(=O)CCCCCCS)C(=O)[O-]")
+smiles(R"[C@@H]([C@@H](COP(=O)([O-])[O-])O)(O)C(=O)CO")
+smiles(R"[C@H]([C@@H](O)CC=O)(COP(=O)([O-])[O-])O")
+smiles(R"[C@H]([C@H](O)CO)(O)[C@@](COP(=O)([O-])[O-])(O)C(=O)[O-]")
+smiles(R"[C@H]([C@H](O)CO)(O)CO")
+smiles(R"[C@H]([C@H](O)CO)(O)[C@](O)(CO)C(=O)[O-]")
+smiles(R"[C@@H]([C@H](O)COP(=O)([O-])[O-])([C@@H](C(=O)CO)O)O")
+smiles(R"[C@@H](C[NH2+]C)(O)c1ccc(cc1)O")
+smiles(R"[C@H](C[NH3+])(C(=O)[O-])N")
+smiles(R"[C@@H](COCCCCCCCCCCCCCCCC)(COP(=O)(OCC[N+](C)(C)C)[O-])O")
+smiles(R"[C@H](CO)([C@H]([C@@H](C(=O)C=O)O)O)O")
+smiles(R"[C@@H](C)(O)C=O")
+smiles(R"[C@H](C)(O)C=O")
+smiles(R"[C@H](CO)(COCCCCCCCCCCCCCCCC)O")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCC/C=C\C/C=C\C/C=C\C/C=C\CCCCC)COP(=O)(OCC[N+](C)(C)C)[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCC/C=C\C/C=C\C/C=C\C/C=C\CCCCC)COP(=O)(OCC[NH3+])[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCCCCCC/C=C\C/C=C\CCCCC)COP(=O)(OCC[N+](C)(C)C)[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCCCCCC/C=C\CCCCCCCC)COP(=O)(OCC[N+](C)(C)C)[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCCCCCCCCCCCCCCCC)COP(=O)(OCC[N+](C)(C)C)[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCCCCCC/C=C\C/C=C\CCCCC)COP(=O)(OCC[NH3+])[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCCCCCC/C=C\CCCCCCCC)COP(=O)(OCC[NH3+])[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCCCCCCCCCCCCCCCC)COP(=O)(OCC[NH3+])[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCCCCCC/C=C\CCCCCCCC)COP(=O)([O-])[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCCCCCCCCCCCCCC)COP(=O)(OCC[N+](C)(C)C)[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(OC(=O)CCCCCCCCCCCCCCC)COP(=O)(OCC[NH3+])[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(O)COP(=O)(OCC[N+](C)(C)C)[O-]")
+smiles(R"[C@H](COC(=O)CCCCCCCCCCCCCCC)(O)COP(=O)(OCC[NH3+])[O-]")
+smiles(R"[C@H](C=O)(CO)O")
+smiles(R"[C@H](C(=O)NCC(=O)N)(NC(=O)CC[C@@H](C(=O)[O-])[NH3+])CS")
+smiles(R"[C@H](C(=O)NCC(=O)N)(NC(=O)CC[C@@H](C(=O)[O-])[NH3+])CSSC[C@@H](C(=O)NCC(=O)N)NC(=O)CC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"[C@@H](C(=O)NCC(=O)[O-])(CS)[NH3+]")
+smiles(R"[C@H](C(=O)NCC(=O)[O-])(NC(=O)CC[C@@H](C(=O)[O-])[NH3+])CSC=O")
+smiles(R"[C@@H](C(=O)N[C@@H](CCC(=O)N[C@@H](CCC(=O)[O-])C(=O)[O-])C(=O)[O-])(C)OP(=O)(OC[C@H]([C@H]([C@H](CN1c2c(Cc3c1cc(cc3)O)c(=O)[nH]c(=O)[nH]2)O)O)O)[O-]")
+smiles(R"[C@@H](C(=O)[O-])(CCC[C@@H](C(=O)[O-])[NH3+])[NH3+]")
+smiles(R"[C@@H](C(=O)[O-])(CCC[C@H](C(=O)[O-])[NH3+])[NH3+]")
+smiles(R"[C@@H](C(=O)[O-])(CC(=C)Cl)[NH3+]")
+smiles(R"[C@@H](C(=O)[O-])(CCCCN(C(=O)C)O)NC(=O)CC(CC(=O)N[C@H](C(=O)[O-])CCCCN(C(=O)C)O)(C(=O)[O-])O")
+smiles(R"[C@@H](C(=O)[O-])(CC[C@H](C[NH3+])OP(=O)([O-])[O-])[NH3+]")
+smiles(R"[C@H](C(=O)[O-])(CCC(=O)N[C@H](CCC[C@@H](C(=O)[O-])[NH3+])C(=O)N[C@@H](C(=O)[O-])C)NC(=O)[C@H](C)[NH3+]")
+smiles(R"[C@H](C(=O)[O-])(CCC(=O)N[C@H](CCC[C@@H](C(=O)[O-])[NH3+])C(=O)[O-])NC(=O)[C@H](C)[NH3+]")
+smiles(R"[C@@H](C(=O)[O-])(CCC=O)[NH3+]")
+smiles(R"[C@@H](C(=O)[O-])(CC[NH3+])[NH3+]")
+smiles(R"[C@H](C(=O)[O-])(CC(=O)C(=O)[O-])O")
+smiles(R"[C@H](C(=O)[O-])([C@H](CCC(=O)[O-])C(=O)[O-])O")
+smiles(R"[C@@H](C(=O)[O-])([C@H](CC(=O)[O-])C(=O)[O-])O")
+smiles(R"[C@H](C(=O)[O-])([C@H](C(=O)[O-])[NH3+])O")
+smiles(R"[C@H](C=O)(O)[C@H](O)[C@H](CO)O")
+smiles(R"[C@@H](C(=O)[O-])(C[NH3+])C")
+smiles(R"[C@H](C(=O)[O-])(C[NH3+])C")
+smiles(R"[C@@H](C(=O)[O-])(CO)C")
+smiles(R"[C@H](COP(=O)(OC[C@H](CO)O)[O-])(CO)O")
+smiles(R"[C@H](C[Se]C)(C(=O)[O-])[NH3+]")
+smiles(R"[C@H](CS(=O)[O-])(C(=O)[O-])[NH3+]")
+smiles(R"[C@@H](NC(=O)C)(Cc1c[nH]c2c1cccc2)C(=O)[O-]")
+smiles(R"[C@@H](NC=O)(C(=O)[O-])CC(=O)[O-]")
+smiles(R"[C@@H](O)(CO)C")
+smiles(R"[C@H](O)(CO)C")
+smiles(R"[C@@H](OC(=O)CCCCCCCCCCCCCCC)(C[N+](C)(C)C)CC(=O)[O-]")
+smiles(R"[C@H](O)(CO)C(CO)(O)CO")
+smiles(R"CI")
+smiles(R"[Cl-]")
+smiles(R"Clc1c(c(c(cc1)Cl)O)O")
+smiles(R"ClCCCl")
+smiles(R"ClC(=CCl)Cl")
+smiles(R"ClC(=C(Cl)Cl)Cl")
+smiles(R"ClCCl")
+smiles(R"C(Nc1ccccc1C(=O)[O-])C(=O)[C@H](O)[C@H](O)COP(=O)([O-])[O-]")
+smiles(R"C([N+](C)(C)C)COP(=O)([O-])[O-]")
+smiles(R"C([N+](C)(C)C)COS(=O)(=O)[O-]")
+smiles(R"C(#N)C(C)(O)C")
+smiles(R"C[N+](CC=O)(C)C")
+smiles(R"CN(CC(=O)[O-])C(=[NH2+])N")
+smiles(R"C(#N)[C@@H](O)c1ccc(cc1)O")
+smiles(R"C(#N)[C@H](O[C@H]1[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO)c1ccccc1")
+smiles(R"C(#N)[C@H](O[C@H]1[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO)c1ccc(cc1)O")
+smiles(R"C(#N)[C@H](O[C@H]1[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO[C@H]1[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO)c1ccccc1")
+smiles(R"C(#N)[C@H](O[C@H]1[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO[C@@H]1[C@H](O)[C@@H](O)[C@@H](O)CO1)c1ccccc1")
+smiles(R"C(#N)CNCC#N")
+smiles(R"C(#N)CNCC(=O)[O-]")
+smiles(R"C(NC(=[NH2+])N(C)C)CC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(NC(=[NH2+])NC)CC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(NC(=[NH2+])NCCC[C@@H](C(=O)[O-])[NH3+])(CC(=O)[O-])C(=O)[O-]")
+smiles(R"C(NC(=[NH2+])N)CCC[NH3+]")
+smiles(R"C(#N)C(O)c1ccc(cc1)O")
+smiles(R"C(NC(=O)C)CCC=O")
+smiles(R"C(NC(=O)N)CC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(NC(=O)N)(NC(=O)N)C(=O)[O-]")
+smiles(R"C(NC(=O)[O-])NC(=O)N")
+smiles(R"C[NH2+]C")
+smiles(R"C[NH2+]CCCC[NH3+]")
+smiles(R"C[NH2+]CC(=O)[O-]")
+smiles(R"C[NH2+]CCOP(=O)([O-])[O-]")
+smiles(R"C(=[NH2+])(NCCC[C@H](C(=O)Nc1ccc(cc1)[N+](=O)[O-])NC(=O)c1ccccc1)N")
+smiles(R"C(=[NH2+])(NCCC[C@H](C(=O)[O-])NC(=O)c1ccccc1)N")
+smiles(R"C(=[NH2+])(NCCC[C@@H](C(=O)[O-])NC(=O)CCC(=O)[O-])N")
+smiles(R"C(=[NH2+])(NCCC[C@@H](C(=O)[O-])[NH2+][C@H](C)C(=O)[O-])N")
+smiles(R"C(=[NH2+])(NCCC[C@@H](C(=O)[O-])[NH3+])NP(=O)([O-])[O-]")
+smiles(R"C(=[NH2+])(NCCC[C@H](N1CCC1=O)C(=O)[O-])N")
+smiles(R"C(=[NH2+])(NCC[C@H]([C@H](N1CCC1=O)C(=O)[O-])O)N")
+smiles(R"C(=[NH2+])(NCCOP(=O)(OC)[O-])NP(=O)([O-])[O-]")
+smiles(R"C(=[NH2+])(N[C@H]1[C@@H]([C@H]([C@@H]([C@H]([C@@H]1O)O)O)O)O)N")
+smiles(R"C(=[NH2+])(N[C@H]1[C@@H]([C@H]([C@@H]([C@H]([C@@H]1O)O)OP(=O)([O-])[O-])O)O)N")
+smiles(R"C(=[NH2+])N[C@H](C(=O)[O-])CC(=O)[O-]")
+smiles(R"C(=[NH2+])(NC)N")
+smiles(R"C(=[NH2+])(N)NCCCCNP(=O)([O-])[O-]")
+smiles(R"C(=[NH2+])(N)NCCCC(=O)[O-]")
+smiles(R"C[NH+](C)C")
+smiles(R"C(=[NH+]\CCC[NH3+])/CCC[NH3+]")
+smiles(R"C(#N)N")
+smiles(R"C(#N)[O-]")
+smiles(R"C(=N\O)(/c1ccc(cc1)OCC[C@H](C(=O)[O-])[NH3+])\C(=O)N[C@H]1CN(C1=O)[C@H](c1ccc(cc1)O)C(=O)[O-]")
+smiles(R"C(=N\O)/C(C)C")
+smiles(R"C(=N\O)/CCCCCCCCSC")
+smiles(R"C(=N\O)/CCCCCCCSC")
+smiles(R"C(=N\O)/CCCCCCSC")
+smiles(R"C(=N\O)/CCCCCSC")
+smiles(R"C(=N\O)/CCCCSC")
+smiles(R"C(=N\O)(\C(=O)[O-])/C")
+smiles(R"C=O")
+smiles(R"CO")
+smiles(R"[Co+2]")
+smiles(R"[Co-3]1234(N5C6=C(C7=[N+]3C(=CC3=[N+]2C(=C(C2=[N+]1[C@]([C@H]5[C@H](CC(=O)N)[C@@]6(C)CCC(=O)NC[C@H](OP(=O)(O[C@@H]1[C@H](O[C@H](n5c[n+]4c4c5cc(c(c4)C)C)[C@@H]1O)CO)[O-])C)(C)[C@]([C@@H]2CCC(=O)N)(CC(=O)N)C)C)[C@](C)([C@@H]3CCC(=O)N)CC(=O)N)C([C@@H]7CCC(=O)N)(C)C)C)C[C@H]1O[C@@H](n2c3ncnc(N)c3nc2)[C@@H]([C@@H]1O)O")
+smiles(R"[Co-3]1234(N5C6=C(C7=[N+]3C(=CC3=[N+]2C(=C(C2=[N+]1[C@]([C@H]5[C@H](CC(=O)N)[C@@]6(C)CCC(=O)NC[C@H](OP(=O)(O[C@@H]1[C@H](O[C@H](n5c[n+]4c4c5cc(c(c4)C)C)[C@@H]1O)COP(=O)([O-])[O-])[O-])C)(C)[C@]([C@@H]2CCC(=O)N)(CC(=O)N)C)C)[C@](C)([C@@H]3CCC(=O)N)CC(=O)N)C([C@@H]7CCC(=O)N)(C)C)C)C[C@H]1O[C@@H](n2c3ncnc(N)c3nc2)[C@@H]([C@@H]1O)O")
+smiles(R"C(O)C1=CCC(CC1)C(=C)C")
+smiles(R"C(=O)(c1c(c(c(cc1)C(C)C)O)O)[O-]")
+smiles(R"C(=O)(c1ccc(cc1)N1C=[N+]2[C@@H](C1)CNc1c2c(=O)[nH]c(n1)N)N[C@H](C(=O)[O-])CCC(=O)[O-]")
+smiles(R"C(=O)(c1ccc(cc1)N1CN2[C@@H](C1)CNc1c2c(=O)[nH]c(n1)N)N[C@H](C(=O)[O-])CCC(=O)[O-]")
+smiles(R"C(=O)(c1cc(ccc1)O)c1c(cc(cc1O)O)O")
+smiles(R"C(=O)(c1ccc(cc1)O)C(=O)[O-]")
+smiles(R"C(=O)([C@@]1(C[C@@H]([C@H]([C@H]([C@@H]([C@@H](CO)O)O)O1)NC(=O)C)OC(=O)C)O)[O-]")
+smiles(R"C(=O)(c1c(cnc(c1O)C)C(=O)[O-])[O-]")
+smiles(R"COc1c(O)c(cc(c1)O)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C")
+smiles(R"C(=O)(c1c(O)cc(cc1O)O)/C=C/c1ccc(c(c1)O)O")
+smiles(R"C(=O)C#C")
+smiles(R"C(=O)(C)c1ccccc1")
+smiles(R"C(=O)Cc1ccc(c(c1)O)O")
+smiles(R"C(=O)C(c1cc(c(cc1)O)O)O")
+smiles(R"C(=O)CC#C")
+smiles(R"C(=O)(C(Cc1cc(c(c(c1)I)[O-])I)O)[O-]")
+smiles(R"C(=O)(/C=C/c1ccc(cc1)O)c1c(cc(cc1O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O")
+smiles(R"C(=O)(/C=C/c1ccc(cc1)O)c1c(cc(cc1O)O)O")
+smiles(R"C(=O)(/C=C/c1cc(c(c(c1)OC)OC(=O)[C@H](CC(=O)[O-])O)OC)[O-]")
+smiles(R"C(=O)(/C=C/c1ccc(c(c1)O)O)c1c(cc(cc1O)O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O")
+smiles(R"C(=O)(/C=C/c1ccc(cc1)O)O[C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO")
+smiles(R"C(=O)(/C=C/c1cc(c(cc1)O)O)[O-]")
+smiles(R"C(=O)(/C=C\c1cc(c(cc1)O)O)[O-]")
+smiles(R"C(=O)(C(Cc1ccc(cc1)O)O)[O-]")
+smiles(R"C(=O)(CC[C-]1NC=NC1=O)[O-]")
+smiles(R"C(=O)(/C(=C/c1oc(cc1)[N+](=O)[O-])/c1occc1)N")
+smiles(R"C(=O)(/C(=C\c1oc(cc1)[N+](=O)[O-])/c1occc1)N")
+smiles(R"C(=O)/C(=C/C=C/C=C(/C=C/C=C(\C)/C=C/[C@@]12[C@@](C[C@H](CC1(C)C)O)(O2)C)\C)/C")
+smiles(R"C(=O)/C(=C/C=C/C=C(/C=C/C=C(\C)/C=C=C1C(C[C@@H](C[C@]1(O)C)O)(C)C)\C)/C")
+smiles(R"C(=O)(CCCCCCCCCCCC(CCCCCCCCC)O[C@H]1[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO)[O-]")
+smiles(R"C(=O)(CCCCCCC/C=C\C=C\CCCCCC)[O-]")
+smiles(R"C(=O)(CCCCCCC/C=C\C/C=C\C/C=C\CC)[O-]")
+smiles(R"C(=O)(CCCCCCC/C=C\CC#CCCCCC)[O-]")
+smiles(R"C(=O)(CCCCCCCCCCCCCCCCC)[O-]")
+smiles(R"C(=O)(CCCC/C=C\C/C=C\C/C=C\C/C=C\CC)SCCNC(=O)CCNC(=O)[C@@H](C(COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1OP(=O)([O-])[O-])O)n1c2c(nc1)c(ncn2)N)[O-])[O-])(C)C)O")
+smiles(R"C(=O)(/C=C/CCCCCCCCCCCCC)[O-]")
+smiles(R"C(=O)(CCCCCCC/C=C\CCCCCC)[O-]")
+smiles(R"C(=O)(CCCCCCCCCCCCCCC)OC[C@H](COP(=O)([O-])[O-])O")
+smiles(R"C(=O)(CCCCCCC/C=C\CCCC)[O-]")
+smiles(R"C(=O)(CCCCCCCCCCCCC)[O-]")
+smiles(R"C(=O)(CCCCCCC/C=C\C=C\[C@H](CCCCC)OO)[O-]")
+smiles(R"C(=O)(CCCCCCCCCCC)[O-]")
+smiles(R"C(=O)(CCCCCCC/C=C\[C@H](/C=C\CCCCC)OO)[O-]")
+smiles(R"C(=O)(/C=C(/CC/C=C(/CC[C@@H]1[C@](CC)(O1)C)\C)\C)[O-]")
+smiles(R"C(=O)(/C=C(/CC/C=C(/CC[C@@H]1[C@](CC)(O1)C)\C)\C)OC")
+smiles(R"C(=O)(CCCCCCCC[C@@H](CCCCCCCC)O)[O-]")
+smiles(R"C(=O)(CCCCCC/C=C/[C@@H](C/C=C\CCCCC)OO)[O-]")
+smiles(R"C(=O)(CCCCCCCCC)[O-]")
+smiles(R"C(=O)(CCCCCCC[C@H]1[C@H](C(=O)CC1)C/C=C\CC)[O-]")
+smiles(R"C(=O)(CCCCCCC[C@@H](/C=C/C=C\C/C=C\CC)OO)[O-]")
+smiles(R"C(=O)(CCCCCCC[C@@H](/C=C/C=C\CCCCC)OO)[O-]")
+smiles(R"C(=O)(CCCCCCC[C@H](/C=C/C=C\CCCCC)OO)[O-]")
+smiles(R"C(=O)(CCCCCCC[C@@H]([C@H](CCCCCCCC)O)O)[O-]")
+smiles(R"C(=O)(CCCCCCC[C@@H]([C@H](CCCCCCCC)O)OP(=O)([O-])[O-])[O-]")
+smiles(R"C(=O)(CCCCCCC[C@@H](OO)/C=C/C=C\C/C=C\CC)[O-]")
+smiles(R"C(=O)(CCCCCC(C(C)[NH3+])[NH3+])[O-]")
+smiles(R"C(=O)(CCCCCC/C=C/O/C=C/C=C\C/C=C\CC)[O-]")
+smiles(R"C(=O)(CCCCCC/C=C/O/C=C/C=C\CCCCC)[O-]")
+smiles(R"C(=O)(CCC/C=C\C[C@H]1[C@H](CC(=O)[C@@H]1/C=C/[C@H](CCCCC)O)O)[O-]")
+smiles(R"C(=O)(CCCCCC[C@H]1C(=O)C[C@H]([C@@H]1/C=C/C(=O)CCCCC)O)[O-]")
+smiles(R"C(=O)(CCCCCC[C@H](/C=C\C/C=C\CCCCC)OO)[O-]")
+smiles(R"C(=O)(CCCCCCC)[O-]")
+smiles(R"C(=O)/C(=C/CCC(C=C)(O)C)/C")
+smiles(R"C(=O)C/C=C/C=C(/CO)\C")
+smiles(R"C(=O)(/C(=C/C=C(/CC(=O)[O-])\C=O)/O)[O-]")
+smiles(R"C(=O)(C(CCC(C)[NH3+])[NH3+])[O-]")
+smiles(R"C(=O)(/C(=C/C=C/C(=O)c1ccccc1)/O)[O-]")
+smiles(R"C(=O)(/C(=C/C=C/C(=O)CCC(=O)[O-])/O)[O-]")
+smiles(R"C(=O)(/C=C/C(=C\C(=O)C(=O)[O-])/[N+](=O)[O-])[O-]")
+smiles(R"C(=O)(C(CC(C(C(=O)COP(=O)([O-])[O-])O)O)[NH3+])[O-]")
+smiles(R"C(=O)(/C(=C\C=C/C=O)/N)[O-]")
+smiles(R"C(=O)(/C=C(\C=C(/C(=O)[O-])\Cl)/Cl)[O-]")
+smiles(R"C(=O)(/C(=C/C=C/C(=O)[O-])/N)[O-]")
+smiles(R"C(=O)(/C=C\C=C/C(=O)[O-])[O-]")
+smiles(R"C(=O)(/C(=C/C=C/C=O)/O)[O-]")
+smiles(R"C(=O)(C(=C)CCC(=O)[O-])[O-]")
+smiles(R"C(=O)(C(CCCC(=O)[O-])O)[O-]")
+smiles(R"C(=O)C(C(C(C(C)O)O)O)O")
+smiles(R"C(=O)(C(C(C(C(C(=O)[O-])O)O)O)OC(=O)/C=C/c1ccc(c(c1)OC)O)[O-]")
+smiles(R"C(=O)C(C(C(C(COP(=O)([O-])[O-])O)O)O)NC(=O)C")
+smiles(R"C(=O)(CCC[C@@H](CC[C@H](/C=C\C/C=C\CCCCC)O)O)[O-]")
+smiles(R"C(=O)(CCC[C@@H](C(=O)[O-])[NH3+])N[C@H](C(=O)N[C@@H](C(=O)[O-])C(C)C)CS")
+smiles(R"C(=O)(/C(=C/C)/C)O[C@@H]1C[C@H]2[NH+](C[C@@H]3C[C@H]2CN2C(=O)CCC[C@H]32)CC1")
+smiles(R"C(=O)(CCCC=O)[O-]")
+smiles(R"C(=O)(CCCC(=O)[O-])C")
+smiles(R"C(=O)(C[C@@](CCO)(O)C)[O-]")
+smiles(R"C(=O)(CCC(C(=O)[O-])C=O)[O-]")
+smiles(R"C(=O)(/C=C(\CC(=O)[O-])/C(=O)OC)[O-]")
+smiles(R"C(=O)(/C=C/CC(=O)[O-])[O-]")
+smiles(R"C(=O)CC(CC(=O)[O-])(O)C")
+smiles(R"C(=O)(CC(CC(=O)[O-])(O)C)[O-]")
+smiles(R"C(=O)(C[C@@](CCOP(=O)([O-])[O-])(O)C)[O-]")
+smiles(R"C(=O)(C[C@@](CCOP(=O)([O-])OP(=O)([O-])[O-])(O)C)[O-]")
+smiles(R"C(=O)(CC[C@@H]1NC=NC1=O)O")
+smiles(R"C(=O)(CC[C@@H](C(=O)[O-])NC=O)[O-]")
+smiles(R"C(=O)(CCCNC(=[NH2+])N)N")
+smiles(R"C(=O)(/C(=C/C)/[NH2+])[O-]")
+smiles(R"C(=O)(/C=C/C)[O-]")
+smiles(R"C(=O)C#CCO")
+smiles(R"C(=O)(/C=C/C(=O)CC(=O)CC(=O)[O-])[O-]")
+smiles(R"C(=O)(C(CC(=O)C)[NH3+])[O-]")
+smiles(R"C(=O)(C(C(C)(O)C)O)[O-]")
+smiles(R"C(=O)(C(C)(C)O)C(=O)[O-]")
+smiles(R"C(=O)(C(CC=O)CO)[O-]")
+smiles(R"C(=O)(CCC(=O)N)C(=O)[O-]")
+smiles(R"C(=O)(C(C)C=O)[O-]")
+smiles(R"C(=O)CCC(=O)[O-]")
+smiles(R"C(=O)(/C(=C\C(=O)[O-])/C(C)C)[O-]")
+smiles(R"C(=O)(/C(=C(/C(=O)[O-])\C=C\C=O)/N)[O-]")
+smiles(R"C(=O)(C(C(C(=O)[O-])CCC)O)[O-]")
+smiles(R"C(=O)(/C(=C(/C(=O)[O-])\C=C\C=O)/O)[O-]")
+smiles(R"C(=O)(/C(=C(\C(=O)[O-])/C)/C)[O-]")
+smiles(R"C(=O)([C@](CC(=O)[O-])(CC)O)[O-]")
+smiles(R"C(=O)(/C(=C/C(=O)[O-])/CC(=O)OC)[O-]")
+smiles(R"C(=O)(/C=C\C(=O)[O-])N")
+smiles(R"C(=O)(/C=C\C(=O)[O-])NC=O")
+smiles(R"C(=O)(/C=C\C(=O)[O-])[O-]")
+smiles(R"C(=O)(C#CC(=O)[O-])[O-]")
+smiles(R"C(=O)(C(C(C(=O)[O-])O)CC)[O-]")
+smiles(R"C(=O)(C(CC(=O)[O-])OCC(=O)[O-])[O-]")
+smiles(R"C(=O)(CC(C(=O)[O-])O)[O-]")
+smiles(R"C(=O)(C(CCP(=O)(C)[O-])NC(=O)C)[O-]")
+smiles(R"C(=O)(C(CCP(=O)(C)[O-])[NH3+])[O-]")
+smiles(R"C(=O)(C[C@H](CCC[NH3+])[NH3+])[O-]")
+smiles(R"C(=O)(C[C@H](C(C)C)[NH3+])[O-]")
+smiles(R"C(=O)(C[C@H](C[C@H](C)[NH3+])[NH3+])[O-]")
+smiles(R"C(=O)(C[C@@H]([C@H]([C@@H](CO)O)O)O)[O-]")
+smiles(R"C(=O)[C@@]([C@@H]([C@@H](CO)O)O)(O)CO")
+smiles(R"C(=O)[C@@]([C@@H]([C@@H](CO)O)O)(O)COP(=O)([O-])[O-]")
+smiles(R"C(=O)(C[C@@H](C)O)[O-]")
+smiles(R"C(=O)(C[C@H](C)O)[O-]")
+smiles(R"C(=O)C([C@H](C(=O)[O-])O)(C)C")
+smiles(R"C(=O)(C[C@@H](C(=O)[O-])O)[O-]")
+smiles(R"C(=O)(C[C@H](C(=O)[O-])O)[O-]")
+smiles(R"C(=O)C[C@@H](O)[C@H](O)[C@H](O)CO")
+smiles(R"C(=O)C[C@@H](O)[C@H](O)[C@H](O)COP(=O)([O-])[O-]")
+smiles(R"C(=O)CCl")
+smiles(R"C(=O)(CCl)[O-]")
+smiles(R"C(=O)(C=C)N")
+smiles(R"C(=O)(CCNC(=[NH2+])N)[O-]")
+smiles(R"C(=O)(/C(=C\NC(=O)C)/C(C(=O)[O-])CO)[O-]")
+smiles(R"C(=O)(/C(=C\NC(=O)C)/CC(=O)[O-])[O-]")
+smiles(R"C(=O)(CCNC(=O)[C@@H](NC(=O)CC[C@@H](C(=O)[O-])[NH3+])CS)[O-]")
+smiles(R"C(=O)(CCNC(=O)C)[O-]")
+smiles(R"C(=O)(/C=C\NC(=O)N)[O-]")
+smiles(R"C(=O)(CCNC(=O)N)[O-]")
+smiles(R"C(=O)(/C=C\NC(=O)N)OO")
+smiles(R"C(=O)(CC(=N)C(=O)[O-])[O-]")
+smiles(R"C(=O)(C(C)[NH2+]C(C(=O)[O-])C)[O-]")
+smiles(R"C(=O)(C)C[NH3+]")
+smiles(R"C(=O)(CC([NH3+])c1ccc(cc1)O)[O-]")
+smiles(R"C(=O)(/C=C\N)[O-]")
+smiles(R"C(=O)(/C=C\N)OO")
+smiles(R"C(=O)(/C=C/[N+](=O)[O-])[O-]")
+smiles(R"C(=O)(C)C=O")
+smiles(R"C(=O)(C)CO")
+smiles(R"C(=O)(CC(=O)c1ccc(cc1)O)c1c(cc(cc1)O)O")
+smiles(R"C(=O)(CC(=O)c1ccc(cc1)O)c1c(cc(cc1)O)OC")
+smiles(R"C(=O)(C(CO)c1ccccc1)O[C@H]1C[C@@H]2C[C@@H]([C@H](C1)[NH+]2C)O")
+smiles(R"C(=O)(CC(=O)C)C")
+smiles(R"C(=O)(CC(=O)CCC)CCC")
+smiles(R"C(=O)(CC(=O)CCCCCCCCC)[O-]")
+smiles(R"C(=O)(CC(=O)CCC(=O)[O-])[O-]")
+smiles(R"C(=O)(C(C(=O)CCC(=O)[O-])O)[O-]")
+smiles(R"C(=O)(CC(=O)C[C@H](C)[NH3+])[O-]")
+smiles(R"C(=O)(CC(=O)[C@@H]([C@@H](CO)O)O)[O-]")
+smiles(R"C(=O)([C@](C(=O)C)(O)C)[O-]")
+smiles(R"C(=O)(C(C(=O)C)(O)C)[O-]")
+smiles(R"C(=O)(CC(=O)NC(=O)N)[O-]")
+smiles(R"C(=O)(C(CO)[NH3+])[O-]")
+smiles(R"C(=O)(CCO)[O-]")
+smiles(R"C(O)C(CO)O")
+smiles(R"C(=O)(CC(=O)OCC)CCC")
+smiles(R"C(=O)(CC(=O)[O-])[O-]")
+smiles(R"C(=O)(C(C(=O)[O-])O)[O-]")
+smiles(R"C(=O)(C(CS)CS)[O-]")
+smiles(R"C(=O)(C(CS)[NH3+])[O-]")
+smiles(R"C(O[C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)(CO)CO")
+smiles(R"C(=O)([C@H](Cc1ccccc1)NC(=O)C)[O-]")
+smiles(R"C(=O)([C@H](Cc1ccccc1)NP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c2c(c(ncn2)N)nc1)[O-])[O-]")
+smiles(R"C(=O)([C@H](Cc1ccc(cc1)O)N)OC")
+smiles(R"C(=O)([C@@H](Cc1ccc(cc1)O)O)[O-]")
+smiles(R"C(=O)([C@H](Cc1ccc(cc1)OP(=O)([O-])[O-])[NH3+])[O-]")
+smiles(R"C(=O)([C@H](Cc1ccc(cc1)OS(=O)(=O)[O-])N)OC")
+smiles(R"C(=O)([C@H](Cc1c[nH]c2c1cccc2)[NH3+])N")
+smiles(R"C(=O)([C@H](Cc1[nH]cnc1)NC(=O)C)[O-]")
+smiles(R"C(=O)([C@@H](CCCCCCCCCCCCCCCC)O)[O-]")
+smiles(R"C(=O)([C@H](CCCCCCCCCCCCCCCC)O)[O-]")
+smiles(R"C(=O)([C@H](CCCC[NH3+])NC(=O)C)[O-]")
+smiles(R"C(=O)([C@H](CCC)[NH2+][C@H](C)C(=O)[O-])[O-]")
+smiles(R"C(=O)([C@H](CCC(=O)NCC)[NH3+])[O-]")
+smiles(R"C(=O)([C@H](CCC(=O)N)NC(=O)Cc1ccccc1)[O-]")
+smiles(R"C(=O)([C@H](CCC(=O)[O-])[NH2+]C)[O-]")
+smiles(R"C(=O)([C@H](CCC(=O)OP(=O)([O-])[O-])NC(=O)C)[O-]")
+smiles(R"C(=O)([C@H](CCC(=O)OP(=O)([O-])[O-])[NH3+])[O-]")
+smiles(R"C(=O)([C@@H](CCl)[NH3+])[O-]")
+smiles(R"C(=O)([C@H](CCl)[NH3+])[O-]")
+smiles(R"C(=O)([C@H](CC#N)N)[O-]")
+smiles(R"C(=O)([C@@H](C(CO)(C)C)O)NCCC(=O)NCCS")
+smiles(R"C(=O)([C@@H](C(C)(O)C)O)[O-]")
+smiles(R"C(=O)([C@H](CC[Se]C)[NH3+])[O-]")
+smiles(R"C(=O)([C@@H]([C@H](CC(=O)C(=O)[O-])O)O)[O-]")
+smiles(R"C(=O)[C@@H]([C@H]([C@@H](CC(=O)[O-])O)O)O")
+smiles(R"C(=O)[C@@H]([C@@H]([C@H]([C@H](CO)O)O)O)NC(=O)C")
+smiles(R"C(=O)([C@@H]([C@H]([C@H]([C@@H](C)O)O)O)O)[O-]")
+smiles(R"C(=O)([C@H]([C@@H]([C@@H]([C@H](C)O)O)O)O)[O-]")
+smiles(R"C(=O)([C@@H]([C@H]([C@@H]([C@@H](CO)O)O)O)O)[O-]")
+smiles(R"C(=O)([C@H]([C@@H]([C@@H]([C@@H](CO)O)O)O)O)[O-]")
+smiles(R"C(=O)([C@H]([C@@H]([C@@H]([C@H](C=O)O)O)O)O)[O-]")
+smiles(R"C(=O)([C@H]([C@@H]([C@@H]([C@H](C(=O)[O-])O)O)O)O)[O-]")
+smiles(R"C(=O)([C@@H]([C@H]([C@@H]([C@H](O)CO)O)O)NC(=O)C)[O-]")
+smiles(R"C(=O)([C@@H]([C@H]([C@@H]([C@H](O)CO)O)O)[NH3+])[O-]")
+smiles(R"C(=O)[C@H]([C@H]([C@@H]([C@H](O)C(=O)[O-])O)O)O")
+smiles(R"C(=O)[C@@H]([C@@H]([C@@H]([C@H](O)COP(=O)([O-])[O-])O)O)O")
+smiles(R"C(=O)[C@@H]([C@H]([C@@H]([C@H](O)COP(=O)([O-])[O-])O)O)OP(=O)([O-])[O-]")
+smiles(R"C(=O)[C@@H]([C@H]([C@@H]([C@H](O)COS(=O)(=O)[O-])O)O)NS(=O)(=O)[O-]")
+smiles(R"C(=O)[C@@H]([C@H]([C@@H]([C@H](O)COS(=O)(=O)[O-])O)O)O")
+smiles(R"C(=O)([C@@H]([C@H]([C@@H](C(=O)CO)O)O)O)[O-]")
+smiles(R"C(O)[C@@H]([C@H]([C@@H](C(=O)C(=O)[O-])O)O)O")
+smiles(R"C(=O)([C@@H]([C@@H]([C@H](C)O)O)O)CO")
+smiles(R"C(=O)[C@@H]([C@@H]([C@H](CO)O)O)O")
+smiles(R"C(=O)[C@H]([C@H]([C@@H](CO)O)O)O")
+smiles(R"C(=O)([C@@H]([C@@H]([C@@H](CO)O)O)O)[O-]")
+smiles(R"C(=O)([C@@H]([C@H]([C@H](CO)O)O)O)[O-]")
+smiles(R"C(=O)([C@@H]([C@H](C)O)C)OCc1ccccc1")
+smiles(R"C(=O)([C@H]([C@@H](C(=O)N)O)[NH3+])[O-]")
+smiles(R"C(=O)([C@@H]([C@@H](C(=O)[O-])C(C)C)O)[O-]")
+smiles(R"C(=O)([C@H]([C@@H](C(=O)[O-])C)[NH3+])[O-]")
+smiles(R"C(=O)([C@@H]([C@H](CO)O)O)[O-]")
+smiles(R"C(=O)([C@H]([C@@H](C)OP(=O)([O-])[O-])[NH3+])[O-]")
+smiles(R"C(=O)[C@H]([C@H](O)[C@@H]([C@H](C=O)O)O)O")
+smiles(R"C(O)[C@H]([C@@H](O)[C@@H]([C@H](CO)O)O)O")
+smiles(R"C(=O)([C@H]([C@H](O)[C@@H]([C@H](O)COP(=O)([O-])[O-])O)O)CO")
+smiles(R"C(=O)[C@@H]([C@H](O)[C@H](O)COP(=O)([O-])[O-])O")
+smiles(R"C(=O)([C@@H]([C@H](O)C)[NH3+])[O-]")
+smiles(R"C(=O)([C@H]([C@@H](O)C)[NH3+])[O-]")
+smiles(R"C(=O)([C@H](C)[NH3+])N[C@H](CCC(=O)[O-])C(=O)[O-]")
+smiles(R"C(=O)([C@@H](C)[NH3+])N[C@@H](C(=O)[O-])CO")
+smiles(R"C(=O)([C@H](C=O)C)[O-]")
+smiles(R"C(=O)([C@@H](C(=O)CO)O)[O-]")
+smiles(R"C(=O)([C@H](C(=O)COP(=O)([O-])[O-])N)[O-]")
+smiles(R"C(=O)([C@@H](CO)[NH3+])[O-]")
+smiles(R"C(=O)([C@H](CO)[NH3+])[O-]")
+smiles(R"C(=O)([C@@H](C)O)[O-]")
+smiles(R"C(=O)([C@H](C)O)[O-]")
+smiles(R"C(=O)([C@@H](C(=O)[O-])C(C)C)C(=O)[O-]")
+smiles(R"C(=O)([C@@H](CO)OP(=O)([O-])[O-])[O-]")
+smiles(R"C(=O)([C@H](COP(=O)([O-])[O-])O)C")
+smiles(R"C(=O)([C@@H](CS)[NH3+])[O-]")
+smiles(R"C(=O)([C@H](CS)[NH3+])[O-]")
+smiles(R"C(=O)([C@@H](NC(=O)CCNC(=O)[C@@H](C(CO)(C)C)O)CS)[O-]")
+smiles(R"C(=O)([C@@H](NC(=O)CCNC(=O)[C@@H](C(COP(=O)([O-])[O-])(C)C)O)CS)[O-]")
+smiles(R"C(=O)([C@@H](N)C=O)[O-]")
+smiles(R"C(=O)([C@@H]([NH2+]C)C)[O-]")
+smiles(R"C(=O)([C@@H]([NH2+][C@@H](C(=O)[O-])C)CCCC[NH3+])[O-]")
+smiles(R"C(=O)([C@H]([NH3+])c1ccc(cc1)O)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CC1(C=CC(C=C1)O)C(=O)[O-])[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CC1=CC(=O)C(=O)C=C1)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CCCCNC(=O)[C@H]([NH3+])[C@@H](CC[NH3+])C)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CCCCNC(=O)C)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CCCCNC(=O)N)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CCCC[NH2+][C@H](C(=O)[O-])CCC(=O)[O-])[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CCCC[NH2+]C)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CCCCNO)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CCC)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CCSC[C@H]([NH3+])C(=O)[O-])[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CC[S+](C)C)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CCS)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])[C@@H](O)c1ccccc1)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])Cn1nccc1)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CNC(=O)C(=O)[O-])[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])C)[O-]")
+smiles(R"C(=O)([C@H]([NH3+])C)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])COC(=O)C)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])COC(=O)N)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CONC(=O)N)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])COP(=O)(OCCNC(=[NH2+])N)[O-])[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])COP(=O)(OCCNC(=[NH2+])NP(=O)([O-])[O-])[O-])[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])COP(=O)([O-])OCC[NH3+])[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])COS(=O)(=O)[O-])[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CSc1ccc(cc1)Br)[O-]")
+smiles(R"C(=O)([C@@H]([NH3+])CSSC[C@@H](C(=O)[O-])[NH3+])[O-]")
+smiles(R"C(=O)([C@@H](O)c1ccccc1)c1ccccc1")
+smiles(R"C(=O)([C@H](O)c1ccccc1)c1ccccc1")
+smiles(R"C(=O)([C@H](O)c1ccccc1)N")
+smiles(R"C(=O)([C@H](O)C(CO)(C)C)[O-]")
+smiles(R"C(=O)([C@H](O)C(COP(=O)([O-])[O-])(C)C)[O-]")
+smiles(R"C(=O)[C@H](O[C@@H]1[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO)[C@@H](O)[C@H](O)[C@H](O)CO")
+smiles(R"C(=O)[C@H](O)[C@@H]([C@H](O)CSC)O")
+smiles(R"C(O)[C@@H](O)C(=O)[C@H](O)[C@H](O)COP(=O)([O-])[O-]")
+smiles(R"C(=O)[C@H](O)C(O)(CO)CO")
+smiles(R"C(=O)([C@H](OP(=O)([O-])[O-])COP(=O)([O-])[O-])[O-]")
+smiles(R"C(=O)(C)n1cc(c2c1cccc2)O")
+smiles(R"C(=O)(C)Nc1cc2c(c3c(C2)cccc3)cc1")
+smiles(R"C(=O)(CN(CC(=O)[O-])CC(=O)[O-])[O-]")
+smiles(R"C(=O)(CNC(=[NH2+])N)[O-]")
+smiles(R"C(=O)(CNC(=O)Cc1ccccc1)[O-]")
+smiles(R"C(=O)(C([NH3+])CCS)[O-]")
+smiles(R"C(=O)(C[NH3+])COP(=O)([O-])[O-]")
+smiles(R"C(=O)(C([NH3+])CSSCC(C(=O)[O-])[NH3+])[O-]")
+smiles(R"C(=O)(C[NH3+])[O-]")
+smiles(R"C(O)C=O")
+smiles(R"C(O)(CO)C")
+smiles(R"C(=O)(C(=O)c1ccccc1)c1ccccc1")
+smiles(R"C(=O)(C(O)c1ccccc1)c1ccccc1")
+smiles(R"C(=O)(C(=O)C)C")
+smiles(R"C(=O)(C(=O)Cc1cc(c(c(c1)I)Oc1cc(c(cc1)O)I)I)[O-]")
+smiles(R"C(=O)(C(=O)Cc1cc(c(c(c1)I)[O-])I)[O-]")
+smiles(R"C(=O)(C(=O)Cc1c[nH]c2c1cccc2)[O-]")
+smiles(R"C(=O)(C(=O)Cc1[nH]cnc1)[O-]")
+smiles(R"C(=O)(C(=O)C(CCCC(CCCC(CCCC(C)C)C)C)C)[O-]")
+smiles(R"C(=O)(C(=O)CCCCCCCCCCCCCCCC)[O-]")
+smiles(R"C(=O)(C(=O)CCCC)[O-]")
+smiles(R"C(=O)(C(=O)/C=C/CC(=O)c1ccccc1)[O-]")
+smiles(R"C(=O)(C(=O)CCCC(=O)c1ccccc1)[O-]")
+smiles(R"C(=O)(C(=O)CCCC(=O)[O-])[O-]")
+smiles(R"C(=O)(C(=O)CC(C)O)[O-]")
+smiles(R"C(=O)(C(=O)CCC=O)[O-]")
+smiles(R"C(=O)(C(=O)CCC(=O)[O-])[O-]")
+smiles(R"C(=O)(C(=O)C[C@H]([C@H]([C@@H]([C@@H](CO)O)O)O)O)[O-]")
+smiles(R"C(=O)(C(=O)C[C@H]([C@H]([C@@H]([C@@H](COP(=O)([O-])[O-])O)O)O)O)[O-]")
+smiles(R"C(=O)(C(=O)C[C@@H]([C@H](C)O)O)[O-]")
+smiles(R"C(=O)(C(=O)C[C@H]([C@@H](C)O)O)[O-]")
+smiles(R"C(=O)(C(=O)C[C@H]([C@@H](CO)O)O)[O-]")
+smiles(R"C(=O)(C(=O)C[C@@H]([C@@H](C(=O)[O-])O)O)[O-]")
+smiles(R"C(=O)(C(=O)C[C@H]([C@@H](COP(=O)([O-])[O-])O)O)[O-]")
+smiles(R"C(=O)(C(=O)C[C@@H]([C@H](O)C=O)O)[O-]")
+smiles(R"C(OC(=O)C)C[N+](C)(C)C")
+smiles(R"C(=O)(C(=O)C(CO)(C)C)[O-]")
+smiles(R"C(=O)(C(=O)C(C(=O)[O-])O)[O-]")
+smiles(R"C(=O)(C(=O)[C@H](CC)C)[O-]")
+smiles(R"C(=O)(CO)[C@H](CC(=O)C(=O)[O-])O")
+smiles(R"C(O)C(=O)[C@H]([C@@H](O)[C@@H](C(=O)[O-])O)O")
+smiles(R"C(=O)(C(=O)[C@@H](COP(=O)([O-])[O-])O)[O-]")
+smiles(R"C(O)C(=O)[C@H](O)[C@@H](O)[C@H](O)CO")
+smiles(R"C(O)C(=O)[C@H](O)[C@@H](O)CO")
+smiles(R"C(O)C(=O)[C@@H](O)[C@H](O)C(=O)C(=O)[O-]")
+smiles(R"C(O)C(=O)[C@@H](O)[C@@H](O)COP(=O)([O-])[O-]")
+smiles(R"C(O)C(=O)[C@H](O)[C@H](O)COP(=O)([O-])[O-]")
+smiles(R"C(O)C(=O)[C@H](O)CO")
+smiles(R"C(=O)(CO)CO")
+smiles(R"C(O)C(O)C=O")
+smiles(R"C(O)C(=O)C(O)C(O)C(O)C(O)CO")
+smiles(R"C(=O)(C(O)C=O)[O-]")
+smiles(R"C(=O)(CO)COP(=O)([O-])[O-]")
+smiles(R"C(=O)(C(=O)[O-])CC=C")
+smiles(R"C(=O)(C(=O)[O-])/C=C/CCC(=O)[O-]")
+smiles(R"C(=O)(C(=O)[O-])CCC[C@@H](C(=O)[O-])NC(=O)C")
+smiles(R"C(=O)(C(=O)[O-])CCC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"C(=O)(C(=O)[O-])CC(CC)O")
+smiles(R"C(=O)(C(=O)[O-])CCC[NH3+]")
+smiles(R"C(=O)(C(=O)[O-])CCSC")
+smiles(R"C(=O)(C(=O)[O-])C(=O)[O-]")
+smiles(R"C(=O)(C(=O)[O-])[O-]")
+smiles(R"C(=O)(COP(=O)([O-])[O-])[C@H](CO)O")
+smiles(R"C(=O)(COP(=O)([O-])[O-])C=O")
+smiles(R"C(=O)(COP(=O)([O-])[O-])[O-]")
+smiles(R"C(=O)(CS(=O)(=O)[O-])C(=O)[O-]")
+smiles(R"C(=O)(CS(=O)(=O)[O-])[O-]")
+smiles(R"C(=O)=N")
+smiles(R"C(=O)N")
+smiles(R"C(=O)(NC1NC(=O)NC1=O)N")
+smiles(R"CO/N=C/C(C)C")
+smiles(R"C(=O)(N)CCCCCCC/C=C\CCCCCCCC")
+smiles(R"C(=O)(NCCCC[NH2+]CCC[NH3+])C")
+smiles(R"C(=O)(NCCC[NH2+]CCCC[NH2+]CCCNC(=O)C)C")
+smiles(R"C(=O)(NCC(=O)[O-])OCc1ccccc1")
+smiles(R"C(=O)(N[C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)O)O)[C@@H](NC(=O)C)CS")
+smiles(R"C(=O)(N[C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)O)O)[C@@H](NC(=O)C)CS[As](=O)([O-])[O-]")
+smiles(R"C(=O)(N[C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)O)O)[C@@H](NC(=O)C)CSC=O")
+smiles(R"C(=O)(N[C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)O)O)[C@@H](NC(=O)C)CSCO")
+smiles(R"C(=O)(N[C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)O)O)[C@@H](NC(=O)C)CSSC[C@@H](C(=O)N[C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)O)O)NC(=O)C")
+smiles(R"C(=O)(N[C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)O)O)[C@@H]([NH3+])CS")
+smiles(R"C(=O)(N[C@H]1NC(=O)NC1=O)N")
+smiles(R"C(=O)(N[C@H](C(=O)[O-])O)N")
+smiles(R"C(=O)(NCNC(=O)N)N")
+smiles(R"C(=O)(NCO)N")
+smiles(R"C(=O)(NC(=O)N)N")
+smiles(R"C(=O)(N)N")
+smiles(R"C(=O)(N)NO")
+smiles(R"C(=O)(N)[O-]")
+smiles(R"C(=O)=O")
+smiles(R"C(=O)[O-]")
+smiles(R"C(=O)([O-])CC")
+smiles(R"C(=O)([O-])Cc1ccc(cc1)O")
+smiles(R"C(=O)([O-])Cc1ccccc1O")
+smiles(R"C(=O)([O-])CC1=CCC(=O)O1")
+smiles(R"C(=O)([O-])Cc1ncn(c1)C1[C@H](O)[C@H](O)[C@H](O1)COP(=O)([O-])[O-]")
+smiles(R"C(=O)([O-])CC1(OC(=O)C=C1)Cl")
+smiles(R"C(=O)([O-])CC1(OC(=O)C(=C1)Cl)Cl")
+smiles(R"C(=O)([O-])CCCC[NH3+]")
+smiles(R"C(=O)([O-])C/C(=C/C(=O)[O-])/C(=O)[O-]")
+smiles(R"C(=O)([O-])C/C(=C\C(=O)[O-])/C(=O)[O-]")
+smiles(R"C(=O)(OC)C[C@@H]1[C@H](C(=O)CC1)C/C=C\CC")
+smiles(R"C(=O)(OCC[C@@H](C(=O)[O-])[NH3+])CCC(=O)[O-]")
+smiles(R"C(=O)([O-])CC([C@@H](C(=O)[O-])[NH3+])O")
+smiles(R"C(=O)([O-])/C=C/C(=O)CC(=O)C(=O)[O-]")
+smiles(R"C(=O)([O-])CCC(=O)C[NH3+]")
+smiles(R"C(=O)([O-])C(CC(=O)[O-])(CC(=O)N[C@H](C(=O)[O-])CCCCN(O)C(=O)C)O")
+smiles(R"C(=O)([O-])C(CC(=O)[O-])(CC(=O)[O-])O")
+smiles(R"C(=O)([O-])[C@](CC(=O)[O-])(O)[C@@H](C(=O)[O-])C")
+smiles(R"C(=O)([O-])C[C@H]1C(C(=C(C1)O)C)(C)C")
+smiles(R"C(=O)([O-])C[C@H]1C(=O)C=C(C1(C)C)C")
+smiles(R"C(=O)([O-])[C@H]1C(S[C@H]2N1C(=O)[C@H]2[NH3+])(C)C")
+smiles(R"C(=O)([O-])[C@H](C(CCCC(CCCC(CCCC(C)C)C)C)C)O")
+smiles(R"C(=O)([O-])[C@H](C)OP(=O)([O-])[O-]")
+smiles(R"C(=O)([O-])[C@@H](NC(=O)CCC(=O)[O-])CCCNC(=O)N")
+smiles(R"C(=O)([O-])[C@@H]([NH3+])Cn1c2c(nc1)c(ncn2)NC/C=C(\C)/CO")
+smiles(R"C(=O)([O-])[C@H](OC(=O)/C=C/c1cc(c(cc1)O)O)[C@@H](O)[C@H](O)[C@H](O)C(=O)[O-]")
+smiles(R"C(=O)([O-])CNC(=O)C[NH3+]")
+smiles(R"C(=O)([O-])CN(C(=O)N)C")
+smiles(R"C(=O)([O-])C[NH2+]CC")
+smiles(R"C(=O)([O-])C[NH2+]CC(=O)[O-]")
+smiles(R"C(=O)([O-])C([NH3+])(CO)C")
+smiles(R"C(=O)([O-])CO")
+smiles(R"C(=O)([O-])C(=O)C")
+smiles(R"C(=O)([O-])C(=O)c1ccccc1")
+smiles(R"C(=O)([O-])C(=O)NC(=O)N")
+smiles(R"C(=O)([O-])C[S+](C)C")
+smiles(R"C(=O)([O-])NC(=O)N")
+smiles(R"C(OP(=O)(OC(C)C)[O-])(C)C")
+smiles(R"C(OP(=O)([O-])[O-])[C@H]([C@@H](C(=O)C)O)O")
+smiles(R"C(OP(=O)([O-])[O-])[C@H]([C@H](CO)O)O")
+smiles(R"C(OP(=O)([O-])[O-])C(=O)[C@H]([C@@H](CC(=O)[O-])O)O")
+smiles(R"C(=O)(SCCNC(=O)CCNC(=O)[C@@H](C(COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1OP(=O)([O-])[O-])O)n1c2c(nc1)c(ncn2)N)[O-])[O-])(C)C)O)CC(=O)CCCC/C=C\C/C=C\C/C=C\C/C=C\CC")
+smiles(R"CS")
+smiles(R"CSC")
+smiles(R"C[S+](CC[C@H]([NH3+])C(=O)[O-])C[C@H]1O[C@H]([C@H](O)[C@@H]1O)n1cnc2c1ncnc2N")
+smiles(R"CSCCC(=O)/C(=C/OP(=O)([O-])[O-])/O")
+smiles(R"CSCCC(=O)C(=O)COP(=O)([O-])[O-]")
+smiles(R"CSC#N")
+smiles(R"C([SeH])[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"CS(=O)C")
+smiles(R"[Cu+]")
+smiles(R"[Cu+2]")
+smiles(R"[F-]")
+smiles(R"[Fe+2]")
+smiles(R"[Fe+3]")
+smiles(R"[H+]")
+smiles(R"[Hg]")
+smiles(R"[Hg+2]")
+smiles(R"[H][H]")
+smiles(R"[I-]")
+smiles(R"Ic1cc(C[C@@H](C(=O)[O-])[NH3+])ccc1O")
+smiles(R"II")
+smiles(R"[K+]")
+smiles(R"[Li+]")
+smiles(R"[Mg+2]")
+smiles(R"[Mn+2]")
+smiles(R"[Mn+3]")
+smiles(R"N12Cc3c(C[C@H]2c2c(CC1)cc(c(c2)O)OC)ccc1c3OCO1")
+smiles(R"N12CCc3c(cc(c(c3)OC)O)[C@@H]2Cc2c(C1)c(c(cc2)OC)O")
+smiles(R"N12CCc3c(cc(c(c3)OC)O)[C@@H]2Cc2c(C1)c(c(cc2)OC)OC")
+smiles(R"N12[C@@H]([C@@H]3C[NH+]4[C@H]([C@H](C1)C3)CCCC4)CCCC2=O")
+smiles(R"N12[C@@H]([C@@H]3C([NH+]4[C@H]([C@H](C1)C3)CCCC4)O)CCCC2=O")
+smiles(R"N12[C@@H]([C@@H](C2=O)NC(=O)CCC[C@H](C(=O)[O-])[NH3+])SCC(=C1C(=O)[O-])C")
+smiles(R"N12[C@@H]([C@@H](C2=O)NC(=O)CCC[C@H](C(=O)[O-])[NH3+])SCC(=C1C(=O)[O-])CO")
+smiles(R"N12[C@@H]([C@@H](C2=O)NC(=O)CCC[C@H](C(=O)[O-])[NH3+])SCC(=C1C(=O)[O-])COC(=O)C")
+smiles(R"N12[C@@H]([C@@H](C2=O)NC(=O)CCCC(=O)C(=O)[O-])SCC(=C1C(=O)[O-])COC(=O)C")
+smiles(R"N12[C@@H]([C@@H](C2=O)NC(=O)CCCC(=O)[O-])SCC(=C1C(=O)[O-])COC(=O)C")
+smiles(R"N12[C@H](C(=O)N3[C@](C1=O)([C@H](c1c4c(cc(cc4)OC)n4[C@@H](C=C(C)C)OOC(C[C@H]3c14)(C)C)OCC=C(C)C)O)CCC2")
+smiles(R"N12[C@H](C(=O)N3[C@](C1=O)([C@H](c1c4c(cc(cc4)OC)n4[C@@H](C=C(C)C)OOC(C[C@H]3c14)(C)C)O)O)CCC2")
+smiles(R"N12[C@H](C(=O)N3[C@](C1=O)([C@H](c1c4c([nH]c1[C@@H]3C=C(C)C)cc(cc4)OC)O)O)CCC2")
+smiles(R"N12[C@H](C(=O)N3[C@](C1=O)([C@H](c1c(n(c4c1ccc(c4)OC)CC=C(C)C)[C@@H]3C=C(C)C)O)O)CCC2")
+smiles(R"N12[C@H](C(=O)N3[C@H](C1=O)Cc1c4c([nH]c1[C@@H]3C=C(C)C)cc(cc4)OC)CCC2")
+smiles(R"N12[C@H](C(=O)N[C@H](C1=O)Cc1c[nH]c3c1cccc3)CCC2")
+smiles(R"N12[C@H](C(=O)N[C@H](C1=O)Cc1c([nH]c3c1cccc3)C(C=C)(C)C)CCC2")
+smiles(R"N12[C@H](C(=O)N[C@H](C1=O)Cc1c([nH]c3c1cccc3)CC=C(C)C)CCC2")
+smiles(R"N12[C@H](C(=O)N[C@H](C1=O)Cc1c([nH]c3c1ccc(c3)O)CC=C(C)C)CCC2")
+smiles(R"N12[C@H](C(=O)N[C@H](C1=O)Cc1c([nH]c3c1ccc(c3)OC)CC=C(C)C)CCC2")
+smiles(R"N12[C@@H](C(=O)[O-])C(S[C@@H]2[C@H](NC(=O)CCC[C@@H](C(=O)[O-])[NH3+])C1=O)(C)C")
+smiles(R"N12[C@@H](C(=O)[O-])C(S[C@@H]2[C@H](NC(=O)CCC[C@H](C(=O)[O-])[NH3+])C1=O)(C)C")
+smiles(R"N12[C@H](C(S[C@@H]2[C@H](NC(=O)Cc2ccccc2)C1=O)(C)C)C(=O)[O-]")
+smiles(R"N12[C@H](SCC(=C1C(=O)[O-])COC(=O)C)[C@@H](C2=O)[NH3+]")
+smiles(R"N1(c2c(c3c(C1)c1c(cc3OC)OCO1)cc(c1c2cc2c(c1)OCO2)O)C")
+smiles(R"n1(c2c(c(ccc2)O)O)c(=O)c(c(cn1)N)Cl")
+smiles(R"N1C2=C(C=C(C(=O)C2=O)CC([NH3+])C(=O)[O-])C(CC1C(=O)[O-])C(=O)[O-]")
+smiles(R"n1c2c(c(=O)[nH]c1N)N([C@H](CN2)CNc1ccc(cc1)C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-])C=O")
+smiles(R"N1=C2[C@H]3N4[C@H]5C[C@]2(c2ccccc12)[C@@H](C5[C@H](C3)[C@@H](C=O)[C@@H]4C)OC(=O)C")
+smiles(R"N1=C2[C@H]3N4[C@H]5C[C@]2(c2ccccc12)[C@@H](C5[C@H](C3)[C@@H](CO)[C@@H]4C)OC(=O)C")
+smiles(R"n1(c2c(nc1)[C@@H](CNC=[NH+]2)O)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)CO")
+smiles(R"n1(c2c(nc1)c(NC(CC(=O)[O-])C(=O)[O-])ncn2)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N(C)C)[C@H]1[C@@H]([C@@H]([C@H](O1)CO)NC(=O)[C@H](Cc1ccc(cc1)OC)[NH3+])O")
+smiles(R"n1(c2c(nc1)c(ncn2)N(C)C)[C@H]1[C@@H]([C@@H]([C@H](O1)CO)NC(=O)[C@H](Cc1ccc(cc1)O)[NH3+])O")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@H]1[C@@H]([C@@H]([C@H](O1)C)O)O")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(N)[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OC(=O)c1c(c(ccc1)O)O)[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OC(=O)[C@H]([C@H](O)C)N")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OC(=O)[C@H](CO)N")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])OC(=O)CN")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)[n+]1cc(ccc1)C(=O)N)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)N1C=C(CC=C1)C(=O)N)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)[n+]1cc(ccc1)C(=O)[O-])[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)N1C=C(CC[C@@H]1O)C(=O)N)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)N1C=C(CC[C@H]1O)C(=O)N)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OCC(OP(=O)([O-])[O-])C(=O)[O-])[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])O[C@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO)[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c2c(nc1)c(ncn2)N)[O-])[O-])[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-])[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OS(=O)(=O)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)C[Se+](CC[C@@H](C(=O)[O-])[NH3+])C")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1OP(=O)([O-])[O-])O)COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)[n+]1cc(ccc1)C(=O)N)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1OP(=O)([O-])[O-])O)COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)N1C=C(CC=C1)C(=O)N)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1OP(=O)([O-])[O-])O)COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)N1C=C(CC[C@@H]1O)C(=O)N)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(ncn2)N)[C@@H]1O[C@@H]([C@H]([C@H]1OP(=O)([O-])[O-])O)COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)N1C=C(CC[C@H]1O)C(=O)N)[O-])[O-]")
+smiles(R"n1(c2c(nc1)C(=O)CNC=N2)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)CO")
+smiles(R"n1(c2c(nc1)c(=O)[nH]cn2)[C@@H]1O[C@@H]([C@H](C1)O)COP(=O)([O-])[O-]")
+smiles(R"n1(c2c(nc1)c(=O)[nH]cn2)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)([O-])[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(=O)[nH]cn2)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(=O)[nH]c(n2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)[C@@H](CO)O)O)O)O)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(=O)[nH]c(n2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)C)O)O)O)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(=O)[nH]c(n2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@@H]1[C@H]([C@H]([C@H]([C@H](O1)C)O)O)O)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(=O)[nH]c(n2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@@H]1[C@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(=O)[nH]c(n2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(O[C@@H]1[C@H]([C@H](C(=O)[C@H](O1)C)O)O)[O-])[O-]")
+smiles(R"n1(c2c(nc1)c(=O)[nH]c(n2)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)(OP(=O)(OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c2c(nc1)c(=O)[nH]c(n2)N)[O-])[O-])[O-])[O-]")
+smiles(R"n1c2c(N=C(CN2)CN(c2ccc(cc2)C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-])C=O)c(=O)[nH]c1N")
+smiles(R"n1c2c(N=C(CN2)CNc2ccc(cc2)C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-])c(=O)[nH]c1N")
+smiles(R"n1c2c(N([C@H](CN2)CNc2ccc(cc2)C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-])C=N)c(=O)[nH]c1N")
+smiles(R"n1c2c(N[C@H](CN2)CN(c2ccc(cc2)C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-])C=O)c(=O)[nH]c1N")
+smiles(R"n1c2c(N[C@H](CN2)CNc2ccc(cc2)C(=O)N[C@H](C(=O)[O-])CCC(=O)[O-])c(=O)[nH]c1N")
+smiles(R"N1c2c(Oc3c1c1c(c(c3)O)nc(cc1O)C(=O)[O-])cccc2C(=O)CC(C(=O)[O-])[NH3+]")
+smiles(R"n1c2nccnc2c(nc1N)O")
+smiles(R"[N+]1(=C(c2c(CC1)cc(c(c2)O)OC)Cc1cc(c(cc1)OC)O)C")
+smiles(R"N1(C(c2ccc(cc2)O)C(=O)[O-])C(=O)[C@H](C1)NC(=O)/C(=N\O)/c1ccc(cc1)OCC[C@H](C(=O)[O-])[NH3+]")
+smiles(R"N1/C(=C/c2[nH]c(c(c2C)CCC(=O)[O-])Cc2[nH]c(c(c2CCC(=O)O[C@H]2[C@@H]([C@H]([C@@H]([C@H](O2)C(=O)[O-])O)O)O)C)/C=C\2/NC(=O)C(=C2C=C)C)/C(=C(C1=O)C=C)C")
+smiles(R"N1/C(=C/c2[nH]c(c(c2C)CCC(=O)O[C@H]2[C@@H]([C@H]([C@@H]([C@H](O2)C(=O)[O-])O)O)O)Cc2[nH]c(c(c2CCC(=O)O[C@H]2[C@@H]([C@H]([C@@H]([C@H](O2)C(=O)[O-])O)O)O)C)/C=C\2/NC(=O)C(=C2C=C)C)/C(=C(C1=O)C=C)C")
+smiles(R"N1=CCCC1C(=O)[O-]")
+smiles(R"N1=C(CC(C1)O)C(=O)[O-]")
+smiles(R"[n+]1(ccc(c2ccccc12)NO)[O-]")
+smiles(R"n1c(ccc2C(C(C=Cc12)O)O)O")
+smiles(R"[n+]1(ccccc1)C")
+smiles(R"[n+]1(ccccc1)Cc1cnc(nc1N)C")
+smiles(R"[n+]1(cccc(c1C)CCO)Cc1cnc(nc1O)C")
+smiles(R"[n+]1(cccc(c1)C(=O)N)C")
+smiles(R"n1cccc(c1)C(=O)[O-]")
+smiles(R"n1c(c(ccc1)C(=O)[O-])C(=O)[O-]")
+smiles(R"n1c(cccc1C(=O)[O-])C(=O)[O-]")
+smiles(R"n1c(cccc1)O")
+smiles(R"N1C=C(CCC1=O)C(=O)[O-]")
+smiles(R"n1(ccc(c(c1=O)C(=O)[O-])OC)C")
+smiles(R"n1c(ccc(c1)O)O")
+smiles(R"n1c(cccc1O)O")
+smiles(R"n1cc(c(cc1)O)O")
+smiles(R"n1c(c(ccc1O)O)O")
+smiles(R"N1=CCCC[C@H]1C(=O)[O-]")
+smiles(R"N1=C(C=CC[C@H]1C(=O)[O-])C(=O)[O-]")
+smiles(R"n1c(ccc(C(=O)CCC[NH2+]C)c1O)O")
+smiles(R"N1=CCC[C@@H]1C(=O)[O-]")
+smiles(R"N1=CCC[C@H]1C(=O)[O-]")
+smiles(R"n1cc(c(nc1C)N)C[NH3+]")
+smiles(R"N1C[C@@H]([NH2+]CC1)C(=O)[O-]")
+smiles(R"N1C[C@H]([NH2+]CC1)C(=O)[O-]")
+smiles(R"n1c(C(=O)[O-])ccc2c1cccc2")
+smiles(R"N1[C@H]2[C@H]3N4[C@H]5C[C@]2(c2ccccc12)[C@@H](C5[C@H](C3)[C@H](CC)[C@H]4O)OC(=O)C")
+smiles(R"N1[C@H]2[C@H]3N4[C@H]5C[C@]2(c2ccccc12)[C@@H]([C@H]5[C@H](C3)[C@H](CC)[C@H]4O)O")
+smiles(R"N1([C@H]2[C@H]3[NH+]4[C@H]5C[C@]2(c2ccccc12)[C@@H](C5[C@H](C3)[C@H](CC)[C@H]4O)O)C")
+smiles(R"N1([C@H]2[C@H]3[NH+]4[C@H]5C[C@]2(c2ccccc12)[C@@H](C5[C@H](C3)[C@H](CC)[C@H]4O)OC(=O)C)C")
+smiles(R"n1([C@H]2[C@@H]([C@@H]([C@H](O2)COP(=O)([O-])[O-])OP(=O)([O-])[O-])O)c2c(nc1)c(ncn2)N")
+smiles(R"n1([C@H]2[C@@H]([C@@H]([C@H](O2)COP(=O)(OS(=O)(=O)[O-])[O-])OP(=O)([O-])[O-])O)c2c(nc1)c(ncn2)N")
+smiles(R"n1([C@@H]2O[C@@H]([C@H](C2)O)COP(=O)([O-])[O-])c(=O)[nH]c(=O)cc1")
+smiles(R"n1([C@@H]2O[C@@H]([C@H](C2)O)COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-])c(=O)nc(cc1)N")
+smiles(R"n1([C@@H]2O[C@@H]([C@H](C2)O)COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-])c(=O)[nH]c(=O)cc1")
+smiles(R"n1([C@@H]2O[C@@H]([C@H]([C@H]2O)O)COP(=O)([O-])[O-])c(c(nc1)C(=O)N)N")
+smiles(R"n1([C@@H]2O[C@@H]([C@H]([C@H]2O)O)COP(=O)([O-])[O-])c(c(nc1)C(=O)N)NC=NCC(=O)[C@@H]([C@@H](COP(=O)([O-])[O-])O)O")
+smiles(R"n1([C@@H]2O[C@@H]([C@H]([C@H]2O)O)COP(=O)([O-])[O-])c(c(nc1)C(=O)N)/N=C/N[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"N1([C@@H](c2c(CC1)cc(c(c2)O)OC)Cc1ccc(cc1)O)C")
+smiles(R"N1[C@H](C(=O)NC1=O)CC(=O)[O-]")
+smiles(R"n1(cnc2c(c1=N)ncn2[C@H]1[C@@H]([C@@H]([C@H](O1)CO)O)O)C")
+smiles(R"n1cnc2c(c1N)ncn2[C@@H]1O[C@H]2[C@H]([C@H]1O)OP(=O)(OC2)[O-]")
+smiles(R"n1(cncc1)C(=O)C")
+smiles(R"n1cncc2NCCNc12")
+smiles(R"n1c(nc(c2nccnc12)O)O")
+smiles(R"n1c(nc(nc1NC(C)C)O)O")
+smiles(R"n1c(nc(nc1N)N)N")
+smiles(R"n1c(nc(nc1N)N)O")
+smiles(R"n1c(nc(nc1O)O)N")
+smiles(R"n1c(nc(nc1O)O)O")
+smiles(R"n1c[nH]cc1CCC(=O)[O-]")
+smiles(R"n1c([nH]cc1C[C@@H](C(=O)[O-])[NH3+])CC[C@H](C(=O)[O-])[N+](C)(C)C")
+smiles(R"n1c([nH]cc1C[C@H]([NH3+])C(=O)[O-])CC[C@H](C(=O)N)[N+](C)(C)C")
+smiles(R"n1c([nH]c(=O)c2c(c[nH]c12)C[NH3+])N")
+smiles(R"n1c([nH]c(=O)c2c(c[nH]c12)C#N)N")
+smiles(R"N1C(=O)C=CC1=O")
+smiles(R"N1(C(=O)C=CC1=O)CC")
+smiles(R"n1(c(=O)c(c(cn1)N)Cl)C(=O)/C(=C/C=C/C(=O)[O-])/[O-]")
+smiles(R"N1(C(=O)[C@H](C1)NC(=O)/C(=N\O)/c1ccc(cc1)O)[C@@H](C(=O)[O-])c1ccc(cc1)O")
+smiles(R"n1(c(=O)nc(cc1)N)[C@H]1[C@@H]([C@@H]([C@H](O1)COP(=O)(OP(=O)(OC[C@H]([C@@](CO)(C)O)O)[O-])[O-])O)O")
+smiles(R"n1(c(=O)nc(cc1)N)[C@@H]1O[C@@H]([C@H]([C@H]1O)O)CO")
+smiles(R"n1(c(=O)nc(N)cc1)[C@@H]1O[C@@H]([C@H](C1)O)CO")
+smiles(R"N1(C(=O)NC(=O)C1)C")
+smiles(R"n1(c(=O)n(c(=O)c2c1[nH]c(=O)n2C)C)C")
+smiles(R"n1(c(=O)[nH]c(=O)cc1)[C@@H]1O[C@@H]([C@H](C1)O)CO")
+smiles(R"[n+]1(c(sc(c1C)CCOP(=O)(OP(=O)([O-])[O-])[O-])C(C)O)Cc1c(nc(nc1)C)N")
+smiles(R"[n+]1([O-])ccccc1")
+smiles(R"[Na+]")
+smiles(R"N#C")
+smiles(R"N=c1c2c(ncn1[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-])n(cn2)[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"Nc1nc2NCC(=Nc2c(=O)[nH]1)[C@H](O)[C@@H](O)CO")
+smiles(R"Nc1nc2NCC(Nc2c(=O)[nH]1)[C@H](O)[C@@H](O)CO")
+smiles(R"Nc1nc2NCC(=Nc2c(=O)[nH]1)[C@H](O)[C@@H](O)COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-]")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@H](CCl)[C@@H](O)[C@H]1O")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@H](CF)[C@@H](O)[C@H]1O")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])[O-]")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])OP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])[O-]")
+smiles(R"N(c1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])[O-])CC=C(C)C")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OC(=O)CCCCC1CCSS1")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OC(=O)N")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"N(c1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])[O-])CC=C(C)C")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])OP(=O)(OCCc1sc[n+](Cc2cnc(nc2N)C)c1C)[O-]")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"N(c1ncnc2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])OP(=O)([O-])[O-])CC=C(C)C")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@H](CO)[C@@H](O)C1")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@H](C=O)[C@@H](O)[C@H]1O")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@H](CO)[C@@H](O)[C@H]1O")
+smiles(R"Nc1ncnc2c1ncn2[C@@H]1O[C@H](C(=O)[O-])[C@@H](O)[C@H]1O")
+smiles(R"Nc1ncnc2c1[nH]c(=O)n2[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])[O-]")
+smiles(R"Nc1ncnc2c1[nH]c(=O)n2[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"Nc1nc(=O)n(cc1)[C@@H]1O[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])CO")
+smiles(R"Nc1nc(=O)[nH]c2c1ncn2[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])[O-]")
+smiles(R"Nc1nc(=O)[nH]c2c1ncn2[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"Nc1nc(=O)[nH]c2c1ncn2[C@@H]1O[C@@H]([C@@H](O)C1)COP(=O)([O-])OP(=O)([O-])OP(=O)(O)[O-]")
+smiles(R"[N+](#C)C1CCCCC1")
+smiles(R"N#CCc1ccccc1")
+smiles(R"N/C(=C(/C=C\C=O)\C(=O)[O-])/C(=O)[O-]")
+smiles(R"N(CCCC[NH3+])C(=O)CC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"[N+](C)(C)(C)[O-]")
+smiles(R"N(C)(C)C=O")
+smiles(R"N/C=C(\C(=O)OO)/C")
+smiles(R"[N+](CCO)(C)(C)C")
+smiles(R"[N+](CC(=O)CC(=O)[O-])(C)(C)C")
+smiles(R"[N+](=CC)([O-])[O-]")
+smiles(R"N=CC(=O)[O-]")
+smiles(R"[N+](CC(=O)[O-])(C)(C)C")
+smiles(R"N(CC(=O)[O-])C(=O)c1ccccc1")
+smiles(R"N([C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)O)O)C(=O)C")
+smiles(R"N([C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)OP(=O)([O-])[O-])O)C(=O)C")
+smiles(R"N([C@H](C(=O)[O-])CC(C)C)C(=O)OCc1ccccc1")
+smiles(R"N(C(=[NH2+])N)CCCC=O")
+smiles(R"NC(=[NH2+])NCCC(C(=O)C(=O)[O-])C")
+smiles(R"NC(=[NH2+])NCCOP(=O)([O-])OC")
+smiles(R"N(C(=[NH2+])NCCS(=O)(=O)[O-])P(=O)([O-])[O-]")
+smiles(R"N(C(=[NH2+])N)[C@H]1[C@@H]([C@H]([C@@H]([C@H]([C@@H]1O)[NH3+])O)O)O")
+smiles(R"N(C(=O)c1c(c(ccc1)O)O)CC(=O)N[C@@H]1C(=O)O[C@@H]([C@@H](C(=O)O[C@@H]([C@@H](C(=O)O[C@@H]1C)NC(=O)CNC(=O)c1c(c(ccc1)O)O)C)NC(=O)CNC(=O)c1c(c(ccc1)O)O)C")
+smiles(R"NC(=O)CCCC[C@H](CCS)S")
+smiles(R"NC(=O)CC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"N(C(=O)CC[C@H](C(=O)[O-])[NH3+])[C@@H](C(=O)[O-])CCC(=O)[O-]")
+smiles(R"N(C(=O)C)[C@@H](CC(=O)[O-])C(=O)[O-]")
+smiles(R"N(C(=O)[C@@H](C(CO)(C)C)O)CCC(=O)[O-]")
+smiles(R"N(C(=O)[C@@H](C(COP(=O)([O-])[O-])(C)C)O)CCC(=O)[O-]")
+smiles(R"NC(=O)C(=O)[O-]")
+smiles(R"NC(=O)NCCCC[NH3+]")
+smiles(R"N(C(=O)N)/C=C(\C(=O)OO)/C")
+smiles(R"NC(=O)NC[NH3+]")
+smiles(R"[N@H+]12[C@H]([C@@H](c3c4c(ncc3)ccc(c4)OC)O)C[C@H]([C@H](C1)C=C)CC2")
+smiles(R"[nH]1c2c(c3c1cccc3)cccc2")
+smiles(R"[nH]1c2[C@H]3N4[C@@H](Cc2c2ccccc12)C([C@H](C3)/C(=C\C)/C4)C=O")
+smiles(R"[nH]1cc(c2c1cccc2)[C@H](O)[C@H](O)COP(=O)([O-])[O-]")
+smiles(R"[nH]1cc(c2c1ccc(c2)O)CC[NH3+]")
+smiles(R"[nH]1c(c(c2ccccc12)O)O")
+smiles(R"[NH+]1=CCCC1")
+smiles(R"[nH]1c(c(c(c1)CCC(=O)[O-])CC(=O)[O-])C[NH3+]")
+smiles(R"[nH]1c(c(c(c1C(=O)[O-])c1c2c([nH]c1)c(ccc2)Cl)c1c2c([nH]c1)c(ccc2)Cl)C(=O)[O-]")
+smiles(R"[nH]1c(C[C@@H](C(=O)[O-])[NH3+])cnc1CCC([NH3+])C(=O)[O-]")
+smiles(R"[nH]1cc(nc1)CC=O")
+smiles(R"[NH+]1([C@H](c2c(CC1)cc(c(c2)O)OC)Cc1ccc(cc1)O)C")
+smiles(R"[NH+]1([C@H](c2c(CC1)cc(c(c2)O)OC)Cc1ccc(c(c1)O)OC)C")
+smiles(R"[NH+]1([C@@H](c2c(CC1)cc(c(c2)O)OC)Cc1ccc(OC)c(c1)O)C")
+smiles(R"[nH]1c(nc2c(c1=O)N[C@H](CN2)[C@H]([C@@H](O)C)O)N")
+smiles(R"[nH]1c(nc2c(c1=O)N([C@H](CN2)CNc1ccc(cc1)C(=O)N[C@@H](CCC(=O)N[C@@H](CCC(=O)N[C@@H](CCC(=O)[O-])C(=O)[O-])C(=O)[O-])C(=O)[O-])C)N")
+smiles(R"[nH]1c(nc2c(c1=O)N[C@H](CN2)CNc1ccc(cc1)C(=O)N[C@@H](CCC(=O)N[C@@H](CCC(=O)N[C@@H](CCC(=O)[O-])C(=O)[O-])C(=O)[O-])C(=O)[O-])N")
+smiles(R"[nH]1cnc2c(c1=O)ncn2[C@H]1C[C@@H]([C@H](O1)CO)O")
+smiles(R"[nH]1c(nc2c(c1=O)ncn2[C@H]1C[C@@H]([C@H](O1)CO)O)N")
+smiles(R"[nH]1cnc2c(c1=O)ncn2[C@H]1C[C@@H]([C@H](O1)COP(=O)(OP(=O)([O-])[O-])[O-])O")
+smiles(R"[nH]1cnc2c(c1=O)ncn2[C@H]1C[C@@H]([C@H](O1)COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-])O")
+smiles(R"[nH]1c(nc2c(c1=O)[nH]c(=O)[nH]2)N")
+smiles(R"[nH]1cncc1")
+smiles(R"[nH]1cnc(c1)N")
+smiles(R"[NH+]1=C(NCC[C@H]1C(=O)[O-])C")
+smiles(R"[nH]1c(=O)c2c(nc1N)NCC(=N2)[C@H](O)[C@@H](COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-])O")
+smiles(R"[nH]1c(=O)c2c(nc1N)n([C@@H]1O[C@H]3[C@H]([C@H]1O)OP(=O)(OC3)[O-])cn2")
+smiles(R"[nH]1c(=O)[nH]c2c(c1=O)ncn2[C@@H]1O[C@H](CO)[C@H]([C@H]1O)O")
+smiles(R"[nH]1c(=O)[nH]c2c(c1=O)[n+](cn2[C@@H]1O[C@H](CO)[C@H]([C@H]1O)O)C")
+smiles(R"[nH]1c(=O)[nH]c(=O)cc1")
+smiles(R"[nH]1c(=O)[nH]c(=O)c(c1)C(=O)[O-]")
+smiles(R"[nH]1nccc1")
+smiles(R"[NH2+]1C(c2c(CC1)cc(c(c2)O)O)Cc1ccc(cc1)O")
+smiles(R"[NH2+]1C(c2c(CC1)cc(c(c2)O)OC)Cc1ccc(cc1)O")
+smiles(R"[NH2+]1CCCCNC(=O)CNC(=O)[C@@H](NC(=O)CC[C@H]([NH3+])C(=O)[O-])CSSC[C@@H](C(=O)NCC(=O)NCCC1)NC(=O)CC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"[NH2+]1C[C@@H](NCC1)C(=O)N")
+smiles(R"[NH2+]1C[C@H](NCC1)C(=O)N")
+smiles(R"[NH2+]1C[C@@H](NCC1)C(=O)NC(C)(C)C")
+smiles(R"[NH2+]1[C@H](c2c(CC1)cc(c(c2)O)O)Cc1ccc(cc1)O")
+smiles(R"[NH2+](CCCCNC(=O)CNC(=O)[C@@H](NC(=O)CC[C@H]([NH3+])C(=O)[O-])CS)CCCNC(=O)CNC(=O)[C@@H](NC(=O)CC[C@@H](C(=O)[O-])[NH3+])CS")
+smiles(R"[NH2+](CCC[NH3+])CCCCNC(=[NH2+])N")
+smiles(R"[NH2+](CCC[NH3+])CCC[NH3+]")
+smiles(R"[NH2+]=CNCC(=O)[O-]")
+smiles(R"[NH2+]=C(N)N")
+smiles(R"[NH3+]C")
+smiles(R"[NH3+]CCc1ccc(cc1)O")
+smiles(R"[NH3+]CCCCCC(=O)NCCCCCC(=O)[O-]")
+smiles(R"[NH3+]CCCC[C@@H](C(=O)OC)NC(=O)C")
+smiles(R"[NH3+]CCCCC[NH2+]CCC[NH3+]")
+smiles(R"[NH3+]CCC[C@@H](CC(=O)N[C@@H]1C(=O)N[C@H](C(=O)N[C@H](C(=O)N/C(=C\NC(=O)N)/C(=O)N[C@H](C(=O)NC1)[C@@H]1NC(=[NH2+])N[C@H](C1)O)CO)CO)[NH3+]")
+smiles(R"[NH3+]CCC[C@@H](CC(=O)N[C@@H]1C(=O)N[C@H](C(=O)N[C@H](C(=O)N/C(=C\NC(=O)N)/C(=O)N[C@H](C(=O)NC1)[C@@H]1NC(=[NH2+])N[C@H](C1)O)CO)COP(=O)([O-])[O-])[NH3+]")
+smiles(R"[NH3+]CCCC[NH2+]CCCC[NH3+]")
+smiles(R"[NH3+]CCCC[NH3+]")
+smiles(R"[NH3+]C(CCC[NH3+])C(=O)[O-]")
+smiles(R"[NH3+]CC(CC(=O)[O-])O")
+smiles(R"[NH3+]CC[C@H]([C@H](N1CCC1=O)C(=O)[O-])O")
+smiles(R"[NH3+]CCC[NH2+]CCCC[NH2+]CCC[NH3+]")
+smiles(R"[NH3+]CCC[NH2+]CCCC[NH3+]")
+smiles(R"[NH3+]CCC[NH2+]CCCC=O")
+smiles(R"[NH3+]CCC[NH2+]CC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"[NH3+]CCC(=O)N")
+smiles(R"[NH3+]CCC(=O)[O-]")
+smiles(R"[NH3+]C(C(=O)CCCCCC(=O)[O-])C")
+smiles(R"[NH3+]CCS(=O)(=O)[O-]")
+smiles(R"[NH3+][C@H]1[C@H](O[C@@H]([C@H]([C@@H]1O)O)CO)O[C@H]1[C@H](O)[C@@H](O)[C@@H]([C@H]([C@H]1O)O)O")
+smiles(R"[NH3+][C@@H](Cc1c[nH]c2c1cc(cc2)O)C(=O)[O-]")
+smiles(R"[NH3+][C@@H](CC(=C)C(=O)[O-])C(=O)[O-]")
+smiles(R"[NH3+][C@@H](CCC[NH3+])C(=O)[O-]")
+smiles(R"[NH3+][C@@H](CCC(=O)N[C@@H](CSC(=O)CCC(=O)[O-])C(=O)NCC(=O)[O-])C(=O)[O-]")
+smiles(R"[NH3+][C@@H](CCC(=O)N[C@@H](CS)C(=O)NCC(=O)[O-])C(=O)[O-]")
+smiles(R"[NH3+][C@@H](CCC(=O)N[C@@H](CSSC[C@H](NC(=O)CC[C@H]([NH3+])C(=O)[O-])C(=O)NCC(=O)[O-])C(=O)NCC(=O)[O-])C(=O)[O-]")
+smiles(R"[NH3+][C@@H](CCC(=O)N[C@@H](CS[Se]SC[C@H](NC(=O)CC[C@H]([NH3+])C(=O)[O-])C(=O)NCC(=O)[O-])C(=O)NCC(=O)[O-])C(=O)[O-]")
+smiles(R"[NH3+][C@@H](CCOP(=O)([O-])[O-])C(=O)[O-]")
+smiles(R"[NH3+][C@H](COP(=O)([O-])[O-])Cc1c[nH]cn1")
+smiles(R"[NH4+]")
+smiles(R"[NH+]([C@@H](Cc1c[nH]cn1)C(=O)[O-])(C)C")
+smiles(R"[Ni+2]")
+smiles(R"N#N")
+smiles(R"NN")
+smiles(R"N#N=O")
+smiles(R"N(=N\O)/O")
+smiles(R"[N]=O")
+smiles(R"NO")
+smiles(R"[N+](=O)([O-])[O-]")
+smiles(R"O")
+smiles(R"O1C2(C1(C(=O)c1c(cccc1)C2=O)C/C=C(/CCC[C@@H](CCC[C@@H](CCCC(C)C)C)C)\C)C")
+smiles(R"O1CC1C")
+smiles(R"o1ccc2cc3ccc(=O)oc3c(c12)O")
+smiles(R"o1c(ccc1)C(=O)[O-]")
+smiles(R"O1C(C(C(C(C1O)O)O)O)CO")
+smiles(R"O1/C(=C\CCCC(=O)[O-])/C[C@H]2[C@@H]1C[C@H]([C@@H]2/C=C/[C@H](CCCCC)O)O")
+smiles(R"O1/C(=C\CCCC(=O)[O-])/C[C@H]2[C@@H]1C[C@H]([C@@H]2/C=C/C(=O)CCCCC)O")
+smiles(R"O1C(C(C(C([C@H]1OP(=O)([O-])[O-])O)O)O)CO")
+smiles(R"O1CC([C@H](C1=O)O)(C)C")
+smiles(R"O1CC(C(=O)C1=O)(C)C")
+smiles(R"O1/C(=C\C(=O)C(=O)[O-])/C=CC1=O")
+smiles(R"O1C(CC(=O)[O-])C=CC1=O")
+smiles(R"O1/C(=C\C(=O)[O-])/C=C(C1=O)Cl")
+smiles(R"O1C=C(C(=O)OC)[C@H]2CC[C@H](C)[C@H]2[C@@H]1O[C@H]1[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO")
+smiles(R"O1C=C(C(=O)OC)[C@H]2C[C@@H]([C@H](C)[C@H]2[C@@H]1O[C@H]1[C@H](O)[C@@H](O)[C@H](O)[C@H](O1)CO)O")
+smiles(R"O1C[C@@H]1C")
+smiles(R"O1C[C@H]1C")
+smiles(R"O1C([C@@H]1CC/C(=C/CC/C(=C/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)(C)C")
+smiles(R"O1C([C@@H]([C@@H]([C@H]1CO)O)O)O")
+smiles(R"O1C([C@@H]([C@@H]([C@H]1COP(=O)(OP(=O)(OC[C@@H]1[C@H]([C@H]([C@H](n2c3ncnc(c3nc2)N)O1)O)O)[O-])[O-])O)O)O")
+smiles(R"O1C[C@@H]([C@@H]([C@H](C1O)O)O)O")
+smiles(R"O1C([C@@H]([C@H]([C@@H]([C@@H]1C(=O)[O-])O)O)O)OP(=O)(OP(=O)(OC[C@H]1O[C@@H](n2ccc(=O)[nH]c2=O)[C@@H]([C@@H]1O)O)[O-])[O-]")
+smiles(R"O1C([C@H]([C@@H]([C@@H]([C@@H]1C)O)O)O)OP(=O)(OP(=O)(OC[C@@H]1[C@H]([C@H]([C@H](n2c3nc([nH]c(=O)c3nc2)N)O1)O)O)[O-])[O-]")
+smiles(R"O1C[C@@H]([C@@H]([C@H]([C@@H]1OP(=O)(OC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)[O-])O)O)NC=O")
+smiles(R"O1C[C@@H]([C@@H]([C@H]([C@@H]1OP(=O)([O-])OC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)\C)\C)\C)O)O)[NH3+]")
+smiles(R"O1C[C@@H]([C@@H]([C@H]([C@@H]1OP(=O)([O-])OC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)O)O)[NH3+]")
+smiles(R"O1C([C@H](O)[C@H]([C@H](O)[C@H]1CO)O)OC(=O)/C=C/c1cc(c(O)c(c1)OC)OC")
+smiles(R"O1C(C(=O)C=CC1)(CO)O")
+smiles(R"O1C(C(=O)N(c2c1cc(cc2)OC)O)O")
+smiles(R"O1[C@@H]2[C@]([C@@H]3C(=C4CC(=O)O[C@H]([C@@]4(CC3)C)c3ccoc3)C)([C@H](C1(C)C)CC(=O)[O-])COC(=O)C2")
+smiles(R"O1[C@@H](C(C(C(C1O)O)O)O)COP(=O)([O-])[O-]")
+smiles(R"O1[C@@H](CC(=O)[O-])C=CC1=O")
+smiles(R"O1[C@@H]([C@H](CC1OP(=O)([O-])[O-])O)CO")
+smiles(R"O1[C@@H]([C@H](/C=C/C=C/C(=O)[C@@H](C[C@@H]([C@@H]([C@H](/C=C/C1=O)C)O[C@@H]1O[C@@H](C[C@@H]([C@H]1O)[NH+](C)C)C)C)C)CO[C@H]1[C@@H]([C@@H]([C@@H]([C@H](O1)C)O)OC)OC)CC")
+smiles(R"O1[C@@H]([C@H](/C=C/C=C/C(=O)[C@@H](C[C@@H]([C@@H]([C@H](/C=C/C1=O)C)O[C@@H]1O[C@@H](C[C@@H]([C@H]1O)[NH+](C)C)C)C)C)CO[C@H]1[C@@H]([C@@H]([C@@H]([C@H](O1)C)O)O)O)CC")
+smiles(R"O1[C@@H]([C@H](/C=C/C=C/C(=O)[C@@H](C[C@@H]([C@@H]([C@H](/C=C/C1=O)C)O[C@@H]1O[C@@H](C[C@@H]([C@H]1O)[NH+](C)C)C)C)C)CO[C@H]1[C@@H]([C@@H]([C@@H]([C@H](O1)C)O)O)OC)CC")
+smiles(R"O1[C@@H]([C@H](C[C@H]1OP(=O)([O-])[O-])O)CO")
+smiles(R"O1[C@@H]([C@H]([C@H](C1O)O)O)CCC(=O)c1cc(ccc1)C(=O)[O-]")
+smiles(R"O1[C@H]([C@H]([C@H](C[C@]1(C(=O)[O-])O)O)NC(=O)C)[C@H]([C@H](C)O)NC(=O)C")
+smiles(R"O1[C@H]([C@@H]([C@H](C[C@]1(C(=O)[O-])O)O)NC(=O)C)[C@@H]([C@@H](CO)O)O")
+smiles(R"O1[C@H]([C@@H]([C@H](C[C@@]1(C(=O)[O-])O)O)NC(=O)C)[C@@H]([C@@H](CO)O)O")
+smiles(R"O1[C@H]([C@H]([C@H](C[C@]1(C(=O)[O-])OP(=O)([O-])OC[C@H]1O[C@@H](n2ccc(nc2=O)N)[C@@H]([C@@H]1O)O)O)NC(=O)C)[C@H]([C@H](C)O)NC(=O)C")
+smiles(R"O1[C@H]([C@@H]([C@H](C[C@@]1(O)C(=O)[O-])O)NC(=O)C)[C@@H]([C@@H](C)O)NC(=O)C")
+smiles(R"O1[C@H]([C@@H]([C@@H]([C@H]1[C@H](O)CO)O)O)O")
+smiles(R"O1[C@H]([C@@H]([C@@H]([C@H]1CO)O)O)O")
+smiles(R"O1[C@@H]([C@@H]([C@@H]([C@H]1C)O)O)OP(=O)([O-])[O-]")
+smiles(R"O1[C@H]([C@@H]([C@@H]([C@H]1COP(=O)([O-])[O-])O)O)c1ccc(cc1)N")
+smiles(R"O1[C@@H]([C@@H]([C@@H]([C@H]1COP(=O)([O-])[O-])O)O)OP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"O1[C@@H]([C@@H]([C@@H]([C@H]1COP(=O)(OP(=O)(OP(=O)([O-])[O-])[O-])[O-])O)O)O[C@H]1[C@@H](O[C@@H]([C@H]1O)COP(=O)(OP(=O)(OCC(C)(C)[C@H](C(=O)NCCC(=O)NCCS)O)[O-])[O-])n1c2c(nc1)c(ncn2)N")
+smiles(R"O1[C@@H]([C@@H]([C@@H]([C@H]1CSC)O)O)OP(=O)([O-])[O-]")
+smiles(R"O1[C@@H]([C@H]([C@H]([C@H]1n1c2c(cc(c(c2)C)C)nc1)O)O)CO")
+smiles(R"O1[C@@H]([C@H]([C@H]([C@H]1n1c2c(cc(c(c2)C)C)nc1)O)O)COP(=O)([O-])[O-]")
+smiles(R"O1[C@@H]([C@H]([C@H]([C@@H]1n1c2c(nc1)c(ncn2)N)O)O)CCC(=O)c1cc(ccc1)C(=O)[O-]")
+smiles(R"O1[C@@H]([C@H]([C@H]([C@@H]1n1c2c(nc1)c(=O)[nH]cn2)O)O)CCC(=O)c1cc(ccc1)C(=O)[O-]")
+smiles(R"O1[C@@H]([C@H]([C@H]([C@@H]1[n+]1cccc(c1)C(=O)[O-])O)O)CO")
+smiles(R"O1[C@H]([C@@H]([C@H]([C@H]1O)O[C@H]1O[C@H]([C@@H]([C@H]1O)O)CO)O)CO")
+smiles(R"O1[C@H]([C@@H]([C@H]([C@H]1O)O)O)CO")
+smiles(R"O1[C@@H]([C@@H]([C@H]([C@H](C1)NC=O)O)O)OP(=O)(OP(=O)([O-])OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-]")
+smiles(R"O1[C@@H]([C@@H]([C@H]([C@H](C1)[NH3+])O)O)OP(=O)(OP(=O)([O-])OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-]")
+smiles(R"O1[C@@H]([C@@H]([C@@H]([C@H](C1O)O)O)O)C")
+smiles(R"O1[C@H]([C@H]([C@H]([C@@H](C1O)O)O)O)C")
+smiles(R"O1[C@@H]([C@H]([C@@H]([C@H](C1O)O)O)O)C(=O)[O-]")
+smiles(R"O1[C@@H]([C@@H]([C@H]([C@@H]([C@H]1CO)O)O)[NH3+])O[C@H]1[C@H]2[C@@H]([C@@H]([C@H]([C@@H]1O)O)O)OP(=O)(O2)[O-]")
+smiles(R"O1[C@H]([C@@H]([C@H]([C@H]([C@H]1CO)O)O)O[C@@H]1O[C@H]([C@H]([C@H]([C@@H]1O)O)O)C)OC")
+smiles(R"O1[C@H]([C@@H]([C@H]([C@@H]([C@H]1CO)O)O)O)O[C@H]1[C@@H]([C@H](C(O[C@@H]1CO)O)O)O")
+smiles(R"O1[C@H]([C@@H]([C@H]([C@@H]([C@H]1CO)O)O)O)O[C@H]1[C@@H]([C@H](C(=O)O[C@@H]1CO)O)O")
+smiles(R"O1[C@@H]([C@H]([C@@H]([C@@H]([C@@H]1C)O)O)O)OP(=O)(OP(=O)(OC[C@@H]1[C@H]([C@H]([C@H](n2c3nc([nH]c(=O)c3nc2)N)O1)O)O)[O-])[O-]")
+smiles(R"O1[C@H]([C@@H]([C@H]([C@@H]([C@H]1COP(=O)([O-])[O-])O)O)O)O[C@H]1[C@@H]([C@H](C(O[C@@H]1CO)O)O)O")
+smiles(R"O1[C@@H]([C@H]([C@@H]([C@@H]([C@H]1O[C@@H](C(=O)[O-])CO)O)O)O)COP(=O)([O-])[O-]")
+smiles(R"O1[C@@H]([C@H]([C@@H]([C@H]([C@@H]1OC(=O)c1cc(c(cc1)O)OC)O)O)O)CO")
+smiles(R"O1[C@@H]([C@H]([C@@H]([C@@H]([C@H]1O)NC(=O)C)O)NC(=O)C)C")
+smiles(R"O1[C@H]([C@H]([C@H]([C@@H]([C@@H]1O)O)O)O)C")
+smiles(R"O1[C@H]([C@H]([C@H]([C@@H]([C@H]1O)O)O)O)C")
+smiles(R"O1[C@H]([C@H]([C@H]([C@@H]([C@H]1OP(=O)([O-])[O-])O)O)O)C")
+smiles(R"O1[C@@H]([C@H]([C@@H]([C@H]([C@H]1OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1ccc(=O)[nH]c1=O)[O-])[O-])NC(=O)C)O)NC(=O)C)C")
+smiles(R"O1[C@H]([C@@H]([C@@H]([C@H]([C@H]1OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1ccc(=O)[nH]c1=O)[O-])[O-])NC(=O)C)O)[NH3+])C")
+smiles(R"O1[C@@H]([C@@H]([C@H](C(=O)C1)O)O)OP(=O)(OP(=O)([O-])OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c(=O)[nH]c(=O)cc1)[O-]")
+smiles(R"O1[C@@H]([C@H]([C@@H](O)C1n1c[nH+]cc1N)O)COP(=O)([O-])[O-]")
+smiles(R"O1[C@@H]([C@H]([C@@H](O)[C@@H]1n1cnc2c1nc[nH]c2=O)O)COP(=O)([O-])[O-]")
+smiles(R"O1[C@H]([C@@H]([C@@H](O)[C@@H]([C@H]1CO)O)O)Oc1c2c([nH]c1)cccc2")
+smiles(R"O1[C@H]([C@@H]([C@@H](O)[C@@H]([C@H]1CO)O)O)OC(C)(C)C#N")
+smiles(R"O1[C@H]([C@@H]([C@@H](O)[C@@H]([C@H]1CO)O)O)OC(=O)c1cc(c(O)c(c1)O)O")
+smiles(R"O1[C@@H]([C@H]([C@H](O)[C@H]([C@@H]1S/C(=N/OS(=O)(=O)[O-])/Cc1ccccc1)O)O)CO")
+smiles(R"O1[C@@H]([C@H](C(=O)c2c1cc(cc2O)[O-])O)c1ccc(cc1)O")
+smiles(R"O1[C@H]([C@H](O)[C@@H]([C@H]1COP(=O)([O-])[O-])O)n1cnc(c1N)C(=O)NC(CC(=O)[O-])C(=O)[O-]")
+smiles(R"O1[C@H]([C@H](O)[C@H]([C@H]([C@H]1CO)O)O)OCC(O)CO")
+smiles(R"O1[C@@H]([C@H](O)[C@H]([C@H]([C@H]1C(=O)[O-])O)O)OP(=O)([O-])[O-]")
+smiles(R"O1[C@@H]([C@H](O)[C@H]([C@H](O)[C@H]1C(=O)[O-])O)OP(=O)([O-])[O-]")
+smiles(R"O1[C@@H]([C@@H](O)[C@@H](O)C1NC(=[NH2+])CNC=O)COP(=O)([O-])[O-]")
+smiles(R"O1[C@@H]([C@@H](O)[C@@H](O)[C@H](O)[C@H]1[C@@H](CO)O)OP(=O)([O-])[O-]")
+smiles(R"O1[C@H]([C@@H](O)[C@@H](O)[C@H](O)[C@H]1[C@@H](CO)O)OP(=O)([O-])[O-]")
+smiles(R"O1[C@H](CO)[C@H]([C@@H](C1(O)COP(=O)([O-])[O-])O)O")
+smiles(R"O1[C@H](C(=O)[C@@H]([C@H]([C@H]1OP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1ccc(=O)[nH]c1=O)[O-])[O-])NC(=O)C)O)C")
+smiles(R"O1[C@H](CO)[C@@H](C(=O)[C@H]([C@@H]1O)O)O")
+smiles(R"O1[C@H](CO)[C@@H](O)[C@@H]([C@@H](O)[C@@H]1S/C(=N/O)/Cc1ccccc1)O")
+smiles(R"O1[C@@H]([NH3+])[C@H](O)[C@H](O)[C@H]1COP(=O)([O-])[O-]")
+smiles(R"O1[C@@H](O)[C@@H]([C@H]([C@H]([C@H]1CO)OS(=O)(=O)[O-])O[C@@H]1OC(=C[C@H](O)[C@H]1O)C(=O)[O-])NC(=O)C")
+smiles(R"O1[C@@H](O)[C@@H]([C@H]([C@H](O)[C@H]1COS(=O)(=O)[O-])OC1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)C(=O)[O-])NS(=O)(=O)[O-]")
+smiles(R"O1[C@@H](O)[C@@H]([C@@H](O)[C@@H]([C@H]1CO)O)NC(=O)C")
+smiles(R"O1[C@@H](O)[C@H](O)[C@H](O)[C@@H]1C(C)O")
+smiles(R"O1[C@@H](O)[C@@H](O)[C@@H](O)[C@H](O)[C@H]1[C@@H](COP(=O)([O-])[O-])O")
+smiles(R"O1[C@H](O)[C@@H](O)[C@@H](O)[C@H](O)[C@H]1[C@@H](COP(=O)([O-])[O-])O")
+smiles(R"O1[C@@H](O)[C@@H](O)[C@@H](O)[C@H](O)[C@H]1CO")
+smiles(R"O1[C@@H](OP(=O)([O-])[O-])[C@@H](O)[C@@H](O)[C@H](O)[C@H]1[C@@H](COP(=O)([O-])[O-])O")
+smiles(R"O1[C@H](OP(=O)([O-])[O-])[C@@H](O)[C@@H](O)[C@H](O)[C@H]1[C@@H](COP(=O)([O-])[O-])O")
+smiles(R"O1C([NH3+])[C@H](O)[C@H](O)[C@H]1COP(=O)([O-])[O-]")
+smiles(R"O1C(=O)C=C([C-]1CC(=O)[O-])C(=O)[O-]")
+smiles(R"O1C(=O)C=C[C@]1(CC(=O)[O-])C(=O)[O-]")
+smiles(R"O1C(=O)C=CC1(CC(=O)[O-])C(=O)[O-]")
+smiles(R"O1C(=O)C=CC1(CC(=O)[O-])S(=O)(=O)[O-]")
+smiles(R"O1C(=O)C(CC1)[NH3+]")
+smiles(R"O1C(=O)C(=C([C@H]1CO)[O-])O")
+smiles(R"O1C(=O)C[C@@H]([C@H]1CO)O")
+smiles(R"O1C(=O)C(=C([O-])[C@H]1[C@H](CO)O)O")
+smiles(R"O1C(=O)C(=C([O-])[C@H]1[C@H](COP(=O)([O-])[O-])O)O")
+smiles(R"O1C(=O)[C@@H](CC1)[NH3+]")
+smiles(R"O1C(=O)[C@H](C(=O)[C@H]1[C@H](CO)O)O")
+smiles(R"O1C(=O)C(=O)C(=O)[C-]1[C@H](CO)O")
+smiles(R"O1P(=O)(OP(=O)(OP1(=O)[O-])[O-])[O-]")
+smiles(R"O[As](C)O")
+smiles(R"O[As](O)O")
+smiles(R"[O-][As](=O)(O)[O-]")
+smiles(R"[O+]#[C-]")
+smiles(R"O=C1c2c(c(ccc2)O)C(=O)C=C1")
+smiles(R"O=C1C=c2c(=CC1=O)[nH]cc2")
+smiles(R"Oc1c(cccc1)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"Oc1ccc(cc1CC(=O)[O-])O")
+smiles(R"O=C1CCC(CC1)C(=O)[O-]")
+smiles(R"Oc1cc(ccc1)NO")
+smiles(R"Oc1ccc(CCC(=O)[O-])cc1")
+smiles(R"O=c1cc[nH]cc1O")
+smiles(R"O=C1[C@@H](NC(=O)[C@@H](N1)Cc1ccc(cc1)O)Cc1ccc(cc1)O")
+smiles(R"O=C1CNC(=O)CN1")
+smiles(R"O=c1[nH]c(=O)[nH]c2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"O=c1[nH]c(=O)[nH]c2c1ncn2[C@@H]1O[C@@H]([C@@H](O)[C@H]1O)COP(=O)([O-])OP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"OC1O[C@@H]([C@H]([C@@H]([C@H]1O)[NH3+])O)CO")
+smiles(R"OC1O[C@@H]([C@H]([C@@H]([C@H]1O)N)O)COP(=O)(O)O")
+smiles(R"O=CC")
+smiles(R"O=C([C@@]1(C[C@H](CC1(C)C)O)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C1=C(C[C@H](CC1(C)C)O)C)\C)\C)/C)/C")
+smiles(R"O=C([C@@]1(C[C@H](CC1(C)C)O)C)/C=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=C/C(=O)[C@@]1(C[C@H](CC1(C)C)O)C)\C)\C)/C)/C")
+smiles(R"OCc1cc(Oc2ccccc2)ccc1")
+smiles(R"O=C(c1cnc(c(c1CO)O)C)[O-]")
+smiles(R"O=CCc1ccc(cc1)O")
+smiles(R"O=CCc1c[nH]c2c1cccc2")
+smiles(R"OCCc1c[nH]c2ccccc12")
+smiles(R"O=C(CC)C")
+smiles(R"O=C(/C=C/c1ccccc1)[O-]")
+smiles(R"OCC/C=C\CC")
+smiles(R"O=C(/C=C/C=C/c1ccc2c(c1)OCO2)N1CCCCC1")
+smiles(R"O(C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)\C)\C)\C)P(=O)(OP(=O)(O[C@H]1O[C@@H]([C@@H]([C@@H]([C@H]1O)O)O)CO)[O-])[O-]")
+smiles(R"O(C/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)C[C@@H](COP(=O)([O-])[O-])O")
+smiles(R"O=C/C(=C/C=C/C(=C/C=C/C=C(/C=C/C=C(/C=O)\C)\C)/C)/C")
+smiles(R"O=C/C=C/C(=C/C=C/C=C(/C=C/C=O)\C)/C")
+smiles(R"O=C/C=C/C=C(/C=C/C=C(/C=O)\C)\C")
+smiles(R"O=C/C=C/C(=C/C=C/C=O)/C")
+smiles(R"O=C/C=C(/C=C/C=C(/C=O)\C)\C")
+smiles(R"O=C(CCCCCCC)O[C@@H](C[N+](C)(C)C)CC(=O)[O-]")
+smiles(R"O/C=C/C=C(/C=C/C=O)\C")
+smiles(R"O(CC/C=C\CC)C(=O)C")
+smiles(R"O=C(CCCCCC(=O)[O-])[O-]")
+smiles(R"O=CCCCCC(=O)[O-]")
+smiles(R"O=C/C=C/C=C(/C(=O)[O-])\O")
+smiles(R"O=C/C=C(/C=C/C(=O)[O-])\O")
+smiles(R"O=C(C(CCC(=O)[O-])CO)[O-]")
+smiles(R"O=C(CC)C(=O)[O-]")
+smiles(R"O=C(CC(C(=O)[O-])O)C(=O)[O-]")
+smiles(R"O=C(C(C(C(=O)[O-])O)C(=O)[O-])C(=O)[O-]")
+smiles(R"O=C(C[C@@H](C(=O)[O-])NC(=[NH2+])N)[O-]")
+smiles(R"OCCCl")
+smiles(R"O/C=C(/C(=O)CCSC)\[O-]")
+smiles(R"OCC(CO)OP(=O)([O-])[O-]")
+smiles(R"O(C[C@@H]1[C@H]([C@@H]([C@H]([C@@H](O1)Oc1ccc(cc1)O)O)O)O)P(=O)([O-])[O-]")
+smiles(R"O(C[C@@H]1[C@H]([C@H]([C@H](O1)OP(=O)([O-])[O-])O)O)P(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1cnc2c1ncnc2N)[O-])[O-]")
+smiles(R"OC[C@@H]1[C@@H](OP(=O)([O-])[O-])[C@@H](O)[C@@H](O1)n1c(=O)[nH]c(=O)cc1")
+smiles(R"O(C[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1cnc2c1nc([nH]c2=O)N)P(=O)(O[C@@H]1[C@H](O[C@H]([C@@H]1O)n1cnc2c1nc([nH]c2=O)N)COP(=O)([O-])[O-])[O-]")
+smiles(R"O=C([C@H](CCC[C@@H](C(=O)[O-])[NH3+])NC(=O)C)[O-]")
+smiles(R"OC[C@@H]([C@@H](/C=C/CCCCCCCCCCCCC)O)[NH3+]")
+smiles(R"OC[C@H]([C@H](CC(=O)C(=O)[O-])O)O")
+smiles(R"OC[C@H]([C@H]([C@@H]([C@@H](C(=O)[O-])O)O)O)O")
+smiles(R"OC[C@H]([C@H]([C@H](CNc1c(c(=O)[nH]c(=O)[nH]1)N)O)O)O")
+smiles(R"OC[C@H]([C@H]([C@@H](C(=O)C[NH2+]CCCC[C@@H](C(=O)[O-])[NH3+])O)O)O")
+smiles(R"OC[C@H]([C@H]([C@H](C(=O)C[NH2+]CCCC[C@@H](C(=O)[O-])[NH3+])O)O)O")
+smiles(R"OC[C@H]([C@H]([C@@H](C(=O)C=O)O)O)O")
+smiles(R"O=C[C@@H]([C@@H]([C@@H](C)O)O)O")
+smiles(R"O(C[C@H]([C@H]([C@@H](C=O)O)O)O)P(=O)([O-])[O-]")
+smiles(R"OC[C@@H]([C@H](C(=O)C(=O)C(=O)[O-])O)O")
+smiles(R"O(C[C@H]([C@H](C=O)O)O)P(=O)([O-])[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCC/C=C\CCCCCCCC)OC(=O)CCCCCCCCCCCCCCC)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCCCC)OC(=O)CCCCCCCCCCCCCCC)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCC/C=C\CCCCCCCC)O)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCCCC)O)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCC/C=C\C/C=C\C/C=C\C/C=C\CCCCC)P(=O)([O-])[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCC/C=C\C/C=C\CCCCC)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCC/C=C\CCCCCCCC)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCCCCCCCCCCCC)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCC/C=C\C/C=C\CCCCC)P(=O)([O-])[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCCCCCCCCCCCC)P(=O)([O-])[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCCCCCCCCCC)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCCCCCCCCCC)P(=O)([O-])[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)OC(=O)CCCCCCCCCCCCC)P(=O)([O-])[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCCCC)O)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCC)OC(=O)CCCCCCCCCCCCCCC)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](COC(=O)CCCCCCCCCCCCC)O)P(=O)(OC[C@H](CO)O)[O-]")
+smiles(R"O(C[C@@H](C(=O)[O-])[NH3+])P(=O)(OCC(CO)O)[O-]")
+smiles(R"O(C[C@H](C(=O)[O-])O)P(=O)([O-])[O-]")
+smiles(R"O(C[C@@H](CO)O)P(=O)([O-])[O-]")
+smiles(R"OC[C@H](COP(=O)(OCC[N+](C)(C)C)[O-])O")
+smiles(R"OC[C@@H](COP(=O)([O-])[O-])O")
+smiles(R"O(C[C@@H](COP(=O)([O-])[O-])O)C/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C")
+smiles(R"OC[C@H](C(=O)SC)O")
+smiles(R"O(CC[NH+](C)C)P(=O)([O-])[O-]")
+smiles(R"O=CC(O)c1c[nH]c2c1cccc2")
+smiles(R"OC(C(O)CO)C(O)CO")
+smiles(R"OCC(=O)C(=O)[O-]")
+smiles(R"O(CC(O)CO)P(=O)([O-])[O-]")
+smiles(R"O=C(COP(=O)([O-])[O-])COC(=O)CCCCCCCCCCCCCCC")
+smiles(R"O=C(COP(=O)([O-])[O-])C(=O)[O-]")
+smiles(R"O[C@H]1[C@@H](C[C@@H]([C@H]([C@@H]1O[C@H]1[C@@H]([C@@H]([C@H](O1)CO)O)O)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C[NH3+])[NH3+])NC(=O)[C@H](CCNC(=O)CC[C@@H](C(=O)[O-])[NH3+])O")
+smiles(R"O[C@H]1[C@@H](C[C@@H]([C@H]([C@@H]1O[C@H]1[C@@H]([C@@H]([C@H](O1)CO)O)O)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C[NH3+])[NH3+])NC(=O)[C@H](CC[NH3+])O")
+smiles(R"O[C@H]1[C@@H](C[C@@H]([C@H]([C@@H]1O)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C=O)[NH3+])[NH3+]")
+smiles(R"O[C@H]1[C@@H](C[C@@H]([C@H]([C@@H]1O)O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)CO)[NH3+])[NH3+]")
+smiles(R"O([C@H]1[C@H]([C@@H](CC(=C1)C(=O)[O-])O)O)P(=O)([O-])[O-]")
+smiles(R"O([C@H]1[C@@H]([C@H](C[C@H]([C@@H]1O)[NH3+])[NH3+])O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)C[NH3+])O)O)[NH3+])[C@@H]1O[C@@H]([C@H]([C@H]1O)O)CO")
+smiles(R"O[C@@H]1[C@H]([C@@H]([C@H]([C@@H]([C@@H]1O)OC(=O)Cc1c2ccccc2[nH]c1)O)O)O")
+smiles(R"O([C@H]1[C@@H]([C@@H]([C@H]([C@@H](O1)C)O)O)O)c1c(c2cc(c(cc2)O)O)oc2c(c1=O)c(cc(c2)[O-])O")
+smiles(R"O([C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)[C@@H]1[C@H](OC([C@@H]([C@H]1O)NC(=O)C)O)CO")
+smiles(R"O([C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)[C@@H]1[C@H](OC([C@@H]([C@H]1O)[NH3+])O)CO")
+smiles(R"O([C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)[C@@H]1[C@H](O[C@H]([C@@H]([C@H]1O)NC(=O)C)O)CO")
+smiles(R"O([C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)c1cc2c(c(c1)O)C(=O)/C(=C/c1cc(c(cc1)O)O)/O2")
+smiles(R"O([C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)c1cc2c(c(c1)O)C(=O)/C(=C/c1cc(c(c(c1)O)O)O)/O2")
+smiles(R"O([C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)COP(=O)([O-])[O-])O)O)NC(=O)C)[C@@H]1[C@H](OC([C@@H]([C@H]1O)NC(=O)C)O)CO")
+smiles(R"O([C@H]1[C@@H]([C@H]([C@@H]([C@H](O1)COP(=O)([O-])[O-])O)O)NC(=O)C)[C@@H]1[C@H](OC([C@@H]([C@H]1O)[NH3+])O)CO")
+smiles(R"O[C@@H]1[C@H]([C@@H](O[C@@H]([C@H]1O)CO)O[C@H]1[C@@H]([C@H]([C@H](O[C@@H]1CO)OP(=O)(OP(=O)(OC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)[O-])[O-])O)O)O")
+smiles(R"O[C@@H]1[C@H]([C@@H](O[C@@H]([C@@H]1O)CO)O[C@@H]1[C@H]([C@H](C(O[C@H]1C)O)O)O)O")
+smiles(R"O[C@@H]1[C@H]([C@H](O[C@@H]([C@H]1O)CO)OP(=O)(OP(=O)(OC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C)/C)[O-])[O-])O")
+smiles(R"O[C@@H]1[C@H](O[C@H]2[C@@H]1OP(=O)(O2)[O-])COP(=O)([O-])[O-]")
+smiles(R"O[C@@H]1[C@@H](O)[C@@H](C[C@@H]([C@H]1O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1[NH3+])O)O)C[NH3+])[NH3+])[NH3+]")
+smiles(R"O[C@@H]1[C@@H](O)[C@@H](C[C@@H]([C@H]1O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)C[NH3+])[NH3+])[NH3+]")
+smiles(R"O[C@@H]1[C@@H](O)[C@@H](C[C@@H]([C@H]1O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)C=O)[NH3+])[NH3+]")
+smiles(R"O[C@H]1[C@@H](O[C@H]([C@@H]1O)[C@@H](CO)O[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O[C@@H]1O[C@H]([C@@H]([C@H]1O)O)[C@@H](CO)O)O)O)O)O)O)O)O)OC[C@@H](O)[C@@H]1O[C@@H](O[C@H](CO)[C@@H]2O[C@@H](OC[C@@H](O)[C@@H]3O[C@@H](O[C@H](CO)[C@@H]4O[C@@H](OC[C@@H](O)[C@@H]5O[C@@H](O[C@H](CO)[C@@H]6O[C@@H](OC[C@@H](O)[C@@H]7O[C@@H](O[C@H](CO)[C@@H]8O[C@@H](OC[C@@H](O)[C@@H]9O[C@@H](O[C@H](CO)[C@@H]%10O[C@@H](OC[C@@H](O)[C@@H]%11O[C@@H](O[C@H](CO)[C@@H]%12O[C@H]([C@H](O)[C@H]%12O)OC[C@@H](O)[C@@H]%12O[C@@H](O[C@H](CO)[C@@H]%13O[C@H]([C@H](O)[C@H]%13O)O[C@@H]%13[C@H]([C@H]([C@@H](O[C@H]%13C)O[C@@H]%13[C@H]([C@@H](OP(=O)(OP(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C)[O-])[O-])O[C@@H]([C@H]%13O)CO)NC(=O)C)O)O)[C@H](O)[C@H]%12O)[C@H](O)[C@H]%11O)[C@H](O)[C@H]%10O)[C@H](O)[C@H]9O)[C@H](O)[C@H]8O)[C@H](O)[C@H]7O)[C@H](O)[C@H]6O)[C@H](O)[C@H]5O)[C@H](O)[C@H]4O)[C@H](O)[C@H]3O)[C@H](O)[C@H]2O)[C@H](O)[C@H]1O")
+smiles(R"O[C@@H]1[C@H](O[C@@H]([C@@H]([C@H]1O)NC(=O)C)O[C@H](C(=O)[O-])CC(=O)[O-])CO")
+smiles(R"O[C@@H]1[C@H](O[C@@H]([C@@H]([C@H]1O)[NH3+])O[C@H](C(=O)[O-])CC(=O)[O-])CO")
+smiles(R"O[C@@H]1[C@H](O[C@@H](O[C@@H]2[C@H](O[C@H](OP(=O)(OP(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)[O-])[O-])[C@@H]([C@H]2O)NC(=O)C)CO)[C@H]([C@H]1O)NC(=O)C)C(=O)[O-]")
+smiles(R"O([C@@H]1[C@H](O)[C@H](O)[C@H]([C@H](O)[C@H]1O)O)P(=O)([O-])OC[C@@H]([C@@H](CCCCCCCCCCCCCCC)O)NC(=O)CCCCCCCCCCCCCCCCCCCCCCC")
+smiles(R"O([C@@H]1[C@H](O)[C@H](O)[C@H]([C@H](O)[C@H]1O)O)P(=O)([O-])OC[C@@H]([C@@H](CCCCCCCCCCCCCCC)O)NC(=O)CCCCCCCCCCCCCCCCCCCCCCCCC")
+smiles(R"O([C@@H]1[C@H](O)[C@H](O)[C@H]([C@H](O)[C@H]1O)O)P(=O)([O-])OC[C@@H]([C@@H](CCCCCCCCCCCCCCC)O)NC(=O)[C@H](CCCCCCCCCCCCCCCCCCCCCCCC)O")
+smiles(R"O[C@@H]1[C@H](O[C@H](OP(=O)(C)[O-])[C@@H]1O)COP(=O)([O-])[O-]")
+smiles(R"O[C@@H]1[C@H](O[C@H](OP(=O)(C)[O-])[C@@H]1O)COP(=O)(OP(=O)(OP(=O)(O)[O-])[O-])[O-]")
+smiles(R"O[C@@H]1[C@H](O[C@H](OP(=O)([O-])[O-])[C@@H]1O)CO")
+smiles(R"O[C@@H]1[C@H](O[C@H](OP(=O)([O-])[O-])[C@@H]1O)COP(=O)([O-])[O-]")
+smiles(R"O[C@H]1[C@H](OC(=O)/C=C/c2ccc(cc2)O)C[C@@](O)(C[C@H]1O)C(=O)[O-]")
+smiles(R"O[C@H]1C(O[C@H]([C@@H]([C@H]1O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)O)O)C)O")
+smiles(R"O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@@H]1O[C@H](CO[C@]2(O[C@H]([C@@H]([C@H](C2)O)NC(=O)C)[C@@H]([C@@H](CO)O)O)C(=O)[O-])[C@@H]([C@@H]([C@H]1O)O)O)CO")
+smiles(R"O([C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)C(=O)Cc1c2ccccc2[nH]c1")
+smiles(R"O([C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO)[C@H]1Oc2ccccc2N(C1=O)O")
+smiles(R"O([C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO)[C@H]1Oc2cc(ccc2N(C1=O)O)O")
+smiles(R"O[C@@H]1O[C@@H]([C@H]([C@H](O)[C@H]1O)O)CO[C@@H]1O[C@H]([C@H](O)[C@@H](O)[C@H]1O)C")
+smiles(R"O[C@H](c1ccccc1)[C@@H](c1ccccc1)O")
+smiles(R"O[C@H](Cc1ccccc1)C(=O)[O-]")
+smiles(R"O[C@@H](CC(=O)C(=O)[O-])[C@@H](O)C=O")
+smiles(R"O[C@@H](CC(=O)C(=O)[O-])[C@@H](OS(=O)(=O)[O-])C=O")
+smiles(R"O([C@@H](CC(=O)[O-])C)C(=O)C[C@@H](C)O")
+smiles(R"O[C@@H](C(=O)OCC)[C@@H](C)C(=O)OCC")
+smiles(R"OCl")
+smiles(R"O=[Cl][O-]")
+smiles(R"[O-][Cl](=O)=O")
+smiles(R"O=C(N)[C@H]1[NH2+]CCC1")
+smiles(R"OC/N=[N+](/C)\[O-]")
+smiles(R"[O-]C(=O)C1(C(=NC(=O)N1)NC(=O)N)O")
+smiles(R"[O-]C(=O)c1nccnc1")
+smiles(R"O(C(=O)Cc1c[nH]c2c1cccc2)C")
+smiles(R"[O-]C(=O)C(C)C")
+smiles(R"O=CO/C=C(/CCC1=C(CCCC1(C)C)C)\C")
+smiles(R"O=C([O-])CCCCC[C@H](O)[C@H](/C=C\C/C=C\CCCCC)O")
+smiles(R"[O-]C(=O)CC(CCC(C)O)C(=C)C")
+smiles(R"[O-]C(=O)C/C(=C/C=C(/C(=O)[O-])\O)/C(=O)[O-]")
+smiles(R"[O-]C(=O)CC(CCCNC(=O)C)[NH3+]")
+smiles(R"[O-]C(=O)/C(=C/C=C/C(=O)/C=C/C(=O)[O-])/O")
+smiles(R"[O-]C(=O)/C(=C\C=C/C(=O)/C=C/C(=O)[O-])/O")
+smiles(R"[O-]C(=O)/C(=C\C=C/C(=O)CCC(=O)[O-])/O")
+smiles(R"[O-]C(=O)CC(/C=C/C(=O)C(=O)[O-])C(=O)[O-]")
+smiles(R"[O-]C(=O)CCC(CC(=O)C(=O)[O-])O")
+smiles(R"[O-]C(=O)CCCCC(=O)[O-]")
+smiles(R"[O-]C(=O)CCC[C@@H](C(=O)[O-])NC(=O)C")
+smiles(R"O(C(=O)CCC[C@@H](C(=O)[O-])NC(=O)C)P(=O)([O-])[O-]")
+smiles(R"[O-]C(=O)CCC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"O=C([O-])CCCCO")
+smiles(R"[O-]C(=O)C/C=C/C(=O)C(=O)[O-]")
+smiles(R"[O-]C(=O)CC(CC(=O)[O-])[NH3+]")
+smiles(R"[O-]C(=O)CC[C@@H](C(=O)[O-])NC(=O)[C@@H]([NH3+])C")
+smiles(R"[O-]C(=O)CC[C@H](NC(=O)C[NH3+])C(=O)[O-]")
+smiles(R"O=C([O-])/C=C/C[N+](C)(C)C")
+smiles(R"O=C([O-])CCC[NH2+]C")
+smiles(R"[O-]C(=O)/C=C\C(=O)CC(=O)CC(=O)[O-]")
+smiles(R"[O-]C(=O)CC(C(=O)[O-])Cc1ccccc1")
+smiles(R"[O-]C(=O)[C@](CC(=O)[O-])(C)O")
+smiles(R"[O-]C(=O)[C@@](CC(=O)[O-])(C)O")
+smiles(R"[O-]C(=O)C(CC(=O)[O-])(C)O")
+smiles(R"[O-]C(=O)/C(=C/C(=O)[O-])/O")
+smiles(R"[O-]C(=O)/C(=C(/C(=O)[O-])\O)/O")
+smiles(R"[O-]C(=O)C(C(C(=O)[O-])O)O")
+smiles(R"[O-]C(=O)C[C@@H](CC[C@@H](C)O)C(=C)C")
+smiles(R"[O-]C(=O)C[C@H](CC[C@@H](C)O)C(=C)C")
+smiles(R"[O-]C(=O)C[C@@H]([C@H](C(=O)[O-])O)C(=O)[O-]")
+smiles(R"[O-]C(=O)C[C@H](C(=O)[O-])Cc1ccccc1")
+smiles(R"[O-]C(=O)C([C@H](C(=O)[O-])O)(C)C")
+smiles(R"[O-]C(=O)CC[NH2+][C@@H](C(=O)[O-])C")
+smiles(R"[O-]C(=O)CC[N+](=O)[O-]")
+smiles(R"O=C([O-])CC(=O)c1ccccc1")
+smiles(R"O(C(=O)C(CO)c1ccccc1)[C@@H]1C[C@H]2CC[C@@H](C1)[NH+]2C")
+smiles(R"[O-]C(=O)CC(=O)CCCNC(=O)C")
+smiles(R"[O-]C(=O)CC(=O)/C=C/C(=O)[O-]")
+smiles(R"O=C([O-])CC(=O)/C=C\C(=O)[O-]")
+smiles(R"[O-]C(=O)CCSC")
+smiles(R"O=C([O-])[C@H]1CCC[NH2+]1")
+smiles(R"[O-]C(=O)[C@H]1N(CCC1)C(=O)C[NH3+]")
+smiles(R"O=C([O-])[C@H]1[NH2+]CCC1")
+smiles(R"[O-]C(=O)[C@H](CCC[C@@H](C(=O)[O-])NC(=O)CCC(=O)[O-])[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CCCCN(C(=O)C)O)[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CC(C)C)[NH3+]")
+smiles(R"[O-]C(=O)[C@@H](CCCC[NH3+])[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CCCC[NH3+])[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CCC(=O)NCCCC(=O)[O-])[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CCC(=O)N[C@H](C(=O)NCC(=O)NCCC[NH2+]CCCC[NH3+])CS)[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CCC(=O)N[C@H](C(=O)NCC(=O)[O-])CSS)[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CCC(=O)[O-])NC=[NH2+]")
+smiles(R"[O-]C(=O)[C@H](CC)O")
+smiles(R"[O-]C(=O)[C@H](CC(=O)N)[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CC(=O)NO)[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CC[S@](=O)C)[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CC[S@@](=O)C)[NH3+]")
+smiles(R"[O-]C(=O)[C@H]([C@@H]([C@H](O)CO)O)O")
+smiles(R"[O-]C(=O)[C@H]([C@@H](CO)O)[NH3+]")
+smiles(R"[O-]C(=O)[C@@H]([C@H](C(=O)[O-])O)O")
+smiles(R"[O-]C(=O)[C@H]([C@@H](C(=O)[O-])O)O")
+smiles(R"[O-]C(=O)[C@@H]([C@@H](COP(=O)([O-])[O-])O)O")
+smiles(R"O=C([O-])[C@@H](C)[NH2+]CC(=O)[O-]")
+smiles(R"O(C(=O)[C@H](CO)c1ccccc1)[C@@H]1C[C@H]2CC[C@@H](C1)[NH+]2C")
+smiles(R"[O-]C(=O)[C@H](C(=O)[C@@H]([C@H](CO)O)O)O")
+smiles(R"O=C([O-])[C@H](CO)NC(=O)c1cccc(c1O)O")
+smiles(R"O=C([O-])[C@@H](CO)O")
+smiles(R"[O-]C(=O)[C@@H](COP(=O)([O-])[O-])[NH3+]")
+smiles(R"[O-]C(=O)[C@H](COP(=O)([O-])[O-])[NH3+]")
+smiles(R"[O-]C(=O)[C@H](CS(=O)(=O)[O-])[NH3+]")
+smiles(R"[O-]C(=O)[C@@H](N)C(=O)C")
+smiles(R"O=C([O-])[C@@H](NC(=O)C)CCC=O")
+smiles(R"O=C([O-])[C@H](NC(=O)[C@H]([NH3+])C)C")
+smiles(R"[O-]C(=O)[C@@H](NC(=O)N)CC(=O)[O-]")
+smiles(R"[O-]C(=O)[C@H](NC(=O)N)[NH3+]")
+smiles(R"O=C([O-])[C@@H]([NH3+])Cc1cc(c(c(c1)I)[O-])I")
+smiles(R"O=C([O-])[C@@H]([NH3+])Cc1ccc(cc1)O")
+smiles(R"O=C([O-])[C@H]([NH3+])Cc1ccc(cc1)O")
+smiles(R"O=C([O-])[C@@H]([NH3+])C(C)C")
+smiles(R"[O-]C(=O)[C@@H]([NH3+])CCCC[N+](C)(C)C")
+smiles(R"[O-]C(=O)[C@@H]([NH3+])C(CCC[N+](C)(C)C)O")
+smiles(R"O=C([O-])[C@@H]([NH3+])CCCNC(=[NH2+])N")
+smiles(R"O=C([O-])[C@H]([NH3+])CCCNC(=[NH2+])N")
+smiles(R"O=C([O-])[C@H]([NH3+])CCC(=O)N")
+smiles(R"O=C([O-])[C@@H]([NH3+])CCC(=O)[O-]")
+smiles(R"O=C([O-])[C@H]([NH3+])CCC(=O)[O-]")
+smiles(R"[O-]C(=O)[C@@H]([NH3+])CC(C(=O)[O-])O")
+smiles(R"[O-]C(=O)[C@@H]([NH3+])CC=O")
+smiles(R"O=C([O-])[C@@H]([NH3+])CC(=O)[O-]")
+smiles(R"O=C([O-])[C@H]([NH3+])CC(=O)[O-]")
+smiles(R"[O-]C(=O)[C@@H]([NH3+])CC(=O)OP(=O)([O-])[O-]")
+smiles(R"O=C([O-])[C@@H]([NH3+])CCSC")
+smiles(R"O=C([O-])[C@H]([NH3+])CCSC")
+smiles(R"[O-]C(=O)[C@@H]([NH3+])[C@H](CC)C")
+smiles(R"[O-]C(=O)[C@H]([NH3+])[C@@H](C(=O)[O-])O")
+smiles(R"O=C([O-])[C@@H]([NH3+])[C@H](O)C")
+smiles(R"O=C([O-])[C@H]([NH3+])[C@@H](O)C")
+smiles(R"[O-]C(=O)[C@@H]([NH3+])[C@H](O)CF")
+smiles(R"[O-]C(=O)[C@@H](NO)C(C)C")
+smiles(R"[O-]C(=O)[C@@H](NO)[C@H](CC)C")
+smiles(R"[O-]C(=O)[C@@H](N(O)O)C(C)C")
+smiles(R"[O-]C(=O)[C@@H](N(O)O)[C@H](CC)C")
+smiles(R"[O-]C(=O)[C@@H](O)CCC(=O)[O-]")
+smiles(R"[O-]C(=O)[C@H](O)CCC(=O)[O-]")
+smiles(R"[O-]C(=O)[C@H](OS(=O)(=O)[O-])C")
+smiles(R"[O-]C(=O)CN(C(=[NH2+])NP(=O)([O-])[O-])C")
+smiles(R"[O-]C(=O)CNC(=O)[C@@H](NC(=O)CC[C@@H](C(=O)[O-])[NH3+])CSCO")
+smiles(R"[O-]C(=O)C(NC(=O)N)[NH3+]")
+smiles(R"O=C([O-])C([NH3+])CCCCCCCCSC")
+smiles(R"O=C([O-])C([NH3+])CCCCCCCSC")
+smiles(R"O=C([O-])C([NH3+])CCCCCCSC")
+smiles(R"O=C([O-])C([NH3+])CCCCCSC")
+smiles(R"O=C([O-])C([NH3+])CCCCSC")
+smiles(R"O=C([O-])C([NH3+])CCC(=O)[O-]")
+smiles(R"O=C([O-])C([NH3+])CCSC")
+smiles(R"O=C([O-])C[NH+](C)C")
+smiles(R"O=C([O-])C(NO)CCCCCCCCSC")
+smiles(R"O=C([O-])C(NO)CCCCCCCSC")
+smiles(R"O=C([O-])C(NO)CCCCCCSC")
+smiles(R"O=C([O-])C(NO)CCCCCSC")
+smiles(R"O=C([O-])C(NO)CCCCSC")
+smiles(R"O=C([O-])C(N(O)O)CCCCCCCCSC")
+smiles(R"O=C([O-])C(N(O)O)CCCCCCCSC")
+smiles(R"O=C([O-])C(N(O)O)CCCCCCSC")
+smiles(R"O=C([O-])C(N(O)O)CCCCCSC")
+smiles(R"O=C([O-])C(N(O)O)CCCCSC")
+smiles(R"O=C([O-])C=O")
+smiles(R"[O-]C(=O)C(=O)C(C)C")
+smiles(R"[O-]C(=O)C(=O)CCC[C@@H](C(=O)[O-])NC(=O)CCC(=O)[O-]")
+smiles(R"[O-]C(=O)C(=O)CCCC[NH3+]")
+smiles(R"[O-]C(=O)C(=O)/C=C\CC(=O)[O-]")
+smiles(R"[O-]C(=O)C(=O)CCCNC(=[NH2+])N")
+smiles(R"[O-]C(=O)C(=O)CCC(=O)NC")
+smiles(R"[O-]C(=O)C(O)CCC(=O)[O-]")
+smiles(R"[O-]C(=O)C(=O)C[C@@H](C(=O)[O-])O")
+smiles(R"[O-]C(=O)C(=O)[C@H]([C@@H]([C@@H](CO)O)O)O")
+smiles(R"[O-]C(=O)C(=O)CS")
+smiles(R"[O-]C(=O)CSC")
+smiles(R"O(C(=O)N)CC")
+smiles(R"O=C(O)[O-]")
+smiles(R"[O-][Cr](=O)(=O)[O-]")
+smiles(R"O=C=S")
+smiles(R"O=C(SC[C@H](NC(=O)CC[C@H]([NH3+])C(=O)[O-])C(=O)NCC(=O)[O-])[C@@H](C)O")
+smiles(R"O=[Mo](=O)([O-])[O-]")
+smiles(R"[O-][N+](=CCC(=O)[O-])[O-]")
+smiles(R"O=N[O-]")
+smiles(R"[O][O-]")
+smiles(R"O=O")
+smiles(R"OO")
+smiles(R"[O-]P(=O)CC(=O)C(=O)[O-]")
+smiles(R"[O-]P(=O)(CC(=O)C(=O)[O-])O")
+smiles(R"O=P(OC(=O)C)([O-])[O-]")
+smiles(R"O=P(OC=O)([O-])[O-]")
+smiles(R"O(P(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C)[O-])[C@@H]1O[C@@H]([C@H](C1=O)O)CO")
+smiles(R"O(P(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C)[O-])[C@@H]1O[C@@H]([C@H]([C@@H]1O)O)CO")
+smiles(R"O(P(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C)[O-])[C@@H]1O[C@@H]([C@H]([C@H]1O)O)CO")
+smiles(R"O(P(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C)[O-])[C@@H]1O[C@@H]([C@H]([C@H]1O)O)COP(=O)([O-])[O-]")
+smiles(R"O(P(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C)[O-])P(=O)([O-])O[C@H]1[C@@H]([C@@H](O[C@H]2[C@@H]([C@@H]([C@@H](O[C@@H]3[C@H]([C@H]([C@@H]([C@H](O3)CO)O)O[C@@H]3[C@@H](C[C@H]([C@@H](C)O3)O)O)O)[C@@H](O2)C)O)O)[C@H]([C@H](O1)CO)O)O")
+smiles(R"O(P(=O)(OC/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C)[O-])P(=O)([O-])O[C@H]1[C@@H]([C@@H](O[C@H]2[C@@H]([C@@H]([C@@H](O[C@@H]3[C@H]([C@H]([C@@H]([C@H](O3)CO)O)O)O)[C@@H](O2)C)O)O)[C@H]([C@H](O1)CO)O)O")
+smiles(R"[O-]P(=O)(OCCC(=C)C)[O-]")
+smiles(R"[O-]P(=O)(OC[C@H]([C@H]([C@@H](CC(=O)C(=O)[O-])O)O)O)[O-]")
+smiles(R"[O-]P(=O)(OC[C@H]([C@@H]([C@@H]([C@H](C=O)O)O)O)O)[O-]")
+smiles(R"[O-]P(=O)(OC[C@@H](COC(=O)CCCCCCCCCCCCC)O)[O-]")
+smiles(R"[O-]P(=O)(OC[C@@H](COC(=O)CCCCCCCCCCC)O)[O-]")
+smiles(R"[O-]P(=O)(OC(=O)CC)[O-]")
+smiles(R"[O-]P(=O)(OC(=O)[C@H](CCC(=O)[O-])[NH3+])[O-]")
+smiles(R"O=P([O-])([O-])N")
+smiles(R"O(P(=O)([O-])[O-])C[C@H]([C@H](CC(=O)C(=O)[O-])O)O")
+smiles(R"O(P(=O)([O-])[O-])CC(=O)[C@@H]([C@@H]([C@H](C)O)O)O")
+smiles(R"O(P(=O)([O-])[O-])CC(=O)[C@H]([C@@H]([C@H](C)O)O)O")
+smiles(R"O(P(=O)([O-])[O-])P(=O)(OCC=C(C)C)[O-]")
+smiles(R"O(P(=O)([O-])[O-])P(=O)(OCCC(=C)C)[O-]")
+smiles(R"O(P(=O)([O-])[O-])P(=O)(OC/C=C(/CO)\C)[O-]")
+smiles(R"[O-]P(=O)([O-])OP(=O)(O)[O-]")
+smiles(R"O=P([O-])([O-])OP(=O)([O-])OC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CC/C=C(\C)/CCC=C(C)C")
+smiles(R"O(P(=O)([O-])OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@H](n2c3nc([nH]c(=O)c3nc2)N)O1)O)O)C[C@H]1O[C@H]2Nc3nc([nH]c(=O)c3N[C@H]2C2=C1S[Mo](=O)(=O)S2)N")
+smiles(R"O(P(=O)([O-])OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@H](n2c(=O)nc(cc2)N)O1)O)O)C[C@H]1O[C@H]2Nc3nc([nH]c(=O)c3N[C@H]2C2=C1S[Mo](=O)(=O)S2)N")
+smiles(R"[O-]P(=O)([O-])OP(=O)([O-])OP(=O)([O-])[O-]")
+smiles(R"O(P(=O)([O-])OP(=O)([O-])OP(=O)([O-])OP(=O)([O-])OP(=O)([O-])OP(=O)([O-])OC[C@@H]1[C@H]([C@H]([C@H](n2cnc3c(N)ncnc23)O1)O)O)C[C@@H]1[C@H]([C@H]([C@H](n2cnc3c2ncnc3N)O1)O)O")
+smiles(R"O(P(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@@H]1NC(=O)C)O)O)CO)CO)[O-])[O-])C/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1O)O)O)CO)CO)[O-])[O-])C/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)(OC1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O)CO)[O-])[O-])C/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C")
+smiles(R"[O-]P(=O)(OP(=O)(OC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)[O-])[O-]")
+smiles(R"O(P(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1cnc2c1ncnc2N)[O-])[O-])C[C@H]1O[C@@H]([C@@H]([C@@H]1O)O)NC(=[NH2+])NCCC[C@@H](C(=O)[O-])[NH3+]")
+smiles(R"[O-]P(=O)(OP(=O)(O[C@@H]1C2(C(C(C1)CC2)(C)C)C)[O-])[O-]")
+smiles(R"O(P(=O)(OP(=O)(O[C@@H]1[C@@H]([C@@H](O[C@H]2[C@@H]([C@@H]([C@@H](O)[C@@H](O2)C)O)O)[C@@H]([C@H](O1)CO)O)NC(=O)C)[O-])[O-])C/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O[C@@H]1[C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)NC(=O)C)NC(=O)C)C)[O-])[O-])C/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\C)/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O[C@@H](C(=O)N[C@H](C(=O)N[C@H](CCC(=O)N[C@H](C(=O)N[C@@H](C(=O)N[C@@H](C(=O)[O-])C)C)CCC[C@H](C(=O)[O-])[NH3+])C(=O)[O-])C)C)O[C@@H]1[C@@H]([C@H]([C@@H]([C@H](O1)CO)O)O)NC(=O)C)CO)[O-])[O-])C/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/C)\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O[C@@H](C(=O)N[C@H](C(=O)N[C@H](CCC(=O)N[C@H](C(=O)N[C@@H](C(=O)N[C@@H](C(=O)[O-])C)C)CCC[C@H](C(=O)[O-])[NH3+])C(=O)[O-])C)C)O)CO)[O-])[O-])C/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/C)\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)NC(=O)C)C)[O-])[O-])C/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\C)/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)(O[C@@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O[C@@H]1O[C@@H]([C@H]([C@@H]([C@@H]1NC(=O)C)O)O)COP(=O)(OCC(O)CO)[O-])CO)[O-])[O-])C/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O)CO)[O-])[O-])C/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)(O[C@H]1O[C@@H]([C@H]([C@@H]([C@H]1NC(=O)C)O)O)CO)[O-])[O-])C/C=C(/C)\CC/C=C(/C)\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(\CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)/C)/C)/C)/C)/C)/C")
+smiles(R"O(P(=O)(OP(=O)([O-])[O-])[O-])C/C=C(\CCC=C(C)C)/C")
+smiles(R"[O-]P(=O)(OP(=O)([O-])[O-])OC/C=C(\CC/C=C(\CCC=C(C)C)/C)/C")
+smiles(R"[O-]P(=O)(OP(=O)(OP(=O)(OC[C@H]1O[C@@H](n2c3ncnc(N)c3nc2)[C@@H]([C@@H]1O)OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)OP(=O)([O-])OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c2ncnc(N)c2nc1)n1c2ncnc(N)c2nc1)[O-])[O-])[O-])[O-]")
+smiles(R"O=[Se](O)O")
+smiles(R"O=S(=O)(C)C")
+smiles(R"O=S(=O)(C[C@@H](C(=O)[O-])OP(=O)([O-])[O-])[O-]")
+smiles(R"[O-]S(=O)[O-]")
+smiles(R"O=S(=O)([O-])CCO")
+smiles(R"O=S(=O)([O-])OC")
+smiles(R"[O-]S(=O)(=O)SSS(=O)(=O)[O-]")
+smiles(R"O=[Te](O)O")
+smiles(R"O=[W](=O)([O-])[O-]")
+smiles(R"P1(=O)(OC(CO1)CO)[O-]")
+smiles(R"P1(=O)(O[C@@H]2[C@H](O[C@H]([C@@H]2O)n2cnc3c2ncnc3N)COP(=O)(O[C@@H]2[C@H](O[C@H]([C@@H]2O)n2cnc3c2ncnc3N)CO1)[O-])[O-]")
+smiles(R"P1(=O)(O[C@@H]2[C@H](O[C@H]([C@@H]2O)n2cnc3c2ncnc3N)COP(=O)(O[C@@H]2[C@H](O[C@H]([C@@H]2O)n2cnc3c2nc([nH]c3=O)N)CO1)[O-])[O-]")
+smiles(R"P1(=O)(O[C@@H]2[C@H](O[C@H]([C@@H]2O)n2cnc3c2nc([nH]c3=O)N)COP(=O)(O[C@@H]2[C@H](O[C@H]([C@@H]2O)n2cnc3c2nc([nH]c3=O)N)CO1)[O-])[O-]")
+smiles(R"P(=O)(C[C@H](C)O)([O-])O")
+smiles(R"P(=O)(CC(=O)[O-])([O-])O")
+smiles(R"P(=O)(Oc1ccc(cc1)[N+](=O)[O-])([O-])[O-]")
+smiles(R"P(=O)(OC/C=C/1\S[C@@H](N=C1C)C(=O)[O-])([O-])[O-]")
+smiles(R"P(=O)(OCCc1sc(nc1C)C(=O)[O-])([O-])[O-]")
+smiles(R"P(=O)(OCCc1scnc1C)([O-])[O-]")
+smiles(R"P(=O)(OC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)\C)\C)(OP(=O)([O-])[O-])[O-]")
+smiles(R"P(=O)(OC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)(OP(=O)([O-])[O-])[O-]")
+smiles(R"P(=O)(OC(C)C)(OC(C)C)F")
+smiles(R"P(=O)(OCC(C(=O)[O-])[NH3+])(OCC[NH3+])[O-]")
+smiles(R"P(=O)(OC(=C)C(=O)[O-])([O-])C(=O)[O-]")
+smiles(R"P(=O)(OC(=C)C(=O)[O-])([O-])[O-]")
+smiles(R"P(=O)(OCC(C=O)O)([O-])[O-]")
+smiles(R"P(=O)(OC[C@H]1O[C@@H](n2c3c(nc2)c(ncn3)N)[C@@H]([C@@H]1O)O)(Nc1c(cccc1)C(=O)[O-])[O-]")
+smiles(R"P(=O)(OC[C@H]([C@](CO)(O)C)O)([O-])[O-]")
+smiles(R"P(=O)(OC[C@H]([C@H]([C@@H]([C@H](C(=O)[O-])O)O)O)O)([O-])[O-]")
+smiles(R"P(=O)(OC[C@H]([C@H]([C@H](CO)O)O)O)([O-])[O-]")
+smiles(R"P(=O)(OC[C@@H]([C@H](C(=O)[C@@H](C(=O)[O-])O)O)O)([O-])[O-]")
+smiles(R"P(=O)(OC[C@H]([C@@H](C(=O)[O-])[NH3+])O)([O-])[O-]")
+smiles(R"P(=O)(OC[C@H](COC/C=C(/CC/C=C(\C)/CC/C=C(/CCC=C(C)C)\C)\C)OC/C=C(/CC/C=C(\C)/CC/C=C(/CCC=C(C)C)\C)\C)(OC[C@@H](C(=O)[O-])[NH3+])[O-]")
+smiles(R"P(=O)(OC[C@H](COC/C=C(/CC/C=C(\C)/CC/C=C(/CCC=C(C)C)\C)\C)OC/C=C(/CC/C=C(\C)/CC/C=C(/CCC=C(C)C)\C)\C)([O-])[O-]")
+smiles(R"P(=O)(OC[C@H](COC/C=C(/CC/C=C(\C)/CC/C=C(/CCC=C(C)C)\C)\C)OC/C=C(/CC/C=C(\C)/CC/C=C(/CCC=C(C)C)\C)\C)(OP(=O)(OC[C@H]1O[C@@H](n2c(=O)nc(cc2)N)[C@@H]([C@@H]1O)O)[O-])[O-]")
+smiles(R"P(=O)(OC[C@H](C=O)O)([O-])[O-]")
+smiles(R"P(=O)(OC[C@@H](O)[C@@H](O)[C@H](Cn1c2c(nc3c1cc(c(c3)C)C)c(=O)[n-]c(=O)n2)O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c2c(nc1)c(ncn2)N)[O-])[O-]")
+smiles(R"P(=O)(OC[C@@H](O)[C@@H](O)[C@H](Cn1c2c([nH]c3c1cc(c(c3)C)C)c(=O)[nH]c(=O)[nH]2)O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1O)O)n1c2c(nc1)c(ncn2)N)[O-])[O-]")
+smiles(R"P(=O)(OCC[NH3+])([O-])OCC(O)CO")
+smiles(R"P(=O)([O-])(CCO)O")
+smiles(R"P(=O)(O[C@H]1[C@H]([C@H](OC(=C)C(=O)[O-])CC(=C1)C(=O)[O-])O)([O-])[O-]")
+smiles(R"P(=O)(O[C@@H]([C@@H](C(=O)[O-])NC(=O)CCCCCCSSCCS(=O)(=O)[O-])C)([O-])[O-]")
+smiles(R"P(=O)(OC(=O)C(C)C)([O-])[O-]")
+smiles(R"P(=O)(OC(=O)CCC)([O-])[O-]")
+smiles(R"P(=O)(OC(=O)[C@@H](COP(=O)([O-])[O-])O)([O-])[O-]")
+smiles(R"P(=O)(OC(=O)N)([O-])[O-]")
+smiles(R"P(=O)([O-])[O-]")
+smiles(R"P(=O)([O-])(O)C")
+smiles(R"P(=O)([O-])(OC[C@H](COCCC(CCCC(CCCC(CCCC(C)C)C)C)C)OCCC(CCCC(CCCC(CCCC(C)C)C)C)C)[O-]")
+smiles(R"P(=O)([O-])(OC[C@@H](C(=O)[O-])[NH3+])OC[C@@H](CO)O")
+smiles(R"P(=O)([O-])(O)CO")
+smiles(R"P(=O)([O-])(O)[O-]")
+smiles(R"P(=O)(OP(=O)(OC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)[O-])([O-])[O-]")
+smiles(R"P(=O)(OP(=O)(OC/C=C(/[CH])\C)[O-])([O-])[O-]")
+smiles(R"P(=O)(OP(=O)([O-])OC/C=C(\CC/C=C(/CCC=C(C)C)\C)/C)([O-])[O-]")
+smiles(R"P(=O)(OP(=O)([O-])[O-])([O-])OC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CC/C=C(/CCC=C(C)C)\C)\C)\C)\C)\C)\C)\C)\C)\C)\C")
+smiles(R"P(=[SeH])(O)([O-])[O-]")
+smiles(R"[S]")
+smiles(R"s1c(ccc1C#CC(COC(=O)C)OC(=O)C)c1sccc1")
+smiles(R"S1CC(=NCC1)C(=O)[O-]")
+smiles(R"S1CC([NH2+]CC1)C(=O)[O-]")
+smiles(R"S1C(=NC(=O)[CH-]1)c1nc2c(s1)cc(cc2)O")
+smiles(R"[S+](C)(C)C")
+smiles(R"S(CCCC(=O)C(=O)[O-])C")
+smiles(R"S(C[C@H]([C@H](C(=O)COP(=O)([O-])[O-])O)O)C")
+smiles(R"SC[C@@H]([C@@H](CS)O)O")
+smiles(R"S(C[C@@H](C(=O)[O-])[NH3+])S(=O)(=O)[O-]")
+smiles(R"SCCNC(=O)CCNC(=O)[C@H](O)C(C)(C)COP(=O)([O-])[O-]")
+smiles(R"SCC(=O)[O-]")
+smiles(R"S(CCS(=O)(=O)[O-])C[C@@H](O)C")
+smiles(R"S(CCS(=O)(=O)[O-])C[C@H](O)C")
+smiles(R"S(CCS(=O)(=O)[O-])CC(=O)C")
+smiles(R"[S-]C#N")
+smiles(R"S(C(=O)CC(=O)CCCCCCCCCCCCCCCCCCC)CCNC(=O)CCNC(=O)[C@@H](C(COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1OP(=O)([O-])[O-])O)n1c2c(nc1)c(ncn2)N)[O-])[O-])(C)C)O")
+smiles(R"S(C(=O)CC(=O)OC)CCNC(=O)CCNC(=O)C(C(COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1OP(=O)([O-])[O-])O)n1c2c(nc1)c(ncn2)N)[O-])[O-])(C)C)O")
+smiles(R"S(C(=O)C(=S)CCC(=O)[O-])CCNC(=O)CCNC(=O)C(C(COP(=O)(OP(=O)(OC[C@H]1O[C@H]([C@@H]([C@@H]1OP(=O)([O-])[O-])O)n1c2c(nc1)c(ncn2)N)[O-])[O-])(C)C)O")
+smiles(R"[SeH2]")
+smiles(R"[SeH]SC[C@H](NC(=O)CC[C@H]([NH3+])C(=O)[O-])C(=O)NCC(=O)[O-]")
+smiles(R"[Se](=O)(=O)(O)O")
+smiles(R"[SH-]")
+smiles(R"S(=O)(CCNC(=[NH2+])N)[O-]")
+smiles(R"S(=O)(CCNC(=[NH2+])NP(=O)([O-])[O-])[O-]")
+smiles(R"S(=O)(=O)(C[C@H](C(=O)[O-])O)[O-]")
+smiles(R"S(=O)(=O)(CC[NH2+][C@@H](C(=O)[O-])C)[O-]")
+smiles(R"S(=O)(=O)(CCSC)[O-]")
+smiles(R"S(=O)(=O)(CCS)[O-]")
+smiles(R"S(=O)(=O)(C)[O-]")
+smiles(R"S(=O)(=O)([O-])[O-]")
+smiles(R"S(=O)(=O)([O-])SS(=O)(=O)[O-]")
+smiles(R"S(=O)(=O)(S)[O-]")
+smiles(R"[Te](=O)(=O)(O)C")
+smiles(R"[Zn+2]")
diff --git a/test/py/smiles/smiles.py b/test/py/smiles/smiles.py
new file mode 100644
index 0000000..ba44929
--- /dev/null
+++ b/test/py/smiles/smiles.py
@@ -0,0 +1,52 @@
+config.graph.useWrongSmilesCanonAlg = False
+config.graph.isomorphismAlg = Config.IsomorphismAlg.Canon
+
+config.graph.ignoreStereoInSmiles = True
+config.graph.printSmilesParsingWarnings = False
+#config.canon.printStats = True
+include("problematic.py")
+include("smiles_cansmi_roundtrip.py")
+include("smiles_nci.py")
+#include("rhea.py")
+
+if not "n" in globals():
+	n = 100
+print("Permutations:", n)
+
+gCopy = list(inputGraphs)
+print("Processing %d graphs" % len(inputGraphs))
+for a in gCopy:
+	print("Processing graph", a.id, "with smiles \"", end="")
+	print(a.smiles + "\"")
+	b = smiles(a.smiles)
+	inputGraphs[:] = [] # let's not keep the copies around, just for good measure
+	if a.isomorphism(b) != 1:
+		print("ERROR: smiles does not represent same molecule")
+		print("a.smiles =", a.smiles)
+		print("b.smiles =", b.smiles)
+		a.name = "a"
+		b.name = "b"
+		graphLike = GraphPrinter()
+		molLike = GraphPrinter()
+		graphLike.withIndex = True
+		molLike.setMolDefault()
+		molLike.withIndex = True
+		a.print(graphLike, molLike)
+		b.print(graphLike, molLike)
+		sys.exit(1)
+	for i in range(1, n):
+		aPerm = a.makePermutation()
+		if a.smiles != aPerm.smiles:
+			print("ERROR:")
+			print(a.smiles)
+			print("!=")
+			print(aPerm.smiles)
+			a.name = "a"
+			aPerm.name = "aPerm"
+			a.print()
+			aPerm.print()
+			sys.exit(1)
+		ls = LabelSettings(LabelType.String, LabelRelation.Isomorphism)
+		if a.isomorphism(aPerm, labelSettings=ls) != 1:
+			print("ERROR in canonicalisation compare")
+			sys.exit(1)
diff --git a/test/py/smiles/smilesToDimacs.py b/test/py/smiles/smilesToDimacs.py
new file mode 100644
index 0000000..de53144
--- /dev/null
+++ b/test/py/smiles/smilesToDimacs.py
@@ -0,0 +1,27 @@
+old_smiles = smiles
+graphs = []
+def smiles(s):
+	g = old_smiles(s)
+	if any(g.isomorphism(a) for a in graphs):
+		return
+	graphs.append(g)
+
+config.graph.ignoreStereoInSmiles = True
+config.graph.printSmilesParsingWarnings = False
+include("smiles_cansmi_roundtrip.py")
+include("smiles_nci.py")
+include("problematic.py")
+include("rhea.py")
+
+graphs = sorted(graphs, key=lambda a: (a.numVertices, a.numEdges))
+i = 1
+for g in graphs:
+	with open("out/mol_%04d.dimacs" % i, 'w') as f:
+		f.write("p edge %d %d\n" % (g.numVertices, g.numEdges))
+		for v in g.vertices:
+			f.write("n %d %d\n" % (v.id + 1, v.atomId))
+		for e in g.edges:
+			f.write("e %d %d\n" % (e.source.id + 1, e.target.id + 1))
+	i += 1
+
+
diff --git a/test/py/smiles/smiles_cansmi_roundtrip.py b/test/py/smiles/smiles_cansmi_roundtrip.py
new file mode 100644
index 0000000..bb53315
--- /dev/null
+++ b/test/py/smiles/smiles_cansmi_roundtrip.py
@@ -0,0 +1,4454 @@
+smiles(R"[B@]123[C@@]45[B@]67[B@@]89[C@]1(B2468)B3579")
+smiles(R"[BH3-][N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"[BH3-][N+]12CN3CN(CN(C3)C2)C1")
+smiles(R"[Br-]")
+smiles(R"Br[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"Br[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"Br[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(Br)C6=C12")
+smiles(R"Br[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(Br)C6=C12")
+smiles(R"Br[C@]12CC[C@H](CC1)[C@]1(Br)CC[C@H]2CC1")
+smiles(R"Br[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Br[C@]1(Br)[C@]23CCCC[C@@]13CC=CC2")
+smiles(R"Br[C@]1(Br)[C@@H]2CCC=CCC[C@H]12")
+smiles(R"Br[C@]1(Br)[C@@H]2CCCCCC[C@H]12")
+smiles(R"Br[C@@]1(Br)[C@H]2CCCC[C@@H]12")
+smiles(R"Br[C@]1(Br)[C@@H]2C[C@H]3[C@H](C[C@H]12)[C@H]1C[C@H]2[C@H](C[C@H]31)[C@]2(Br)Br")
+smiles(R"Br[C@]1(Br)[C@H]2COCOC[C@@H]12")
+smiles(R"Brc1c2c3ccccc3ccn2c2nc3ccccc3nc12")
+smiles(R"Brc1c2nsnc2c(Br)c2nsnc12")
+smiles(R"BrC1=C(Br)[C@@]2(Br)CC[C@]1(Br)[C@@]2(Br)Br")
+smiles(R"Brc1cc2ccccc2c2c3c4ccccc4cc(Br)c3c3c(Br)cc4ccccc4c3c3c(c(Br)cc4ccccc34)c12")
+smiles(R"Brc1cc2cc(C(=O)Nc3scc(n3)[C@@]34C[C@H]5C[C@H](C[C@H](C5)C4)C3)c(=O)oc2c(Br)c1")
+smiles(R"Brc1cc(Br)cc(/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)c1")
+smiles(R"Brc1ccc2c3nc4cc(ccc4nc3c3cccc1c23)C(F)(F)F")
+smiles(R"Brc1ccc2c(c1)nc1C(=O)c3cccnc3c3nccc2c13")
+smiles(R"Brc1ccc2nc3C(=O)c4cccnc4c4nccc(c34)c2c1")
+smiles(R"Brc1ccc2N(C)C(=O)/C(=c/3\sc4nc5ccccc5n4c3=O)/c2c1")
+smiles(R"Brc1ccc2NC(=O)/C(=c\3/sc4nc5ccccc5n4c3=O)/c2c1")
+smiles(R"Brc1ccc2[nH]cc(/C=N/NC(=S)N[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c2c1")
+smiles(R"Brc1cc(cc2c1c1c(cc(cc1C2=O)[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"Brc1cccc(c1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Brc1ccc(cc1)C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Brc1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Brc1ccccc1/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Brc1ccc(cc1)C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)c3ccc(Br)cc3)C6=C12")
+smiles(R"Brc1ccc(cc1)C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)c3ccc(Br)cc3)C6=C12")
+smiles(R"Brc1ccc(cc1)C(=O)[C@@]12S[C@H](C(=O)c3ccc(Br)cc3)[C@@H](S[C@]2(S[C@@H](C(=O)c2ccc(Br)cc2)[C@H](S1)C(=O)c1ccc(Br)cc1)C(=O)c1ccc(Br)cc1)C(=O)c1ccc(Br)cc1")
+smiles(R"Brc1ccc(cc1)C(=O)/C=c/1\[nH]c2ccccc2nc1N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Brc1cccc(c1)C(=O)CCN1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"Brc1ccc(cc1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Brc1ccc(cc1)N1C[C@H](O)CN(C[C@H](O)C1)c1ccc(Br)cc1")
+smiles(R"Brc1ccc(cc1)N1C[C@@H](OC(=O)C)CN(C[C@@H](OC(=O)C)C1)c1ccc(Br)cc1")
+smiles(R"Brc1ccc(cc1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"Brc1ccc(cc1)/N=C\1/C(C)(C)/C(=N\c2ccc(Br)cc2)/[C@]1(C)C")
+smiles(R"Brc1ccc(cc1)S(=O)(=O)OC[C@H]1C[C@@H]2CC[C@H]1CC2")
+smiles(R"Brc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"Brc1cccc(/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)c1")
+smiles(R"Brc1ccc(c(O)c1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Brc1ccc(nc1)NC(=S)N[C@@]12C[C@@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Brc1cc(/C=N\C[C@@H]2CC[C@@H](C/N=C\c3cc(Br)cc(Br)c3O)CC2)c(O)c(Br)c1")
+smiles(R"Brc1ccc(N/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)cc1")
+smiles(R"Brc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(O)c(Br)c1")
+smiles(R"Brc1ccc(O)c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"Brc1ccc(s1)c1ccc2nnnn2n1")
+smiles(R"BrC1=C[C@@H]2[C@H](C1=O)[C@H]1[C@H]3CC[C@H]3[C@]2(Br)[C@]21OCCO2")
+smiles(R"BrC1=C(N2CC2)C(=O)C2=C(C1=O)[C@H]1c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"Br[C-]1C(=[O+][Ru+3]23([O+]=C1C)([O+]=C(C)[C-](Br)C(=[O+]2)C)[O+]=C(C)[C-](Br)C(=[O+]3)C)C")
+smiles(R"Brc1sc(N2CC[C@@H](CC2)c2ccccc2)c2C(=O)C[C@H](NC(=O)C(F)(F)F)c12")
+smiles(R"BrC[C@]1(C)CO[C@](OC1)(C1CCCCC1)c1ccccc1")
+smiles(R"BrC[C@]1(C)CO[C@@](OC1)(c1ccccc1)c1cccs1")
+smiles(R"Br/C=C(\Br)/C(=C\Br)/Br")
+smiles(R"Br/C=C(\Br)/C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"BrCC[C@@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"BrCC[C@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"Br/C=C/C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"BrC(=C)C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"BrC(=C)C[N+]12CN3CN(CN(C3)C2)C1")
+smiles(R"BrCC[N@@+]12CC[N@@+](CCBr)(CC1)C2")
+smiles(R"BrCC[N@+]12CC[N@+](CCBr)(CC1)C2")
+smiles(R"BrCC(=O)[C@H](OC(=O)C)[C@@H](OC(=O)C)[C@@H](OC(=O)C)C(=O)CBr")
+smiles(R"BrCC(=O)N1CC[C@]2(CC1)SS[C@@]1(CCN(CC1)C(=O)CBr)S2")
+smiles(R"BrCC(=O)/N=n\1/c2ccccc2nc2c1c1cccc3cccc2c13")
+smiles(R"BrCC(=O)/N=n\1/c2ccc(cc2nc2c1c1cccc3cccc2c13)C(F)(F)F")
+smiles(R"BrCC(=O)/N=n\1/c2ccc(cc2nc2c1c1cccc3ccc(OC)c2c13)C(F)(F)F")
+smiles(R"BrCC(=O)/N=n\1/c2ccccc2nc2c3c(OC)ccc4cccc(c34)c12")
+smiles(R"BrCC(=O)/N=n\1/c2ccc(C)cc2nc2c1c1cccc3cccc2c13")
+smiles(R"BrCC(=O)/N=n\1/c2ccc(C)cc2nc2c3c(OC)ccc4cccc(c34)c12")
+smiles(R"BrCC(=O)/N=n\1/c2ccc(Cl)cc2nc2c1c1cccc3cccc2c13")
+smiles(R"BrCC(=O)/N=n\1/c2ccc(Cl)cc2nc2c3c(OC)ccc4cccc(c34)c12")
+smiles(R"BrCC(=O)/N=n\1/c2ccc(OC)cc2nc2c1c1cccc3cccc2c13")
+smiles(R"Br[C@@H]1CC2(OCCO2)[C@@H](Br)C[C@]21OCCO2")
+smiles(R"Br[C@H]1CCCCC[C@@]21OCCO2")
+smiles(R"Br[C@@H]1CCCCC[C@H](Br)[C@]21OCCO2")
+smiles(R"Br[C@@H]1CCCCC[C@H](Br)[C@@]21OCCO2")
+smiles(R"Br[C@@H]1CCCC[C@H](Br)[C@]21OCCO2")
+smiles(R"Br[C@@H]1CC[C@@H]2[C@H](CC[C@H](Br)[C@]32OCCO3)[C@@]21OCCO2")
+smiles(R"Br[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"Br[C@H]1C[C@@H](Br)[C@@H]2O[C@@](C)(C)O[C@H]12")
+smiles(R"Br[C@H]1C[C@@](Sc2ccccc2)(C[C@@H]1Br)S(=O)(=O)c1ccccc1")
+smiles(R"Br[C@H]1[C@@H]2CC[C@@H](CC2)[C@H]1Br")
+smiles(R"Br[C@@H]1[C@H](Br)[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)[C@]2(Cl)Cl)Cl")
+smiles(R"Br[C@@H]1[C@H](Br)[C@@H](Br)[C@H](Br)[C@H](Br)[C@H]1Br")
+smiles(R"Br[C@H]1CN2C[C@@H](Br)CN2C1")
+smiles(R"Br[C@@H](C(=O)/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)c1ccccc1")
+smiles(R"Br[C@@H](C(=O)/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)c1ccccc1")
+smiles(R"Br[C@H](C[S@@](=O)(=O)C[C@H](Br)c1ccccc1)c1ccccc1")
+smiles(R"Br[Co@@](Br)(/[O+]=C\1/CCCN1)/[O+]=C\1/CCCN1")
+smiles(R"Br[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Br[Ni]123(Br)[N@+]4(CC[N@+]1(CC[N@+]3(CC[N@@+]2(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1")
+smiles(R"[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(B([C@@-]34C5=C7C8=C3[Fe+2]39%10%114578[C-]4C%10=C9C3=C%114)[C@@-]34C5=C7C8=C3[Fe+2]39%10%114578[C-]4C%10=C9C3=C%114)C6=C12")
+smiles(R"[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)B([C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)B([C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[C@H+]([C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[C-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[CH+]([C@@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C12=C3C4=C5[C@@H]1[Co]16782345C2=C6C7=C1[C@@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Fe]16782345C2=C6C7=C1[C@@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Fe+]16782345C2=C6C7=C1[C@@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Fe+]16782345C2=C6C7=C1[C@H]82")
+smiles(R"C12=C3C4=C5[C@H]1[Fe+]16782345C2=C6C7=C1[C@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Fe]16782345C2=C7[C@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Fe]16782345C2=C7[C@@]8(C6=C12)[Ge]([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Fe]16782345C2=C7[C@@]8(C6=C12)[Pb]([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Fe]16782345C2=C7[C@@]8(C6=C12)[Si]([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Mn]16782345C2=C6C7=C1[C@@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Ni]16782345C2=C6C7=C1[C@@H]82")
+smiles(R"C12=C3C4=C5[C@@H]1[Ru]16782345C2=C6C7=C1[C@@H]82")
+smiles(R"c1cc2cccc3[C@H]4[C@@H](c(c1)c23)[C@H]1c2cccc3cccc([C@@H]41)c23")
+smiles(R"C1C[C@]2(CC[C@@H]1C2)[N+]#[C-][Mn+]([C-]#[N+][C@]12CC[C@H](CC1)C2)([C-]#[N+][C@]12CC[C@H](CC1)C2)([C-]#[N+][C@@]12CC[C@@H](CC1)C2)([C-]#[N+][C@@]12CC[C@@H](CC1)C2)[C-]#[N+][C@@]12CC[C@@H](CC1)C2")
+smiles(R"C1C[C@@]2(CC[C@H]1C2)[N+]#[C-][Mn+]([C-]#[N+][C@@]12CC[C@@H](CC1)C2)([C-]#[N+][C@@]12CC[C@@H](CC1)C2)([C-]#[N+][C@]12CC[C@H](CC1)C2)([C-]#[N+][C@@]12CC[C@@H](CC1)C2)[C-]#[N+][C@@]12CC[C@@H](CC1)C2")
+smiles(R"C1C[C@]2(CO2)CC[C@]21CO2")
+smiles(R"c1cc2ncc3cccc4ncc(c1)c2c34")
+smiles(R"c1cc2nnc3cccc4nnc(c1)c2c34")
+smiles(R"c1cc2onc3c4cccc5onc(c(c1)c23)c45")
+smiles(R"C1CC[C@]23CCCC[C@]3(C1)O2")
+smiles(R"C1=CC=C23[C@H]4C5=C6[Fe]789%10245([C@H]2C9=C8C7=C%102)C36=C1")
+smiles(R"c1ccc2=c3ccc4c5c3c(=c2c1)ccc5c1ccc2=c3ccccc3=c3ccc4c1c23")
+smiles(R"c1ccc2=c3ccccc3=c2c1") # smiles(R"c1ccc2C3=NC4=NC(=NC5=NC(=NC6=NC(=NC(=N3)c2c1)c1ccccc61)c1ccccc51)c1ccccc41")
+smiles(R"c1ccc2c(c1)c1nc3cc4nc5c(nc4cc3nc1c1ccccc21)c1ccccc1c1ccccc51")
+smiles(R"c1ccc2c(c1)c1oc3cccc4c3c3c1c1c(cccc21)oc3c1ccccc41")
+smiles(R"c1ccc2c(c1)cc1ccc3cc4ccccc4c4nnc2c1c34")
+smiles(R"c1ccc2c(c1)ccc1cc3cc4cc5c(ccc6ccccc56)cc4cc3cc21")
+smiles(R"c1ccc2c(c1)ccc1cc3c(cc21)c1ccccc1c1ccccc31")
+smiles(R"c1ccc2c(c1)ccc1ccc3ccc4ccc5ccccc5c4c3c21")
+smiles(R"c1ccc2c(c1)ccc1c[n+]3c(ccc4ccccc34)cc21")
+smiles(R"c1ccc2c(c1)ccc1nc3c4cccc5cccc(c3nc21)c45")
+smiles(R"c1ccc2c(c1)ccc1nc3c(nc21)c1ccccc1c1ccccc31")
+smiles(R"c1ccc2c(c1)ccc1OCN(Cc21)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"C1CC[C@@]2(CC1)CCN(CC2)c1ccc(/C=N/c2ccc3ccccc3c2)cc1")
+smiles(R"c1ccc2c(c1)[C@@H]1CCCC[C@H]2c2ccccc12")
+smiles(R"c1ccc2c(c1)[C@H]1CCC[C@@H]2c2ccccc12")
+smiles(R"c1ccc2c(c1)[C@@H]1[C@H]3c4ccccc4[C@H](c4ccccc34)[C@H]2c2ccccc12")
+smiles(R"c1ccc2c(c1)[C@@H]1[C@@H]3COC[C@@H]3[C@H]2c2ccccc12")
+smiles(R"c1ccc2c(c1)[C@H]1[C@@H]3O[C@@H]3[C@@H]2c2ccccc12")
+smiles(R"c1ccc2c(c1)[C@@H]1N[C@H]2c2ccccc12")
+smiles(R"c1ccc2c(c1)[C@@H]1O[C@H]2c2ccccc12")
+smiles(R"c1ccc2c(c1)CN1Cc3ccccc3[C@@H]2C1")
+smiles(R"c1ccc2c(c1)[nH]c1cc3c(cc21)[nH]c1ccccc31")
+smiles(R"c1ccc2c(c1)[nH]c1c[n+]3c(c[n+]21)[nH]c1ccccc31")
+smiles(R"c1ccc2c(c1)oc1ccc3nsnc3c21")
+smiles(R"c1ccc2c(c1)Oc1ccccc1[C@]12S[C@@]21c1ccccc1Oc1ccccc21")
+smiles(R"c1ccc2c(c1)OC[C@@]12CC[C@]2(OCCO2)C=C1")
+smiles(R"C1CC[C@@]2(CC1)O[C@@H]1[C@@H](O[C@H]3O[C@H]4CO[C@]5(CCCCC5)O[C@H]4[C@H]4O[C@]5(CCCCC5)O[C@H]34)O[C@H]3CO[C@@]4(CCCCC4)O[C@H]3[C@H]1O2")
+smiles(R"c1ccc2c(c1)Sc1nccc3ccnc2c13")
+smiles(R"C1=CC=c2cc3C=c4ccccc4=c3cc2C1")
+smiles(R"c1ccc2cc3c(ccc4c3ccc3ccccc43)cc2c1")
+smiles(R"c1ccc2cc3c(ccc4c[n+]5ccccc5cc34)c[n+]2c1")
+smiles(R"c1ccc2Cc3cc(ccc3c2c1)/N=C\1/CC/C(=N\c2ccc3c(c2)Cc2ccccc32)/CC1")
+smiles(R"c1ccc2Cc3ccccc3C(=C[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)c2c1")
+smiles(R"c1ccc2Cc3ccccc3C(=C[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)c2c1")
+smiles(R"c1ccc2cc3[nH]c4cc5ccccc5cc4[nH]c3cc2c1")
+smiles(R"c1ccc2cc3n[se]nc3cc2c1")
+smiles(R"c1ccc2cc3oc4cc5ccccc5cc4c3cc2c1")
+smiles(R"c1ccc2ccc3c4ccc5ccccc5c4ccc3c2c1")
+smiles(R"c1ccc2ccc3cc4c(ccc5ccccc45)cc3c2c1")
+smiles(R"C1CCc2ccc3cc4c(ccc5ccccc45)cc3c2C1")
+smiles(R"c1ccc2ccc3c(ccc4sc5ccccc5[n+]34)c2c1")
+smiles(R"C1CCc2ccc3c[n+]4c(ccc5ccccc45)n3c2C1")
+smiles(R"c1ccc2ccc3n4c(ccc5ccccc45)c[n+]3c2c1")
+smiles(R"c1ccc2C=C/C(=C\[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)/c2c1")
+smiles(R"c1ccc2C=C/C(=C\[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)/c2c1")
+smiles(R"C1CC[C@]2(CCCC[C@H]2C1)CC[C@]12CCCC[C@@H]2CCCC1")
+smiles(R"c1ccc2ccc(/N=C/[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)cc2c1")
+smiles(R"c1ccc2ccc(/N=C/[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)cc2c1")
+smiles(R"c1ccc2ccc(N/N=C/[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)nc2c1")
+smiles(R"c1ccc2ccc(N/N=C/[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)nc2c1")
+smiles(R"c1ccc2C[C@H]3[C@@H](Cc2c1)[C@H]1c2ccccc2[C@@H]3c2ccccc12")
+smiles(R"c1ccc2c(n1)ccc1nc3c(ccc4ncccc34)nc21")
+smiles(R"c1ccc2C=[N+]3CCC[O+]4[Cu@@]3(Oc2c1)[O+]1CCC[N+]2=Cc3ccccc3O[Cu@]412")
+smiles(R"c1ccc2cnc3cc4c(ncc5ccccc45)cc3c2c1")
+smiles(R"c1ccc2nc3c(nc2c1)c1cccc2cccc3c12")
+smiles(R"c1ccc2nc3c(sc4nc5ccccc5n34)nc2c1")
+smiles(R"c1ccc2ncc3cc4c(cc3c2c1)[nH]c1ccccc41")
+smiles(R"c1ccc2ncn(C[C@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)c2c1")
+smiles(R"c1ccc2ncn(C[C@@-]34C5=C6C7=C3[Fe+2]389%104567[C-]4C9=C8C3=C%104)c2c1")
+smiles(R"c1ccc2nc(sc2c1)NC(Nc1nc2ccccc2s1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1ccc2nc(SSN3C[C@@H]4CC[C@@H](CC4)C3)sc2c1")
+smiles(R"c1ccc2[nH]c3c4cc5ccccc5n4ccc3c2c1")
+smiles(R"c1ccc2[nH]/c(=c\3/[nH]c4ccccc4[se]3)/[se]c2c1")
+smiles(R"c1ccc2[nH]cc(CC/N=C/[C@]34C5=C6C7=C3[Fe]389%104567[C@H]4C9=C8C3=C%104)c2c1")
+smiles(R"c1ccc2[n-]n3c4ccc5[nH]onc5c4n[n+]3c2c1")
+smiles(R"c1ccc2[n-]n3c4ccc5nonc5c4n[n+]3c2c1")
+smiles(R"c1ccc2nnn(C[C@@]34C5=C6C7=C3[Fe]389%104567[C@H]4C9=C8C3=C%104)c2c1")
+smiles(R"c1ccc2n[se]nc2c1")
+smiles(R"c1ccc2nsnc2c1")
+smiles(R"c1ccc2oc3cc4c(cc3c2c1)n1nnnc1c1cccn41")
+smiles(R"c1ccc2oc3cc4c(ncc5cccn45)cc3c2c1")
+smiles(R"c1ccc2oc3cc4c(nnc5cccn45)cc3c2c1")
+smiles(R"c1ccc2Sc3ccccc3N(C[C@H]3CN4CC[C@@H]3CC4)c2c1")
+smiles(R"c1ccc2Sc3ccccc3N([C@H]3CN4CC[C@H]3CC4)c2c1")
+smiles(R"C1CCC(C1)CC[N@@+]12CC[N@@+](CCC3CCCC3)(CC1)C2")
+smiles(R"c1ccc(cc1)[AsH](c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"c1ccc(cc1)[C@@]12c3ccccc3[C@H]2c2ccccc12")
+smiles(R"c1ccc(cc1)[C@]12CN(Cc3ccccc13)Cc1ccccc21")
+smiles(R"c1ccc(cc1)c1c2ccc3ccccc3c2cc2ccc3ccccc3c12")
+smiles(R"c1ccc(cc1)c1ccc2c(c1)c1nc3ccccc3nc1c1ccccc21")
+smiles(R"c1ccc(cc1)c1ccc(c2ccccc2)p1c1ccccc1")
+smiles(R"c1ccc(cc1)C1=C(N=c2ccccc2=c2ccccc2=N1)c1ccccc1")
+smiles(R"c1ccc(cc1)c1cnn2nnnc2n1")
+smiles(R"c1ccc(cc1)c1cnnc2c3c(nnc(c4ccccc4)c3c3ccccc3)nn12")
+smiles(R"c1ccc(cc1)c1c(nn(c2ccccc2)c2=c3ccccc3=CSc12)c1ccccc1")
+smiles(R"c1ccc(cc1)c1nc2cc3c(cc2n2cccc12)oc1ccccc31")
+smiles(R"c1ccc(cc1)c1n[n+](c2ccccc2c2ccccc2)n(n1)c1ccccc1")
+smiles(R"c1ccc(cc1)c1nnn(CCn2nnc(n2)c2ccccc2)n1")
+smiles(R"c1ccc(cc1)c1nnnn1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"c1ccc(cc1)c1nnn(n1)c1ccccc1")
+smiles(R"c1ccc(cc1)c1nnn(n1)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"c1ccc(cc1)C1=NNN(N1)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C1CCC(CC1)c1nnnn1C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C1CCC(CC1)c1nnnn1C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"c1ccc(cc1)c1nnn(n1)n1nnc(n1)c1ccccc1")
+smiles(R"c1ccc(cc1)c1sc(c2ccccc2)c2c1nn1ccc3ccccc3c21")
+smiles(R"c1ccc(cc1)c1sc(c2ccccc2)c2[C@@H](c3ccccc3)c3c(sc(c4ccccc4)c3[C@@H](c3ccccc3)c12)c1ccccc1")
+smiles(R"c1ccc(cc1)C[C@@]12N=N[C@@](Cc3ccccc3)([C@@H]3C=C[C@H]13)[C@@H]1C=C[C@H]21")
+smiles(R"c1cc(ccc1/C=C/[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)/C=C/[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"c1ccc(cc1)C#Cc1c2ccccc2c(C#Cc2ccccc2)c2oc3c(ccc4ccccc34)c12")
+smiles(R"c1ccc(cc1)/C=C/c1nnnn1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"c1ccc(cc1)C[C@H]1N[C@H](Cc2ccccc2)N2[C@H](Cc3ccccc3)N12")
+smiles(R"c1ccc(cc1)CC[N@@+]12CC[N@@+](CCc3ccccc3)(CC1)C2")
+smiles(R"c1ccc(cc1)CC[N@+]12CC[N@+](CCc3ccccc3)(CC1)C2")
+smiles(R"c1ccc(cc1)CC[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"c1ccc(cc1)/C(=C(\N=N\C(c1ccccc1)(c1ccccc1)c1ccccc1)/c1ccccc1)/N=N\C(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"c1ccc(cc1)C#C[Ti]12345678(C#Cc9ccccc9)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@H]81")
+smiles(R"c1ccc(cc1)[C@@H]1c2cccc3[C@@H](c4ccccc4)c4cccc5c4[C@@H](c23)c2c1cccc2[C@H]5c1ccccc1")
+smiles(R"C1CCC(CC1)[C@@H]1CC[C@H](CC1)C1CCCCC1")
+smiles(R"C1CCC(CC1)[C@H]1CC[C@@H](CC1)N1CCCCC1")
+smiles(R"c1ccc(cc1)[C@@H]1[C@@H](c2ccccc2)[C@H](c2ccccc2)[C@H]1c1ccccc1")
+smiles(R"c1ccc(cc1)[C@@H]1[C@@H](c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"c1ccc(cc1)[C@@H]1[C@H](c2ccnc3c4ccccc4ccc23)[C@@H](c2ccccc2)[C@H]1c1ccnc2c1ccc1ccccc21")
+smiles(R"c1ccc(cc1)[C@H]1[C@@H](c2nc3ccccc3o2)[C@H](c2ccccc2)[C@H]1c1nc2ccccc2o1")
+smiles(R"c1ccc(cc1)[C@H]1C[N@@+]2(CCCC2)CC2(CCCCC2)O1")
+smiles(R"c1ccc(cc1)[C@H]1C[N@+]2(CCCC2)CC2(CCCCC2)O1")
+smiles(R"c1ccc(cc1)[C@H]1CO[C@]2(CCCC2)O1")
+smiles(R"C1CCC(CC1)[C@@H]1O[C@@]21C=C[C@@]1(CC[C@]3(CC1)O[C@@]13C=CC=C1)C2")
+smiles(R"c1ccc(cc1)[C@@H]1Oc2ccccc2[C@@]2(SCCS2)C1")
+smiles(R"c1ccc(cc1)[C@@H]1O[C@]2(CCCCC2)C[N@@+]21CCCC2")
+smiles(R"c1ccc(cc1)[C@@H]1O[C@@]2(CCCCC2)C[N@@+]21CCCC2")
+smiles(R"c1ccc(cc1)[C@@H]1OC[C@@]2(CO1)CO[C@H](OC2)c1ccccc1")
+smiles(R"c1ccc(cc1)[C@H]1ON=C(c2ccccc2)N1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1ccc(cc1)[C@H]1SC[C@H]2CO[C@@]3(CCCCC3)N12")
+smiles(R"c1ccc(cc1)[C@@H]([C@H](c1ccccc1)[C@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82)[C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82")
+smiles(R"c1ccc(cc1)C[N@@+]12CC[N@+](CC1)(Cc1ccccc1)C2")
+smiles(R"c1ccc(cc1)C[N@+]12CC[N@@+](CC1)(Cc1ccccc1)C2")
+smiles(R"c1ccc(cc1)C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"c1ccc(cc1)CN1CC[C@@]2(CC1)SS[C@]1(CCN(CC1)Cc1ccccc1)S2")
+smiles(R"c1ccc(cc1)CN1[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"c1ccc(cc1)Cn1cnc2nnn3ncnc3c12")
+smiles(R"c1ccc(cc1)Cn1cnc2nnn3nnnc3c12")
+smiles(R"c1ccc(cc1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C1CCC(CC1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1ccc(cc1)CN(CCCCCCN(Cc1ccccc1)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1ccc(cc1)/C=N/CC/N=C\c1ccccc1")
+smiles(R"c1ccc(cc1)/C=N/C/N=C\c1ccccc1")
+smiles(R"c1ccc(cc1)/C=N/Nc1nnn(n1)Cc1ccccc1")
+smiles(R"c1ccc(cc1)/C=N\N=C\c1ccccc1")
+smiles(R"c1ccc(cc1)/C(=N\N=C(\c1ccccc1)/c1cccs1)/c1cccs1")
+smiles(R"c1ccc(cc1)COc1ccc2[nH]c3c(ncc4[nH]c5ccccc5c34)c2c1")
+smiles(R"c1ccc(cc1)COc1nc2cc(ccc2[nH]1)C12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1")
+smiles(R"c1ccc(cc1)CP(c1ccccc1)([C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82)[C@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"c1ccc(cc1)CP(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"c1ccc(cc1)CSc1nc2nn[nH]c2c(n1)N1CCCCC1")
+smiles(R"c1cc(ccc1CSP123N4CCN1CCN3CCN2CC4)CSP123N4CCN1CCN3CCN2CC4")
+smiles(R"c1ccc(cc1)[Ge@@](c1ccccc1)([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"c1ccc(cc1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"c1ccc(cc1)N=c1c2c(ccc3ccccc23)oc2ccc3ccccc3c12")
+smiles(R"c1ccc(cc1)/N=C\1/c2sccc2/C(=N/c2ccccc2)/c2sccc12")
+smiles(R"c1ccc(cc1)/N=C/1\[C@H]2CCN(CC2)[C@H]1C(c1ccccc1)c1ccccc1")
+smiles(R"C1CCC(CC1)/N=C\1/N(C2CCCCC2)/C(=N\C2CCCCC2)/N1C1CCCCC1")
+smiles(R"c1ccc(cc1)/N=C/1\[SH+][Ni+2]2([SH+]1)[SH+]/C(=N/c1ccccc1)/[SH+]2")
+smiles(R"c1cc(ccc1/N=C/[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)c1ccc(cc1)/N=C/[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"c1cc(ccc1/N=C/[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)/N=C/[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"c1ccc(cc1)/N=C/c1nc2ncnc3ccn1c23")
+smiles(R"c1ccc(cc1)N[C@H]1CC[C@@H](CC1)/C(=C/1\C=C/C(=N\c2ccccc2)/C=C1)/[C@H]1CC[C@@H](CC1)Nc1ccccc1")
+smiles(R"c1ccc(cc1)N[C@H]1CCN(CC1)C1(CCCCC1)c1ccccc1")
+smiles(R"c1ccc(cc1)N/N=C\1/C(=C/c2ccccc2)/CCC/C1=C\c1ccccc1")
+smiles(R"c1ccc(cc1)/N=N/c1ccc(cc1)/N=C/[C@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18")
+smiles(R"c1ccc(cc1)/N=N/c1ccc(cc1)/N=C/[C@@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18")
+smiles(R"c1ccc(cc1)N/N=C\1/S/C(=N/c2ccccc2)/C(=N/c2ccccc2)/S1")
+smiles(R"c1ccc(cc1)N/N=C/c1nc2ncnc3ccn1c23")
+smiles(R"c1ccc(cc1)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"c1ccc(cc1)p1c2ccccc2c2ccccc12")
+smiles(R"c1ccc(cc1)[Pb@@](c1ccccc1)([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"c1ccc(cc1)P([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"c1ccc(cc1)P(c1ccccc1)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(P(c3ccccc3)c3ccccc3)C6=C12")
+smiles(R"c1ccc(cc1)P(c1ccccc1)(c1ccccc1)[Pd@]12SCC[S+]2[Pd@@]2(SCC[S+]12)P(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"c1ccc(cc1)[P+](C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)(c1ccccc1)c1ccccc1")
+smiles(R"c1ccc(cc1)[P+](C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)(c1ccccc1)c1ccccc1")
+smiles(R"c1ccc(cc1)[Si@@](c1ccccc1)([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"c1ccc(cc1)[Sn](S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)(c1ccccc1)c1ccccc1")
+smiles(R"c1ccc(/C=C/C=C(\C=C\c2ccccc2)/C=C/c2ccccc2)cc1")
+smiles(R"c1ccc(cn1)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1ccc(/C=N\N=C\c2ccccn2)nc1")
+smiles(R"c1ccc(CSP234N5CCN2CCN4CCN3CC5)c(c1)CSP123N4CCN1CCN3CCN2CC4")
+smiles(R"C1CC[C@@H]2CCCCN2C1")
+smiles(R"C1CC[C@H]2CCCCN2C1")
+smiles(R"C1CC[C@H]2[C@H](C1)C[C@@H]1CCCC[C@@H]1[C@@H]2[C@@H]1[C@H]2CCCC[C@@H]2C[C@@H]2CCCC[C@H]12")
+smiles(R"C1CC[C@H]2N[Au@]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3")
+smiles(R"C1CC[C@H]2N(C1)[C@H]1CCCCN1[C@@H]1CCCCN21")
+smiles(R"C1CC[C@H]2N[Cu@@+2]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3")
+smiles(R"C1CC[C@H]2N[Cu@+2]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3")
+smiles(R"C1CC[C@H]2N[Cu@]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3")
+smiles(R"C1CC[C@H]2N[Ni@@+2]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3")
+smiles(R"C1CC[C@H]2N[Ni@+2]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3")
+smiles(R"C1CC[C@H]2N[Ni@]3(N[C@@H]2C1)N[C@@H]1CCCC[C@H]1N3")
+smiles(R"C1CC[C@H]2N[Pt@@+2]3(N[C@@H]2C1)[OH+][Pt@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+][Pt@@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+]3")
+smiles(R"C1CC[C@H]2N[Pt@+2]3(N[C@@H]2C1)[OH+][Pt@@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+][Pt@@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+]3")
+smiles(R"C1=CC[C@@H](CC1)[C@@H]1OC[C@]2(CO1)CO[C@H](OC2)[C@H]1CCC=CC1")
+smiles(R"C1CC[C@H](OC1)OC[C@@]1(CCCCO1)CO[C@@H]1CCCCO1")
+smiles(R"c1cccnc1")
+smiles(R"C1CCCNC1")
+smiles(R"c1ccc(nc1)[C@]12c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"c1ccc(nc1)C1=C(N=c2ccccc2=c2ccccc2=N1)c1ccccn1")
+smiles(R"c1ccc(nc1)[C@H]1[C@@H](c2ccccn2)[C@H](c2ccccn2)[C@@H]1c1ccccn1")
+smiles(R"c1ccc(nc1)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1ccc(nc1)S[C@@]12[C@H]3[C@@H]4[C@H]5[C@@H]([C@H]14)[C@@H]2[C@@H]35")
+smiles(R"c1cc(CSP234N5CCN2CCN4CCN3CC5)cc(c1)CSP123N4CCN1CCN3CCN2CC4")
+smiles(R"C1=C[C@@H]2C[C@]3(OCCO3)[C@@H]2C1")
+smiles(R"C1C[C@@H]2CCCc3c4CCC[C@H]5CCCc(c(C1)c23)c45")
+smiles(R"C1C[C@@H]2CCC[C@@H]2C1")
+smiles(R"C1C[C@H]2CCC[C@@H]3[C@@H]2[C@@H](C1)[C@H]1CCC[C@@H]2CCC[C@H]3[C@H]12")
+smiles(R"C1C[C@H]2CCC[C@@H]3[C@H]4CCCC[C@@H]4[C@@H](C1)[C@@H]23")
+smiles(R"C1=C[C@@H]2C=C[C@H]12")
+smiles(R"C1=C[C@H]2C=C[C@@H]1C2")
+smiles(R"C1C[C@H]2CC[C@@H]1C2")
+smiles(R"C1C[C@@H]2CC[C@H]1CN(C2)[C@H]1CO[C@@H](CO1)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"C1C[C@H]2CC[C@@H]1O2")
+smiles(R"C1C[C@H]2CC[C@H]3CC[C@@H]1[C@@H]23")
+smiles(R"C1=C[C@H]2CC[C@@H](C1)[C@@]12OCCO1")
+smiles(R"C1C[C@H]2C[C@@H]1[C@]13O[C@H]1[C@]1(CC1)[C@H]1O[C@@]231")
+smiles(R"C1C[C@@H]2CCN1C[C@@]12SS[C@@]2(CN3CC[C@H]2CC3)S1")
+smiles(R"C1=C[C@@H]2[C@@H]3C=C[C@H]1C=C[C@H]23")
+smiles(R"C1C[C@@H]2[C@H](CCC[C@]32OCCO3)[C@]2(C1)OCCO2")
+smiles(R"C1C[C@@H]2[C@H](CCC[C@@]32OCCO3)[C@]2(C1)OCCO2")
+smiles(R"C1CC[N@@+]2(CC1)C[C@]12Cc2ccccc2C1")
+smiles(R"C1CC[N@+]2(CC1)C[C@]12Cc2ccccc2C1")
+smiles(R"C1CC[N@@+]2(CC1)C[C@]12Cc2ccccc2c2ccccc2C1")
+smiles(R"C1CC[N@+]2(CC1)C[C@@]12Cc2ccccc2c2ccccc2C1")
+smiles(R"C1CC[N+]2(CC1)Cc1c(ccc3ccccc13)[OH+][Cu@@+2]12[Cl-][Cu@+2]2([OH+]c3ccc4ccccc4c3C[N+]32CCCCC3)[Cl-]1")
+smiles(R"C1CC[N+]2(CC1)Cc1c(ccc3ccccc13)[OH+][Cu@+2]12[Cl-][Cu@@+2]2([OH+]c3ccc4ccccc4c3C[N+]32CCCCC3)[Cl-]1")
+smiles(R"c1cc[n+]2cc3ccc4cc5cccc[n+]5cc4c3cc2c1")
+smiles(R"c1cc[n+]2cc3c(ccc4cc5cccc[n+]5cc34)cc2c1")
+smiles(R"C1CCN2C[C@@H]3C[C@@H](CN4CCCC[C@@H]34)[C@H]2C1")
+smiles(R"C1CCN(C1)c1ccc2nnnn2n1")
+smiles(R"C1CCN(C1)c1n2ccccc2c2n1c1ccccc1n1c(N3CCCC3)n3ccccc3c21")
+smiles(R"c1ccncc1")
+smiles(R"C1CCNCC1")
+smiles(R"C1CCN(CC1)c1cc2nc3c(cc(N4CCCCC4)c4ccccc34)nc2c2ccccc12")
+smiles(R"c1cc[n+](cc1)[C@@H]1c2ccccc2[C@@H]([n+]2ccccc2)c2ccccc12")
+smiles(R"C1CCN(CC1)[C@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"c1cc(/N=C/[C@@]23C4=C5C6=C2[Fe]27893456[C@@H]3C8=C7C2=C93)c2cccc(/N=C/[C@@]34C5=C6C7=C3[Fe]389%104567[C@H]4C9=C8C3=C%104)c2c1")
+smiles(R"C1[C@H]2C[C@@H]3C[C@H]1CC(C2)(C3)C1=[O+][Rh]234OC(=[O+][Rh]4([O+]=C(O2)C24C[C@@H]5C[C@@H](C[C@H](C5)C4)C2)(O1)OC(=[O+]3)C12C[C@H]3C[C@@H](C[C@@H](C3)C2)C1)C12C[C@H]3C[C@H](C[C@@H](C3)C2)C1")
+smiles(R"C1[C@H]2C[C@H]3C[C@@H]1C[C@@](C2)(C3)c1sc2nnc(n2n1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"C1[C@@H]2C[C@H]3C[C@@H]1CC(C2)(C3)Nc1nc(nc(n1)N[C@@]12C[C@@H]3C[C@@H](C[C@H](C3)C2)C1)N[C@@]12C[C@H]3C[C@H](C[C@@H](C3)C2)C1")
+smiles(R"C1[C@@H]2C[C@@H]3C[C@H]1C[C@](C2)(C3)N[Cd@@+2](N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C1[C@@H]2C[C@@H]3C[C@H]1CC(C2)(C3)N[Cd+2](NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C1[C@@H]2C[C@@H]3C[C@H]1C[C@](C#C[C@]14C[C@@H]5C[C@@H](C[C@@H](C5)C4)C1)(C2)C3")
+smiles(R"C1[C@@H]2C[C@@H]3C[C@H]1C[C@](/C=N/[C@]14C[C@@H]5C[C@@H](C[C@@H](C5)C4)C1)(C2)C3")
+smiles(R"C1[C@@H]2C[C@@H]3C[C@H]1C[C@H](C2)[C@@]13OO[C@]21[C@@H]1C[C@H]3C[C@@H](C1)C[C@@H]2C3")
+smiles(R"C1[C@H]2C[C@@H]3[C@H](C2)[C@H]13")
+smiles(R"C1[C@H]2O[C@H]3CN1C[C@@H](O2)O3")
+smiles(R"C1CN1[C@H]1CC[C@@H](CC1)N1CC1")
+smiles(R"C1C[N@@+]23CCC[N@+]4(CCC2)CC[SH+][Ni@@+2]34[SH+]1")
+smiles(R"C1C[N@@+]23CCC[N@+]4(CCC2)CC[SH+][Pd@@+2]34[SH+]1")
+smiles(R"C1CN2CCC[C@@H]2C1")
+smiles(R"C1CN2CCC[C@H]2C1")
+smiles(R"C1CN2CCN1[Co@]12N2CCN1CC2")
+smiles(R"C1CN2CCN1[Cu@+2]12N2CCN1CC2")
+smiles(R"C1CN2CCN1[Hg@]12N2CCN1CC2")
+smiles(R"C1CN2CCN1[Ni@+2]12N2CCN1CC2")
+smiles(R"C1CN2CCN1[Zn@]12N2CCN1CC2")
+smiles(R"C1CN2CCN3CCCN4CCN(C1)[C@H]2[C@H]34")
+smiles(R"c1cnc2c(c1)ccc1CN(COc21)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1cnc2n[se]nc2c1")
+smiles(R"c1cnc2nsnc2c1")
+smiles(R"C1CN(CCN1C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C1CN=C(N1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C1CN=C(O1)N1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"c1c[nH]c(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1c[nH]c(n1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14")
+smiles(R"c1cnn(c1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14")
+smiles(R"C1COB(O1)[C@]12[C@@H]3CCC[C@H]1CCC[C@H]2CCC3")
+smiles(R"C1COB(O1)[C@@H]1C[C@H]2CCC[C@H]3CCC[C@@H](C1)[C@@H]23")
+smiles(R"c1coc2=c(o1)occo2")
+smiles(R"C1C[S+]2[Ni@]3(N1)NCC[S+]3[Ni@]12[S+]2CCN[Ni@@]32NCC[S+]13")
+smiles(R"C1CS[C@]2(SC1)SCS[C@@]12SCCCS1")
+smiles(R"c1csc(c1)c1nnc(o1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1csc(c1)c1sc2nnc(n2n1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"c1csc(c1)C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"c1csc(c1)C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"c1csc(n1)NC(Nc1nccs1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1nc2[nH]c[n+]3c2c(=[S+][Hg+]3[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)[n-]1")
+smiles(R"c1nc2[nH]c[n+]3c2c(=[S+][Hg+]3[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)[n-]1")
+smiles(R"c1ncc([nH]1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14")
+smiles(R"c1ncn(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"c1ncn(n1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14")
+smiles(R"C1Oc2cc(/C=C/c3nc4ccccc4nc3/C=C\c3ccc4OCOc4c3)ccc2O1")
+smiles(R"C1OCOCO1")
+smiles(R"C1O[Cu+2]234[OH+]CC[N@@+]4(C1)CC[O-]2[Cu+2]124OCC[N@@+]4(CC[OH+]1)CC[O-]2[Cu+2]124OCC[N@+]4(CC[OH+]1)CC[O-]2[Cu+2]124OCC[N@+]2(CC[OH+]1)CC[O-]34")
+smiles(R"C1O[Cu+2]234[OH+]CC[N@+]4(C1)CC[O-]3[Cu+2]134OCC[N@+]4(CC[OH+]1)CC[O-]3[Cu+2]134OCC[N@+]4(CC[OH+]1)CC[O-]3[Cu+2]134OCC[N@+]4(CC[OH+]1)CC[O-]23")
+smiles(R"[Ca+2]")
+smiles(R"C[C@-]12C3=C4C5=C1[Co+3]16782345C2=C7[C@@-]8(C)C6=C12")
+smiles(R"C[C@@-]12C3=C4C5=C1[Co+3]16782345C2=C7[C@-]8(C)C6=C12")
+smiles(R"CC12=C3(C)C4(=C5(C)[C@]1(C)[Ru+]167892345C2=C1C7=C9(/C=C/C13=C4C5=C7C9=C1[Ru+]1%10%11%1234579C3(=C1(C)[C@]%11(C)C%10(=C%123C)C)C)C8=C62)C")
+smiles(R"CC12=C3(C)C4(=C5(C)C1(C)[Ru+]167892345C2=C1C7=C9(C#CC13=C4C5=C7C9=C1[Ru+]1%10%11%1234579C3(=C1(C)C%11(C)C%10(=C%123C)C)C)C8=C62)C")
+smiles(R"CC12=C3(C)C4(=C5(C)C1(C)[Ru+]167892345C2=C6C8=C9(C#CC34=C5C6=C8C9=C3[Ru+]3%10%11%1245689C4(=C3(C)C%11(C)C%10(=C%124C)C)C)C7=C12)C")
+smiles(R"CC12=C3(C)C4(=C5(C)[C@@]1(C)[Ru+]167892345C2=C6C8=C9(/N=N/C34=C5C6=C8C9=C3[Ru+]3%10%11%1245689C4(=C3(C)[C@@]%11(C)C%10(=C%124C)C)C)C7=C12)C")
+smiles(R"C[C@@]12C[C@@]2(C)[C@@]1(C)C")
+smiles(R"C[C@@]12C[C@@]3(C)C[C@@](C)(C1)CC(Br)(C2)C3")
+smiles(R"C[C@@]12CC[C@@]3(OCCO3)C[C@@H]1CC[C@H]1O[C@@H]21")
+smiles(R"C[C@]12CCCC=C2C[C@]2(OCCO2)CC1")
+smiles(R"C[C@@]12C[C@@](C)(C[C@@](C)(C1)C(=O)NCCN(CCNC(=O)[C@]1(C)C[C@]3(C)C[C@](C)(C1)C(=O)NC3=O)CCNC(=O)[C@@]1(C)C[C@]3(C)C[C@](C)(C1)C(=O)NC3=O)C(=O)NC2=O")
+smiles(R"C[C@]12C=C[C@H](c3ccccc13)c1ccccc21")
+smiles(R"C[C@@]12[C@@H]([C@@H]3c4ccccc4[C@H]1c1ccccc31)[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"C[C@]12Oc3ccc4ccccc4c3C[C@H]2Cc2c(ccc3ccccc23)O1")
+smiles(R"C[C@]12Oc3ccc4ccccc4c3[C@H]2c2c(ccc3ccccc23)O1")
+smiles(R"C[C@@]12[Ru+]3456789%10(C%11=C4C6=C8(/C=C/C46=C8C%12=C%13C%14=C4[Ru+]4%15%16%1768%12%13%14C6(=C%16(C)C%15(=C4(C)[C@]%176C)C)C)C5=C3%11)C(=C2%10C)(C)C7(=C19C)C")
+smiles(R"C[C@@]12[Ru+]3456789%10(C%11=C4C6=C8(/N=N/C46=C8C%12=C%13C%14=C4[Ru+]4%15%16%1768%12%13%14C6(=C%16(C)C%15(=C4(C)[C@]%176C)C)C)C5=C3%11)C(=C2%10C)(C)C7(=C19C)C")
+smiles(R"C[C@]1(Br)[C@@](C)(Br)[C@@](C)(Br)[C@@](C)(Br)[C@@](C)(Br)[C@]1(C)Br")
+smiles(R"Cc1c2ccncc2c(C)c2c1n(C)c1c(C)c3ccncc3c(C)c21")
+smiles(R"Cc1c2nc3cc4ccccc4cc3n2c(C)c2ccccc12")
+smiles(R"Cc1c2[nH]c3c(ccc4ccccc34)c2cc2c(C)nccc12")
+smiles(R"Cc1c2sc3ccccc3[nH]c2nc2[nH]c3ccccc3sc12")
+smiles(R"Cc1cc2cc3CCc4ccccc4c4nn5cnnc5c(c34)c2o1")
+smiles(R"Cc1cc2cc3CCc4ccccc4c4nn5nnnc5c(c34)c2o1")
+smiles(R"Cc1cc2c(ccc3c2ccc2ccccc32)c2ccccc12")
+smiles(R"C=C1C[C@]2(CCC[C@@]3(OCCO3)C2)OC1=O")
+smiles(R"C[C@@]1(Cc2ccccc2)C[N@@+]21CCCCC2")
+smiles(R"C[C@@]1(Cc2ccccc2)C[N@+]21CCCCC2")
+smiles(R"Cc1cc2[n+]3c(N(C)C)n4ccccc4c3c3n(c2cc1C)c(N(C)C)[n+]1ccccc31")
+smiles(R"Cc1cc2[n+]3C(N(C)C)N4CCCCC4c3c3n(c2cc1C)c(N(C)C)[n+]1ccccc31")
+smiles(R"Cc1cc2nnc3cc(C)cc4nnc(c1)c2c34")
+smiles(R"Cc1cc2nnc(N)c(N)nnc1cc2C(C)C")
+smiles(R"Cc1ccc2c(c1)nc1cc3c(cc1n2C1CCCCC1)c(Cl)c(=O)c1ccccc31")
+smiles(R"Cc1ccc2ccc3c4C(=O)OC(=O)c4c4ccc5ccc(C)cc5c4c3c2c1")
+smiles(R"Cc1ccc2ccc3c(ccc4c3ccc3c(C)cccc43)c2c1")
+smiles(R"CC1=C(C)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl") # smiles(R"CC1=C(CC2=C(C)N=S(=O)(O)N=C2C)C(=NS(=O)(=N1)O)C")
+smiles(R"Cc1c(C)c2c(n1C)C(=O)[C@@H]1[C@H](C2=O)[C@@]2(C)c3ccccc3[C@]1(C)c1ccccc21")
+smiles(R"Cc1ccc2C(=[N+]3[N-]C(=[S+][Cu+]3[n+]2n1)N1C[C@H]2CC[C@H](CC2)C1)C")
+smiles(R"Cc1ccc2C(=[N+]3[N-]C(=[S+][Fe+]3[n+]2n1)N1C[C@H]2CC[C@H](CC2)C1)C")
+smiles(R"Cc1ccc2c(no[n+]2[O-])c1")
+smiles(R"Cc1ccc2c(NO[N+]2[O-])c1")
+smiles(R"Cc1ccc2nc3c4cccc5cccc(c3nc2c1)c45")
+smiles(R"Cc1ccc2[nH]c3c(ncc4[nH]c5ccccc5c34)c2c1")
+smiles(R"Cc1ccc2[n+](n1)[Cu+]1[S+]=C([N-][N+]1=C2C)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"Cc1ccc2[n+](n1)[Fe+]1[S+]=C([N-][N+]1=C2C)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"Cc1ccc2nnc(NS(=O)(=O)c3cc(C)c(Cl)cc3S)n2n1")
+smiles(R"Cc1ccc2n[se]nc2c1")
+smiles(R"Cc1ccc2OCN(Cc2c1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cc1ccc2oc(=O)c(cc2c1)C(=O)Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cc1ccc2s/c(=[S+]\[Pd@](Cl)(Cl)/[S+]=c/3\sc4ccc(C)cc4s3)/sc2c1")
+smiles(R"Cc1cccc2CC[C@H]3CCc4cccc(C)c4[C@H]3c12")
+smiles(R"Cc1cc(C)c2cnnn2n1")
+smiles(R"Cc1ccc(cc1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"Cc1ccc(cc1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"Cc1cccc(c1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"Cc1cccc(c1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"Cc1ccc(cc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cc1ccc(cc1)[C@]1(C)O[C@@H](C)[C@H](C)O1")
+smiles(R"Cc1cccc(c1)c1nnc2s/c(=C\c3ccc4OCOc4c3)/c(=O)n12")
+smiles(R"Cc1ccc(cc1)c1nnc2s/c(=C\c3ccc(cc3)N(C)C)/c(=O)n12")
+smiles(R"Cc1cccc(c1)c1nnc2s/c(=C\c3ccc(cc3)N(C)C)/c(=O)n12")
+smiles(R"Cc1ccc(cc1)[C@@]1(O)CS/C(=N/[C@]23C[C@@H]4C[C@@H](C[C@H](C4)C3)C2)/N1C(P(=O)(O)O)P(=O)(O)O")
+smiles(R"Cc1cccc(c1)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Cc1ccc(cc1)/C(=C/C(=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/Sc1ccccc1")
+smiles(R"Cc1ccc(cc1)[C@H]1CC(=O)C[C@H](c2ccc(C)cc2)[C@@]21C(=O)c1ccccc1C2=O")
+smiles(R"Cc1ccc(cc1)[C@H]1CC(=O)C[C@@H](c2ccc(C)cc2)[C@@]21C(=O)NC(=O)NC2=O")
+smiles(R"Cc1cccc(c1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Cc1cccc(c1C)N1C(=O)[C@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"Cc1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Cc1ccccc1/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cc1ccc(cc1)C(=O)/C=c\1/[nH]c2ccccc2nc1N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cc1ccc(cc1)C(=O)/C=c\1/[nH]c2c(nc1NC13C[C@H]4C[C@H](C[C@H](C4)C3)C1)c(=O)oc1ccccc21")
+smiles(R"Cc1ccc(cc1)C(=O)/C=C(\O)/C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Cc1cccc(c1)CP(Cc1cccc(C)c1)CC1(COC1)Cp1c2ccccc2c2ccccc12")
+smiles(R"Cc1ccc(cc1)N1C[C@H](O)CN(C[C@H](O)C1)c1ccc(C)cc1")
+smiles(R"Cc1cccc(c1)N1CCN(CC1)c1ccc2nonc2c1[N+](=O)[O-]")
+smiles(R"Cc1cccc(c1)N1CCN(CC1)c1ccc2NONc2c1[N+](=O)[O-]")
+smiles(R"Cc1ccccc1n1c(=O)sc2c(=O)n(c3ccccc3)c(=S)[nH]c12")
+smiles(R"Cc1cccc(c1)n1c(=S)[nH]c2c(sc(=O)n2c2ccccc2C)c1=O")
+smiles(R"Cc1ccccc1n1c(=S)[nH]c2n(c(=O)sc2c1=O)c1ccccc1C")
+smiles(R"Cc1ccc(cc1)/N=C/c1ccc(cc1O)[S@@](=O)(=O)c1ccc(/C=N/c2ccc(C)cc2)c(O)c1")
+smiles(R"Cc1cc(ccc1N)/C(=C/1\C=C/C(=N\c2ccccc2)/C=C1)/c1ccc(cc1)Nc1ccccc1")
+smiles(R"Cc1cccc(c1)NC(=O)[C@@H]1CC[C@H](CC1)CC1CCCCC1")
+smiles(R"Cc1ccc(cc1)N/N=C\1/C(=O)O[C@H](OC1=O)c1ccccc1")
+smiles(R"Cc1cc(cc(c1N)S(=O)(=O)O)/C(=C\1/C=C/C(=N\c2ccc(cc2)S(=O)(=O)O)/C=C1)/c1ccc(cc1)Nc1ccc(cc1)S(=O)(=O)O")
+smiles(R"Cc1ccc(cc1)Oc1nc2nc3c(cc2c2ccccc12)n(C(=O)C)c1ccccc31")
+smiles(R"Cc1ccc(cc1)P(c1ccc(C)cc1)(c1ccc(C)cc1)[Pt@@]1(Cl)[Cl][Pt@@](Cl)([Cl]1)P(c1ccc(C)cc1)(c1ccc(C)cc1)c1ccc(C)cc1")
+smiles(R"Cc1ccc(cc1)[Si@]12O[C@H](C)CN(C[C@H](C)O1)C[C@H](C)O2")
+smiles(R"Cc1ccc(cc1)S(=O)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)c1c(N)c2nc3ccccc3n2c2nc3ccccc3nc12")
+smiles(R"Cc1ccc(cc1)S(=O)OC[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)C[C@H]1[C@H]2c3ccccc3[C@@H]([C@H]1C)c1ccccc21")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)C(=S=N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)Sc1ccccc1")
+smiles(R"Cc1ccc(cc1)[S@](=O)(=[OH+])[O-]")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N1C[C@@]2(O)CN(C[C@@](O)(C1)O2)S(=O)(=O)c1ccc(C)cc1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N1C[C@@H](Cl)CN(C[C@H](Cl)C1)S(=O)(=O)c1ccc(C)cc1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N1C(=O)O[C@@]2(CCCCC2)[C@H]1C")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N[C@@H]1CC[C@@H](CC1)C(=O)O")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)NC(=O)O[C@]12COCN2COC1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N/N=C\1/C=C2C/C(=N/NS(=O)(=O)c3ccc(C)cc3)/C=C2C1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N/N=C/1\[C@@](C)(C)/C(=N\NS(=O)(=O)c2ccc(C)cc2)/[C@@]1(C)C")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N/N=C\1/[C@H]2CC=CC[C@@H]2/C(=N\NS(=O)(=O)c2ccc(C)cc2)/[C@H]2CC=CC[C@H]12")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N/N=C\1/[C@H]2CC[C@@H]1CC2")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N/N=C/1\CN2CC[C@H]1CC2")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N/N=C\1/C(=N\NS(=O)(=O)c2ccc(C)cc2)/[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)N/N=C(\C=C\c1ccccc1)/C=C/c1ccccc1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)NNC(=O)[C@]12CC[C@H](CC1)C2")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)/N=S/1\CCCC1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)[O-]")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)O")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)O[C@@]12CC[C@@](C)(CC1)[C@@]1(OCCO1)C2")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)O[C@]12CC[C@](C)(CC1)C(=O)C2")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)O[C@@]1([C@@H]2CC[C@H]1CC2)c1ccc(cc1)C(F)(F)F")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)OC[C@]12CC[C@H](CC1)[C@H]1C[C@@H]21")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)OC[C@]12CC[C@H]([C@H]3C[C@@H]13)[C@H]1C[C@@H]21")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)OC[C@H]1O[C@@](C)(C)O[C@H]1COS(=O)(=O)c1ccc(C)cc1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)O[C@H]1[C@@](C)(C)[C@H](OS(=O)(=O)c2ccc(C)cc2)C1(C)C")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)O[C@@H]1CC[C@H](CC1)N1C(=O)c2ccccc2C1=O")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)O[C@H]1CC[C@@H](CC1)OS(=O)(=O)c1ccc(C)cc1")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)O[C@@H]1[C@H](O)[C@H](O)[C@H](O)[C@@H](O)[C@H]1O")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)[OH+][Pd@@+2]12[N+](C)(C)CC[N@+]2(C)CC[N+]1(C)C")
+smiles(R"Cc1ccc(cc1)S(=O)(=O)[OH+][Pd@+2]12[N+](C)(C)CC[N@@+]2(C)CC[N+]1(C)C")
+smiles(R"CC1=C(C)CC[C@@]2(C1)C(=O)[C@@]1(CCC(=C(C)C1)C)C2=O")
+smiles(R"Cc1ccc(C)c2c1[C@](O)(C#Cc1ccccc1)c1c(C)ccc(C)c1[C@]2(O)C#Cc1ccccc1")
+smiles(R"Cc1c(C)ccc2nc3c(nc12)c1ccccc1c1ccccc31")
+smiles(R"Cc1cccc(C)c1N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"Cc1cc(C)c(c(C)c1)S(=O)(=O)O")
+smiles(R"Cc1ccc(C(C)C)c(OC[C@@H]2N3CC[C@@H](CC3)C2=O)c1")
+smiles(R"Cc1cccc(C)n1N")
+smiles(R"Cc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"Cc1ccccn1N")
+smiles(R"Cc1cccc(N)n1N")
+smiles(R"Cc1ccc(/C=N/N(C)CN(C)/N=C\c2ccc(C)cc2)cc1")
+smiles(R"CC1(C)C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"CC1=C(C)[C@@H]2[C@H]3C(=O)OC(=O)[C@H]3[C@H]1[C@@H]1C(=O)OC(=O)[C@H]21")
+smiles(R"CC1=CC[C@H](C/C=N\N=C\C[C@H]2CC=C(C)C2(C)C)C1(C)C")
+smiles(R"Cc1cc(C)n2n1[B+3]1[NH+]3C(=CC(=[N+]3[Re+]2(=O)(=O)(=O)[NH+]2C(=CC(=[N+]12)C)C)C)C")
+smiles(R"Cc1cc(C)n2n1[B+3]1[NH+]3C(=CC(=[N+]3[Re+3]32(=O)([OH+]CC[OH+]3)[NH+]2C(=CC(=[N+]12)C)C)C)C")
+smiles(R"Cc1cc(C)n2n1[B+3]1[NH+]3C(=CC(=[N+]3[Re+3]32(=O)([OH+][C@@H]2CCCCCC[C@H]2[OH+]3)[NH+]2C(=CC(=[N+]12)C)C)C)C")
+smiles(R"Cc1cccn(N)c1N")
+smiles(R"Cc1ccc(N)n(N)c1")
+smiles(R"C[C@]1(C=C[C@@](O)(C#C[C@]2(O)C=C[C@](C)(C=C2)C(Cl)(Cl)Cl)C=C1)C(Cl)(Cl)Cl")
+smiles(R"CC1(C)[C@@H]2CC[C@@]1(C)[C@@]1(OCCO1)C2")
+smiles(R"CC1(C)[C@@H]2CC[C@]3(OCCO3)[C@H]1[C@@H]1O[C@@H]21")
+smiles(R"CC1CCN2C(C1)C1CC(CCN1[Ru+2]132(n2ccccc2=c2ccccn12)n1ccccc1=c1ccccn31)Cc1c(F)c(F)c(c(F)c1F)c1c(F)c(F)c(NC2C3CC4CC(C3)CC2C4)c(F)c1F")
+smiles(R"CC1=CC(=[N+]2C(=S3[Pt@+2]42N1C(=S4[Pt@@+2]13S2=C(c3ccccc3)N3C(=CC(=[N+]4C(=S1[Pt@+2]234)c1ccccc1)C)C)c1ccccc1)c1ccccc1)C")
+smiles(R"CC1=CC(=[N+]2C(=S3[Pt@@+2]4(S5=C(c6ccccc6)N6C(=CC(=[N+]7C(=S4[Pt@@+2]567)c4ccccc4)C)C)S4=C(c5ccccc5)N1[Pt@+2]234)c1ccccc1)C")
+smiles(R"C[C@@]1(C)/C(=N\c2ccccc2)/[C@@](C)(C)/C/1=N/c1ccccc1")
+smiles(R"C[C@@]1(C)/C(=N\C2CCCCC2)/[C@@](C)(C)/C/1=N/C1CCCCC1")
+smiles(R"Cc1cc(N)c2nsnc2c1")
+smiles(R"Cc1cc[n+](cc1)[Pt+2]12[n+]3ccccc3c3cccc(=c4cccc[n+]14)[n+]23")
+smiles(R"Cc1cc[n+](cc1)[Pt+2]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23")
+smiles(R"Cc1ccn(cc1)[Pt](ON(=O)O)(ON(=O)O)n1ccc(C)cc1")
+smiles(R"Cc1cc[n+](c(C)c1)C1=C(O)C(=O)C2=C([C@@H]3c4ccccc4[C@H]2c2ccccc32)C1=O")
+smiles(R"CC1(C)CNC(=NC1)N/N=C(\C=C\c1ccc(cc1)C(F)(F)F)/C=C/c1ccc(cc1)C(F)(F)F")
+smiles(R"CC1(C)/C(=N\Nc2ccccc2)/C(C)(C)/C/1=N\Nc1ccccc1")
+smiles(R"CC1=C/C(=N\N=C\2/C=C[C@](C)(C=C2)C(Cl)(Cl)Cl)/C=C[C@]1(C)C(Cl)(Cl)Cl")
+smiles(R"Cc1cc(O)c2c(c1)C(=O)[C@@]13C(=C(O)[C@@H]4[C@@H](O)[C@H]3[C@H]3[C@H](O)[C@@H]1C(=C1C(=O)c5c(O)cc(C)cc5C(=O)[C@]431)O)C2=O")
+smiles(R"Cc1cc(O)c2cc3ccc4c5c(ccc(c35)c2n1)cc1c(O)cc(C)nc41")
+smiles(R"Cc1cc(Oc2ccccc2)c2c(ccc3nc(C)cc(Oc4ccccc4)c23)n1")
+smiles(R"C[C@@]1(C)[C@@](O)(c2ccccc2)c2ccccc2[C@@]1(O)c1ccccc1")
+smiles(R"C[C@@]1(C)COC2(OC1)[C@H]1CC[C@]3(CS(=O)(=O)N=C23)C1(C)C")
+smiles(R"Cc1cc(O[C@H](C)C(=O)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c(C)c(C)c1")
+smiles(R"CC1(C)COC(=N1)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41I")
+smiles(R"CC1[CH][CH]C2NC(SC2[CH]1)C1[CH][CH]C([CH][CH]1)N1ON1C1[CH][CH]C(/C=C/C2[CH][CH]C([CH]C2S(=O)(=O)O)N2ON2C2[CH][CH]C([CH][CH]2)C2NC3[CH][CH]C(C)[CH]C3S2)C([CH]1)S(=O)(=O)O")
+smiles(R"C[C@@]1(Cl)[C@H]2c3ccccc3[C@H](c3ccccc23)[C@]1(C)Cl")
+smiles(R"Cc1c(nn2cc(nnc12)c1ccccc1)c1ccccc1")
+smiles(R"CC1=C([N+](=O)[O-])[N+]([O-])ON1")
+smiles(R"CC1(C)O[C@@H]2[C@H]3O[C@](C)(C)O[C@@H]3[C@H]3OC(C)(C)O[C@H]3[C@H]2O1")
+smiles(R"C[C@]1(C)O[C@H]2CS(=O)(=O)C[C@H]2O1")
+smiles(R"C[C@]1(C)O[C@@H](CP(c2ccc3ccccc3c2)c2ccc3ccccc3c2)[C@H](CP(c2ccc3ccccc3c2)c2ccc3ccccc3c2)O1")
+smiles(R"C[C@@]1(C)O[C@H](CP(c2cccc3ccccc23)c2cccc3ccccc23)[C@H](CP(c2cccc3ccccc23)c2cccc3ccccc23)O1")
+smiles(R"C[C@]1(C)O[C@@H](CP(c2ccccc2)c2ccccc2)[C@@H](CP(c2ccccc2)c2ccccc2)O1")
+smiles(R"C[C@]1(C)O[C@@H](CP(c2ccccc2)c2ccccc2)[C@H](CP(c2ccccc2)c2ccccc2)O1")
+smiles(R"C[C@@]1(C)O[C@@H](CP(=O)(c2ccccc2)c2ccccc2)[C@@H](O1)CP(=O)(c1ccccc1)c1ccccc1")
+smiles(R"C[C-]1C(=[O+][Ru+3]23([O+]=C1C)([O+]=C(C)[C-](C)C(=[O+]2)C)[O+]=C(C)[C-](C)C(=[O+]3)C)C")
+smiles(R"Cc1cp(Cc2ccccc2)cc1C")
+smiles(R"Cc1cs/c(=N\C23C[C@H]4C[C@H](C[C@H](C4)C3)C2)/n1C(P(=O)(O)O)P(=O)(O)O")
+smiles(R"CC1(C)[SH+][Ni@@+2]23[SH+]C(C)(C)C[N@@+]43CCC[N@+]2(CCC4)C1")
+smiles(R"CC1=[N+]2[N-]C(=[S+][Ni]342([S+]=C([N-][N+]4=C(C)c2cccc[n+]32)N2C[C@@H]3CC[C@@H](CC3)C2)[n+]2ccccc12)N1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"CC1=[N+]2[N-]C(=[S+][Ni]342([S+]=C([N-][N+]4=C(C)c2cccc[n+]32)N2C[C@@H]3CC[C@@H](CC3)C2)[n+]2ccccc12)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"Cc1nc2c3ccccc3C(=O)c3nc4ccccc4c(c1)c23")
+smiles(R"Cc1nc2c3ncccc3C(=O)c3nc4ccccc4c(c1)c23")
+smiles(R"Cc1nc2cc3c(oc4ccccc34)cc2n2cccc12")
+smiles(R"Cc1nc2CCC=c3nc(C)c1n23")
+smiles(R"Cc1nc2ccccc2cc1C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Cc1nc2c(o1)/C(=N\c1ccccc1)/c1nc(C)oc1/C/2=N/c1ccccc1")
+smiles(R"Cc1nc(C)c2CCC(=O)N(Cc3ccc(cc3)c3ccccc3c3nn[nH]n3)c2n1")
+smiles(R"Cc1[nH]c(c2ccccc2)c(O)c1C(=O)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cc1nn(c(C)c1)c1ccc2nnnn2n1")
+smiles(R"Cc1nn(c(C(Cl)Cl)c1Cl)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Cc1nnc(o1)C(CCN1[C@@H]2CC[C@H]1CC2)(c1ccccc1)c1ccccc1")
+smiles(R"Cc1n[nH]c2c(ncnc12)NC[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"Cc1nnnn1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CC1=NP(=NC(=C1)O)(O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C[C@@]1(O)c2cccc3c2C2(O)c4c1cccc4[C@](C)(O)c1cccc(c21)[C@]3(C)O")
+smiles(R"C[C@]1(O)[C@@](C)(O)[C@](C)(O)[C@]1(C)O")
+smiles(R"CC1=[O+][Co]23([O+]=C(C)[C@H]1I)([O+]=C(C)[C@@H](I)C(=[O+]2)C)[O+]=C(C)[C@@H](I)C(=[O+]3)C")
+smiles(R"CC1=[O+][Eu+3]234([O+]=C(C)[C-]1c1ccccc1)([O+]=C(C)[C-](c1ccccc1)C(=[O+]2)C)([O+]=C(C)[C-](c1ccccc1)C(=[O+]3)C)[O+]=C(C)[C-](c1ccccc1)C(=[O+]4)C")
+smiles(R"Cc1onc(C)c1/N=N/c1ccc2nonc2c1N")
+smiles(R"CC1=[O+][Pt@@+2]2([O+]=C(C)[CH-]1)N[C@@H]1CCCC[C@H]1N2")
+smiles(R"CC1=[O+][Pt@+2]2([O+]=C(C)[CH-]1)N[C@@H]1CCCC[C@H]1N2")
+smiles(R"CC1=[O+][Pt](Cl)([O+]=C(C)C1)[C@@H]1C(=[O+][Ga]23([O+]=C1C)([O+]=C(C)[C@H](C(=[O+]2)C)[Pt]1(Cl)[O+]=C(C)CC(=[O+]1)C)[O+]=C(C)[C@@H](C(=[O+]3)C)[Pt]1(Cl)[O+]=C(C)CC(=[O+]1)C)C")
+smiles(R"CC1=[O+][Rh]23([O+]=C(C)C1)([O+]=C(C)[C@H](Cl)C(=[O+]2)C)[O+]=C(C)[C@H](Cl)C(=[O+]3)C")
+smiles(R"CC1=[O+][Rh]23([O+]=C(C)[C@H]1Br)([O+]=C(C)[C@@H](Br)C(=[O+]2)C)[O+]=C(C)[C@@H](Br)C(=[O+]3)C")
+smiles(R"CC1=[O+][Ru+3]23([O+]=C(C)[C-]1Br)([O+]=C(C)[C-](Br)C(=[O+]2)C)[O+]=C(C)[C-](Br)C(=[O+]3)C")
+smiles(R"CC1=[O+][Ru+3]23([O+]=C(C)[C-]1Cl)([O+]=C(C)[C-](Cl)C(=[O+]2)C)[O+]=C(C)[C-](Cl)C(=[O+]3)C")
+smiles(R"CC1=[O+][Ru+3]23([O+]=C(C)[C-]1C)([O+]=C(C)[C-](C)C(=[O+]2)C)[O+]=C(C)[C-](C)C(=[O+]3)C")
+smiles(R"CC1=[O+][Ru+3]23([O+]=C(C)[C-]1I)([O+]=C(C)[C-](I)C(=[O+]2)C)[O+]=C(C)[C-](I)C(=[O+]3)C")
+smiles(R"Cc1sc2nc3sn4c(=O)c5c(nc4n3c(=O)c2c1C)sc(C)c5C")
+smiles(R"C[C@]1(S[C@@](S[C@@](C)(S1)c1ccccc1)(c1ccccc1)c1ccccc1)c1ccccc1")
+smiles(R"C(C[C@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"C=C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C=C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C=C[C@]12CC(=O)N3CCc4ccccc4[C@@]3(C1)C2")
+smiles(R"CC[C@@]12O[C@]3(CC)[C@@H]4OC(=O)[C@H]2[C@@]2(CC)O[C@]4(CC)[C@@H]3OC(=O)[C@@H]12")
+smiles(R"CC[C@@]1(c2ccccc2)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O")
+smiles(R"CCc1ccccc1[C@H](C(=O)N[C@H]1CN2CC[C@H]1CC2)c1ccsc1")
+smiles(R"C#Cc1cccc(c1)N1C(=O)[C@H]2[C@H]3C=C[C@@H]([C@H]2C1=O)[C@H]1C(=O)N(c2cccc(C#C)c2)C(=O)[C@@H]31")
+smiles(R"CCc1cccc(C)c1NC(=O)CCc1nnc2s/c(=C/c3cccc4ccccc34)/c(=O)n12")
+smiles(R"CCc1cccc(CC)c1N1C(=O)[C@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"CC[C@]1(CCC(C)C)C(=O)N(c2ccccc2)/C(=N)/N(c2ccccc2)C1=O")
+smiles(R"CCc1ccccn1N")
+smiles(R"CCc1ccc(C)n(N)c1")
+smiles(R"C=C[C@@]1(CC[C@H](CC1)C(C)(C)C)NS(=O)(=O)c1ccc(C)cc1")
+smiles(R"CC[C@@]1(C)CC(=O)N(C/C=C(/C)\CCC=C(C)C)C(=O)C1")
+smiles(R"CC[C@@]1(C)CC(=O)N(C/C=C(/C)\CCC(=O)O)C(=O)C1")
+smiles(R"CC[C@]1(CC)COP(=O)(OCCN2C(=O)[C@@H]3[C@@H]4C=C[C@@H](C4)[C@H]3C2=O)OC1")
+smiles(R"CC[C@@]1(C)CO[C@@](C)(OC1)Cc1ccccc1")
+smiles(R"CC[C@]1(C)CO[C@@H](/C=C/c2ccccc2)OC1")
+smiles(R"CC[C@@]1(CC)O[C@@H]([C@H](O)CCc2ccccc2O)[C@@H](O1)[C@H](O)CCc1ccccc1O")
+smiles(R"CC(=C1[C@H]2CC[C@H](CC2)[C@]21CCC1=C(C2)[C@@H]2CC[C@H]1CC2)C")
+smiles(R"C/C=C\1/[C@@H](C(=O)O)[C@@H]1C(=O)O")
+smiles(R"CC[C@]1(C)O[C@@H](C)[C@H](C)O1")
+smiles(R"CCc1nnc2sc3c(nn12)c(Cl)c1sc2nnc(CC)n2nc1c3Cl")
+smiles(R"C=Cc1nnnn1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCc1nnnn1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC[C@]1(O)[C@]2(CCCC=C2)NC(=O)[C@@]21CCCCC2")
+smiles(R"C#C[C@@]1(O)CCCC2=C[C@]3(SCCS3)CC[C@]12C")
+smiles(R"C#C[C@]1(O)CCC[C@@H]2C[C@]3(OCCO3)CC[C@@]12C")
+smiles(R"C#C[C@@]1(O)C[C@@H](c2ccccc2)N(C)[C@@H](C1)c1ccccc1")
+smiles(R"CC[C@@]1(O)C[C@@H](c2ccccc2)N(C)[C@@H](C1)c1ccccc1")
+smiles(R"CC[C@]1(O[C@@H](C)[C@H](C)O1)c1ccccc1")
+smiles(R"CC(=C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC(=C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC(C)[C@@]12C3=C4C5=C1[Zr]16782345(Cl)(Cl)C2=C7[C@]8(C(C)C)C6=C12")
+smiles(R"CC(C)C12=C3C4=C5C6=C1[Cr]1789%1023456C2=C7C9=C%10(C(C)C)C8=C12")
+smiles(R"CC(C)[C@]12Cc3c(ccc4ccccc34)O[C@@]2(C)Oc2ccc3ccccc3c2C1")
+smiles(R"C=CC[C@@]12C[C@H](C=C[C@]32OCCO3)O[C@@H](O)[C@H]1C")
+smiles(R"C=CC[C@@]12C[C@H](C=C[C@]32OCCO3)OC(=O)[C@H]1C")
+smiles(R"CCC[C@@]1(c2ccccc2)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O")
+smiles(R"CCC[C@@]1(c2ccccc2)[C@H](C#N)C(=O)NC(=O)[C@H]1C#N")
+smiles(R"C=CCc1cccc2cc(C(=O)Nc3scc(n3)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(=O)oc12")
+smiles(R"CC(C)c1ccc(cc1)/C=C(\SS/C(=C/c1ccc(cc1)C(C)C)/C(=O)N)/C(=O)N")
+smiles(R"CC(C)c1ccc(cc1)[C@@H]1[C@H]2CCN1CC2")
+smiles(R"C/C(=C\c1ccccc1)/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C=CC[C@@]1(CC=CC[C@]21OCCO2)CC(=O)O")
+smiles(R"CC(C)c1ccc(C)c(c1)N1C(=O)[C@@H]2[C@@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CC(C)c1ccc(/C=C/CN2CC[C@@](O)(CC2)c2ccccc2)cc1")
+smiles(R"C/C=C/[C@@]1(/C=C\C)C(=O)OC(=O)[C@]1(/C=C/C)/C=C/C")
+smiles(R"CC(C)c1cc([C@@H]2O[Cu+2]34([O-])O[C@H](O[Cu+2]([O-])(O2)([OH+][C@@H]([OH+]3)c2cc(cc(C(C)C)c2O)C(C)C)[OH+][C@H]([OH+]4)c2cc(cc(C(C)C)c2O)C(C)C)c2cc(cc(C(C)C)c2O)C(C)C)c(O)c(c1)C(C)C")
+smiles(R"CC(C)c1cc([C@H]2O[Cu+2]34([O-])O[C@@H](O[Cu+2]([O-])(O2)([OH+][C@@H]([OH+]3)c2cc(cc(C(C)C)c2O)C(C)C)[OH+][C@H]([OH+]4)c2cc(cc(C(C)C)c2O)C(C)C)c2cc(cc(C(C)C)c2O)C(C)C)c(O)c(c1)C(C)C")
+smiles(R"CCC[C@]1(CC)C(=O)N/C(=N)/NC1=O")
+smiles(R"CCC[C@@]1(C)CO[C@](C)(OC1)c1ccc(Cl)cc1")
+smiles(R"CCC[C@]1(C)CO[C@@H](/C=C/c2ccccc2)OC1")
+smiles(R"CCC[C@]1(C)CO[C@@H](OC1)c1ccc(Cl)cc1")
+smiles(R"CCC[C@]1(C)CO[C@@H](OC1)Cc1ccccc1")
+smiles(R"CCCC1(CN[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)C(=O)N(c2ccccc2)N(c2ccccc2)C1=O")
+smiles(R"CC(C)c1nnnn1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCCc1nnnn1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC(C)(C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC(C)(C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC(C)Cc1ccc(cc1)C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"C/C=C/C[C@]1(C/C=C/C)C(=O)NC(=O)NC1=O")
+smiles(R"CCCC[C@]1(CC)CO[C@@](C)(CCc2ccc(OC)cc2)OC1")
+smiles(R"CCCC[C@]1(CC)CO[C@](CC)(OC1)c1ccccc1")
+smiles(R"CCCC[C@]1(CC)CO[C@@](C)(OC1)c1ccccc1")
+smiles(R"CCCC[C@@]1(CC)CO[C@](C)(OC1)Cc1ccccc1")
+smiles(R"CCCC[C@@]1(CC)CO[C@H](/C=C/c2ccccc2)OC1")
+smiles(R"CCCC[C@]1(CC)CO[C@H](OC1)c1ccc2OCOc2c1")
+smiles(R"CCCC[C@@]1(CC)CO[C@H](OC1)c1ccccc1")
+smiles(R"CCCC[C@]1(CC)CO[C@H](OC1)c1ccc(O)c(OC)c1")
+smiles(R"CCCC[C@@]1(CC)CO[C@H](OC1)[C@@H]1CCC=CC1")
+smiles(R"CCCC[C@]1(CC)CO[C@H](OC1)[C@H](C)c1ccccc1")
+smiles(R"CCCC[C@]1(CCO)C(=O)N/C(=N)/NC1=O")
+smiles(R"CCCCC1=C(C(=O)N2CCOCC2)[C@@]2(OCCO2)[C@@H]1Cl")
+smiles(R"C=CCC[C@]1(C)O[C@H](C)[C@@H](C)O1")
+smiles(R"CC(C)(C)c1nc2ccccc2p1c1ccccc1")
+smiles(R"CCCC[C@@]1(O)[C@@]2(CCCCC2)NC(=O)[C@@]21CCCCC2")
+smiles(R"CC/C=C(\C)/[C@@]1(CC)C(=O)N/C(=N)/NC1=O")
+smiles(R"CCCCC[C@@]1(CCO)C(=O)N/C(=N)/NC1=O")
+smiles(R"CCCCC[C@]1(C)OC[C@](CC)(CCCC)CO1")
+smiles(R"CCCCC[C@]1(C)O[C@@H](C)[C@H](C)O1")
+smiles(R"CC(C)(C(C)(C)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"C/C=C/C(C)(C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C/C=C/C(C)(C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC(C)C(C)(C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC(C)C(C)(C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CCCCCCc1cc2cc(C(=O)Nc3scc(n3)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(=O)oc2cc1O")
+smiles(R"CCCCCCC1(/C=C/c2ccc(Cl)c(Cl)c2)OC[C@](C)(C)CO1")
+smiles(R"CCCCCC[C@]1(C)OC[C@@](CC)(CCCC)CO1")
+smiles(R"CCCCCC[C@]1(C)O[C@@H](C)[C@H](C)O1")
+smiles(R"CCCCC/C(=C\c1ccccc1)/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCC/C=C/C=C\[C@]1(CC[C@H](CC1)C(C)(C)C)NS(=O)(=O)c1ccc(C)cc1")
+smiles(R"CCCCCCC[C@]1(C)O[C@@H](C)[C@H](C)O1")
+smiles(R"CC(=CCC/C(=C\c1nnc2n[nH]c(=S)n2n1)/C)C")
+smiles(R"CCCCCCCCCc1ccc(OCCOCCOCCOCCOCCOCCOCCCS(=O)(=O)[OH+][Pt@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]S(=O)(=O)CCCOCCOCCOCCOCCOCCOCCOc2ccc(CCCCCCCCC)cc2)cc1")
+smiles(R"CCCCCCCCCc1cc[n+](cc1)C1=C(O)C(=O)C2=C([C@H]3c4ccccc4[C@@H]2c2ccccc32)C1=O")
+smiles(R"CC/C=C(\CC)/C(=C\CC)/CC")
+smiles(R"CCCCCCCCCCCc1c2[nH]c3cc(C)ccc3oc2cc2[nH]c3cc(C)ccc3oc12")
+smiles(R"CCCCCCCCCCCc1c(=O)c2oc3c(=O)c(CCCCCCCCCCC)c(O)c(=O)c3n(c3ccc(cc3)N(C)C)c2c(=O)c1O")
+smiles(R"C/C(=C\C(C)(C)C)/C(=C\C(C)(C)C)/C")
+smiles(R"CCCCCCCCCCCCCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(CCCCCCCCCCCCCCCC)C6=C12")
+smiles(R"CCCCCCCCCCCCCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(CCCCCCCCCCCCCCCC)C6=C12")
+smiles(R"CCCCCCCCCCCCCCCCCCN1C(=O)[C@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CCCCCCCCCCCCCCCCCCNC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82")
+smiles(R"CCCCCCCCCCCCCCCCCCNC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82")
+smiles(R"CCCCCCCCCCCCCCCCCCOC(=O)[C@H](C(=O)C)[C@@H](c1cccc(c1)[N+](=O)[O-])[C@@H](C(=O)C)C(=O)OCCCCCCCCCCCCCCCCCC")
+smiles(R"CCCCCCCCCCCCCCCCCCOC(=O)[C@H](C(=O)C)[C@H](c1cccc(c1)[N+](=O)[O-])[C@@H](C(=O)C)C(=O)OCCCCCCCCCCCCCCCCCC") # smiles(R"CCCCCCCCCCCCCCCCCCOc1ccc2C3=NC4=NC(=NC5=NC(=NC6=NC(=NC(=N3)c2c1)c1cc(OCCCCCCCCCCCCCCCCCC)ccc61)c1ccc(OCCCCCCCCCCCCCCCCCC)cc51)c1cc(OCCCCCCCCCCCCCCCCCC)ccc41")
+smiles(R"CCCCCCCC/C=C/CCCCCCCC(=O)N1CC[C@@H](CCCc2ccccc2)CC1")
+smiles(R"CCCCCCCC/C=C/CCCCCCCC(=O)OC[C@H](COC(=O)CCCCCCC/C=C/CCCCCCCC)OC(=O)N(CCCl)CCCl")
+smiles(R"CCCC/C=C/C=C/C=C/CCCCCCCC(=O)O[C@H](COC(=O)CCCCCCC/C=C/[C@@H]1C=C[C@@H](CCCC)[C@H](C(=O)O)[C@H]1C(=O)O)COC(=O)CCCCCCC/C=C/[C@@H]1C=C[C@@H](CCCC)[C@H](C(=O)O)[C@H]1C(=O)O")
+smiles(R"CCCCCCCCCCCCCCCCCCSC[C@@]12[C@H](COS(=O)(=O)O)[C@@H](COS(=O)(=O)O)[C@@H](c3ccccc13)c1ccccc21")
+smiles(R"CCCCCCCCCCCCCCCC[C@H]1CCC[C@@]2(CCCC2)C1")
+smiles(R"CCCCCCCCCCCCCCCC[C@@H]1C[C@@H]2CCCC[C@H]2C1")
+smiles(R"CCCCCCCCCCCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CCCCCCCCCCCCCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CCCCCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CCCCCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCCCCCCCCCCCC)C6=C12")
+smiles(R"CCCCCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)CCCCCCCCCCCCCCC)C6=C12")
+smiles(R"CCCCCCCCCCCCCCCC(=O)N(CCCN(C)C)[C@@H]1CC[C@H](CC1)N(CCCN(C)C)C(=O)CCCCCCCCCCCCCCC")
+smiles(R"CCCCCCCCCCCCCCCC(=O)N(CCCN(C)C)[C@H]1CC[C@@H](CC1)N(CCCN(C)C)C(=O)CCCCCCCCCCCCCCC")
+smiles(R"CC(C)CCCCCCCCCCCCC(=O)NCC(=O)N[C@H]1[C@H](O)[C@H](O)[C@@H](Nc2ncnc3[nH]cnc23)[C@@H](O)[C@H]1O")
+smiles(R"CCCCCCCCCCCCCCCCS(=O)C[C@@H](O)COC(=O)c1ccc(cc1)C(=O)OC[C@@H](O)CS(=O)CCCCCCCCCCCCCCCC")
+smiles(R"CCCCCCCCCCCCC[C@H]1O[C@@H](CCCCCCCCCCCCC)O[C@@H](CCCCCCCCCCCCC)O1")
+smiles(R"C/C(=C\C=C\C=C(\C)/C=C\C=C(/C)\C(=O)O)/C=C/C=C(\C)/C(=O)O")
+smiles(R"CCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCCCCCCCCC)C6=C12")
+smiles(R"CCCCCCCCCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)CCCCCCCCCCCC)C6=C12")
+smiles(R"CCCCCCCCCCC[C@H]([C@H]1CC[C@H](C)CC1)[C@H]1CC[C@H](C)CC1")
+smiles(R"CCCCCCCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CCCCCCCCCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCCCCCCCC)C6=C12")
+smiles(R"CCCCCCCCCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)CCCCCCCCCCC)C6=C12")
+smiles(R"CCCCCCCCCCCC[Si](CCCCCCCCCCCC)(CCCCCCCCCCCC)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[Si](CCCCCCCCCCCC)(CCCCCCCCCCCC)CCCCCCCCCCCC")
+smiles(R"CCCCCCCCCCCC[Si](CCCCCCCCCCCC)(CCCCCCCCCCCC)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)[Si](CCCCCCCCCCCC)(CCCCCCCCCCCC)CCCCCCCCCCCC")
+smiles(R"CCCCCCCCCC[C@@H]1CC[C@@H](CCCCCCCCCC)CC1")
+smiles(R"C=CCCCCCCCC[C@@H]1OC[C@@](CC)(CCCC)CO1")
+smiles(R"CCCCCCCCCC[C@@H]1OC[C@](CC)(CCCC)CO1")
+smiles(R"C=CCCCCCCCC[C@H]1O[C@H](C)C[C@@H](C)O1")
+smiles(R"CCCCCCCCCC[C@H]1O[C@@H](C)C[C@H](C)O1")
+smiles(R"CCCCCCCCC[C@@H]1OC[C@@](CC)(CCCC)CO1")
+smiles(R"CCCCCCCCC[C@H]1OC[C@@](C)(CCC)CO1")
+smiles(R"CCCCCCCCC[C@@H]1OC[C@@](C)(CC)CO1")
+smiles(R"CCCCCCCCC[C@H]1O[C@H](CCCCCCCCC)O[C@@H](CCCCCCCCC)O1")
+smiles(R"CCCCCCCCCC(=O)NNC(=O)[C@@H](C)[C@@H](O)[C@H](C)C(=O)NNC(=O)CCCCCCCCC")
+smiles(R"CCCCCCCCCC(=O)O[C@@H](CC[C@@H]1CCCO1)CC[C@@H]1CCCO1")
+smiles(R"CCCCCCCC[C@@H]1[C@H](CCCCCCCC(=O)N2C[C@@H]3CC[C@@H](CC3)C2)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)C2(Cl)Cl)Cl")
+smiles(R"CCCCCCCC[C@H]1OC[C@](CC)(CCCC)CO1")
+smiles(R"CCCCCCCC[C@@H]1OC[C@](C)(CCC)CO1")
+smiles(R"CCCCCCCC[C@H]1OC[C@@](C)(CC)CO1")
+smiles(R"CCCCCCCC[C@H]1O[C@@H](C)[C@H](C)O1")
+smiles(R"CCCCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CC(=CCC/C(=C\[C@H]1O[C@H](C)[C@@H](C)O1)/C)C")
+smiles(R"CCCCCCCC[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CCCCCCCCn1nnnc1c1nnn(C)n1")
+smiles(R"CCCCCCCCN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCCCCCCCN(N)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCCCCCCCN(/N=C/c1c2NC(=O)C(=CC=C[C@@H](C)[C@@H](O)[C@H](C)[C@@H](O)[C@H](C)[C@H](OC(=O)C)[C@H](C)[C@H](OC)C=CO[C@]3(C)Oc4c(C)c(O)c(c2O)c(c1O)c4C3=O)C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCCCCC(C)(C)N/[P@@H](/O)=N\C(C)(C)CCCCC")
+smiles(R"CCCCCCCC(=O)N[C@H]1CC[C@@H](CC1)C(C)(C)C")
+smiles(R"C/C=C/[C@@](/C=C/C)(C(=O)OCCN(CC)CC)[C@@](/C=C/C)(/C=C/C)C(=O)OCCN(CC)CC")
+smiles(R"C/C=C/[C@@](/C=C\C)(C(=O)OCCN(C)C)[C@@](/C=C/C)(/C=C/C)C(=O)OCCN(C)C")
+smiles(R"CCCCCCCC(=O)O[C@H]1CC[C@H](CC1)C1CCCCC1")
+smiles(R"C/C=C/[C@@](/C=C\C)(C(=O)O[C@H](C)CN(C)C)[C@@](/C=C/C)(/C=C/C)C(=O)O[C@H](C)CN(C)C")
+smiles(R"CCCCCCCC(=O)OCn1ccc(cc1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12")
+smiles(R"CCCCCCCC(=O)OCn1cccc(c1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12")
+smiles(R"CCCCCCCC[S+](c1ncnc2[nH]cnc12)[Pd@@](Cl)([S+](CCCCCCCC)c1ncnc2[nH]cnc12)[S+](CCCCCCCC)c1ncnc2[nH]cnc12")
+smiles(R"CCCCCC[C@@H]1[C@@H](C#N)C(=O)NC(=O)[C@@H]1C#N")
+smiles(R"CCCCCC[C@@H]1N(CCCN1[C@H](C#N)c1ccccc1)[C@H](C#N)c1ccccc1")
+smiles(R"CCCCCC[C@@H]1OC[C@](CC)(CCCC)CO1")
+smiles(R"CC(C)CCC[C@@H](C)[C@@H]1CC[C@@H]2[C@@H]3CC[C@@H]4Cc5nc6C[C@@]7(C)[C@@H](CC[C@H]8[C@@H]7CC[C@]7(C)[C@H](CC[C@@H]87)[C@H](C)CCCC(C)C)Cc6nc5C[C@@]4(C)[C@@H]3CC[C@@]12C")
+smiles(R"CCCCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"CCCCCCC(=O)C/C(=N\NC(=S)N)/C(=O)N[C@@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3")
+smiles(R"CCCC/C=C/[C@@](O)(C(=O)O[C@H]1CN2CC[C@@H]1CC2)c1ccccc1")
+smiles(R"CCCCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1")
+smiles(R"CCCCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1")
+smiles(R"CCCCCCC(=O)OCn1ccc(cc1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12")
+smiles(R"CCCCCCC(=O)OCn1cccc(c1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12")
+smiles(R"CCCCC[C@@H]1CC[C@H](CC1)OC(=O)C")
+smiles(R"CCCCC[C@H]1CC[C@@H](CC1)OC(=O)C")
+smiles(R"CCCCC[C@H]1CC[C@@H](CC1)OC(=O)NC")
+smiles(R"CCC(CC)([C@@H]1CC[C@@H](O)CC1)[C@@H]1CC[C@@H](O)CC1")
+smiles(R"CCCCC[C@H]1[C@@H]2C(=O)NC(=O)[C@H]1C(=O)NC2=O")
+smiles(R"CCC(CC)[C@H]1N[C@@H](C(CC)CC)N2N1[C@@H]2C(CC)CC")
+smiles(R"CCC(CC)[C@H]1OC[C@H](O)CO1")
+smiles(R"CCCCC[C@H]1O[C@@H](CCCCC)O[C@@H](CCCCC)O1")
+smiles(R"CCCCC[C@H]([C@@H]1SC(=S)NC1=O)[C@@H]1SC(=S)NC1=O")
+smiles(R"C/C=C/C=C/[C@H](O)CC(=O)N1O[C@@]2(C)c3ccccc3[C@]1(C)c1ccccc21")
+smiles(R"CCCCCCN(C)[C@@]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCC)C6=C12")
+smiles(R"CCCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)CCCCC)C6=C12")
+smiles(R"CCCCCCOc1ccc2c(no[n+]2[O-])c1")
+smiles(R"CCCCCCOc1ccc2c(NO[N+]2[O-])c1")
+smiles(R"CC(C)C#C[C@@](O)(C1CCCC1)C(=O)O[C@@H]1[C@@H]2CCN(CC2)[C@H]1C")
+smiles(R"CC(C)/C=C\[C@](O)(C1CCCC1)C(=O)O[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"CCCC#C[C@@](O)(C1CCCC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"CC(=C)C#C[C@@](O)(C1CCCCC1)C(=O)O[C@H]1CN2CC[C@H]1CC2")
+smiles(R"CCCC#C[C@@](O)(C1CCCCC1)C(=O)O[C@H]1CN2CC[C@@H]1CC2")
+smiles(R"CC(=C)C#C[C@@](O)(C(C)C)C(=O)O[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"CC(=C)C#C[C@](O)(C(=O)O[C@H]1[C@@H]2CCN(CC2)[C@H]1C)c1ccccc1")
+smiles(R"CCCCCC(=O)O[C@@H]1CC[C@H](CC1)C1CCCCC1")
+smiles(R"CCCCCC(=O)O[C@H](CC[C@@H]1CCCO1)CC[C@@H]1CCCO1")
+smiles(R"CCCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1")
+smiles(R"CCCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1")
+smiles(R"CCCCCC(=O)OCn1ccc(cc1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12")
+smiles(R"CCCCCC(=O)OCn1cccc(c1)c1c(COC(=O)NC(C)C)c(COC(=O)NC(C)C)c2CCCn12")
+smiles(R"CCC(CC)C(=O)OCn1ccc(cc1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C")
+smiles(R"CCC(CC)C(=O)OCn1cccc(c1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C")
+smiles(R"CCCCCC[Si](CCCCCC)(CCCCCC)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CCCCCC[Si](CCCCCC)(CCCCCC)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CCCCCC[Si](CCCCCC)(CCCCCC)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[Si](CCCCCC)(CCCCCC)CCCCCC")
+smiles(R"CCCCCC[Si](CCCCCC)(CCCCCC)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)[Si](CCCCCC)(CCCCCC)CCCCCC")
+smiles(R"CC(C)(C)[C@@H]1CC[C@@]2(CC1)c1[nH]c3ccccc3c1[C@]1(CC[C@@H](CC1)C(C)(C)C)c1[nH]c3ccccc3c21")
+smiles(R"CC(C)(C)[C@@H]1CC[C@]2(OC[C@H]3CCCN23)CC1")
+smiles(R"CC(C)(C)[C@@H]1CC[C@H](CC1)NC1=NCCO1")
+smiles(R"CCCC[C@@H]1CC[C@H](CC1)NC(=O)Nc1ccccc1")
+smiles(R"CCCC[C@H]1CC[C@@H](CC1)NC(=O)Nc1ccccc1")
+smiles(R"CC(C)(C)[C@@H]1CC[C@H](CC1)P(=S)(C)C")
+smiles(R"CCCC[C@@H]1CC[C@@H](NCC(=C)Br)CC1")
+smiles(R"CC[C@](C)([C@@H]1CC[C@H](O)CC1)[C@H]1CC[C@H](O)CC1")
+smiles(R"CC(C)(C)[C@H]1CC/C(=N/SC(c2ccccc2)(c2ccccc2)c2ccccc2)/CC1")
+smiles(R"C=CCC[C@@H]1C[C@@H](C[C@@]2(OCCO2)C1)C(C)C")
+smiles(R"CCCC[C@@H]1CC(=O)[Pd@]2([O+]=C(C)CC(=[O+]2)C)[N+]1(CC)CC")
+smiles(R"CCCC[C@H]1O[C@@H](CCCC)O[C@@H](CCCC)O1")
+smiles(R"C/C=C/C[C@H](C/C=C/C)c1cc[n+](cc1)[Pt](Cl)(Cl)(Cl)(Cl)[n+]1ccc(cc1)[C@H](C/C=C/C)C/C=C/C")
+smiles(R"CCCC[C@@H](CC)CN1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CCCC[C@@H](CC)CO[C@@H](OC[C@@H](CC)CCCC)[C@H](OC[C@H](CC)CCCC)OC[C@H](CC)CCCC")
+smiles(R"CCCC[C@@H](CC)COC(=O)CC[S@](=O)(=O)CCC(=O)OC[C@@H](CC)CCCC")
+smiles(R"CCCC[C@@H](CC)COC(=O)[C@H]1[C@H](C(=O)OC[C@H](CC)CCCC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl")
+smiles(R"CCCC[C@@H](CC)COC(=O)[C@H](CCC(=O)OC[C@H](CC)CCCC)CCC(=O)OC[C@H](CC)CCCC")
+smiles(R"CCCC[C@@H](CC)C(=O)O[Ge@](CCCC)(CCCC)OC(=O)[C@@H](CC)CCCC")
+smiles(R"CCCC[C@@H](CC)C(=O)O[Sn@](Cc1ccccc1)(Cc1ccccc1)OC(=O)[C@H](CC)CCCC")
+smiles(R"CCCC[C@@H](CC)C(=O)O[Sn@](CCCC)(CCCC)OC(=O)[C@@H](CC)CCCC")
+smiles(R"CCCC[C@H](C(=O)C(=O)N[C@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3)C(=O)C(C)C")
+smiles(R"C=CCCCN1C(=O)[C@H]2[C@@H]3c4ccccc4[C@](C=O)([C@@H]2C1=O)c1ccccc31")
+smiles(R"CCCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CCCCCN(C)[C@]12CN3CN(CN(C3)C2)C1")
+smiles(R"C#CC(C)(C)NC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC/C=C\[C@](O)(C1CCCC1)C(=O)O[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"CCC#C[C@@](O)(C1CCCC1)C(=O)O[C@H]1CN2CC[C@H]1CC2")
+smiles(R"CC(C)(C)CO[C@@H]1[C@@]2(OCCO2)[C@@H]2CC[C@@]1(C)C2(C)C")
+smiles(R"CCCCCOC(=O)N1CCN(CC1)C(=O)[C@H](CCC(=O)[O-])NC(=O)c1cc(cc(n1)c1ccccc1)N1CC[C@@H](COC)CC1")
+smiles(R"CCCCCOC(=O)N1CCN(CC1)C(=O)[C@H](CCC(=O)[O-])NC(=O)c1cc(cc(n1)c1ccccc1)N1CC[C@H](COC)CC1")
+smiles(R"CCC#C[C@@](O)(C(=O)O[C@H]1[C@@H]2CCN(CC2)[C@@H]1C)c1ccccc1")
+smiles(R"CC(C)CC(=O)O[C@@H]1CC[C@@H](CC1)C1CCCCC1")
+smiles(R"CCCCC(=O)O[C@@H]1CC[C@H](CC1)C1CCCCC1")
+smiles(R"CCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1")
+smiles(R"CCCCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1")
+smiles(R"CCCCC(=O)OCn1ccc(cc1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C")
+smiles(R"CCCCC(=O)OCn1cccc(c1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C")
+smiles(R"CC(=C[C@H]1CC[C@]2(OCCO2)[C@]1(C)COCc1ccccc1)C")
+smiles(R"CCC[C@@H]1CC=CC[C@]21C(=O)NC(=O)NC2=O")
+smiles(R"CCC[C@@H]1CCCC[C@]21C(=O)NC(=O)NC2=O")
+smiles(R"C=CC[C@@H]1CCCC[C@@]21OCCO2")
+smiles(R"C/C=C\[C@@H]1[C@H]2C(=O)[C@]3(Cl)[C@@H](/C=C/C)[C@H]3C(=O)[C@]12Cl")
+smiles(R"C=CC[C@H]1C(=[O+][Cu@@]2([O+]=C1C)[O+]=C(C)[C@@H](CC=C)C(=[O+]2)C)C")
+smiles(R"CCC[C@H]1C(=O)N/C(=N)/NC1=O")
+smiles(R"CC(C)[C@H]1O[C@@]2(CCCC2)OCC1(C)C")
+smiles(R"CCC[C@H]1O[C@]2(CCCC2)OC[C@H]1CC")
+smiles(R"CCC[C@H]1OC[C@]2(CO1)CO[C@@H](CCC)OC2")
+smiles(R"C/C=C\[C@H]1O[C@H](C)[C@@H](C)O1")
+smiles(R"CCC[C@@H]1O[C@H](C)[C@@H](C)O1")
+smiles(R"CC(C)[C@H]1O[C@H](O[C@@H](O1)C(C)C)C(C)C")
+smiles(R"CCC[C@H](C1=C(O)C[C@@H](C)CC1=O)C1=C(O)C[C@@H](C)CC1=O")
+smiles(R"CCC[C@@H](C)[C@H]1CC[C@@H](CC1)N[C@H]1CC[C@@H](CC1)[C@@H](C)CCC")
+smiles(R"CC(C)[C@H](SC[C@H](N)C(=O)O)SC[C@H](N)C(=O)O")
+smiles(R"CC(=CC[N@+]12CN3CN(CN(C3)C2)C1)C")
+smiles(R"CCCCN1C[C@H](O)CN[Pt@@]21OC(=O)CC(=O)O2")
+smiles(R"CCCC[N+]1(C[C@@H](O)CN[Pt@@]21OC(=O)CC(=O)O2)Cc1ccccc1")
+smiles(R"CCCCN1CCN/C/1=[S+]\[Cu@@]1(/[S+]=C/2\NCCN2CCCC)O[S@@](=O)(=O)O1")
+smiles(R"CCCCN1[C@H](CO)[C@H](O)[C@H](O)[C@@H](O)[C@H]1CO")
+smiles(R"CCCCN1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CCCCN1C(=O)[C@H](c2ccccc2)[C@@]2(CCN(C)CC2)C1=O")
+smiles(R"CC(=CCN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C")
+smiles(R"CC(C)CN[C@]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCCCNc1ccc2nnc(C)n2n1")
+smiles(R"CCCCN(C)[C@]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCCCNC(C)(C)[C@]1(SS[C@](SS1)(c1ccc(Cl)cc1)C(C)(C)NCCCC)c1ccc(Cl)cc1")
+smiles(R"CCCCN(CCCC)[C@@H]1CC[C@H](CC1)Nc1ccnc2cc(Cl)ccc12")
+smiles(R"CCCCN[C@@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12")
+smiles(R"CC(C)(C)/N=C/N1CC[C@H](CC1)C(c1ccccc1)c1ccccc1")
+smiles(R"CCCCN/C(=[N+]\1/[C@H](C)CCC[C@H]1C)/c1ccccc1")
+smiles(R"CC(C)CNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCCCNC(=O)[C@H]1CC[C@H](CC1)CC1CCCCC1")
+smiles(R"CC(C)(C)N/N=C/1\C(C)(C)/C(=N\NC(C)(C)C)/C1(C)C")
+smiles(R"CC#C[C@](O)(C1CC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"C/C=C\[C@@](O)(C1CCCC1)C(=O)O[C@@H]1[C@@H]2CCN(CC2)[C@@H]1C")
+smiles(R"CC#C[C@@](O)(C1CCCC1)C(=O)O[C@@H]1[C@H]2CCN(CC2)[C@H]1C")
+smiles(R"CC#C[C@@](O)(C1CCCC1)C(=O)O[C@H]1[C@@H]2CCN(CC2)[C@H]1CC")
+smiles(R"C/C=C\[C@](O)(C1CCCC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"C/C=C\[C@@](O)(C1CCCCC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"CC(=C)[C@@](O)(C1CCCCC1)C(=O)O[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"CCCC(=O)C[C@@H](C)C(=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCCCOCN(COCCCC)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCCCOC(=O)[C@@H]1[C@@H](C(=O)OCCCC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl")
+smiles(R"CCCCOC(=O)[C@@H]1[C@H](N[C@H](c2ccc(Cl)cc2)[C@@H](C(=O)OCCCC)[S@@]1(=O)=O)c1ccc(Cl)cc1")
+smiles(R"CCCCOC(=O)[C@@H]1O[C@@]2(CCCC2)O[C@@H]1C(=O)OCCCC")
+smiles(R"CCCCOC(=O)Nc1ccc2c(c1)c1c(ccc3c1[nH]c(=O)c1cccn31)n2CC")
+smiles(R"CC(C)[C@](O)(C(=O)O/C=C/1\C[C@@H]2CCN1CC2)c1ccccc1")
+smiles(R"CC(C)[C@@](O)(C(=O)OCC1=C[C@@H]2CCN1CC2)c1ccccc1")
+smiles(R"CC#C[C@@](O)(C(=O)O[C@@H]1[C@@H]2CCN(CC2)[C@H]1C)C1=CCCC1")
+smiles(R"C/C=C/[C@@](O)(C(=O)O[C@@H]1CN2CC[C@H]1CC2)c1ccccc1")
+smiles(R"CC(=C)[C@@](O)(C(=O)O[C@H]1CN2CC[C@H]1CC2)c1ccccc1")
+smiles(R"CC(=C)[C@@](O)(C(=O)O[C@H]1CN2CC[C@@H]1CC2)c1cccs1")
+smiles(R"CCCCON1C[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H](C1)OC(=O)C")
+smiles(R"CC(=C)C(=O)Nc1ccc2nn(nc2c1)c1ccccc1O")
+smiles(R"CCCC(=O)OC[C@H]1CC[C@H](CC1)COC(=O)CCC")
+smiles(R"CCCC(=O)O[C@@H]1[C@](C)(C)[C@@H](OC(=O)CCC)[C@]1(C)C")
+smiles(R"CCCC(=O)O[C@H]1[C@@](C)(C)[C@H](OC(=O)CCC)[C@]1(C)C")
+smiles(R"CCCC(=O)O[C@H]1[C@@H](OC(=O)CCC)[C@H](OC(=O)CCC)[C@H](OC(=O)CCC)[C@@H](OC(=O)CCC)[C@H]1OC(=O)CCC")
+smiles(R"CCCC(=O)O[C@@H](CC[C@@H]1CCCO1)CC[C@@H]1CCCO1")
+smiles(R"CCCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1")
+smiles(R"CCCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1")
+smiles(R"CCCC(=O)OCn1ccc(cc1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C")
+smiles(R"CCCC(=O)OCn1cccc(c1)c1n2CCCc2c(COC(=O)NC(C)C)c1COC(=O)NC(C)C")
+smiles(R"CCCCOP(=O)(OCCCC)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCCC[Pb]([C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)([C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)[C@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82")
+smiles(R"CCCCP(CCCC)(CCCC)[Pd@]1(Cl)[Cl][Pd@](Cl)([Cl]1)P(CCCC)(CCCC)CCCC")
+smiles(R"CCCCP(CCCC)(CCCC)[Pt@]1(Cl)[Cl][Pt@](Cl)([Cl]1)P(CCCC)(CCCC)CCCC")
+smiles(R"CCCC[Sn@@]1(CCCC)OCCN2CCN(CCO1)CC2")
+smiles(R"CCCC[Sn](CCCC)(CCCC)NC(=S)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCCC[Sn](CCCC)(CCCC)S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCCC[Sn@](CCCC)(OC(=O)/C=C/c1ccccc1F)OC(=O)/C=C/c1ccccc1F")
+smiles(R"CCCC[Sn@](CCCC)(OC(=O)[C@H](OC)c1ccccc1)OC(=O)[C@H](OC)c1ccccc1")
+smiles(R"CCCC[Sn@@](CCCC)(OC(=O)[C@H](OC(=O)C)c1ccccc1)OC(=O)[C@H](OC(=O)C)c1ccccc1")
+smiles(R"CCCC[Sn@@](CCCC)(OS(=O)c1ccccc1)OS(=O)c1ccccc1")
+smiles(R"CC[C@@H]1CC[C@H](CC1)NC(=O)c1ccccc1")
+smiles(R"CC[C@H]1CC[C@@H](CC1)NC(=O)c1ccccc1")
+smiles(R"CC[C@H]1CC[C@@H](CC1)NC(=O)NC")
+smiles(R"C#C[C@H]1CC[C@@H](CC1)NC(=O)NCCCCCCNC(=O)N[C@H]1CC[C@@H](C#C)CC1")
+smiles(R"CC[C@@H]1CC[Si](C)(C)C[C@]21C(=O)NC(=O)NC2=O")
+smiles(R"C=C[C@H]1CN2CC[C@H]1C[C@H]2[C@H](O)c1ccnc2ccccc12")
+smiles(R"CC[C@H]1C(=[O+][Cu@]2([O+]=C1C)[O+]=C(C)[C@H](CC)C(=[O+]2)C)C")
+smiles(R"CC[C@@H]1C(=O)[OH+][Pt@@+2](N)(NCCCCCCN[Pt@+2]2(N)[OH+]C(=O)[C@@H](CC)C(=O)[OH+]2)[OH+]C1=O")
+smiles(R"CC[C@H]1C(=O)[OH+][Pt@+2](N)(NCCCCCN[Pt@+2]2(N)[OH+]C(=O)[C@@H](CC)C(=O)[OH+]2)[OH+]C1=O")
+smiles(R"CC[C@@H]1C(=O)O[Pt@@]2(NCc3cccc[n+]23)OC1=O")
+smiles(R"CC[C@H]1N2CC[C@@H](CC2)[C@@H]1OC(=O)CC(O)(c1ccccc1)c1ccccc1")
+smiles(R"CC[C@@H]1N2CC[C@@H](CC2)[C@H]1OC(=O)C(O)(c1ccccc1)c1ccccc1")
+smiles(R"C=C[C@@H](C)[C@@]1(CCC[C@@]21OCCO2)C(=O)OC")
+smiles(R"CC[C@@H](C)C[C@]12C3=C4C5=C1[Zr]16782345(Cl)(Cl)C2=C7[C@@]8(C[C@H](C)CC)C6=C12")
+smiles(R"CC[C@H](CC[C@H](C)[C@@H]1CC[C@H]2[C@H]3CC=C4C[C@@H](CC[C@]4(C)[C@@H]3CC[C@]12C)[OH+][Ti@]([Cl-])([OH+][C@@H]1CC[C@@]2(C)C(=CC[C@@H]3[C@@H]4CC[C@@H]([C@@H](C)CC[C@@H](CC)C(C)C)[C@@]4(C)CC[C@@H]23)C1)[OH+][C@@H]1CC[C@@]2(C)C(=CC[C@@H]3[C@@H]4CC[C@@H]([C@@H](C)CC[C@@H](CC)C(C)C)[C@@]4(C)CC[C@@H]23)C1)C(C)C")
+smiles(R"CC[C@H](CC[C@H](C)[C@@H]1CC[C@H]2[C@H]3CC=C4C[C@@H](CC[C@]4(C)[C@@H]3CC[C@]12C)[OH+][Ti@@]([Cl-])([OH+][C@@H]1CC[C@@]2(C)C(=CC[C@@H]3[C@@H]4CC[C@@H]([C@@H](C)CC[C@@H](CC)C(C)C)[C@@]4(C)CC[C@@H]23)C1)[OH+][C@@H]1CC[C@@]2(C)C(=CC[C@@H]3[C@@H]4CC[C@@H]([C@@H](C)CC[C@@H](CC)C(C)C)[C@@]4(C)CC[C@@H]23)C1)C(C)C")
+smiles(R"CC[C@H](C)[C@H]1CC[C@H]2/C(=C/C=C\3/C[C@@H](O)C(=C)[C@H](O)C3)/CCC[C@]12C")
+smiles(R"CC[C@H](C)[C@@H]1CC[C@H](CC1)OC(=O)c1ccccc1")
+smiles(R"CC[C@H](C)[C@H](C)CN[C@]12CN3CN(CN(C3)C2)C1")
+smiles(R"CC[C@@H](C/C=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])C/C=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"CC[C@H](C/C=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])C/C=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"CC[C@H](C)[C@](O)(C#C)C(=O)O[C@@H]1[C@H]2CCN(CC2)[C@H]1C")
+smiles(R"C#C[C@H](C)N1CC[C@]2(CC1)C(=O)NCN2c1ccccc1")
+smiles(R"CC[C@H](C)N1CN(c2ccccc2)[C@@]2(CCN(CC2)C[C@@H]2COc3ccccc3O2)C1=O")
+smiles(R"CC[C@H](CO)N1CCN([C@H](CC)CO)[Pt@@]1(Cl)Cl")
+smiles(R"CC[C@H](C(=O)N[C@H]1CN2CC[C@@H]1CC2)c1ccccc1")
+smiles(R"C=C[C@@H](C)S(=O)(=O)[Fe]1234(C#[O+])(C#[O+])C5(=C3(C)C2(=C1(C)[C@]45C)C)C")
+smiles(R"CC[C@H](NC(=O)CCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1ccccc1OC")
+smiles(R"CC(C)[N@@+]12CC[N@+]3(CC[N@+](CC1)(C(C)C)[Mo]23(=O)(=O)=O)C(C)C")
+smiles(R"C=CC[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"C#CC[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCCn1c2[nH]c(=N)sc2c(=O)n(CC)c1=O")
+smiles(R"CC(C)N1CNC(=O)[C@@]21CCN(CC2)C[C@H]1COc2ccccc2O1")
+smiles(R"C=CCn1c(=O)c(C(=O)Nc2scc(n2)[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c(O)c2ccccc12")
+smiles(R"C=CCN1C(=O)[C@H](c2ccccc2)[C@@]2(CCN(C)CC2)C1=O")
+smiles(R"C#CCN1C(=O)[C@@H](c2ccccc2)[C@]2(CCN(C)CC2)C1=O")
+smiles(R"CCCn1c(=O)[nH]c(=O)c2sc(=N)[nH]c12")
+smiles(R"C=CCn1c(=S)[nH]nc1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C=C/C(=[N+]\1/[OH+][W+]23451(C#[O+])(C#[O+])[C@H]1C4=C3C2=C51)/C")
+smiles(R"CCCN[C@@]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCCN(C)[C@@]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCC[N+](CCC)(CCC)CCC")
+smiles(R"CC(C)NCCC[C@H](C)Nc1ccnc2ccc3nn(C)nc3c12")
+smiles(R"CCC[N+](C)(C)CCn1c2[nH]c(=N)sc2c(=O)n(CC)c1=O")
+smiles(R"CC(C)N(C(C)C)C(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CC(C)N(C(C)C)C(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)N(C(C)C)C(C)C")
+smiles(R"CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42[C@@H](O)C(C)(C)C")
+smiles(R"CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)C(C)(C)C")
+smiles(R"CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)N")
+smiles(R"CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)O")
+smiles(R"CC(C)N(C(C)C)C(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42I")
+smiles(R"CC(C)N(C(C)C)p1n(nnn1C(C)(C)C)C(C)(C)C")
+smiles(R"CC(C)N(CCn1c2c(oc(=O)c3ccccc23)c2ccc3ccccc3c12)C(C)C")
+smiles(R"CCCN/C(=[N+]\1/[C@@H](C)CCC[C@@H]1C)/c1ccccc1")
+smiles(R"C=CCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC(C)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCCNC(=O)[C@H]1[C@@H]2CC[C@@H](CC2)[C@@H]1C(=O)NCCC")
+smiles(R"CC(C)NC(=O)OCc1c(c2cccn(COC(=O)C3CC3)c2)n2CCCc2c1COC(=O)NC(C)C")
+smiles(R"CC(C)NC(=O)OCc1c(c2cccn(COC(=O)Cc3ccccc3)c2)n2CCCc2c1COC(=O)NC(C)C")
+smiles(R"CC(C)NC(=O)OCc1c(c2cccn(COC(=O)C(C)(C)C)c2)n2CCCc2c1COC(=O)NC(C)C")
+smiles(R"CC(C)NC(=O)OCc1c(c2ccn(cc2)COC(=O)C(C)(C)C)n2CCCc2c1COC(=O)NC(C)C")
+smiles(R"CC(C)NC(=O)OCc1c(c2ccn(COC(=O)C3CC3)cc2)n2CCCc2c1COC(=O)NC(C)C")
+smiles(R"CC(C)NC(=O)OCc1c(c2ccn(COC(=O)Cc3ccccc3)cc2)n2CCCc2c1COC(=O)NC(C)C")
+smiles(R"CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1cccn(COC(=O)C2CCCCC2)c1")
+smiles(R"CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1cccn(COC(=O)C(C)C)c1")
+smiles(R"CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1cccn(COC(=O)CC(C)C)c1")
+smiles(R"CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1cccn(COC(=O)CC(C)(C)C)c1")
+smiles(R"CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1ccn(COC(=O)C2CCCCC2)cc1")
+smiles(R"CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1ccn(COC(=O)C(C)C)cc1")
+smiles(R"CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1ccn(COC(=O)CC(C)C)cc1")
+smiles(R"CC(C)NC(=O)OCc1c(COC(=O)NC(C)C)c2CCCn2c1c1ccn(COC(=O)CC(C)(C)C)cc1")
+smiles(R"CC(C)(O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C6=C12)C(C)(C)O")
+smiles(R"CC(C)(O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)C(C)(C)O")
+smiles(R"CC(C)(O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC(C)(O)c1cc2c3ccccc3c2cc1C(C)(C)O")
+smiles(R"C=CCOc1ccc2c(no[n+]2[O-])c1")
+smiles(R"C=CCOc1ccc2c(NO[N+]2[O-])c1")
+smiles(R"CC(C)Oc1ccc2[nH]c3c(C)c4ccn(C)cc4c(C)c3c2c1")
+smiles(R"C=CCOc1ccccc1c1nnn(C)n1")
+smiles(R"CCCOc1ccc(cc1OC)[C@H]([C@H](C(=O)C)C(=O)OCC)[C@H](C(=O)C)C(=O)OCC")
+smiles(R"CCC(=O)c1ccc(OC[C@H](O)CN2CC[C@](O)(CC2)c2ccccc2)cc1")
+smiles(R"CC(C)O/C=C\1/[C@H]2CCCC[C@H]2[C@]2(SCCS2)C1=O")
+smiles(R"CC(C)(O)CCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC(C)(O)CCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC[C@](O)([C@H](c1ccccc1)c1ccccn1)[C@H](c1ccccc1)c1ccccn1")
+smiles(R"C=CCOC(=O)[C@@H]1[C@@H](C(=O)OCC=C)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl")
+smiles(R"CCCOC(=O)[C@@H]1[C@H](N[C@@H](c2ccc(OC)cc2)[C@H](C(=O)OCCC)[S@@]1(=O)=O)c1ccc(OC)cc1")
+smiles(R"C=CCOC(=O)[C@@H](C)O[C@@H](C)O[C@H](C)C(=O)OCC=C")
+smiles(R"CCCOC(=O)Nc1ccc2c(c1)c1c(ccc3c1[nH]c(=O)c1cccn31)n2CC")
+smiles(R"C#C[C@](O)(C(=O)O[C@H]1CN2CC[C@H]1CC2)c1ccccc1")
+smiles(R"C=CC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"C=CC(=O)N[C@@]1(CN2CC[C@H]1CC2)c1ccccc1")
+smiles(R"CCC(=O)N[C@@H]1c2ccccc2[C@@]2(CCN(CC2)C(=O)c2cccc(Cl)c2F)[C@H]1OC")
+smiles(R"CCC(=O)N([C@@H]1CCN(CC1)[C@H](C)Cc1ccccc1)c1ccccc1")
+smiles(R"CCC(=O)Oc1ccc2c(c1)c(=O)c1c(NCCCN(C)C)ccc3nnn2c13")
+smiles(R"CCC(=O)O[C@]1(CCN(C/C=C/c2cccc3ccccc23)CC1)c1ccccc1")
+smiles(R"CCC(=O)O[C@@]1(CCN(C/C=C/c2ccc(F)cc2)CC1)c1ccccc1")
+smiles(R"CCC(=O)O[C@@]1([C@@H]2CCN(CC2)C1=C)c1ccccc1")
+smiles(R"C=CC(=O)OCCCS(=O)(=O)[OH+][Pt@+2]1(N[C@H]2CCCC[C@@H]2N1)[OH+]S(=O)(=O)CCCOC(=O)C=C")
+smiles(R"CCC(=O)OC[C@H]1CC[C@H](CC1)COC(=O)CC")
+smiles(R"CCC(=O)O[C@H]1[C@@](C)(C)[C@@H](OC(=O)CC)C1(C)C")
+smiles(R"CCC(=O)O[C@H](CC[C@H]1CCCO1)CC[C@H]1CCCO1")
+smiles(R"CCC(=O)OCn1ccc2c(C)c3[nH]c4ccccc4c3c(C)c2c1")
+smiles(R"CCC(=O)OCn1ccc2c(C)c3[nH]c4ccc(OC)cc4c3c(C)c2c1")
+smiles(R"CC(C)OP(=O)(OC(C)C)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pd@@]1(Br)Br")
+smiles(R"CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pd@@]1(Cl)Cl")
+smiles(R"CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pt@@]1(Br)Br")
+smiles(R"CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pt@@]1(Cl)Cl")
+smiles(R"CCC[S@@]1(=O)CC[S@@](=O)(CCC)[Pt@@]1(I)I")
+smiles(R"CCC[S+]1[Rh](C#[O+])(C#[O+])[S+](CCC)[Rh@@]1(C#[O+])C#[O+]")
+smiles(R"CC(C)[Si](OC[C@H]1C[C@@H](C[C@H]2C[C@@H](C[C@@H]3C[C@H](CO[Si](C(C)C)(C(C)C)C(C)C)OC(C)(C)O3)O[C@](C)(C)O2)OC(C)(C)O1)(C(C)C)C(C)C")
+smiles(R"CC#C[Ti]12345678(C#CC)([C@@H]9C3=C2C1=C49)[C@H]1C7=C6C5=C81")
+smiles(R"CC[Ge@@]1(CC)CC[C@@]2(CC1)NC(=O)N(CCCN(C)C)[C@@H]2O")
+smiles(R"C[C@@H]1[C@]2(C=CC=C2)C1(C)C")
+smiles(R"C[C@@H]1[C@]2(CCCCC2)[N@@+]21CCCC2")
+smiles(R"C[C@@H]1[C@@]2(CCCCC2)[N@+]21CCCC2")
+smiles(R"C[C@@H]1C[As@@+](C[C@H](C)N1C)(c1ccccc1)c1ccccc1")
+smiles(R"C[C@@H]1C[As+](C[C@H](C)N1C)(c1ccccc1)c1ccccc1")
+smiles(R"C[C@H]1C[C@]2(OCCO2)CC[C@@H]1OCc1ccccc1")
+smiles(R"C[C@@H]1CC[C@@]2(CC1)CC(=O)N(N1CCCCC1)C2=O")
+smiles(R"C[C@@H]1CC[C@]2(CC1)N=C1CC[C@@H](C)C[C@H]1[C@]1(CC[C@@H](C)CC1)N2")
+smiles(R"C[C@H]1CC[C@@]2(CC1)NC(=O)N(CNc1ccccc1)C2=O")
+smiles(R"C[C@H]1C/C(=C\c2ccc(cc2)OC(=O)C(C)(C)C)/C(=O)/C(=C/c2ccc(cc2)OC(=O)C(C)(C)C)/C1")
+smiles(R"C[C@H]1C/C(=C\c2ccc(O)c(O)c2)/C(=O)/C(=C/c2ccc(O)c(O)c2)/C1")
+smiles(R"C[C@@H]1CC/C(=C\2/C(=O)N=C3S[Cu@]4(SC5=NC(=O)/C(=C/6\CC[C@@H](C)CC6)/[S+]45)[S+]23)/CC1")
+smiles(R"C[C@@H]1CCCC[C@@]21OCCO2")
+smiles(R"C[C@H]1CCCCCCCCCC[C@]21OCCO2")
+smiles(R"C[C@H]1CC=CC[C@H]1[C@H](OC[C@@H]1CC=CC[C@@H]1C)OC[C@@H]1CC=CC[C@@H]1C")
+smiles(R"C[C@H]1CCCC[C@H]1[C@@](O)(C(=O)O)[C@@H]1CCCC[C@@H]1C")
+smiles(R"C[C@@H]1CCCCC[N@+]21CCCC2")
+smiles(R"C[C@@H]1CCCCC[N@+]21CC[N@@+]1(CCCCC[C@@H]1C)CC2")
+smiles(R"C[C@H]1CCCCN1/C=C/1\C(=O)O[C@@](C)(C)OC1=O")
+smiles(R"C[C@H]1CCCC[N@+]21CCCC2")
+smiles(R"C[C@@H]1CC(C)(C)N[C@@]2(CCCC2)N1")
+smiles(R"C[C@H]1CC(C)(C)O[C@]2(CCCC2)O1")
+smiles(R"C[C@@H]1CC[C@H](CC1)c1cc(c2ccccc2)n(n1)c1ccccc1")
+smiles(R"C[C@H]1CC[C@H](CC1)C(C)(C)c1ccc(O)cc1")
+smiles(R"C[C@@H]1CC[C@H](CC1)C(C)(C)OCCN(C)C")
+smiles(R"C[C@H]1CC[C@H](CC1)C(C)(C)OC(=O)COC(=O)C")
+smiles(R"C[C@@H]1CC[C@@H](CC1)C(=O)[C@H]1CCCC[C@H]1CC1CCCCC1")
+smiles(R"C[C@@H]1CC[C@H](CC1)[C@@](O)(C(=O)O)[C@@H]1CC[C@@H](C)CC1")
+smiles(R"C[C@H]1CC[C@@H](CC1)C(=O)O[C@H]1CC[C@H](CC1)C(C)(C)C")
+smiles(R"C[C@@H]1CC[C@H](CC1)NC(=O)C")
+smiles(R"C[C@H]1CC[C@@H](CC1)NC(=O)C")
+smiles(R"C[C@@H]1CC[C@H](CC1)NC(=O)[C@]1(C)Cn2c3ccccc3nc2C(=O)N1Cc1ccccc1Cl")
+smiles(R"C[C@@H]1CC[C@H](CC1)Oc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"C[C@H]1CC[C@@H](CC1)Oc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"C[C@@H]1CC[C@H](CC1)O[C@H](C[N+](=O)[O-])C(Cl)(Cl)Cl")
+smiles(R"C[C@H]1CC[C@@H](CC1)O[C@H](C[N+](=O)[O-])C(Cl)(Cl)Cl")
+smiles(R"C[C@@H]1CC[C@@H](CC1)OS(=O)(=O)c1ccc(C)cc1")
+smiles(R"C[C@H]1CC[C@H](C(C)C)[C@@]2(OC[C@](C)(C)CO2)C1")
+smiles(R"C[C@H]1CC[C@H](C(C)C)[C@@H](C1)[C@@]12C3=C4C5=C1[Zr]16782345(Cl)(Cl)C2=C7[C@]8([C@@H]3C[C@@H](C)CC[C@@H]3C(C)C)C6=C12")
+smiles(R"C[C@@H]1CC[C@@H](NCCOC(=O)c2ccc(cc2)[N+](=O)[O-])CC1")
+smiles(R"C[C@H]1CC[C@H](NCCOC(=O)c2ccc(cc2)[N+](=O)[O-])CC1")
+smiles(R"C[C@@H]1CCC[N@+]2(CCCC2)C1")
+smiles(R"C[C@H]1CCC[NH+](CCNC(=O)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)C1")
+smiles(R"C[C@@H]1CC/C(=N/Nc2ccc(cc2)[N+](=O)[O-])/CC1")
+smiles(R"C[C@H]1CC/C(=N\Nc2ccc(cc2)[N+](=O)[O-])/CC1")
+smiles(R"C[C@@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"C[C@@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"C[C@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"C[C@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"C[C@H]1CC/C(=N/NS(=O)(=O)c2ccc(cc2)NC(=O)C)/CC1")
+smiles(R"C[C@@H]1CC/C(=N\NS(=O)(=O)c2ccc(cc2)[N+](=O)[O-])/CC1")
+smiles(R"C[C@H]1CC/C(=N/NS(=O)(=O)c2ccc(cc2)[N+](=O)[O-])/CC1")
+smiles(R"C[C@H]1CC[C@](O)(CC1)[C@](C)(C(=O)O)c1ccccc1")
+smiles(R"C[C@H]1C[C@H](C)[C@@H](C)C1")
+smiles(R"C[C@H]1C[C@H](C[N+](=O)[O-])C[C@]2(OCCO2)C1")
+smiles(R"C[C@H]1C[C@H](C[N+](=O)[O-])C[C@@]2(OCCO2)C1")
+smiles(R"C[C@@H]1C[C@H](C)N[Pt@]2(N1)OC(=O)C(=O)O2")
+smiles(R"C[C@H]1C[C@H](C)O[C@]2(CCCC2)O1")
+smiles(R"C[C@H]1C[C@@H](O[Ti@@](O[C@@H]2C[C@H](C)CC(C)(C)C2)(O[C@@H]2C[C@H](C)CC(C)(C)C2)O[C@H]2C[C@@H](C)CC(C)(C)C2)CC(C)(C)C1")
+smiles(R"C[C@@H]1CCN(CC1)CCC(=O)C[C@H](c1ccccc1)c1c(=O)oc2ccccc2c1O")
+smiles(R"C[C@H]1CCN(CC1)[C@@H](c1ccccc1)[C@H](O)c1ccccc1")
+smiles(R"C[C@H]1CCN(CC1)[C@@H](c1ccccc1)C(=O)c1ccccc1")
+smiles(R"C[C@H]1CCN(CC1)[C@H](Cc1ccccc1Cl)c1ccccc1")
+smiles(R"C[C@@H]1CCN(CC1)C(=S)N/N=C(\C)/c1cccc[n+]1[O-]")
+smiles(R"C[C@H]1CCN(CC1)C(=S)N/N=C(\C)/c1cccc[n+]1[O-]")
+smiles(R"C[C@H]1CCN(CC1)C(=S)N/N=C(\C)/c1nccnc1C")
+smiles(R"C[C@H]1CCN(CC1)/N=N/c1nc2c([nH]1)n(C)c(=O)n(C)c2=O")
+smiles(R"C[C@H]1CCN(CC1)S(=O)(=O)c1cc(cc(C)c1C)C(=O)OCC(=O)N[C@H](C)c1ccco1")
+smiles(R"C[C@H]1CCN[Pt@@]2(N1)OC(=O)C(=O)O2")
+smiles(R"C[C@@H]1CCO[C@]2(CCCC2)O1")
+smiles(R"C[C@H]1[C@@H]2O[C@@H]2[C@@H](C)[S@]1(=O)=O")
+smiles(R"C[C@@H]1[C@@H](C)[C@]1(F)c1ccccc1")
+smiles(R"C[C@@H]1[C@@H](C)[C@@]1(F)c1ccccc1")
+smiles(R"C[C@@H]1[C@H](C)[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"C[C@H]1CN1C1=CC(=O)C2=C(C1=O)[C@H]1c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"C[C@H]1CN1P1(=NP(=NP(=N1)(N1C[C@@H]1C)N1C[C@H]1C)(N1C[C@H]1C)N1C[C@@H]1C)N1C[C@@H]1C")
+smiles(R"C[C@@H]1CN1P(=[O+][Cu@@+2]([O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)([O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)[O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C")
+smiles(R"C[C@@H]1CN1P(=[O+][Cu@+2]([O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)([O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)[O+]=P(N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C)(N1C[C@H]1C)N1C[C@H]1C")
+smiles(R"C[C@@H]1CN2C[C@H](C)O[Si@](CCCCCC[Si@]34O[C@H](C)CN(C[C@H](C)O3)C[C@H](C)O4)(O1)O[C@@H](C)C2")
+smiles(R"C[C@@H]1CN2C[C@H](C)O[Si@](CC[Si@]34O[C@H](C)CN(C[C@H](C)O3)C[C@H](C)O4)(O1)O[C@@H](C)C2")
+smiles(R"C[C@H]1CN2C[C@H](C)O[Si@](CC[Si](C)(C)C)(O1)O[C@@H](C)C2")
+smiles(R"C[C@H]1CN(CC[C@@]21OCCO2)C1(CCCCC1)c1ccccc1")
+smiles(R"C[C@@H]1CN=C(N1)c1ccc(cc1)NC(=O)[C@@H]1CC[C@@H](CC1)C(=O)Nc1ccc(cc1)C1=N[C@H](C)CN1")
+smiles(R"C[C@@H]1CN[Pt@]2(N1)OC(=O)C(=O)O2")
+smiles(R"C[C@@H]1COC2=[N+]1[Pd@+]([CH2-])(Cl)[N+]1=C(OC[C@@H]1C)[C@]2(C)C")
+smiles(R"C[C@@H]1COC2=[N+]1[Pd@+]([CH2-])(Cl)[N+]1=C(OC[C@@H]1C)C2(C)C")
+smiles(R"C[C@@H]1C(=O)C(c2ccccc2)(c2ccccc2)[C@@H](C)C[N@@+]21CCCCCC2")
+smiles(R"C[C@@H]1N2CCc3ccccc3[C@H]2[C@@H]2c3ccccc3CCN12")
+smiles(R"C[C@H]1N2CC[C@@H](CC2)[C@H]1OC(=O)C(O)(c1ccccc1)c1ccccc1")
+smiles(R"C[C@@H]1NC(=S)N(c2ccc(cc2)[S@@](=O)(=O)c2ccc(cc2)N2C(=S)N[C@H](C)C2=O)C1=O")
+smiles(R"C[C@H]1O[C@@]2(CCCC2)OCC1(C)C")
+smiles(R"C[C@H]1O[C@]2(CCCC2)O[C@H]1C")
+smiles(R"C[C@@H]1O[C@]2(OCCO2)C[C@H](OCc2ccccc2)[C@H]1OCc1ccccc1")
+smiles(R"C[C@@H]1O[C@](C)(Cc2ccccc2)O[C@H]1C")
+smiles(R"C[C@H]1O[C@@](C)(CCc2ccccc2)O[C@@H]1C")
+smiles(R"C[C@@H]1O[C@](C)(O[C@H]1C)c1ccc2ccccc2c1")
+smiles(R"C[C@@H]1O[C@](C)(O[C@H]1C)c1ccccc1")
+smiles(R"C[C@@H]1O[C@](C)(O[C@H]1C)c1ccc(Cl)c(O)c1")
+smiles(R"C[C@@H]1O[C@@H](c2cnn(n2)c2ccccc2)[C@@H](O)[C@H]1O")
+smiles(R"C[C@H]1O[C@H](Cc2ccccc2)O[C@@H]1C")
+smiles(R"C[C@H]1O[C@H](C)C[C@]2(CCCC2)C1")
+smiles(R"C[C@@H]1O[C@@H](CCc2ccccc2)O[C@H]1C")
+smiles(R"C[C@H]1O[C@H](O[C@@H]1C)c1cc2OCOc2cc1Br")
+smiles(R"C[C@H]1O[C@H](O[C@@H]1C)c1ccc2OCOc2c1")
+smiles(R"C[C@H]1O[C@H](O[C@@H]1C)c1ccccc1")
+smiles(R"C[C@@H]1O[C@H](O[C@H]1C)c1ccc(cc1)C(C)C")
+smiles(R"C[C@@H]1O[C@H](O[C@H]1C)c1ccccc1Cl")
+smiles(R"C[C@H]1O[C@@H](O[C@@H]1C)c1cccc(c1)[N+](=O)[O-]")
+smiles(R"C[C@H]1O[C@H](O[C@@H]1C)c1cccc(c1)[N+](=O)[O-]")
+smiles(R"C[C@@H]1O[C@@H](O[C@H]1C)c1ccc(Cl)c(Cl)c1")
+smiles(R"C[C@@H]1O[C@@H](O[C@H]1C)c1ccco1")
+smiles(R"C[C@@H]1O[C@@H](O[C@H]1C)c1c(Cl)cccc1[N+](=O)[O-]")
+smiles(R"C[C@@H]1O[C@H](O[C@H]1C)c1c(Cl)cccc1[N+](=O)[O-]")
+smiles(R"C[C@@H]1O[C@H](O[C@H]1C)[C@H]1CCC=CC1")
+smiles(R"C[C@@H]1OC(=O)[C@@H](c2ccccc2)[C@]2(CCCC2)O1")
+smiles(R"C[C@@H]1S[C@@H](C)[C@]23C4=C5C6=C2[Fe]27893456C3=C8[C@]19C7=C23")
+smiles(R"C[C@@H](c1ccccc1)[C@]12C3=C4C5=C1[Hf]16782345(Cl)(Cl)[C@@H]2C7=C6C1=C82")
+smiles(R"C[C@@H](c1ccccc1)[C@]12C3=C4C5=C1[Zr]16782345(Cl)(Cl)[C@@H]2C7=C6C1=C82")
+smiles(R"C[C@H](Cc1ccccc1)N[Pt@](Cl)(Cl)N[C@H](C)Cc1ccccc1")
+smiles(R"C[C@@H](CC[C@@H](CCCC[C@@H](CC[C@H](C)CC(C)(C)C)CC[C@H](C)CC(C)(C)C)CC[C@@H](C)CC(C)(C)C)CC(C)(C)C")
+smiles(R"C[C@H](CC[C@@H](CC[C@H](C)CC(C)(C)C)CC[C@H](C)CC(C)(C)C)CC(C)(C)C")
+smiles(R"C[C@H](CC[Si@](F)(CC[C@H](C)CC(C)(C)C)CC[C@H](C)CC(C)(C)C)CC(C)(C)C")
+smiles(R"C[C@H]([C@H]1CCC[C@H]2CCCC[C@H]12)[C@H]1CCC[C@H]2CCCC[C@H]12")
+smiles(R"C[C@H]([C@H]1CC[C@H]2CC[C@H]3CCC[C@H]1[C@@H]23)[C@H]1CC[C@H]2CC[C@H]3CCC[C@H]1[C@@H]23")
+smiles(R"C[C@@H](CN1C[C@@H]2CC[C@@H](CC2)C1)C(=O)c1cccs1")
+smiles(R"C[C@@H](CNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CC[Hg]N1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"C[C@@H](N)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C[C@@H](N)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C[C@H](N)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"C[C@H](N)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"C[C@@H](NCc1ccccc1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C[C@@H]([N+](C)(C)C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C[C@@H]([N+](C)(C)C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C[C@@H](N[C@H](C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)N)c1ccccc1")
+smiles(R"C[C@H](O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C[C@H](O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"C[C@@H](O)C1=C[C@@]2(C=C[C@H]3[C@@H](C=C[C@@H]23)C2OC[C@](C)(C)CO2)OC1=O")
+smiles(R"C[C@@H](O)C1=C[C@@]2(C=C[C@H]3[C@@H](C=C[C@@H]23)C2OC[C@@](C)(C)CO2)OC1=O")
+smiles(R"C[C@H](O)C[C@@H]1CCCC[C@@]21OCCO2")
+smiles(R"C[C@@H](O)[C@@H](O)[C@@H](O)c1cnn(n1)c1ccccc1")
+smiles(R"C[C@H](O)C[N@@+]12CC[N@+](CC1)(C[C@H](C)O)[Pt@]2(Cl)Cl")
+smiles(R"C[C@H](O)C[N@+]12CC[N@@+](CC1)(C[C@H](C)O)[Pt@@]2(I)I")
+smiles(R"C[C@H](OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)[C@@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1")
+smiles(R"C[C@H](OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1")
+smiles(R"C[C@H](S[C@@H](C)C(=O)N/N=C\c1ccccc1F)C(=O)N/N=C/c1ccccc1F")
+smiles(R"C[C@H](S[C@@H](C)C(=O)N/N=C(/C)\c1ccc(cc1)OS(=O)(=O)C)C(=O)N/N=C(\C)/c1ccc(cc1)OS(=O)(=O)C")
+smiles(R"CC[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2ccccc12")
+smiles(R"CCn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2cc(C)c(C)cc12")
+smiles(R"CCn1c2ccc3c(ncc4cccn34)c2c2ccccc12")
+smiles(R"CCn1c2ccc3c(ncc4cccn34)c2c2cc(N)ccc12")
+smiles(R"CCn1c2ccc3c([nH]c(=O)c4cccn34)c2c2cc(N)ccc12")
+smiles(R"CCn1c2ccc(NC(=O)OC(C)C)cc2c2c1ccc1c2[nH]c(=O)c2cccn12")
+smiles(R"CCn1c2nc3cc4ccccc4cc3c(=O)n2c2ccccc2c1=O")
+smiles(R"CCn1c2nc3ccccc3nc2n(CC)c2nc3ccccc3nc12")
+smiles(R"CCN1CC[C@@]2(CC1)O[C@H](c1ccccc1)[C@@H](O2)c1ccccc1")
+smiles(R"CCN1CCC[C@@H](C1)NP1(=O)OC[C@](C)(CO1)[N+](=O)[O-]")
+smiles(R"CCN1CCC[C@@H](C1)NP1(=O)OC[C@@](C)(CO1)[N+](=O)[O-]")
+smiles(R"CC[N+]1(CC)CCN2CC[N+](CC)(CC)[Pd@@+]12Cl")
+smiles(R"CC[N+]1(C)C[C@H]2CC[C@H](CC2)C1")
+smiles(R"CCN1CCN(CC1)c1ccc(cc1)Nc1ccnc2ccc3nn(C)nc3c12")
+smiles(R"CCN1CN(c2ccccc2)[C@@]2(CCN(CC2)C[C@@H]2COc3ccccc3O2)C1=O")
+smiles(R"CCn1cn(c2c(O)nc(N)nc12)[Pt@@](N)(Cl)n1cccc2ccccc12")
+smiles(R"CCn1cn(c2c(O)nc(N)nc12)[Pt](N)(N)Cl")
+smiles(R"CCn1c(=O)n(CC)c(=O)c2sc(=N)n(C)c12")
+smiles(R"CCn1nnc(/N=N/c2nnn(CC)n2)n1")
+smiles(R"CCN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCN(c1ccccc1)c1cc2c(no[n+]2[O-])cc1[N+](=O)[O-]")
+smiles(R"CCN(c1ccccc1)c1cc2c(NO[N+]2[O-])cc1[N+](=O)[O-]")
+smiles(R"CCNc1ccc(cc1)/C(=C/1\C=C/C(=N)/C=C1)/c1ccc(N(CC)CC)c(C)c1")
+smiles(R"C/C(=N\c1ccccc1)/C(=N\c1ccccc1)/C")
+smiles(R"CC/[N+](=C/1\C=C/C(=C(/c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)[O-])\c2ccccc2Cl)/C=C1)/Cc1cccc(c1)S(=O)(=O)O")
+smiles(R"CC/[N+](=C\1/C=C/C(=C(\c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)[O-])/c2ccccc2Cl)/C=C1)/Cc1cccc(c1)S(=O)(=O)O")
+smiles(R"CC/[N+](=C/1\C=C/C(=C(/c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)O)\c2ccc(cc2)S(=O)(=O)[O-])/C=C1)/Cc1cccc(c1)S(=O)(=O)O")
+smiles(R"CC/[N+](=C\1/C=C/C(=C(\c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)O)/c2ccc(cc2)S(=O)(=O)[O-])/C=C1)/Cc1cccc(c1)S(=O)(=O)O")
+smiles(R"CC/[N+](=C/1\C=C/C(=C(\c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)O)/c2ccc(O)cc2S(=O)(=O)[O-])/C=C1)/Cc1cccc(c1)S(=O)(=O)O")
+smiles(R"CC/[N+](=C\1/C=C/C(=C(/c2ccc(cc2)N(CC)Cc2cccc(c2)S(=O)(=O)O)\c2ccc(O)cc2S(=O)(=O)[O-])/C=C1)/Cc1cccc(c1)S(=O)(=O)O")
+smiles(R"C/C(=N/c1ccncc1)/C(=N/c1ccncc1)/C")
+smiles(R"C/C(=N\c1n(C)c(=O)n(C)c(=O)c1N)/C/C(=N\c1n(C)c(=O)n(C)c(=O)c1N)/C")
+smiles(R"CC(=NC1=[O+][Mn]2(ON1)ONC(=[O+]2)N=C(C)C)C")
+smiles(R"CC/N=C\1/S[C@H]2N(C)C(=O)[C@@H](S1)N(C)C2=O")
+smiles(R"CCN(C)[C@]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCN(Cc1ccccc1)c1ccc(cc1)/C(=C/1\C=C/C(=[N+](\CC)/Cc2ccccc2)/C=C1)/c1cc(O)c(cc1S(=O)(=O)[O-])S(=O)(=O)O")
+smiles(R"CCN(Cc1ccccc1)c1ccc(cc1)/C(=C\1/C=C/C(=[N+](/CC)\Cc2ccccc2)/C=C1)/c1cc(O)c(cc1S(=O)(=O)[O-])S(=O)(=O)O")
+smiles(R"CCN(CC)c1ccc2cc(C(=O)Nc3scc(n3)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(=O)oc2c1")
+smiles(R"CCN(CC)c1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1")
+smiles(R"CCN(CC)c1c(C)nnc2c3c(nnc(c4ccccc4)c3c3ccccc3)nn12")
+smiles(R"CCN(CC)[C@]1(OC[C@@]2(CO1)CO[C@](OC2)(N(CC)CC)[C@H](F)C(F)(F)F)[C@H](F)C(F)(F)F")
+smiles(R"CCN(CC)C1=[S+][Ni@@]2(S1)[S+](Cc1ccccc1)[Ni@@]1(SC(=[S+]1)N(CC)CC)[S+]2Cc1ccccc1")
+smiles(R"CCN(CC)Cc1cc(ccc1OC)Nc1nc(N[C@@H]2CC[C@H](CC2)N(C)C)c2ccccc2n1")
+smiles(R"CCN(CC)Cc1cc(ccc1O)Nc1ccnc2ccc3nn(C)nc3c12")
+smiles(R"CC[N+](CC)(CC)CCCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCN(CC)CCC[C@H](C)Nc1ccnc2ccc3nn(C)nc3c12")
+smiles(R"CCN(CC)CCCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31")
+smiles(R"CC[N+](C)(C)CCCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC[N+](C)(C)CCCOC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC[N+](C)(CC)CCOC(=O)[C@H](c1ccccc1)[C@@]1(O)CC[C@@H](C)CC1")
+smiles(R"CCN(CC)C[C@@H](O)[C@H]1CC[C@@H](CC1)c1ccccc1")
+smiles(R"CCN(CC)CCn1c(nc2cc(ccc12)[N+](=O)[O-])C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCN(CC)CCn1c(nc2cc(ccc12)[N+](=O)[O-])CC12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1ccccc31")
+smiles(R"CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(ccc31)[N+](=O)[O-]")
+smiles(R"CCN(CC)CCNc1ccc2NNn3c2c1c(=O)c1cc(ccc31)[N+](=O)[O-]")
+smiles(R"CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(ccc31)OC(=O)C")
+smiles(R"CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(C)ccc31")
+smiles(R"CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31")
+smiles(R"CCN(CC)CCNc1ccc2nnn3c2c1c(=O)c1cc(OC)ccc31")
+smiles(R"CCN(CC)CCNc1ccc2nnn3c4ccc(OCCN(CC)CC)cc4c(=O)c1c23")
+smiles(R"CCN(CC)CC(=O)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCN(CC)CCOC(=O)[C@H]1CC[C@@H](C)CC1")
+smiles(R"CCN(CC)CCOC(=O)[C@@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1")
+smiles(R"CCN(CC)CCOC(=O)[C@](O)(C1CCCCC1)[C@@H]1CC[C@@H](C)CC1")
+smiles(R"CCN(CC)CCOC(=O)[C@](O)(C1CCCCC1)[C@H]1[C@@H](C)CCC[C@@H]1C")
+smiles(R"CCN(CC)CCOC(=O)[C@](O)([C@@H]1CC[C@H](CC1)C(C)C)[C@@H]1CC[C@H](CC1)C(C)C")
+smiles(R"CCN(CC)[C@H]1CC[C@@H](CC1)[C@@H]1[C@@H](C)[C@H](Oc2cc3OCOc3cc12)N1CCOCC1")
+smiles(R"CCN(CC)[C@@H]1CC[C@H](CC1)NS(=O)(=O)c1ccc(cc1)NC(=O)C")
+smiles(R"CC/N=C(/CC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)\N(CC)CC")
+smiles(R"CCN(CC)C(=O)O[C@@H]1[C@@](C)(C)[C@@H](OC(=O)N(CC)CC)[C@]1(C)C")
+smiles(R"CCN(CC)C(=S)S[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@@-]9(SC(=S)N(CC)CC)C7=C41")
+smiles(R"CCN(CC)C(=S)S[C@@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@-]9(SC(=S)N(CC)CC)C7=C41")
+smiles(R"CCN[C@@H]1[C@]2(CCCCC2)NC(=O)[C@@]21CCCCC2")
+smiles(R"CCNC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CCNC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CCNC(=S)NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC(=NN1C(=O)[C@@H]2[C@@H]3c4ccccc4[C@](OC(=O)C)([C@H]2C1=O)c1ccccc31)C")
+smiles(R"C/C(=N\Nc1ccccc1)/CC(=O)NC1=CC=C(CC1)NC(=O)C/C(=N\Nc1ccccc1)/C")
+smiles(R"C/C(=N/N=C(/C)\C(=N/N=C/c1ccccn1)\C)/C(=N/N=C(/C)\C(=N/N=C\c1ccccn1)\C)/C")
+smiles(R"C/C(=N\NC(=N)N)/CC/C(=N\NC(=N)N)/C")
+smiles(R"C/C(=N\NC(=N)N)/C/C(=N\NC(=N)N)/C")
+smiles(R"C/C(=N\NC(=O)c1ccccc1)/C(=N\NC(=O)c1ccccc1)/C")
+smiles(R"C/C(=N\NC(=O)c1ccccc1O)/C1=C(C)NC(=C(/C(=N/NC(=O)c2ccccc2O)/C)[C@@H]1C)C")
+smiles(R"C/C(=N\NC(=O)C(=O)N/N=C(/C)\CCC(=O)O)/CCC(=O)O")
+smiles(R"C/C(=N\NC(=S)N1CCCCC1)/C(=N\NC(=S)N1CCCCC1)/C")
+smiles(R"CC(=NNC(=S)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C")
+smiles(R"CCN(N=O)[C@H]1[C@]2(CCCC2)NC(=O)[C@@]21CCCC2")
+smiles(R"CCNP(=O)(CCl)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC#[N+][Pt@@H+2]1([H-][MoH]2345(C#[O+])(C#[O+])(C6=C3C4=C2[C@H]56)P1(c1ccccc1)c1ccccc1)P(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"CC#[N+][PtH2+2]1([H-][MoH2]2345(C#[O+])(C#[O+])(C6=C3C4=C2C56)P1(c1ccccc1)c1ccccc1)P(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"CCO")
+smiles(R"CC(=O)C12=C3[C@-]45CCC(=O)[C@-]67C8=C9C%10=C6[Fe+2]6235789%10C4=C16")
+smiles(R"CC(=O)C12=C3[C@-]45CCC(=O)[C@@-]67C8=C9C%10=C6[Fe+2]6235789%10C4=C16")
+smiles(R"CC(=O)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"CC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)C)C6=C12")
+smiles(R"CC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)C)C6=C12")
+smiles(R"CC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)C)C6=C12")
+smiles(R"CC(=O)c1ccc2=c3cc(ccc3=c2c1)C(=O)C")
+smiles(R"CCOc1ccc2c(c1)c(=O)c1c(NCCN(CC)CC)ccc3nnn2c13")
+smiles(R"CCOc1ccc2[nH]c3c(C)c4ccn(C)cc4c(C)c3c2c1")
+smiles(R"CCOc1ccc2nnnn2n1")
+smiles(R"CCOc1cccc2OC[C@H](CN3CC[C@]4(CC3)C(=O)NCN4c3ccccc3)Oc12")
+smiles(R"CC(=O)c1ccc(cc1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCOc1ccccc1/C=c/1\sc2nc(nn2c1=O)c1ccc(F)cc1")
+smiles(R"CCOc1ccccc1/C=N/N/C(=N/N=C/c1ccccc1OCC)/N/N=C/c1ccccc1OCC")
+smiles(R"CCOc1ccccc1/C=N/N/C(=N)/N/N=C\c1ccccc1OCC")
+smiles(R"CCOc1ccccc1/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCOc1ccc(cc1)C(=O)N1C[C@@H](C(=O)NCC(C)(C)[NH+]2CCOCC2)[C@]2(CC[NH2+]CC2)C1")
+smiles(R"CCOc1ccccc1C(=O)O[C@@H]1CC[C@@H](C)CC1")
+smiles(R"CCOc1ccc(cc1)N1C(=O)[C@@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@@H]2C1=O")
+smiles(R"CCOc1ccc(cc1)NC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCOc1ccccc1NC(=O)CCc1nnc2s/c(=C\CCc3ccccc3)/c(=O)n12")
+smiles(R"CC(=O)c1ccc(cc1)/N=N\c1ccc2nonc2c1N")
+smiles(R"CCOc1ccc(cc1OC)[C@H]1N2CCCN1CC2")
+smiles(R"CCOc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)ccc1O")
+smiles(R"CCOc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)ccc1OCC")
+smiles(R"CCOc1ccn(CC(=O)N2CC[C@]3(CC2)SS[C@@]2(CCN(CC2)C(=O)Cn2ccc(OCC)nc2=O)S3)c(=O)n1")
+smiles(R"CCOc1cc(OCC)c(OCC)cc1/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCOc1ncn(n1)c1ccc(cc1)NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCO[C@@]1(NC(=O)N(C)C)[C@@H]2CCCC[C@@H]12")
+smiles(R"CC(=O)c1nnc2n[nH]c(=S)n2n1")
+smiles(R"CC(=O)c1nnn(n1)c1ccccc1")
+smiles(R"CCO[C@@]1(OCC)[C@@]2(Cl)[C@@H]3[C@H]4C[C@@H]([C@H]5[C@H]4[C@@]4(Cl)C(=C(Cl)[C@@]5(Cl)C4(OCC)OCC)Cl)[C@H]3[C@]1(Cl)C(=C2Cl)Cl")
+smiles(R"CCOC1=[O+][Ti]2([OH+]CC)([OH+]CC)([O+]=C(OCC)[CH-]C(=[O+]2)C23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[O+]=C([CH-]1)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCOC1=[O+][Ti]2([OH+]CC)([OH+]CC)([O+]=C(OCC)[CH-]C(=[O+]2)C23C[C@H]4C[C@H](C[C@H](C4)C3)C2)[O+]=C([CH-]1)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CC(=O)CC1=C(OC(C)C)[C@]2(OCCO2)[C@@H]1O")
+smiles(R"CC(=O)C(C[C@H]1CC[C@H](CC1)CC(C(=O)C)C(=O)C)C(=O)C")
+smiles(R"CC(=O)C[C@H]1C[C@]2(OCCO2)CCC1=O")
+smiles(R"CCOC[C@@H]1CO[C@]2(CCCC2)O1")
+smiles(R"CCOCCN(CCOCC)C(=O)c1ccc2c(no[n+]2[O-])c1")
+smiles(R"CCOCCN(CCOCC)C(=O)c1ccc2[N+]([O-])ONc2c1")
+smiles(R"CC(=O)C(=CN[C@@H]1C[C@H](NC=C(C(=O)C)C(=O)C)C[C@@H](NC=C(C(=O)C)C(=O)C)C1)C(=O)C")
+smiles(R"CC(=O)CC(=O)[C@H]1CC[C@@H](CC1)C(=O)CC(=O)C")
+smiles(R"CC(=O)CC(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CC(=O)CC(=O)NC[C@@H]1CC[C@H](CC1)CNC(=O)CC(=O)C")
+smiles(R"CC(=O)[C@@H]1C[C@@]21c1ccccc1c1ccccc21")
+smiles(R"CC(=O)[C@@H]1C[C@@]21c1ccccc1Cc1ccccc21")
+smiles(R"CC(=O)[C@@H]1C[C@]2(C(=O)C1=O)c1ccccc1c1ccccc21")
+smiles(R"CCO[C@@H]1CC[C@@]23C4=C5C6=C2[Fe]27893456C3=C8[C@@]19C7=C23")
+smiles(R"CC(=O)[C@H]1CC[C@H]2[C@H]3C[C@H](C)[C@]4(O)CC5(OC[C@](C)(C)CO5)CC[C@]4(C)[C@H]3C(=O)C[C@]12C")
+smiles(R"CC(=O)[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"CC(=O)[C@H]1[C@H]2c3ccccc3[C@@H]([C@@H]1C)c1ccccc21")
+smiles(R"CC(=O)[C@@H]1[C@@H](N=N[C@@]21c1ccccc1Oc1ccccc21)c1ccccc1")
+smiles(R"CC(=O)[C@H]1C(=O)C[C@H](/C=C/c2ccccc2)CC1=O")
+smiles(R"CC(=O)[C@H]1C(=[O+][Cr]23([O+]=C1C)([O+]=C(C)[C@@H](C(=O)C)C(=[O+]2)C)[O+]=C(C)[C@@H](C(=O)C)C(=[O+]3)C)C")
+smiles(R"CC(=O)[C@H]1C(=[O+][Cu@]2([O+]=C1C)[O+]=C(C)[C@@H](C(=O)C)C(=[O+]2)C)C")
+smiles(R"CCO[C@@H]1O[C@H](OCC)C[S@](=O)(=O)C1")
+smiles(R"CCO[C@@H](C)C(=O)OC[C@]12CO[C@]3(C)CC[C@@](C)(OC1)N23")
+smiles(R"CC(=O)C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"CCO/C=N\Nc1ccc2nnc(Cl)n2n1")
+smiles(R"CCOC(=O)[C@@]12CC[C@@](CC32SCCS3)(C(=O)OCC)[C@]2(SCCS2)C1")
+smiles(R"CCOC(=O)[C@@]12CCC(=O)C[C@@]2(O)CC[C@]2(OCCCO2)C1")
+smiles(R"CCOC(=O)[C@]12C[C@H](COc3ccc(cc3)[N+](=O)[O-])ON2O[C@@H](COc2ccc(cc2)[N+](=O)[O-])C1")
+smiles(R"CCOC(=O)[C@@]12C[C@H](COc3ccc(cc3)[N+](=O)[O-])ON2O[C@@H](COc2ccc(cc2)[N+](=O)[O-])C1")
+smiles(R"CCOC(=O)[C@@]12N(O[C@@H]3C(=O)N(CC)C(=O)[C@@H]13)O[C@@H]1C(=O)N(CC)C(=O)[C@@H]21")
+smiles(R"CCOC(=O)c1c2ccc3nc4nonc4nc3c2oc1C(F)(F)F")
+smiles(R"CCOC(=O)c1ccc2n[se]nc2c1")
+smiles(R"CCOC(=O)c1cccc2c(=O)c3c(=O)c4[nH]c5c(cccc5c(=O)c4c(=O)c3[nH]c12)C(=O)OCC")
+smiles(R"CCOC(=O)c1ccc(cc1)/N=C\1/C(C)(C)/C(=N\c2ccc(cc2)C(=O)OCC)/[C@@]1(C)C")
+smiles(R"CCOC(=O)c1ccc(cc1)/N=C(\CC[C@](C#N)(C#N)CC/C(=N\c1ccc(cc1)C(=O)OCC)/NC(C)(C)C)/NC(C)(C)C")
+smiles(R"CCOC(=O)c1ccc(cc1)NC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)Nc3ccc(cc3)C(=O)OCC)C6=C12")
+smiles(R"CCOC(=O)c1ccc(cc1)NC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)Nc3ccc(cc3)C(=O)OCC)C6=C12")
+smiles(R"CCOC(=O)c1ccccc1N(O)C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCOC(=O)C1=C(C)[C@@H]2[C@@H]3C(=O)NC(=O)[C@H]3[C@@]1(C)[C@@H]1C(=O)NC(=O)[C@@H]21")
+smiles(R"CCOC(=O)C1=C(C)[C@@H]2[C@@H]3C(=O)OC(=O)[C@H]3[C@@]1(C)[C@@H]1C(=O)OC(=O)[C@@H]21")
+smiles(R"CCOC(=O)c1cc(Cl)cc2c(=O)c3c(=O)c4[nH]c5c(cc(Cl)cc5c(=O)c4c(=O)c3[nH]c12)C(=O)OCC")
+smiles(R"CCOC(=O)c1cc(Cl)cc2c(=O)c3c(O)c4[nH]c5c(cc(Cl)cc5c(=O)c4c(O)c3[nH]c12)C(=O)OCC")
+smiles(R"CCOC(=O)c1ccc(/N=N/N2CN3CN(/N=N/c4ccc(cc4)C(=O)OCC)CN(C3)C2)cc1")
+smiles(R"CCOC(=O)c1ccc(OC)c2[nH]c3c(=O)c4c(=O)c5c(ccc(OC)c5[nH]c4c(=O)c3c(=O)c12)C(=O)OCC")
+smiles(R"CCOC(=O)C1=C(C#N)[C@]2(CC[C@@H](OCc3ccccc3)CC2)C(=O)O1")
+smiles(R"CCOC(=O)[C@@]1(C#N)[C@@]2(CCCCC2)C1(C#N)C#N")
+smiles(R"CCOC(=O)C1=C(OCC1=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCOC(=O)[C@]1(C)OC(=O)[C@]2(CCCC2)O1")
+smiles(R"CCOC(=O)[C@]1(C)OC(=O)[C@@]2(CCCCC2)O1")
+smiles(R"CCOC(=O)c1c(O)nc2cccc3Sc4ncccc4c1c23")
+smiles(R"CCOC(=O)C1(C(=O)OCC)[C@H](c2cc(OC)c(OC)c(OC)c2)[C@@](C(=O)OCC)(C(=O)OCC)[C@H]1c1cc(OC)c(OC)c(OC)c1")
+smiles(R"CCOC(=O)[C@]1(O)OC(=O)[C@]2(CC[C@@H](OCc3ccccc3)CC2)C1")
+smiles(R"CCOC(=O)[C@@]1(S[C@@](S1)(C(=O)OCC)c1ccccc1)c1ccccc1")
+smiles(R"CCOC(=O)C[C@]1(C)O[C@@H](C)[C@H](C)O1")
+smiles(R"CCOC(=O)Cc1nnn(C)n1")
+smiles(R"CCOC(=O)/C(=C/1\[SH+][Cu+2]2([SH+]1)[SH+]/C(=C(\C#N)/C(=O)OCC)/[SH+]2)/C#N")
+smiles(R"CCOC(=O)/C(=C\[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)/C#N")
+smiles(R"CCOC(=O)/C(=C\[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)/C#N")
+smiles(R"CCOC(=O)CC[C@]1(C)OC[C@@H](CO)O1")
+smiles(R"CCOC(=O)CC[C@@]1(C)OC[C@H](O)CO1")
+smiles(R"CCOC(=O)CC[C@]1(C)O[C@@H](C)[C@H](C)O1")
+smiles(R"CCOC(=O)/C(=C(\[C@H](C)CC)/[C@H](C)CC)/C#N")
+smiles(R"CCOC(=O)/C=C\[C@@H](O)[C@@H](O)/C=C/C(=O)OCC")
+smiles(R"CCOC(=O)CC[C@@](O)([C@H](C(=O)O)c1ccccc1)[C@H](C(=O)O)c1ccccc1")
+smiles(R"CCOC(=O)C[C@@H]1CC[C@H](CCCC[C@@H]2CC[C@H](CC2)CC(=O)OCC)CC1")
+smiles(R"CCOC(=O)C[C@@H]1CN(CC[C@]21OCCO2)C(=O)c1ccccc1")
+smiles(R"CCOC(=O)C[C@@H]1O[C@@H]2CCCC[C@H]2O1")
+smiles(R"CCOC(=O)C[C@H](SP1(=S)OC[C@]2(CCCCC2)CO1)C(=O)OCC")
+smiles(R"CCOC(=O)[C@](C#N)(CC/C(=N\c1ccccc1C#N)/NC(C)(C)C)CC/C(=N\c1ccccc1C#N)/NC(C)(C)C")
+smiles(R"CCOC(=O)[C@](C#N)([C@H]1C=CCC1)[C@H]1C=CCC1")
+smiles(R"CCOC(=O)/C(=C\N[C@@H]1C[C@H](N/C=C(\C(=O)C)/C(=O)OCC)C[C@@H](N/C=C(/C(=O)C)\C(=O)OCC)C1)/C(=O)C")
+smiles(R"CCOC(=O)[C@H]1C[C@]21c1ccccc1c1ccccc21")
+smiles(R"CCOC(=O)[C@H]1C[C@@]2(CC[C@H]1N)c1ccccc1c1ccccc21")
+smiles(R"CCOC(=O)[C@H]1C[C@@]2(OCCO2)c2c(OC)ccc(Cl)c2[C@@H]1C")
+smiles(R"CCOC(=O)[C@@H]1C[C@]2(OCCO2)C[C@@H](C)C1=O")
+smiles(R"CCOC(=O)[C@@H]1C=C2O[C@H]3O[C@@]4(CCCCC4)O[C@H]3[C@H]2[C@H]2C(=O)C=CC(=O)[C@]12C(=O)OC")
+smiles(R"CCOC(=O)[C@@H]1CC2(SCCS2)[C@H](C[C@@]21SCCS2)C(=O)O")
+smiles(R"CCOC(=O)[C@H]1CC[C@]2(OCCO2)C1")
+smiles(R"CCOC(=O)[C@H]1CCC[C@]21Nc1cccc3cccc(N2)c13")
+smiles(R"CCOC(=O)[C@H]1CCCC[C@]21Nc1cccc3cccc(N2)c13")
+smiles(R"CCOC(=O)[C@@H]1CCCC[C@@]21OCCO2")
+smiles(R"CCOC(=O)[C@H]1C(C)(C)/C(=N/NS(=O)(=O)c2ccc(C)cc2)/C1(C)C")
+smiles(R"CCOC(=O)[C@@H]1CC[C@@H](CC1)NC(=O)c1ccccc1")
+smiles(R"CCOC(=O)[C@H]1[C@@H]2CC[C@@H](CC2)[C@@H]1C(=O)OCC")
+smiles(R"CCOC(=O)[C@@H]1[C@@H](c2ccc(cc2)OC(=O)C)[C@H](C(=O)OCC)c2nnp(N(CCOS(=O)(=O)C)CCOS(=O)(=O)C)c2/C/1=N/N=C\1/c2c(nnp2N(CCOS(=O)(=O)C)CCOS(=O)(=O)C)[C@@H](C(=O)OCC)[C@@H](c2ccc(cc2)OC(=O)C)[C@@H]1C(=O)OCC")
+smiles(R"CCOC(=O)[C@H]1[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C(=O)[C@H](C1=O)[C@@H]([C@H](O)[C@H](O)[C@H](O)CO)[C@H]1C(=O)[C@@H](C(=O)OCC)[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C1=O")
+smiles(R"CCOC(=O)[C@H]1[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C(=O)[C@H](C1=O)[C@H]([C@H](O)[C@H](O)[C@H](O)CO)[C@H]1C(=O)[C@@H](C(=O)OCC)[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C1=O")
+smiles(R"CCOC(=O)[C@H]1[C@H](C(=O)OCC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl")
+smiles(R"CCOC(=O)[C@@H]1[C@@H](C(=O)OCC)[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"CCOC(=O)[C@@H]1C(=O)[C@H]([C@@H](N(CCCl)CCCl)[C@H](O)[C@H](O)[C@H](O)CO)C(=O)[C@@H](C(=O)OCC)[C@@H]1c1ccc(O)cc1")
+smiles(R"CCOC(=O)[C@H]1CS[C@@]2(CCCC2)N1")
+smiles(R"CCOC(=O)[C@H]1N[Pt@@](Cl)(Cl)N[C@@H]1C(=O)OCC")
+smiles(R"CCOC(=O)[C@H]1NS(=O)(=O)N[C@@H](NS(=O)(=O)N1)C(=O)OCC")
+smiles(R"CCOC(=O)[C@H]1O[C@]21CCCC2")
+smiles(R"CCOC(=O)[C@@H]1O[C@]2(CCCCC2)O[C@@H]1C(=O)OCC")
+smiles(R"CCOC(=O)[C@H](Br)C#N")
+smiles(R"CCOC(=O)[C@@H](C#N)[C@]1(C(=O)Nc2ccccc12)[C@H](C#N)C(=O)OCC")
+smiles(R"CCOC(=O)[C@H](C)NC(=O)N(C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCOC(=O)[C@H](C(=O)C)[C@@H](c1ccccc1)[C@@H](C(=O)C)C(=O)OCC")
+smiles(R"CCOC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(cc1)N(C)C)[C@H](C(=O)C)C(=O)OCC")
+smiles(R"CCOC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(cc1)[N+](=O)[O-])[C@H](C(=O)C)C(=O)OCC")
+smiles(R"CCOC(=O)[C@@H](C(=O)C)[C@H](c1ccc(cc1)[N+](=O)[O-])[C@H](C(=O)C)C(=O)OCC")
+smiles(R"CCOC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(O)cc1)[C@H](C(=O)C)C(=O)OCC")
+smiles(R"CCOC(=O)[C@H](C(=O)C)[C@@H](c1ccc(OCc2ccccc2)c(C)c1)[C@@H](C(=O)C)C(=O)OCC")
+smiles(R"CCOC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(OC)cc1)[C@H](C(=O)C)C(=O)OCC")
+smiles(R"CCOC(=O)[C@@H](C(=O)C)[C@H](CCc1cc(OC)ccc1OC)[C@H](C(=O)C)C(=O)OCC")
+smiles(R"CCOC(=O)[C@H](C(=O)C)[C@H](C)[C@@H](C(=O)C)C(=O)OCC")
+smiles(R"CCOC(=O)[C@H](/N=N/c1[nH]nnn1)/N=N/c1[nH]nnn1")
+smiles(R"CCOC(=O)C[n+]1ccc(cc1)C(=O)C[C@@]1(O)[C@]2(Cl)[C@]3(Cl)[C@]4(Cl)[C@@]1(Cl)[C@]1(Cl)[C@@]2(Cl)[C@@]3(Cl)[C@](Cl)(Cl)[C@]41Cl")
+smiles(R"CCOC(=O)C[n+]1cccc(c1)C(=O)C[C@@]1(O)[C@@]2(Cl)[C@@]3(Cl)[C@@]4(Cl)[C@]1(Cl)[C@@]1(Cl)[C@]2(Cl)[C@]3(Cl)[C@@](Cl)(Cl)[C@@]41Cl")
+smiles(R"CCOC(=O)CN1C(=O)[C@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@H]2C1=O")
+smiles(R"CCOC(=O)CN(CC)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCOC(=O)CNC(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCOC(=O)CNC(=O)N(CC)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCOC(=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCOC(=O)N1CC[C@]2(CC1)O[C@@H](C)[C@](Sc1ccccc1)(C2)C(=O)C")
+smiles(R"CCOC(=O)N1CCC(=O)[C@H](CN[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)C1")
+smiles(R"CCOC(=O)N1[C@@H]2C[S@@](=O)(=O)C[C@H]12")
+smiles(R"CCOC(=O)N1N(C(=O)OCC)[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"CCOC(=O)N[C@@H]1C[C@@]2(CCCCC2)C=CN1C(=O)OCC")
+smiles(R"CCOC(=O)N[C@@H]1CC[C@@H]2c3ccccc3[C@@](C1)([N+](=O)[O-])c1ccccc21")
+smiles(R"CCOC(=O)N[C@@H]1CC[C@H]2c3ccccc3[C@](C1)([N+](=O)[O-])c1ccccc21")
+smiles(R"CCOC(=O)N[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"CCOC(=O)N[C@H](P(=O)(O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1ccc(cc1)[C@H](NC(=O)OCC)P(=O)(O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CCOC(=O)Oc1ccc2c(c1)c(=O)c1c(NCCCN(CC)CC)ccc3nnn2c13")
+smiles(R"CCOC(=O)Oc1ccc2c(c1)c(=O)c1c(NCCN(CC)CC)ccc3nnn2c13")
+smiles(R"CC[OH+][Ti]12([O+]=C(C)[CH-]C(=[O+]1)c1ccccc1)([O+]=C(C)[CH-]C(=[O+]2)c1ccccc1)[OH+]C12C[C@@]3(C)C[C@@](C)(C1)C[C@@](C)(C2)C3")
+smiles(R"CC[OH+][Ti]12([O+]=C(C)[CH-]C(=[O+]1)c1ccccc1)([O+]=C(C)[CH-]C(=[O+]2)c1ccccc1)[OH+]C12C[C@@]3(C)C[C@@](C)(C1)C[C@](C)(C3)C2")
+smiles(R"CC[OH+][Ti]([OH+]CC)([OH+]c1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[OH+]c1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC(=O)n1c2cc3ccccc3cc2n(C(=O)C)c2cc3ccccc3cc12")
+smiles(R"CC(=O)N1CC[C@]2(CC1)SS[C@]1(CCN(CC1)C(=O)C)S2")
+smiles(R"CC(=O)n1ccc(=c2ccn(cc2)C(=O)C)cc1")
+smiles(R"CC(=O)N1CCN(C(=O)C)[C@@H]2[C@H]1N(CCN2C(=O)C)C(=O)C")
+smiles(R"CCON1C(=O)[C@@]2(CCCCC2)C(=O)[C@]21CCCC=C2")
+smiles(R"CC(=O)N1O[C@]2(C)c3ccccc3[C@@]1(C)c1ccccc21")
+smiles(R"CC(=O)N[C@@]12CCCC[C@]2(CCCC1)NC(=O)C")
+smiles(R"CC(=O)N[C@]12CC[C@H](c3ccccc13)c1ccccc21")
+smiles(R"CC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC(=O)Nc1ccc2c3ccccc3[C@H](N3C[C@@H]4CC[C@@H](CC4)C3)c2c1")
+smiles(R"CC(=O)Nc1ccc(cc1)/C=c\1/sc2nnc(c3cccnc3)n2c1=O")
+smiles(R"CC(=O)Nc1ccc(cc1)/C=c/1\sc2nnc(/C=C/c3ccccc3)n2c1=O")
+smiles(R"CC(=O)Nc1ccc(cc1)/C=c/1\sc2nnc(CCC(=O)Nc3ccccc3Cl)n2c1=O")
+smiles(R"CC(=O)Nc1ccc(cc1)/N=C/1\C(=C(SC2=C(c3ccccc3)/C(=N/c3ccc(cc3)NC(=O)C)/c3ccccc23)c2ccccc12)c1ccccc1")
+smiles(R"CC(=O)Nc1ccc(cc1)S(=O)(=O)c1ccc(cc1)NC(=O)c1ccccc1SC(=O)CCCCn1ccccc1")
+smiles(R"CC(=O)Nc1cccc(c1)S(=O)(=O)c1cccc(NC(=O)c2ccccc2SC(=O)CCCCn2ccccc2)c1")
+smiles(R"CC(=O)Nc1ccc(/C=N/NC(=S)N[C@@H]2CN3CC[C@@H]2CC3)cc1")
+smiles(R"CC(=O)/N=c\1/nc(SCc2ccccc2)c2c([nH]o[n+]2[O-])n1")
+smiles(R"CC(=O)/N=c\1/nc(SCc2ccccc2)c2c(NO[N+]2[O-])[nH]1")
+smiles(R"CC(=O)Nc1n[nH]/c(=S\2/[Pt@@](Cl)(Cl)/S(=c\3/[nH]nc(NC(=O)C)s3)/[Pt@]2(Cl)Cl)/s1")
+smiles(R"CC(=O)Nc1nnn(C)n1")
+smiles(R"CC(=O)N[C@@H]1c2ccccc2C(C)(C)[C@@]21CC[C@]1(OCCO1)CC2")
+smiles(R"CC(=O)N[C@@H]1CC[C@H](CC1)Cc1ccccc1")
+smiles(R"CC(=O)N[C@H]1CC[C@@H](CC1)CC1CCCCC1")
+smiles(R"CC(=O)N[C@@H]1CC[C@H](CC1)C(C)(C)C")
+smiles(R"CC(=O)N[C@H]1CC[C@@H](CC1)C(C)(C)C")
+smiles(R"CC(=O)N[C@@H]1CC[C@H](CC1)C(F)(F)F")
+smiles(R"CC(=O)N[C@H]1CC[C@@H](CC1)C(F)(F)F")
+smiles(R"CC(=O)N[C@@H]1CC[C@H](CCC2CCCCC2)CC1")
+smiles(R"CC(=O)N[C@H]1C[C@@H]2c3ccccc3[C@@]1([N+](=O)[O-])c1ccccc21")
+smiles(R"CC(=O)N[C@H]1C[C@H]2c3ccccc3[C@]1([N+](=O)[O-])c1ccccc21")
+smiles(R"CC(=O)N[C@H]1C(=[O+][Cu@@]2([O+]=C1C)[O+]=C(C)[C@@H](NC(=O)C)C(=[O+]2)C)C")
+smiles(R"CC(=O)N[C@H](C(C)C)C(=O)O[Pt@]1(OC(=O)[C@H](NC(=O)C)C(C)C)N[C@H]2CCCC[C@H]2N1")
+smiles(R"CC(=O)N[C@@H](Cn1cc/c(=N)/cc1)C(=O)O")
+smiles(R"CC(=O)N[C@@H](C(=O)N/N=C(\C)/c1ccccc1)C(=O)N/N=C(\C)/c1ccccc1")
+smiles(R"CC(=O)O")
+smiles(R"CC(=O)O[C@@]12CCCC[C@H]2[C@@]2(CCCC2)NC1=O")
+smiles(R"CC(=O)O[C@]12[C@H]3CCC[C@H]1CCC[C@H]2CCC3")
+smiles(R"CC(=O)Oc1c2c(n(C(=O)C)c3ccccc3n2C(=O)C)c(OC(=O)C)c2c1n(C(=O)C)c1ccccc1n2C(=O)C")
+smiles(R"CC(=O)Oc1cc2c(cc1OC(=O)C)[C@@]1(C)CC[C@]2(C)c2cc(OC(=O)C)c(OC(=O)C)cc12")
+smiles(R"CC(=O)Oc1cc2nc3ccccc3nc2c2c1n(C)c1cc(ccc21)OC(=O)C")
+smiles(R"CC(=O)Oc1ccc(cc1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC(=O)Oc1ccccc1[C@H]1CC(=O)C[C@@H](c2ccccc2OC(=O)C)[C@@]21C(=O)c1ccccc1C2=O")
+smiles(R"CC(=O)O[C@]1(C=C/C(=N/S(=O)(=O)c2ccccc2)/C=C1)[C@@]1(C=C/C(=N/S(=O)(=O)c2ccccc2)/C=C1)OC(=O)C")
+smiles(R"CC(=O)O[C@]1([C@@H]2CC[C@H]1CC2)c1cc(cc(c1)C(F)(F)F)C(F)(F)F")
+smiles(R"CC(=O)OCc1cnc2c3ncccc3C(=O)c3nc4ccccc4c1c23")
+smiles(R"CC(=O)OC[C@]1(C)OC(=O)[C@@]2(CCCCC2)O1")
+smiles(R"CC(=O)OC[C@@H]1CC/C(=C/2\C(=O)O[C@@](C)(C)OC2=O)/N1")
+smiles(R"CC(=O)OC[C@H]1CO[C@@]2(CCCC2)O1")
+smiles(R"CC(=O)OC[C@@H]1O[C@H](OC[C@H](OC(=O)C)[C@H](OC(=O)C)[C@@H](OC(=O)C)c2cnn(n2)c2ccccc2)[C@@H](OC(=O)C)[C@@H](OC(=O)C)[C@H]1OC(=O)C")
+smiles(R"CC(=O)OC[C@H]1O[C@H](OC(=O)C)[C@H](NC(=O)CN[Pt@](Cl)(Cl)NCC(=O)N[C@H]2[C@@H](OC(=O)C)O[C@H](COC(=O)C)[C@H](OC(=O)C)[C@H]2OC(=O)C)[C@@H](OC(=O)C)[C@H]1OC(=O)C")
+smiles(R"CC(=O)OC[C@H]1O[C@H](OC(=O)C)[C@H](N[Pt@](Cl)(Cl)N[C@H]2[C@@H](OC(=O)C)O[C@H](COC(=O)C)[C@H](OC(=O)C)[C@H]2OC(=O)C)[C@@H](OC(=O)C)[C@H]1OC(=O)C")
+smiles(R"CC(=O)OC[C@H](OC(=O)C)[C@H]1O[C@@H](O[C@H]([C@H](COC(=O)C)OC(=O)C)[C@H]1OC(=O)C)c1ccccc1")
+smiles(R"CC(=O)OC[C@@H](OC(=O)C)[C@@H](O[C@@H]1O[C@H](COC(=O)C)[C@@H](OC(=O)C)[C@H](OC(=O)C)[C@@H]1OC(=O)C)[C@@H](OC(=O)C)c1cnn(n1)c1ccccc1")
+smiles(R"CC(=O)OC[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H](COC(=O)C)OC(=O)C")
+smiles(R"CC(=O)OCCn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2ccccc12")
+smiles(R"CC(=O)O[C@H]1c2ccccc2[C@@H](OC(=O)C)c2ccccc12")
+smiles(R"CC(=O)O[C@@H]1CC[C@@]2(C)C(=CC[C@H]3[C@H]2CC[C@@]2(C)[C@H]3CC[C@]32SCCCS3)C1")
+smiles(R"CC(=O)O[C@@H]1CC[C@@]2(C)[C@@H](CC[C@H]3[C@H]2CC[C@@]2(C)[C@H]3CC[C@]32SCCCS3)C1")
+smiles(R"CC(=O)O[C@H]1CCCCCCCCCC[C@@]21OCCO2")
+smiles(R"CC(=O)O[C@@H]1C[C@](C)(C)C[C@@H](OC(=O)C)[C@@]1(C)C")
+smiles(R"CC(=O)O[C@@H]1[C@](C)(C)[C@@H](OC(=O)C)[C@]1(C)C")
+smiles(R"CC(=O)O[C@@H]1[C@@](C)(C)[C@@H](OC(=O)C)[C@]1(C)C")
+smiles(R"CC(=O)O[C@H]1CC[C@H]2[C@H]3CC[C@H]4C[C@@]5(SCCS5)CC[C@]4(C)[C@H]3CC[C@]12C")
+smiles(R"CC(=O)O[C@H]1CC[C@@H](CC1)CC1CCCCC1")
+smiles(R"CC(=O)O[C@H]1C=C[C@H](S[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)N(C(=O)C)[C@@H]1S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CC(=O)O[C@@H]1C[C@@H]2N[Pt@@](Cl)(Cl)N[C@H]2C[C@@H]1OC(=O)C")
+smiles(R"CC(=O)O[C@H]1CCN(Cc2ccccc2)C[C@H]1CN(C(=O)C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC(=O)O[C@@H]1C=CN(C(=O)C)[C@H](S[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[C@H]1O")
+smiles(R"CC(=O)O[C@H]1C=CN(C(=O)C)[C@@H](S[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[C@H]1OC(=O)C")
+smiles(R"CC(=O)O[C@H]1[C@H]2CC[C@@H]1[C@H]1[C@@H]2[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)[C@]2(Cl)Cl)Cl")
+smiles(R"CC(=O)O[C@H]1[C@H]2[C@@H]3[C@H]2[C@@H]2[C@H]1[C@H]32")
+smiles(R"CC(=O)O[C@H]1[C@H](CCC[C@@H]1C(C)C)C(C)C")
+smiles(R"CC(=O)O[C@H]1[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H]2O[C@](C)(C)O[C@H]2[C@H]1OC(=O)C")
+smiles(R"CC(=O)O[C@H]1[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H](OC(=O)C)[C@H]1OC(=O)C")
+smiles(R"CC(=O)O[C@@H]1[C@@H](OC(=O)C)CN(OCc2ccccc2)C[C@@H]1OC(=O)C")
+smiles(R"CC(=O)O[C@H]1[C@@H](OC(=O)C)C(=O)OC(=O)[C@@H]1OC(=O)C")
+smiles(R"CC(=O)O[C@@H]1[C@@H](ON(=C[C@@]21CCCCC2)O)O[C@@H]1CCCCC1(c1ccccc1)c1ccccc1")
+smiles(R"CC(=O)O[C@@H]1C[N@+]2(CCc3ccccc3)CC[C@H]1CC2")
+smiles(R"CC(=O)O[C@@H]1C[N@@+]2(C)CC[C@@]1(CC2)c1ccccc1")
+smiles(R"CC(=O)O[C@@H]1CN(C[C@@H](OC(=O)C)CN(C1)c1ccccc1)c1ccccc1")
+smiles(R"CC(=O)O[C@H]1CN(OC[C@H]2O[C@H](OC(=O)C)[C@H](OC(=O)C)[C@@H](OC(=O)C)[C@H]2OC(=O)C)C[C@H](OC(=O)C)[C@@H]1OC(=O)C")
+smiles(R"CC(=O)O[C@@H]1CO[C@H]([C@@H](OC(=O)C)[C@H]1OC(=O)C)n1c2c(ccc3c4ccccc4[nH]c23)c2ccccc12")
+smiles(R"CC(=O)O[C@H]1C(=[O+][Cu@@]2([O+]=C1C)[O+]=C(C)[C@@H](OC(=O)C)C(=[O+]2)C)C")
+smiles(R"CC(=O)O[C@@H]1N(C(=O)C)[C@H](S[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)C(=C[C@@]1(C)OC(=O)C)C")
+smiles(R"CC(=O)O[C@H]1OC[C@@H]2O[C@]3(CCCCC3)O[C@H]2[C@@H]1SCc1ccccc1")
+smiles(R"CC(=O)O[C@@H]1O[C@H](OC(=O)C)[C@H](OC(=O)C)[C@@H](OC(=O)C)O1")
+smiles(R"CC(=O)O[C@@H](c1cnn(n1)c1ccccc1)[C@H](OC(=O)C)[C@@H](COC(=O)C)OC(=O)C")
+smiles(R"CC(=O)O[C@@H](c1cnn(n1)c1ccccc1)[C@H](OC(=O)C)[C@H](OC(=O)C)[C@@H](COC(=O)C)OC(=O)C")
+smiles(R"CC(=O)O[C@H](c1cnn(n1)c1ccccc1)[C@@H](OC(=O)C)[C@@H](OC(=O)C)[C@H](COC(=O)C)OC(=O)C")
+smiles(R"CC(=O)O[C@@H](C)C1=C[C@@]2(C=C[C@H]3[C@@H](C=C[C@@H]23)C2OC[C@](C)(C)CO2)OC1=O")
+smiles(R"CC(=O)O[C@@H](C)C1=C[C@@]2(C=C[C@H]3[C@@H](C=C[C@@H]23)C2OC[C@@](C)(C)CO2)OC1=O")
+smiles(R"CC(=O)O[C@@H](C)[C@@H](OC(=O)C)[C@@H](OC(=O)C)c1cnn(n1)c1ccccc1")
+smiles(R"CC(=O)O[C@@H](C)C(=O)O[C@@H](COC(=O)[C@H](C)OC(=O)C)COC(=O)[C@H](C)OC(=O)C")
+smiles(R"CC(=O)O[C@H]([C@@H]1C[C@@H]2CCN1CC2)c1ccnc2ccccc12")
+smiles(R"CC(=O)O[C@@H]([C@H](COC(=O)C)OC(=O)C)c1cnn(n1)c1ccccc1")
+smiles(R"CC(=O)O[C@H]([C@@H](COC(=O)C)OC(=O)C)c1cnn(n1)c1ccccc1")
+smiles(R"CC(=O)[OH+][Cu@@+2]12N(Cc3n(C)cc[n+]13)Cc1n(C)cc[n+]21")
+smiles(R"CC(=O)[OH+][Cu@+2]12N(Cc3n(C)cc[n+]13)Cc1n(C)cc[n+]21")
+smiles(R"CC(=O)[OH+][Hg][C@]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC(=O)[OH+][Hg][C@@]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CC(=O)[OH+][Hg][C@]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@]8([Hg][OH+]C(=O)C)C6=C12")
+smiles(R"CC(=O)O[Pb]([C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82)([C@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"CCOP(=O)(CCl)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCOP(=O)(OCC)C[C@@H]1C[C@](O)(CNc2cc(Cl)nc(N)n2)C1")
+smiles(R"CCOP(=O)(OCC)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCOP(=O)(OCC)NC(=S)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CC(=O)S[C@H]1C[S@@](=O)(=O)C[C@@H]1SC(=O)C")
+smiles(R"CCOS(=O)(=O)C/C(=N\N=C(\CS(=O)(=O)OCC)/c1ccccc1)/c1ccccc1")
+smiles(R"CC(=O)SS[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CCSc1n/c(=C/c2ccco2)/c2nncn12")
+smiles(R"CCSc1n/c(=C/c2ccco2)/c2nnnn12")
+smiles(R"CCSC1(SCC)[C@]2(CCCCC2)C(=O)[C@]21CCCCC2")
+smiles(R"C=C[Si@]1(C)C[Si@@](C)(C=C)C1")
+smiles(R"CC[Sn@](CC)(OC(=O)[C@@H](N)Cc1ccccc1)OC(=O)[C@@H](N)Cc1ccccc1")
+smiles(R"CC[Sn@](CC)(OC(=O)[C@H](OC(=O)C)c1ccccc1)OC(=O)[C@H](OC(=O)C)c1ccccc1")
+smiles(R"CC[Sn@](CC)(OS(=O)(=O)C[C@@]12CC[C@@H](CC1=O)C2(C)C)OS(=O)(=O)C[C@@]12CC[C@@H](CC1=O)C2(C)C")
+smiles(R"CCS(=O)(=O)c1ccc2nnnn2n1")
+smiles(R"CCS(=O)(=O)[O-]")
+smiles(R"CCS(=O)(=O)O")
+smiles(R"C[Ge](C)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"[C@@H]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)[C@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"[C@@H]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)[C@]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"[C@@H]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)C([C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"[CH-]1N=c2[nH]nnc2=C(N)[N+]1=O")
+smiles(R"[Cl-]")
+smiles(R"Cl")
+smiles(R"Cl[Au](Cl)(Cl)Cl")
+smiles(R"Cl[C@@]12c3ccccc3[C@@H](c3ccccc13)[C@@]1(Cl)c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"Cl[C@@]12[C@@]3(N)[C@]4(Cl)[C@]5(Cl)[C@@]3(Cl)[C@@]2(Cl)[C@](Cl)([C@]14Cl)C15OCCO1")
+smiles(R"Cl[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Cl[C@@]12[C@H]3CCC[C@H]1CCC[C@@H]2CCC3")
+smiles(R"Cl[C@@]12[C@@H]([C@@H]3c4ccccc4[C@H]1c1ccccc31)[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"Cl[C@@]1(Br)[C@H]2c3ccccc3[C@H](c3ccccc23)[C@@H]1S(=O)(=O)c1ccccc1")
+smiles(R"Clc1c2cc3c(nc4cccnc4n3C3CCCCC3)cc2c2ccccc2c1=O")
+smiles(R"Cl[C@]1(c2ccccc2)[C@@H]2CCCC[C@@H]12")
+smiles(R"Clc1c2nn3c(nnc3c3ccccc3O)sc2c(Cl)c2nn3c(nnc3c3ccccc3O)sc12")
+smiles(R"Clc1c2sc3nnc(C)n3nc2c(Cl)c2sc3nnc(C)n3nc12")
+smiles(R"Clc1cc2cc3c4cc5nc6cc(Cl)c(Cl)cc6n(C)c5cc4c(Cl)c(=O)c3cc2cc1Cl")
+smiles(R"Clc1cc2c(cc1Cl)nc1cc3c(cc1n2C)c(Cl)c(=O)c1ccccc31")
+smiles(R"ClC1=C(c2ccccc2)[C@@H](CC1=O)c1ccccc1")
+smiles(R"Clc1ccc2c(c1)c(cc1nc3cc4nc5cc(c6ccccc6)c6cc(Cl)ccc6n5c(=O)c4cc3c(=O)n21)c1ccccc1")
+smiles(R"Clc1ccc2c(c1)[C@@H]1[C@H]3c4ccccc4[C@H](c4ccccc34)[C@H]2c2ccccc12")
+smiles(R"Clc1ccc2c(c1)[C@H](N[C@]13C[C@@H]4C[C@@H](C[C@@H](C4)C3)C1)c1cc(Cl)cc(Cl)c21")
+smiles(R"Clc1ccc2c(c1)[C@H](NC(=O)[C@@]13C[C@H]4C[C@H](C[C@H](C4)C3)C1)c1cc(Cl)cc(Cl)c21")
+smiles(R"Clc1ccc2c(c1)CN1Cc3cc(Cl)ccc3[C@H]2C1")
+smiles(R"Clc1ccc2c(c1)[n+]([O-])c1c3oc4ccccc4c3ccc1[n+]2[O-]")
+smiles(R"Clc1ccc2c(c1)[n+]([O-])c1c3oc4CCCCc4c3ccc1[n+]2[O-]")
+smiles(R"Clc1ccc2cc3cc(C)[n+]([O-])nc3n2n1")
+smiles(R"Clc1ccc2c(ccnc2c1)/C=C/1\N2CC[C@H](CC2)C1=O")
+smiles(R"Clc1ccc2c(ccnc2c1)N[C@H]1CC[C@@H](CC1)N1CCCCC1")
+smiles(R"Clc1ccc2c(ccnc2c1)N[C@H]1CC[C@@H](CC1)N1CCOCC1")
+smiles(R"Clc1ccc2c(ccnc2c1)N[C@H]1CC[C@H](CC1)NC1CCCCC1")
+smiles(R"Clc1ccc2c(cnc3ccccc23)n1")
+smiles(R"Clc1ccc2CN3Cc4ccc(Cl)cc4[C@@H](C3)c2c1")
+smiles(R"Clc1ccc2c(no[n+]2[O-])c1")
+smiles(R"Clc1ccc2c(NO[N+]2[O-])c1")
+smiles(R"Clc1ccc2c([N+](=O)[O-])c3cc(C)[n+]([O-])nc3n2n1")
+smiles(R"Clc1ccc2c(n[se][n+]2C)c1")
+smiles(R"Clc1ccc2nc3ccccc3c(=O)n2n1")
+smiles(R"Clc1ccc2nc(Oc3ccccc3)nc(=O)n2n1")
+smiles(R"Clc1ccc2[n+](C)[se][nH]c2c1")
+smiles(R"Clc1ccc2[nH]cc(C(=O)C(=O)N[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c2c1")
+smiles(R"Clc1ccc2[nH][se][n+](C)c2c1")
+smiles(R"Clc1ccc2nncn2n1")
+smiles(R"Clc1ccc2nnnn2n1")
+smiles(R"Clc1ccc2n[se]nc2c1")
+smiles(R"Clc1ccc2n[se]nc2n1")
+smiles(R"Clc1ccc2n[se][n+](C)c2c1")
+smiles(R"Clc1ccc2nsnc2c1")
+smiles(R"Clc1ccc2nsnc2c1Cl")
+smiles(R"Clc1ccc2nsnc2c1NC1=NCCN1")
+smiles(R"Clc1ccc2nsnc2n1")
+smiles(R"Clc1ccc2oc(=O)c(cc2c1)C(=O)Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Clc1ccc2Sc3ccccc3N([C@@H]3C[C@H](C3)N(C)C)c2c1")
+smiles(R"Clc1cccc2c1[C@](O)(c1ccccc1)c1c(Cl)cccc1[C@@]2(O)c1ccccc1")
+smiles(R"Clc1cc(C)c2nc(cn2n1)C(=O)O")
+smiles(R"Clc1ccc(cc1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"Clc1ccc(cc1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"Clc1ccc(cc1)[C@@]1(c2ccccc2)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O")
+smiles(R"Clc1ccc(cc1)C1CC/C(=C\2/C(=C(O)c3ccccc3C2=O)O)/CC1")
+smiles(R"Clc1ccc(cc1)[C@@]1(C)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O")
+smiles(R"Clc1ccc(cc1)[C@]1(C)O[C@@H](C)[C@H](C)O1")
+smiles(R"Clc1ccc(cc1)[C@]1(C)OC(=O)/C(=C/c2ccc(s2)[N+](=O)[O-])/C(=O)O1")
+smiles(R"Clc1ccc(cc1)[C@@]1(C)OC(=O)/C(=C\c2ccc(s2)[N+](=O)[O-])/C(=O)O1")
+smiles(R"Clc1cccc(c1)c1nc2cccc3c4cccnc4Cn1c23")
+smiles(R"Clc1ccc(cc1)c1nc2cc(ccc2[nH]1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Clc1ccc(cc1)c1nc2=C(N)N=[S@](=O)(O)N=c2nc1c1ccc(Cl)cc1")
+smiles(R"Clc1ccccc1c1[nH]c2ccc(cc2n1)C12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1")
+smiles(R"Clc1ccc(cc1)c1nnc(o1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Clc1ccc(cc1)c1nnn(C)n1")
+smiles(R"Clc1ccc(cc1)[C@@]1(O)CCN(CC1)C[C@@H]1N2CC[C@H](CC2)C1=O")
+smiles(R"Clc1ccc(cc1)[C@@]1(O)CCN(CC1)[C@@H]1C[C@H]1c1ccccc1")
+smiles(R"Clc1ccc(cc1)c1sc2nnc(n2n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Clc1cc(ccc1c1sc2nnc(n2n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-]")
+smiles(R"Clc1cc(ccc1c1sc2nnc(n2n1)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-]")
+smiles(R"Clc1ccc(cc1)/C=c\1/sc2nc(nn2c1=O)c1ccccc1")
+smiles(R"Clc1ccc(cc1)/C=c/1\sc2nnc(CCC(=O)Nc3c(C)cccc3C)n2c1=O")
+smiles(R"Clc1ccccc1/C=C/CN1CC[C@](O)(CC1)c1ccccc1")
+smiles(R"Clc1ccc(cc1)[C@H]1C[C@@]2(SS[C@]3(C[C@@H](c4ccc(Cl)cc4)N([C@@H](C3)c3ccc(Cl)cc3)C(=O)C(F)(F)F)S2)C[C@@H](c2ccc(Cl)cc2)N1C(=O)C(F)(F)F")
+smiles(R"Clc1ccc(cc1)[C@H]1CC(=O)C[C@@H](c2ccc(Cl)cc2)[C@@]21C(=O)NC(=O)NC2=O")
+smiles(R"Clc1ccc(cc1)[C@H]1N(CC/N=C\c2ccc(Cl)cc2)CCN1CC/N=C\c1ccc(Cl)cc1")
+smiles(R"Clc1ccc(cc1)[C@@H]1N[C@@H](C[C@]2(SS[C@]3(C[C@@H](N[C@@H](C3)c3ccc(Cl)cc3)c3ccc(Cl)cc3)S2)C1)c1ccc(Cl)cc1")
+smiles(R"Clc1ccc(cc1)[C@@H]1N[C@H](C[C@@](S)(S)C1)c1ccc(Cl)cc1")
+smiles(R"Clc1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Clc1ccc(cc1)[C@@H]1O[C@H](C)[C@@H](C)O1")
+smiles(R"Clc1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Clc1ccccc1[C@@H](/N=C/c1ccccc1Cl)/N=C/c1ccccc1Cl")
+smiles(R"Clc1ccc(cc1Cl)[C@@H]1OC[C@]2(CO1)CO[C@@H](OC2)c1ccc(Cl)c(Cl)c1")
+smiles(R"Clc1cc(ccc1Cl)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"Clc1ccc(cc1)Cn1c(NC(=O)C(=O)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)nc2ccccc12")
+smiles(R"Clc1ccc(cc1)Cn1c(NC(=O)NC23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)nc2ccccc12")
+smiles(R"Clc1ccc(cc1)Cn1c(=N)n(CC(=O)NC23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c2ccccc12")
+smiles(R"Clc1cc(ccc1C)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"Clc1ccc(cc1)CN[C@H](C)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Clc1ccccc1/C=N/N/C(=N\N=C\c1ccccc1Cl)/N/N=C/c1ccccc1Cl")
+smiles(R"Clc1ccc(cc1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Clc1ccc(cc1)C(=O)N/N=C/c1ccc(cc1Br)N1CC[C@]2(CCCCC2)CC1")
+smiles(R"Clc1ccc(cc1)C(=O)N/N=C/c1ccc(cc1Cl)N1CC[C@@]2(CCCCC2)CC1")
+smiles(R"Clc1ccc(cc1)C(=O)N/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1")
+smiles(R"Clc1cccc(c1)C(=O)N/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1")
+smiles(R"Clc1ccc(cc1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"Clc1ccc(cc1)n1c(=S)[nH]nc1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Clc1cccc(c1)N/C(=[N+]\1/[C@H](C)CCC[C@H]1C)/c1ccccc1")
+smiles(R"Clc1cccc(c1)NC(=O)ON1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)[C@@H](Cl)[C@H](Cl)[C@@]2(Cl)[C@@]1(Cl)Cl")
+smiles(R"Clc1ccc(cc1)N/N=C/1\C(=O)O[C@H](OC1=O)c1ccccc1")
+smiles(R"Clc1ccc(cc1)/N=N/N1CN2CN(/N=N/c3ccc(Cl)cc3)CN(C2)C1")
+smiles(R"Clc1ccccc1OP(=O)(Oc1ccccc1Cl)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Clc1ccc(cc1)S(=O)(=O)[C@H](C)[C@@H]1OC[C@@]2(CO1)CO[C@@H](OC2)[C@H](C)S(=O)(=O)c1ccc(Cl)cc1")
+smiles(R"Clc1ccc(cc1)S(=O)(=O)/N=C/1\C=C/C(=c\2/sc3ccccc3n2C)/C=C1")
+smiles(R"Clc1ccc(cc1)S(=O)O[Sn@](C)(C)OS(=O)c1ccc(Cl)cc1")
+smiles(R"Clc1ccc(/C=c\2/sc3nc4ccccc4n3c2=O)c(Cl)c1")
+smiles(R"Clc1ccc(/C=c/2\sc3nnc(CCC(=O)Nc4cc(Cl)c(Cl)cc4Cl)n3c2=O)c(Cl)c1")
+smiles(R"Clc1ccc(/C=C/C(=O)[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c(Cl)c1")
+smiles(R"Clc1ccc(/C=C/C(=O)[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c(Cl)c1")
+smiles(R"Clc1cccc(Cl)c1C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Clc1ccc(c(Cl)c1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Clc1cc(cc(C(=O)O)c1O)C(=CCC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1cc(Cl)c(O)c(c1)C(=O)O")
+smiles(R"Clc1ccc([C@@H]2O[C@@H](C)[C@H](C)O2)c(Cl)c1")
+smiles(R"Clc1cccc(/N=C/c2ccc(cc2)N2CC[C@@]3(CCCCC3)CC2)c1")
+smiles(R"Clc1ccc(/C=N\N=C\c2ccc(Cl)cc2)cc1")
+smiles(R"Clc1ccc(/C=N/N/C(=N\N=C\c2ccc(Cl)cc2Cl)/N/N=C/c2ccc(Cl)cc2Cl)c(Cl)c1")
+smiles(R"Clc1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(Cl)c1")
+smiles(R"Clc1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)s1")
+smiles(R"Clc1ccc(/C=N\NC(=S)N[C@@H]2CN3CC[C@@H]2CC3)cc1")
+smiles(R"Clc1cc(Cl)c2n[se]nc2c1")
+smiles(R"Clc1cc(Cl)c2n[se]nc2n1")
+smiles(R"Clc1cc(Cl)c2nsnc2c1N")
+smiles(R"Clc1cc(Cl)cc(c1)Nc1nc(N[C@H]2CC[C@@H](CC2)N(C)C)c2ccccc2n1")
+smiles(R"Clc1cc(Cl)c(Cl)cc1C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Clc1cc(Cl)cc(/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)c1")
+smiles(R"Clc1cc(Cl)c(OCc2ccccc2)c(c1)S(=O)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Clc1cc(/C=N/C23C[C@H]4C[C@H](C[C@H](C4)C3)C2)cc(Cl)c1")
+smiles(R"Clc1cc(/C=N\C[C@H]2CC[C@@H](C/N=C\c3cc(Cl)cc(Cl)c3O)CC2)c(O)c(Cl)c1")
+smiles(R"Clc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc(Cl)c1")
+smiles(R"Clc1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(O)c(Cl)c1")
+smiles(R"Clc1ccc([N+](=O)[O-])c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"Clc1ccc([N+](=O)[O-])c(/C=N/NC(=S)NC23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"Clc1ccc(O)c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"Clc1ccc(OCC(=O)O[C@@H]2CN3CC[C@@H]2CC3)cc1")
+smiles(R"ClC1=C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"ClC1=C(Cl)[C@]2(Cl)[C@@]3(Cl)C(=C(Cl)[C@](Cl)([C@]43OCCO4)[C@]2(Cl)C21OCCO2)Cl")
+smiles(R"ClC1=C(Cl)[C@@]2(Cl)C[C@]1(Cl)[C@H]1[C@H]3C[C@H]([C@H]4O[C@](C)(C)O[C@@H]34)[C@@H]21")
+smiles(R"ClC1=C(Cl)[C@@]2(Cl)C=C[C@]1(Cl)[C@@]2(Cl)Cl")
+smiles(R"ClC1=C(Cl)[C@@]2(Cl)CC[C@]1(Cl)[C@@]2(Cl)Cl")
+smiles(R"ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4C=C[C@H](C4)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl")
+smiles(R"ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4CC[C@H](C4)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl")
+smiles(R"ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4C[C@H]([C@H]5[C@@H]6C[C@@H]([C@@H]7O[C@H]67)[C@@H]45)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl")
+smiles(R"ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4C[C@H]([C@H]5O[C@@H]45)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl")
+smiles(R"ClC1=C(Cl)[C@@]2(Cl)[C@H]3[C@H]4O[C@H]([C@H]5O[C@@H]45)[C@H]3[C@]1(Cl)[C@]2(Cl)Cl")
+smiles(R"ClC1=C(Cl)[C@]2(Cl)[C@H]3COC[C@H]3[C@@]1(Cl)[C@@]2(Cl)Cl")
+smiles(R"ClC1=C(Cl)[C@]2(Cl)[C@H]3O[C@H]3[C@@]1(Cl)[C@]2(Cl)Cl")
+smiles(R"ClC1=C(Cl)[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"Clc1cc(N)c2nnc(c3ccccc3)n2n1")
+smiles(R"Clc1cc(N)c2nncn2n1")
+smiles(R"Clc1cc(N)c2nnnn2n1")
+smiles(R"Clc1cc(NC(=O)c2ccccc2)c2nnc(c3ccccc3)n2n1")
+smiles(R"Clc1cc(OC[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)nc(OC[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)n1")
+smiles(R"Cl[C@]1(Cl)[C@@H](c2ccccc2)[C@H]1c1ccccc1")
+smiles(R"Clc1cnn2cnnc2c1N")
+smiles(R"Clc1cnn2nnnc2c1N")
+smiles(R"Cl[C-]1C(=[O+][Ru+3]23([O+]=C1C)([O+]=C(C)[C-](Cl)C(=[O+]2)C)[O+]=C(C)[C-](Cl)C(=[O+]3)C)C")
+smiles(R"Clc1nc2cc3c(oc4ccccc34)cc2n2cccc12")
+smiles(R"Clc1nc2cn[nH]c2c(n1)N(C)C")
+smiles(R"Clc1nc(Cl)c2n[se]nc2c1Cl")
+smiles(R"Clc1nc(Cl)c2nsnc2c1")
+smiles(R"Clc1nc(Cl)nc(c1)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Clc1nc(Cl)nc(c1)O[C@@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3")
+smiles(R"Clc1nc(Cl)nc(n1)N[C@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Clc1nc(nc(n1)N[C@@]12C[C@H]3C[C@@H](C[C@H](C3)C2)C1)N[C@@]12C[C@H]3C[C@@H](C[C@H](C3)C2)C1")
+smiles(R"Clc1nc(N)nc(c1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Clc1nnn(n1)c1ccccc1")
+smiles(R"ClC[C@]12[C@@H]3C(=O)[C@H]1[C@]23CCl")
+smiles(R"ClCC1=N[C@@H](c2ccc(cc2)[C@@H]2N=C(CCl)OP2(=O)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)P(=O)(O1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"ClC(=C1OC(=O)[C@@H]2[C@H]3c4ccccc4[C@@H]([C@H]12)c1ccccc31)Cl")
+smiles(R"ClCCc1nnn(C)n1")
+smiles(R"ClC/C=C/C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"ClC(=C(Cl)/C(=C(/N[C@@H](C)[C@@]12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1)\N[C@H](C)[C@@]12C[C@@H]3C[C@H](C[C@H](C3)C2)C1)/[N+](=O)[O-])Cl")
+smiles(R"Cl/C=C/C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"ClC(=C)C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"ClC[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"ClC[C@H]1[C@@H](CCl)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl")
+smiles(R"ClC[C@@H]1CO[C@@]2(CCCC2)O1")
+smiles(R"ClC[C@H]1OC(C)(C)O[C@](C#N)(C1)C[C@@H]1C[C@H](C[C@@]2(C#N)C[C@@H](CCl)OC(C)(C)O2)O[C@](C)(C)O1")
+smiles(R"ClC[C@@H](Cl)[C@@H]1CCC[C@H](Cl)C1")
+smiles(R"ClC[C@@H](Cl)[C@@H]1CC[C@@H](Cl)CC1")
+smiles(R"ClC[C@@H](O)CN1CC[N@+]2(CC1)CC[N@+]1(CCN(CC1)C[C@H](O)CCl)CC2")
+smiles(R"ClC[C@H](OS(=O)(=O)C)[C@@H]1O[C@](C)(C)O[C@H]1[C@H](CCl)OS(=O)(=O)C")
+smiles(R"ClC(Cl)C(=O)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"ClC(Cl)C(=O)N[C@@H]1CC[C@H](CC1)C(C)(C)C")
+smiles(R"ClC(Cl)C(=O)N[C@H]1CC[C@@H](CC1)C(C)(C)C")
+smiles(R"ClCC[N@@+]12CC[N@@+](CCCl)(CC1)C2")
+smiles(R"ClCC[N@+]12CC[N@+](CCCl)(CC1)C2")
+smiles(R"ClCCN1CC[C@@]2(CC1)SS[C@]1(CCN(CCCl)CC1)S2")
+smiles(R"ClC/C(=N\C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)/NS(=O)(=O)c1ccc(C)cc1")
+smiles(R"ClCCN(Cc1ccccc1)C(=O)[C@@H]1[C@@H](c2ccccc2)[C@@H]1c1ccccc1")
+smiles(R"ClCCN(CCCl)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"ClCCN(CCCl)c1ccc(cc1)/C=c\1/sc2nc3nc(C)nc(O)c3n2c1=O")
+smiles(R"ClCCN(CCCl)c1ccc(cc1)[C@H]1N(CCCN1[C@H](C#N)c1ccccc1)[C@H](C#N)c1ccccc1")
+smiles(R"ClCCN(CCCl)c1ccc(cc1)/C=N/[C@H]1C(C)(C)[C@@H](/N=C/c2ccc(cc2)N(CCCl)CCCl)[C@@]1(C)C")
+smiles(R"ClCCN(CCCl)c1ccc(c(C)c1)[C@@H]1N(CCCN1[C@H](C#N)c1ccccc1)[C@H](C#N)c1ccccc1")
+smiles(R"ClCCN(CCCl)c1ccc(/C=N/NC(=O)[C@-]23C4=C5C6=C2[Fe+2]27893456C3=C8C7=C2[C-]93)c(C)c1")
+smiles(R"ClCCN(CCCl)c1ccc(/C=N/NC(=O)[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8C7=C2[C-]93)c(C)c1")
+smiles(R"ClCCN(CCCl)C[C@@H]1C(=O)C[C@@H](CC1=O)c1ccc(O)cc1")
+smiles(R"ClCCN(CCCl)[C@@H]([C@@H]1CCC=CC1)[C@@H]1C(=O)C[C@@H](CC1=O)c1ccc(O)cc1")
+smiles(R"ClCCN(CCCl)[C@@H]([C@H](O)[C@H](O)[C@H](O)CO)[C@H]1C(=O)[C@@H](C(=O)OCC)[C@H](c2ccc(O)cc2)[C@@H](C(=O)OCC)C1=O")
+smiles(R"ClCCN(CCCl)COc1ccc(cc1)[C@H]1CC(=O)[C@@H](CN(CCCl)CCCl)C(=O)C1")
+smiles(R"ClCCN(CCCl)/N=C\C=N\N(CCCl)CCCl")
+smiles(R"ClCCN(CCCl)P(=O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"ClCCN(CCCl)P(=O)(N)O[C@H](c1ccccc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"ClCCN(C[C@@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1)C1CCCCC1")
+smiles(R"ClCCNCCNc1ccnc2ccc3nn(C)nc3c12")
+smiles(R"ClCCNC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)NCCCl)C6=C12")
+smiles(R"ClCCNC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)NCCCl)C6=C12")
+smiles(R"ClCCNC(=O)[C@@H]1CC[C@H](CC1)C(=O)NCCCl")
+smiles(R"ClCCNC(=O)N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1")
+smiles(R"ClCCNC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"ClCCNC(=O)N[C@@H]1CC[C@H](CC1)C[C@H]1CC[C@@H](CC1)NC(=O)NCCCl")
+smiles(R"ClCCNC(=O)N[C@@H]1CC[C@H](CC1)NC(=O)NCCCl")
+smiles(R"ClCCNC(=O)N[C@H]1C[C@@H](NC(=O)NCCCl)C[C@](C)(C)C1")
+smiles(R"ClCCNC(=O)N[C@H]1[C@@H](O)[C@@H](O)[C@@H](O)[C@H](O)[C@@H]1O")
+smiles(R"ClCCNC(=O)N[C@@H]1CS(=O)(=O)[C@H](C)S(=O)(=O)C1")
+smiles(R"ClCCNC(=O)N(O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"ClC/C(=N/NC1=N[C@@](C)(CC[C@]2(C)N=C(N/N=C(\C)/CCl)SP2(=O)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)P(=O)(S1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/C")
+smiles(R"ClCC(=N)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"ClCC(=N)NCCO[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"ClCCN(N=O)C(=O)N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1")
+smiles(R"ClCCN(N=O)C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"ClCCN(N=O)C(=O)NC[C@H]1CC[C@@H](CC1)CNC(=O)N(N=O)CCCl")
+smiles(R"ClCCN(N=O)C(=O)N[C@@H]1CC[C@H](CC1)C[C@H]1CC[C@H](CC1)NC(=O)N(N=O)CCCl")
+smiles(R"ClCCN(N=O)C(=O)N[C@@H]1CC[C@@H](CC1)NC(=O)N(N=O)CCCl")
+smiles(R"ClCCN(N=O)C(=O)N[C@H]1CC[C@H](CCl)CC1")
+smiles(R"ClCCN(N=O)C(=O)N[C@@H]1CC[C@@H](OC)CC1")
+smiles(R"ClCCN(N=O)C(=O)N[C@@H]1CC[C@H](OC)CC1")
+smiles(R"ClCCN(N=O)C(=O)N[C@H]1[C@@H](O)C[C@H](C)C[C@@H]1O")
+smiles(R"ClCCN(N=O)C(=O)N[C@H]1[C@@H](O)[C@@H](O)[C@@H](O)[C@H](O)[C@@H]1O")
+smiles(R"ClCCN(N=O)C(=O)N[C@H]1[C@@H](OC(=O)C)[C@H](OC(=O)C)[C@H](NC(=O)N(N=O)CCCl)[C@H](OC(=O)C)[C@@H]1OC(=O)C")
+smiles(R"ClCCN(N=O)C(=O)N[C@@H]1CS(=O)(=O)[C@@H](C)S(=O)(=O)C1")
+smiles(R"ClCC(=O)[C@H](OC(=O)C)[C@@H](OC(=O)C)[C@@H](OC(=O)C)C(=O)CCl")
+smiles(R"ClCCOC(=O)[C@@H]1[C@@H](C(=O)OCCCl)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl")
+smiles(R"ClCC(=O)N1CC[C@]2(CC1)SS[C@]1(CCN(CC1)C(=O)CCl)S2")
+smiles(R"ClCC(=O)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"ClCC(=O)NC[C@]1(S[C@@](CNC(=O)CCl)(S1)c1ccc(Cl)cc1)c1ccc(Cl)cc1")
+smiles(R"Cl[C@@H]1c2ccccc2c2ccccc2[C@H](Cl)[S@]1(=O)=O")
+smiles(R"Cl[C@H]1CCC[C@@]2(Cl)C(=O)N[C@@]3(CCCCC3)N=C12")
+smiles(R"Cl[C@@H]1CCCC[C@@]21OCCO2")
+smiles(R"Cl[C@@H]1CC[C@@H](CC1)CN1Cc2c(C1)nc(N)nc2N")
+smiles(R"Cl[C@@H]1[C@@H]2C=C[C@@H](C2)[C@@]21OCCO2")
+smiles(R"Cl[C@@H]1[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@H]1Cl")
+smiles(R"Cl[C@@H]1O[C@H](Cl)[C@H](Cl)[S@](=O)(=O)[C@@H]1Cl")
+smiles(R"Cl[C@H]1S(=O)(=O)C[C@]21OCCO2")
+smiles(R"Cl[C@H](COc1ccccc1)Cn1cc/c(=N)/cc1")
+smiles(R"Cl[Co@]1([Cl][Co@]2([Cl]1)[Cl][Co@@](Cl)([Cl]2)[n+]1ccccc1)[n+]1ccccc1")
+smiles(R"Cl[Co@]1([Cl][Co@](Cl)([Cl]1)[n+]1ccccc1)[n+]1ccccc1")
+smiles(R"ClC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"ClC(=O)[C@H]1CC[C@@H]2c3ccccc3[C@@](C1)([N+](=O)[O-])c1ccccc21")
+smiles(R"ClC(=O)[C@H]1CC[C@H]2c3ccccc3[C@](C1)([N+](=O)[O-])c1ccccc21")
+smiles(R"ClC(=O)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"ClCP(=O)(Cl)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"ClCP(=O)(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)N1CC1")
+smiles(R"ClCP(=O)(N)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Cl[Cu+]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23")
+smiles(R"Cl[Cu+]12[n+]3c(cccc3=c3cccc[n+]23)c2cccc[n+]12")
+smiles(R"Cl[Fe]12([Cl-][Fe]3(Cl)([Cl-]1)[S-]1CC[N@@+]45CCC[N@+]6(CCC4)CC[S@@H]3[Ni@@+2]156)[S-]1CC[N@+]34CCC[N@@+]5(CCC3)CC[S@@H]2[Ni@@+2]145")
+smiles(R"Cl[Fe]12([Cl-][Fe]3(Cl)([Cl-]1)[S-]1CC[N@+]45CCC[N@@+]6(CCC4)CC[S@@H]3[Ni@@+2]156)[S-]1CC[N@@+]34CCC[N@+]5(CCC3)CC[S@@H]2[Ni@@+2]145")
+smiles(R"[Cl-][Fe](Cl)(Cl)Cl")
+smiles(R"Cl[Fe](Cl)(Cl)Cl")
+smiles(R"Cl[Fe@@](Cl)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[ClH+][Co+2]12([ClH+])([O+]=C3NCNC4[N-][NH+]1CC34)[O+]=C1NCNC3[N-][NH+]2CC13")
+smiles(R"[ClH+][Co+2]12([ClH+])([O+]=c3nc[nH]c4[n-][n+]1cc34)[O+]=c1nc[nH]c3[n-][n+]2cc13")
+smiles(R"Cl[Hf]12345678(Cl)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81")
+smiles(R"Cl[Hf]12345678(Cl)(C9=C4[C@]7(C3=C19)C(C)(C)C)C1=C6[C@]8(C5=C21)C(C)(C)C")
+smiles(R"[Cl-][Hg][C@]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[Cl-][Hg][C@@]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[Cl-][Hg][C@]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(Cl)C6=C12")
+smiles(R"[Cl-][Hg][C@@]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(Cl)C6=C12")
+smiles(R"Cl[Hg][C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@]8([Hg][Cl-])C6=C12")
+smiles(R"Cl[Hg][C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@]8([Hg][Cl-])C6=C12")
+smiles(R"Cl[Hg](Cl)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cl[La](Cl)(Cl)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cl[Mn@](Cl)(/[S+]=c/1\nc[nH]c2[nH]cnc12)/[S+]=c/1\nc[nH]c2[nH]cnc12")
+smiles(R"[Cl-][Nb]12345678([Cl-])(C9=C4[C@-]7(C3=C19)[Si](C)(C)C)C1=C6[C@-]8(C5=C21)[Si](C)(C)C")
+smiles(R"[Cl-][Nb]12345678([Cl-])(C9=C4[C@@-]7(C3=C19)[Si](C)(C)C)C1=C6[C@-]8(C5=C21)[Si](C)(C)C")
+smiles(R"Clp1[nH]c2ncncc2[nH]1")
+smiles(R"Cl[Pd]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23")
+smiles(R"Cl[Pd]1(Cl)P(c2ccccc2)(c2ccccc2)[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]9(C7=C23)P1(c1ccccc1)c1ccccc1")
+smiles(R"Cl[Pd@@]1(Cl)P(c2ccccc2)(c2ccccc2)[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@-]9(C7=C23)P1(c1ccccc1)c1ccccc1")
+smiles(R"Cl[Pd]Cl")
+smiles(R"Cl[Pd@](Cl)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cl[Pd@](Cl)(Nc1ccc(cc1)/C=C/1\C=Cc2ccccc12)Nc1ccc(cc1)/C=C/1\C=Cc2ccccc12")
+smiles(R"Cl[Pd@@](Cl)(/[S+]=C\1/NCCS1)/[S+]=C\1/NCCS1")
+smiles(R"Cl[Pd@](Cl)(/[S+]=c/1\sc2ccccc2[nH]1)/[S+]=c/1\sc2ccccc2[nH]1")
+smiles(R"Cl[Pd@@](Cl)(/[S+]=c/1\scc[nH]1)/[S+]=c/1\scc[nH]1")
+smiles(R"ClP(=O)(Cl)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"ClP(=O)(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccccc1")
+smiles(R"ClP(=O)(Oc1ccccc1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Cl[Pt]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23")
+smiles(R"Cl[Pt@@+]12[N+](C)(C)CC[N@@+]2(C)CC[N+]1(C)C")
+smiles(R"Cl[Pt@+]12[N+](C)(C)CC[N@+]2(C)CC[N+]1(C)C")
+smiles(R"Cl[Pt]1(Cl)N(CCN1C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"Cl[Pt@@]1(Cl)N(CCN1C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"Cl[Pt@]1(Cl)N[C@@H]2CCC[C@@H](C2)N1")
+smiles(R"Cl[Pt@@]1([Cl][Pt@@](Cl)([Cl]1)P(C1CCCCC1)(c1ccccc1)c1ccccc1)P(C1CCCCC1)(c1ccccc1)c1ccccc1")
+smiles(R"Cl[Pt](Cl)(Cl)Cl")
+smiles(R"Cl[Pt](Cl)(Cl)[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Cl[Pt](Cl)[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Cl[Pt@](Cl)(Nc1ccc(cc1)/C=C/1\C=Cc2ccccc12)Nc1ccc(cc1)/C=C/1\C=Cc2ccccc12")
+smiles(R"Cl[Pt@@](Cl)(/[S+]=C\1/NCCS1)/[S+]=C\1/NCCS1")
+smiles(R"Cl[Pt@](Cl)(/[S+]=c/1\sc2ccccc2[nH]1)/[S+]=c/1\sc2ccccc2[nH]1")
+smiles(R"Cl[Pt@@](Cl)(/[S+]=c/1\scc[nH]1)/[S+]=c/1\scc[nH]1")
+smiles(R"Cl[Ru](Cl)Cl")
+smiles(R"[Cl-][Ru](Cl)(Cl)(Cl)(/[O+]=S/1\CCCC1)[n+]1ccc2ccccc2c1")
+smiles(R"[Cl-][Ru](Cl)(Cl)(Cl)(/[O+]=S\1/CCCC1)[n+]1ccc2ccccc2c1")
+smiles(R"Cl[Sn](Cl)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"Cl[Ti]12345678(Cl)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81")
+smiles(R"[Cl-][Zr]12345678([Cl-])(C9=C2C3=C1[C-]49)C1(=C7(C)C6(=C5(C)[C@-]81C)C)C")
+smiles(R"[Cl-][Zr]12345678([Cl-])(C9=C2C3=C1[C-]49)C1(=C7(C)C6(=C5(C)[C@@-]81C)C)C")
+smiles(R"Cl[Zr]12345678(Cl)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81")
+smiles(R"Cl[Zr]12345678(Cl)(C9=C4[C@@]7(Cc4ccccc4)C3=C19)C1=C6[C@@]8(Cc3ccccc3)C5=C21")
+smiles(R"Cl[ZrH]12345678(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81")
+smiles(R"CN")
+smiles(R"C[N@@+]12C[C@H]3C[C@@H](C1)C[N@+](C)(C3)[BH2+]2")
+smiles(R"C[N@+]12C[C@@H]3C[C@H](C1)C[N@@+](C)(C3)[BH2+]2")
+smiles(R"C[N@+]12C[C@@H]3O[C@H](C1)C[N@@+](C)(C3)C2")
+smiles(R"C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"C[N+]12CN3CN(CN(C3)C2)C1")
+smiles(R"C[N@+]12CN3CN(CP(C3)C2)C1")
+smiles(R"Cn1c2cc3ccccc3cc2n(C)c2cc3ccccc3cc12")
+smiles(R"Cn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2cc3ccccc3cc12")
+smiles(R"CN1c2ccccc2[C@]23CCN4CC=C[C@]5(CC[C@]13CC5)[C@H]24")
+smiles(R"Cn1c2ccccc2c2c3sc4c5c(sc4c3sc2c1=O)c(=O)n(C)c1ccccc51")
+smiles(R"Cn1c2ccccc2c2cnn3cnnc3c12")
+smiles(R"Cn1c2ccccc2c2cnn3c(nnc3c12)c1ccccc1")
+smiles(R"Cn1c2c(nc3sc4ccccc4c(=N)n23)c(=O)n(C)c1=O")
+smiles(R"Cn1ccc2c(c1)c(C)c1c3c(ccc(O)c3OCC(F)(F)F)[nH]c1c2C")
+smiles(R"CN1CC[C@@]2(CC1)[C@H](c1ccccc1)C(=O)N(C[C@@H]1COc3ccccc3O1)C2=O")
+smiles(R"CN1CC[C@]2(CC1)C(=O)N(c1ccccc1)C(=O)[C@H]2c1ccccc1")
+smiles(R"CN1CC[C@@]2(CC1)C(=O)N(Cc1ccccc1)C(=O)[C@@H]2c1ccccc1")
+smiles(R"CN1CC[C@@]2(CC1)C(=O)N(Nc1ccccc1)C(=O)[C@@H]2c1ccccc1")
+smiles(R"CN1CC[C@]2(CC1)N[C@@H]1CCN(C)C[C@H]1S2")
+smiles(R"CN1CC[C@@]2(CC1)N[C@@H]1CCN(C)C[C@H]1S2")
+smiles(R"CN1CC[C@@]2(CC1)O[C@H](c1ccccc1)[C@@H](O2)c1ccccc1")
+smiles(R"CN1CC[C@]2(CC1)SS[C@]1(CCN(C)CC1)S2")
+smiles(R"Cn1ccc2c(C)c3[nH]c4ccc(cc4c3c(C)c2c1)OC(C)(C)C")
+smiles(R"Cn1ccc2c(C)c3[nH]c4ccc(Oc5ccccc5)cc4c3c(C)c2c1")
+smiles(R"Cn1ccc2c(C)c3[nH]c4ccc(OCC(F)(F)F)cc4c3c(C)c2c1")
+smiles(R"CN1C=Cc2ccccc2[C@@H]1[C@@H]([N+](=O)[O-])[C@@H]1N(C)C=Cc2ccccc12")
+smiles(R"CN1C=Cc2ccccc2[C@@H]1[C@H]([N+](=O)[O-])[C@@H]1N(C)C=Cc2ccccc12")
+smiles(R"CN1C/C(=C/c2cccs2)/[C@H](O)/C(=C\c2cccs2)/C1")
+smiles(R"Cn1ccccc1")
+smiles(R"C[n+]1ccccc1S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"C[n+]1ccc(CCN[C@@H]2CC[C@H](CC2)/N=N/[C@H]2CC[C@@H](CC2)[N+](=O)[O-])cc1")
+smiles(R"C[n+]1ccc(CCN[C@H]2CC[C@@H](CC2)/N=N/[C@@H]2CC[C@H](CC2)[N+](=O)[O-])cc1")
+smiles(R"CN1CCC[C@H](C1)CN(C(=O)C)C12C[C@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CN1CCC[C@@H](CNC23C[C@H]4C[C@@H](C[C@@H](C4)C3)C2)C1")
+smiles(R"Cn1cccc(O)c1")
+smiles(R"CN1CC[C@H](O)[C@H](CN[C@]23C[C@@H]4C[C@H](C[C@H](C4)C3)C2)C1")
+smiles(R"CN1CC[C@H](O)[C@H](CN[C@@]23C[C@@H]4C[C@@H](C[C@H](C4)C3)C2)C1")
+smiles(R"CN1CC[C@H](O)[C@H](CN[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)C1")
+smiles(R"C[N+]1(C)CC[S+]2CC[N+](C)(C)[Pt@@+]12Cl")
+smiles(R"C[N+]1(C)CC[S+]2CC[N+](C)(C)[Pt@+]12Cl")
+smiles(R"CN1C[C@H]2CN(C)C[C@@H](C1)C2")
+smiles(R"CN1C[C@@H]2CN(C)C[C@H](C1)[C@@]2(O)c1ccccc1")
+smiles(R"CN1C[C@@H](c2ccccc2)[C@@](Cl)([C@@H](C1)c1ccccc1)[C@@]1(CN(C)C[C@@H](c2ccccc2)C1=O)c1ccccc1")
+smiles(R"CN1C[C@@H](c2ccccc2)[C@@H](OC(=O)C)[C@@H](C1)c1ccccc1")
+smiles(R"Cn1cc[n+](c1)[Pt+2]12[n+]3ccccc3c3cccc(=c4cccc[n+]14)[n+]23")
+smiles(R"Cn1cc[n+](c1)[Pt+2]12[n+]3ccccc3c3cccc(c4cccc[n+]14)[n+]23")
+smiles(R"CN1CCN(CC1)c1ccc2nnc(Cl)n2n1")
+smiles(R"CN1[C@@H]2CC[C@H]1C[C@]1(SCCS1)C2")
+smiles(R"CN1[C@@H]2CC[C@H]1CC1(SCCS1)C2")
+smiles(R"CN1[C@H](C)C[C@](C[C@H]1C)(c1ccccc1)c1ccccc1")
+smiles(R"CN1CN(c2ccccc2)[C@]2(CCN(CCC[C@H]3Cc4ccccc4O3)CC2)C1=O")
+smiles(R"C[n+]1cnn(C)n1")
+smiles(R"CN1C(=O)/C(=c/2\sc3nc4ccccc4n3c2=O)/c2ccccc12")
+smiles(R"CN1C(=O)[C@H]2[C@@H](C1=O)[C@@]1(O)c3ccccc3[C@]2(N)c2ccccc12")
+smiles(R"CN1C(=O)[C@@H]2S/C(=N/Nc3ccccc3)/S[C@H]1C(=O)N2C")
+smiles(R"Cn1c(=O)n2n(c1=O)[C@H]1[C@H]3[C@H]4[C@@H]2[C@]25COC[C@@]15[C@@H]3[C@@H]42")
+smiles(R"Cn1c(=O)n(C)c(=O)c2c1nc1sc3ncccc3c(=O)n21")
+smiles(R"CN1C(=S)[C@@]2([C@@H]1c1ccccc1)C(C)(C)CCCC2(C)C")
+smiles(R"CN1NC=[N+](C)N1")
+smiles(R"Cn1nnc(n1)c1nnn(C)n1")
+smiles(R"CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CN(c1ccccc1)[C@H]1C2=C(CCCC2)OC(=O)[C@@]21SCCCS2")
+smiles(R"CN(c1ccccc1)C(=S)S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CN(C)[C@]12CC[C@H](c3ccccc13)c1ccccc21")
+smiles(R"CN(C)c1ccc(cc1)/C=c/1\c2ccccc2n2c1cc([n+]2C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CN(C)c1ccc(cc1)/C=c/1\c2ccccc2n2c1cc([n+]2C)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CN(C)c1ccc(cc1)/C=C/1\CN(C/C(=C/c2ccc(cc2)N(C)C)/C1=O)C(=O)C")
+smiles(R"CN(C)c1ccc(cc1)/C=C\1/C(=O)/C(=C\c2ccc(cc2)N(C)C)/c2ccccc12")
+smiles(R"CN(C)c1ccc(cc1)/C=c/1\sc2nc3ccccc3n2c1=O")
+smiles(R"CN(C)c1ccc(cc1)/C=c/1\sc2nc(=O)c(nn2c1=O)c1ccccc1NC(=O)C(F)(F)F")
+smiles(R"CN(C)c1ccc(cc1)/C=c/1\sc2nnc(c3cccnc3)n2c1=O")
+smiles(R"CN(C)c1ccc(cc1)/C=c/1\sc2nnc(c3ccco3)n2c1=O")
+smiles(R"CN(C)c1ccc(cc1)/C=c/1\sc2nnc(Cc3ccccc3)n2c1=O")
+smiles(R"CN(C)c1ccc(cc1)C[C@@H]1CC[C@H]2CCCC[C@H]12")
+smiles(R"CN(Cc1ccccc1)[C@@H]1CC[C@H](CC1)C(=O)O")
+smiles(R"CN(C)c1ccc(cc1)[C@@H]1O[C@]2(CCCCC2)C[N@@+]21CCCC2")
+smiles(R"CN(C)c1ccc(cc1)[C@@H]1O[C@]2(CCCCC2)C[N@+]21CCCC2")
+smiles(R"CN(C)c1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CN(C)c1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CN(C)c1nc(nc(n1)N(C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)N(C)C")
+smiles(R"CN(C)c1nc(nc(n1)N(C)C)N[C@@]12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1")
+smiles(R"CN(C)c1nnn(Cc2ccccc2)n1")
+smiles(R"CN(C)C1=[S+][Cu@@]2(I)S3=C(SC(=[S+][Cu@@]3(I)S2=C(S1)N(C)C)N(C)C)N(C)C")
+smiles(R"CN(C)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CN(C)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"CN(C)CC12=C3C4=C5[C@-]61SSS[C@-]17C8=C9C%10=C1[Fe+2]23456789%10")
+smiles(R"CN(C)CC12=C3C4=C5[C@-]61SSS[C@@-]17C8=C9C%10=C1[Fe+2]23456789%10")
+smiles(R"CN(C)Cc1cc(cc(c2ccccc2)c1O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C[N+](C)(C)C[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"CNCCC[C@]12C[C@H](c3ccccc13)c1ccccc21")
+smiles(R"C[N+](C)(C)CCC[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"C[N+](C)(C)CCC[N+]1(C)CC[C@@]2(CCC[C@@H](C2)C(F)(F)F)CC1")
+smiles(R"CN(C)CCCN1CC[C@@]2(CCC[C@@H](C2)C(F)(F)F)CC1")
+smiles(R"CN(C)CCCN1CC[C@@]2(CCC[C@H](C)C2)CC1")
+smiles(R"CN(C)CCCNc1ccc2nnn3c2c1c(=O)c1cc(ccc31)[N+](=O)[O-]")
+smiles(R"CN(C)CCCNc1ccc2NNn3c2c1c(=O)c1cc(ccc31)[N+](=O)[O-]")
+smiles(R"CN(C)CCCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31")
+smiles(R"CN(C)CCCNc1ccc2nnn3c4ccc(OC(=O)c5ccccc5)cc4c(=O)c1c23")
+smiles(R"CN(C)CCCNc1ccc2nnn3c4ccc(OC(=O)c5ccc(cc5)[N+](=O)[O-])cc4c(=O)c1c23")
+smiles(R"CN(C)CCCNc1ccc2NNn3c4ccc(OC(=O)c5ccc(cc5)[N+](=O)[O-])cc4c(=O)c1c23")
+smiles(R"CN(C)C[C@@H]1C[C@@]2(OCCO2)C[C@H](CN(C)C)C1=O")
+smiles(R"CN(C)C[C@@H]1CCC[C@]21OCCO2")
+smiles(R"CN(C)C[C@@H]1CCCC[C@@]21OCCO2")
+smiles(R"CN(C)C[C@@H]1CCC[C@@H](CN(C)C)/C/1=N\OC(=O)c1ccccc1")
+smiles(R"CN(C)CC[N@@+]12CCC[N+]3=C(C)c4cccc5C(=[N+](CCC1)[Ni@+2]23[n+]45)C")
+smiles(R"CN(C)CC[N@+]12CCC[N+]3=C(C)c4cccc5C(=[N+](CCC1)[Ni@@+2]23[n+]45)C")
+smiles(R"CN(C)CC[N@@+]12CCCN3[C@H](C)c4cccc5[C@@H](C)N(CCC1)[Ni@@+3]23[n+]45")
+smiles(R"CN(C)CC[N@+]12CCCN3[C@H](C)c4cccc5[C@@H](C)N(CCC1)[Ni@+3]23[n+]45")
+smiles(R"CN(C)CCNc1ccc2ncnc3c4ccccc4C(=O)c1c23")
+smiles(R"CN(C)CCNc1ccc2nnn3c2c1c(=O)c1ccccc31")
+smiles(R"CN(C)CCNc1ccc2nnn3c2c1c(=O)c1cc(C)ccc31")
+smiles(R"CN(C)CCNc1ccc2nnn3c2c1c(=O)c1cc(Cl)ccc31")
+smiles(R"CN(C)CCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31")
+smiles(R"CN(C)CC/[N+](=C(/c1ccccc1)\[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/[O-]")
+smiles(R"CN(C)CC/[N+](=C(/c1ccccc1)\C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/[O-]")
+smiles(R"CN(C)CCNC(=O)c1cccc2c(N[C@H](CCCNC(=N)N)C(=O)O)c3ccccc3n(C)c12")
+smiles(R"CN(C)CCNC(=O)c1cccc2nc3c(nc12)c1ccccc1c1ccccc31")
+smiles(R"CN(C)CCO[C@]1(CC[C@@H](CC1)C(C)(C)C)Cc1ccc(C)cc1")
+smiles(R"CN(C)CCO[C@@]1(CC[C@H](CC1)C(C)(C)C)Cc1ccc(C)cc1")
+smiles(R"CN(C)CCO[C@@]1(CC[C@H](CC1)C(C)(C)C)Cc1ccc(Cl)cc1Cl")
+smiles(R"CN(C)CCO[C@]1(CC[C@@H](CC1)C(C)(C)C)Cc1ccc(F)cc1")
+smiles(R"CN(C)CCO[C@@]1(CC[C@H](CC1)C(C)(C)C)Cc1ccc(F)cc1")
+smiles(R"CN(C)CC(=O)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CN(C)CCOC(=O)[C@@H]1C[C@]2(C1)C[C@@H](C2)C(=O)OCCN(C)C")
+smiles(R"CNCCC(=O)NC[C@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1")
+smiles(R"CN(C)CCONC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CN(C)[C@H]1C(C)(C)[C@@H](OC(=O)C(O)(c2ccccc2)c2ccccc2)C1(C)C")
+smiles(R"CN(C)[C@H]1CC[C@@H](CC1)C[C@@H]1CCc2ccccc12")
+smiles(R"CN(C)[C@H]1CC[C@@H](CC1)NC1=CC(=O)C(=CC1=O)N[C@H]1CC[C@@H](CC1)N(C)C")
+smiles(R"CN(C)[C@H]1C(=C(C(=O)NC[N@@+]23CCO[B@-]3(OCC2)c2ccccc2C)C(=O)[C@]2(O)[C@@H]1C[C@H]1C(=C2O)C(=O)c2c(O)cccc2[C@]1(C)O)O")
+smiles(R"CN(C)[C@H]1C(=C(C(=O)NC[N@+]23CCO[B@@-]3(OCC2)c2ccccc2C)C(=O)[C@]2(O)[C@@H]1C[C@H]1C(=C2O)C(=O)c2c(O)cccc2[C@]1(C)O)O")
+smiles(R"CN(C)[C@H]1CS(=O)(=O)[C@@]21C[C@H]1c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"CNC[C@H](O)C[C@]12CC[C@H](c3ccccc13)c1ccccc21")
+smiles(R"CN(C)/C=N/c1ccc2nonc2c1")
+smiles(R"CN(C)/C(=N\c1ccccc1)/OC1=NC(=C/C/1=C/1\C=C(O/C(=N\c2ccccc2)/N(C)C)N=C1O/C(=N/c1ccccc1)/N(C)C)O/C(=N/c1ccccc1)/N(C)C")
+smiles(R"CN(C)/C=N/[C@@H]1CC[C@H](CC1)CC1CCCCC1")
+smiles(R"CN(C)/C=N/[C@H]1CC[C@@H](CC1)CC1CCCCC1")
+smiles(R"CN(C)C(=O)[C@@H]1C[C@@]2(C1)C[C@H](C2)C(=O)N(C)C")
+smiles(R"CN(C)C(=O)[C@@H]1CC[C@H](CC1)CC1CCCCC1")
+smiles(R"CN(C)C(=O)[C@@H](c1ccccc1)[C@@H](c1ccccc1)[C@H](c1ccccc1)C(=O)N(C)C")
+smiles(R"CN(C)C(=O)N1CN(c2ccccc2)[C@]2(CCN(CC2)C[C@H]2COc3ccccc3O2)C1=O")
+smiles(R"CN(C)C(=O)O[C@@H]1[C@@](C)(C)[C@@H](OC(=O)N(C)C)[C@]1(C)C")
+smiles(R"CN(C)C(=S)Nc1nnc(s1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CN(C)C(=S)S[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(SC(=S)N(C)C)C6=C12") # smiles(R"CN(C)C1=NC(=C2C=CC=C12)N(C)C")
+smiles(R"CN(C)N1CC[C@@]2(CCC[C@@H](C2)C(F)(F)F)CC1")
+smiles(R"CN(C(=O)[C@]12[C@H]3[C@H]4[C@]2(C(=O)O)[C@H]2[C@@H]1[C@]3(C(=O)O)[C@@]42C(=O)N(C)C(C)(C)C)C(C)(C)C")
+smiles(R"CN(C(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@H]1[C@@]4([C@@H]3[C@@]21C)C(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C)C(C)(C)C")
+smiles(R"CN(C(=O)[C@@]12[C@@H]3[C@@H]4[C@H]2[C@@H]2[C@H]1[C@H]3[C@]42C(=O)C(C)(C)C)C(C)(C)C")
+smiles(R"CN(C(=O)[C@@]12[C@@H]3[C@@H]4[C@H]2[C@@H]2[C@H]1[C@H]3[C@]42C(=O)N)C(C)(C)C")
+smiles(R"CN(C(=O)[C@]12[C@@H]3[C@H]4[C@@H]5[C@H]([C@@H]14)[C@]2([C@H]35)C(=O)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14)C(C)(C)C")
+smiles(R"CNC(=O)[C@]12C(=O)NC(=O)[C@@]1(C(=O)O)[C@@]12CCCC1")
+smiles(R"CNC(=O)[C@@]1(C#N)[C@H](c2ccccc2)[C@](C#N)(C(=O)NC)[C@@H]1c1ccccc1")
+smiles(R"CNC(=O)[C@@H]1CC[C@H](CC1)CC1CCCCC1")
+smiles(R"CNC(=O)[C@H]1CC[C@@H](CC1)CC1CCCCC1")
+smiles(R"CNC(=O)NCCN1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"CNC(=O)N(C)/N=N/C[C@H]1CC[C@H](C/N=N/N(C)C(=O)NC)CC1")
+smiles(R"CNC(=O)O/N=C\1/CC[C@@H](CC1)CC1CCCCC1")
+smiles(R"CN(C)S(=O)(=O)/N=C/1\C=C/C(=N\S(=O)(=O)N(C)C)/C=C1")
+smiles(R"CN/C(=[S+]\[Rh@@](Cl)(C#[O+])/[S+]=C(\NC)/P(c1ccccc1)c1ccccc1)/P(c1ccccc1)c1ccccc1")
+smiles(R"CN(/N=C/c1ccccc1)[C@@H](N(C)/N=C\c1ccccc1)c1ccccc1")
+smiles(R"CN(/N=C/c1ccccc1Cl)[C@H](N(C)/N=C\c1ccccc1Cl)c1ccccc1Cl")
+smiles(R"CN(/N=C\C=N\N(C)CCc1nnnn1C)CCc1nnnn1C")
+smiles(R"CO[C@@]1(c2ccccc2)c2cc3ccccc3cc2[C@@](OC)(c2ccccc2)c2cc3ccccc3cc12")
+smiles(R"COC1=c2ccccc2=c2ccccc2=c2ccccc2=N1")
+smiles(R"COc1cc2c(c3c1c(=O)c1ccccc1n3C)c(=O)c1ccccc1n2C")
+smiles(R"COc1cc2cc(ccc2cc1OC)/C(=N\N=C(/C)\c1ccc2cc(OC)c(OC)cc2c1)/C")
+smiles(R"COc1cc2c(cc[n+]3cc4c(ccc5ccccc45)cc23)cc1OC")
+smiles(R"COc1cc2c(CN3Cc4cc(O)c(OC)cc4[C@H]2C3)cc1O")
+smiles(R"COc1cc2c(oc(=O)c3c2c(OC)cc2ccoc32)c2cccc(O)c12")
+smiles(R"COc1cc2c(oc(=O)c3c2c(OC)cc2ccoc32)c2cccc(OCc3ccccc3)c12")
+smiles(R"COc1cc2c(oc(=O)c3c2c(OC)cc2cc(oc32)[Si](C)(C)C)c2cccc(OCc3ccccc3)c12")
+smiles(R"COc1cc(Br)c2nsnc2c1")
+smiles(R"COc1ccc2c(c1)[C@]13CCCC[C@@H]3[C@H](N(C)CC1)[C@@]12CC1")
+smiles(R"COc1ccc2c(c1)c(=O)c1c(NCCN(C)C)ccc3nnn2c13")
+smiles(R"COc1ccc2c(c1)nc1c(c3cccc4ccc(OC)c1c34)/n/2=N\C(=O)CBr")
+smiles(R"COc1ccc2c(c1)[n+]([O-])c(C(=O)C/C(=N/OCCCc1ccccc1)/C(=O)N[C@]13C[C@@H]4C[C@@H](C[C@@H](C4)C3)C1)c(C)[n+]2[O-]")
+smiles(R"COc1ccc2c(c1)[n+]([O-])c(C(=O)C/C(=N/OCCCc1ccccc1)/C(=O)NC13C[C@@H]4C[C@@H](C[C@@H](C4)C3)C1)c(C)[n+]2[O-]")
+smiles(R"COc1ccc2c(CCC3=C2CC[C@H]2[C@@H]3C(=O)CC[C@]32OCCCO3)c1")
+smiles(R"COc1ccc2C[C@H]3N(C)CC[C@@]4(C[C@]5(OCCO5)CC[C@H]34)c2c1Oc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"COc1ccc2C[C@H]3N(C)CC[C@@]4(C[C@@]5(OCCO5)CC[C@H]34)c2c1Oc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"COc1ccc2c(no[n+]2[O-])c1")
+smiles(R"COc1ccc2nc3cc(Cl)ccc3c(NCCCN3CCN(CCCNc4ccc5nnn6c7ccccc7c(=O)c4c56)CC3)c2c1")
+smiles(R"COc1ccc2nc3C(=O)c4cccnc4c4nccc(c34)c2c1")
+smiles(R"COc1ccc2nccc(/C=C\3/N4CC[C@@H](CC4)[C@@H]3OC(=O)c3ccc(cc3)[N+](=O)[O-])c2c1")
+smiles(R"COc1ccc2nccc(/C=C\3/N4CC[C@H](CC4)[C@@H]3OC(=O)c3ccc(cc3)[N+](=O)[O-])c2c1")
+smiles(R"COc1ccc2nccc([C@H](O)[C@@H]3C[C@@H]4CCN3C[C@@H]4C=C)c2c1")
+smiles(R"COc1ccc2nc(O)cc(/C=C/3\N4CC[C@H](CC4)C3=O)c2c1")
+smiles(R"COc1ccc2[nH]c3cc4c(cc3c(=O)c2c1)[nH]c1ccc(OC)cc1c4=O")
+smiles(R"COc1ccc2[nH]c3c(C)c4ccn5c(cc6ccccc6c5=O)c4c(C)c3c2c1")
+smiles(R"COc1ccc2[nH]c3c(C)c4ccnc(NCCCN(C)CCCNc5ccc6nnn7c8ccccc8c(=O)c5c67)c4c(C)c3c2c1")
+smiles(R"COc1ccc2[nH]c3c(C)c4ccn(COC(=O)c5ccccc5)cc4c(C)c3c2c1")
+smiles(R"COc1ccc2[nH]cc(C(=O)C(=O)N[C@@]34C[C@H]5C[C@H](C[C@H](C5)C4)C3)c2c1")
+smiles(R"COc1ccc2nonc2c1")
+smiles(R"COc1ccc2[N+]([O-])ONc2c1")
+smiles(R"COc1ccc2n[se]nc2c1")
+smiles(R"COc1ccc2O[C@@H](CN3CC[C@]4(CC3)C(=O)NCN4c3ccccc3)Cc2c1")
+smiles(R"COc1cccc2C(=O)c3c(O)c4C[C@](O)(C[C@H](O[C@H]5C[C@H](N)[C@H](O)[C@H](C)O5)c4c(O)c3C(=O)c12)C1(C)OC[C@](C)(C)CO1")
+smiles(R"COc1ccc(cc1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)c1ccccc1O")
+smiles(R"COc1ccc(cc1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)c1ccccc1O")
+smiles(R"COc1cccc(c1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)c1ccccc1O")
+smiles(R"COc1cccc(c1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)c1ccccc1O")
+smiles(R"COc1cccc(c1)[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"COc1cccc(c1)[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"COc1ccccc1[B@-]12OCC[N@@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"COc1ccccc1[B@@-]12OCC[N@+]2(CCO1)CNC(=O)C1=C(O)[C@H](N(C)C)[C@H]2C[C@H]3C(=C(O)[C@]2(O)C1=O)C(=O)c1c(O)cccc1[C@]3(C)O")
+smiles(R"COc1ccccc1[C@@]12c3ccccc3[C@@]2(O)c2ccccc12")
+smiles(R"COc1ccc(cc1)[C@@]12c3ccccc3[C@H]2c2ccccc12")
+smiles(R"COc1ccc(cc1)[C@]12c3ccc(OC)cc3C[C@]2(Cc2cc(OC)ccc12)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"COc1ccc(cc1)[C@@]12c3ccc(OC)cc3C[C@@]2(Cc2cc(OC)ccc12)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"COc1ccc(cc1)[C@]1(Cl)[C@@](Cl)(C(F)(F)F)[C@]1(Cl)C(F)(F)F")
+smiles(R"COc1ccc(cc1)c1nnn(n1)/C(=N/O)/c1c(C)cc(OC)cc1C")
+smiles(R"COc1cccc(c1)[C@@]1(O)CCCC[C@H]1[N@@H+]1CC[C@@]2(CC1)C(=O)NC[C@H]2c1ccccc1")
+smiles(R"COc1ccc(cc1)Cc1nnc2nc(OC)c(c3ccc(OC)cc3)n2n1")
+smiles(R"COc1ccc(cc1)/C=c\1/sc2nc(nn2c1=O)c1ccccc1")
+smiles(R"COc1ccc(cc1)/C=c/1\sc2=NN[C@@]3(CC[C@H](C)CC3)Nn2c1=O")
+smiles(R"COc1ccc(cc1)/C=c/1\sc2nnc(CCC(=O)Nc3cccc(c3)C(F)(F)F)n2c1=O")
+smiles(R"COc1ccc(cc1)CC[C@@]1(C)OC[C@@](C)(CC)CO1")
+smiles(R"COc1ccc(cc1)C#C[C@]1(O)c2ccccc2[C@](O)(C#Cc2ccc(OC)cc2)c2ccccc12")
+smiles(R"COc1ccc(cc1)/C=C/C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1ccc(cc1)/C=C/C(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1ccc(cc1)[C@@H]1C2=C(C[C@@H](CC2=O)c2ccccc2)NC2=C1C(=O)C[C@H](C2)c1ccccc1")
+smiles(R"COc1cccc(c1)[C@@H]1C[C@]21C(=O)NC(=O)NC2=O")
+smiles(R"COc1cccc(c1)[C@@H]1C[C@@H]([NH2+]CC2CC2)C1")
+smiles(R"COc1ccccc1[C@@H]1CC(=O)C[C@@H](c2ccccc2OC)[C@@]21C(=O)NC(=S)NC2=O")
+smiles(R"COc1ccc(cc1)[C@@H]1CC(=O)C[C@@H](c2ccc(OC)cc2)[C@@]21C(=O)c1ccccc1C2=O")
+smiles(R"COc1ccc(cc1)[C@H]1CC(=O)C[C@H](c2ccc(OC)cc2)[C@]21C(=O)CCCC2=O")
+smiles(R"COc1ccc(cc1)[C@H]1CC(=O)C[C@@H](c2ccc(OC)cc2)[C@@]21C(=O)NC(=O)NC2=O")
+smiles(R"COc1ccc(cc1)[C@H]1CC(=O)C[C@@H](c2ccc(OC)cc2)[C@@]21C(=O)NC(=S)NC2=O")
+smiles(R"COc1cccc(c1)[C@@H]1[C@H](C#N)C(=O)NC(=O)[C@H]1C#N")
+smiles(R"COc1ccc(cc1)[C@H]1OC[C@@](C)(CC)CO1")
+smiles(R"COc1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"COc1ccccc1[C@@H]1O[C@H](C[C@]2(CC(=C)C(=O)O2)C1)c1ccccc1OC")
+smiles(R"COc1ccc(cc1)[C@H]1O[C@H](C)[C@@H](C)O1")
+smiles(R"COc1ccccc1[C@@H]1O[C@@H](C)[C@H](C)O1")
+smiles(R"COc1cccc(c1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"COc1ccccc1[C@@H](C#N)N1CCCN([C@@H]1c1ccccc1)[C@H](C#N)c1ccccc1OC")
+smiles(R"COc1ccccc1[C@@H](C#N)N1CCCN([C@H](C#N)c2ccccc2OC)[C@@H]1c1cccc(OC)c1O")
+smiles(R"COc1ccc(cc1)[C@@H](C#N)N1CCCN([C@H](C#N)c2ccc(OC)cc2)[C@H]1c1ccccc1OC")
+smiles(R"COc1ccc(cc1)[C@@H](C#N)N1CCCN([C@H](C#N)c2ccc(OC)cc2)[C@@H]1c1cccc(OC)c1O")
+smiles(R"COc1ccccc1[C@H](C(=O)N[C@@H]1CN2CC[C@H]1CC2)c1ccsc1")
+smiles(R"COc1ccc(cc1)[C@H](/N=C/c1ccc(OC)cc1)/N=C/c1ccc(OC)cc1")
+smiles(R"COc1ccc(cc1)[C@H](OC/C=C(/C)\CCC=C(C)C)OC/C=C(/C)\CCC=C(C)C")
+smiles(R"COc1ccc(cc1)[C@H](OC[C@@H]1C[C@H]2CC[C@@H]1C2)OC[C@@H]1C[C@H]2CC[C@@H]1C2")
+smiles(R"COc1ccc(cc1)[C@H](OC[C@H]1C[C@@H]2C=C[C@H]1C2)OC[C@H]1C[C@@H]2C=C[C@H]1C2")
+smiles(R"COc1ccc(cc1)Cn1cccc(O)c1")
+smiles(R"COc1ccc(cc1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"COc1ccccc1/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"COc1ccc(cc1)CN(CCCCCCN(Cc1ccc(OC)cc1)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"COc1ccc(cc1)CN[C@H](C)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"COc1ccc(cc1)/C=N/N(C)CN(C)/N=C\c1ccc(OC)cc1")
+smiles(R"COc1ccccc1/C=N/N/C(=N/N=C/c1ccccc1OC)/N/N=C/c1ccccc1OC")
+smiles(R"COc1ccccc1/C=N/N/C(=N)/N/N=C\c1ccccc1OC")
+smiles(R"COc1ccccc1/C=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"COc1ccc(cc1)C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1ccc(cc1)C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1cccc(c1)C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1cccc(c1)C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1ccc(cc1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"COc1ccccc1N1C(=O)[C@H]2[C@@H]3c4ccccc4[C@](OC(=O)C)([C@H]2C1=O)c1ccccc31")
+smiles(R"COc1cccc(c1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"COc1ccccc1N1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"COc1ccc(cc1/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1)c1csc(Cc2ccccc2)n1")
+smiles(R"COc1ccccc1N/C(=C/C(=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/c1ccccc1")
+smiles(R"COc1cccc(c1)NC(=O)CC(=O)N1N=C(C)[C@@H](/N=N/c2ccc(cc2)[S@@](=O)(=O)c2ccc(/N=N/[C@@H]3C(=NN(C(=O)CC(=O)Nc4cccc(OC)c4)C3=O)C)cc2)C1=O")
+smiles(R"COc1ccccc1NC(=O)[C@@H](C(=O)C)[C@@H](c1cccc(c1)[N+](=O)[O-])[C@H](C(=O)C)C(=O)Nc1ccccc1OC")
+smiles(R"COc1ccccc1NC(=O)[C@@H](C(=O)C)[C@H](c1cccc(c1)[N+](=O)[O-])[C@H](C(=O)C)C(=O)Nc1ccccc1OC")
+smiles(R"COc1ccc(cc1)NC(=O)N1C[C@H]2CCN1CC2")
+smiles(R"COc1ccccc1NC(=O)OC[C@@]12COCN2COC1")
+smiles(R"COc1ccc(cc1)[NH+]1CCN(CC1)C[C@@H](O)COCC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"COc1cc(ccc1OC)[C@]12CCN([C@@H]2[C@@H](CO)C2(OC[C@](C)(C)CO2)CC1)S(=O)(=O)c1ccc(C)cc1")
+smiles(R"COc1cc(ccc1OC)[C@]1(CCC2(C=C)OC[C@](C)(C)CO2)CN(=O)O[C@@H](O[C@H]2CCCC[C@H]2C(C)(C)c2ccccc2)C1")
+smiles(R"COc1c(cccc1OC)/C=C/1\COC/C(=C/c2cccc(OC)c2OC)/C1=O")
+smiles(R"COc1cc(ccc1OC)/C=C\1/C(=O)OC(=O)/C1=C\c1ccc(OC)c(OC)c1")
+smiles(R"COc1cc(ccc1OC)/C=C/C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1cc(ccc1OC)/C=C/C(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1ccc(cc1OC)[C@@H]1[C@@H]2C(=O)NC(=O)[C@H]1C(=O)NC2=O")
+smiles(R"COc1cc(ccc1OC)[C@@H]1OC[C@@]2(CO)CO[C@@H](c3ccc(OC)c(OC)c3)N12")
+smiles(R"COc1ccc(cc1OC)[C@@H](/N=C/c1ccc(OC)c(OC)c1)/N=C/c1ccc(OC)c(OC)c1")
+smiles(R"COc1cc(ccc1OC)C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1cc(ccc1OC)C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1cc(ccc1O)[C@@H]1OC[C@]2(CO)CO[C@@H](c3ccc(O)c(OC)c3)N12")
+smiles(R"COc1cc(ccc1O)[C@@H]1SCCCCCCCCCCS[C@H](SCCCCCCCCCCS1)c1ccc(O)c(OC)c1")
+smiles(R"COc1cc(ccc1O)[C@H](/N=C/c1ccc(O)c(OC)c1)/N=C/c1ccc(O)c(OC)c1")
+smiles(R"COc1cc(ccc1OC)Nc1c2ccccc2n2c(c1C#N)n(C)c1ccccc21")
+smiles(R"COc1cc(ccc1O)C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1cc(ccc1O)C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"COc1ccc(cc1)P1(=[S+][Ni]2(S1)(SP(=[S+]2)(c1ccc(OC)cc1)c1ccc(OC)cc1)(N1CC[C@@H](C)CC1)N1CC[C@H](C)CC1)c1ccc(OC)cc1")
+smiles(R"COc1ccc(cc1)S(=O)(=O)NC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"COc1cccc(CCNc2c3cccnc3n3c(c2C#N)n(C)c2ccccc32)c1")
+smiles(R"COc1cccc([C@@H](/N=C/c2cccc(OC)c2O)/N=C/c2cccc(OC)c2O)c1O")
+smiles(R"COc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"COc1cccc(/C=N/NC(=O)[C@@H]2CCN(CC2)C(=S)N[C@@H]2C[C@@H]3C=C[C@H]2C3)c1O")
+smiles(R"COc1cccc(/C=N/NC(=S)N[C@@H]2CN3CC[C@@H]2CC3)c1OC")
+smiles(R"COc1ccc(Cl)cc1N1C(=O)[C@H]2[C@@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"COc1ccc(/C=N/N2CN(B(NC2=N)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)[C@@H](C)C(=O)O)cc1OC")
+smiles(R"COc1ccc(/C=N/N/C(=N)/N/N=C\c2ccc(OC)cc2)cc1")
+smiles(R"COc1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1OC")
+smiles(R"COc1ccc(c(OC)c1)[C@H]1CC(=O)C[C@@H](c2ccc(OC)cc2OC)[C@]21C(=O)c1ccccc1C2=O")
+smiles(R"COc1ccc(c(OC)c1)N1C(=O)[C@@H]2[C@H](C1=O)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"COc1cc(cc(OC)c1OC)[C@H]1[C@H](C(=O)OC/C=C/c2ccc3OCOc3c2)[C@@H](c2cc(OC)c(OC)c(OC)c2)[C@H]1C(=O)OC/C=C/c1ccc2OCOc2c1")
+smiles(R"COc1cc(cc(OC)c1OC)[C@H]1N2CCCN1CC2")
+smiles(R"COC1=CC(=C(C(=O)[C@@H]2[C@H](c3ccccc3)[C@H]([C@H]2c2ccccc2)C(=O)C2=C(O)C=C(OC)C(C)(C)C2=O)C(=O)C1(C)C)O")
+smiles(R"COc1cc(/C=N/c2ccc(cc2)c2csc(n2)c2ccc(Cl)cc2)ccc1N1CC[C@@]2(CCCCC2)CC1")
+smiles(R"COc1ccc(NC(=O)C)c2c1[nH]c1c(c(=O)c3[nH]c4c(OC)ccc(NC(=O)C)c4c(=O)c3c1=O)c2=O")
+smiles(R"COc1cc(/C=N/N=C\c2ccc(OC)c(OC)c2)ccc1OC")
+smiles(R"COc1cc(/C=N\NC(=S)N[C@H]2CN3CC[C@@H]2CC3)ccc1OC")
+smiles(R"COc1ccc(OC)c2c(cc(nc12)c1ccc(Cl)cc1)[C@@H](O)CN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"COc1ccnc2c1C(=O)c1nc3ccccc3c3ccnc2c13")
+smiles(R"COc1cc(N[C@H](C)CCCN[C@@H]2CN3CC[C@H]2CC3)c2ncccc2c1")
+smiles(R"COc1cc(O)c2c(=O)cc(oc2c1)[C@]1(C=C[C@H](C=C1)O[C@@H]1O[C@@H](CO)[C@H](O)[C@H](O)[C@@H]1O)OC(=O)C")
+smiles(R"COc1cc(OC)c2ssc3c(OC)cc(OC)c4ssc1c2c34")
+smiles(R"COc1cc(OC)cc(c1)C[N@@+]12CC[N@+](CC1)(Cc1cc(OC)cc(OC)c1)C2")
+smiles(R"C/[O+]=C/1\C=C(OC)/C(=C\c2c(OC)cc(OC)cc2OC)/C(=C1)OC")
+smiles(R"COc1cc(OC)c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(OC)c1")
+smiles(R"COc1cc(O)c(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(OC)c1")
+smiles(R"COC1[CH]C(/N=N/C2[CH][CH][CH]C([CH]2)S(=O)(=O)O)[CH][CH]C1/N=N/C1[CH][CH]C(/C=C\C2[CH][CH]C([CH]C2S(=O)(=O)O)N2ON2C2[CH][CH]C(/C=C/C3[CH][CH]C(/N=N/C4[CH][CH]C(/N=N/C5[CH][CH][CH]C([CH]5)S(=O)(=O)O)[CH]C4OC)[CH]C3S(=O)(=O)O)C([CH]2)S(=O)(=O)O)C([CH]1)S(=O)(=O)O")
+smiles(R"COc1c(N2CCCCC2)c2c(=O)c3ccccc3oc2c2c3ccccc3n(C)c12")
+smiles(R"COc1c(OC)cc2CCN[C@H]3C[C@]4(C=CC(=O)C=C4)c1c23")
+smiles(R"COc1c(OC)cc2CCN(C(=O)C)[C@H]3C[C@]4(C=CC(=O)C=C4)c1c23")
+smiles(R"COc1c(OC)cc(cc1OC)[C@H]1CC(=O)C[C@@H](c2cc(OC)c(OC)c(OC)c2)[C@]21C(=O)c1ccccc1C2=O")
+smiles(R"COc1c(OC)cc(cc1OC)C(=O)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"COc1c(OC)cc(/C=C/2\N3CC[C@H](CC3)C2=O)cc1OC")
+smiles(R"COc1c(OC)cc(C[C@@H]2N3CC[C@H](CC3)[C@@H]2O)cc1OC")
+smiles(R"COc1nc2cc3c(oc4ccccc34)cc2n2cccc12")
+smiles(R"CO[C@]1(N/C(=N)/N[C@@]1(OC)c1ccccc1)c1ccccc1")
+smiles(R"CO[C@]1(O[C@]21CCCC2)c1ccc(Cl)cc1")
+smiles(R"CO[C@@]1(O[C@@]21CCN(C)CC2)c1ccc(C)cc1")
+smiles(R"CO[C@]1(OC)[C@@]2(Cl)C3=CCCC=C3[C@]1(Cl)C(=C2Cl)Cl")
+smiles(R"CO[C@]1(OC)[C@]2(Cl)[C@@H]3CCCC[C@@H]3[C@@]1(Cl)C(=C2Cl)Cl")
+smiles(R"CO[C@]1(OC)[C@@]2(Cl)[C@@H]3C=CC=C[C@H]3[C@]1(Cl)C(=C2Cl)Cl")
+smiles(R"CO[C@]1(OC)[C@@]2(Cl)[C@H]3[C@@H]4[C@@]5(OC(=O)C)[C@@H]6[C@H]([C@]3(OC(=O)C)C5=O)[C@@]2(Cl)[C@]6(Cl)[C@]14Cl")
+smiles(R"CO[C@]1(OC)[C@@]2(Cl)[C@H]3COC[C@@H]3[C@]1(Cl)C(=C2Cl)Cl")
+smiles(R"CO[C@@]1(OC)[C@]2(Cl)[C@H]3C(=O)[C@@H]4[C@@H]5C(=O)[C@H]3[C@@]1(Cl)[C@]5(Cl)[C@]24Cl")
+smiles(R"CO[C@@]1(OC)[C@@H]2C=C[C@H]1[C@H]1[C@@H]2[C@@H]2[C@H]1[C@@H]1C=C[C@H]2C1(OC)OC")
+smiles(R"COC[C@]1(COC)CCN(CC1)[C@H]1C[C@@H](O[C@@H](C)[C@H]1O)O[C@H]1C[C@@](O)(Cc2c1c(O)c1c(c2O)C(=O)c2cccc(OC)c2C1=O)C(=O)C")
+smiles(R"COCCc1nnn(C)n1")
+smiles(R"COCCC[Ti]12345678(Cl)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81")
+smiles(R"COC[C@H]1C(=O)c2cc3OCOc3cc2[C@@]21C=C[C@]1(OCCO1)C=C2")
+smiles(R"COCCN(CCOC)C(=O)c1ccc2c(no[n+]2[O-])c1")
+smiles(R"COCCN(CCOC)C(=O)c1ccc2c(NO[N+]2[O-])c1")
+smiles(R"COCCN[C@@H]1CC[C@@]2(SCCS2)c2[nH]c3ccccc3c12")
+smiles(R"COCCNC(=O)c1ccc2c(no[n+]2[O-])c1")
+smiles(R"COCCNC(=O)c1ccc2c(NO[N+]2[O-])c1")
+smiles(R"COCCN(C(=O)c1ccccc1)[C@@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12")
+smiles(R"COCCN(C(=O)C)[C@@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12")
+smiles(R"COCC(=O)[C@@H](C(=O)C)[C@@H](c1ccc2OCOc2c1)[C@H](C(=O)C)C(=O)COC")
+smiles(R"COCC(=O)[C@@H](C(=O)C)[C@@H](c1ccc(cc1)N(C)C)[C@H](C(=O)C)C(=O)COC")
+smiles(R"COCC(=O)[C@H](C(=O)C)[C@@H](c1ccccn1)[C@@H](C(=O)C)C(=O)COC")
+smiles(R"COCC(=O)[C@H](C(=O)C)[C@@H](c1ccc(OC)cc1)[C@@H](C(=O)C)C(=O)COC")
+smiles(R"COCC(=O)[C@@H](C(=O)C)[C@@H](c1ccncc1)[C@H](C(=O)C)C(=O)COC")
+smiles(R"COC(F)(F)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CO[C@H]1CC[C@@]2(CC1)CN(O)[C@@]1(CC[C@@H](OC)C=C1)/C/2=N\O")
+smiles(R"CO[C@H]1CCC[C@@]2(CN/C(=N)/NC2)C(=O)OC1")
+smiles(R"CO[C@@H]1CCCC/C(=N\NC(=O)N)/CCCC1")
+smiles(R"CO[C@@H]1CC[C@@H]2C[C@@]3(OCCO3)CC[C@]2(C)[C@@H]1O")
+smiles(R"CO[C@H]1CC[C@H](CC1)/C(=C/[C@H]1CC[C@@H](CC1)N(C)C)/C#N")
+smiles(R"CO[C@@H]1CC[C@@H](CC1)/C(=C/[C@H]1CC[C@H](CC1)NC(=O)C)/C#N")
+smiles(R"CO[C@H]1CC[C@@H](CC1)/C(=C/[C@@H]1CC[C@@H](OC)[C@H](OC)C1)/C#N")
+smiles(R"CO[C@@H]1CC[C@H](CC1)/C=C(\C#N)/[C@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"CO[C@H]1CC[C@@H](CC1)/C=C(\C#N)/[C@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"CO[C@H]1CC[C@@H](CC1)/C=C(\C#N)/[C@@H]1CC[C@H](C)CC1")
+smiles(R"CO[C@@H]1CC[C@@H](CC1)/C=C(\C#N)/[C@@H]1CC[C@@H](OC)CC1")
+smiles(R"CO[C@H]1CC[C@@H](CC1)[C@@H]1CCCC[C@@]1(O)CC(=O)OC")
+smiles(R"CO[C@H]1CC[C@@H](CC1)[C@](O)(C(=O)O)C1CCCCC1")
+smiles(R"CO[C@@H]1CC[C@@H](CC1)NC(=O)N(N=O)[C@H]1CC[C@H](OC)CC1")
+smiles(R"CO[C@@H]1CC[C@@H](C=O)CC1")
+smiles(R"CO[C@@H]1CC[C@@H](OC)[C@@H](C1)[C@]1(OC(=O)c2ccccc12)[C@@H]1C[C@H](OC)CC[C@H]1OC")
+smiles(R"CO[C@H]1C[C@@H](O)O[C@H]1[C@H](NC(=O)C)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"CO[C@H]1CCN(CC1)[C@H]1C[C@H](O[C@@H](C)[C@H]1O)O[C@@H]1C[C@@](O)(Cc2c1c(O)c1c(c2O)C(=O)c2cccc(OC)c2C1=O)C(=O)CO")
+smiles(R"CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@H](O)[C@H](C)[C@H](O)[C@H](C)[C@H](OC(=O)C)[C@H]1C)C)cc(N1CC[C@@H](C)CC1)c4c3C2=O")
+smiles(R"CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@H](O)[C@H](C)[C@H](O)[C@H](C)[C@H](OC(=O)C)[C@H]1C)C)c(CN1CC[C@H](C)CC1)c(O)c4c3C2=O")
+smiles(R"CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@H](O)[C@H](C)[C@H](O)[C@H](C)[C@H](OC(=O)C)[C@H]1C)C)c(/C=N/N1CC[C@H](CC1)N1CCCCC1)c(O)c4c3C2=O")
+smiles(R"CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@@H](O)[C@@H](C)[C@@H](O)[C@H](C)[C@@H](OC(=O)C)[C@@H]1C)C)c(/C=N/N(C)[C@]15C[C@@H]6C[C@@H](C[C@@H](C6)C5)C1)c(O)c4c3C2=O")
+smiles(R"CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@@H](O)[C@@H](C)[C@@H](O)[C@H](C)[C@@H](OC(=O)C)[C@@H]1C)C)c(/C=N/N(Cc1ccccc1)[C@]15C[C@@H]6C[C@@H](C[C@@H](C6)C5)C1)c(O)c4c3C2=O")
+smiles(R"CO[C@@H]1C=CO[C@]2(C)Oc3c(C)c(O)c4c(O)c(NC(=O)C(=CC=C[C@@H](C)[C@H](O)[C@H](C)[C@H](O)[C@H](C)[C@H](OC(=O)C)[C@H]1C)C)cc(OCC(=O)N1CC[C@](O)(CC1)Cc1ccccc1)c4c3C2=O")
+smiles(R"CO[C@@H]1[C@H]2O[C@@H](O[C@@H]2[C@@H](OC)[C@H]2[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12)c1ccccc1")
+smiles(R"CO[C@@H]1[C@H](Cl)C[C@@H](C[C@H]1Cl)/C(=C/C1CCCCC1)/C(=O)O")
+smiles(R"CO[C@@H]1[C@H](CN[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)O[C@@H]2OC(C)(C)O[C@H]12")
+smiles(R"CO[C@H]1[C@@H](OC)[C@H](OC)[C@H](OC)[C@@H](OC)[C@H]1OC")
+smiles(R"CO[C@@H]1O[C@@H]2CO[C@@](C)(O[C@@H]2[C@@H](O)[C@H]1N[Pt@@](Cl)(Cl)N[C@H]1[C@H](OC)O[C@@H]2CO[C@](C)(O[C@@H]2[C@H]1O)c1ccccc1)c1ccccc1")
+smiles(R"CO[C@@H](C)C[S@@](=O)(=O)C[C@@H](C)OC")
+smiles(R"COC(=N)c1nnn(n1)c1ccccc1")
+smiles(R"COC(=O)[C@]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(C(=O)OC)C6=C12")
+smiles(R"COC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C6[C@-]7(Cl)C8(=C12)C(=O)OC")
+smiles(R"COC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C6[C@-]7(Cl)C8(=C12)C(=O)OC")
+smiles(R"COC(=O)[C@@]12CC=C3O[C@H]4O[C@@]5(CCCCC5)O[C@H]4[C@H]3[C@H]2C(=O)C=CC1=O")
+smiles(R"COC(=O)[C@]12CC=CC[C@]2(CC=CC1)C(=O)OC")
+smiles(R"COC(=O)[C@@]12C[C@@H](C[C@]3(CC)CO[C@@]4(CCCCC4)O3)C(=O)N1CCc1c3ccccc3[nH]c21")
+smiles(R"COC(=O)[C@@]12C[C@@H](C[C@@]3(CC)CO[C@]4(CCCCC4)O3)C(=S)N1CCc1c3ccccc3[nH]c21")
+smiles(R"COC(=O)[C@@]12C[C@H](CC[C@@H]2[C@]23COC(=O)[C@@H]3C(C)(C)[C@@]3(OCCO3)CC2)[C@H](C)[C@H]1O")
+smiles(R"COC(=O)[C@@]12[C@@H]3[C@@H]4[C@@]2(C(=O)N(C(C)C)C(C)C)[C@@H]2[C@H]1[C@@]3(C(=O)N(C(C)C)C(C)C)[C@]42C(=O)OC")
+smiles(R"COC(=O)[C@@]12[C@H]3[C@H]4[C@@H]1[C@H]1[C@@H]2[C@@H]3[C@@]41C(=O)N(C(C)C)C(C)C")
+smiles(R"COC(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)NC(C)(C)CC(=O)O")
+smiles(R"COC(=O)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)OC(C)(C)C")
+smiles(R"COC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)O")
+smiles(R"COC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42I")
+smiles(R"COC(=O)[C@]12[C@H]3O[C@H]([C@H]4O[C@@H]34)[C@]2(C(=O)OC)[C@@H]2O[C@H]1[C@@H]1O[C@H]21")
+smiles(R"COC(=O)[C@]12[C@H](C)C=C3O[C@H]4O[C@@]5(CCCCC5)O[C@H]4[C@H]3[C@H]2C(=O)C=CC1=O")
+smiles(R"COC(=O)[C@]12[C@H](COC(=O)C)C=C3O[C@H]4O[C@@]5(CCCCC5)O[C@H]4[C@H]3[C@H]2C(=O)C=CC1=O")
+smiles(R"COC(=O)[C@@]12C(=O)NC(=O)[C@]1(C(=O)OC)[C@@]2(C)C")
+smiles(R"COC(=O)[C@]12OC[C@]34[C@@H](OC(=O)[C@H](OC(=O)/C=C(/C)\C(C)C)[C@H]24)C[C@@H]2C(=C(OC(=O)CC(=O)OC4=C(C)[C@H]5C[C@@H]6OC(=O)[C@H](OC(=O)/C=C(\C)/C(C)C)[C@@H]7[C@]8(OC[C@@]67[C@@H]([C@@H](O)[C@@H]8O)[C@@]5(C)CC4=O)C(=O)OC)C(=O)C[C@]2(C)[C@@H]3[C@@H](O)[C@@H]1O)C")
+smiles(R"COC(=O)[C@]1(Br)C[C@@]21c1ccccc1c1ccccc21")
+smiles(R"COC(=O)[C@]1(C)C[C@@]21c1ccccc1C(=O)c1ccccc21")
+smiles(R"COC(=O)c1ccc2cc1nc1c(C#N)c[nH]c(=S)n21")
+smiles(R"COC(=O)c1ccc2c(no[n+]2[O-])c1")
+smiles(R"COC(=O)c1ccc2c(NO[N+]2[O-])c1")
+smiles(R"COC(=O)c1ccc2n[se]nc2c1")
+smiles(R"COC(=O)c1cccc2c3cccc(C(=O)OC)c3c12")
+smiles(R"COC(=O)c1cccc2[C@H]3CC[C@@H](c12)c1c(cccc31)C(=O)OC")
+smiles(R"COC(=O)c1ccc(cc1)[C@@H]1CC[C@H](CC1)OC(c1ccccc1)c1ccccc1")
+smiles(R"COC(=O)C1=CCCCC[C@H](N2C[C@H]3O[C@@H]2O3)[C@@H]1C(=O)OC")
+smiles(R"COC(=O)c1cc(cc(Cl)c1OC)C(=CC[C@]12C[C@@H]3C[C@@H](C[C@H](C3)C2)C1)c1cc(Cl)c(OC)c(c1)C(=O)OC")
+smiles(R"COC(=O)c1cc(C(=O)OC)c(C/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/C(=O)Nc2cccc(c2)C(F)(F)F)nc1C/C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C(=O)Nc1cccc(c1)C(F)(F)F")
+smiles(R"COC(=O)c1cc(C(=O)OC)c(C/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/C(=O)Nc2cccc(c2)C(F)(F)F)nc1C/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C(=O)Nc1cccc(c1)C(F)(F)F")
+smiles(R"COC(=O)c1cc(C(=O)OC)c(CC(=O)C(=O)N[C@@H]2[C@@H]3C[C@H]4C[C@@H](C3)C[C@@H]2C4)nc1CC(=O)C(=O)N[C@H]1[C@@H]2C[C@H]3C[C@@H](C2)C[C@@H]1C3")
+smiles(R"COC(=O)C1=C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"COC(=O)c1c(C(=O)OC)c2c3ccccc3n(C)c2c2n(C)c3ccccc3c12")
+smiles(R"COC(=O)C1=C(C(=O)OC)[C@]2([C@H]3C=CC=CN13)c1ccccc1c1ccccc21")
+smiles(R"COC(=O)C1=C(C(=O)OC)[C@@]2([C@@H]3C=CC=NN13)c1ccccc1c1ccccc21")
+smiles(R"COC(=O)C1=C(C(=O)OC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl")
+smiles(R"COC(=O)C1=C(C(=O)OC)[C@@]2(C)O[C@@H]1C(=O)[C@@]12CC1")
+smiles(R"COC(=O)C1=C(C(=O)OC)[C@]2(O)c3ccccc3[C@H]1c1ccccc21")
+smiles(R"COC(=O)C1=C(C(=O)OC)[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"COC(=O)C1=C(C(=O)OC)[C@H]2[C@H]3O[C@H]3[C@@H]1[C@]2(c1ccccc1)c1ccccc1")
+smiles(R"COC(=O)[C@@]1(C)COP(=O)(OC1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"COC(=O)[C@@]1(C#N)C(C)(C)N=C(c2ccccc2)[C@@]21CCCCC2")
+smiles(R"COC(=O)c1cn(c(=O)cc1C(=O)OC)c1ccc2nn(C)nc2c1")
+smiles(R"COC(=O)c1c[nH]n2c1n[n+]([O-])c1ccccc21")
+smiles(R"COC(=O)c1cnn2c1n[n+]([O-])c1ccccc21")
+smiles(R"COC(=O)C1(C(=O)OC)[C@@H]2[C@@H](Cl)[C@@H]3[C@H]([C@H]12)C3(C(=O)OC)C(=O)OC")
+smiles(R"COC(=O)C1=N/C(=N)/N=C(C(=O)OC)[C@]1(CC)C(=O)c1ccccc1")
+smiles(R"COC(=O)C1=N/C(=N)/N=C(C(=O)OC)[C@]1(C)C(=O)c1ccccc1")
+smiles(R"COC(=O)C1=N/C(=N)/N=C(C(=O)OC)[C@]1(C)C(=O)c1ccc(Cl)cc1")
+smiles(R"COC(=O)C1=N/C(=N)/N=C(C(=O)OC)[C@@]21C(=O)Cc1ccccc21")
+smiles(R"COC(=O)C1=NN[C@]2([C@@H]1C(=O)OC)c1ccccc1Sc1ccccc21")
+smiles(R"COC(=O)c1n[nH]c(C)c1/N=N/N1CC[C@@H](CC1)C(=O)N")
+smiles(R"COC(=O)c1nnn(n1)c1ccccc1")
+smiles(R"COC(=O)C[C@@]1(C)[C@H](O)[C@@H]2O[C@@](C)(C)O[C@@H]2[C@H]1O")
+smiles(R"COC(=O)CCC[C@H]1CC[C@@H](CCCC(=O)OC)CC1")
+smiles(R"COC(=O)CCC[C@H]1CC/C(=N/Nc2ccccc2)/CC1")
+smiles(R"COC(=O)CCC[C@@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"COC(=O)CCC[C@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"COC(=O)CC[C@H]1CC[C@H](CC1)C[C@@H]1CC[C@H](CC1)CCC(=O)OC")
+smiles(R"COC(=O)CC[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"COC(=O)CC[N+]12CN3CN(CN(C3)C2)C1")
+smiles(R"COC(OC)CNC(=O)c1ccc2c(no[n+]2[O-])c1")
+smiles(R"COC(OC)CNC(=O)c1ccc2c(NO[N+]2[O-])c1")
+smiles(R"COC(OC)CN(C(=O)c1ccccc1)[C@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12")
+smiles(R"COC(OC)CN(C(=O)C)[C@@H]1CC[C@]2(SCCS2)c2[nH]c3ccccc3c12")
+smiles(R"COC(=O)[C@H]1CC[C@]2(OCCO2)C1")
+smiles(R"COC(=O)[C@H]1CCC[C@]2(OCCO2)C1")
+smiles(R"COC(=O)[C@H]1CCCCCCCCCC[C@]21SCCCS2")
+smiles(R"COC(=O)[C@@H]1CC[C@H]2c3ccccc3[C@@H](C1)c1ccccc21")
+smiles(R"COC(=O)[C@H]1CC[C@H](CC1)N(C)S(=O)(=O)c1ccc(C)cc1")
+smiles(R"COC(=O)[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"COC(=O)[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"COC(=O)[C@@H]1CC(=O)C[C@H](CC(=O)C1)C(=O)OC")
+smiles(R"COC(=O)[C@H]1[C@@H]2C[S@@](=O)(=O)C[C@H]2[C@H]1C(=O)OC")
+smiles(R"COC(=O)[C@@H]1[C@H](c2ccccc2)[C@@H](C(=O)OC)[C@@H]1c1ccccc1")
+smiles(R"COC(=O)[C@H]1[C@@H](C(=O)OC)[C@@]1(c1ccccc1)c1ccccc1")
+smiles(R"COC(=O)[C@H]1[C@H](C(=O)OC)[C@]21C=Cc1ccccc1C=C2")
+smiles(R"COC(=O)[C@@H]1[C@H](C(=O)OC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Br)Br)Cl")
+smiles(R"COC(=O)[C@@H]1[C@@H](C(=O)OC)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@]2(Cl)Cl)Cl")
+smiles(R"COC(=O)[C@@H]1[C@@H](C(=O)OC)[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"COC(=O)[C@H]1[C@H](C(=O)OC)[C@@H](C(=O)OC)[C@H]1C(=O)OC")
+smiles(R"COC(=O)[C@H]1[C@H](C(=O)OC)[C@H](C(=O)OC)[C@@H]1C(=O)OC")
+smiles(R"COC(=O)[C@@H]1C(=O)[C@H](C(=O)OC)[C@]2(C)[C@@H](C(=O)OC)C(=O)[C@H](C(=O)OC)[C@]12C")
+smiles(R"COC(=O)[C@@H]1C(=O)[C@@H](C(=O)OC)[C@H]2CCC[C@H]3CCC[C@H]1N23")
+smiles(R"COC(=O)[C@@H]1O[C@@]2(CCCC2)O[C@H]1C(=O)OC")
+smiles(R"COC(=O)[C@@H]1OC[C@@]2(CO1)CO[C@@H](OC2)C(=O)OC")
+smiles(R"COC(=O)[C@@H]1O[C@@](C)(C)O[C@H]1C(=O)OC")
+smiles(R"COC(=O)[C@H](c1ccccc1)[C@]1(O)CCN(CC1)C[C@H]1COc2ccccc2O1")
+smiles(R"COC(=O)[C@@H](N[Pd@](Cl)(Cl)N[C@@H](C(=O)OC)c1ccccc1)c1ccccc1")
+smiles(R"COC(=O)[C@@H](N[Pt@](Cl)(Cl)N[C@@H](C(=O)OC)c1ccccc1)c1ccccc1")
+smiles(R"COC(=O)C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"COC(=O)C(=O)c1c2c3[nH]c4ccccc4c3ccn2c2ccccc12")
+smiles(R"COC(=O)N1CC(=O)[C@@H](C1)C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"COC(=O)N1[C@@H]2c3ccccc3[C@H](N1C(=O)OC)c1ccccc21")
+smiles(R"COC(=O)N/N=C\1/C(C)(C)/C(=N/NC(=O)OC)/C1(C)C")
+smiles(R"COC(=S)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CON1C(=O)[C@@]2(CCCCC2)C(=O)[C@]21CCCC=C2")
+smiles(R"CO/N=C(\C=C\c1ccccc1)/C=C/c1ccccc1")
+smiles(R"CO[Ni]12(OC)([O+]=C(C)[C@@H](Cl)C(=[O+]1)C)[O+]=C(C)[C@@H](Cl)C(=[O+]2)C")
+smiles(R"COP(OC)[C@@H]1CC[C@@H](C)CC1")
+smiles(R"COP(=O)(OC)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"COS(=O)(=O)O")
+smiles(R"CP1CC[C@](O)(CC1)C(C)(C)C")
+smiles(R"CP(=S)(C)[C@@H]1CC[C@H](CC1)C(C)(C)C")
+smiles(R"CSc1c2cccnc2n2c(c1C#N)n(C)c1ccccc21")
+smiles(R"CSc1cc2c3cccc[n+]3[Co+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24")
+smiles(R"CSc1cc2c3cccc[n+]3[Co+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51")
+smiles(R"CSc1cc2c3cccc[n+]3[Cu+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24")
+smiles(R"CSc1cc2c3cccc[n+]3[Cu+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51")
+smiles(R"CSc1cc2c3cccc[n+]3[Cu]3(Br)(Br)[n+]2c(c1)c1cccc[n+]31")
+smiles(R"CSc1cc2c3cccc[n+]3[Mn+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24")
+smiles(R"CSc1cc2c3cccc[n+]3[Mn+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51")
+smiles(R"CSc1cc2c3cccc[n+]3[Ni+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24")
+smiles(R"CSc1cc2c3cccc[n+]3[Ni+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51")
+smiles(R"CSc1cc2c3cccc[n+]3[Zn+2]345([n+]6ccccc6c6cc(SC)cc(=c7cccc[n+]37)[n+]56)[n+]3ccccc3=c(c1)[n+]24")
+smiles(R"CSc1cc2c3cccc[n+]3[Zn+2]345([n+]6ccccc6c(c1)[n+]24)[n+]1ccccc1c1cc(SC)cc(c2cccc[n+]32)[n+]51")
+smiles(R"CSc1ccc(cc1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"CSc1cnn(CCC#N)c(=O)n1")
+smiles(R"CSc1nc2cn[nH]c2c(n1)N(C)C")
+smiles(R"CSc1nc2=NC=N[S@@](=O)(=c2c(N)n1)O")
+smiles(R"CSc1nnn(n1)C(C)(C)C")
+smiles(R"CSc1sc(C#N)c2nc3c4cccc5cccc(c3nc12)c45")
+smiles(R"CSC[C@]12CCCC=C2C[C@@]2(OCCO2)CC1")
+smiles(R"C[S+](C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1") # smiles(R"C[SH+][Pt@@+]1(P234N5CCN2CC[N@@+]14CCN3CC5)P(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"CSC[C@H]1CCCC[C@@]21OCCO2")
+smiles(R"CS[C@H]1NN[C@]2(C(=O)N1)c1ccccc1c1ccccc21")
+smiles(R"CSC(=S)C[C@H](O)[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"CSC(=S)S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"C[SH+][Pt@@+]1(P234N5CCN2CC[N@@+]14CCN3CC5)P(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"C[Si]1(C)O[Si](C)(C)[C@@]23C4=C5C6=C2[Fe]27893456C3=C8[C@@]19C7=C23")
+smiles(R"C[Si@@]1(C)O[Si](C)(C)[C@@]23C4=C5C6=C2[Fe]27893456C3=C8[C@@]9(C7=C23)[Si](C)(C)O1")
+smiles(R"C[Si](C)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"C[Si](C)(C)C12#C3([Si](C)(C)C)[Ni]45671([C@H]1C6=C5C4=C71)[Ni]145623[C@H]2C5=C4C1=C62")
+smiles(R"C[Si](C)(C)CC[Si@]12OCCN(CCO1)CC(C)(C)O2")
+smiles(R"C[Si](C)(C)CC[Si@@]12OCCN([C@H]3CCCC[C@H]3O1)[C@H]1CCCC[C@H]1O2")
+smiles(R"C[Si@@H]1O[Si@H](C)[C@]23C4=C5C6=C2[Fe]27893456C3=C8[C@@]9([Si@H](C)O[Si@@H](C)[C@@]45C6=C8C9=C4[Fe]4%10%11%125689C5=C%11[C@]1%12C%10=C45)C7=C23")
+smiles(R"C[Sn](C)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"CS(=O)C")
+smiles(R"CS(=O)(=O)c1ccc2nnnn2n1")
+smiles(R"CS(=O)(=O)c1ccc(cc1)C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"CS(=O)(=O)N[C@]12CC[C@H](c3ccccc13)c1ccccc21")
+smiles(R"CS(=O)(=O)O")
+smiles(R"CS(=O)(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"CS(=O)(=O)OC[C@H]1CCCCCCCCCC[C@]21SCCCS2")
+smiles(R"CS(=O)(=O)OC[C@H]1C[C@@H](COS(=O)(=O)C)C[C@@H](COS(=O)(=O)C)C1")
+smiles(R"CS(=O)(=O)OC[C@H]1[C@H]2c3ccccc3[C@@H]([C@H]1COS(=O)(=O)C)c1ccccc21")
+smiles(R"CS(=O)(=O)OC[C@H]1O[C@@H](Cc2ccccc2)O[C@@H]1COS(=O)(=O)C")
+smiles(R"CS(=O)(=O)OC[C@H]1O[C@@H](O[C@@H]1COS(=O)(=O)C)C(Br)(Br)Br")
+smiles(R"CS(=O)(=O)OC[C@@H]1O[C@H](O[C@H]1COS(=O)(=O)C)C(Cl)(Cl)Cl")
+smiles(R"CS(=O)(=O)OCCN1CC[C@@]2(CC1)SS[C@]1(CCN(CCOS(=O)(=O)C)CC1)S2")
+smiles(R"CS(=O)(=O)O[C@@H]1CC[C@H](CC1)OS(=O)(=O)C")
+smiles(R"CS(=O)(=O)O[C@H]1CC[C@@H](CC1)OS(=O)(=O)C")
+smiles(R"C[Zr]12345678(I)(C9=C3C2=C1[C@H]49)C1=C6C7=C5[C@@H]81")
+smiles(R"[F-]B(F)(F)F")
+smiles(R"F[B-](F)(F)F")
+smiles(R"FC1=[C-]([Au+][NH+]2P([Au+]P(c3ccccc3)(c3ccccc3)[NH+]([Au+][C-]3=C(F)C(=C(F)C(=C3F)F)F)P([Au+]P2(c2ccccc2)c2ccccc2)(c2ccccc2)c2ccccc2)(c2ccccc2)c2ccccc2)C(=C(F)C(=C1F)F)F")
+smiles(R"Fc1ccc(cc1)[C@@]1(C)[C@H]2C(=O)NC(=O)[C@@H]1C(=O)NC2=O")
+smiles(R"Fc1ccc(cc1)c1[nH]c(cc1c1ccncc1)[C@H]1CC[NH+](CC1)C[C@H]1[NH2+]C[C@H](O)C1")
+smiles(R"Fc1cccc(c1)c1nnn(C)n1")
+smiles(R"Fc1ccccc1c1sc2nnc(n2n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Fc1ccccc1/C=c\1/sc2nc3ccccc3n2c1=O")
+smiles(R"Fc1ccc(cc1)[C@@](C)(CN1CC[C@]2(CC1)N(CN(CC(C)C)C2=O)c1ccccc1)C1OCCO1")
+smiles(R"Fc1ccc(cc1)/C=C/C(=O)N1CC[C@@]2(CC1)N(CN(C)C2=O)c1ccccc1")
+smiles(R"Fc1ccc(cc1)C(C(=O)N[C@H]1CN2CC[C@@H]1CC2)c1ccc(F)cc1")
+smiles(R"Fc1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Fc1cccc(c1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Fc1ccc(cc1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Fc1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Fc1ccc(cc1)C(=O)CCCN1CC[C@]2(CC1)C[C@H](OC2=O)c1ccccc1")
+smiles(R"Fc1ccc(cc1)C(=O)C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Fc1ccc(cc1)C(=O)N[C@H]1CCN(CC1)C(=O)[C@H](C)Sc1ccc(Cl)cc1")
+smiles(R"Fc1ccc(cc1)CSc1nnc(n1C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Fc1ccc(cc1)N(CCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Fc1ccc(cc1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Fc1ccccc1NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Fc1ccc(cc1)NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Fc1ccc(cc1)O/C=C\1/N2CC[C@@H](CC2)C1=O")
+smiles(R"Fc1ccc(/C=C/C(=O)Nc2cccc(NC(=O)/C=C\c3ccc(F)cc3)n2)cc1")
+smiles(R"Fc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"Fc1cccc(/N=C/c2ccc(cc2)N2CC[C@@]3(CCCCC3)CC2)c1")
+smiles(R"Fc1ccc(F)c(/C=C/C(=O)N2CC[C@H](CC2)[C@@H](Cc2ccccc2)N(C)C(=O)C(C)C)c1")
+smiles(R"Fc1ccc(NCCNC(=O)[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)cc1")
+smiles(R"FC1=C(F)C(=C(F)C(=[C-]1[Au+][NH+]1P([Au+]P(c2ccccc2)(c2ccccc2)[NH+]([Au+][C-]2=C(F)C(=C(F)C(=C2F)F)F)P([Au+]P1(c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1)F)F")
+smiles(R"Fc1c(F)c(c(F)c(F)c1[C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82)[C@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82")
+smiles(R"Fc1c(F)c(F)c(c(F)c1F)[C@]1(O)[C@@H]2CC[C@H]1CC2")
+smiles(R"F[C@]1(C(F)(F)F)C(F)(F)[C@](F)(F)C(F)(F)[C@@](F)(C(F)(F)F)[C@@]1(F)F")
+smiles(R"Fc1cnc(nc1O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"F/C(=C(\F)/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)/C(F)(F)C(F)(F)C(F)(F)C(F)(F)C(F)(F)F")
+smiles(R"F/C(=C(\F)/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)/C(F)(F)C(F)(F)C(F)(F)C(F)(F)C(F)(F)F")
+smiles(R"FCCNC(=O)N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1")
+smiles(R"FCCNC(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"FCCNC(=O)N[C@H]1CC[C@@H](CC1)NC(=O)NCCF")
+smiles(R"FCCN(N=O)C(=O)N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1")
+smiles(R"FCCN(N=O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"FCCN(N=O)C(=O)N[C@@H]1CC[C@@H](CC)CC1")
+smiles(R"FC(F)(Cl)C(O)([C@@H]1CCC/C/1=N/N=C/1\CCC[C@H]1C(O)(C(F)(F)Cl)C(F)(F)Cl)C(F)(F)Cl")
+smiles(R"FC(F)([Co]12345(n6cccn6[BH+3][n+]6cccn16)C1=C3C4=C2C51)C(F)(F)F")
+smiles(R"FC(F)(F)c1ccc2[C@@H]3c4ccccc4[C@H](c2c1)c1ccccc31")
+smiles(R"FC(F)(F)c1cccc(c1)[C@@]1(O)CCN(CC1)[C@@H]1C[C@H]1c1ccccc1")
+smiles(R"FC(F)(F)c1ccc(cc1)[C@H]1ON=C(c2ccccc2)N1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"FC(F)(F)c1ccc(cc1)/C=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"FC(F)(F)c1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"FC(F)(F)c1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"FC(F)(F)C1=C([S+]2[Co]34(SC(=C([S+]4[Co]42(S1)SC(=C(S4)C(F)(F)F)C(F)(F)F)C(F)(F)F)C(F)(F)F)SC(=C(S3)C(F)(F)F)C(F)(F)F)C(F)(F)F")
+smiles(R"FC(F)(F)C1=C([S+]2[Fe]34(SC(=C([S+]4[Fe]42(S1)SC(=C(S4)C(F)(F)F)C(F)(F)F)C(F)(F)F)C(F)(F)F)SC(=C(S3)C(F)(F)F)C(F)(F)F)C(F)(F)F")
+smiles(R"FC(F)(F)c1nnn(n1)[Au]P(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"FC(F)(F)C(F)(F)/C(=N/Nc1ccccc1)/SS/C(=N/Nc1ccccc1)/C(F)(F)C(F)(F)F")
+smiles(R"FC(F)(F)[C@@H]1CC[C@@H](CC1)[C@@]1(O)[C@@H]2CC[C@H]1C=C2")
+smiles(R"FC(F)(F)/C(=N\Nc1ccccc1)/SS/C(=N\Nc1ccccc1)/C(F)(F)F")
+smiles(R"FC(F)(F)[Co]12345(n6cccn6[B+3]([n+]6[n-]ccc6)[n+]6cccn16)C1=C3C4=C2C51")
+smiles(R"FC(F)(F)[Co]12345(N6CCCN6[B+3]([n+]6[n-]ccc6)[n+]6cccn16)C1C4=C3C2=C51")
+smiles(R"FC(F)(F)[S@@](=O)(=[OH+])[O-]")
+smiles(R"FC(F)(F)[S@@](=O)(=[OH+])[O-]") # smiles(R"CC12=C3(C)[Ru+]456789%101(C1=C5C8(=C6C4=C71N)N)C2(C)C%10(=C39C)C") # smiles(R"CC12=C3(C)[Ru+]456789%101(C1=C7(N)C4=C6C8(=C51)N)C2(C)C%10(=C39C)C")
+smiles(R"FC(F)(F)[S@@](=O)(=[OH+])[O-]") # smiles(R"NC1=C(/N=N/c2ccc(cc2)[N+](=O)[O-])C(=N[S@](=O)(=N1)O)N") # smiles(R"NC1=N[S@](=O)(=NC(=C1/N=N/c1ccc(cc1)[N+](=O)[O-])N)O")
+smiles(R"FC(F)(F)S(=O)(=O)[O-]")
+smiles(R"FC(F)(F)S(=O)(=O)[O-]") # smiles(R"c1ccc(cc1)C1=C2C=CC3=C(c4ccccc4)C4=[N+]5C(=C(c6ccccc6)C6=CC=C7C(=C8C=CC1=[N+]8[Zn@@+2]5([NH+]67)[NH+]23)c1cc[n+](cc1)[Pt@@+2]([n+]1ccc(cc1)C1=C2C=CC3=[N+]2[Zn@@+2]25[NH+]6C1=CC=C6C(=C1C=CC(=[N+]51)C(=C1C=CC(=C3c3ccccc3)[NH+]21)c1ccccc1)c1ccccc1)([n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)[n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)C=C4")
+smiles(R"FC(F)(F)S(=O)(=O)[O-]") # smiles(R"c1ccc(cc1)C1=C2C=CC3=C(c4ccccc4)C4=[N+]5C(=C(c6ccccc6)C6=CC=C7C(=C8C=CC1=[N+]8[Zn@@+2]5([NH+]67)[NH+]23)c1cc[n+](cc1)[Pt+2]([n+]1ccc(cc1)C1=C2C=CC3=[N+]2[Zn@@+2]25[NH+]6C1=CC=C6C(=C1C=CC(=[N+]51)C(=C1C=CC(=C3c3ccccc3)[NH+]21)c1ccccc1)c1ccccc1)([n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)[n+]1ccc(cc1)C1=C2C=CC3=C(c5ccccc5)C5=[N+]6C(=C(c7ccccc7)C7=CC=C8C(=C9C=CC1=[N+]9[Zn@+2]6([NH+]23)[NH+]78)c1ccccc1)C=C5)C=C4")
+smiles(R"FC(F)Oc1ccccc1[C@H]1C(=C(C)NC(=C1C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C)C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"F[C@@H]1O[C@]1(F)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[F-]P(F)(F)(F)(F)F")
+smiles(R"F[P-](F)(F)(F)(F)F")
+smiles(R"FP(F)(F)(F)(F)F")
+smiles(R"FS(=O)(=O)[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"[Hg]([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"[I-]")
+smiles(R"I")
+smiles(R"IC")
+smiles(R"I[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"I[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"I[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(I)C6=C12")
+smiles(R"I[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(I)C6=C12")
+smiles(R"I[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Ic1ccc2c(c1)[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"Ic1ccccc1C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Ic1ccc(cc1)C(=O)C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"Ic1cccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"Ic1ccc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1")
+smiles(R"Ic1ccc(/C=N\NC(=S)N[C@@H]2CN3CC[C@@H]2CC3)cc1")
+smiles(R"Ic1cc(/C=N/NC(=S)N[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c(O)c(I)c1")
+smiles(R"I[C-]1C(=[O+][Ru+3]23([O+]=C1C)([O+]=C(C)[C-](I)C(=[O+]2)C)[O+]=C(C)[C-](I)C(=[O+]3)C)C")
+smiles(R"IC[C@@]1(C)CO[C@@](OC1)(C1CCCCC1)c1ccccc1")
+smiles(R"IC[C@@H]1O[C@H](CI)C[S@@](=O)(=O)C1")
+smiles(R"IC[C@@H]1OC(=O)C[C@]2(CC=CC[C@@]32OCCO3)C1")
+smiles(R"I[C@@H]1[C@@H](I)[C@@H]2C[C@H]1[C@@H]1[C@H]2[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)[C@@]2(Cl)Cl)Cl")
+smiles(R"IP1P2P(c3ccccc13)P(I)c1ccccc21")
+smiles(R"N")
+smiles(R"n1ccc(cc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"n1ccn(c1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"n1ccn(c1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14")
+smiles(R"N1=C[NH+]2[Cu+2]3456N7CCN3CN(CN5CCN4CN(C7)C2=N1)C1=NN=C[NH+]61")
+smiles(R"n1nc2sc1[SH+][Cu+2]1345[SH+]c6nnc(s6)N6CN3CCN1CN2CN4CCN5C6")
+smiles(R"n1nc2sc1[SH+][Ni+2]1345[SH+]c6nnc(s6)N6CN3CCN1CN2CN4CCN5C6")
+smiles(R"n1ncn(c1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14")
+smiles(R"[Na+]")
+smiles(R"[NaH]")
+smiles(R"NC12=C3C4=C5[Ru+]6789%10234(C1=C56N)C1(C)C9(=C8(C)C7(=C%101C)C)C")
+smiles(R"NC12=C3[Ru+]456789%102(C(=C14)C5=C36N)C1(C)C9(=C8(C)C7(=C%101C)C)C")
+smiles(R"N[C@]12CC[C@](c3ccccc13)(c1ccccc21)[N+](C)(C)C")
+smiles(R"N[C@@]12CC[C@@](c3ccccc13)(c1ccccc21)[N+](C)(C)C")
+smiles(R"N[C@@]12CC[C@@H](c3ccccc13)c1ccccc21")
+smiles(R"N[C@]12CC[C@](N)(c3ccccc13)c1ccccc21")
+smiles(R"N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Nc1c2nc3ccccc3n2c2nc3ccccc3nc2c1S(=O)(=O)c1ccccc1")
+smiles(R"NC1=c2nc(c3ccccc3)c(nc2=N[S@@](=O)(=N1)O)c1ccccc1")
+smiles(R"Nc1cc2c(nc3c4ccccc4ccc3[n+]2c2cccc3ccccc23)c2ccccc12")
+smiles(R"Nc1cc2c(nc3c4ccccc4c(N)cc3[n+]2c2cccc3ccccc23)c2ccccc12")
+smiles(R"Nc1ccc2c(c1)[C@@H](N1C[C@@H]3CC[C@@H](CC3)C1)c1ccccc21")
+smiles(R"Nc1ccc2C[C@@H]3c4ccccc4[C@H](Cc2c1)c1ccccc31")
+smiles(R"Nc1ccc2[nH]/c(=[S+]/[Pt@](Cl)(Cl)/[S+]=c\3/[nH]c4ccc(N)cc4s3)/sc2c1")
+smiles(R"Nc1ccc2n[se]nc2c1")
+smiles(R"Nc1ccc2nsnc2c1")
+smiles(R"Nc1cccc(c1)[C@]1(C)[C@@H]2C(=O)NC(=O)[C@H]1C(=O)NC2=O")
+smiles(R"Nc1ccc(cc1)C(=O)N/N=C/c1ccc(cc1Br)N1CC[C@]2(CCCCC2)CC1")
+smiles(R"Nc1ccc(cc1)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Nc1ccc(cc1)S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Nc1ccc(cc1)S(=O)(=O)N[C@@H]1CC[C@@H](CC1)NS(=O)(=O)c1ccc(N)cc1")
+smiles(R"Nc1ccc(cc1)S(=O)(=O)N[C@@H]1CC[C@H](CC1)NS(=O)(=O)c1ccc(N)cc1")
+smiles(R"N=C\1/C=C/C(=C(/c2ccc(N)cc2)\c2ccc(N)c(C)c2)/C=C1")
+smiles(R"N=C\1/C=C/C(=C(\c2ccc(N)cc2)/c2ccc(N)c(C)c2)/C=C1")
+smiles(R"Nc1ccccn1N")
+smiles(R"N=C\1/C=C/C(=N\Cc2ccc(N)cc2)/C=C1")
+smiles(R"N=c1ccn2c(n1)O[C@H]1[C@H](OC(=O)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)[C@@H](COC(=O)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)O[C@@H]21")
+smiles(R"N=c1ccn(CC(=O)N2CC[C@@]3(CC2)SS[C@]2(CCN(CC2)C(=O)Cn2ccc(=N)[nH]c2=O)S3)c(=O)[nH]1")
+smiles(R"N=c1ccn(c(=O)[nH]1)[C@H]1O[C@H](COC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[C@@H](O)[C@@H]1O")
+smiles(R"Nc1cnn2cnnc2c1Cl")
+smiles(R"Nc1cnn2nnnc2c1")
+smiles(R"Nc1cnn2nnnc2c1Cl")
+smiles(R"Nc1c(/N=N/c2ccc(cc2)c2ccc(cc2)/N=N/c2cc(c3ccccc3c2N)[S@](=O)(=[OH+])[O-])cc(c2ccccc12)[S@@](=O)(=[OH+])[O-]")
+smiles(R"Nc1c(/N=N/c2ccc(cc2)[S@@](=O)(=O)c2ccc(/N=N/c3c4ccc(cc4cc(c3N)S(=O)(=O)O)S(=O)(=O)O)cc2)c2ccc(cc2cc1S(=O)(=O)O)S(=O)(=O)O")
+smiles(R"Nc1c(/N=N/c2ccc(cc2)[S@@](=O)(=O)c2ccc(/N=N/c3cc(c4cccc(c4c3N)S(=O)(=O)O)S(=O)(=O)O)cc2)cc(c2cccc(c12)S(=O)(=O)O)S(=O)(=O)O")
+smiles(R"Nc1nc(Cl)c(N)c(n1)N[C@@]12C[C@H]3C[C@@H](C[C@H](C3)C2)C1")
+smiles(R"N=C1N=C(CS(=O)C)C(=N1)CS(=O)C")
+smiles(R"Nc1nc(N)c2c(ccc3nc(c4ccccc4)c(nc23)c2ccccc2)n1")
+smiles(R"Nc1nc(N)c2c(ccc3nc(C)c(C)nc23)n1")
+smiles(R"Nc1nc(N)c2=C(N)[N+](=O)[C-]3C=CC=CC3=c2n1")
+smiles(R"NC1NC(N)C2=C(N)[N+](=O)[C-]3C=CC=CC3=C2N1")
+smiles(R"Nc1nc(nc2nc3c4cccc5cccc(c3nc12)c45)c1ccccc1")
+smiles(R"Nc1ncnc2=NC=N[S@@](=O)(=c12)O")
+smiles(R"Nc1nc(N)c2nc(S[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(N)nc2n1")
+smiles(R"N[C@@]1(N[C@](N)(C(F)(F)F)C(F)(F)[C@](F)(F)C1(F)F)C(F)(F)F")
+smiles(R"N=C1NC(=N)N(c2ccc(OC[C@@H]3CC[C@H](CC3)COc3ccc(cc3)S(=O)(=O)F)c(Cl)c2)C(C)(C)N1")
+smiles(R"N=C\1/N[C@](O)(c2ccccc2)[C@](O)(N1)c1ccccc1")
+smiles(R"Nc1nc(O)c2c(n1)n(c[n+]2[Cu@@+2]1(NCCN1)[n+]1cn([C@@H]2O[C@@H](COP(=[OH+])([O-])[O-])[C@H](O)[C@@H]2O)c2nc(N)nc(O)c12)[C@@H]1O[C@@H](COP(=[OH+])([O-])[O-])[C@H](O)[C@@H]1O")
+smiles(R"Nc1nc(O)c2c(n1)n(c[n+]2[Cu@+2]1(NCCN1)[n+]1cn([C@@H]2O[C@@H](COP(=[OH+])([O-])[O-])[C@H](O)[C@@H]2O)c2nc(N)nc(O)c12)[C@@H]1O[C@@H](COP(=[OH+])([O-])[O-])[C@H](O)[C@@H]1O")
+smiles(R"N=C\1/NC(=O)[C@@H](C(=O)N1)c1ccccc1")
+smiles(R"Nc1nc(S)nc(c1)C(=O)N[C@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3")
+smiles(R"N=c1[nH]c2n(c(=O)nc3sc(Nc4ccccc4)nc23)c2sc(Nc3ccccc3)nc12")
+smiles(R"N=c1[nH]c2n(c(=S)nc3sc(Nc4ccccc4)nc23)c2sc(Nc3ccccc3)nc12")
+smiles(R"N=c1[nH]c2[nH]c[n+]3c2c(=[S+][Hg]3[C@@]23C4=C5C6=C2[Fe]27893456[C@@H]3C8=C7C2=C93)[nH]1")
+smiles(R"N=c1[nH]c(=N)c2c([nH]o[n+]2[O-])n1")
+smiles(R"N=c1[nH]n2c(nnc(c3ccccc3)c2c2ccccc2)n1")
+smiles(R"N=c1[nH]nc2c3ccccc3n3c4ccccc4n(C)c3c12")
+smiles(R"N=c1[nH][nH]/c(=S\2/[Pt@@](Cl)(Cl)/S(=c\3/[nH][nH]c(=N)s3)/[Pt@@]2(Cl)Cl)/s1")
+smiles(R"N=c1[nH]onc1c1n(O)onc1c1no[nH]c1=N")
+smiles(R"N=C\1/S[C@]23CCCN3C(=O)[C@@]3(CCCN3C2=O)S1")
+smiles(R"N=c1sc2c([nH]1)c1cccc3cccc2c13")
+smiles(R"NC1=[S+][Fe+2]234([S+]=C(N)c5cccc(c6cccc[n+]26)[n+]45)[n+]2ccccc2c2cccc1[n+]32")
+smiles(R"NC1=[S+][Fe+2]234([S+]=C(N)c5cccc(=c6cccc[n+]36)[n+]45)[n+]3ccccc3c3cccc1[n+]23")
+smiles(R"NC1=[S+][Fe]234([S+]=C(N)c5cccc(c6cccc[n+]26)[n+]35)[n+]2cccc(c2)c2cccc1[n+]42")
+smiles(R"N#CBn1ccc(cc1)C(=O)NNCc1ccccc1")
+smiles(R"N#CBn1ccc(cc1)C(=O)NNCc1cccc(c1)C(F)(F)F")
+smiles(R"N#CBn1ccc(cc1)C(=O)NNCc1ccc(F)cc1")
+smiles(R"N#CBn1ccc(cc1)C(=O)NNCc1ccc(OC)c(OC)c1")
+smiles(R"N#CBn1cccc(c1)C(=O)NN[C@H](C)c1ccccc1")
+smiles(R"N#CBn1ccc(cc1)C(=O)NN[C@H](C)c1ccccc1F")
+smiles(R"N#CBn1ccc(cc1)C(=O)NN[C@H](C)c1cccc(F)c1")
+smiles(R"N#CBn1ccc(cc1)C(=O)NN[C@H](C)c1ccc(Cl)cc1Cl")
+smiles(R"N#CBn1ccc(cc1)C(=O)NN[C@H](C)c1ccc(OC)cc1OC")
+smiles(R"N#C[C@]12CCCC[C@H]2CC[C@]2(OCCO2)C1")
+smiles(R"N#C[C@]12CC[C@H](c3ccccc13)c1ccccc21")
+smiles(R"N#C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"NC[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"N#C[C@@]12[C@H]3[C@]4([C@@H]1[C@@]1(C(=O)C(C)(C)C)[C@@H]2[C@]3(C(=O)C(C)(C)C)[C@@]41C(=O)N(C)C(C)(C)C)C(=O)C(C)(C)C")
+smiles(R"N#C[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)N(C)C(C)(C)C")
+smiles(R"N#C[C@@]12[C@@H]3[C@@H]4[C@H]2[C@@H]2[C@H]1[C@H]3[C@]42C(=O)N(C)C(C)C")
+smiles(R"N#C[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)N(C(C)C)C(C)C")
+smiles(R"NC[C@@]12[C@@H]3[C@H]4[C@H]5[C@@H]3[C@@H]1[C@H]5[C@@H]24")
+smiles(R"N#C[C@]12[C@H]3C(=O)C=CC(=O)[C@H]3[C@H](c3ccccc13)c1ccccc21")
+smiles(R"N#C[C@]12C(=O)N(C)C(=O)[C@@]1(C#N)[C@]12CCCC1")
+smiles(R"N#C[C@]12C(=O)N(C)C(=O)[C@]2(C#N)[C@@]1(C)C")
+smiles(R"N#C[C@]12C(=O)NC(=O)[C@]2(C#N)[C@]1(C)C")
+smiles(R"N#C[C@]12C(=O)NC(=O)[C@]2(C#N)[C@]21CCCC2")
+smiles(R"N#C[C@]12C(=O)NC(=O)[C@]2(C#N)[C@]21CCCCC2")
+smiles(R"N#Cc1c2c3ccccc3ccn2c2nc3ccccc3nc12")
+smiles(R"N#C[C@]1(c2oc3ccccc3n2)C(=O)C(=O)N([C@H]2[C@H]3C[C@@H]4C[C@H](C3)C[C@H]2C4)C(=O)C1=O")
+smiles(R"N#Cc1ccc2c(ccc3ncccc23)n1")
+smiles(R"N#C[C@@]1(C)C[C@]2(OCCO2)CC(C)(C)C1")
+smiles(R"NC[C@]1(C)C[C@]2(OCCO2)CC(C)(C)C1")
+smiles(R"N#CC1=C(C)/C(=c\2/o/c(=C\3/C(=O)N(/N=C/c4ccc(Cl)cc4)C(=O)C(=C3C)C#N)/c3nccnc23)/C(=O)N(/N=C/c2ccc(Cl)cc2)C1=O")
+smiles(R"N#Cc1ccccc1c1nc2ccc(N)c3C(=O)c4ccccc4c(n1)c23")
+smiles(R"N#Cc1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"N#Cc1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"N#Cc1cccc(c1)N1C(=O)[C@H]2[C@H]3C=C[C@@H]([C@H]2C1=O)[C@H]1C(=O)N(c2cccc(C#N)c2)C(=O)[C@@H]31")
+smiles(R"N#Cc1ccccc1/N=C(\CC[C@](C#N)(C#N)CC/C(=N\c1ccccc1C#N)/NC(C)(C)C)/NC(C)(C)C")
+smiles(R"N#Cc1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"N#Cc1c(C)cc(C)n(/N=C/[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c1=O")
+smiles(R"N#Cc1c(C)cc(C)n(/N=C/[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c1=O")
+smiles(R"N(=C\c1ccc(/C=N\Nc2nc3ccccc3s2)cc1)/Nc1nc2ccccc2s1")
+smiles(R"N(=C\c1ccco1)\C[C@H]1CC[C@@H](C/N=C\c2ccco2)CC1")
+smiles(R"N#Cc1c(Cl)cc(cc1Cl)[C@@]1(OS(=O)(=O)c2ccc(C)cc2)[C@@H]2CC[C@H]1CC2")
+smiles(R"N#CC1=C(C#N)[C@H]2CC[C@@H]1CC2")
+smiles(R"N#Cc1c(C)nn2c1nnc1c(=O)[nH][nH]c(=N)sc21")
+smiles(R"N#Cc1c(NCc2ccco2)c2ccccc2n2c1n(C)c1ccccc21")
+smiles(R"N#Cc1c(NCCc2ccccn2)c2ccccc2n2c1n(C)c1ccccc21")
+smiles(R"N#CC1(C#N)C(C)(C)[C@@H](C[Fe]2345(C#[O+])(C#[O+])[C@H]6C4=C3C2=C56)C1(C#N)C#N")
+smiles(R"N#Cc1c(NCCCN2CCOCC2)c2ccccc2n2c1n(C)c1ccccc21")
+smiles(R"N#Cc1c(NCCCn2cncc2)c2ccccc2n2c1n(C)c1ccccc21")
+smiles(R"N#CC1(C#N)C(C#N)(C#N)[C@@]21CCCC[C@@H]2C")
+smiles(R"N#CC1(C#N)C(C#N)(C#N)[C@]21CCCC[C@@H]2Cl")
+smiles(R"N#CC1(C#N)[C@H]2c3ccccc3[C@H](c3ccccc23)C1(C#N)C#N")
+smiles(R"N#CC1(C#N)[C@@H]2CC[C@@H](CC2)C1(C#N)C#N")
+smiles(R"N#CC1(C#N)[C@H](C=C[C@@]21OCCCO2)c1ccccc1")
+smiles(R"N#Cc1cnc(N)nc1NC[C@]1(COC(=O)C)C[C@@H](CCc2ccccc2)C1")
+smiles(R"N#Cc1c[nH]n2c1n[n+]([O-])c1ccc(Cl)cc21")
+smiles(R"N#Cc1cnn2c1n[n+]([O-])c1ccc(Cl)cc21")
+smiles(R"N#Cc1c(=O)nc2[nH]n3c(nnc4c3ccc3ccccc43)c2c1c1ccc(Cl)cc1")
+smiles(R"N#Cc1c(sc2c1c1ccccc1oc1=c2c(=O)c2ccccc2c1=O)NC(=O)C(F)(F)F")
+smiles(R"NC[C@@]1(N2CCCC2)[C@H]2CCCC[C@H]12")
+smiles(R"N#C[C@]1(/N=N/c2ccccc2)CC[C@@H](CC1)C(C)(C)C")
+smiles(R"N#C[C@@]1(NNc2ccccc2)CC[C@@H](CC1)C(C)(C)C")
+smiles(R"N#Cc1nnn(n1)c1ccccc1")
+smiles(R"N#C[C@]1(O)C(C)(C)[C@](O)(C#N)[C@@]1(C)C")
+smiles(R"N#CC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"N#CC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"NCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"NCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"N#CC(=c1c2nsnc2c(=C(C#N)C#N)c2nsnc12)C#N")
+smiles(R"N#CC(=c1cc/c(=c\2/ccc(=C(C#N)C#N)s2)/s1)C#N")
+smiles(R"N#CC(=c1ccc(=C2N3CCC[C@H]3CN2[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1)C#N")
+smiles(R"N#C[C@](c1ccccc1)([C@H](CC(=O)c1ccccc1)c1ccccc1)[C@H](CC(=O)c1ccccc1)c1ccccc1")
+smiles(R"N#CC(=c1ccc(=C(C#N)C#N)c2nsnc12)C#N")
+smiles(R"N#C/C(=C/1\C=C/C(=N\OC(=O)c2ccccc2)/C=C1)/c1ccccc1")
+smiles(R"N#C/C(=C/1\C=C/C(=N\OC(=O)Nc2ccccc2)/C=C1)/c1ccccc1")
+smiles(R"N#C/C(=C\1/[SH+][Cu+2]2([SH+]1)[SH+]/C(=C(/C#N)\C(=O)c1ccccc1)/[SH+]2)/C(=O)c1ccccc1")
+smiles(R"N#C/C(=C\1/[SH+][Ni+2]2([SH+]1)[SH+]/C(=C(\C#N)/c1ccccc1)/[SH+]2)/c1ccccc1")
+smiles(R"N#C/C(=C\1/[SH+][Pt+2]2([SH+]1)[SH+]/C(=C(\C#N)/c1ccccc1)/[SH+]2)/c1ccccc1")
+smiles(R"NCC(C)C")
+smiles(R"N#C/C(=C\c1cc(Cl)cc(Cl)c1O)/[C@@H](c1ccc2OCOc2c1)/C(=C/c1cc(Cl)cc(Cl)c1O)/C#N")
+smiles(R"N#C/C(=C\c1ccc(O)c(O)c1)/C(=O)N[C@H]1CC[C@@H](CC1)C[C@H]1CC[C@@H](CC1)NC(=O)/C(=C/c1ccc(O)c(O)c1)/C#N")
+smiles(R"N#C/C=C\c1cn(cc1/C=C/C#N)S(=O)(=O)c1ccc(C)cc1")
+smiles(R"N#CC(C)(C)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"N#CC(C)(C)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"N#C/C(=C\C=C\C1CCCCC1)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\C=C\C1CCCCC1)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]")
+smiles(R"N#CCCCC[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"N#C[C@@](CCC(=O)/C=C/c1ccccc1)(CCC(=O)/C=C/c1ccccc1)S(=O)(=O)c1ccc(C)cc1")
+smiles(R"N#CCCCCS[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N#C/C(=C\[C@H]1CC[C@H](CC1)C(C)C)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@H]1CC[C@H](CC1)C(C)C)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1CC[C@H](CC1)N(C)C)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1CC[C@H](CC1)N(C)C)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1CC[C@H](CC1)NC(=O)C)/[C@@H]1CC[C@@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1CC[C@H](CC1)NC(=O)C)/[C@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1CC[C@@H](CC1)NC(=O)C)/[C@H]1CC[C@@H](C)CC1")
+smiles(R"N#C/C(=C\[C@@H]1C[C@@H](Br)CC[C@@H]1O)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1C[C@@H](Br)CC[C@@H]1O)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1C[C@H](Br)C[C@H](Br)[C@H]1O)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1C[C@H](Br)C[C@H](Br)[C@H]1O)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1C[C@H](Cl)C[C@H](Cl)[C@H]1O)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1C[C@H](Cl)C[C@H](Cl)[C@H]1O)/[C@H]1CC[C@@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@@H]1[C@H](Cl)CCC[C@H]1Cl)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"N#C/C(=C\[C@H]1[C@H](Cl)CCC[C@H]1Cl)/[C@@H]1CC[C@H](CC1)[N+](=O)[O-]")
+smiles(R"N#CCC[C@H]1C(=[O+][Cu@]2([O+]=C1C)[O+]=C(C)[C@H](CCC#N)C(=[O+]2)C)C")
+smiles(R"NCCCCNCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"NCCCCNCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"N#CCCN1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"NCCCN1CCN(CCCNc2ccc3nnn4c3c2c(=O)c2ccccc42)CC1")
+smiles(R"N#CCC/N=C/1\C=C/C(=C(/c2ccccc2)\c2ccc(NCCC#N)cc2)/C=C1")
+smiles(R"N#CCC/[N+](=C/1\C=C/C(=C(/c2ccc(cc2)Nc2ccc(cc2)NC(=O)C)\c2ccc(cc2)N(C)CCC#N)/C=C1)/C")
+smiles(R"N#CCC/[N+](=C/1\C=C/C(=C(/c2ccc(cc2)N(C)CCC#N)\c2ccc(Nc3ccccc3)c3ccccc23)/C=C1)/C")
+smiles(R"N#CCC/N=C\1/C=C/C(=C(/c2ccc(NCCC#N)cc2)\c2ccccc2Cl)/C=C1")
+smiles(R"N#CCC/N=C\1/C=C/C(=C(/c2ccc(NCCC#N)cc2)\c2ccc(Cl)cc2Cl)/C=C1")
+smiles(R"NCCCNCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"NCCCNCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"NCCCNCCCCNCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"NCCCNCCCCNCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"NCCCNCCCCNCCCNCCCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"NCCCNCCCCNCCCNCCCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"N#C[C@](C#N)(CC/C(=N\c1ccc(cc1)[N+](=O)[O-])/NC(C)(C)C)CC/C(=N\c1ccc(cc1)[N+](=O)[O-])/NC(C)(C)C")
+smiles(R"N#CC(C#N)(CC/C(=N\c1ccc(cc1)[N+](=O)[O-])/NC(C)(C)C)CC/C(=N\c1ccc(cc1)[N+](=O)[O-])/NC(C)(C)C")
+smiles(R"N#C[C@](C#N)(CC/C(=N\c1c(Cl)cccc1Cl)/NC(C)(C)C)CC/C(=N\c1c(Cl)cccc1Cl)/NC(C)(C)C")
+smiles(R"N#CC(C#N)[C@@H]1c2ccccc2[C@H]([N+](=O)[O-])c2ccccc12")
+smiles(R"N#CC(C#N)[C@H]1c2ccccc2[C@@H]([N+](=O)[O-])c2ccccc12")
+smiles(R"N#C/C(=C(/N)\C#N)/N=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"N#C/C(=C(/N)\C#N)/N=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"N#C/C(=C(\N)/C#N)/N=C/C=N/C(=C(\N)/C#N)/C#N")
+smiles(R"NCCCO[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"N#CCCO[C@@H]1[C@@H](OCCC#N)[C@@H](OCCC#N)[C@H](OCCC#N)[C@H](OCCC#N)[C@@H]1OCCC#N")
+smiles(R"N#CCC(=O)N/N=C/1\CCC/C(=N\NC(=O)CC#N)/[C@H]1C(=O)CCCC(=O)Nc1c(C)cccc1C")
+smiles(R"N#C[C@H]1C[C@@]21c1ccccc1C(=O)c1ccccc21")
+smiles(R"N#C[C@@H]1C[C@]2(CC/C/1=N\NC(=O)N)c1ccccc1c1ccccc21")
+smiles(R"N#C[C@@H]1C[C@@]2(CCC1=O)c1ccccc1c1ccccc21")
+smiles(R"N#C[C@@H]1C[C@@]2(C(=O)C1=O)c1ccccc1c1ccccc21")
+smiles(R"N#C[C@H]1C[C@]2([N+](=O)[O-])c3ccccc3[C@H]1c1ccccc21")
+smiles(R"N#C[C@H]1C[C@@]2([N+](=O)[O-])c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"N#C[C@H]1C[C@@]2(OCCO2)CCN1C(=O)c1ccccc1")
+smiles(R"NC[C@@H]1CCC[C@@]2(OCCO2)C1")
+smiles(R"NC[C@@H]1CC[C@@H]1CN")
+smiles(R"N#C[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"NC[C@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"NC[C@@H]1C[C@H]2CC[C@@H]1CC2")
+smiles(R"N#C[C@H]1[C@@H]2CC[C@]3(OCCO3)C[C@@H]2CCN1C(=O)c1ccccc1")
+smiles(R"N#C[C@@H]1[C@H](C#N)[C@H]1C#N")
+smiles(R"N#C[C@H]1[C@H](C#N)[C@H]1C#N")
+smiles(R"N#C[C@H]1C(=[O+][Mn@@]2([O+]=C1C)[O+]=C(C)[C@H](C#N)C(=[O+]2)C)C")
+smiles(R"N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@]1(CC)c1ccccc1")
+smiles(R"N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@]1(C)CC(C)C")
+smiles(R"N#C[C@H]1C(=O)NC(=O)[C@H](C#N)[C@]21c1ccccc1Oc1ccccc21")
+smiles(R"N#C[C@@H]1C(=O)NC(=O)[C@H](C#N)[C@@]21CCCC2")
+smiles(R"N#C[C@@H]1C(=O)NC(=O)[C@H](C#N)[C@]21CCCCC2")
+smiles(R"N#C[C@@H]1C(=O)NC(=O)[C@H](C#N)[C@@]21CCN(CC2)Cc1ccccc1")
+smiles(R"N#C[C@@H]1C(=O)NC(=O)[C@H](C#N)[C@]21CCN(C)CC2")
+smiles(R"N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@H]1c1ccc(cc1)[C@@H]1[C@H](C#N)C(=O)NC(=O)[C@H]1C#N")
+smiles(R"N#C[C@H]1C(=O)NC(=O)[C@H](C#N)[C@@H]1c1ccc(Cl)cc1Cl")
+smiles(R"N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@H]1c1ccc(Cl)c(Cl)c1")
+smiles(R"N#C[C@@H]1C(=O)NC(=O)[C@@H](C#N)[C@H]1CCc1ccccc1")
+smiles(R"NC[C@@H]1O[Mo]234O[C@@H](CN)O[Mo]4(O1)(O[C@H](CN)O2)O[C@@H](CN)O3")
+smiles(R"N#C[C@H](c1ccccc1)/C(=N\NC(=O)C(=O)NN)/C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"N#C[C@H](c1ccccc1)N1CCCN([C@H](C#N)c2ccccc2)[C@H]1c1ccc(cc1)N(C)C")
+smiles(R"N#C[C@H](c1ccc(cc1)N(C)C)N1CCCN([C@H](C#N)c2ccc(cc2)N(C)C)[C@@H]1c1ccc(cc1)N(C)C")
+smiles(R"NC[C@@H](C)O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N#C[C@H](NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1ccccc1")
+smiles(R"N#C[C@@H](N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccccc1C(F)(F)F")
+smiles(R"N#C[C@@H](NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccc(OC)c(OC)c1")
+smiles(R"N#C[C@H](N[C@H](C)c1ccccc1)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"NC[C@@H](O)[C@@H]1O[C@@](C)(C)O[C@@H]1[C@H](O)CN")
+smiles(R"NC[C@H](O)CN1C[C@H](O)CN[Pt@]21OC(=O)CC(=O)O2")
+smiles(R"NC[C@H](O)C[N+]1(C[C@@H](O)CN[Pt@@]21OC(=O)CC(=O)O2)Cc1ccccc1")
+smiles(R"NC[C@@H](O)C[N+]1(C[C@H](O)CN[Pt@@+2]21[OH+]C(=O)CC(=O)[OH+]2)Cc1ccccc1")
+smiles(R"NCCN1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"NCCN1C(=O)[C@@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@@H]2C1=O")
+smiles(R"NCCN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"N#CC(=N)N[C@H]1CC[C@@H](CC1)[C@@H]1CC[C@@H](N)CC1")
+smiles(R"N#CC(=N)N[C@@H]1CC[C@@H](CC1)[C@H]1CC[C@@H](O)CC1")
+smiles(R"N#C[C@@](OC/C=C/c1ccccc1)(OC/C=C/c1ccccc1)c1cc2Cc3cc(cc(Cc4cc(cc(Cc5cc(cc(Cc(c1)c2OC/C=C/c1ccccc1)c5OC/C=C/c1ccccc1)C(C)(C)C)c4OC/C=C/c1ccccc1)[C@@](C#N)(OC/C=C/c1ccccc1)OC/C=C/c1ccccc1)c3OC/C=C/c1ccccc1)C(C)(C)C")
+smiles(R"NCCS[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N/C(=C\S(=O)(=O)c1ccccc1)/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N=C(CSSc1ccccc1)NC[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"N=C(CSSCC(=N)N[C@@]1(C)CC[C@H](CC1)C(C)(C)C)N[C@@]1(C)CC[C@@H](CC1)C(C)(C)C")
+smiles(R"N=C(CSSCC(=N)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N[C@@H]1CC[C@H](CC1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N[C@@H]1CC[C@H](CC1)CC1CCCCCC1")
+smiles(R"N[C@H]1CC[C@@H](CC1)C[C@@H]1C[C@H]2CC[C@@H]1C2")
+smiles(R"N[C@H]1CC[C@H](CC1)[C@@H]1CC[C@H](CC1)NC(=N)C(=N)N[C@H]1CC[C@H](CC1)[C@@H]1CC[C@@H](N)CC1")
+smiles(R"N[C@H]1CC[C@@H](CC1)C(=O)[C@@H]1CC[C@@H](O)C[C@@H]1O")
+smiles(R"N[C@@H]1CC[C@H](CC1)N(C)C")
+smiles(R"N[C@H]1CC[C@@H](CC1)N(C)C")
+smiles(R"N[C@@H]1CC[C@H](CC1)OC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N[C@@H]1CC[C@H](CCCC2CCCC2)CC1")
+smiles(R"N[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"N[C@@H]1CC(=O)[C@@H](C[C@@H]2C(=O)C[C@H](N)CC2=O)C(=O)C1")
+smiles(R"N[C@H](C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)N")
+smiles(R"N#CN1CC[C@H]2C[C@]3(OCCO3)CC[C@H]2C1")
+smiles(R"NC(=N)c1ccc(cc1)/N=N/c1c(C)nc2ccc3c4c(ccc3c2c1O)nc(C)c(/N=N\c1ccc(cc1)C(=N)N)c4O")
+smiles(R"N#CNc1nc(CCC)c(C)c(n1)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N#C/N=C\1/[SH+][Co+2]2([SH+]1)[SH+]/C(=N/C#N)/[SH+]2")
+smiles(R"N#C/N=C\1/[SH+][Pt+2]2([SH+]1)[SH+]/C(=N/C#N)/[SH+]2")
+smiles(R"N=C(NC[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)CS(=O)(=O)O")
+smiles(R"N=C(NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)CSP(=O)(O)O")
+smiles(R"N=C(NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)CSS(=O)(=O)O")
+smiles(R"N=C(NCCCCCS[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)CSSCC(=N)NCCCCCS[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N=C(NC[C@@H](C)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)CSS(=O)(=O)O")
+smiles(R"N#C/N=C\N1CC[C@@H](CC1)Cc1ccccc1")
+smiles(R"N#C/N=C\N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"N#CN/C(=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/Nc1ccncc1")
+smiles(R"N=C(\N(C)/N=C/c1ccccc1)/N(C)/N=C\c1ccccc1")
+smiles(R"NC(=N)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"NC(=N)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N=C(\N/N=C/c1cc(Br)cc(Br)c1O)/N/N=C\c1cc(Br)cc(Br)c1O")
+smiles(R"N=C(\N/N=C/c1ccc2OCOc2c1)/N/N=C\c1ccc2OCOc2c1")
+smiles(R"N=C(\N/N=C/c1cccc2ccccc12)/N/N=C/c1cccc2ccccc12")
+smiles(R"N=C(\N/N=C/c1ccc(cc1)c1cn2cc(C)ccc2[n+]1C)/N/N=C/c1ccc(cc1)c1cn2cc(C)ccc2[n+]1C")
+smiles(R"N=C(N/N=C/c1ccc(cc1)c1cn2cc(C)ccc2[n+]1C)N/N=C/c1ccc(cc1)c1cn2cc(C)ccc2[n+]1C")
+smiles(R"N=C(\N/N=C/c1ccc(cc1)c1cn2ccsc2[n+]1C)/N/N=C/c1ccc(cc1)c1cn2ccsc2[n+]1C")
+smiles(R"N=C(\N/N=C\c1ccc(cc1)c1cn2ccsc2[n+]1C)/N/N=C\c1ccc(cc1)c1cn2ccsc2[n+]1C")
+smiles(R"N=C(N/N=C/c1ccc(cc1)c1cn2ccsc2[n+]1C)N/N=C/c1ccc(cc1)c1cn2ccsc2[n+]1C")
+smiles(R"N=C(\N/N=C\c1ccccc1Cl)/N/N=C\c1ccccc1Cl")
+smiles(R"N=C(\N/N=C/c1ccccc1)/N/N=C\c1ccccc1")
+smiles(R"N=C(N/N=C/c1cccc(c1)[N+](=O)[O-])C(=N)N/N=C\c1cccc(c1)[N+](=O)[O-]")
+smiles(R"N=C(N/N=C/c1ccccc1[N+](=O)[O-])C(=N)N/N=C\c1ccccc1[N+](=O)[O-]")
+smiles(R"N=C(N/N=C\c1cccc(c1)[N+](=O)[O-])C(=N)N/N=C/c1cccc(c1)[N+](=O)[O-]")
+smiles(R"N=C(N/N=C\c1ccccc1[N+](=O)[O-])C(=N)N/N=C/c1ccccc1[N+](=O)[O-]")
+smiles(R"N=C(\N/N=C/c1ccc(cc1)OCc1cn2ccccc2[n+]1C)/N/N=C\c1ccc(cc1)OCc1cn2ccccc2[n+]1C")
+smiles(R"N=C(\N/N=C/c1ccccc1O)/N/N=C\c1ccccc1O")
+smiles(R"N=C(\N/N=C/c1ccc(C)cc1)/N/N=C\c1ccc(C)cc1")
+smiles(R"N=C(\N/N=C/c1cc(Cl)ccc1O)/N/N=C\c1cc(Cl)ccc1O")
+smiles(R"N=C(\N/N=C/c1ccncc1)/N/N=C\c1ccncc1")
+smiles(R"NC(=N)NCCC[C@H](NC(=O)c1c2ccccc2n(C)c2ccccc12)C(=O)O")
+smiles(R"NC(=N)NCCN1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"NC(=N)N/N=C\1/C(C)(C)/C(=N\NC(=N)N)/[C@@]1(C)C")
+smiles(R"NC(=N)N/N=C/1\CC[C@@H](CC1)C1CCCCC1")
+smiles(R"NC(=N)N/N=c/1\c(=N/NC(=N)N)\c2cc3ccccc3cc2\c1=N\NC(=N)N")
+smiles(R"NC(=N)N/N=c/1\c(=N\NC(=N)N)\c2ccccc2\c1=N\NC(=N)N")
+smiles(R"NC(=N)N/N=C(/C=C/c1ccccc1O)\C=C\c1ccccc1O")
+smiles(R"NC(=N)N/N=C(\C=C\c1ccccc1O)/C=C/c1ccccc1O")
+smiles(R"NC(=N)N/N=C(\C(=O)O)/C(=N\NC(=N)N)/C(=O)O")
+smiles(R"NC(=N)NS(=O)(=O)c1ccc(cc1)NC(=O)c1c2ccccc2n(C)c2ccccc12")
+smiles(R"NC(=N)S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"NC(=N)SCc1ccc2nsnc2c1")
+smiles(R"NC(=O)[C@@]12O[C@H]3C[C@H](C[C@H](C3)O2)O1")
+smiles(R"NC(=O)c1nnn(n1)c1ccccc1")
+smiles(R"NC(=O)[C@H]1C[C@]21c1ccccc1c1ccccc21")
+smiles(R"NC(=O)[C@H]1C[C@]2(c3ccccn3)c3ccccc3[C@H]1c1ccccc21")
+smiles(R"NC(=O)[C@@H]1CC[C@H](CC1)C(C)(C)C")
+smiles(R"NC(=O)[C@@H]1C[C@@H](C[C@@H](C1)C(=O)N)C(=O)N")
+smiles(R"NC(=O)[C@@H]1CCN(CC1)/N=N/c1c(C)n[nH]c1C(F)(F)F")
+smiles(R"NC(=O)[C@@H]1C(=O)NC(=O)[C@H](C(=O)N)[C@@]1(C)C")
+smiles(R"NC(=O)[C@H]1O[C@]21CCCC2")
+smiles(R"NC(=O)[C@H](OC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccccc1")
+smiles(R"NC(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"NC(=O)N/N=C\1/C(C)(C)/C(=N\NC(=O)N)/C1(C)C")
+smiles(R"NC(=O)N/N=C/1\CC[C@@H](CC1)c1ccccc1")
+smiles(R"NC(=O)N/N=C/1\CC[C@@H](CC1)C1CCCCC1")
+smiles(R"NC(=O)N/N=C\1/CC[C@@H](CC1)CC1CCCCC1")
+smiles(R"NC(=O)N/N=C/1\CC[C@H](CCOC(=O)c2ccccc2)CC1")
+smiles(R"NC(=O)N/N=C/1\C[C@@H](C/C(=N\NC(=O)N)/C[C@H](C1)C(=O)O)C(=O)O")
+smiles(R"NC(=O)N/N=C(\C)/[C@@H]1CC[C@H](CC1)c1ccccc1")
+smiles(R"NC(=O)NOC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"NC(=O)Oc1ccc(cc1)[C@H]1CC(=O)[C@@H](C(=O)N)C(=O)C1")
+smiles(R"N#CS[Co]1234([S+]=C([N-][N+]3=C(C)c3cccc[n+]13)N1C[C@@H]3CC[C@@H](CC3)C1)[S+]=C([N-][N+]4=C(C)c1cccc[n+]21)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"N#CS[Co]1234([S+]=C([N-][N+]3=C(C)c3cccc[n+]13)N1C[C@H]3CC[C@H](CC3)C1)[S+]=C([N-][N+]4=C(C)c1cccc[n+]21)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"NC(=S)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"NC(=S)N/N=C/1\CC[C@@H](CC1)C1CCCCC1")
+smiles(R"NC(=S)N/N=C/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"NC(=S)N/N=C/c1ccc(cn1)OC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"NC(=S)N/N=C/c1nc2ncnc3ccn1c23")
+smiles(R"[nH]1ncc(c1)[C@@]12[C@H]3[C@@H]4[C@@H]5[C@H]3[C@H]2[C@@H]5[C@H]14")
+smiles(R"[NH-]=[N+]=CC(=O)[C@@H](OC(=O)C)[C@@H](OC(=O)C)[C@H](OC(=O)C)C(=O)C=[N+]=[NH-]")
+smiles(R"[NH-]=[N+]=CC(=O)[C@@H](OC(=O)C)[C@H](OC(=O)C)[C@H](OC(=O)C)C(=O)C=[N+]=[NH-]")
+smiles(R"[NH-]=[N+]=N[C@@]12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1")
+smiles(R"[NH-]=[N+]=NC12C[C@]3(C)C[C@@](C)(C[C@@](C)(C3)C2)C1")
+smiles(R"[NH-]=[N+]=N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[NH-]=[N+]=NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[NH-]=[N+]=NC12C[C@H]3[C@@H]4CC5C[C@H]3[C@H](C2)[C@@H](C5)[C@@H]4C1")
+smiles(R"[NH-]=[N+]=N[C@]12C[C@@H]3[C@H]4C[C@@H]5C[C@H]([C@H]4C1)[C@H](C2)[C@H]3C5")
+smiles(R"[NH-]=[N+]=Nc1cc2c(no[n+]2[O-])cc1[N+](=O)[O-]")
+smiles(R"[NH-]=[N+]=Nc1cc2c(NO[N+]2[O-])cc1[N+](=O)[O-]")
+smiles(R"[NH-]=[N+]=Nc1ccc(cc1)/C=C/1\C[C@@H](C/C(=C\c2ccc(N=[N+]=[NH-])cc2)/C1=O)C(C)(C)C")
+smiles(R"[NH-]=[N+]=Nc1ccc(cc1)/C=C/1\C[C@H](C/C(=C\c2ccc(N=[N+]=[NH-])cc2)/C1=O)C(C)(C)C")
+smiles(R"[NH-]=[N+]=Nc1cc(N)c2nn[nH]n2[nH]1")
+smiles(R"[NH-]=[N+]=Nc1cc(N)c2nnnn2n1")
+smiles(R"[NH-]=[N+]=NC(=O)[C@@]1(Br)CC[C@@H]2c3ccccc3[C@@](C1)([N+](=O)[O-])c1ccccc21")
+smiles(R"[NH-]=[N+]=NC(=O)[C@@]1(Br)CC[C@H]2c3ccccc3[C@](C1)([N+](=O)[O-])c1ccccc21")
+smiles(R"Nn1c2ccccc2nc2c1c1cccc3cccc2c13")
+smiles(R"Nn1cccc2ccccc12")
+smiles(R"Nn1ccccc1")
+smiles(R"NN1C(=N[NH+]2C1=[S+][Fe@@+2]12[Cl-][Fe@+2]2([S+]=C3N(N)C(=N[NH+]23)c2ccccc2)[Cl-]1)c1ccccc1")
+smiles(R"NN1C(=N[NH+]2C1=[S+][Fe@+2]12[Cl-][Fe@@+2]2([S+]=C3N(N)C(=N[NH+]23)c2ccccc2)[Cl-]1)c1ccccc1")
+smiles(R"NN[C@@]12CC[C@@H](c3ccccc13)c1ccccc21")
+smiles(R"NN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"N/N=c/1\c2ccccc2c2cc3c(cc12)/c(=N\N)/c1ccccc31")
+smiles(R"N/N=C/1\C(=C\c2ccccc2)\CCC\C1=C/c1ccccc1")
+smiles(R"NNc1ccc2nccn2n1")
+smiles(R"NNc1ccc2nnc(Cl)n2n1")
+smiles(R"N/N=C/1\[C@@H]2CN3CCN(C2)C[C@@]1(C3)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"N/N=C/1\[C@H]2CN3CCN(C2)C[C@]1(C3)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"N/N=C/1\C(=N/N)\C(C)(C)C[S@](=O)(=O)CC1(C)C")
+smiles(R"NNc1nnc2c3ccccc3CCc3cc4cc(C)oc4c1c23")
+smiles(R"N/N=C/c1nc2ncnc3ccn1c23")
+smiles(R"N/N=C(\C)/C(=N\N)/C")
+smiles(R"N/N=C\C=N\N")
+smiles(R"NN[C@H](C)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"NNC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)NN)C6=C12")
+smiles(R"NNC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)NN)C6=C12")
+smiles(R"NNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"NNC(=O)[C@@H]1CC2=C(C1)C[C@@H](C2)C(=O)NN")
+smiles(R"NNC(=O)[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"NNC(=O)[C@H]1[C@@H]2CCCC[C@@H]12")
+smiles(R"NNC(=O)[C@H]1[C@@H](C(=O)NN)[C@@H]1C(=O)NN")
+smiles(R"NNC(=O)[C@@H]1[C@@H](C(=O)NN)[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"NNC(=O)[C@@H]1[C@@H](C(=O)O)[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"NNC(=O)CSc1n[nH]c(n1)c1c(C)no[n+]1[O-]")
+smiles(R"NNC(=O)CSc1n[nH]c(n1)C1=C(C)NO[N+]1[O-]")
+smiles(R"NNC(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"NNC(=S)N/N=C\1/C(C)(C)/C(=N/NC(=S)NN)/C1(C)C")
+smiles(R"N[Pt](Cl)(Cl)(Cl)(Cl)n1cccc2ccccc12")
+smiles(R"N[Pt](Cl)(Cl)(Cl)(Cl)n1csc2ccccc12")
+smiles(R"N[Pt](Cl)(Cl)(Cl)(Cl)n1cscc1")
+smiles(R"N[Pt](Cl)(Cl)n1csc2ccccc12")
+smiles(R"N[Pt](Cl)(Cl)n1cscc1")
+smiles(R"O1C[C@@H]1C[N@@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"O1C[C@H]1CN1CC[C@@H](CC1)[C@@H]1CCN(CC1)C[C@H]1OC1")
+smiles(R"O1CC[N+]2(CC1)Cc1c(ccc3ccccc13)[OH+][Cu@@+2]12[Cl-][Cu@+2]2([OH+]c3ccc4ccccc4c3C[N+]32CCOCC3)[Cl-]1")
+smiles(R"O1CC[N+]2(CC1)Cc1c(ccc3ccccc13)[OH+][Cu@+2]12[Cl-][Cu@@+2]2([OH+]c3ccc4ccccc4c3C[N+]32CCOCC3)[Cl-]1")
+smiles(R"O1CCN(CC1)[C@@]12O[C@@]3(N4CCOCC4)[C@@H]4[C@H]5C[C@H]([C@@H]6[C@H]5[C@H]3[C@H]26)[C@H]14")
+smiles(R"O1CCN(CC1)c1n2ccccc2c2n1c1ccccc1n1c2c2ccccn2c1N1CCOCC1")
+smiles(R"O1CC/S(=[O+]\[Hg+2](/[O+]=S\2/CCOCC2)(/[O+]=S/2\CCOCC2)(/[O+]=S\2/CCOCC2)(/[O+]=S/2\CCOCC2)/[O+]=S/2\CCOCC2)/CC1")
+smiles(R"O1CC/S(=[O+]\[Hg+2](/[O+]=S\2/CCOCC2)(/[O+]=S\2/CCOCC2)(/[O+]=S\2/CCOCC2)(/[O+]=S\2/CCOCC2)/[O+]=S\2/CCOCC2)/CC1")
+smiles(R"O1[C@H]2[C@@H]1[C@@H]1C[C@H]2[C@@]23O[C@]13[C@@H]1C[C@H]2[C@H]2O[C@@H]12")
+smiles(R"O1[C@@H]2[C@@H]1[C@@H]1O[C@H]1[C@H]1O[C@H]1[C@@H]1O[C@@H]21")
+smiles(R"O1[C@@H]2[C@H]3O[C@H]3[C@@H]3O[C@@H]3[C@H]12")
+smiles(R"O1CN2c3nonc3N3COCN4[C@@H]3[C@@H]2N(C1)c1nonc41")
+smiles(R"O1NC2=N[C@H]3N=C4NONC4=N[C@@H]3N=C2N1")
+smiles(R"O1[Si@@H]2[Si@H]3O[Si@H]3[Si@@H]3O[Si@@H]3[Si@H]12")
+smiles(R"OB1O[C@H](C)[C@@H](C)[C@@H](C)O1")
+smiles(R"OB(O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OB(O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OB(O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(B(O)O)C6=C12")
+smiles(R"O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[C@]12[C@H]3CCC[C@H]1CCC[C@@H]2CCC3")
+smiles(R"O=c1c2c3sc4ccccc4[nH]c3ccc2c(=O)c2ccccc12")
+smiles(R"O=c1c2cc3ccccc3cc2oc2cc3ccccc3cc12")
+smiles(R"O=C1c2cc3nc4c(nc3cc2C(=O)c2ccccc12)c1ccccc1c1ccccc41")
+smiles(R"O=c1c2cc3[nH]c4ccccc4c(=O)c3cc2[nH]c2ccccc12")
+smiles(R"O=C1[C@]2(CCC[C@@]31CO[C@]1(CCCCC1)OC3)CO[C@@]1(CCCCC1)OC2")
+smiles(R"O=c1c2cccc3c4ccccc4c4sc5ccccc5n1c4c23")
+smiles(R"O=c1c2cccc3cccc(c23)/c/1=c\1/c(=O)c2cccc3cccc1c23")
+smiles(R"O=c1c2c(ccc3ccccc23)oc2ccc3ccccc3c12")
+smiles(R"O=c1c2ccccc2c2c1c1c3ccccc3c(=O)c1c1c2c(=O)c2ccccc12")
+smiles(R"O=C1c2ccccc2c2ccc(cc12)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C1c2ccccc2c2nc3ccc4C(=O)c5ccccc5c5nc6ccc1c2c6c3c45")
+smiles(R"O=C1c2ccccc2c2nccc3c2c1nc1ccccc31")
+smiles(R"O=C1c2ccccc2c2nc(cc3c2c1nc1ccccc31)c1cccnc1")
+smiles(R"O=C1c2ccccc2c2nc(cc3c2c1nc1ccccc31)c1cccs1")
+smiles(R"O=C1c2ccccc2c2nc(cc3c2c1nc1ccccc31)c1ccncc1")
+smiles(R"O=C1c2ccccc2c2nc(cc3c4ccccc4nc1c23)c1ccccc1")
+smiles(R"O=C1c2ccccc2c2nccc3ccnc1c23")
+smiles(R"O=C1c2ccccc2c2nc(/C=C/c3ccccc3)cc3c4ccccc4nc1c23")
+smiles(R"O=C1c2ccccc2C(=O)c2c1c1c(c3c2c2ccccc2n3C)n(C)c2ccccc12")
+smiles(R"O=c1c2ccccc2c(=O)c2c1c1c(=O)c3ccccc3c(=O)c1c1c2c(=O)c2ccccc2c1=O")
+smiles(R"O=c1c2ccccc2c(=O)c2c1c(c1ccccc1)c1c(c2c2ccccc2)c(=O)c2ccccc2c1=O")
+smiles(R"O=C1c2ccccc2C(=O)c2c1ccc1nc3c4cccc5cc6ccccc6c(c3nc21)c45")
+smiles(R"O=C1c2ccccc2C(=O)C2=C1[C@H]1c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"O=C1c2ccccc2C(=O)c2c1sc1nc3c(=O)n(C)c(=O)n(C)c3n21")
+smiles(R"O=c1c2ccccc2c(=O)c2c(cc3sc4c(ccc5c4c(=O)c4ccccc4c5=O)[nH]c3c12)NC(=O)c1ccc2C(=O)c3ccccc3c3nsc1c23")
+smiles(R"O=C1c2ccccc2C(=O)[C@H]2[C@@H]1[C@H]1c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"O=C1c2ccccc2C(=O)[C@@H]2[C@H]1[C@H]1[C@@H]2C(=O)c2ccccc2C1=O")
+smiles(R"O=C1c2ccccc2C(=O)[C@@H]2[C@@H]1C(=O)c1ccccc1C2=O")
+smiles(R"O=c1c2ccccc2c(=O)n2n1[C@H](c1ccccc1)N(O[C@@]12CCCCC1)C(C)(C)C")
+smiles(R"O=c1c2ccccc2n2nnc3cccc1c23")
+smiles(R"O=c1c2ccccc2n2nnc3ccc(NCCCNCCNCCCNc4ccc5nnn6c5c4c(=O)c4ccccc64)c1c23")
+smiles(R"O=c1c2ccccc2nc2sc3nc4ccccc4c(=O)n3n12")
+smiles(R"O=c1c2ccccc2ncn1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C1c2cccc(NC(=O)c3ccc4C(=O)c5ccccc5c5ncnc3c45)c2C(=O)c2ccccc12")
+smiles(R"O=C1c2cccnc2c2nccc3c2c1nc1ccccc31")
+smiles(R"O=C1c2cccnc2c2nc(cc3c2c1nc1ccccc31)c1ccccc1")
+smiles(R"O=C1c2cccnc2c2nc(cc3c2c1nc1ccccc31)c1cccnc1")
+smiles(R"O=C1c2cccnc2c2nc(cc3c2c1nc1ccccc31)c1ccncc1")
+smiles(R"O=C1c2cccnc2c2nccc3c4CCCCc4nc1c23")
+smiles(R"O=C1c2cccnc2c2nc(cc3c4ccccc4nc1c23)c1ccccn1")
+smiles(R"O=C1c2cccnc2c2nccc3ccnc1c23")
+smiles(R"O=C1c2cccnc2c2nc(/C=C/c3ccccc3)cc3c2c1nc1ccccc31")
+smiles(R"O=C1c2cccnc2C(=O)c2c1nc1ccccc1c2c1ccc2c3c(nc4ccccc24)C(=O)c2cccnc2c13")
+smiles(R"O=C1[C@@]2(C[C@@H]3C=C[C@H]2C3)C(=O)[C@]21C[C@@H]1C=C[C@H]2C1")
+smiles(R"O=C1[C@]2(C)CN3C[C@@]1(C)C(=O)[C@@](C)(C3)C2=O")
+smiles(R"O=c1c2ccncc2cc2c3[nH]c4ccccc4c3ccn12")
+smiles(R"O=C1[C@@]2(Cl)[C@]3(Cl)[C@]4(Cl)[C@@]2(Cl)[C@]2(Cl)[C@@]1(Cl)[C@@]3(Cl)[C@]2(Cl)[C@]4(Cl)Cl")
+smiles(R"O=C1[C@@]2(Cl)[C@]3(Cl)[C@]4(Cl)[C@@]2(Cl)[C@]2(Cl)[C@@]1(Cl)[C@@]3(Cl)[C@]2(Cl)[C@@]4(Cl)Cl")
+smiles(R"O=C1[C@]2(Cl)[C@H]3CC[C@@H]4[C@@H]5CC[C@H]3[C@@]1(Cl)[C@]5(Cl)[C@]24Cl")
+smiles(R"O=c1c2c(nc3sc4ccccc4c(=O)n23)n(C)c(=O)n1C")
+smiles(R"O=c1c2c(nc3sc4nc5ccccc5nc4n23)n(C)c(=O)n1C")
+smiles(R"O=C1c2cn(C)c(=O)cc2c2nc3ccccc3c3ccnc1c23")
+smiles(R"O=C1[C@@]2(CO[C@@]3(CCCCC3)OC2)CC[C@]21CO[C@@]1(CCCCC1)OC2")
+smiles(R"O=c1c2c(sc3CCCCc23)nc2sn3c(=O)c4c(sc5CCCCc45)nc3n12")
+smiles(R"O=C1c2nc(C)c(C)nc2C(=O)C2=C1[C@H]1c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"Oc1c2OCN(Cc2c(C(=O)O)c2CN(COc12)C1CCCCC1)C1CCCCC1")
+smiles(R"O=C1c2scnc2c2nccc3c2c1nc1ccccc31")
+smiles(R"O=C1C[C@]23CCC[C@]3(C1)CC(=O)C2")
+smiles(R"O=C1C[C@]23CCCCCCCCCC[C@]3(C1)CC(=O)C2")
+smiles(R"Oc1cc2c(cc1O)[C@]1(C)CC[C@@]2(C)c2cc(O)c(O)cc12")
+smiles(R"O=C1C[C@]2(C)C[C@]3(OC[C@](C)(C)CO3)C[C@@]2(C)C1")
+smiles(R"O=C1Cc2ccccn2[Pt@](N)(Cl)O1")
+smiles(R"O=C1C[C@@]2(C)[C@@H](CC[C@@H]2C2(C)OCCO2)[C@H]2CC[C@H]3C[C@]4(OCCO4)CC[C@]3(C)[C@@H]12")
+smiles(R"O=C1C[C@@]2(CCN(CC2)C[C@@H]2COc3ccccc3O2)C(=O)N1N1CCCCCC1")
+smiles(R"O=C1C=C2[C@H](C)CC[C@]3(OCCO3)[C@]2(C)C[C@@H]1O")
+smiles(R"Oc1cc2[nH]c3cccc(C)c3c(=O)c2c2[nH]c3cccc(C)c3c(=O)c12")
+smiles(R"O=C1CC[C@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]19C7=C23")
+smiles(R"O=C1CC[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]19C7=C23")
+smiles(R"O=C1/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/CCC/C/1=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/CCC/C/1=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/COC/C/1=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/COC/C/1=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"Oc1ccc2c3c1c(O)nnc3c1cccc3cccc2c13")
+smiles(R"Oc1ccc2c(c1)[C@]13CCCC[C@@H]3[C@H](N(C)CC1)[C@@]12CC1")
+smiles(R"O=C1C=C[C@]2(C=C1)C[C@@H](NC(=O)C(F)(F)F)C(=O)O2")
+smiles(R"O=C1C=C[C@]2(C=C1)C[C@@H](NC(=O)OCc1ccccc1)C(=O)O2")
+smiles(R"O=C1CC[C@]2(CC1)[C@@H](O)c1ccccc1C2(C)C")
+smiles(R"O=C1CC[C@]2(C)C(=C1C)CCC[C@@]12OCCO1")
+smiles(R"O=C1CC[C@@]2(C)C(=C1)CC[C@H]1[C@@H]2CC[C@]2(C)[C@H](CC[C@@H]12)O[Si@](O[C@H]1CC[C@H]2[C@H]3CCC4=CC(=O)CC[C@]4(C)[C@H]3CC[C@]12C)(O[C@H]1CC[C@H]2[C@H]3CCC4=CC(=O)CC[C@]4(C)[C@H]3CC[C@]12C)c1ccccc1")
+smiles(R"O=C1CC[C@@]2(C)C(=C1)CC[C@@H]1[C@@H]3CC[C@H](O[Si@](C)(C)O[C@H]4CC[C@H]5[C@H]6CCC7=CC(=O)CC[C@]7(C)[C@H]6CC[C@]45C)[C@@]3(C)CC[C@H]21")
+smiles(R"O=c1/c(=C/c2ccc3OCOc3c2)/sc2nnc(c3ccco3)n12")
+smiles(R"O=c1/c(=C/c2ccc3OCOc3c2)/sc2nnc(Cc3ccccc3)n12")
+smiles(R"O=c1/c(=C/c2cccc3ccccc23)/sc2nc3ccccc3n12")
+smiles(R"O=C1CC[C@@]2(CCC[C@@]3(CCC(=O)CC3)C2=O)CC1")
+smiles(R"Oc1ccc2ccccc2c1/C=c/1\sc2nc3ccccc3n2c1=O")
+smiles(R"Oc1ccc2ccccc2c1/C=N/C[C@H]1CC[C@@H](C/N=C/c2c(O)ccc3ccccc23)CC1")
+smiles(R"O[C@]1(C#Cc2ccccc2)c2ccccc2[C@@](O)(C#Cc2ccccc2)c2ccccc12")
+smiles(R"O=c1/c(=C\c2ccc(cc2)/C=c\2/sc3nc4ccccc4n3c2=O)/sc2nc3ccccc3n12")
+smiles(R"O=C1/C(=C/c2ccc(cc2)N(C)C)/CC/C/1=C/c1ccc(cc1)N(C)C")
+smiles(R"O=c1/c(=C/c2ccccc2[N+](=O)[O-])/sc2nc3ccccc3n12")
+smiles(R"O=c1/c(=C/c2ccccc2[N+](=O)[O-])/sc2[nH]c3ccccc3n12")
+smiles(R"O=c1/c(=C\c2ccccc2[N+](=O)[O-])/sc2[nH]nc(c3cccnc3)n12")
+smiles(R"O=c1/c(=C/c2ccccc2[N+](=O)[O-])/sc2[nH]nc(c3ccco3)n12")
+smiles(R"O=c1/c(=C\c2ccccc2[N+](=O)[O-])/sc2nnc(c3cccnc3)n12")
+smiles(R"O=c1/c(=C/c2ccccc2[N+](=O)[O-])/sc2nnc(c3ccco3)n12")
+smiles(R"O=c1/c(=C\c2ccccc2)/sc2nc(nn12)c1ccccc1")
+smiles(R"O=c1/c(=C/c2ccccn2)/sc2nc3cc4OCCOc4cc3n12")
+smiles(R"O=C1/C(=C\c2ccco2)/CC[C@@H]2C[C@@]3(OCCO3)CC[C@@]12C")
+smiles(R"O=c1/c(=C/c2ccco2)/sc2nc3ccccc3n12")
+smiles(R"Oc1ccc2cc(C(=O)Nc3scc(n3)[C@]34C[C@@H]5C[C@@H](C[C@@H](C5)C4)C3)c(=O)oc2c1")
+smiles(R"O=C1CC[C@@]2(C[C@@H]1N)c1ccccc1c1ccccc21")
+smiles(R"O=C1C=C[C@]2(OCCO2)CC[C@@H]1c1cccc(c1)C1(C)OCCO1")
+smiles(R"O=C1CC[C@]2(OCCO2)C[C@@H]1C")
+smiles(R"O=C1CC[C@]2(OCCO2)C[C@H]1CCSc1ccccc1")
+smiles(R"O=C1CC[C@@]2(OCCO2)C[C@H]1CCS(=O)c1ccccc1")
+smiles(R"O=C1CC[C@]2(OCCO2)C[C@H]1[C@H]1C=CCC1")
+smiles(R"O=C1CC[C@]2(OCCO2)[C@@H](C)c2cc(N)c(C)cc2N1Cc1ccccc1")
+smiles(R"O=C1CCC[C@]23[C@@H]4CCC[C@@H]4[C@@]13[C@H]1CCC[C@@H]21")
+smiles(R"O=C1CCCC2=C1[C@@]1(O[C@@H]3C=CC=CN23)C(=O)c2ccccc2C1=O")
+smiles(R"Oc1cc(cc2cc(cc(NS(=O)(=O)c3ccc4[OH+][Pt@@+2]5(N[C@@H]6CCCC[C@H]6N5)[OH+]C(=O)c4c3)c12)[S@](=O)(=[OH+])[O-])[S@](=O)(=[OH+])[O-]")
+smiles(R"Oc1cc(cc2cc(cc(NS(=O)(=O)c3ccc4[OH+][Pt@+2]5(N[C@@H]6CCCC[C@H]6N5)[OH+]C(=O)c4c3)c12)[S@](=O)(=[OH+])[O-])[S@](=O)(=[OH+])[O-]")
+smiles(R"Oc1ccc(cc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Oc1ccc(cc1)[C@@]1(Cl)[C@](Cl)(C(F)(F)F)[C@@]1(Cl)C(F)(F)F")
+smiles(R"Oc1ccc(cc1)[C@@]1(N=C(Nc2ccc(cc2)[S@](=O)(=O)c2ccc(cc2)NC2=N[C@@](c3ccc(O)cc3)(c3ccccc23)c2ccccc2O)c2ccccc12)c1ccccc1O")
+smiles(R"Oc1ccccc1/C=c\1/sc2nc3ccccc3n2c1=O")
+smiles(R"Oc1ccc(cc1)[C@@H]1CC(=O)[C@H](C(=O)Nc2ccccc2)C(=O)C1")
+smiles(R"Oc1ccccc1[C@H]1[N+]2=Cc3ccccc3[OH+][Zr]34562([OH+]c2ccccc2C=[N+]14)[OH+]c1ccccc1C=[N+]5[C@H](c1ccccc1O)[N+]6=Cc1ccccc1[OH+]3")
+smiles(R"Oc1ccc(cc1)[C@H]1N(C2CCCCC2)[C@H](c2ccc(O)cc2)N(C2CCCCC2)[C@H](c2ccc(O)cc2)N1C1CCCCC1")
+smiles(R"Oc1ccccc1[C@H]1N(CC/N=C\c2ccccc2O)CCN1CC/N=C\c1ccccc1O")
+smiles(R"Oc1cccc(c1)[C@@H]1N[Pt@](Cl)(Cl)N[C@@H]1c1cccc(O)c1")
+smiles(R"Oc1cccc(c1)[C@@H]1N[Pt@](Cl)(Cl)N[C@H]1c1cccc(O)c1")
+smiles(R"Oc1cccc(c1)[C@@H]1N[Pt@@](Cl)(Cl)N[C@H]1c1cccc(O)c1")
+smiles(R"Oc1ccc(cc1)[C@@H]1N[Pt@](Cl)(Cl)N[C@@H]1c1ccc(O)cc1")
+smiles(R"Oc1ccc(cc1)[C@@H]1N[Pt@@](Cl)(Cl)N[C@H]1c1ccc(O)cc1")
+smiles(R"Oc1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Oc1ccccc1[C@H](/N=C/c1ccccc1O)/N=C/c1ccccc1O")
+smiles(R"Oc1ccccc1[C@@H](N(C)/N=C\c1ccccc1O)N(C)/N=C\c1ccccc1O")
+smiles(R"Oc1ccc(cc1CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1ccccc1")
+smiles(R"Oc1cc(ccc1/C=N/c1ccccc1)[S@](=O)(=O)c1ccc(/C=N/c2ccccc2)c(O)c1")
+smiles(R"Oc1ccccc1/C(=N\CC/N=C(\C)/c1ccccc1O)/C")
+smiles(R"Oc1ccccc1/C=N/[C@@H]1CC[C@@H](CC1)C[C@H]1CC[C@H](CC1)/N=C/c1ccccc1O")
+smiles(R"Oc1ccccc1/C=N/N1/C(=N\c2ccccc2)/C(=N\c2ccccc2)/N(C1=S)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Oc1ccccc1/C=N/N/C(=N/N=C/c1ccccc1O)/N/N=C/c1ccccc1O")
+smiles(R"Oc1ccccc1C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"Oc1ccccc1C(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"Oc1ccc(cc1)C(=O)CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Oc1ccc(cc1)C(=O)O[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"Oc1ccccc1[Hg]N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"Oc1ccc(cc1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"Oc1ccc(cc1)/N=C/1\CC/C(=C(\c2ccccc2)/c2ccc(cc2)Nc2ccc(O)cc2)/CC1")
+smiles(R"Oc1ccc(cc1/N=N/c1ccc(cc1)[S@@](=O)(=O)c1ccc(/N=N/c2cc(ccc2O)S(=O)(=O)O)cc1)S(=O)(=O)O")
+smiles(R"O=c1/c(=C\C=C\c2ccccc2)/sc2nc3ccccc3n12")
+smiles(R"O[C@]1(CCCCCCCC[C@](O)(CCCCCCCC1)c1ccccc1)c1ccccc1")
+smiles(R"O=C1CC(C)(C)C[C@@H]2C[C@@]3(OCCO3)CC[C@]12C")
+smiles(R"O=C1C[C@@](C)(C)CC(=O)C1C(CC[C@@H]1CCCCC1=O)C1C(=O)C[C@@](C)(C)CC1=O")
+smiles(R"O=C1CCC[C@H]2[C@H]1CCC[C@]12OCCO1")
+smiles(R"Oc1cc(CCNC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)ccc1O")
+smiles(R"Oc1ccc(c(O)c1)/C(=N/N=C(/C)\c1ccc(O)cc1O)/C")
+smiles(R"O[C@]1(CC[C@@H](CC1)C(C)(C)C)Cc1ccccc1")
+smiles(R"O[C@]1(CC[C@H](CC1)C(C)(C)C)C#C[C@]1(O)CC[C@@H](CC1)C(C)(C)C")
+smiles(R"O=C1CC[C@H](C[C@@]21CCCC2)C(C)(C)C")
+smiles(R"O=C1CC[C@H](C(=O)N1)N1C(=O)[C@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@H]2C1=O")
+smiles(R"O=C1CC[C@@H](C(=O)N1)N1C(=O)[C@H]2[C@@H]3CC[C@@H](CC3)[C@H]2C1=O")
+smiles(R"O=C1CC[C@H](C(=O)N1)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1CC[C@@H](C(=O)O[C@@H]2CN3CC[C@@H]2CC3)C(=O)N1")
+smiles(R"O=C1CCCN1c1ccc(Cl)c(c1)NC(=O)C(=O)N[C@H]1CC[N@@H+](CC1)C1CC1")
+smiles(R"O=C1CCCN1[C@H]1C[C@H](C[C@H](C[C@H](C[C@H](C[C@@H](C[C@H](C[C@H](C[C@H](C1)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O)N1CCCC1=O")
+smiles(R"Oc1cc(CN[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)nc(O)n1")
+smiles(R"Oc1cccn(Cc2ccccc2)c1")
+smiles(R"Oc1ccc(O)c2c1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"O=C1C=CC(=O)C2=C1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"O=C1C=CC(=O)C2=C1[C@@H]1c3ccccc3[C@@]2([N+](=O)[O-])c2ccccc12")
+smiles(R"O=C1C=CC(=O)C2=C1[C@H]1c3ccccc3[C@]2([N+](=O)[O-])c2ccccc12")
+smiles(R"Oc1ccc(O)c2c1C(=O)c1sc3nc4c(c(=O)n(C)c(=O)n4C)n3c1C2=O")
+smiles(R"O=C1C=CC(=O)c2c3c([C@H]4c5ccccc5[C@@H]3c3ccccc43)c3[C@@H]4c5ccccc5[C@@H](c5ccccc45)c3c12")
+smiles(R"O=C1C=CC(=O)C(=C1)CNc1ccc(cc1)C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Oc1ccc(O)c(CNc2ccc(cc2)C(=O)O[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c1")
+smiles(R"Oc1ccc(O)c(CNc2ccc(cc2)C(=O)OC[C@]23C[C@H]4C[C@@H](C[C@H](C4)C3)C2)c1")
+smiles(R"O=C1C=CC(=O)[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"O=C1C=CC(=O)[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1C=CC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"O=C1C=CC(=O)[C@H]2[C@H]1[C@@H]1C=C[C@H]2[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"O=C1C=CC(=O)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"O=C1C[C@H]2CC[C@]1(CS(=O)(=O)O)C2(C)C")
+smiles(R"O=C1C[C@@H]2CCCC[C@@H]2[C@@]21SCCS2")
+smiles(R"O=C1C[C@H]2[C@H]3C[C@]4(OCCO4)[C@@H]4[C@H]3C[C@H]2[C@H]14")
+smiles(R"O=C1C[C@H]2[C@H]3C[C@H](C3)[C@@H](C1)N2C")
+smiles(R"O=C1C[C@@H]2[C@H](CC[C@]32OCCO3)c2ccc3ccccc3c12")
+smiles(R"O=C1C[C@@H](c2ccccc2)[C@]2([C@@H](C1)c1ccccc1)C(=O)c1ccccc1C2=O")
+smiles(R"O=C1C[C@H](c2ccco2)[C@]2(C(=O)CCCC2=O)[C@@H](C1)c1ccco1")
+smiles(R"O=C1C[C@@H](C(=O)O)[C@@]2(CCCCCC2)O1")
+smiles(R"O=C1C[C@H](O)C(=O)[OH+][Pt@+2]2(NCCN2)[OH+]1")
+smiles(R"O=C1C[C@@H](Sc2ccccc2)[C@@]2(OCCO2)[C@@H](C1)Sc1ccccc1")
+smiles(R"O=c1c(Cl)c2cc3c(cc2c2ccccc12)nc1ccccc1n3c1ccccc1")
+smiles(R"O=c1c(Cl)c2cc3c(cc2c2ccccc12)nc1ccccc1n3C1CCCCC1")
+smiles(R"Oc1ccnc2c1C(=O)c1nc3ccccc3c3ccnc2c13")
+smiles(R"Oc1cc(Nc2ccc3nn(C)nc3c2)c2c(ccc3nn(C)nc23)n1")
+smiles(R"O[C@@]1(CCN(CC1)C1CC1)c1cccc(c1)C(F)(F)F")
+smiles(R"Oc1ccn(CC(=O)N2CC[C@@]3(CC2)SS[C@]2(CCN(CC2)C(=O)Cn2ccc(O)cc2=O)S3)c(=O)c1")
+smiles(R"O=c1ccn(CC(=O)N2CC[C@]3(CC2)SS[C@@]2(CCN(CC2)C(=O)Cn2ccc(=O)[nH]c2=O)S3)c(=O)[nH]1")
+smiles(R"O=c1cc[nH]c(C)c1OC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C1CC(=O)N([C@H]2CC[C@@H](CC2)C2CCCCC2)C(=O)N1")
+smiles(R"O=C1CC(=O)O[Pt@@]2(O1)N[C@H]1CCCC[C@@H]1[C@H]1CCCC[C@@H]1N2")
+smiles(R"O=C1CC(=O)O[Pt@]2(O1)N[C@H]1CCCC[C@@H]1N2")
+smiles(R"O=C1CC(=O)O[Pt@@]2(OC(=O)C1)N[C@@H]1CCCC[C@H]1N2")
+smiles(R"O=C1CC(=O)O[Ti]23456789(O1)([C@@H]1C4=C3C2=C51)[C@H]1C8=C7C6=C91")
+smiles(R"O=C1[C@H]2C[C@]3(OCCO3)C[C@@H](C1=O)N2Cc1ccccc1")
+smiles(R"O=C1[C@H]2CC=CC[C@@H]2C(=O)[C@]21CCc1ccccc21")
+smiles(R"O=C1[C@H]2CCC[C@H]1[C@@]1(O)CCCC[C@@H]1[C@H]2[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1[C@H]2CCC[C@H]1[C@@]1(O)CCCC[C@@H]1[C@H]2[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1[C@@H]2CCN(CC2)/C/1=C\c1ccc(OCc2ccccc2)c(OCc2ccccc2)c1")
+smiles(R"O=C1[C@H]2CCN(CC2)[C@@H]1CN1CC[C@]2(CC1)C(=O)NCN2c1ccccc1")
+smiles(R"O[C@]1([C@H]2CCN(CC2)[C@H]1CN1CCOCC1)c1ccccc1")
+smiles(R"O=C1[C@H]2[C@H]3CC[C@H](C3)[C@@H]2[C@@H](O)[C@H]2[C@H]3CC[C@H](CC3)[C@@H]12")
+smiles(R"O=C1[C@H]2[C@H]3C=C[C@H](C3)[C@H]2C(=O)[C@@]1(Br)Br")
+smiles(R"O=C1[C@H]2[C@H]3CC[C@H](C3)[C@H]2C(=O)[C@H]2[C@H]3CC[C@H](CC3)[C@@H]12")
+smiles(R"O=C1[C@H]2[C@H](C[C@@]32SCCS3)[C@@]2(C)OC[C@H](c3ccccc3)N12")
+smiles(R"O=C1[C@H]2[C@@H](N[C@@H](c3ccccc3)[C@@H]1[C@@H](N[C@H]2c1ccccc1)c1ccccc1)c1ccccc1")
+smiles(R"O=C1[C@@H](C)[N@+]2(CCCCCC2)[C@@H](C)CC1(c1ccccc1)c1ccccc1")
+smiles(R"O=C1[C@@H](Sc2ccccc2)[C@@H](c2ccccc2)[C@@H]1Sc1ccccc1")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Al]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Ba]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Ca]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Cd]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Co]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Cu]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Fe]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Mg]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Mn]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@+]45CC(=O)O[Mo]675(=O)(OC(=O)C4)O[Mo]37(=O)(O1)(OC(=O)C2)O6")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Ni]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Pb]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@@+]23CC[N@@+]45CC(=O)O[Zn]35(O1)(OC(=O)C2)OC(=O)C4")
+smiles(R"O=C1C[N@+]23CCO[Fe]453(O1)OC(=O)C[N@+]5(CC2)CC(=O)O4")
+smiles(R"O=C1C[N@+]23CC(=O)[OH+][Mn+2]453([OH+]1)[OH+]C(=O)C[N@@+]5(CC(=O)[OH+]4)[C@H](C)C2")
+smiles(R"O=C1CN2CCN3CC(=O)NC(=O)[C@H]3[C@H]2C(=O)N1")
+smiles(R"O=C1CN2C(=O)CN3C4=[S+][Cu@]56OC(=O)CN5C(=O)CN6C4=[S+][Cu@@]23O1")
+smiles(R"O=C1CN(c2ccccc2)C(=O)CN1/N=C/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C1CN(C(=O)CN1c1ccccc1)N1C(=O)CS[C@@H]1[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Oc1c(/N=N/c2ccc(C(=O)Nc3ccc(cc3)[S@@](=O)(=O)c3ccc(cc3)NC(=O)c3ccc(/N=N/c4cc(c5cccnc5c4O)S(=O)(=O)O)cc3S(=O)(=O)O)c(c2)S(=O)(=O)O)cc(c2cccnc12)S(=O)(=O)O")
+smiles(R"O=C1C(=O)[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"O[C@@]1(CSC[C@@]1(O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C1CS[C@@H](N1c1nccs1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C1N2Cc3c4OCCOCCNCCOCCOc5ccc6OCCOCCNCCOCCOc(cc4)c3CN3C(=O)N4Cc6c5CN1[C@]4(c1ccccc1)[C@]23c1ccccc1")
+smiles(R"O=c1n2c(cc3ccccc23)c(=O)n2c1cc1ccccc21")
+smiles(R"O=c1n2c(nc3ccccc23)c(=O)n2c1nc1ccccc21")
+smiles(R"O=C1N2O[C@@H]3CCC[C@]2(C3)C(=O)[C@]21CCCCC2")
+smiles(R"Oc1nc2cc3cn[nH]c3cc2c(O)n1")
+smiles(R"O=C1N(c2ccc3c(Cc4ccccc34)c2)C(=O)[C@H]2[C@@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"O=C1N[C@@]2(CCCC2)[C@H]2CCCC[C@@]12O")
+smiles(R"O=C1N[C@]2(CCCC2)C(=O)[C@]21CCCC2")
+smiles(R"O=C1N[C@]2(CCCC2)[C@](O)(CCc2ccccc2)[C@@]21CCCC2")
+smiles(R"O=C1N[C@@]2(CCCC2)C(=O)N[C@@H]1Cc1ccccc1")
+smiles(R"O=C1N(c2cccc3ccccc23)C(=O)[C@H]2[C@@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1Nc2ccccc2/C/1=c/1\sc2nc3ccccc3n2c1=O")
+smiles(R"O=C1Nc2ccccc2[C@@]1(O)CC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1Nc2ccccc2[C@@]1(O)CC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1Nc2ccccc2[C@@]1(O)CC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"Oc1nc2ccccc2c2ccccc2nc(O)c2ccccc12")
+smiles(R"O=C1N[C@]2(CCCC=C2)[C@](C)(O)[C@]21CCCCC2")
+smiles(R"O=C1N[C@@]2(CCCCC2)[C@@H](C)[C@@]21CCCCC2")
+smiles(R"O=C1N[C@@]2(CCCCC2)[C@H](N)[C@@]21CCCCC2")
+smiles(R"O=C1N[C@@]2(CCCCC2)[C@H]([N+](C)(C)C)[C@]21CCCCC2")
+smiles(R"O=C1N[C@]2(CCCC=C2)[C@H](O)[C@@]21CCCCC2")
+smiles(R"O=C1N[C@@]2(CCCCC2)[C@H](O)[C@@]21CCCCC2")
+smiles(R"O=C1N[C@]2(CCC=CC2)C(=O)[C@@]21CCCCC2")
+smiles(R"O=C1N[C@@]2(CCCC=C2)[C@](O)(c2ccccc2)[C@]21CCCCC2")
+smiles(R"O=C1N[C@]2(CCCC=C2)[C@](O)(C#Cc2ccccc2)[C@]21CCCCC2")
+smiles(R"O=C1N(c2ccccc2)C(=O)[C@@H]2[C@@H]1[C@]1(C=C3c4ccccc4N(C(=O)c4ccccc4)[C@@]23[C@@H]2C(=O)N(c3ccccc3)C(=O)[C@@H]12)[N+](=O)[O-]")
+smiles(R"O=C1N(c2ccccc2)C(=O)[C@@H]2[C@@H]1[C@@]1(C=C3c4ccccc4N(C(=O)c4ccccc4)[C@]23[C@@H]2C(=O)N(c3ccccc3)C(=O)[C@@H]12)[N+](=O)[O-]")
+smiles(R"O=C1N(c2ccccc2)C(=O)[C@H]2[C@@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1N(c2ccccc2)C(=O)[C@H]2[C@@H]1[C@H]1c3ccccc3[C@@H]2[S@]1(=O)=O")
+smiles(R"O=c1n(c2ccccc2)c(=O)n2[C@H]3CC[C@H](CC3)n12")
+smiles(R"O=c1n(c2ccccc2)c(=O)n2[C@H]3[C@H]4[C@@H]5[C@H]4[C@H]4[C@H]([C@@H]34)[C@@H]5n12")
+smiles(R"O=c1n(c2ccccc2)c(=O)n2n1[C@](C)(C13C[C@H]4C[C@H](C[C@H](C4)C3)C1)[C@@]2(C)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=c1n(c2ccccc2)c(=O)n2n1[C@H]1C[C@@H]3c4ccccc4[C@H]1[C@H]2[C@@]13CC1")
+smiles(R"O=C1N(c2ccc(cc2)S(=O)(=O)N)C(=O)[C@H]2[C@@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1N[C@@]2(CCCCCC2)[C@@H]2CCCCCC[C@]12O")
+smiles(R"Oc1nc2c(nc1N[C@@]13C[C@H]4C[C@H](C[C@H](C4)C3)C1)c(=O)oc1ccccc21")
+smiles(R"Oc1nc2nc3c(nc2c(N)n1)c1cccc2cccc3c12")
+smiles(R"Oc1nc2nc3c(nc2c(O)n1)c1cccc2cccc3c12")
+smiles(R"O=C1N[C@@]2(NC(=O)N[C@@]2(N1)c1ccccc1)c1ccccc1")
+smiles(R"O=C1N(Cc2ccccc2)[C@@H]2C[S@@](=O)(=O)C[C@@H]2N1Cc1ccccc1")
+smiles(R"O=C1N[C@](C)(C2CC2)C(=O)N1C[NH+]1CC[C@H](CC1)c1nc2ccccc2o1")
+smiles(R"Oc1ncccc1OC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C1NCCCC[C@H]1NC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1NCCCC[C@H]1NC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1NCCCC[C@H]1NC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=O)N[C@@H]3CCCCNC3=O)C6=C12")
+smiles(R"O=C1NCCCC[C@H]1NC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(C(=O)N[C@@H]3CCCCNC3=O)C6=C12")
+smiles(R"Oc1nccc(CN[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)c1O")
+smiles(R"O=C1NC[C@H]2CC[C@]3(OCCO3)C[C@H]2C1")
+smiles(R"O=c1n(C)c(=O)n2[C@H]3CC[C@H](CC3)n12")
+smiles(R"O=C1N[C@@H]2C[C@@H]3CCC[C@H](c4ccccc4)[C@H]3[C@@]2(O)[C@]21CCCCC2")
+smiles(R"O=C1N[C@H]2C[S@](=O)(=O)C[C@H]2N1")
+smiles(R"O=C1N[C@@H]2NC(=O)N[C@@H]2N1")
+smiles(R"O=C1N[C@@H](c2ccco2)N(C)[C@@]21CCN(CC2)Cc1ccccc1")
+smiles(R"O=C1N[C@@H](C)[C@]2(O1)c1ccccc1c1ccccc21")
+smiles(R"O=C1N(Cl)[C@@H]2N(Cl)C(=O)N(Cl)[C@@H]2N1Cl")
+smiles(R"O=c1n(cnc2ccccc12)/N=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=c1n(cnc2ccccc12)/N=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C1NCN(c2ccccc2)[C@@]21CCN(CC2)C[C@H]1COc2ccccc2O1")
+smiles(R"O=C1N=C(NC2CCCCC2)[C@]2(CCN(CC2)C[C@H]2COc3ccccc3O2)N1c1ccccc1")
+smiles(R"Oc1nc(N)c2nc3c4cccc5cccc(c3nc2n1)c45")
+smiles(R"Oc1nc(N)c2nc3c(nc2n1)c1cccc2cccc3c12")
+smiles(R"O=C1NC(=O)[C@]23[C@H]4CC[C@H](C=C4)[C@@]13C(=O)NC2=O")
+smiles(R"O=C1NC(=O)C2=C1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1NC(=O)[C@@]2(C[C@@]2(C)c2ccccc2)C(=O)N1")
+smiles(R"O=C1NC(=O)[C@]2(CC(=C(C)C[C@@H]2C)C)C(=O)N1")
+smiles(R"O=C1NC(=O)[C@@]2(CC=CC[C@@H]2C(C)C)C(=O)N1")
+smiles(R"O=C1NC(=O)[C@]2(CC[C@@H](CC2)C2CCCCC2)N1")
+smiles(R"O=C1NC(=O)[C@@]2(CC[C@@H](CC2)C2CCCCC2)N1")
+smiles(R"O=C1NC(=O)[C@]2(C[C@@H]3CC[C@H]2C3)C(=O)N1")
+smiles(R"O=C1NC(=O)[C@]2(CCN(CC2)C[C@H]2COc3ccccc3O2)C(=O)N1")
+smiles(R"O=C1NC(=O)[C@@]2(C(=O)N1)[C@@H](CC(=O)C[C@H]2c1ccc(cc1)N(C)C)c1ccc(cc1)N(C)C")
+smiles(R"O=C1NC(=O)[C@@]2(C[Si](C)(C)CC[C@@H]2C)C(=O)N1")
+smiles(R"Oc1nc(O)c2nc3c4cccc5cccc(c3nc2n1)c45")
+smiles(R"O=C1NC(=O)[C@]2(Nc3cc(Cl)c(Cl)cc3N(C)[C@@H]2O)C(=O)N1")
+smiles(R"O=C1NC(=O)[C@]2(O[C@@H]3c4ccccc4C=NN3C3=C2C(=O)CCC3)C(=O)N1")
+smiles(R"O=C1NC(=O)[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1NC(=O)[C@H]2C(=O)NC(=O)[C@@H]1[C@@]12CCc2ccccc12")
+smiles(R"O=C1NC(=O)[C@@H]2C(=O)NC(=O)[C@H]1[C@@H]2c1c(Cl)cccc1Cl")
+smiles(R"O=C1NC(=O)[C@H](C1)N1C(=O)[C@H]2[C@@H]3CC[C@@H](CC3)[C@H]2C1=O")
+smiles(R"Oc1nc(S)nc(c1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=c1[nH]c2cc3c(oc4ccccc34)cc2n2cccc12")
+smiles(R"O=c1[nH]c2cccc3CCCn(c23)c(c1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=c1[nH]c2ccccc2[nH]c(c1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=c1[nH]c(=O)c2c(n1)n(CC(O)C(O)C(O)COP(=O)(O)O)c1cc(C)c(C)cc1[n+]2S(=O)(=O)[O-]")
+smiles(R"O=c1[nH]c(=O)c2c([nH]1)n(CC(O)C(O)C(O)COP(=O)(O)O)c1cc(C)c(C)cc1[n+]2S(=O)(=O)[O-]")
+smiles(R"O=c1[nH]c(=O)n(cc1C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=c1[nH]c(=O)n(cc1C)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=c1[nH]c(=O)n(cc1F)CC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=c1[nH]c(=O)n(cc1F)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C1N([Hg]c2ccccc2)C(=O)[C@@H]2[C@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"O=C1N([Hg]c2ccco2)C(=O)[C@@H]2[C@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1N([Hg]c2cccs2)C(=O)[C@@H]2[C@H]1[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"O=c1[nH][nH]c(=O)n2c3cc(oc3cc12)c1ccccc1")
+smiles(R"O=C1NN[C@H]2NC(=O)[C@@]3(NN2C1=O)c1ccccc1c1ccccc31")
+smiles(R"Oc1nnc(O)c2nc3c(nc12)c1nc2c(O)nnc(O)c2nc1c1nc2c(O)nnc(O)c2nc31")
+smiles(R"O=C1NNC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"O=C1N(NC(=O)[C@H]2[C@@H]3c4ccccc4[C@H]([C@@H]12)c1ccccc31)c1ccccc1")
+smiles(R"O=C1N(O)[C@@]2(CCCC=C2)C(=O)N[C@]21CCCCC2")
+smiles(R"O=c1oc2c3ccccc3c3ccccc3c2c2oc3c(c12)c1ccccc1c1ccccc31")
+smiles(R"O=C1Oc2c(=C1C(C)(C)C)n1nnnc1c2C(C)(C)C")
+smiles(R"O=c1oc2cc3ccccc3cc2c2c3ccccc3ccc12")
+smiles(R"O=C1O[C@]2(CC[C@@]3(CC2)OC(=O)C(=C)C3)CC1=C")
+smiles(R"O=C1O[C@]2(CCCC2)O[C@H]1c1ccccc1")
+smiles(R"O=C1O[C@]2(CCCC2)OC(=O)/C/1=C\C=C\c1ccc(o1)[N+](=O)[O-]")
+smiles(R"O=C1O[C@@]2(CCCC2)OC(=O)/C/1=C\C=C\c1ccc(o1)[N+](=O)[O-]")
+smiles(R"O=C1OC2=C(CCCC2)[C@H](N2CCCCC2)[C@]21SCCCS2")
+smiles(R"O=c1oc2ccccc2c(O)c1C(c1c(=O)oc2ccccc2c1O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82")
+smiles(R"O=c1oc2ccccc2c(O)c1C(c1c(=O)oc2ccccc2c1O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82")
+smiles(R"O=C1OC[C@]2(CO1)C[C@H]1C=C[C@@H]2C1")
+smiles(R"O=C1OCC[C@]21CCCC[C@]12OCCO1")
+smiles(R"O=C1OC[C@@H]2C[C@@H]3c4ccccc4[C@]12c1ccccc31")
+smiles(R"O=C1O[C@H]2CC[C@@H]3[C@@H](O)C[C@H](O)[C@H]3C[C@H]2[C@@H]1CNC[C@H]1CC[C@@H](CC1)C(=O)O")
+smiles(R"O=C1O[C@@H]2[C@H](O1)[C@@]1(Cl)C(=C(Cl)[C@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"O=C1O[C@H]2[C@@H](O1)[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"O=C1OC(=O)[C@]23CC[C@H](CC2)[C@H]2CC[C@@]13CC2")
+smiles(R"O=c1oc(=O)c2c1c1c(=O)oc(=O)c1c1c(=O)oc(=O)c21")
+smiles(R"O=C1OC(=O)[C@]2(C)c3ccccc3[C@H]1c1ccccc21")
+smiles(R"O=C1OC(=O)[C@@]2(C)[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"O=C1OC(=O)[C@H]2C[C@@H]3[C@H](C[C@H]12)[C@]1(Cl)C(=C(Cl)[C@@]3(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1OC(=O)[C@H]2[C@@H]1[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@@]1(Cl)Cl)Cl")
+smiles(R"O=C1OC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@@]2(Br)c2ccccc12")
+smiles(R"O=C1OC(=O)[C@H]2[C@@H]1[C@H]1c3ccccc3[C@]2(C)c2ccccc12")
+smiles(R"O=C1OC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@@]2(O)c2ccccc12")
+smiles(R"O=C1OC(=O)[C@@H]2[C@H]1[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"O=C1OC(=O)[C@H]2[C@@H]1[C@H]1C=C[C@@H]2[C@]1(c1ccccc1)c1ccccc1")
+smiles(R"O=C1OC(=O)[C@H]2[C@H]1[C@H]1C=C[C@@H]2[C@@]1(c1ccccc1)c1ccccc1")
+smiles(R"O=C1OC(=O)[C@H]2[C@H]1[C@H]1CC[C@@H]2[C@]1(c1ccccc1)c1ccccc1")
+smiles(R"O=C1OC(=O)[C@H]2[C@@H]1[C@@H]1[C@@H]3C(=O)OC(=O)[C@@H]3[C@H]2C(=C1c1ccccc1)c1ccccc1")
+smiles(R"O=C1[OH+][Pt@@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]C(=O)[C@H]1N")
+smiles(R"O=C1[OH+][Pt@@+2]2(N[C@@H]3CCCC[C@H]3N2)[OH+]P1(=O)[O-]")
+smiles(R"O=C1[OH+][Pt@+2]2(N[C@@H]3CCCC[C@H]3N2)[OH+]P1(=O)[O-]")
+smiles(R"O=C1O[Mn]2345OC(=O)C[N@@+]4(C1)C[C@@H](C)[N@@+]5(CC(=O)O2)CC(=O)O3")
+smiles(R"O=C1O[Mo]23(=O)(OC(=O)C[C@@](O)(C1)C(=O)O2)O[Mo]12(=O)(OC(=O)C[C@](O)(CC(=O)O1)C(=O)O2)O3")
+smiles(R"Oc1on[n+](c1)[C@]12CC[C@H](c3ccccc13)c1ccccc21")
+smiles(R"O=C1O[Pd@]23OC(=O)[C@H](Cc4nc[nH]c4)N3CN2[C@H]1Cc1nc[nH]c1")
+smiles(R"O=C1O[Pt@]2(NC[C@H]3CCCC[C@H]3N2)OC1=O")
+smiles(R"O=C1O[Pt@@]2(N[C@@H]3CCCC[C@@H]3N2)OC1=O")
+smiles(R"O=C1O[Pt@]2(N[C@H]3CCCC[C@@H]3N2)OC(=O)c2cc(ccc12)[N+](=O)[O-]")
+smiles(R"O=C1O[Pt@@]2(N[C@H]3CCCC[C@@H]3N2)OC(=O)c2cc(ccc12)[N+](=O)[O-]")
+smiles(R"O=C1O[Pt@@]2(N[C@H]3CCCC[C@@H]3N2)OC(=O)C(=C1O)O")
+smiles(R"O=C1O[Pt@]2(N[C@@H]3CCCC[C@H]3N2)OC(=O)[C@@H]1C")
+smiles(R"O=C1O[Pt@]2(OC1=O)N[C@H](c1ccccc1)[C@H](N2)c1ccccc1")
+smiles(R"O=C1O[Pt@](N)(NC2CCC2)OC(=O)[C@H]2CCCC[C@H]12")
+smiles(R"O=C1O[Ti]23456789(OC1=O)([C@@H]1C4=C3C2=C51)[C@@H]1C8=C7C6=C91")
+smiles(R"O=C1P2(=O)[OH+][Pt@@+2]3(N[C@H]4CCCC[C@H]4N3)[OH+]P1(=O)[OH+][Pt@@+2]1(N[C@H]3CCCC[C@@H]3N1)[OH+]2")
+smiles(R"O=C([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"OC[C@]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(C6=C12)[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"O=C[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"OC[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"OC[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(CO)C6=C12")
+smiles(R"OC[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@@-]8(CO)C6=C12")
+smiles(R"OC[C@@]12C[C@@]3(OCCO3)CC[C@H]2[C@H](C)C=C[C@H]1O")
+smiles(R"O=C[C@@]12CC=C3O[C@H]4O[C@]5(CCCCC5)O[C@H]4[C@H]3[C@H]2C(=O)C=CC1=O")
+smiles(R"OC[C@@]12CCCC[C@H]2C[C@@]2(OCCO2)CC1")
+smiles(R"OC[C@@]12[C@@H]3[C@H]4[C@H]5[C@@H]3[C@@H]1[C@H]5[C@@H]24")
+smiles(R"O=C[C@]12[C@H]3C(=O)NC(=O)[C@H]3[C@H](c3ccccc13)c1ccccc21")
+smiles(R"OC[C@@]12CO[C@H](c3ccc(cc3)NC(=O)C)N2[C@H](OC1)c1ccc(cc1)NC(=O)C")
+smiles(R"O=Cc1c2c3[nH]c4ccccc4c3ccn2c2ccccc12")
+smiles(R"O/C=c\1/cc2cc(/C(=N\N)/c3ccccc3)c3nnc(c4ccccc4)c3cc2c1")
+smiles(R"OC[C@]1(C)C=C2C(=C(C)[C@@]3(CC3)[C@@](C)(O)C2=O)[C@H]1O")
+smiles(R"OC[C@@]1(C)C=C2C(=C(C)[C@]3(CC3)[C@](C)(O)C2=O)[C@H]1O")
+smiles(R"OC[C@]1(C)C=C2C(=C(C)[C@@]3(CC3)[C@](C)(O)[C@@H]2O)[C@H]1O")
+smiles(R"OC[C@@]1(C)C=C2C(=C(C)[C@@]3(CC3)C(=O)[C@]2(C)O)[C@H]1O")
+smiles(R"O=Cc1ccc2c(no[n+]2[O-])c1")
+smiles(R"O=Cc1ccc2[N+]([O-])ONc2c1")
+smiles(R"O=C(c1ccccc1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(c1ccccc1)[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@-]9(C(=O)c2ccccc2)C7=C41")
+smiles(R"O=C(c1ccccc1)[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@@-]9(C(=O)c2ccccc2)C7=C41")
+smiles(R"O=C(c1ccccc1)[C@-]12[Ru+2]3456789(C(=C26)C3=C15)C1=C8[C@@-]9(C(=O)c2ccccc2)C7=C41")
+smiles(R"O=C(c1ccccc1)[C@@-]12[Ru+2]3456789(C(=C26)C3=C15)C1=C8[C@-]9(C(=O)c2ccccc2)C7=C41")
+smiles(R"O=C(c1ccccc1)c1ccc2c(n[se][n+]2C)c1")
+smiles(R"O=C(c1ccccc1)c1ccc2[n+](C)[se][nH]c2c1")
+smiles(R"O=C(c1ccccc1)c1ccc2[nH]c(=O)c3ccccc3ssc3ccccc3c(=O)[nH]c2c1")
+smiles(R"O=C(c1ccccc1)c1ccc2[nH][se][n+](C)c2c1")
+smiles(R"O=C(c1ccccc1)c1ccc2n[se]nc2c1")
+smiles(R"O=C(c1ccccc1)c1ccc2n[se][n+](C)c2c1")
+smiles(R"OC(c1ccccc1)(c1ccccc1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OC(c1ccccc1)(c1ccccc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OC(c1ccccc1)(c1ccccc1)[C@@H]1C[C@]2(C1)C[C@H](C2)C(O)(c1ccccc1)c1ccccc1")
+smiles(R"OC(c1ccccc1)(c1ccccc1)[C@@H]1CC[C@@H](C(O)(c2ccccc2)c2ccccc2)[S@]1(=O)=O")
+smiles(R"OC(c1ccccc1)(c1ccccc1)[C@@H]1C[C@@H]2CC[C@H]1CC2")
+smiles(R"O=C(c1ccccc1)c1ccccc1NC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=Cc1ccc(cc1)c1nnc2n[nH]c(=S)n2n1")
+smiles(R"O=C(c1ccccc1)[C@H]1[C@H](/C=C/c2ccccc2)[C@@H](C(=O)c2ccccc2)[C@H]1/C=C/c1ccccc1")
+smiles(R"O=C(c1ccccc1)[C@@H]1[C@@H](N=N[C@@]21c1ccccc1Oc1ccccc21)c1ccccc1")
+smiles(R"O=C(c1ccccc1)[C@@H]1C(=[O+][Cu@@]2([O+]=C1c1ccccc1)[O+]=C(c1ccccc1)[C@@H](C(=O)c1ccccc1)C(=[O+]2)c1ccccc1)c1ccccc1")
+smiles(R"O=C(c1ccccc1)n1c(Cc2ccccc2)nc2cc(ccc12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(c1ccccc1)N1S[C@]2(c3ccccc3c3ccccc23)C(C)(C)[C@H]1N1CCCC1")
+smiles(R"O=C(c1ccccc1)N1S(=O)[C@@]2(c3ccccc3c3ccccc23)C(C)(C)[C@H]1N1CCCC1")
+smiles(R"OC[C@]1(C)CCC[C@@]21OCCO2")
+smiles(R"O=C(c1ccccn1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C[C@@]1(CC[C@@H](CC1)C(C)(C)C)NS(=O)(=O)c1ccc(C)cc1")
+smiles(R"OC[C@]1(C[C@H](Cc2ccccc2)C1)Cn1ccc(=O)[nH]c1=O")
+smiles(R"OC[C@@]1(C)[C@H](CC[C@]21OCCO2)C=C(C)C")
+smiles(R"O=C(c1ccncc1)N1C[C@H](C(=O)NCC(C)(C)N2CCOCC2)[C@]2(CC[NH2+]CC2)C1")
+smiles(R"OCC1=C(CO)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl")
+smiles(R"OC[C@@]1(CNc2cc(Cl)nc(N)n2)C[C@H](Cc2ccccc2)C1")
+smiles(R"OC[C@@]1(CNc2cc(Cl)nc(N)n2)C[C@H](CCCCc2ccccc2)C1")
+smiles(R"OC[C@@]1(CNc2nc(N)ncc2Cl)C[C@H](CCc2ccccc2)C1")
+smiles(R"OC[C@@]1(CNc2nc(N)ncc2N)C[C@@H](CCc2ccccc2)C1")
+smiles(R"OC[C@@]1(CNc2nc(N)nc(Cl)c2N)C[C@@H](Cc2ccccc2)C1")
+smiles(R"OC[C@@]1(CNc2nc(N)nc(Cl)c2N)C[C@H](CCc2ccccc2)C1")
+smiles(R"OC[C@@]1(CNc2nc(N)nc(Cl)c2N)C[C@@H](CCCc2ccccc2)C1")
+smiles(R"OC[C@@]1(CNc2nc(N)nc(Cl)c2N)C[C@@H](CCCCc2ccccc2)C1")
+smiles(R"OC[C@]1(CNc2nc(N)nc(Cl)c2N)C[C@@H](OCc2ccccc2)C1")
+smiles(R"OC[C@]1(CNc2nc(N)nc(Cl)c2/N=N/c2ccc(Cl)cc2)C[C@H](OCc2ccccc2)C1")
+smiles(R"OC[C@@]1(CNc2nc(N)nc(Cl)c2/N=N/c2ccc(Cl)cc2)C[C@@H](OCc2ccccc2)C1")
+smiles(R"O=Cc1cnn(n1)c1ccccc1")
+smiles(R"O=Cc1nc2ccccc2cc1C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"O=Cc1nc2ncnc3ccn1c23")
+smiles(R"O=C(c1nccc2ccccc12)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(c1nccc2ccccc12)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=Cc1nnc2n[nH]c(=S)n2n1")
+smiles(R"OC[C@@]1(O)C[C@@H](CNc2cc(Cl)nc(N)n2)C1")
+smiles(R"OC[C@]1(O)C[C@H](COc2cc(Cl)nc(N)n2)C1")
+smiles(R"OCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(/C=C\1/[C@@]2(CCCC=C2)NC(=O)[C@@]21CCCCC2)c1ccccc1")
+smiles(R"O=C(Cc1ccccc1)C/C(=N/CC/N=C(/C)\CC(=O)Cc1ccccc1)/C")
+smiles(R"O=C(Cc1ccccc1)O[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"OCC[C@]1(CCC(C)C)C(=O)N/C(=N)/NC1=O")
+smiles(R"OCC[C@@]1(C)C(=O)N/C(=N)/NC1=O")
+smiles(R"O=C(Cc1nc2nncn2/c/1=C/C(=O)C(c1ccccc1)c1ccccc1)C(c1ccccc1)c1ccccc1")
+smiles(R"O=C(/C=c/1\[nH]c2ccc(cc2nc1N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-])c1ccccc1")
+smiles(R"O=C(/C=c/1\[nH]c2ccc(cc2nc1NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-])c1ccccc1")
+smiles(R"OCCc1nnn(C)n1")
+smiles(R"OCCc1nnn(n1)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OCCc1nnnn1C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OCCc1nnnn1C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OCCC1=NNN(N1)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(Cc1sc2ccccc2n1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(/C=c/1\s/c(=C/C(=O)c2ccccc2)/s1)c1ccccc1")
+smiles(R"O=C(/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1ccco1")
+smiles(R"O=C(/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1ccco1")
+smiles(R"O=C(/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1cccs1")
+smiles(R"O=C(/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1cccs1")
+smiles(R"O=C(/C=C/c1ccccc1)[C@@]12C3=C4C5=C1[Fe]16782345[C@@H]2C7=C6C1=C82")
+smiles(R"O=C(C(Cc1ccccc1)Cc1ccccc1)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82")
+smiles(R"O=C(C(Cc1ccccc1)Cc1ccccc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82")
+smiles(R"O=C(/C=C/c1ccccc1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(/C=C/c1ccccc1)Nc1ccccc1SCCCN1CC[C@]2(CC1)C(=O)N(C)CN2c1ccccc1")
+smiles(R"O=C(CCc1ccccc1)N[C@@H]1CC[C@@H](CC1)c1ccc(O)c(C)c1")
+smiles(R"O=C(CCC1CCCCC1)O[C@H]1CC[C@H](CC1)C(C)C")
+smiles(R"O=C(/C=C/c1ccccc1)O[C@@H](COC(=O)/C=C/c1ccccc1)COC(=O)/C=C/c1ccccc1")
+smiles(R"O=C(/C=C/c1cccnc1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(/C=C/c1cccnc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(/C=C/c1ccco1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(/C=C/c1ccco1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(/C=C/c1cccs1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(/C=C/c1cccs1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(CCc1nnc2s/c(=C\c3ccc4OCOc4c3)/c(=O)n12)Nc1cc(Cl)ccc1Cl")
+smiles(R"O=C(CCc1nnc2s/c(=C\c3ccccc3Cl)/c(=O)n12)Nc1cc(Cl)ccc1Cl")
+smiles(R"O=C(CCc1nnc2s/c(=C\c3ccccc3)/c(=O)n12)Nc1cc(Cl)ccc1Cl")
+smiles(R"O=C(CCc1nnc2s/c(=C\c3ccc(cc3)N(C)C)/c(=O)n12)Nc1c(C)cccc1C")
+smiles(R"O=C(CCc1nnc2s/c(=C\c3cccc(c3)[N+](=O)[O-])/c(=O)n12)Nc1ccc(C)cc1")
+smiles(R"O=C(CCc1nnc2s/c(=C\c3ccc(cc3)[N+](=O)[O-])/c(=O)n12)Nc1ccc(Cl)c(Cl)c1")
+smiles(R"O=C(CCc1nnc2s/c(=C/c3ccccc3[N+](=O)[O-])/c(=O)n12)Nc1cc(Cl)c(Cl)cc1Cl")
+smiles(R"O=C(CCc1nnc2s/c(=C\c3ccc(Cl)c(Cl)c3)/c(=O)n12)Nc1ccc(Cl)c(Cl)c1")
+smiles(R"O=C(CCc1nnc2s/c(=C\C=C\c3ccccc3)/c(=O)n12)Nc1ccc(C)cc1")
+smiles(R"O=C(CCc1n[nH]c2s/c(=C\c3cccc(c3)[N+](=O)[O-])/c(=O)n12)Nc1ccc(C)cc1")
+smiles(R"O=C(CCc1n[nH]c2s/c(=C\c3ccc(cc3)[N+](=O)[O-])/c(=O)n12)Nc1ccc(Cl)c(Cl)c1")
+smiles(R"O=C(CCc1n[nH]c2s/c(=C/c3ccccc3[N+](=O)[O-])/c(=O)n12)Nc1cc(Cl)c(Cl)cc1Cl")
+smiles(R"OCCC[C@@]1(O)C[C@@H](CC[C@@]21OCCO2)C(C)(C)C")
+smiles(R"O=C(CCCCCCCCc1ccn2c(=c3cc(C)ccn3[Ru+2]342(n2ccccc2=c2ccccn32)n2ccccc2=c2ccccn42)c1)NC1C2CC3CC(C2)CC1C3")
+smiles(R"OCCCCCCCCCCCOc1ccc(cc1)[C@H]1OC[C@@]2(CO1)CO[C@@H](OC2)c1ccc(OCCCCCCCCCCCO)cc1")
+smiles(R"O=C(CCCCCCC(=O)C[N@+]12CC[C@H](CC1)[C@@H](O)C2)C[N@+]12CC[C@H](CC1)[C@@H](O)C2")
+smiles(R"O=CC/C=C/C=C(\NC(=O)C)/S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(CCCCC(=O)N/N=C(/C)\c1ccc(C)cc1)N/N=C(\C)/c1ccc(C)cc1")
+smiles(R"O=C(CCCCC(=O)O[C@H](CC[C@@H]1CCCO1)CC[C@H]1CCCO1)O[C@@H](CC[C@@H]1CCCO1)CC[C@@H]1CCCO1")
+smiles(R"OCCCC[C@H]1CO[C@@]2(CCCC2)O1")
+smiles(R"OCCCC[C@@H]([C@@H](C(=O)C)C(=O)OCC)[C@@H](C(=O)C)C(=O)OCC")
+smiles(R"O=CC/C=C/[C@@H](OC(=O)C)[C@@H](NC(=O)C)S[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(CCCCn1ccccc1)Sc1ccccc1C(=O)Nc1ccc(cc1)S(=O)(=O)c1ccc(cc1)N(=O)O")
+smiles(R"O=C(CCCCn1ccccc1)Sc1ccccc1C(=O)Nc1ccc(cc1)S(=O)(=O)c1ccc(cc1)NS(=O)(=O)Cc1ccccc1N(=O)O")
+smiles(R"O=C(CCCCn1ccccc1)Sc1ccccc1C(=O)Nc1ccc(cc1)S(=O)(=O)NC(=O)C")
+smiles(R"O=C(CCCCn1ccccc1)Sc1ccccc1C(=O)NCc1ccc(cc1)S(=O)(=O)N")
+smiles(R"O=C(CCCC(=O)N/N=C(\C)/c1ccccc1)N/N=C(/C)\c1ccccc1")
+smiles(R"O=C(CC[C@@H](C)[C@H]1CC[C@@H]2[C@@H]3CC[C@@H]4C[C@@H](O)CC[C@@]4(C)[C@@H]3C[C@@H](O)[C@@]12C)Nc1ccc(cc1)[S@](=O)(=O)c1ccc(cc1)NC(=O)CC[C@H](C)[C@@H]1CC[C@@H]2[C@@H]3CC[C@@H]4C[C@@H](O)CC[C@@]4(C)[C@@H]3C[C@@H](O)[C@@]12C")
+smiles(R"OCC(C)(CO)N1C(=O)[C@H]2[C@@H]3c4ccccc4[C@@H](c4ccccc34)[C@H]2C1=O")
+smiles(R"OCC[C@H]1CCN(CC/C=C/2\c3cc(ccc3Sc3cc(F)ccc23)C(F)(F)F)CC1")
+smiles(R"OCCCN1CC[C@@]2(CC1)SS[C@]1(CCN(CCCO)CC1)S2")
+smiles(R"O=C(CCN1C[C@H]2CC[C@H](CC2)C1)c1ccccc1")
+smiles(R"O[C@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(c1ccccc1)c1cccs1")
+smiles(R"O=C(CCN1C[C@@H]2CC[C@@H](CC2)C1)c1ccccc1O")
+smiles(R"O=C(CCN1C[C@H]2CC[C@H](CC2)C1)c1ccco1")
+smiles(R"O=C(CCN1C[C@H]2CC[C@H](CC2)C1)c1cccs1")
+smiles(R"O[C@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(Cc1ccccc1)c1cccc2ccccc12")
+smiles(R"O[C@@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(Cc1ccccc1)c1ccccc1")
+smiles(R"O[C@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(Cc1ccccc1)c1ccco1")
+smiles(R"O[C@@](CCN1C[C@@H]2CC[C@@H](CC2)C1)(Cc1ccccc1)c1cccs1")
+smiles(R"O=C/C=C(/N(C)C)\[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C/C=C(/N(C)C)\[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(CCN(C(C)C)C(C)C)C[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(CC(=O)c1ccccc1)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(CC(=O)c1sc(Nc2ccccc2)nc1C)C(=O)N[C@@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3")
+smiles(R"O=C(C[C@](O)(CCc1ccccc1)c1ccccc1)N1CC[C@@](O)(CC1)c1ccccc1")
+smiles(R"O=C(CC(=O)N1N=C(C)[C@H](/N=N/c2ccc(cc2)[S@](=O)(=O)c2ccc(/N=N/[C@H]3C(=NN(C(=O)CC(=O)Nc4ccccc4Cl)C3=O)C)cc2)C1=O)Nc1ccccc1Cl")
+smiles(R"O=C(CCSCCC(=O)N/N=C(/C)\c1ccccc1)N/N=C(\C)/c1ccccc1")
+smiles(R"O=C(CCSCCC(=O)N/N=C(/C)\c1ccc(cc1)OC(=O)C)N/N=C(\C)/c1ccc(cc1)OC(=O)C")
+smiles(R"O=C(CCSCCC(=O)N/N=C(/C)\c1ccccc1O)N/N=C(\C)/c1ccccc1O")
+smiles(R"O=C(CCSCCC(=O)N/N=C(/C)\c1ccc(cc1)OS(=O)(=O)C)N/N=C(\C)/c1ccc(cc1)OS(=O)(=O)C")
+smiles(R"OC[C@@H]1C[C@@]21c1ccccc1c1ccccc21")
+smiles(R"O=C([C@H]1CC[C@@H](CC1)c1ccccc1)c1ccccc1")
+smiles(R"OC[C@@H]1CC/C(=N\Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"OC[C@H]1CC/C(=N/Nc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])/CC1")
+smiles(R"O=C[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"OC[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"OC[C@@H]1C[C@H]2C[C@@H]1[C@]1(OCCO1)C2")
+smiles(R"OC[C@@H]1C[C@H](C[C@H]1CO)n1ccc(=N)[nH]c1=O")
+smiles(R"OC[C@@H]1C[C@H](C[C@H]1CO)n1ccc(=O)[nH]c1=O")
+smiles(R"OC[C@H]1C[C@](O)(CNc2cc(Cl)nc(N)n2)C1")
+smiles(R"OC[C@H]1[C@@H](CO)[C@]1(c1ccccc1)c1ccccc1")
+smiles(R"OC[C@@H]1[C@@H](CO)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl")
+smiles(R"OC[C@H]1[C@@H](CO)[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"OC[C@@H]1[C@@H](CO)[C@@H]2CC[C@H]1[C@]2(c1ccccc1)c1ccccc1")
+smiles(R"OC[C@@H]1[C@H](CO)[C@@H]2CC[C@H]1[C@@]2(Cc1ccccc1)Cc1ccccc1")
+smiles(R"OC[C@@H]1CO[C@H](O1)c1ccccc1")
+smiles(R"OC[C@@H]1CO[C@H](O1)C(CC)CC")
+smiles(R"OC[C@H]1N[Pt@](Cl)(Cl)N[C@H]1CO")
+smiles(R"OC[C@H]1O[C@H]1CC[C@H]1O[C@](C)(C)O[C@H]1CC[C@@H]1O[C@@H]1CO")
+smiles(R"OC[C@@H]1O[C@@H](c2cnn(n2)c2ccccc2)[C@H](O)[C@H]1O")
+smiles(R"OC[C@H]1O[C@@H](C[C@@H]1O)n1cc(C)c(NC[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)nc1=O")
+smiles(R"OC[C@@H]1O[C@H](C[C@@H]1O)n1c(=O)[nH]c(=O)c2nc3c(ccc4cc5ccccc5cc34)nc12")
+smiles(R"OC[C@@H]1O[C@H]([C@@H]2OP(=O)(O[C@H]12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)n1cc(Br)c(=O)[nH]c1=O")
+smiles(R"OC[C@@H]1O[C@H]([C@@H]2OP(=O)(O[C@H]12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)n1cc(F)c(=O)[nH]c1=O")
+smiles(R"OC[C@@H]1O[C@H]([C@@H]2OP(=O)(O[C@H]12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)n1ncc(=O)[nH]c1=O")
+smiles(R"OC[C@@H]1O[C@@H]([C@H](O)[C@@H]1O)c1cnn2c(=O)[nH]ncc12")
+smiles(R"OC[C@H]1O[C@@H]([C@@H](O)[C@@H]1O)n1ccc(cc1=O)OC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OC[C@H]1O[C@@H]([C@@H](O)[C@@H]1O)n1ccc(NC[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)nc1=O")
+smiles(R"OC[C@H]1O[C@@H]([C@H](O)[C@H]1O)n1ccc(N)[n+](c1=O)[Pt@](I)(I)[n+]1c(N)ccn([C@H]2O[C@H](CO)[C@H](O)[C@H]2O)c1=O")
+smiles(R"OC[C@H]1O[C@@H]([C@H](O)[C@H]1O)n1c[n+](c2c(O)ncnc12)[Pt@@](N)(N)[n+]1cn([C@H]2O[C@H](CO)[C@H](O)[C@H]2O)c2ncnc(O)c12")
+smiles(R"OC[C@@H]1O[C@H]([C@@H](O)[C@H]1O)n1c(=O)[nH]/c(=N)/[nH]c1=O")
+smiles(R"OC[C@@H]1O[C@H](OC[C@@H](O)[C@@H](O)[C@@H](O)c2cnn(n2)c2ccccc2)[C@@H](O)[C@H](O)[C@H]1O")
+smiles(R"OC[C@H]1O[C@H](OC[C@H](O)[C@H](O)[C@H](O)c2cnn(n2)c2ccccc2)[C@H](O)[C@H](O)[C@H]1O")
+smiles(R"OC[C@@H]1O[C@H](O[C@@H](CO)[C@H]2O[C@@H](O[C@H]12)c1ccccc1)c1ccccc1")
+smiles(R"OC[C@H]1O[C@H](O)[C@H](N[Pt@](Cl)(Cl)N[C@@H]2[C@@H](O)O[C@H](CO)[C@H](O)[C@H]2O)[C@@H](O)[C@@H]1O")
+smiles(R"OC[C@@H]1O[C@H](O)[C@@H](O)[C@H](O)[C@@H]1O")
+smiles(R"OC[C@@H](C)CCC(=O)[C@H](C)[C@@H]1[C@]2(SCCS2)C[C@@H]2[C@H]3CC[C@@H]4C[C@@H](O)CC[C@@]4(C)[C@@H]3CC[C@]12C")
+smiles(R"OC[C@H](/N=C/[C@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18)[C@@H](O)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"OC[C@H](/N=C/[C@@-]12[Fe+2]3456789([C-]%10C5=C4C3=C6%10)C(=C29)C7=C18)[C@@H](O)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"OC[C@@H](O)[C@@H]1O[C@@](C)(C)O[C@@H]1[C@H](O)CO")
+smiles(R"OC[C@@H](O)[C@H]1OC(=O)C(=C1O)Nc1ccc(cc1)[S@](=O)(=O)c1ccc(cc1)NC1=C(O)[C@H](OC1=O)[C@@H](O)CO")
+smiles(R"OC[C@@H](O)[C@@H]1OC(=O)C(=C1O)[O-]")
+smiles(R"OC[C@@H](O)[C@@H](O)c1cnn(n1)c1ccccc1")
+smiles(R"OC[C@H](O)[C@H](O)c1cnn(n1)c1ccccc1")
+smiles(R"OC[C@@H](O)[C@H](O[C@H]1O[C@@H](CO)[C@H](O)[C@@H](O)[C@@H]1O)[C@@H](O)c1cnn(n1)c1ccccc1")
+smiles(R"OC[C@H](O)[C@H](O)[C@H](O)c1cnn(n1)c1ccc(Br)cc1")
+smiles(R"OC[C@@H](O)[C@@H](O)[C@@H](O)c1cnn(n1)c1ccccc1")
+smiles(R"OC[C@H](O)[C@H](O)[C@H](O)c1cnn(n1)c1ccccc1")
+smiles(R"OC[C@H](O)[C@H](O)[C@@H](O)c1nnc2n[nH]c(=S)n2n1")
+smiles(R"OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](N)c1nnc2n[nH]c(=S)n2n1")
+smiles(R"OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)c1cnn(n1)c1ccccc1")
+smiles(R"OC[C@H](O)[C@H](O)[C@H](O)[C@@H](O)c1nnc2n[nH]c(=S)n2n1")
+smiles(R"OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)[C@@H]1N[C@H]2C[S+]1[Pd@+2]1([OH+]C(=O)[C@H]3C[S+]1[C@@H](N3)[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)CO)[OH+]C2=O")
+smiles(R"OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)[C@@H]1N[C@H]2C[S+]1[Pd@+2]1([OH+]C(=O)[C@@H]3N[C@@H]([C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)CO)[S+]1C3)[OH+]C2=O")
+smiles(R"OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)[C@H](Nc1ccc(cc1)[S@@](=O)(=O)c1ccc(cc1)N[C@@H]([C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)CO)S(=O)(=O)O)S(=O)(=O)O")
+smiles(R"O=C[C@H](O)[C@@H](O)[C@@H](O)[C@H](O)CON1C[C@H](O)[C@H](O)[C@@H](O)C1")
+smiles(R"OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OC[C@@H](O)[C@@H](O)[C@@H](O)[C@@H](O)C(=O)O[Pt@]1(NC[C@H](C)N1)OC(=O)[C@H](O)[C@H](O)[C@H](O)[C@H](O)CO")
+smiles(R"OC[C@H](O)[C@H](O)[C@@H](O)CO")
+smiles(R"OC[C@@H](O)COc1ccc2c(no[n+]2[O-])c1")
+smiles(R"OC[C@@H](O)COc1ccc2c(NO[N+]2[O-])c1")
+smiles(R"OC[C@@H](O)C(=O)O[Pt@]1(N[C@@H]2CCCC[C@@H]2N1)OC(=O)[C@H](O)CO")
+smiles(R"OC[C@H](O)COP1(=O)O[Pt@@]2(N[C@H]3CCCC[C@@H]3N2)O1")
+smiles(R"OCC[N@@+]12CCO[Ni+2]342(OCC1)OCC[N@+]4(CCO)CCO3")
+smiles(R"OCC[N@+]12CCO[Ni+2]342(OCC1)OCC[N@@+]4(CCO)CCO3")
+smiles(R"OCC[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccc2ccccc2c1")
+smiles(R"O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccc2CCCCc2c1")
+smiles(R"O=C(C[N@+]12CN3CN(CN(C3)C2)C1)c1cccc2ccccc12")
+smiles(R"O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccccc1")
+smiles(R"O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccc(cc1)c1ccccc1")
+smiles(R"O=C(C[N@+]12CN3CN(CN(C3)C2)C1)c1cccc(c1)[N+](=O)[O-]")
+smiles(R"O=C(C[N+]12CN3CN(CN(C3)C2)C1)c1cccc(c1)[N+](=O)[O-]")
+smiles(R"O=C(C[N@@+]12CN3CN(CN(C3)C2)C1)c1ccc(O)c(O)c1")
+smiles(R"O=C(Cn1c2ccccc2n(CC(=O)NC23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1=N)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"OCCN1CC[C@]2(CC1)SS[C@]1(CCN(CCO)CC1)S2")
+smiles(R"O=C(Cn1cc(F)c(=O)[nH]c1=O)N1CC[C@]2(CC1)SS[C@@]1(CCN(CC1)C(=O)Cn1cc(F)c(=O)[nH]c1=O)S2")
+smiles(R"O=C(CN1C[C@@H]2CC[C@@H](CC2)C1)N1c2ccccc2NC(=O)C1(C)C")
+smiles(R"OCCN1CCN(CC1)c1ccc2nonc2c1[N+](=O)[O-]")
+smiles(R"OCCN1CCN(CC1)c1ccc2NONc2c1[N+](=O)[O-]")
+smiles(R"O=C(CN1CCN(CC1)c1ccccn1)O[C@H]1[C@@H](OC(=O)CN2CCN(CC2)c2ccccn2)[C@H](OC(=O)CN2CCN(CC2)c2ccccn2)[C@H](OC(=O)CN2CCN(CC2)c2ccccn2)[C@@H](OC(=O)CN2CCN(CC2)c2ccccn2)[C@H]1OC(=O)CN1CCN(CC1)c1ccccn1")
+smiles(R"OCCN1CCN(CC1)c1ccnc2ccc3nn(C)nc3c12")
+smiles(R"O=C(Cn1cnc2n(C)c(=O)n(C)c(=O)c12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(Cn1c(=N)[nH]c2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OCCN1NC(C)C(C1C1[CH][CH][CH][CH][CH]1)N1ON1C1C(C)NN(CCO)C1C1[CH][CH][CH][CH][CH]1")
+smiles(R"OCCN1N=C(C[C@H]1[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OCCN1N=C(C[C@H]1[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OCCN[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"OCCN(C[C@@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1)C1CCCCC1")
+smiles(R"OCCNCCNc1ccc2nnn3c2c1c(=O)c1ccccc31")
+smiles(R"OCCNCCNc1ccc2nnn3c2c1c(=O)c1cc(Cl)ccc31")
+smiles(R"OCCNCCNc1ccc2nnn3c2c1c(=O)c1cc(O)ccc31")
+smiles(R"OCCNCC/N=C\1/CC/C(=N/CCNCCO)/CC1")
+smiles(R"OCCNCCNc1ccnc2ccc3nn(C)nc3c12")
+smiles(R"OCCN(CCO)c1ccnc2ccc3nn(C)nc3c12")
+smiles(R"OCCN(CCO)C(=O)c1ccc2c(no[n+]2[O-])c1")
+smiles(R"OCCN(CCO)C(=O)c1ccc2[N+]([O-])ONc2c1")
+smiles(R"O=C(CNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC[C@H]1CC1(Cl)Cl")
+smiles(R"OCCNC(=O)c1ccc2c(no[n+]2[O-])c1")
+smiles(R"OCCNC(=O)c1ccc2c(NO[N+]2[O-])c1")
+smiles(R"OCCNC(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=CC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(COc1ccc(Cl)cc1Cl)O[C@H]1[C@H](OC(=O)COc2ccc(Cl)cc2Cl)[C@@H](OC(=O)COc2ccc(Cl)cc2Cl)[C@H](OC(=O)COc2ccc(Cl)cc2Cl)[C@@H](OC(=O)COc2ccc(Cl)cc2Cl)[C@@H]1OC(=O)COc1ccc(Cl)cc1Cl")
+smiles(R"OCCOc1nc(nc(NS(=O)(=O)c2ccc(cn2)C(C)C)c1Oc1ccccc1OC)c1ccnc(c1)c1nn[nH]n1")
+smiles(R"OCCOC[C@H]1O[C@@](C)(C)O[C@H]1COCCO")
+smiles(R"OCCO[C@H]1[C@]2(CCCCC2)NC(=O)[C@@]21CCCCC2")
+smiles(R"OCCO[C@H]1[C@@]2(CCCCC2)NC(=O)[C@@]21CCCCC2")
+smiles(R"O=C(COC(=O)c1ccc2c(c1)C(=O)N(c1ccc(Cl)cc1)C2=O)N[C@H]1CC[N@@H+](CC1)C1CC1")
+smiles(R"OCCOC(=O)[C@H]1C[C@@H]2C[C@H]1[C@@]1(OCCO1)C2")
+smiles(R"O=C(C(=O)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1c[nH]c2ccc(cc12)[N+](=O)[O-]")
+smiles(R"O=C(C(=O)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1c[nH]c2ccc(cc12)[N+](=O)[O-]")
+smiles(R"O=C(C=P(c1ccccc1)(c1ccccc1)c1ccccc1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C1C3=C5(NC(C)(C)C)C4=C26")
+smiles(R"[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C2C4=C5(N(C)C)C3=C16")
+smiles(R"[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C2C5(=C3C1=C46/C=C/c1ccc(cc1)[N+](=O)[O-])C(F)(F)F")
+smiles(R"[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C4(/C=C/c4ccc(cc4)[N+](=O)[O-])C1=C3C5(=C26)C(F)(F)F")
+smiles(R"[O+]#C[Cr](C#[O+])(C#[O+])(C#[O+])(C#[O+])/[S+]=C\1/[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3") # smiles(R"[O+]#C[Cr]12345(C#[O+])(C#[O+])C6=C1C3(=C5(N)C4(=C26)C)C")
+smiles(R"OCC[S@@]1(=O)CC[S@@](=O)(CCO)[Pd@@]1(Cl)Cl")
+smiles(R"O=C(CSCC(=O)N/N=C(\C)/c1ccccc1)N/N=C(/C)\c1ccccc1")
+smiles(R"[O+]#C[Fe]12345(C#[O+])(C6=C2C3=C1[C@@H]46)C1=C5(C)[C@H]2[C@@H](CC3=C4C5=C2[Fe+]345(C#[O+])(C#[O+])C#[O+])C1")
+smiles(R"[O+]#C[Fe]12345(C#[O+])(C6=C2C3=C1[C@H]46)C1=C5(C)[C@H]2[C@@H](CC3=C4C5=C2[Fe+]345(C#[O+])(C#[O+])C#[O+])C1")
+smiles(R"[O+]#C[Fe]1234([C@@H]5C3=C2C1=C45)([C@@H]1CNC(=O)C1(C)C)P(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"[O+]#C[Fe]1234(C#[O+])(C5=C2C3=C1[C@H]45)[C@@H]1COC(C(F)(F)F)(C(F)(F)F)C1(C)C")
+smiles(R"[O+]#C[Fe]1234(C#[O+])(C[C@]56CC[C@@H](CC6=O)C5)[C@H]5C3=C2C1=C45")
+smiles(R"[O+]#C[Fe+]1234(C#[O+])(/C=C/CCCC/C=C/[Fe+]5678(C#[O+])(C#[O+])C9=C6C7=C5[C@@H]89)C5=C3C2=C1[C@H]45")
+smiles(R"[O+]#C[Fe+]1234(C#[O+])(/C=C/CCCC/C=C/[Fe+]5678(C#[O+])(C#[O+])C9=C6C7=C5[C@H]89)C5=C3C2=C1[C@H]45")
+smiles(R"[O+]#C[Fe+]1234(C#[O+])(/C=C/CCC/C=C/[Fe+]5678(C#[O+])(C#[O+])[C@H]9C7=C6C5=C89)[C@@H]5C3=C2C1=C45")
+smiles(R"[O+]#C[Fe+]1234(C#[O+])(/C=C/CCC/C=C/[Fe+]5678(C#[O+])(C#[O+])[C@H]9C7=C6C5=C89)[C@H]5C3=C2C1=C45")
+smiles(R"[O+]#C[Fe]123(C#[O+])(C#[O+])C4=C2C3(=C14)S(=O)(=O)Cl")
+smiles(R"O[C@H]1[C@]2(CCCC2)[C@@H](O)[C@@]21CCCC2")
+smiles(R"O[C@H]1[C@@]2(SCCS2)CC[C@]2(C)CCCC[C@@]12C")
+smiles(R"O[C@H]1C[C@@]2(SCCS2)CC2(SCCS2)C1")
+smiles(R"O[C@@H]1CC[C@]23C4=C5C6=C2[Fe]27893456C3=C8[C@]19C7=C23")
+smiles(R"O[C@@H]1CC[C@]2(CC1)NC(=O)[C@@]1(CCCCC1)[C@]2(O)c1ccccc1")
+smiles(R"O[C@H]1/C(=C/c2ccccc2)/CNC/C/1=C\c1ccccc1")
+smiles(R"O[C@@H]1CC[C@]2(C)C(=CCC[C@@]32OCCO3)C1(C)C")
+smiles(R"O[C@@H]1CC[C@@]2(OCCO2)C[C@H]1C")
+smiles(R"O[C@@H]1CCC[C@@]21CCCC2")
+smiles(R"O[C@H]1CCCCCCCCCC[C@@]21OCCO2")
+smiles(R"O[C@@H]1C[C@](C)(C)C[C@H](O)C1(C)C")
+smiles(R"O[C@@H]1CCCC[C@@H]2[C@@H]1C(=O)N[C@@]12CCCCC1")
+smiles(R"O[C@@H]1CCCC[C@@H]2[C@@H]1NC(=O)[C@]12CCCCC1")
+smiles(R"O[C@@H]1C(C)(C)[C@H](O)[C@]1(C)C")
+smiles(R"O[C@H]1CC(=C[C@@H](O)[C@H]1O)C(=O)[OH+][Pt@@+2]1(N[C@@H]2CCCC[C@@H]2N1)[OH+]C(=O)C1=C[C@@H](O)[C@@H](O)[C@@H](O)C1")
+smiles(R"O[C@H]1CC[C@@H]2[C@@H]3CC[C@@H]4Cc5nc6C[C@@]7(C)[C@@H](CC[C@@H]8[C@@H]9CC[C@H](O)[C@@]9(C)CC[C@H]78)Cc6nc5C[C@@]4(C)[C@@H]3CC[C@@]12C")
+smiles(R"O[C@@H]1CC[C@H](CC1)C(C)C")
+smiles(R"O[C@@H]1CC[C@@H](CC1)C(C)(C)[C@@H]1CC[C@H](O)CC1")
+smiles(R"O[C@H]1CC[C@H](CC1)C(C)(C)[C@@H]1CC[C@H](O)CC1")
+smiles(R"O[C@H]1CC[C@@H](CC1)[C@H]1[C@H]([C@H]2CC[C@@H](O)CC2)[C@H]2CCCC[C@@H]2[C@@H]2CCCC[C@H]12")
+smiles(R"O[C@H]1CC[C@@H](CC1)N1C(=O)c2ccccc2C1=O")
+smiles(R"O[C@H]1CC[C@H](CC1)NS(=O)(=O)c1ccc(N)cc1")
+smiles(R"O[C@@H]1CCCN(C)[C@@H]1CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[C@@H]1CCCN[C@@H]1CN(C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"O[C@@H]1C[C@@H]2CC[C@H]1[C@]12OCCO1")
+smiles(R"O[C@H]1C[C@@H]2N[Pt@@](Cl)(Cl)N[C@H]2C[C@H]1O")
+smiles(R"O[C@H]1C[C@H](c2ccccc2)[C@@]2([C@H](O)c3ccccc3[C@H]2O)[C@@H](C1)c1ccccc1")
+smiles(R"O[C@@H]1C[C@@H](c2ccccc2)N(C)[C@@H](C1)c1ccccc1")
+smiles(R"O[C@@H]1C[C@@H](C[Hg]OC(=O)c2ccccc2)O[C@H](C[Hg]OC(=O)c2ccccc2)C1")
+smiles(R"O[C@H]1CCN(CC1)C1(CCCCC1)c1ccccc1")
+smiles(R"O[C@@H]1CCN(CC1)C[C@@H]1NC(=O)[C@H](CN2CC[C@H](O)CC2)NC1=O")
+smiles(R"O[C@@H]1CCN(Cc2ccccc2)C[C@@H]1CN[C@@]12C[C@@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O[C@@H]1CCN(Cc2ccccc2)C[C@H]1CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[C@H]1CCN(Cc2ccccc2)C[C@@H]1CN(C(=O)C)[C@@]12C[C@@H]3C[C@@H](C[C@H](C3)C2)C1")
+smiles(R"O[C@@H]1CCNC[C@@H]1CNC12C[C@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[C@@H]1CCN(C[C@H]1CN[C@@]12C[C@@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)OCc1ccccc1")
+smiles(R"O[C@@H]1[C@@H]2[C@]3(C)O[C@]4(C)[C@H]1[C@]1(C)O[C@@]2(C)[C@H]3[C@@H](O)[C@H]41")
+smiles(R"O[C@H]1[C@@H]2[C@]3(C)O[C@@]4(C)[C@H]5C[C@@H]3[C@]2(C)O[C@@]5(C)[C@@H]14")
+smiles(R"O[C@@H]1[C@@H]2CCC[C@H]1[C@@]1(O)CCCC[C@@H]1[C@]12CCCCC1")
+smiles(R"O[C@H]1[C@H]2CCN(CC2)[C@H]1CN1CCC(=CC1)c1ccccc1")
+smiles(R"O[C@H]1[C@@H]2CCN(CC2)[C@@H]1CN[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[C@@H]1[C@H]2[C@@H]3CC[C@@H](C3)[C@@H]2[C@@H](C2OCCO2)[C@@H]2[C@H]3CC[C@H](CC3)[C@H]12")
+smiles(R"O[C@H]1[C@@H]2CN3CCN(C2)C[C@@]1(C3)c1ccccc1")
+smiles(R"O[C@@H]1[C@@H](C)[C@H](N[C@H](c2ccccc2)[C@@H]1C)c1ccccc1")
+smiles(R"O[C@@H]1[C@@H](COC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)O[C@@H]([C@H]1O)n1cnc2c(N)ncnc12")
+smiles(R"O[C@@H]1[C@@H](COC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)O[C@@H]([C@H]1O)n1cnc2c(S)ncnc12")
+smiles(R"O[C@H]1[C@@H](COP2(=O)O[Pt@]3(N[C@H]4CCCC[C@H]4N3)O2)O[C@@H]([C@@H]1O)n1cnc2c(N)ncnc12")
+smiles(R"O[C@@H]1[C@@H](O)[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"O[C@@H]1[C@@H](O)[C@@H]2C[C@H]1[C@@H]1[C@H]2[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)[C@@]2(Cl)Cl)Cl")
+smiles(R"O[C@H]1[C@@H](O)[C@@H](O)[C@H](O)[C@@H](O)[C@@H]1O")
+smiles(R"O[C@H]1[C@H](O)[C@H](O)[C@H](O)[C@H](O)[C@H]1O")
+smiles(R"O[C@@H]1[C@H](O)[C@H](O)[C@](O)(CNCc2ccccc2)[C@@H](O)[C@H]1O")
+smiles(R"O[C@H]1[C@H](O)CN(OC/C=C/c2ccccc2)C[C@H]1O")
+smiles(R"O[C@@H]1[C@@H](SCc2ccccc2)OC[C@H]2O[C@]3(CCCCC3)O[C@@H]12")
+smiles(R"O[C@@H]1C/[N+](=C\c2ccccc2)/[Pt@]2(OC(=O)CC(=O)O2)/[N+](=C/c2ccccc2)/C1")
+smiles(R"O[C@H]1CNC[C@H](O)CNC1")
+smiles(R"O[C@H]1CN/C(=N)/NC1")
+smiles(R"O[C@H]1CO[C@@H](c2cnn(n2)c2ccccc2)[C@@H]1O")
+smiles(R"O[C@@H]1CO[C@H](OC1)c1ccccc1")
+smiles(R"O[C@H]1C(=O)O[Pt@]2(N[C@@H]3CCCC[C@@H]3N2)OC1=O")
+smiles(R"O[C@@H]([C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"O[C@@H](c1ccccc1)[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@-]9([C@@H](O)c2ccccc2)C7=C41")
+smiles(R"O[C@@H](c1ccccc1)[C@-]12[Fe+2]3456789(C(=C26)C3=C15)C1=C8[C@@-]9([C@@H](O)c2ccccc2)C7=C41")
+smiles(R"O[C@H](c1ccccc1)[C@@H](C)C(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[C@H](c1nccc2ccccc12)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O[C@H](c1nccc2ccccc12)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O[C@@H](C(C)(C)C)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)N(C)C(C)(C)C")
+smiles(R"O[C@@H](C/C=C(\[C@@H](O)S(=O)(=O)O)/[C@@H](O)S(=O)(=O)O)S(=O)(=O)O")
+smiles(R"O[C@H](CCCN[Pt](Cl)(Cl)NCCC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]")
+smiles(R"O[C@H](CCCN[Pt@@](Cl)(Cl)NCCC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]")
+smiles(R"O[C@H](CCN[Pt](Cl)(Cl)NCC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]")
+smiles(R"O[C@H](CCN[Pt@@](Cl)(Cl)NCC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]")
+smiles(R"O[C@H]([C@H]1CCCCN1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[C@@H]([C@@H]1CC[C@H]([C@@H](O)C(C)(C)C)[S@@]1(=O)=O)C(C)(C)C")
+smiles(R"O[C@@H](CN1CC[C@H](CC1)c1ccccc1)Cc1ccc(Br)cc1")
+smiles(R"O[C@H](C/N=C(/C)\CC(=O)c1ccccc1)C/N=C(/C)\CC(=O)c1ccccc1")
+smiles(R"O[C@@H](C/N=C(\CC(=O)c1ccccc1)/c1ccccc1)C/N=C(\CC(=O)c1ccccc1)/c1ccccc1")
+smiles(R"O[C@H](CNC(=O)/C=C/c1ccccc1)CNC(=O)/C=C/c1ccccc1")
+smiles(R"O[C@@H](CNC(=O)/C=C/c1cccc(c1)[N+](=O)[O-])CNC(=O)/C=C/c1cccc(c1)[N+](=O)[O-]")
+smiles(R"O[C@H](CNC(=O)/C=C/c1cccc(c1)[N+](=O)[O-])CNC(=O)/C=C/c1cccc(c1)[N+](=O)[O-]")
+smiles(R"O[C@H](CN[Pt](Cl)(Cl)NC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]")
+smiles(R"O[C@H](CN[Pt@@](Cl)(Cl)NC[C@H](O)Cn1ccnc1[N+](=O)[O-])Cn1ccnc1[N+](=O)[O-]")
+smiles(R"O[C@@H](COc1ccc2c(C)cc(=O)oc2c1C(=O)C)CN1CC[C@@](O)(CC1)c1ccccc1")
+smiles(R"O[C@H](COc1ccccc1)Cn1cc/c(=N)/cc1")
+smiles(R"O[C@H](COC(=O)c1ccccc1)[C@H]1O[C@@H](O[C@@H]1[C@H](O)COC(=O)c1ccccc1)c1ccccc1")
+smiles(R"O[C@H](COC(=O)c1ccccc1)[C@H](O)[C@H](O)COC(=O)c1ccccc1")
+smiles(R"O[C@H](C[S@@](=O)(=O)C[C@H](O)c1ccccc1)c1ccccc1")
+smiles(R"[O-][Cl](=O)(=O)=O")
+smiles(R"O[Cl](=O)(=O)=O")
+smiles(R"O=[Cl](=O)(=O)O[Cu@@](/[S+]=c\1/cccc[nH]1)(/[S+]=c\1/cccc[nH]1)O[Cl](=O)(=O)=O")
+smiles(R"[O-][Cl](=O)(=O)=[OH+]")
+smiles(R"[O+]#C[MnH+]12(C#[O+])(C#[O+])[H-][MnH+]2(C#[O+])(C#[O+])(C#[O+])[P-]1(Br)N(C(C)C)C(C)C")
+smiles(R"[O+]#C[MnH2+]12(C#[O+])(C#[O+])[H-][MnH2+]2(C#[O+])(C#[O+])(C#[O+])[P-]1(Br)N(C(C)C)C(C)C")
+smiles(R"[O+]#C[Mo]1234(C#[O+])(C#[O+])(c5ccs(=O)c5C)[C@@H]5C3=C2C1=C45")
+smiles(R"[O+]#C[Mo]1234(C#[O+])(/N=N/c5ccc(cc5)[N+](=O)[O-])[C@@H]5C3=C2C1=C45")
+smiles(R"[O+]#C[Mo]1234(C#[O+])(/N=N/c5ccc(cc5)[N+](=O)[O-])[C@H]5C3=C2C1=C45")
+smiles(R"[O+]#C[Mo]1234(C#[O+])(/N=N/c5ccc(C)cc5)[C@H]5C3=C2C1=C45")
+smiles(R"[O+]#C[Mo]1234(/N=N/c5ccc(C)cc5)([C@H]5C3=C2C1=C45)P(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"O=C(N1CC[C@]2(CC1)SS[C@@]1(CCN(CC1)C(=O)C(F)(F)F)S2)C(F)(F)F")
+smiles(R"O=C(N1CCCCC1)[C@@H]1[C@H]2CC[C@H](CC2)[C@H]1C(=O)N1CCCCC1")
+smiles(R"O=C(N1C(C)(C)C(C)(C)C(C)(C)C(C)(C)C1(C)C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(N1CCN(CC1)C(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(N1CCN(CC1)C(=O)[C@@H]1C[C@@H]2CCN1CC2)[C@@H]1C[C@H]2CCN1CC2")
+smiles(R"O=C(N1CCN(CC1)C(=O)[C@@H]1C[C@H]2CCN1CC2)[C@@H]1C[C@@H]2CCN1CC2")
+smiles(R"O=C(N1CCOCC1)[C@]12O[C@@H]3C[C@@H](C[C@@H](C3)O2)O1")
+smiles(R"O=C(N1CCOCC1)[C@@H]1[C@H]2CC[C@H](CC2)[C@H]1C(=O)N1CCOCC1")
+smiles(R"OCN1C(=O)N(CO)[C@H]2N(CO)C(=O)N(CO)[C@@H]12")
+smiles(R"O=C(N[C@]12CC[C@H](CC1)C2)[C@@]12CC[C@@H](CC1)C2")
+smiles(R"O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1c(O)c2ccccc2n(C)c1=O")
+smiles(R"O=C(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1[n+]([O-])c2ccccc2[n+]([O-])c1N")
+smiles(R"O=C(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(F)(F)F")
+smiles(R"O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)c1c[nH]c2ccccc12")
+smiles(R"O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)/C=C(/Nc1ccccc1O)\c1ccccc1")
+smiles(R"O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)C(=O)Nc1nc2ccccc2n1Cc1ccccc1")
+smiles(R"O=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)n1cnc2c(N)ncnc12")
+smiles(R"O=CN[C@]12C(=O)NC(=O)[C@@]1(C(=O)O)[C@]12CCCCC1")
+smiles(R"O=C(N[C@]12O[C@@H]3C[C@@H](C[C@@H](C3)O2)O1)N[C@]12O[C@@H]3C[C@@H](C[C@@H](C3)O2)O1")
+smiles(R"O=C(Nc1ccc2c(c1)Cc1cc(ccc21)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(Nc1ccc2c(O)cc(cc2c1)S(=O)(=O)[OH+][Pt@+2]1(N[C@@H]2CCCC[C@H]2N1)[OH+]S(=O)(=O)c1cc(O)c2ccc(NC(=O)c3ccccc3)cc2c1)c1ccccc1")
+smiles(R"O=C=Nc1ccc2n(CC)c3ccc4n5cccc5c(=O)[nH]c4c3c2c1")
+smiles(R"O=C(Nc1cccc2ccccc12)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(Nc1cccc2ccccc12)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(Nc1cccc2cccnc12)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(Nc1ccc(cc1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C1CCCCC1")
+smiles(R"O=C(Nc1ccc(cc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C1CCCCC1")
+smiles(R"O=C(Nc1ccccc1)[C@@]1(Br)C[C@]2(C[C@](Br)(C2)C(=O)Nc2ccccc2)C1")
+smiles(R"O=C(Nc1ccc(cc1)c1ccccc1)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(Nc1ccc(cc1)c1ccccc1)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(Nc1ccc(cc1)c1ccc(cc1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(Nc1ccc(cc1)C1=NCCN1)[C@H]1CC[C@@H](CC1)C(=O)Nc1ccc(cc1)C1=NCCN1")
+smiles(R"O=C(Nc1ccccc1)c1n[n+](c2cc(c(cc2Cl)[N+](=O)[O-])S(=O)(=O)O)n(n1)c1cc(c(cc1Cl)[N+](=O)[O-])S(=O)(=O)[O-]")
+smiles(R"O=C(Nc1ccccc1)c1n[n+](c2cc(c(cc2Cl)[N+](=O)[O-])S(=O)(=O)O)n([nH]1)c1cc(c(cc1Cl)[N+](=O)[O-])S(=O)(=O)[O-]")
+smiles(R"O=C(Nc1ccccc1)c1n[n+](c2cc(ccc2Cl)S(=O)(=O)[O-])n(n1)c1ccccc1Cl")
+smiles(R"O=C(Nc1ccccc1)c1n[n+](c2cc(ccc2Cl)S(=O)(=O)[O-])n([nH]1)c1ccccc1Cl")
+smiles(R"O=C(Nc1ccc(cc1)Cc1ccc(cc1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(Nc1cccc(c1)C(F)(F)F)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(NC1CCCCC1)N(O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(Nc1ccc(cc1)S(=O)(=O)c1ccc(cc1)NC(=O)c1cc(ccc1O)S(=O)(=O)O)c1cc(ccc1O)S(=O)(=O)O")
+smiles(R"O=C(Nc1ccc(cc1)S(=O)(=O)Nc1ccnn1c1ccccc1)c1c2ccccc2n(C)c2ccccc12")
+smiles(R"O=C(Nc1ccc(cc1)S(=O)(=O)Nc1ncccn1)c1c2ccccc2n(C)c2ccccc12")
+smiles(R"O=C(Nc1ccc(CCc2ccc(cc2)NC(=O)[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)cc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(/N=C\1/C(=O)[C@@]2(CCCCC2)[C@@]2(N=C(OC2=O)c2ccccc2)[C@]21CCCCC2)c1ccccc1")
+smiles(R"O=C(Nc1nc2ccccc2n1C)C(=O)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(Nc1ncccn1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-]/C(=N\c1nccs1)/[C@H](C)[NH+]1CC[C@@H](CC1)n1c(=O)[nH]c2ccccc12")
+smiles(R"[O-]/C(=N\c1nccs1)/[C@H](C)[NH+]1CC[C@H](CC1)n1c(=O)[nH]c2ccccc12")
+smiles(R"O=C(Nc1[nH]c2ccccc2n1)C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(Nc1nnc(s1)S(=O)(=O)N)C12C[C@H]3C[C@@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1cc2c(ccc3ccccc23)oc1=O")
+smiles(R"O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1cc2ccccc2oc1=O")
+smiles(R"O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1cc2cc(ccc2oc1=O)[N+](=O)[O-]")
+smiles(R"O=C(Nc1scc(n1)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1cc2cc(ccc2oc1=O)[N+](=O)[O-]")
+smiles(R"O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1c(O)c2ccccc2n(C)c1=O")
+smiles(R"O=C(Nc1scc(n1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)c1c(O)nc2ccccc2c1O")
+smiles(R"O=C(Nc1scc(n1)[C@@]12C[C@H]3C[C@H](C[C@@H](C3)C2)C1)[C@@H]1C(=O)N[C@]2(C)Oc3ccccc3[C@@H]1C2")
+smiles(R"O=CN(C)C")
+smiles(R"O=C(NCC1CC1)[C@@H]1[C@@H]2c3ccccc3[C@H]([C@H]1C(=O)O)c1ccccc21")
+smiles(R"O=C(N(C)c1ccccc1)[C@H]1[C@@H]2c3ccccc3[C@@H](c3ccccc23)[C@@H]1C(=O)N(C)c1ccccc1")
+smiles(R"O=C(NCc1ccccc1)[C@@H](C[C@@H](C(=O)NCc1ccccc1)/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C)/C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C")
+smiles(R"O=C(NCc1ccccc1)[C@H](C[C@H](C(=O)NCc1ccccc1)/C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C)/C(=N/Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/C")
+smiles(R"O=C(N(C)C(C)(C)C)[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41C(=O)N(C)C(C)(C)C")
+smiles(R"O=C(NCCCCCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCCCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NC(C)(C)CCC(C)(C)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCCCCCNC(=O)N(O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N(O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCCCCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NC(C)(C)[C@H]1CC[C@@](C)(CC1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCC(C)(C)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCCC(=O)N)CCC[C@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"O=C(NCCCC(=O)NCCC(=O)N)CCNC(=O)CCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(NCCCC(=O)NCCC(=O)N)CCNC(=O)CCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(NCCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCC(=O)N)CCC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(NCCC(=O)N)CCC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(NC[C@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1)CN1[C@@H]2CC[C@H]1C[C@H](O)C2")
+smiles(R"O=C(NCCNc1ccccc1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(NCC[N+](C)(C)C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCN(C)C(=O)[C@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1)[C@H]1[C@@H](c2ccccc2)[C@@H]1c1ccccc1")
+smiles(R"O=C(NCCNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NCCNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(N[C@H]1C[C@@]2(OC1=O)C=C(Cl)C(=O)C(=C2)Cl)OC(C)(C)C")
+smiles(R"O=C(N[C@H]1CC[C@@]21CC2)c1ccc2ccccc2c1")
+smiles(R"O=C(N[C@@H]1CCCC[C@@H]1NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(N[C@@H]1CC[C@H](CC1)CC1CCCCC1)c1ccccc1")
+smiles(R"O=C(N[C@H]1CC[C@@H](CC1)CC1CCCCC1)c1ccccc1")
+smiles(R"O=C(N[C@@H]1CC[C@H](CC1)CC1CCCCC1)C(Cl)Cl")
+smiles(R"O=C(N[C@H]1CC[C@@H](CC1)CC1CCCCC1)C(Cl)Cl")
+smiles(R"O=C(N[C@@H]1CC[C@H](CC1)CC1CCCCC1)NC1CCCCC1")
+smiles(R"O=C(N[C@H]1CC[C@@H](CC1)CC1CCCCC1)NC1CCCCC1")
+smiles(R"O=C(N[C@@H]1CC[C@H](CC1)CC1CCCCC1)Nc1cccc(Cl)c1")
+smiles(R"O=C(N[C@@H]1CC[C@H](CC1)C(C)(C)C)c1ccccc1")
+smiles(R"O=C(N[C@@H]1CC[C@H](CC1)C(C)(C)C)C(Cl)(Cl)Cl")
+smiles(R"O=C(N[C@H]1CC[C@@H](CC1)C(C)(C)C)C(Cl)(Cl)Cl")
+smiles(R"O=C(N[C@@H]1CC[C@@H](CC1)C(C)C)Nc1ccccc1")
+smiles(R"O=C(N[C@@H]1CC[C@H](CC1)C(C)C)Nc1ccccc1")
+smiles(R"O=C(N[C@H]1CC[C@@H](CC1)C(C)C)Nc1ccccc1")
+smiles(R"O=C(N[C@@H]1CC[C@H](CC1)C[C@@H]1CC[C@H](CC1)NC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(N[C@@H]1CC[C@@H](CC1)C[C@@H]1CC[C@H](CC1)NC(=O)c1cc(O)c(O)c(O)c1)c1cc(O)c(O)c(O)c1")
+smiles(R"O=C(N[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21)N[C@@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"O=C(N[C@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3)c1ccncn1")
+smiles(R"O=C(N[C@@H]1[C@@H]2C[C@H]3C[C@@H](C2)C[C@@H]1C3)C(=O)CC(=O)c1c(C)[n+]([O-])c2ccccc2[n+]1[O-]")
+smiles(R"O=C(N[C@H]1[C@H]2C[C@@H]3C[C@H](C2)C[C@H]1C3)C(=O)CC(=O)c1c(C)[n+]([O-])c2ccccc2[n+]1[O-]")
+smiles(R"O=C(N[C@H]1[C@@H](c2ccccc2)[C@@H]1c1ccccc1)[C@H]1[C@H](c2ccccc2)[C@H]1c1ccccc1")
+smiles(R"O=CNNc1ccc2nnc(Cl)n2n1")
+smiles(R"O=C(NNc1ccccc1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(N/N=C/1\[C@](C)(C)/C(=N\NC(=O)C[N+](C)(C)C)/[C@@]1(C)C)C[N+](C)(C)C")
+smiles(R"O=C(N/N=C\1/[C@](C)(C)/C(=N/NC(=O)C[N+](C)(C)C)/[C@]1(C)C)C[N+](C)(C)C")
+smiles(R"O=C(N/N=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1ccccn1")
+smiles(R"O=C(N/N=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)c1ccccn1")
+smiles(R"O=C(N/N=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)OC(C)(C)C")
+smiles(R"O=C(N/N=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)OC(C)(C)C")
+smiles(R"O=C(N/N=C/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccncc1")
+smiles(R"O=C(N/N=C\c1ccc(cc1)c1cn2ccccc2[n+]1C)C(=O)N/N=C/c1ccc(cc1)c1cn2ccccc2[n+]1C")
+smiles(R"O=C(N/N=C/c1ccc(cc1)N1CC[C@@]2(CCCCC2)CC1)c1ccccc1")
+smiles(R"O=C(N/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1)c1ccccc1O")
+smiles(R"O=C(N/N=C/c1ccc(cc1)N1CC[C@]2(CCCCC2)CC1)c1ccc(Cl)c(Cl)c1")
+smiles(R"O=C(N/N=C/c1ccc(cc1)N1CC[C@@]2(CCCCC2)CC1)c1cccnc1")
+smiles(R"O=C(N/N=C/c1ccc(cc1)N(C)C)C(=O)N/N=C\c1ccc(cc1)N(C)C")
+smiles(R"O=C(N/N=C/c1ccc(cc1)[N+](=O)[O-])C(=O)N/N=C\c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"O=C(N/N=C/c1ccccc1[N+](=O)[O-])C(=O)N/N=C\c1ccccc1[N+](=O)[O-]")
+smiles(R"O=C(N/N=C\c1ccc(cc1)[N+](=O)[O-])C(=O)N/N=C/c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"O=C(N/N=C\c1ccccc1[N+](=O)[O-])C(=O)N/N=C/c1ccccc1[N+](=O)[O-]")
+smiles(R"O=C(NNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=C(NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)c1ccncc1")
+smiles(R"O=C(NNC(=O)[C@H]1[C@H]2CCCC[C@H]12)[C@H]1[C@H]2CCCC[C@H]12")
+smiles(R"O=C(NOC(C)(C)C)N1[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"O=C(/N=S/1\CCCC1)C(Cl)(Cl)Cl")
+smiles(R"OC=O")
+smiles(R"[O-]C(=O)[C@-]12C3=C4C5=C1[Co+3]16782345C2=C7[C@-]8(C(=O)[O-])C6=C12")
+smiles(R"[O-]C(=O)[C@@-]12C3=C4C5=C1[Co+3]16782345C2=C7[C@@-]8(C(=O)[O-])C6=C12")
+smiles(R"OC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"O=C(O[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C(O)(c1ccccc1)c1ccccc1")
+smiles(R"O=C(O[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82)C(O)(c1ccccc1)c1ccccc1")
+smiles(R"[O-]C(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=[OH+])O)C6=C12")
+smiles(R"[O-]C(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C(=[OH+])O)C6=C12")
+smiles(R"O=CO[C@]12c3ccccc3[C@](C)(c3ccccc13)[C@@]1(OC=O)c3ccccc3[C@]2(C)c2ccccc12")
+smiles(R"OC(=O)[C@@]12CC=CC[C@]2(CC=CC1)C(=O)O")
+smiles(R"O=C(O[C@]12CCCC[C@@H]2[C@@]2(CCCCC2)N=N1)c1ccccc1")
+smiles(R"OC(=O)[C@]12CC[C@H](c3ccccc13)c1ccccc21")
+smiles(R"OC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(OC12C[C@@H]3C[C@H](C[C@@H](C3)C2)C1)c1ccc(cc1)NCC1=C(Br)C(=O)C=CC1=O")
+smiles(R"O=C(O[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC(C)(C)C(=O)O")
+smiles(R"OC(=O)[C@]12[C@@H]3CC[C@@H](CC3)[C@]2(C(=O)O)[C@@H]2CC[C@H]1C2")
+smiles(R"OC(=O)[C@]12[C@@H]3CC[C@@H](O3)[C@]2(C(=O)O)[C@H]2CC[C@@H]1O2")
+smiles(R"OC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)O")
+smiles(R"OC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42I")
+smiles(R"OC(=O)[C@]12C(=O)NC(=O)[C@@]1(C(=O)O)[C@@]12CCCCC1")
+smiles(R"OC(=O)[C@]12C(=O)NC(=O)[C@]2(C(=O)O)[C@@]1(C)C")
+smiles(R"OC(=O)[C@@]1(Br)C[C@@]21c1ccccc1c1ccccc21")
+smiles(R"O=C(OC1=C2CC[C@@]3(OCCO3)[C@@]2(C)CCC21OCCO2)c1ccccc1")
+smiles(R"OC(=O)[C@]1(c2ccccc2)[C@H](C)[C@H]1C")
+smiles(R"OC(=O)c1c(Br)cc(/N=C/c2ccc(cc2)N2CC[C@]3(CCCCC3)CC2)cc1Br")
+smiles(R"OC(=O)C1(C[C@@]23CC[C@@]3(C1)C[C@](C2)(C(=O)O)C(=O)O)C(=O)O")
+smiles(R"OC(=O)[C@]1(C)C[C@]21c1ccccc1c1ccccc21")
+smiles(R"OC(=O)c1ccc2c(no[n+]2[O-])c1")
+smiles(R"OC(=O)c1ccc2C(=O)c3ccccc3c3ncnc1c23")
+smiles(R"OCOc1ccc2[nH]c3cc4c([nH]c5ccc(OCO)cc5c4=O)cc3c(=O)c2c1")
+smiles(R"OC(=O)c1ccc2[N+]([O-])ONc2c1")
+smiles(R"OC(=O)c1ccc2n[se]nc2c1")
+smiles(R"OC(=O)c1cccc2[C@@H]3CC[C@H](c12)c1c3cccc1C(=O)O")
+smiles(R"OC(=O)c1ccccc1")
+smiles(R"OC(=O)c1ccccc1c1c2ccc3ccccc3c2cc2ccc3ccccc3c12")
+smiles(R"OC(=O)c1ccccc1c1ccccc1C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OC(=O)c1ccc(cc1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OC(=O)c1cc(ccc1Cl)/N=C/1\C=C/C(=C(\c2ccccc2)/c2ccc(cc2)Nc2ccc(Cl)c(c2)C(=O)O)/C=C1")
+smiles(R"O=C(Oc1ccccc1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(Oc1ccc(cc1)[N+](=O)[O-])CN(C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(Oc1ccc(cc1)[N+](=O)[O-])CN(C(=O)OC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(=O)OC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OC(=O)c1ccccc1O")
+smiles(R"OC(=O)C1=C(C(=O)O)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl")
+smiles(R"OC(=O)c1cnccc1[C@@]12[C@@H](C(=N)NN1c1ccccc1)C(=N)NN2c1ccccc1")
+smiles(R"OC(=O)[C@@]1(N)C[C@@](O)(c2ccccc2)[C@@](O)(C1)c1ccccc1")
+smiles(R"[O-]C(=O)C1([NH2+]C[C@@H]2COCC2)CC[S@](=O)(=O)CC1")
+smiles(R"[O-]C(=O)C1([NH2+]C[C@@H]2COCC2)CC[S@@](=O)(=O)CC1")
+smiles(R"OC(=O)c1nnn(Cc2ccccc2)n1")
+smiles(R"OC(=O)c1nnn(n1)c1ccccc1")
+smiles(R"[O-]C(=O)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[O-]C(=O)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OC(=O)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OC(=O)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OC(=O)C[C@@]12C[C@@]3(C)C[C@](Br)(C1)C[C@@](Br)(C2)C3")
+smiles(R"OC(=O)C[C@]12C[C@@H]3C[C@](CC(=O)O)(C1)C[C@](C3)(CC(=O)O)C2")
+smiles(R"OC(=O)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OC(=O)C[C@]12[C@H]3[C@@H]4[C@H]5[C@H]([C@@H]1[C@@H]35)[C@H]24")
+smiles(R"O=C(OC[C@]12CO[C@]3(C)CC[C@@](C)(OC1)N23)C(C)(C)C")
+smiles(R"O=C(OC[C@@]12CO[C@@]3(C)CC[C@](C)(OC1)N23)C(O)(c1ccccc1)c1ccccc1")
+smiles(R"O=C(OC[C@]12COCN2COC1)Nc1ccc(Cl)cc1")
+smiles(R"O=C(OCc1ccccc1)[C@@H](N[Pd@](Cl)(Cl)N[C@H](C(=O)OCc1ccccc1)c1ccccc1)c1ccccc1")
+smiles(R"O=C(OCc1ccccc1)[C@@H](N[Pt@](Cl)(Cl)N[C@H](C(=O)OCc1ccccc1)c1ccccc1)c1ccccc1")
+smiles(R"O=C(OCc1ccccc1)/N=C/1\C=C/C(=N\C(=O)OCc2ccccc2)/C=C1")
+smiles(R"O=C(OCc1ccccc1)Nc1c(C)no[n+]1[O-]")
+smiles(R"O=C(OCc1ccccc1)NC1=C(C)NO[N+]1[O-]")
+smiles(R"O=C(OCc1ccccc1)N[C@H]1C[C@@]2(OC1=O)C=C(I)C(=O)C(=C2)I")
+smiles(R"O=C(OCc1ccccc1)N[C@@H]1CC[C@@H](CC1)C(=O)O")
+smiles(R"O=C(OCc1ccccc1)N[C@H]1C(=O)N[C@@H](CCc2ccccc2)NC1=O")
+smiles(R"OC(=O)Cc1ccccn1[Pt](N)(Cl)Cl")
+smiles(R"OC(=O)C[C@]1(CC[C@@H](OCc2ccccc2)CC1)C(=O)O")
+smiles(R"OC(=O)Cc1nnn(C)n1")
+smiles(R"[O-]C(=O)CC[C@]12C3=C4C5=C1[Fe+]16782345[C@H]2C7=C6C1=C82")
+smiles(R"[O-]C(=O)CC[C@@]12C3=C4C5=C1[Fe+]16782345[C@@H]2C7=C6C1=C82")
+smiles(R"[O-]C(=O)/C=C/[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[O-]C(=O)/C=C/[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[O-]C(=O)CC[C-]1C2=C3C4=C1[Fe+]1567234[C@@H]2C6=C5C1=C72")
+smiles(R"[O-]C(=O)CC[C-]1C2=C3C4=C1[Fe+]1567234[C@H]2C6=C5C1=C72")
+smiles(R"O=C(OC/C=C/1\CN2CC[C@@H]1CC2)[C@](O)(C1CCCC1)c1ccccc1")
+smiles(R"OC(=O)/C=C(\C)/[As]12(O[C@@](C)(O1)[C@H]1CC[C@H]3CCC[C@H]13)O[C@@](C)(O2)[C@@]12CCC[C@H]2CCC1")
+smiles(R"[O-]C(=O)C(C)(C)C[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[O-]C(=O)C(C)(C)C[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OC(=O)CC[C@@](C)(c1ccc(cc1)OC(=O)Nc1ccc(cc1)/N=N/c1ccccc1)c1ccc(cc1)OC(=O)Nc1ccc(cc1)/N=N/c1ccccc1")
+smiles(R"OC(=O)CCCCCCCn1ccccc1")
+smiles(R"O=C(OC(C)(C)C)[C@@H]1C(=O)[C@@H](C(=O)OC(C)(C)C)[C@@]23CCCC[C@]13[C@@H](C(=O)OC(C)(C)C)C(=O)[C@H]2C(=O)OC(C)(C)C")
+smiles(R"OC(=O)CCCCCn1ccccc1")
+smiles(R"[O-]C(=O)CCCCC(=O)[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[O-]C(=O)CCCCC(=O)[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OC(=O)CCCCn1ccccc1")
+smiles(R"O=C(OC(C)(C)C)N[C@]12[C@@H]3[C@@H]4[C@H]1[C@@H]1[C@H]2[C@H]3[C@]41NC(=O)OC(C)(C)C")
+smiles(R"OC(=O)CCCC(=O)N[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"OC(=O)CC[C@H](NC(=O)c1ccc(NCc2ccc3nc4nnnn4c(N)c3n2)cc1)C(=O)O")
+smiles(R"O=C(OCC(Cl)(Cl)Cl)N1[C@@H]2[C@H]3O[C@H]3[C@@H]([C@@H]3O[C@H]23)N1C(=O)OCC(Cl)(Cl)Cl")
+smiles(R"OC(=O)CCC/N=C(\c1ccccc1)/C(=N\CCCC(=O)O)/c1ccccc1")
+smiles(R"OC(=O)/C=C/C(=O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OC(=O)/C=C/C(=O)O")
+smiles(R"O=C(OC[C@@H]1C[C@@]2(Cl)C(=C(Cl)[C@]1(Cl)C2(Cl)Cl)Cl)[C@H]1[C@@]2(Cl)C(=C(Cl)[C@@](Cl)([C@H]1C(=O)OC[C@@H]1C[C@@]3(Cl)C(=C(Cl)[C@]1(Cl)C3(Cl)Cl)Cl)[C@@]2(Cl)Cl)Cl")
+smiles(R"OC(=O)C[C@H]1CCC[C@@H](CC(=O)O)[C@]1(C)C")
+smiles(R"OC(=O)C[C@H]1CC[C@@H](CC1)/C(=C\[C@H]1CC[C@@H](CC1)N(C)C)/[C@H]1CC[C@@H](CC1)CC(=O)O")
+smiles(R"OC(=O)C[C@@H]1NCC[C@]21OCCO2")
+smiles(R"O=C(OC[C@H]1OCO[C@@H](COC(=O)c2ccccc2)[C@H]2O[C@@](C)(C)O[C@@H]12)c1ccccc1")
+smiles(R"[O-]C(=O)C(Cl)(Cl)Cl")
+smiles(R"OC(=O)C(Cl)(Cl)Cl")
+smiles(R"OC(=O)CCn1ccccc1")
+smiles(R"O=C(OCCN1CCN(CCCN2c3ccccc3Sc3ccc(cc23)C(F)(F)F)CC1)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=C(OCCN1CCN(CCCN2c3ccccc3Sc3ccc(cc23)C(F)(F)F)CC1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"OC(=O)CCN1C(=O)[C@@]2(Cl)[C@@]3(Cl)C=C[C@@](Cl)([C@@]2(Cl)C1=O)[C@@]3(Cl)Cl")
+smiles(R"OC(=O)CC(O)(CC(=O)O)C(=O)O")
+smiles(R"OC(=O)CC(=O)[C@@H](C(=O)O)[C@H](CCc1ccccc1)[C@H](C(=O)O)C(=O)CC(=O)O")
+smiles(R"OC(=O)CCON1C(=O)[C@]2(CCCCC2)C[C@]21CCCCC2")
+smiles(R"OC(=O)[C@@H]1[C@@](Br)(c2ccccc2)[C@]1(Br)c1ccccc1")
+smiles(R"OC(=O)[C@@H]1C[C@@]21c1ccccc1c1ccccc21")
+smiles(R"OC(=O)[C@H]1C[C@]2(SCCS2)CC[C@@H]1c1ccccc1")
+smiles(R"O=CO[C@@H]1CC[C@@]2(C)[C@H](C1)C[C@@H](OC=O)[C@H]1[C@H]3CC[C@@H]([C@H](C)CCC(=O)N[C@]45C[C@@H]6C[C@@H](C[C@@H](C6)C5)C4)[C@]3(C)[C@H](OC=O)C[C@H]21")
+smiles(R"O=CO[C@@H]1CC[C@@]2(C)[C@@H](CC[C@@H]3[C@H]4CC[C@H]([C@H](C)CCC(=O)N[C@]56C[C@@H]7C[C@@H](C[C@@H](C7)C6)C5)[C@]4(C)CC[C@@H]23)C1")
+smiles(R"O=CO[C@@H]1CC[C@@]2(C)[C@@H](CC[C@@H]3[C@H]4CC[C@H]([C@H](C)CCC(=O)N[C@]56C[C@@H]7C[C@@H](C[C@@H](C7)C6)C5)[C@]4(C)[C@@H](OC=O)C[C@@H]23)C1")
+smiles(R"OC(=O)[C@H]1CCCC[C@]21OCCO2")
+smiles(R"O=C(O[C@@H]1CCC=C(C)[C@]21CCCC2)c1cc(cc(c1)[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"O=C(O[C@@H]1CCC=C(C)[C@@]21CCCC2)c1cc(cc(c1)[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"OC(=O)[C@@H]1[C@](C)(C)[C@H](C(=O)O)[C@]1(C)C")
+smiles(R"O=CO[C@@H]1[C@](C)(C)[C@@H](OC=O)[C@@]1(C)C")
+smiles(R"O=CO[C@H]1[C@](C)(C)[C@H](OC=O)[C@@]1(C)C")
+smiles(R"O=C(O[C@@H]1C(C)(C)[C@H](OC(=O)C(Cl)(Cl)Cl)[C@@]1(C)C)C(Cl)(Cl)Cl")
+smiles(R"OC(=O)[C@H]1CC[C@@H](CC1)C[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OC(=O)[C@@H]1CC[C@H](CC1)CC1CCC1")
+smiles(R"O=C(O[C@@H]1CC[C@H](CC1)C(C)(C)C)c1ccccc1")
+smiles(R"O=C(O[C@@H]1CC[C@H](CC1)C(C)(C)C)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"O=C(O[C@H]1CC[C@@H](CC1)C(C)(C)C)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"O=C(O[C@@H]1CC[C@@H](CC1)C(C)(C)C)[C@H]1CC[C@H](CC1)C(C)(C)C")
+smiles(R"O=C(O[C@@H]1CC[C@H](CC1)[Si](C)(C)C)c1ccccc1")
+smiles(R"OC(=O)[C@H]1CC[C@@H](NCc2ccccc2)CC1")
+smiles(R"O=C(O[C@@H]1C(C)(C)OC(=O)[C@]21c1ccccc1c1ccccc21)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"O=C(O[C@@H]1C(C)(C)OC(=O)[C@@]21c1ccccc1c1ccccc21)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"OC(=O)[C@@H]1C[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"OC(=O)[C@H]1C[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"O=C(O[C@@H]1C[C@H]2C=C[C@@H]1[C@@]12CC1)c1ccccc1C(=O)O")
+smiles(R"OC(=O)[C@@H]1C[C@H]2CC[C@@H]1CC2")
+smiles(R"OC(=O)[C@@H]1C[C@@H](C[C@@H](C1)C(=O)O)C(=O)O")
+smiles(R"OC(=O)[C@@H]1CCN1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"OC(=O)[C@H]1[C@H]2c3ccccc3[C@@H]([C@@H]1Br)c1ccccc21")
+smiles(R"OC(=O)[C@H]1[C@@H]2c3ccccc3[C@H]([C@H]1C)c1ccccc21")
+smiles(R"OC(=O)[C@H]1[C@@H]2C=CC=CC=C[C@@H]12")
+smiles(R"OC(=O)[C@@H]1[C@@H]2C[C@H]3C[C@@H]2C[C@@H]13")
+smiles(R"OC(=O)[C@@H]1[C@@H]2C[C@H]([C@@H]1C(=O)O)[C@H](C(=O)O)[C@H]2C(=O)O")
+smiles(R"O=C(O[C@H]1[C@H]2CCN(CC2)[C@H]1CN1CCC(=CC1)c1ccccc1)C(O)(c1ccccc1)c1ccccc1")
+smiles(R"OC(=O)[C@@H]1[C@@H](Br)[C@]2(C)c3ccccc3[C@@]1(C)c1ccccc21")
+smiles(R"OC(=O)[C@@H]1[C@H](c2ccccc2)[C@H](C(=O)O)[C@H]1c1ccccc1")
+smiles(R"O=C(O[C@H]1[C@H](COC(=O)c2ccccc2)O[C@@H](c2nn[nH]n2)[C@@H]1OC(=O)c1ccccc1)c1ccccc1")
+smiles(R"OC(=O)[C@H]1[C@H](C(=O)O)[C@]1(C)C")
+smiles(R"OC(=O)[C@@H]1[C@@H](C(=O)O)[C@]2(Cl)C(=C(Cl)[C@@]1(Cl)[C@@]2(Cl)Cl)Cl")
+smiles(R"OC(=O)[C@@H]1[C@@H](C(=O)O)[C@@H]2c3ccccc3[C@H]1c1ccccc21")
+smiles(R"OC(=O)[C@@H]1[C@@H](C(=O)O)[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"OC(=O)[C@@H]1[C@@H](C(=O)O)[C@@H](C(=O)O)[C@H]1C(=O)O")
+smiles(R"OC(=O)[C@H]1[C@@H](C(=O)O)[C@H](C(=O)O)[C@H]1C(=O)O")
+smiles(R"O=C(O[C@@H]1[C@@H](OC(=O)C(Cl)Cl)[C@H](OC(=O)C(Cl)Cl)[C@@H](OC(=O)C(Cl)Cl)[C@H](OC(=O)C(Cl)Cl)[C@H]1OC(=O)C(Cl)Cl)C(Cl)Cl")
+smiles(R"O=C(O[C@@H]1CN2CC[C@H]1CC2)C1CC(=O)N(C)C(=O)C1")
+smiles(R"O=C(O[C@@H]1CN2CC[C@@H]1CC2)CC(=O)c1ccccc1")
+smiles(R"O=C(O[C@H]1CN2CC[C@@H]1CC2)[C@H](c1ccccc1)C1(O)CCCC1")
+smiles(R"O=C(O[C@H]1CN2CC[C@H]1CC2)[C@@](O)(c1ccccc1)c1cccc2CC(C)(C)Oc12")
+smiles(R"O=C(O[C@@H]1CN2CC[C@H]1CC2)[C@@](O)(Cc1ccccc1)C1CC1")
+smiles(R"OC(=O)[C@@H]1CS[C@]2(CCCC2)N1")
+smiles(R"OC(=O)[C@@H]1N[Pt@@](Cl)(Cl)N[C@@H]1C(=O)O")
+smiles(R"OC(=O)[C@H](c1ccccc1)[S@@](=O)(=O)[C@H](C(=O)O)c1ccccc1")
+smiles(R"O=C(O[C@@H]([C@@H]1O[C@@H](OC[C@H]1OC(=O)c1ccccc1)c1ccccc1)[C@@H]1O[C@@H](OC[C@H]1OC(=O)c1ccccc1)c1ccccc1)c1ccccc1")
+smiles(R"OC(=O)[C@@H]([C@@H](C)[C@H](C(=O)O)S(=O)(=O)O)S(=O)(=O)O")
+smiles(R"O=C(O[C@@H]([C@H](COC(=O)c1ccccc1)OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1")
+smiles(R"O=C(O[C@H]([C@H](COC(=O)c1ccccc1)OC(=O)c1ccccc1)[C@@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1")
+smiles(R"O=C(O[C@@H]([C@H](COC(=O)c1ccccc1)OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1")
+smiles(R"OC(=O)[C@@H](Cl)C12C[C@]3(C)C[C@@](C)(C[C@@](C)(C3)C2)C1")
+smiles(R"OC(=O)[C@@H](C)O")
+smiles(R"O=C(O[C@@H](COC(c1ccccc1)(c1ccccc1)c1ccccc1)[C@@H]1O[C@@](C)(C)O[C@H]1[C@H](COC(c1ccccc1)(c1ccccc1)c1ccccc1)OC(=O)c1ccccc1)c1ccccc1")
+smiles(R"O=C(O[C@@H](CO[C@H]1O[C@@H](COC(=O)c2ccccc2)[C@H](OC(=O)c2ccccc2)[C@@H](OC(=O)c2ccccc2)[C@H]1OC(=O)c1ccccc1)[C@H](OC(=O)c1ccccc1)[C@@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1")
+smiles(R"O=C(O[C@@H](COC(=O)c1ccccc1)[C@@H](OC(=O)c1ccccc1)c1cnn(n1)c1ccccc1)c1ccccc1")
+smiles(R"OC(=O)[C@@H](C)[S@](=O)(=O)[C@@H](C)C(=O)O")
+smiles(R"OC(=O)[C@@H](C)[S@@](=O)(=O)[C@H](C)C(=O)O")
+smiles(R"OC(=O)[C@@H](NC(C)(C)C)[C@]12C[C@]3(C)C[C@@](C)(C[C@@](C)(C3)C2)C1")
+smiles(R"OC(=O)[C@H](N)CSC[C@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"OC(=O)[C@H](N)CSC[C@@-]12C3=C4C5=C1[Fe+2]16782345[C-]2C7=C6C1=C82")
+smiles(R"[O-]C(=O)[C@H]([NH2+]C(C)(C)C)[C@]12C[C@]3(C)C[C@@](C)(C[C@@](C)(C3)C2)C1")
+smiles(R"[O-]C(=O)[C@H]([NH2+]C(C)(C)C)C12C[C@@]3(C)C[C@](C)(C[C@](C)(C3)C2)C1")
+smiles(R"OC(=O)[C@@H](N[Pd@](Cl)(Cl)N[C@@H](C(=O)O)c1ccccc1)c1ccccc1")
+smiles(R"OC(=O)[C@@H](N[Pt@](Cl)(Cl)N[C@@H](C(=O)O)c1ccccc1)c1ccccc1")
+smiles(R"OC(=O)[C@@H](O)[C@H](O)C(=O)O")
+smiles(R"OC(=O)C[N@@+]12CC[N@@+]34CC(=O)O[Rh]24([O-])(OC(=O)C1)OC(=O)C3")
+smiles(R"OC(=O)C[N@@+]12CC[N@+]34CC(=O)O[Rh]24([O-])(OC(=O)C1)OC(=O)C3")
+smiles(R"OC(=O)C[N@@+]12CC(=O)O[Rh]342([O-])OC(=O)C[N@@+]4(CC(=O)O3)[C@H](C)C1")
+smiles(R"OC(=O)C[N@@+]12CC(=O)O[Rh]342([O-])OC(=O)C[N@+]4(CC(=O)O3)[C@H](C)C1")
+smiles(R"O=C(OCn1ccc2c(c1)c(C)c1c([nH]c3ccccc13)c2C)c1ccccc1")
+smiles(R"OC(=O)Cn1ccccc1")
+smiles(R"OC(=O)C[N+]1(CC(=O)O)[C@H]2CCCC[C@H]2[N+](CC(=O)O)(CC(=O)O)[Pd@@]1(Cl)Cl")
+smiles(R"OC(=O)C[N+]1(CC(=O)O)[C@@H]2CCCC[C@H]2[N+](CC(=O)O)(CC(=O)O)[Pt@]1(Cl)Cl")
+smiles(R"OC(=O)CN1C(=O)[C@@H]2[C@H]3c4ccccc4[C@H](c4ccccc34)[C@@H]2C1=O")
+smiles(R"OC(=O)C/N=C(\c1ccccc1)/C(=N\CC(=O)O)/c1ccccc1")
+smiles(R"OC(=O)COc1c(Cl)cc(/N=C/c2ccc(cc2)N2CC[C@@]3(CCCCC3)CC2)cc1Cl")
+smiles(R"OC(=O)C(=O)O")
+smiles(R"OC(=O)CP(=O)([O-])[O-]")
+smiles(R"O=C([OH+][Ti]12345678([OH+]C(=O)C(F)(F)C(F)(F)F)(C9=C3C2=C1[C@H+]49)C1=C6C7=C5[C@@H+]81)C(F)(F)C(F)(F)F")
+smiles(R"O=C(O/N=C/1\c2ccccc2[C@H](Br)[C@@H](Br)c2ccccc12)c1cc(cc(c1)[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"O=C(O/N=C\1/c2ccccc2[C@H](Br)[C@@H](Br)c2ccccc12)c1cc(cc(c1)[N+](=O)[O-])[N+](=O)[O-]")
+smiles(R"O=C(ON[C@@H]1CC[C@H](CC1)CC1CCCCC1)c1ccccc1")
+smiles(R"OC(=O)P(=O)([O-])[O-]")
+smiles(R"O=C(O[Sn@@](OC(=O)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)(c1ccccc1)c1ccccc1)[C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@@H]82")
+smiles(R"OC[P+](CO)(CO)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"OC[P+](CO)(CO)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O+]#C[Rh@@]1(Cl)[AsH](C[AsH](c2ccccc2)(c2ccccc2)[Rh@](Cl)(C#[O+])[AsH](C[AsH]1(c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"O=C(Sc1ccccc1)[C@H]1O[C@@]21CCCCC2")
+smiles(R"O[Cu+2](O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[Cu+2](O)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O+]#C[W+]12345(C#[O+])([OH+]/[N+]/1=C(\C)/C=C(C)C)[C@@H]1C4=C3C2=C51")
+smiles(R"[OH2-][H+]([OH2-])[OH2-]")
+smiles(R"[OH]#C[Ru]123456([C@@H]7C3=C2C1=C47)C(=O)[Ru]12346(C#[OH])([C@H]6C3=C2C1=C46)C5=O")
+smiles(R"[OH]#C[Ru]123456(C(=O)[Ru]789%102(C#[OH])(C1=O)C1(=C9(C)C8(=C7(C)[C@]%101C)C)C)[C@]1(C)C5(=C4(C)C3(=C61C)C)C")
+smiles(R"[OH-][H+]([OH-])[OH-]")
+smiles(R"O[Mg+2](O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[Mg+2](O)(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"ON1C(C)(C)CC(/N=C\C=N\C2CC(C)(C)N(O)C(C)(C)C2)CC1(C)C")
+smiles(R"O=[N+]1[C@@H]2[C@H]3CC[C@H](C3)[C@H]2[N+](=O)[Co]23451[C@H]1C4=C3C2=C51")
+smiles(R"O=[N+]1[CH-]N=C2NNNC2=C1N")
+smiles(R"[O-][n+]1c(N)c(C(=O)NC23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)[n+]([O-])c2ccccc12")
+smiles(R"[O-][n+]1c([nH]n(C)c2[nH]c(=O)n(C)c(=O)c12)c1ccc2OCOc2c1")
+smiles(R"[O-][n+]1c([nH]n(C)c2[nH]c(=O)n(C)c(=O)c12)c1cccnc1")
+smiles(R"[O-][n+]1c(nn(C)c2nc(=O)n(C)c(=O)c12)c1ccc2OCOc2c1")
+smiles(R"[O-][n+]1c(nn(C)c2nc(=O)n(C)c(=O)c12)c1cccnc1")
+smiles(R"ON1C(=O)[C@@]2(CCCCC2)C(=N)[C@@]21CCCCC2")
+smiles(R"ON1C(=O)C[C@@H]2[C@H]1C=C[C@]12CCCC1")
+smiles(R"[O-][n+]1nc2c(cc3ccc(Cl)[nH]n23)cc1C")
+smiles(R"[O-][N+]1ONc2cc(ccc12)[N+](=O)[O-]")
+smiles(R"[O-][N+]1ONc2[nH]c(=N)[nH]c(=N)c12")
+smiles(R"ON[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O/N=C/1\[C@@]2(CCCC=C2)NC(=O)[C@@]21CCCCC2")
+smiles(R"O/N=C/1\[C@]2(CCCCC2)N(O)C(=O)[C@@]21CCCCC2")
+smiles(R"O/N=C/1\[C@@]2(CCCC=C2)N(O)C(=O)[C@@]21CCCCC2")
+smiles(R"O/N=C/1\C[C@]2(CC[C@@]1(CC2)c1ccccc1)N1CCOCC1")
+smiles(R"O/N=C/1\C[C@@]2(CC[C@]1(CC2)Cc1ccccc1)N1CCOCC1")
+smiles(R"O=Nc1cc2nc3c(nc2cc1N=O)c1ccccc1c1ccccc31")
+smiles(R"O/N=C\1/C=C/C(=C(/C#N)\c2cccc3ccccc23)/C=C1")
+smiles(R"O/N=C/1\C=C/C(=C(\C#N)/c2ccc(Cl)cc2)/C=C1")
+smiles(R"O/N=C/1\[C@](C)(C)/C(=N/O)/[C@@]1(C)C")
+smiles(R"O/N=C/1\C=C/C(=N\O)/C2=C1[C@@H]1c3ccccc3[C@@]2(C(=O)OC)c2ccccc12")
+smiles(R"O/N=C/1\C=C/C(=N\O)/C2=C1[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"O/N=C\1/C[C@H]2CCCC[C@H]2C/C1=N\O")
+smiles(R"O/N=C/1\C[C@@H](c2ccccc2)N(C)[C@@H](C1)c1ccccc1")
+smiles(R"O/N=C/1\C[C@@H](c2ccccc2)N(N=O)[C@@H](C1)c1ccccc1")
+smiles(R"[O-]/N(=C/1\C=C([N+](=O)[O-])C2(OC3C(O2)C(COP(=O)(O)OP(=O)(O)OP(=O)(O)O)OC3n2cnc3c(N)ncnc23)C(=C1)[N+](=O)[O-])/O")
+smiles(R"O/N=C\1/[C@@H](CCC[C@H]1CN(C)C)CN(C)C")
+smiles(R"O/N=C\1/[C@H](CC[C@@H]1CN(C)C)CN(C)C")
+smiles(R"O=Nc1c(N)nc(n(C)c1=O)[S+](C)[Pd@@](Cl)(Cl)[S+](C)c1nc(N)c(N=O)c(=O)n1C")
+smiles(R"O/N=C/1\C(=N\NC(=S)N)\CC(C)(C)C\C1=N/NC(=S)N")
+smiles(R"O/N=C/1\C(=O)N/C(=N)/NC1=O")
+smiles(R"O/N=C(\c1ccccc1)/[C@@H]1[C@H](c2ccccc2)[C@H]1/C(=N/O)/c1ccccc1")
+smiles(R"O/N=C/c1cnn(n1)c1ccccc1")
+smiles(R"O/N=C/c1nc2ncnc3ccn1c23")
+smiles(R"O/N=C/c1[nH]c(Cc2[nH]c(/C=N\O)c(C)c2C(=O)OCC)c(C(=O)OCC)c1C")
+smiles(R"O/N=C(/C)\[C@@]12C3=C4C5=C1[Fe]16782345[C@H]2C7=C6C1=C82")
+smiles(R"[O-][N+](C)(C)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](C)(C)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O/N=C(\C)/C(=N\O)/C")
+smiles(R"O/N=C(/C[N@@+]12CN3CN(CN(C3)C2)C1)\c1ccccc1")
+smiles(R"O/N=C(/C[N@@+]12CN3CN(CN(C3)C2)C1)\c1ccc(I)cc1")
+smiles(R"O/N=C(/C(=N/NC(=O)c1ccccc1)/C)\C(=N\NC(=O)c1ccccc1)\C")
+smiles(R"O/N=C(/C(=N/NC(=O)Cc1ccccc1)/C)\C(=N\NC(=O)Cc1ccccc1)\C")
+smiles(R"O/N=C(\C(=N\O)\[C@H](C#N)c1ccc(Cl)cc1)/[C@H](C#N)c1ccc(Cl)cc1")
+smiles(R"O=N[C@H]1C(=O)N/C(=N)/NC1=O")
+smiles(R"ONC(=O)[C@]12[C@H]3[C@H]4[C@@H]2[C@H]2[C@@H]1[C@@H]3[C@@]42C(=O)NO")
+smiles(R"ONC(=O)C[C@@]12[C@H]3[C@H]4[C@@H]1[C@H]1[C@@H]2[C@@H]3[C@@]41CC(=O)NO")
+smiles(R"ONC(=O)[C@@H]1CCCC[C@@]21OCCO2")
+smiles(R"O[Ni](O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O+]#[N+][Mn]123456([C@@H]7C3=C2C1=C47)C(=O)[Mn]12346([N+]#[O+])([C@H]6C3=C2C1=C46)C5=O")
+smiles(R"O=NN1[C@H]2c3ccccc3[C@@H]1c1ccccc21")
+smiles(R"O=NN1CN2CN(N=O)CN(C2)C1")
+smiles(R"O=NN(C)C(=O)N[C@H]1CC[C@H](CC1)NC(=O)N(C)N=O")
+smiles(R"O=NN([C@H]1CC[C@@H](CC1)C(=O)O)C(=O)N[C@@H]1CC[C@H](CC1)C(=O)O")
+smiles(R"O=NN([C@H]1CC[C@@H](O)CC1)C(=O)N[C@@H]1CC[C@H](O)CC1")
+smiles(R"[O-][N+](=O)[C@]12c3ccccc3[C@@H](C[C@]2(Br)C(=O)Cl)c2ccccc12")
+smiles(R"[O-][N+](=O)[C@@]12c3ccccc3[C@H](C[C@]2(Br)C(=O)Cl)c2ccccc12")
+smiles(R"[O-][N+](=O)[C@]12CC[C@H](c3ccccc13)c1ccccc21")
+smiles(R"[O-][N+](=O)[C@@]12CC[C@@H](c3ccccc13)c1ccccc21")
+smiles(R"[O-][N+](=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)[C@]1(Br)CC[C@@](Br)(CC1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)[C@@]1(Br)CC[C@](Br)(CC1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1c2ccc(Cl)[nH]n2c2n[n+]([O-])c(C)cc12")
+smiles(R"[O-][N+](=O)c1c2nn(nc2c2nonc2c1O)c1ccccc1")
+smiles(R"[O-][N+](=O)C1=C[C-]2C(=[N+]([O-])[C@]3(CCCCC3)[N+]2=O)C=C1")
+smiles(R"[O-][N+](=O)C1=C[C-]2C(=[N+]([O-])[C@@]3(CCCCC3)[N+]2=O)C=C1")
+smiles(R"[O-][N+](=O)c1cc2n[nH][nH]c2c2[nH]onc12")
+smiles(R"[O-][N+](=O)c1cc2nn[nH]c2c2nonc12")
+smiles(R"[O-][N+](=O)c1cc(Br)c2c(c1)C(=O)c1cc(cc([N+](=O)[O-])c21)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1ccc2c3ccccc3[C@H](N3C[C@@H]4CC[C@@H](CC4)C3)c2c1")
+smiles(R"[O-][N+](=O)c1ccc2c(c1)[C@@H](N1C[C@@H]3CC[C@@H](CC3)C1)c1ccccc21")
+smiles(R"ON(=O)c1ccc2c(c1)n1c(N3CCCC3)n3ccccc3c1c1c3ccccn3c(N3CCCC3)n21")
+smiles(R"[O-][N+](=O)c1ccc2c(c1)n1c(N(C)C)[n+]3ccccc3c1c1c3ccccn3c(N(C)C)[n+]21")
+smiles(R"[O-][N+](=O)c1ccc2c(no[n+]2[O-])c1")
+smiles(R"[O-][N+](=O)c1ccc2[n+]3C(N(C)C)N4CCCCC4c3c3n(c2c1)c(N(C)C)[n+]1ccccc31")
+smiles(R"[O-][N+](=O)c1ccc2nc3c4cccc5cc6ccccc6c(c3nc2c1)c45")
+smiles(R"[O-][N+](=O)c1ccc2nc3c(nc2c1)c1cccc2cccc3c12")
+smiles(R"[O-][N+](=O)c1ccc2[nH]c3c4cccc5cc6ccccc6c(c3[nH]c2c1)c45")
+smiles(R"[O-][N+](=O)c1ccc2[nH]c3c([nH]c2c1)c1cccc2cccc3c12")
+smiles(R"[O-][N+](=O)c1ccc2[nH][se][nH]c2c1")
+smiles(R"[O-][N+](=O)c1ccc2[nH]s[nH]c2c1")
+smiles(R"[O-][N+](=O)c1ccc2n[se]nc2c1")
+smiles(R"[O-][N+](=O)c1ccc2nsnc2c1")
+smiles(R"[O-][N+](=O)c1cccc2c1[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"[O-][N+](=O)c1cccc2c1[C@H]1c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"[O-][N+](=O)c1cccc2c3nonc3ccc12")
+smiles(R"[O-][N+](=O)c1cccc2c3NONc3ccc12")
+smiles(R"[O-][N+](=O)[C@]1(C)C=C[C@@]2(C=C1)OC(=O)C(C)(C)O2")
+smiles(R"[O-][N+](=O)[C@@]1(C)C=C[C@]2(C=C1)OC(=O)C(C)(C)O2")
+smiles(R"[O-][N+](=O)c1ccccc1[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@]8(c3ccccc3[N+](=O)[O-])C6=C12")
+smiles(R"[O-][N+](=O)c1ccccc1[C@@]12C3=C4C5=C1[Fe]16782345C2=C7[C@@]8(c3ccccc3[N+](=O)[O-])C6=C12")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@]12CCCC(=O)[C@H]1[C@H]1C(=O)CCC[C@@]21c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@@]12CCCC(=O)[C@@H]1[C@@H]1C(=O)CCC[C@]21c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1ccc(cc1)C1=C(N=c2ccccc2=c2ccccc2=N1)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)C1CCC(CC1)C1=C(N=C2CCCCC2C2CCCCC2=N1)c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cccc(c1)c1n[n+](c2ccc(cc2)c2ccc(cc2)[n+]2nc(nn2c2ccccc2)c2cccc(c2)[N+](=O)[O-])n(n1)c1ccccc1")
+smiles(R"[O-][N+](=O)c1cccc(c1)c1nn(c2ccccc2)[n+](n1)c1ccc(cc1)c1ccc(cc1)[n+]1nc([nH]n1c1ccccc1)c1cccc(c1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1ccc(cc1)c1nnc(o1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)c1nnc(o1)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@@H]1N2CCCC[C@@H]2[C@@H]2CCCCN12")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@H]1N2CCCC[C@H]2[C@H]2CCCCN12")
+smiles(R"[O-][N+](=O)c1cccc(c1)[C@@H]1OC[C@]2(CO1)CO[C@@H](OC2)c1cccc(c1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cccc(c1)[C@@H]1OC[C@@]2(CO1)CO[C@H](OC2)c1cccc(c1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@H]1O[C@H]1C(=O)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1cccc(c1)[C@H]1O[C@H]1C(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1cccc(c1)[C@H]1O[C@H]1C(=O)C12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@@H]1ON=C(c2ccccc2)N1C12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@@H](/N=C/c1ccc(cc1)[N+](=O)[O-])/N=C/c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1ccc(cc1)[C@H](/N=C/c1ccc(cc1)[N+](=O)[O-])/N=C/c1ccc(cc1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1ccc(cc1)Cn1c2cc3c(Cl)c(=O)c4ccccc4c3cc2nc2ccccc12")
+smiles(R"[O-][N+](=O)c1ccc(cc1)Cn1c2cc3c(Cl)c(=O)c4CCCCc4c3cc2nc2ccccc12")
+smiles(R"[O-][N+](=O)c1ccc(cc1)/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)/C=N/C12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccccc1/C=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccccc1/C=N/C12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)CSc1nnc(n1C)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)CSc1nnc(n1C)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1cc(ccc1F)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)[C@]1(Cl)Cl)Cl")
+smiles(R"[O-][N+](=O)c1cc(ccc1F)N1C(=O)[C@@H]2[C@H](C1=O)[C@]1(Cl)C(=C(Cl)[C@@]2(Cl)C1(Cl)Cl)Cl")
+smiles(R"[O-][N+](=O)c1ccc(cc1)n1nc2c(ccc3[n+]([O-])onc23)n1")
+smiles(R"[O-][N+](=O)c1ccc(cc1)n1[nH]c2ccc3[n+]([O-])onc3c2n1")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C/1\C=C[C@](C)(C=C1)C(C)(Cl)Cl)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C\1/C=C[C@@](C)(C=C1)C(C)(Cl)Cl)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C/1\C=C[C@](C)(C=C1)C(Cl)(Cl)Cl)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C\1/C=C[C@@](C)(C=C1)C(Cl)(Cl)Cl)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C/1\[C@@H]2CC[C@H]1CC2)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C/1\[C@H]2CC[C@@H]1CC2)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C/C12C[C@H]3C[C@H](C[C@H](C3)C2)C1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C(/c1ccccc1)\C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])\c1ccccc1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(ccc1N/N=C(\c1ccccc1)/C(=N\Nc1ccc(cc1[N+](=O)[O-])[N+](=O)[O-])/c1ccccc1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc(cc(c1)[N+](=O)[O-])c1nnc(o1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1cc(cc(c1)[N+](=O)[O-])c1nnc(o1)C12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)c1cccc(/C=c/2\sc3nc4ccccc4n3c2=O)c1")
+smiles(R"[O-][N+](=O)c1cccc(/C=c/2\sc3[nH]c4ccccc4n3c2=O)c1")
+smiles(R"[O-][N+](=O)c1cccc(/C=C/C(=O)[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c1")
+smiles(R"[O-][N+](=O)c1cccc(/C=C/C(=O)[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)c1")
+smiles(R"[O-][N+](=O)c1cccc(/C=N/[C@]23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"[O-][N+](=O)c1cccc(/C=N/C23C[C@@H]4C[C@@H](C[C@@H](C4)C3)C2)c1")
+smiles(R"[O-][N+](=O)c1cccc(/N=N/c2ccc(c(O)c2)C(=O)[OH+][Pt@@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]C(=O)c2ccc(/N=N/c3cccc(c3)[N+](=O)[O-])cc2O)c1")
+smiles(R"[O-][N+](=O)c1cccc(/N=N/c2ccc(c(O)c2)C(=O)[OH+][Pt@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]C(=O)c2ccc(/N=N/c3cccc(c3)[N+](=O)[O-])cc2O)c1")
+smiles(R"[O-][N+](=O)c1c(C)no[n+]1[O-]")
+smiles(R"[O-][N+](=O)c1cc([N+](=O)[O-])c2[nH]n(c3ccccc3)[n+]([O-])c2c1")
+smiles(R"[O-][N+](=O)c1cc([N+](=O)[O-])c2nn(c3ccccc3)[n+]([O-])c2c1")
+smiles(R"[O-][N+](=O)c1cc([N+](=O)[O-])c2nonc2c1O")
+smiles(R"[O-][N+](=O)c1cc([N+](=O)[O-])c2NONc2c1O")
+smiles(R"[O-][N+](=O)c1cc([N+](=O)[O-])c2no[n+]([O-])c2c1Nc1ccccc1")
+smiles(R"[O-][N+](=O)c1cc([N+](=O)[O-])c2NO[N+]([O-])c2c1Nc1ccccc1")
+smiles(R"[O-]/N(/O)=C\1/C=C([N+](=O)[O-])C2(OC3C(O2)C(COP(=O)(O)OP(=O)(O)OP(=O)(O)O)OC3n2cnc3c(N)ncnc23)C(=C1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cc([N+](=O)[O-])c(O)c(c1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)[C@]1(C)CO[C@]2(OC1)C(C)(C)[C@@]1(OC[C@](C)(CO1)[N+](=O)[O-])C2(C)C")
+smiles(R"[O-][N+](=O)[C@@]1(C)CO[C@]2(OC1)C(C)(C)[C@@]1(OC[C@@](C)(CO1)[N+](=O)[O-])C2(C)C")
+smiles(R"[O-][N+](=O)[C@]1(C)CO[C@H](/C=C/c2ccccc2)OC1")
+smiles(R"[O-][N+](=O)[C@]1(C)CO[C@H](CCc2ccccc2)OC1")
+smiles(R"[O-][N+](=O)[C@@]1(C)CO[C@@H](/C=C/c2ccccc2)OC1")
+smiles(R"[O-][N+](=O)[C@@]1(C)CO[C@@H](CCc2ccccc2)OC1")
+smiles(R"[O-][N+](=O)[C@]1(C)CO[C@H](OC1)Cc1ccccc1")
+smiles(R"[O-][N+](=O)[C@@]1(C)CO[C@@H](OC1)Cc1ccccc1")
+smiles(R"[O-][N+](=O)[C@]1(Cl)CC[C@@](Cl)(CC1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)[C@@]1(Cl)CC[C@](Cl)(CC1)[N+](=O)[O-]")
+smiles(R"[O-][N+](=O)c1cnc2[nH]s[nH]c2c1N")
+smiles(R"[O-][N+](=O)c1cnc2nsnc2c1N")
+smiles(R"[O-][N+](=O)c1cnc(c2scc(/C=N/N3CC[S@](=O)(=O)CC3)n2)n1C")
+smiles(R"[O-][N+](=O)c1cnc(c2scc(/C=N/N3CC[S@@](=O)(=O)CC3)n2)n1C")
+smiles(R"[O-][N+](=O)c1c[nH]n([nH]1)c1ccccc1")
+smiles(R"[O-][N+](=O)c1cnn(n1)c1ccccc1")
+smiles(R"[O-][N+](=O)c1c(O)c2[nH]onc2c2nn([nH]c12)c1ccccc1")
+smiles(R"[O-][N+](=O)[C@]1(C[Se]c2ccccc2)CC[C@@H](CC1)C(C)(C)C")
+smiles(R"[O-][N+](=O)[C@@]1(C[Se]c2ccccc2)CC[C@H](CC1)C(C)(C)C")
+smiles(R"[O-][N+](=O)Cc1cnc2[nH]ncn2[nH]1")
+smiles(R"[O-][N+](=O)Cc1cnc2nncn2n1")
+smiles(R"[O-][N+](=O)/C=C/1\[SH+][Co+3]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2")
+smiles(R"[O-][N+](=O)/C=C\1/[SH+][Co+3]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2")
+smiles(R"[O-][N+](=O)/C=C/1\[SH+][Ni+2]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2")
+smiles(R"[O-][N+](=O)/C=C\1/[SH+][Ni+2]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2")
+smiles(R"[O-][N+](=O)/C=C/1\[SH+][Pt+2]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2")
+smiles(R"[O-][N+](=O)/C=C\1/[SH+][Pt+2]2([SH+]1)[SH+]/C(=C/[N+](=O)[O-])/[SH+]2")
+smiles(R"[O-][N+](=O)/C(=C(/N[C@H](C)C12C[C@H]3C[C@@H](C[C@H](C3)C2)C1)\N[C@@H](C)C12C[C@H]3C[C@H](C[C@@H](C3)C2)C1)/C(=C(Cl)Cl)Cl")
+smiles(R"[O-][N+](=O)[C@H]1C[C@]21c1ccccc1c1ccccc21")
+smiles(R"[O-][N+](=O)[C@H]1C[C@@]21c1ccccc1c1ccccc21")
+smiles(R"[O-][N+](=O)[C@@H]1CC[C@@H](CC1)C1=CS[C@H]2CCCC[C@@H]2N1")
+smiles(R"[O-][N+](=O)[C@H]1CC[C@H](CC1)C1=CS[C@H]2CCCC[C@@H]2N1")
+smiles(R"[O-][N+](=O)[C@H]1[C@@H](c2ccccc2)[C@]21c1ccccc1c1ccccc21")
+smiles(R"[O-][N+](=O)[C@H]1[C@@H](c2ccccc2)[C@@]21c1ccccc1c1ccccc21")
+smiles(R"[O-][N+](=O)[C@@H]1C(=[O+][Cu@]2([O+]=C1C)[O+]=C(C)[C@H]([N+](=O)[O-])C(=[O+]2)C)C")
+smiles(R"[O-][N+](=O)[C@@H]1C(=[O+][Cu@@]2([O+]=C1C)[O+]=C(C)[C@@H]([N+](=O)[O-])C(=[O+]2)C)C")
+smiles(R"[O-][N+](=O)[C@@H]([C@H](CC(=O)c1ccccc1)c1ccccc1)[C@H](CC(=O)c1ccccc1)c1ccccc1")
+smiles(R"[O-][N+](=O)[C@H]([C@H](CC(=O)c1ccccc1)c1ccccc1)[C@H](CC(=O)c1ccccc1)c1ccccc1")
+smiles(R"[O-][N+](=O)[C@@H](/C=N/c1ccccc1)/C=N/c1ccccc1")
+smiles(R"[O-][N+](=O)[C@H](/C=N/c1ccccc1)/C=N/c1ccccc1")
+smiles(R"[O-][N+](=O)[O-]")
+smiles(R"[O-][N+](=O)O")
+smiles(R"ON(=O)O")
+smiles(R"[O-][N+](=O)O[Ca](O[N+](=O)[O-])(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)O[Ca](O[N+](=O)[O-])(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)O[Co]1234([S+]=C([N-][N+]3=C(C)c3cccc[n+]13)N1C[C@H]3CC[C@H](CC3)C1)[S+]=C([N-][N+]4=C(C)c1cccc[n+]21)N1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"[O-][N+](=O)O[Co]1234([S+]=C([N-][N+]3=C(C)c3cccc[n+]13)N1C[C@H]3CC[C@H](CC3)C1)[S+]=C([N-][N+]4=C(C)c1cccc[n+]21)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"[O-][N+](=O)O[Co]123(O[N+](=O)[O-])[N@+]4(CC[N@@+]1(CC[N@+]2(CC[N@+]3(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1")
+smiles(R"[O-][N+](=O)O[Co]123(O[N+](=O)[O-])[N@+]4(CC[N@+]1(CC[N@+]3(CC[N@@+]2(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1")
+smiles(R"[O-][N+](=O)O[Cu]123(O[N+](=O)[O-])[N@+]4(CC[N@@+]1(CC[N@+]2(CC[N@+]3(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1")
+smiles(R"[O-][N+](=O)O[Cu]123(O[N+](=O)[O-])[N@+]4(CC[N@+]1(CC[N@+]3(CC[N@@+]2(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1")
+smiles(R"[O-][N+](=O)O[Pd](O[N+](=O)[O-])(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)O[Pd@@](O[N+](=O)[O-])(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-][N+](=O)O[Pt@]1(O)N[C@@H]2CCCC[C@H]2N1")
+smiles(R"[O-][N+](=O)O[Pt@@]1(O)N[C@@H]2CCCC[C@H]2N1")
+smiles(R"[O-][N+](=O)O[Zn]123(O[N+](=O)[O-])[N@+]4(CC[N@@+]1(CC[N@+]2(CC[N@+]3(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1")
+smiles(R"[O-][N+](=O)O[Zn]123(O[N+](=O)[O-])[N@+]4(CC[N@+]1(CC[N@+]3(CC[N@@+]2(CC4)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1)Cc1ccccc1")
+smiles(R"O=NO[Pd@]1(Cl)N[C@@H]2CCCC[C@H]2N1")
+smiles(R"O=P12CN3CN(C1)C[N@@+](C)(C3)C2")
+smiles(R"O=P1(OCC2(CO1)COP(=O)(OC2)N1C[C@H]2CC[C@H](CC2)C1)N1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"O=P(c1ccccc1)([C@@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82)[C@]12C3=C4C5=C1[Fe]16782345C2=C7C6=C1[C@H]82")
+smiles(R"O/[P@@H](=N/[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)/c1ccccc1")
+smiles(R"O/[P@@H](=N/[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)/OCC(C)(C)N")
+smiles(R"O/[P@H](=N/[N+]1(C)CCCCC1)/NN1CCCCC1")
+smiles(R"O=P(N1CC1)(N1CC1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=P(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N1CC1)c1ccccc1")
+smiles(R"O=P(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)(N1CC1)N1CC1")
+smiles(R"O=P(Oc1ccccc1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N1CC1")
+smiles(R"O=P(Oc1ccccc1)(Oc1ccccc1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"O=P(OCc1ccccc1)(OCc1ccccc1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"[O-]P(=O)([O-])O")
+smiles(R"OP(=O)(O)O")
+smiles(R"OP(=O)(O)O[C@@H]1[C@@H](OP(=O)(O)O)[C@@H](OP(=O)(O)O)[C@H](OP(=O)(O)O)[C@H](OP(=O)(O)O)[C@@H]1OP(=O)(O)O")
+smiles(R"OP(=O)(O)O[C@H]1[C@H](OP(=O)(O)O)[C@@H](OP(=O)(O)O)[C@@H](OP(=O)(O)O)[C@@H](OP(=O)(O)O)[C@@H]1OP(=O)(O)O")
+smiles(R"OP(=O)(O)O[Pt@]1(O)N[C@@H]2CCCC[C@H]2N1")
+smiles(R"[O-][Pt@@+2]1([O-])N[C@@H]2CCCC[C@H]2N1")
+smiles(R"[O-][Pt+2]1([O-])N[C@@H]2CCCC[C@H]2N1")
+smiles(R"O=[S@]1(CC[S@](=O)(c2ccccc2)[Pt@]1(Cl)Cl)c1ccccc1")
+smiles(R"O=S1(=O)c2ccccc2c2nccc3ccnc1c23")
+smiles(R"O=S1(=O)C[C@@]2(N3CCCC3)[C@H]3c4ccccc4[C@H](c4ccccc34)[C@@H]12")
+smiles(R"O=[S@@]1(=O)CC(C1)[C@H]1CCS1(=O)=O")
+smiles(R"O=S1(=O)C=C[C@@]21C[C@H]1c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"O=S1(=O)CC[C@@]21C[C@@H]1c3ccccc3[C@H]2c2ccccc12")
+smiles(R"O=S1(=O)C(=C[C@@]21C[C@H]1c3ccccc3[C@@H]2c2ccccc12)c1ccccc1")
+smiles(R"O=[S@@]1(=O)C[C@@](C)(Br)[C@@](C)(Br)C1")
+smiles(R"O=[S@]1(=O)C[C@@H]2[C@H](C1)[C@@]1(O[C@@]2(c2ccccc2)c2ccccc12)c1ccccc1")
+smiles(R"O=S1OC[C@@H](CO1)n1cnc2c1n(C)c(=O)n(C)c2=O")
+smiles(R"O=S1(=O)C[C@@H](N2CCCCC2)[C@]21C[C@H]1c3ccccc3[C@@H]2c2ccccc12")
+smiles(R"O=[S@@]1(=O)C[C@@H](NCc2ccccc2)[C@H](NCc2ccccc2)C1")
+smiles(R"O=S1(=O)CC[N@+]23CCC[N@@+]4(CCC2)CC[SH+][Ni@@+]134")
+smiles(R"O=[S@@]1(=O)CCN(CC1)[C@H]1CCS(=O)(=O)C1")
+smiles(R"O=[S@@]1(=O)[C@H](c2ccccc2)c2c(sc(c3ccccc3)c2[C@@H]1c1ccccc1)c1ccccc1")
+smiles(R"O=[S@@]1(=O)[C@@H](CC[C@H]1Cc1ccccc1)Cc1ccccc1")
+smiles(R"O=S1(=O)N[C@H](c2ccccc2)[C@@H]2N3CC[C@@H](CC3)C2=N1")
+smiles(R"O=S1(=O)O[C@H]2OS(=O)(=O)O[C@H]2O1")
+smiles(R"O=S1(=O)[OH+][Pt@@+2]2(N[C@@H]3CCCC[C@H]3N2)[OH+]S(=O)(=O)c2cccc1c2")
+smiles(R"O=S1(=O)[OH+][Pt@+2]2(N[C@@H]3CCCC[C@@H]3N2)[OH+]S(=O)(=O)c2ccccc12")
+smiles(R"O=S1(=O)O[Pt@@]2(N[C@@H]3CCCCC[C@H]3N2)O1")
+smiles(R"O=S1(=O)O[Pt@]2(N[C@H]3CCC[C@@H]3N2)O1")
+smiles(R"O=[Se]1[OH+][Pt@+2]2([OH+]1)N[C@H]1CCCC[C@@H]1N2")
+smiles(R"O=[Se]1O[Pt@@]2(O1)N[C@H]1CCCC[C@@H]1N2")
+smiles(R"O[Se](=O)(=O)O[Pt@]1(O)N[C@@H]2CCCC[C@H]2N1")
+smiles(R"O=[Se](O[Sn@@](O[Se](=O)c1ccccc1)(O[Se](=O)c1ccccc1)c1ccccc1)c1ccccc1")
+smiles(R"O=[Sn]([C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82")
+smiles(R"O=[Sn]([C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82)[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7C6=C1[C-]82")
+smiles(R"O=[Sn](c1ccccc1)c1ccccc1")
+smiles(R"O=S=N[C@@H]1CC[C@@H](C)CC1")
+smiles(R"O=S(O[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)C(C)(C)C")
+smiles(R"O=S(=O)(c1ccccc1)[C@@H]1CN2O[C@@]1(C[C@]12CCCCC1)S(=O)(=O)c1ccccc1")
+smiles(R"O=S(=O)(c1ccccc1)N1[C@@H]2[C@H]3CC[C@H](CC3)[C@H]12")
+smiles(R"O=[S@@](=O)(/C=C/c1cccnc1)/C=C/c1cccnc1")
+smiles(R"O=S(=O)(CCCN1CCOCC1)[OH+][Pt@+2]1(N[C@@H]2CCCC[C@@H]2N1)[OH+]S(=O)(=O)CCCN1CCOCC1")
+smiles(R"O=S(=O)(CCCNC1CCCCC1)[OH+][Pt@@+2]1(N[C@H]2CCCC[C@H]2N1)[OH+]S(=O)(=O)CCCNC1CCCCC1")
+smiles(R"O=S(=O)(/N=C/1\C=C/C(=N\S(=O)(=O)c2ccccc2)/C=C1)c1ccccc1")
+smiles(R"O=S(=O)(N[C@@H]1CC[C@@H](CC1)CC1CCCCC1)c1ccccc1")
+smiles(R"O=S(=O)(N[C@@H]1C[C@@H]2CC[C@H]1CC2)c1ccccc1")
+smiles(R"OS(=O)(=O)c1ccc2cc3nn(nc3cc2c1)c1ccc(/C=C/c2ccc(cc2S(=O)(=O)O)n2nc3cc4cc(ccc4cc3n2)S(=O)(=O)O)c(c1)S(=O)(=O)O")
+smiles(R"OS(=O)(=O)c1cccc2c1cccc2S(=O)(=O)O")
+smiles(R"OS(=O)(=O)c1cc(/N=N/c2ccc(cc2)[S@](=O)(=O)c2ccc(/N=N/c3cc(c4cccnc4c3O)S(=O)(=O)O)cc2)c(O)c2ncccc12")
+smiles(R"OS(=O)(=O)[C@@]1(F)C(F)(F)C(F)(F)[C@](F)(C(F)(F)C1(F)F)C(F)(F)C(F)(F)C(F)(F)C(F)(F)F")
+smiles(R"O=S(=O)(OCC1(COS(=O)(=O)c2ccccc2)C[C@H]2c3ccccc3[C@@H]1c1ccccc21)c1ccccc1")
+smiles(R"[O-]S(=O)(=O)C(F)(F)F")
+smiles(R"[O-][S@](=O)(=[OH+])[C@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[S@](=O)(=[OH+])[O-]")
+smiles(R"[O-][S@](=O)(=[OH+])[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(C6=C12)[S@](=O)(=[OH+])[O-]")
+smiles(R"[O-][S@](=O)(=[OH+])C(F)(F)F")
+smiles(R"[O-][S@](=O)(=[OH+])C(F)(F)F") # smiles(R"C1C23=C4(C5=C6C7=C2[Ru+2]34567)C23=C4C5=C6C7=C13[Ru+2]24567")
+smiles(R"[O-][S@](=O)(=[OH+])C(F)(F)F") # smiles(R"C1C23=C4C5=C6C7=C3([Ru+2]24567)C23=C41C1=C5C6=C2[Ru+2]34156")
+smiles(R"[O-]S(=O)(=O)[O-]")
+smiles(R"[O-]S(=O)(=O)O")
+smiles(R"OS(=O)(=O)O")
+smiles(R"OS(=O)(=O)O[Pt@@]1(O)N[C@@H]2CCC[C@H]2N1")
+smiles(R"OS(=O)(=O)SCCN[C@H]1CC[C@H](NCCSS(=O)(=O)O)CC1")
+smiles(R"O=S(=O)(S[C@@H](S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)S(=O)(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O=S(O[Sn@@](C)(C)OS(=O)c1ccc(cc1)C(C)(C)C)c1ccc(cc1)C(C)(C)C")
+smiles(R"O[Zn+2](O)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"O[Zn+2](O)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)(NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)(NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"S1C[C@@]23CSC[C@@]3(C1)CC2")
+smiles(R"s1ccc(c1)C[N@+]12CN3CN(CN(C3)C2)C1")
+smiles(R"S[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"Sc1nc2nc3c(nc2c(O)n1)c1ccccc1c1ncccc31")
+smiles(R"Sc1ncc2[C@H]3c4ccccc4[C@@H](c2n1)c1ccccc31")
+smiles(R"S=C1NC/C(=C\[C@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/N1")
+smiles(R"S=C1NC/C(=C\[C@@-]23C4=C5C6=C2[Fe+2]27893456[C-]3C8=C7C2=C93)/N1")
+smiles(R"S=C1NC(=O)[C@]2(CC(=C(C)C[C@@H]2C)C)C(=O)N1")
+smiles(R"Sc1nc(O)c2nc([nH]c2n1)/C(=C/c1ccc(cc1)/C=C(/NC(=O)c1ccccc1)\c1nc2c(O)nc(S)nc2[nH]1)/NC(=O)c1ccccc1")
+smiles(R"S=C1NC(=O)/C(=C\c2cccc(n2)/C=C/2\SC(=S)NC2=O)/S1")
+smiles(R"S=c1[nH]nc2nnc(CCCc3nnc4n[nH]c(=S)n4n3)nn12")
+smiles(R"S=c1[nH]nc2nnc(nn12)c1cccc(c1)c1nnc2n[nH]c(=S)n2n1")
+smiles(R"S=c1[nH]nc2nnc(nn12)c1nnc2n[nH]c(=S)n2n1")
+smiles(R"S=c1[nH]nc(n1N)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"S=c1[nH][nH]c(CCC(=O)N[C@@]23C[C@H]4C[C@H](C[C@H](C4)C3)C2)n1")
+smiles(R"S=c1sc2c(s1)c(OCc1cc(cc(c1)C(C)(C)C)C(C)(C)C)c1sc(=S)sc1c2OCc1cc(cc(c1)C(C)(C)C)C(C)(C)C")
+smiles(R"S=c1sc2n[nH]c(=S)n2[nH]1")
+smiles(R"S=c1sc2sc(=S)sc2s1")
+smiles(R"S=c1s/c(=C/c2ccccc2)/c2nc3ccccc3n12")
+smiles(R"S=c1sc(=S)c2c([nH]1)n(C)c(=O)n(C)c2=O")
+smiles(R"SC[C@@H](Nc1c2cccc(C(=O)NCCN(C)C)c2n(C)c2ccccc12)C(=O)O")
+smiles(R"SCC(=N)NC[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"SC#N")
+smiles(R"S=C=N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"S=C(N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NP(=O)(Oc1ccccc1)Oc1ccccc1")
+smiles(R"S=C(N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[Sn](c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles(R"S=C(Nc1ccc(cc1)S(=O)(=O)N1CCCCC1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"S=C(NCc1ccccc1)NNC(=O)[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(NCCCNC(=S)N/N=C(\C)/c1ccccn1)N/N=C(/C)\c1ccccn1")
+smiles(R"S=C(N/N=C/1\C(=O)N(C)c2ccccc12)NC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"S=C(NNC1=Nc2ccccc2/C/1=N/NC(=S)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1c2ccccc2cc2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1cc2OCOc2cc1[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1cc2OCOc2cc1[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1cc(Br)ccc1O)N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C/c1ccc2ccc3cccc4ccc1c2c34)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccc2OCOc2c1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C\c1ccc2OCOc2c1)N[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"S=C(N/N=C/c1cccc2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccccc1Cl)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccc(cc1Cl)N(C)C)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccccc1C)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccc(cc1)C(=O)O)N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C/c1ccccc1C(=O)O)N[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"S=C(N/N=C/c1ccc(cc1)N(C)C)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccc(cc1)N(C)C)N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C/c1ccc(cc1)[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccc(cc1)[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1cccc(c1)[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1cccc(c1)[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C\c1cccc(c1)[N+](=O)[O-])N[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"S=C(N/N=C\c1cccc(c1)[N+](=O)[O-])N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C\c1ccccc1[N+](=O)[O-])N[C@H]1CN2CC[C@@H]1CC2")
+smiles(R"S=C(N/N=C\c1ccccc1[N+](=O)[O-])N[C@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C/c1ccc(cc1)OCc1ccccc1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccccc1O)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1cc(ccc1O)[N+](=O)[O-])N[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"S=C(N/N=C/c1cc(ccc1O)[N+](=O)[O-])N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C\c1cccc(I)c1)N[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"S=C(N/N=C/c1ccc(Cl)cc1Cl)N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C/c1ccc(Cl)c(c1)[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccc(Cl)c(c1)[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C\c1ccc(Cl)c(c1)[N+](=O)[O-])N[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"S=C(N/N=C\c1ccc(Cl)c(c1)[N+](=O)[O-])N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C/c1ccc(Cl)c(Cl)c1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C\c1cccc(O)c1)N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C/c1cccc(OCc2ccccc2)c1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C\c1cc(Cl)ccc1[N+](=O)[O-])N[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"S=C(N/N=C\c1cc(Cl)ccc1[N+](=O)[O-])N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C/c1cc(Cl)ccc1O)N[C@@H]1CN2CC[C@H]1CC2")
+smiles(R"S=C(N/N=C/c1ccc(o1)[N+](=O)[O-])N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1ccc(o1)[N+](=O)[O-])NC12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1c(F)cccc1Cl)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1c(F)c(F)c(F)c(F)c1F)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1c[nH]c2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1c(O)ccc2ccccc12)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/c1c(O)ccc2ccccc12)N[C@@H]1CN2CC[C@@H]1CC2")
+smiles(R"S=C(N/N=C(\C)/c1cccc(n1)/C(=N\NC(=S)N1CCCC1)/C)N1CCCC1")
+smiles(R"S=C(N/N=C(/C)\c1ccccn1)N1CC[C@@H](CC1)[C@@H]1CCN(CC1)C(=S)N/N=C(/C)\c1ccccn1")
+smiles(R"S=C(N/N=C(\C)/c1ccccn1)N1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"S=C(N/N=C(\C)/c1ccccn1)N[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1")
+smiles(R"S=C(N/N=C(\C)/c1ccncn1)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"S=C(N/N=C(\C)/c1cnccn1)N1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"S=C(N/N=C(/C)\c1nccnc1C)N1CC[C@@H](CC1)c1ccccc1")
+smiles(R"S=C(N/N=C/C=C/c1ccccc1)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/C=C/c1ccc(cc1)N(C)C)N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/C=C/c1ccccc1[N+](=O)[O-])N[C@]12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(N/N=C/C=C/c1ccccc1[N+](=O)[O-])NC12C[C@@H]3C[C@@H](C[C@@H](C3)C2)C1")
+smiles(R"S=C(NN[C@@H](C)c1ncc2ccccc2c1)N1C[C@@H]2CC[C@@H](CC2)C1")
+smiles(R"S=C(NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)Nc1ccccc1")
+smiles(R"S=C(NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)NC1CCCCC1")
+smiles(R"S=C(NNC(=O)[C@@]12C[C@H]3C[C@H](C[C@H](C3)C2)C1)Nc1ccc(Cl)cc1")
+smiles(R"S=C(S[C@@-]12C3=C4C5=C1[Fe+2]16782345C2=C7[C@-]8(SC(=S)N(C)C)C6=C12)N(C)C")
+smiles(R"[Se]1CCCS[C@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]9(SCCC1)C7=C23")
+smiles(R"[Se]1CCCS[C@@-]23C4=C5C6=C2[Fe+2]27893456C3=C8[C@@-]9(SCCC1)C7=C23")
+smiles(R"[se]1nc2cc(ccc2n1)c1ccc2n[se]nc2c1")
+smiles(R"[SeH]=C(N/N=C(\C)/c1ccccn1)N1C[C@H]2CC[C@H](CC2)C1")
+smiles(R"SP1(=[O+][Ti]23456789([O+]=P(S)(SS1)c1ccccc1)(C1=C4C3=C2[C@@H]51)C1=C7C8=C6[C@H]91)c1ccccc1")
diff --git a/test/py/smiles/smiles_nci.py b/test/py/smiles/smiles_nci.py
new file mode 100644
index 0000000..4bc2d4d
--- /dev/null
+++ b/test/py/smiles/smiles_nci.py
@@ -0,0 +1,1042 @@
+smiles("B1(O)OB(OB2OB(O)O2)O1")
+smiles("B(O[C@H](C)CC(C)C)(O[C@H](C)CC(C)C)O[C@H](C)CC(C)C")
+smiles("Brc1cc(c(c(Br)c1)NC(=S)N)Br")
+smiles("Brc1ccc(cc1)SSc1ccc(Br)cc1")
+smiles("BrC[C@@H]1OC1")
+smiles("BrC[C@H]([C@@H](CBr)Br)Br")
+smiles("BrC(C(=O)C(Br)(C)C)Br")
+smiles("BrCC(=O)Nc1ccc(cc1)Cl")
+smiles("BrCC(=O)Nc1ccc(C)cc1")
+smiles("c12c3c4c5c6c7c8c9c%10c7c7c5c5c%11c4c4c%12c%11c%11c%13c%14c%15c%16c%17c%18c%19c%20c%21c(c1c1c%22c(c%23c(c%19c%21%22)c%19c(c%21c(c%16c%18%19)c%14c(c%10%21)c7c5%13)c9%23)c8c1c36)c(c24)c1c%20c%17c(c%11%15)c%121")
+smiles("c12c3c(ccc2c(Cl)ccn1)c(Cl)ccn3")
+smiles("c12c(cc(c3ccccc3)[nH]2)cc(cc1Br)Br")
+smiles("c12ccccc1c1Sc3c(N(C(=O)C)c1cc2)cccc3")
+smiles("c12ccccc1ccc(C(Br)(Br)Br)n2")
+smiles("c12ccccc1c(cc(SC#N)c2N)SC#N")
+smiles("c12ccccc1C(=O)c1ccc(cc1C2=O)N")
+smiles("c12ccccc1NC(=O)C2=NNC(=S)N")
+smiles("c12cccc(c1[nH][nH]c2=O)Cl")
+smiles("c12ccccc1Sc1c(N2)cc(C(=O)CCl)cc1")
+smiles("c12ccccc2c2c(cc1)C(=O)OC2=O")
+smiles("c12c(c(ccc2cccn1)[C@H](Nc1nccc(C)c1)c1ccccc1)O")
+smiles("c12c(cc(cc2)CC(=O)O)cccc1")
+smiles("C12=C(CCCC2)C(=O)c2c(cccc2)C1=O")
+smiles("c12cc(ccc2Sc2c(cccc2)N1C(=O)C)C(=O)CCl")
+smiles("c12ccccc2S(=O)c2ccccc2N1CCC[N+](CC)([O-])CC")
+smiles("c12c(c(C(C)(O)C)ccc2)cccc1C(O)(C)C")
+smiles("c12CC[C@H](c3c(ccc(c(=O)c3)OC)c2c(OC)c(c(OC)c1)OC)NC(=O)C")
+smiles("c12ccc(nc2nccc1O)NC(=O)C")
+smiles("c12c(C(=O)c3c(c(Cl)c(cc3)C)C1=O)cccc2")
+smiles("c12c([n+](c(cc2)C)CC)ccc(C)c1")
+smiles("c12c(n(C)cn2)c(=O)n(c(=O)n1C)C")
+smiles("c12c(n(cn1)C)c(=O)n(c(=O)n2C)C")
+smiles("c12c([nH]cn1)cccc2")
+smiles("c12C(=O)C(=C(C(=O)c2cccc1)O)C1CCCCC1")
+smiles("c12C(=O)N([N+](=O)[O-])C(=O)c1cccc2")
+smiles("c12[nH]cnc2cncn1")
+smiles("c12nnnn2cc(cc1N(=O)=O)C")
+smiles("c1(Br)nc(ccc1)Br")
+smiles("c1c2c3c(ccc2)c2cccc4cccc(c24)c3cc1")
+smiles("C1c2c3c(ccc2CCC1)CCCC3")
+smiles("c1c2c3c(cc(N)cc3)Cc2ccc1")
+smiles("c1c2c(cc3c(c2Br)cccc3)ccc1")
+smiles("c1c2c(cc3c(nc(s3)c3ccccc3)c2)ccc1")
+smiles("c1c2c(ccc1C=NO)OCO2")
+smiles("c1c2c(ccc1)SCC(=O)N2")
+smiles("c1(c2ccc(C(=O)C(=NO)Cl)cc2)ccccc1")
+smiles("c1c2cc[nH]c2c(cc1)C")
+smiles("C1[C@]2(C)C(=NO)C(C)(C)[C@H](C2)C1")
+smiles("c1(c2c(c(S)ccc2)ccc1)S")
+smiles("c1c2c(Sc3c(O2)cccc3)ccc1")
+smiles("c1c2N(CC)c3c([S@](=O)c2cc([N+](=O)[O-])c1)cccc3")
+smiles("c1c(Br)cc2c(OC(C)(C2)C)c1")
+smiles("c1(c(Br)ccc(C)c1)N(=O)=O")
+smiles("c1(c(Br)c(C)cc(C)c1C(=O)O)C")
+smiles("c1cc2c3c(cc(cc3)C(=O)C)sc2cc1C(=O)C")
+smiles("c1cc2c3c(n(CCC#N)c2cc1)cccc3")
+smiles("c1c(c2ccccc2)cccc1")
+smiles("C1=C(c2ccc(OC)cc2)C(=O)C=C(C1=O)c1ccc(OC)cc1")
+smiles("c1cc2c(C(=O)[C@@H](C(=O)C)C2)cc1")
+smiles("c1cc2C(=O)c3c(N(=O)=O)c(ccc3C(=O)c2cc1)C")
+smiles("c1cc2C(=O)N(C(=O)c2cc1)O")
+smiles("c1cc(c2c(c1)ncc(C)c2Cl)C")
+smiles("c1ccc2c(c(c3c(c2)cccc3)C=O)c1")
+smiles("c1cc(c2ccccc2c1S(=O)(=O)O)N")
+smiles("c1cc(c2ccccc2)c(cc1)O[C@H](C)C(=O)O")
+smiles("c1cc(c2ccc(cc2n1)Cl)NCCCCCCN(CC)CC")
+smiles("c1(ccc2c(cccc2)n1)O")
+smiles("c1ccc2cc(c(c(N(=O)=O)c2c1)O)C(=O)OC")
+smiles("c1cc([C@]2(CCC)NC(=O)NC2=O)ccc1")
+smiles("c1ccc2c(C(=O)C(=C(C2=O)Cl)Cl)c1")
+smiles("c1ccc2nc3ccccc3c(C(=O)O)c2c1")
+smiles("c1ccc2S(=O)c3ccccc3N(C)c2c1")
+smiles("c1c(cc(Br)c(c1Br)O)C=C(C(=O)O)c1ccccc1")
+smiles("c1c(cc(Br)c(c1Br)O)C=C(C(=O)O)c1ccc(cc1)I")
+smiles("C1CCCC1(C#CC1(CCCC1)O)O")
+smiles("c1cccc2c1C=CC2=Cc1ccccc1")
+smiles("c1cccc2c1cnc(C)c2")
+smiles("c1cc(cc2c1nccc2C=O)OC")
+smiles("c1cccc2c1Oc1ccccc1S2(=O)=O")
+smiles("c1cccc2c(cccc12)C=NNC(=S)N")
+smiles("c1(cccc2ccccc12)OC[C@@H]1OC1")
+smiles("c1cccc2c(C=C(C(=O)O)C)c(OC)ccc12")
+smiles("c1(cccc2c(C(=O)C)cccc12)C(=O)C")
+smiles("c1cccc2C=[N+]3[Zn]4(Oc5c(C=[N+]4CC3)cccc5)Oc12")
+smiles("C1CCCc2c(nc(nc12)O)C")
+smiles("c1cccc2C(=O)c3cccc(c3C(=O)c12)N")
+smiles("c1ccc(c2C(=O)c3c(C(=O)c12)c(S(=O)(=O)O)ccc3)S(=O)(=O)O")
+smiles("c1cccc([Bi](c2ccccc2)c2ccccc2)c1")
+smiles("c1ccc(cc1)[As](c1ccccc1)c1ccccc1")
+smiles("C1=CCCCC1=C")
+smiles("c1cc(ccc1)c1c2c(cccc2)c(O)nn1")
+smiles("c1c(c(ccc1)c1c2c(oc3c(c(=O)ccc13)Br)c(Br)c(cc2)O)C(=O)O")
+smiles("c1ccc(cc1)c1c(c2c(cccc2)nc1C)O")
+smiles("c1cc(ccc1)c1cc2c(c(cc(Cl)c2)Cl)[nH]1")
+smiles("c1(ccccc1)c1ccccc1")
+smiles("c1c(cccc1)c1ccc(CC(=O)C)cc1")
+smiles("c1cc(ccc1)C1=CC(=O)CC1")
+smiles("c1ccc(cc1)c1c(OCCOc2c(cccc2)c2ccccc2)cccc1")
+smiles("c1ccccc1C(c1ccccc1)(c1ccccc1)C(=O)c1ccccc1")
+smiles("c1(ccccc1)C(c1ccccc1)(C[C@H](C)N(C)C)[C@H](O)CC")
+smiles("c1(ccccc1)C(c1ccccc1)(Cl)c1ccccc1")
+smiles("c1cc(ccc1)C(c1ccccc1)C#N")
+smiles("c1(ccccc1)C(c1ccccc1)N(C)C")
+smiles("c1ccccc1C(c1ccccc1)OC")
+smiles("c1ccccc1C(=Cc1ccccc1)[N+](=O)[O-]")
+smiles("c1cc(ccc1C=Cc1ccncc1)Cl")
+smiles("c1(ccccc1)C(CC)(CC)[C@@H](OC(=O)N)c1ccccc1")
+smiles("c1cc(ccc1)C(CC(C)(C)O)(C)C")
+smiles("c1c(cccc1)C(CC)(C#N)CC")
+smiles("c1ccc(cc1)C(CCI)(c1ccccc1)c1ccccc1")
+smiles("c1ccccc1C=C(C#N)C#N")
+smiles("c1ccc(cc1)C=CC(NC(=O)OCC)NC(=O)OCC")
+smiles("c1(ccccc1)CCC(=O)C")
+smiles("c1(ccccc1)C(CC(=O)c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles("c1(ccc(cc1)C=CC(=O)c1ccc(NC(=O)OCC)cc1)N(C)C")
+smiles("c1ccccc1CC(C(=O)O)(CC)CC")
+smiles("c1ccccc1C([C@H](c1ccccc1)C#N)c1ccccc1")
+smiles("c1ccccc1C[C@@H](O)c1ccccc1")
+smiles("c1ccccc1CC(=NO)[C@H](c1ccccc1)C#N")
+smiles("c1ccccc1[C@H](c1[nH]c2ccccc2n1)O")
+smiles("c1ccccc1[C@@H](C(CC)(CC)c1ccccc1)O")
+smiles("c1(ccccc1)[C@@H](C(CC)(CC)CC)OC(=O)c1ccccc1C(=O)O")
+smiles("c1cc(ccc1)[C@H](C)[C@H](c1ccccc1)C(=O)O")
+smiles("c1ccccc1[C@@H](C(C(=O)OCC)C(=O)OCC)CC(=O)OCC")
+smiles("c1ccccc1[C@H](C(=O)O)[C@@](C)(O)c1ccccc1")
+smiles("c1c(ccc(c1)Cl)CCc1ccc(cc1)Cl")
+smiles("c1cc(cc(c1Cl)Cl)N")
+smiles("c1cc(ccc1Cl)NC(=O)C")
+smiles("c1(ccccc1Cl)OB(Oc1ccccc1Cl)Oc1ccccc1Cl")
+smiles("c1ccccc1CN1C[C@@H](C(=O)C1=O)C(=O)OC")
+smiles("c1c(cccc1)CN1C[C@@H](C(=O)C1=O)C(=O)OCC")
+smiles("c1ccc(cc1)CN(c1ccccc1)C")
+smiles("c1(ccccc1)C(NC(c1ccccc1)c1ccccc1)c1ccccc1")
+smiles("c1c(cccc1)C(N=C(c1ccccc1)c1ccccc1)c1ccccc1")
+smiles("c1ccc(cc1)CN(Cc1ccccc1)N=O")
+smiles("c1ccccc1CN(CC)c1ccc(cc1)SC#N")
+smiles("c1ccccc1C=NNc1ccccc1N(=O)=O")
+smiles("c1(ccc(cc1)C=NN=Cc1ccc([N+](=O)[O-])cc1)N(=O)=O")
+smiles("c1ccc(cc1)C=NNC(=S)N")
+smiles("c1(ccccc1)C(=NNC(=S)NN=C(C)c1ccccc1)C")
+smiles("c1(ccc(cc1)C#N)OC")
+smiles("c1cc(ccc1C=NO)O")
+smiles("c1ccccc1C(O)(c1ccccc1)C")
+smiles("c1ccccc1C(OC)(c1ccccc1)c1ccccc1")
+smiles("c1ccc(cc1)[C@](O)(C(C)C)C")
+smiles("c1cccc(c1)C(=O)CC(CC(=O)c1ccccc1)c1ccncc1")
+smiles("c1cccc(c1)C(=O)CCC#N")
+smiles("c1cc(ccc1C(=O)CCC(=O)c1ccc(Br)cc1)Br")
+smiles("c1ccc(cc1)C(=O)C=CC(=O)O")
+smiles("c1(ccccc1)C(=O)C[C@@H](c1ccccc1)N1CCCCC1")
+smiles("c1(ccccc1)C(=O)CCN(C)C")
+smiles("c1cccc(c1)C(OCC)OCC")
+smiles("c1ccccc1C(=O)[C@@H](c1ccccc1)N(c1ccccc1)C(=O)C")
+smiles("c1(ccccc1)C(=O)[C@H](N1CCC(C)CC1)CC(=O)c1ccccc1")
+smiles("c1ccc(cc1)C(OC)(N(C)C)c1ccccc1")
+smiles("c1cc(c(cc1C(=O)C)N(=O)=O)C")
+smiles("c1cccc(c1)C(=O)COC")
+smiles("c1ccc(cc1)C(=O)[N+](C)(C)C")
+smiles("c1ccc(cc1)C(=O)NNC(=S)N")
+smiles("c1(ccc(cc1C=O)[N+](=O)[O-])O")
+smiles("C1CC(CCC1C(=O)O)C(=O)O")
+smiles("c1c(cccc1)C(=O)OOC(=O)c1ccccc1")
+smiles("c1(ccccc1C(=O)O)OC(=O)CCCCC")
+smiles("c1cc(ccc1)C(=O)SSC(=O)c1ccccc1")
+smiles("c1(ccc(cc1)F)N")
+smiles("C1C(CCCC1)N1CC[C@@H](C1=O)O")
+smiles("c1(ccccc1)N1C(=O)C(=O)[C@@H](C1)C(=O)OCC")
+smiles("c1(cccc(c1N)Br)Br")
+smiles("C1CCCCC1N(C1CCCCC1)N=O")
+smiles("c1cc(ccc1N=Cc1ccc(Cl)cc1)[N+](=O)[O-]")
+smiles("c1(cc(cc(c1N)Cl)N(=O)=O)Cl")
+smiles("c1ccccc1NC(=O)C=Cc1ccccc1")
+smiles("c1c(cccc1)NC(=O)CCl")
+smiles("C1CCCCC1NC(=O)C(=O)NC1CCCCC1")
+smiles("c1(ccccc1N)C(=O)O")
+smiles("c1(ccccc1)NNC(=S)NN")
+smiles("c1c(cc(cc1N)N)N(=O)=O")
+smiles("c1cc(ccc1[N+](=O)[O-])[C@](C)(O)CC(=O)O")
+smiles("c1(c(cc(cc1)[N+](=O)[O-])N(=O)=O)SC#N")
+smiles("c1cc(ccc1O)C=C(C)C(=O)O")
+smiles("c1ccc(cc1O)C=C(C(=O)O)c1ccccc1")
+smiles("c1cc(c(cc1)O)C=N[C@H](C)CCN=Cc1ccccc1O")
+smiles("c1ccc(cc1)OC(Oc1ccccc1)C(=O)O")
+smiles("c1(c(ccc(c1)O)N)CCCCCCCCCCCCCCC")
+smiles("c1(ccc(cc1O)O)c1c(c2ccc(cc2O)O)nc2ccccc2n1")
+smiles("c1c(cccc1)OP(=O)(Oc1ccccc1)NC1CCCCC1")
+smiles("c1cc(ccc1)P(=O)(N)OCC")
+smiles("c1cc(cc(c1)P(=O)(O)O)[N+](=O)[O-]")
+smiles("c1(ccccc1)[Sb](c1ccccc1)(c1ccccc1)(Cl)Cl")
+smiles("c1ccccc1S(=O)(=O)O")
+smiles("c1c(ccc(c1SSc1cc(Cl)ccc1Cl)Cl)Cl")
+smiles("c1cccc(C2=C(c3ccccc3)C(C(=C2c2ccccc2)c2ccccc2)(CC=C)O)c1")
+smiles("c1cccc(c2cccc3c2[nH]c(=S)s3)c1")
+smiles("c1ccc(C(c2ccccc2)(C(=O)C)Cc2ccccc2)cc1")
+smiles("C1(=C(CCCc2ccc(cc2)Oc2ccccc2)C(=O)c2ccccc2C1=O)O")
+smiles("c1cccc(c2c(Oc3ccccc3)c3c(cccc3)nc2C)c1")
+smiles("c1c(c(C=Cc2c(S(=O)(=O)O)cc(N)cc2)ccc1N)S(=O)(=O)O")
+smiles("c1cc(c(C)cc1)CO")
+smiles("c1c(C)ccc(c1)C(=O)CC")
+smiles("c1cccc(C)c1NNc1ccccc1C")
+smiles("c1(C)ccccc1OP(=O)(Oc1ccccc1C)Oc1c(cccc1)C")
+smiles("c1cccc(C(c2ccccc2)C[C@H](C)[N+](C)(C)C)c1")
+smiles("c1cccc(C(Cc2ccccc2)(C#N)c2ccccc2)c1")
+smiles("c1(ccc(C(C)C)cc1)C(=O)NN")
+smiles("c1(CCC)c(c(ccc1O)C)C")
+smiles("c1ccc(C(=CC)C)cc1")
+smiles("c1cc(C(CC(C)(C)C)(C)C)ccc1OCCOCCSC(=[NH2])N")
+smiles("c1cc(CCCCCCCCCCCCCCC)ccc1O")
+smiles("c1(cc(CCCCCCCCCCCCCCC)cc(O)c1)O")
+smiles("c1cccc(C=C(C#N)C#N)c1Cl")
+smiles("c1ccc(c(C=CC(=O)C=Cc2c(Cl)cccc2)c1)Cl")
+smiles("c1c(ccc(C=CC(=O)O)c1)C(C)C")
+smiles("c1cc(CC)ccn1")
+smiles("c1cccc(CCN2C(=O)C(=O)[C@H](C(=O)OCC)C2)c1")
+smiles("c1c(C)cc(C)c(N)c1C")
+smiles("c1(cc(C)c(CCN(C)C)c(C)c1C)C")
+smiles("c1ccc(C=C(C#N)C(=O)O)cc1")
+smiles("c1ccc(C[C@H](c2ccccc2)C#N)cc1")
+smiles("c1cccc([C@H](O)C(=NO)c2ccccc2)c1")
+smiles("c1(ccc(c(Cl)c1)Cl)[C@H](C#N)C(C#N)C#N")
+smiles("c1cc(cc(Cl)c1)N[C@H](c1ccccc1)c1c(O)c(=O)cc(CO)o1")
+smiles("c1(ccc(CCl)c(c1)C)C")
+smiles("c1(cccc(C)n1)CCCC")
+smiles("c1c(C)cc(C)nc1C")
+smiles("c1(cccc(C[N+](C)(C)C)c1)[N+](=O)[O-]")
+smiles("c1cccc(C=NN=Cc2c(cccc2)O)c1O")
+smiles("c1c(ccc(C=NNC(=S)NCC(C)C)c1)NC(=O)C")
+smiles("c1cccc(C(=O)C=Cc2ccccc2)n1")
+smiles("c1ccc(c(C(=O)Nc2cc3ccccc3cc2)c1)O")
+smiles("c1(cc(cc(C(=O)O)c1N)Br)Br")
+smiles("c1ccc(C(C(=O)OC(C)(C)C)c2ccccc2)cc1")
+smiles("c1ccc([C@@H](CC(=O)OC(C)(C)C)O)cc1")
+smiles("c1ccccn1")
+smiles("c1cc(ccn1)CC")
+smiles("c1cc(ccn1)[C@H](O)CC(=O)c1ccccc1")
+smiles("C1CCCCN1N=O")
+smiles("c1ccc(C=Nc2ccccc2)cc1")
+smiles("c1ccc(C=Nc2ccc(cc2)C(=O)C=Cc2ccccc2)cc1")
+smiles("c1(ccc(CN)cc1)OC")
+smiles("c1cc(CC#N)ccc1OC")
+smiles("c1c(C(C)(C#N)C)ccc(OC)c1")
+smiles("c1ccc(C=NC(N=Cc2ccccc2)c2ccccc2)cc1")
+smiles("c1c(ccc(NC(=O)C)c1)S(=O)(=O)N")
+smiles("c1ccc(CNC(=O)C(=O)NCc2ccccc2)cc1")
+smiles("c1cccc(NC(=S)NN)c1")
+smiles("c1(cc(cc(NNc2cc(cc(Br)c2)Br)c1)Br)Br")
+smiles("c1cccc(NN=Cc2ccco2)c1")
+smiles("c1ccc(C(=NN=C(C)c2cc([N+](=O)[O-])ccc2)C)cc1[N+](=O)[O-]")
+smiles("c1cccc(NP(=O)(Nc2ccccc2)Nc2ccccc2)c1")
+smiles("c1cc(c(c(O)c1)C(=O)C)O")
+smiles("c1ccc(C(=O)c2c(cc(cc2)C)C)cc1")
+smiles("c1(ccc(C(=O)c2ccc(C)cc2)cc1)O")
+smiles("c1ccc(C(=O)c2cc(C)c(cc2)O)cc1")
+smiles("c1(cc(cc(OC)c1)C(=O)CCCC)OC")
+smiles("c1(cc(C)c(O)cc1)N(=O)=O")
+smiles("c1ccc(C(=O)C[C@@H](N2CCN(Cc3ccccc3)CC2)C(=O)c2ccccc2)cc1")
+smiles("c1c(cc(C(=O)NCCNCCO)c(O)c1[N+](=O)[O-])[N+](=O)[O-]")
+smiles("c1ccc(C(=O)N[C@@H](C(Cl)Cl)O)cc1")
+smiles("c1c(CCC(=O)O)ccc(C)c1")
+smiles("c1ccc(C(=O)OCCC#N)cc1")
+smiles("c1c(ccc(S(=O)(=O)c2ccc(cc2)C)c1)C")
+smiles("c1ccc(CS(=O)(=O)c2ccc(C)cc2)cc1")
+smiles("c1c(ccc(SSc2ccc(cc2)CC(=O)O)c1)CC(=O)O")
+smiles("c1c(ccc(SSc2ccc(cc2)C(=O)C)c1)C(=O)C")
+smiles("c1cc([C@H]2CO2)ccc1")
+smiles("c1c(C[C@H](c2ccccc2)C(=O)O)cccc1")
+smiles("c1cc([C@@H](Cc2ccccc2)Cl)ccc1")
+smiles("C1(=CC[C@H](C(=C)C)CC1)C")
+smiles("c1cc([C@H](N(C)C)c2ccccc2)c(cc1)C")
+smiles("c1cc([C@@H](OC(C)C)C(=O)O)ccc1")
+smiles("c1cc(Cl)ccc1C=Cc1ncccc1")
+smiles("c1cc(Cl)ccc1C(=O)C(=O)c1ccc(Cl)cc1")
+smiles("c1(cc(Cl)ccc1SSc1ccc(cc1N)Cl)N")
+smiles("c1cccnc1")
+smiles("c1(cccnc1)C=CC(=O)c1ccccc1")
+smiles("c1cc(cnc1Cl)N=Cc1ccccc1")
+smiles("c1cccnc1C(=O)OCCCCCCCCCC")
+smiles("C1CCCN[C@@H]1C")
+smiles("c1ccc(N[C@@H](c2ccc3c(nccc3)c2O)c2ccccc2)cc1")
+smiles("c1ccc(N[C@@H](c2c(O)c3c(cccn3)cc2)c2ccccc2)c(C(=O)O)c1")
+smiles("c1(C=C(C#N)C#N)ccc(Br)cc1")
+smiles("c1ccc(NC(=O)OCCCl)c(C)c1")
+smiles("c1cc(C=NO)ccc1Cl")
+smiles("c1(ccc(N(=O)=O)c2ccccc12)N")
+smiles("c1c(c(c([N+](=O)[O-])cc1[N+](=O)[O-])O)C(=O)O")
+smiles("c1(ccco1)CCl")
+smiles("c1ccc(OB(Oc2ccccc2)Oc2ccccc2)cc1")
+smiles("c1(ccc(OC)cc1)C(=O)O[C@H](C)CC(C)C")
+smiles("c1cc(C(=O)C=Cc2ccccc2)ccc1N")
+smiles("c1cc(C(=O)CCCC(=O)c2ccc(cc2)C)ccc1C")
+smiles("c1cc(C(OCCCC)OCCCC)ccc1")
+smiles("c1c(C(C(=O)N)(C)C)cccc1")
+smiles("c1cc(C(=O)NN)ccc1")
+smiles("C1(=CCC(=O)O1)C")
+smiles("c1(C=C(C(=O)O)c2ccccc2)cc(cc(c1O)Br)Br")
+smiles("C1CC(C(=O)O)CCC1")
+smiles("c1(cc(C(=O)O)ccc1C)N")
+smiles("C1CC(C(=O)O)(CCO1)C(=O)O")
+smiles("c1cc(C(=O)O)nc(C(=O)O)c1")
+smiles("c1cc(C(=O)OOC(=O)c2ccccc2)ccc1")
+smiles("c1ccc(P(=O)(c2ccccc2)c2ccccc2)cc1")
+smiles("c1cc(CS(=O)(=O)Cc2ccccc2)ccc1")
+smiles("c1(ccc(S(=O)(=O)N(CC)CC)cc1)C(=O)OCC")
+smiles("c1c([C@H](c2ccc3cccnc3c2O)Nc2c(C(=O)OCC)cccc2)cccc1")
+smiles("[C@]1(C([C@H](CC1)C(=O)O)(C)C)(C(=O)N)C")
+smiles("C1C[C@H](C)[C@H](COC(=O)C)[C@@H](COC(=O)C)C1")
+smiles("C1C[C@@H](C(=O)CC1)C")
+smiles("c1c(Cl)ccc(C(=O)c2ccc(cc2)C)c1")
+smiles("c1(c(Cl)cc(Cl)cc1)OC[C@H]1CO1")
+smiles("c1c(Cl)cc(S[C@H]2O[C@H](COC(=O)C)[C@@H]([C@@H]([C@H]2OC(=O)C)OC(=O)C)OC(=O)C)c(c1)Cl")
+smiles("C1CCNCC1")
+smiles("c1ccncc1c1cc(cc(n1)c1cnccc1)c1ccccc1")
+smiles("c1ccncc1[C@@]1(C(=O)NC(=O)N1)Cc1ccccc1")
+smiles("c1ccncc1C=NNC(=S)N")
+smiles("c1c(C[N+](Cc2ccccc2)(C)C)cccc1")
+smiles("c1c(c(N)ccc1N=Nc1ccccc1OC)OC")
+smiles("c1c(C[N+](C)(C)C)cccc1")
+smiles("c1cc(NCCn2c(=S)sc3ccccc23)ccc1")
+smiles("C1=CC(=NCl)C=CC1=O")
+smiles("C1CCN(C(=O)C)CC1")
+smiles("c1cc(NC(=S)Nc2ccccc2)ccc1")
+smiles("c1cc(N)ncc1C(=O)O")
+smiles("c1c(C=NNC(=S)N)c2ccccc2nc1")
+smiles("c1c(C(=NNC(=S)N)C)ccc(O)c1")
+smiles("c1c(C=NNC(=S)N)ccc(OCCC)c1")
+smiles("c1c(C=NO)cccc1[N+](=O)[O-]")
+smiles("c1ccoc1C=NNC(=S)NN")
+smiles("c1c(c(O)c(cc1C(=O)c1ccccc1)C)C")
+smiles("c1c(C(=O)C=Cc2ncccc2)cccc1")
+smiles("c1(cc(OC)ccc1)CN")
+smiles("c1cc(OC)ccc1C=NNC(=S)N")
+smiles("c1c(C(=O)CC)cc(cc1C(=O)CC)C(=O)CC")
+smiles("c1(c(C(=O)CCC)cc(cc1)C)OC")
+smiles("c1(c(c(=O)cc(CO)o1)O)[C@@H](c1ccccc1)Nc1ccccc1")
+smiles("C1(=CC(=O)C[C@H](C1)c1ccccc1)C")
+smiles("C1CCO[C@@H]1CNC[C@@H]1OCCC1")
+smiles("c1(cc(O)c(O)cc1)CCCCCCCCCCCCCCC")
+smiles("c1(c(C(=O)Nc2cccc3ccccc23)cccc1)O")
+smiles("c1c(C(=O)NC(c2ccccc2)c2ccccc2)cccc1")
+smiles("c1c(C(=O)NN)c(O)ccc1")
+smiles("c1c(C(=O)O)c(cc(Cl)c1)Cl")
+smiles("c1c(C(=O)O)ccc(OCCCCCCCCCCCC)c1")
+smiles("C1C(C(=O)O)CCOC1")
+smiles("c1c(C(=O)O)c(O)ccc1")
+smiles("c1c(C(=O)O)c(O)ccc1[N+](=O)[O-]")
+smiles("c1c(C(=O)O)c(O)c([N+](=O)[O-])cc1")
+smiles("c1c(C(=O)O)ncc(C(=O)O)c1")
+smiles("c1(cc(S[C@H]2O[C@H]([C@H](O)[C@@H]([C@@H]2O)O)CO)c(Cl)cc1)Cl")
+smiles("c1(c(C)sc(=S)[nH]1)C")
+smiles("c1c(C[Si](C)(C)C)cccc1")
+smiles("c1c(CS(=O)Cc2ccccc2)cccc1")
+smiles("C1(C)CSSC1")
+smiles("c1c(c(SSc2ccc(cc2[N+](=O)[O-])[N+](=O)[O-])ccc1[N+](=O)[O-])[N+](=O)[O-]")
+smiles("C1([C@H]2C[C@@H]1[C@@H](C=NNC(=S)N)CC2)(C)C")
+smiles("C1[C@H]2[C@@H](CCCC2)NCC1")
+smiles("c1([C@@H](C(=O)c2ccc(Cl)cc2)O)ccc(Cl)cc1")
+smiles("c1cnc2c(c1)cccc2N(=O)=O")
+smiles("c1c[n+](c2c(cccc2)c1)CC")
+smiles("c1c(N)c2c(cc(cc2)Cl)nc1")
+smiles("C1CN=C(c2c(cccc2)O)N1")
+smiles("C1CNCCC1")
+smiles("c1cnccc1CCCC")
+smiles("C1CN(CCC1)[C@H](Cc1ccccc1)C(=O)c1ccccc1")
+smiles("c1cnc(cc1)C=NNC(=S)N")
+smiles("c1cnc(cc1)C(=O)OCCCC")
+smiles("c1c(nccc1)C(=O)OCCCCCC")
+smiles("c1c([n+](CC)c2c(c1)cccc2)C")
+smiles("c1c[n+](C)c(cc1)C")
+smiles("c1c(nc(CCC)cc1)C")
+smiles("c1cncc(C(=O)C)c1")
+smiles("c1c(N)ccc(P(=O)(O)O)c1")
+smiles("C1CN(CCO1)[Se][Se]N1CCOCC1")
+smiles("c1c(N(CC(=O)N(c2ccc(cc2)Cl)CC(=O)O)C(=O)C)ccc(Cl)c1")
+smiles("c1cnc(C(=O)OCC)cc1")
+smiles("c1c(N[C@@H](c2c(O)c3c(cc2)cccn3)c2ccccc2)ccc([N+](=O)[O-])c1")
+smiles("C1CN([C@@H]([C@@H](c2ccccc2)N2CCOCC2)C(=O)c2ccc(cc2)NC(=O)C)CCO1")
+smiles("c1(C#N)c(N)nc(C)nc1")
+smiles("c1c(NC(=S)Nc2ccc(OCCCC)cc2)ccc(c1)N(C)C")
+smiles("c1c[nH]cc1")
+smiles("c1(C=NNC(=S)N)c(O)cccc1")
+smiles("c1(C=NO)ccc(cc1)OC")
+smiles("c1c([N+](=O)[O-])c(C)c(c(Br)c1[N+](=O)[O-])N(=O)=O")
+smiles("C1C(NP(=S)(NC2CCCCC2)NC2CCCCC2)CCCC1")
+smiles("c1(C(=O)C=Cc2ccc(N(C)C)cc2)ccc(cc1)NC(=O)C")
+smiles("c1(CO)ccccc1")
+smiles("c1c(OC)ccc(Cc2ccc(cc2)OC)c1")
+smiles("c1(COC)c(cc(C)cc1C)C")
+smiles("C1COCCN1P(=O)(N1CC1)N1CC1")
+smiles("c1(C(=O)[C@@H](C(=O)OC)CC)ccccc1")
+smiles("c1(C(=O)C(=NO)c2ccccc2)ccccc1")
+smiles("c1(c(O)c(N(=O)=O)cc([N+](=O)[O-])c1)Cl")
+smiles("C1C(=O)NC(=O)CC1C[C@@H](O)[C@@H]1C(=O)[C@@H](C)C[C@H](C)C1")
+smiles("c1(C(=O)O)c(ccc(c1)I)NN")
+smiles("c1(C(=O)O)ccccc1NC(=O)Nc1c(C(=O)O)cccc1")
+smiles("c1csc(c1)C(=O)NN")
+smiles("c1c(SSc2ccc(N(CC)CC)cc2)ccc(N(CC)CC)c1")
+smiles("c1nc2cc(Cl)ccc2c(c1[N+](=O)[O-])O")
+smiles("c1nc2c(ncnc2[nH]1)S")
+smiles("c1nc2c(nc[nH]2)c(Cl)n1")
+smiles("C1N(C(c2ccccc2)c2ccccc2)CCCC1")
+smiles("c1(nc(c2c([nH]cn2)n1)N)N")
+smiles("c1(nc(c2nc[nH]c2n1)S)N")
+smiles("C1NCCC1")
+smiles("C1NCCCC1")
+smiles("c1nc(ccc1)C=CC(=O)c1ccc(Cl)cc1")
+smiles("c1(ncccc1C(=O)O)Cl")
+smiles("c1(N)ccc(CCc2ccc(N)cc2)cc1")
+smiles("c1nc(C=CC(=O)c2ccccc2)ccc1")
+smiles("c1nc([C@H](O)[C@@H](C)C(=O)c2ccccc2)ccc1")
+smiles("C1N(CCOC1)[C@H](c1ccccc1)[C@H](N1CCOCC1)C(=O)c1ccccc1")
+smiles("C1=NC=N1")
+smiles("c1(nc(nc(N)n1)N)C")
+smiles("c1(NC(=O)C)ccc(cc1)C(=O)C=Cc1ccc(cc1)N(CC)CC")
+smiles("C1N(C(=O)OCC)CCCC1")
+smiles("c1(NNC(=S)NNc2ccccc2)ccccc1")
+smiles("c1(=N)[nH]cc(N(=O)=O)s1")
+smiles("c1(N(=O)=O)cccc(c1N)C")
+smiles("c1(N(=O)=O)cc(C)ccc1I")
+smiles("c1([N+](=O)[O-])cccc(C(=O)NNC(=S)N)c1")
+smiles("c1(N(=O)=O)ccc(C=NNC(=S)NN)cc1")
+smiles("c1(=N)sc(c2ccccc2)n[nH]1")
+smiles("C1(=O)c2ccccc2C(=O)N1CCCCBr")
+smiles("c1(O)cc(c(cc1C(CC)(C)C)O)C(CC)(C)C")
+smiles("c1(O)ccc(c(Cl)c1)O")
+smiles("c1(OC)ccc(C(=NNC(=S)N)C)cc1")
+smiles("C1(=O)C(=CC(=NCl)C=C1Br)Br")
+smiles("C1OCCN(C1)C(=S)SCCC(=O)N")
+smiles("C1OCCN(P(=O)(OCCCC)N2CCOCC2)C1")
+smiles("C1(=O)NC2(CCCC2)C(=O)N1")
+smiles("C1(=O)N(c2ccccc2)N=C(C1)C")
+smiles("c1(=O)oc2c(cc1C(=O)OCC)cccc2")
+smiles("c1(P(=O)(O)O)ccccc1")
+smiles("c1(SC)nc(nc(n1)SC)C")
+smiles("C1SC(=S)NC1")
+smiles("c1(=S)[nH]c(c2ccccc2)cs1")
+smiles("c1(SSc2cc(ccc2N)S(=O)(=O)N)cc(ccc1N)S(=O)(=O)N")
+smiles("c1(SSc2ccc(C)cc2)ccc(cc1)C")
+smiles("C(Br)C(=O)c1c(C)cc(C)cc1C")
+smiles("Cc1c(c(c(c(c1C)C)C)Br)C")
+smiles("Cc1c(cccc1)C(=O)c1c(C)cccc1")
+smiles("Cc1ccc(cc1)C(=O)Oc1ccccc1")
+smiles("C(c1ccc(cc1)F)C(=O)O")
+smiles("Cc1ccccc1OB(Oc1ccccc1C)Oc1ccccc1C")
+smiles("Cc1ccc(cc1)S(=O)(=O)N(C)N=O")
+smiles("Cc1cc(C)cc(C)c1CC(=O)c1ccccc1")
+smiles("Cc1cc(C)c(C[N+](C)(C)C)c(c1C)C")
+smiles("Cc1cc(C)cc(NC(=O)C)c1")
+smiles("Cc1c(cc(c(C(=O)C)c1)C)C")
+smiles("Cc1c(c(cc(C(=O)C)c1)C)O")
+smiles("Cc1cc(C(=O)c2ccccc2)c(cc1)O")
+smiles("Cc1ccc(S(=O)(=O)OCCCCl)cc1")
+smiles("C(C1(CCN(C)C)C(=O)CCc2ccccc12)CN(C)C")
+smiles("Cc1c(c(O)c2ccccc2c1)C#N")
+smiles("Cc1c(I)ccc(N(=O)=O)c1")
+smiles("C(c1cnc2nc(nc(N)c2n1)N)N(c1ccc(C(=O)N[C@H](C(=O)O)CCC(=O)O)cc1)C")
+smiles("C[C@]1(C(=O)NC(=O)N1)CCCCCC")
+smiles("C[C@@]1(NC(=O)NC1=O)CC(C)(C)C")
+smiles("CC1(OB(OC(C[C@@H](OB2OC(C[C@H](C)O2)(C)C)C)(C)C)O[C@@H](C)C1)C")
+smiles("Cc1sc(c(C)n1)CCNCCc1sc(nc1C)C")
+smiles("C(=Cc1ccccc1)C=Cc1ccccc1")
+smiles("C(#Cc1ccccc1)C(C#Cc1ccccc1)(C=Cc1ccccc1)O")
+smiles("CCc1ccc(cc1)N(=O)=O")
+smiles("C(Cc1ccc(cc1)OC)C(=NO)c1ccccc1")
+smiles("C(=Cc1ccc(Cl)cc1)c1ccccc1")
+smiles("C(C(c1ccccn1)CC(=O)c1ccccc1)C(=O)c1ccccc1")
+smiles("C(=C(c1ccc(I)cc1)C(=O)O)c1cc(c(c(c1)Cl)O)Cl")
+smiles("C(C)c1c(cc(nc1)C)N")
+smiles("CCc1cnc(C=Cc2ccc([N+](=O)[O-])cc2)cc1")
+smiles("C(C)[C@@]1(NC(=O)NC1=O)C")
+smiles("C(=CC1=[O+][Cu]2([O+]=C(c3ccccc3)C1)[O+]=C(CC(=[O+]2)C=Cc1ccccc1)c1ccccc1)c1ccccc1")
+smiles("CCC1=[O+][Cu]2([O+]=C(CC)CC(=[O+]2)CC)[O+]=C(CC)C1")
+smiles("CC(=Cc1ccccc1)c1ccccc1")
+smiles("CC(C)(c1c(cc(C(C)(C)C)c(c1)O)O)C")
+smiles("CCCc1ncccc1")
+smiles("C(CCC1=NCCN1)CCCCCCCCCCCCCC")
+smiles("C(CCC)c1ccccn1")
+smiles("CC(C)(C)c1ccc(C(=O)C)cc1")
+smiles("C(CCCCCc1c(O)cc(cc1)O)CCCCCCCCC")
+smiles("C(CCCCC)c1nc(C)ccc1")
+smiles("C(C(CCCCC)c1ncccc1)CCCC")
+smiles("C(C)CC=C(C)C#CC1=CCCCC1")
+smiles("C(CCCCCCCCCCCCCCCCCCCCCS)CCCCCCCCC")
+smiles("CCCCCCCCCCCCCCCCCCC(CO)CO")
+smiles("C(CCCC(CCCCCCC)(CCCCCCC)O)CCC")
+smiles("C(CCCCC(CCCCCC)(CCCCCC)O)C")
+smiles("C(CCCCCCCCCCC)CCCC=CC(=O)O")
+smiles("C(CCCCCCC)CCCCCC#N")
+smiles("C(C)CCCC(CCCCC)(CC)O")
+smiles("C(CCCCCC)CCCCCCS")
+smiles("C(CC)CCC(CCC)(CCC)O")
+smiles("CC(C)(C(CCCC)(CCCC)O)C")
+smiles("CCCCCCCCCCCC(=O)Nc1ccc(cc1)SSc1ccc(cc1)NC(=O)CCCCCCCCCCC")
+smiles("C(C)CCCCCCCCCC(=O)N(CCCC)CCCC")
+smiles("C(CCCC)CCCCCCCSC(SCCCCCCCCCCCC)SCCCCCCCCCCCC")
+smiles("CC(C)(C)C[C@](CCCCC)(O)C")
+smiles("C(CCCCCCCCCOB(OCCCCCCCCCCCC)OCCCCCCCCCCCC)CC")
+smiles("C(C)(CC(CC(C)(C)C)C(=O)CC)(C)C")
+smiles("CC([C@](C)(CC(C)(C)C)C(=O)O)(C)C")
+smiles("CCCCCCCCC(C(=O)O)(C)C")
+smiles("C(CCC(CCCCC)(O)CCCC)CC")
+smiles("C(C)C(CC)(CC)[C@@H](O)c1ccccc1")
+smiles("C(C)CCCC(C)(C)O")
+smiles("C(CCCCCC)COB(OCCCCCCCC)OCCCCCCCC")
+smiles("CC(C)(C)[C@](CCC)(O)C")
+smiles("C(C(CCCC)(CC)O)CCC")
+smiles("CCCC(CCCC)(O)CCCC")
+smiles("C(CC(CCCC)C(=O)O)CC")
+smiles("C(C)CC[C@@](CC)(C(=O)O)CCCCCCCC")
+smiles("C(CCCC)C[C@H]1NCCCC1")
+smiles("C(CCC)CCC(=NNc1c(cc(cc1)[N+](=O)[O-])[N+](=O)[O-])C")
+smiles("C(C)(C)(C)C[C@@](C)(O)CCCC")
+smiles("C(CCC(C(C)C)(O)C(C)C)C")
+smiles("C(C)(C)C(C(C)C)(O)CCC(C)C")
+smiles("C(CCCCC(C(=O)O)(CC)CC)CCC")
+smiles("CC(C)(C)CC(C(=O)OCCC)CC(C)(C)C")
+smiles("C(C(C)(C)C)[C@@H](C)C(=O)OCC(C)(C)C")
+smiles("C(CCCC[C@H](N)C(=O)O)C[C@@H](C(=O)O)N")
+smiles("C(#C)[C@](CC)(C)O")
+smiles("C(C)(C)(C)CC(=O)C")
+smiles("C(C(C)C)(CC)(O)CC")
+smiles("C(C)(C)C(C)(C(=O)C)C")
+smiles("CC(CC(C)(C)O)(C)C")
+smiles("CC(C)(C)C[C@@](O)(C(C)C)C")
+smiles("C(C)(C)(C)CC(O)(CCCC)CCCC")
+smiles("CCCCCC(O)(CCCC)CCCC")
+smiles("C(C)CCCC(=O)CC(=O)CC")
+smiles("C(C)(C)(C)CC(=O)OCC")
+smiles("C(CCCCC(=O)OCC)N")
+smiles("C(C)(C)C[C@H](C)OC=O")
+smiles("CC(C)(C)[C@H](O)C")
+smiles("C(C)CC(C#N)(CCC)CCC")
+smiles("C(CCCCN(CCCCCC)CCCCCC)CCCCCCO")
+smiles("C(CCCCN)C#N")
+smiles("C(CCCCNP(=S)(NCCCCCCCC)NCCCCCCCC)CCC")
+smiles("C(C)(C)CCO")
+smiles("C(CCCCOB(OCCCCCCCCCCCCCCCCCC)OCCCCCCCCCCCCCCCCCC)CCCCCCCCCCCCC")
+smiles("C(CCC)C(=O)c1cc(C)c(cc1)OC")
+smiles("CC(C)(C)C(=O)C(C)C")
+smiles("CC(C)C[C@@](O)(C#C)C")
+smiles("C(C)(C)(C)C(=O)CCCCC")
+smiles("C(C)CCC(O)(CCCC)CCCC")
+smiles("C(C(C)(C)C(=O)C(C(C)(C)C)(C)C)(C)C")
+smiles("CC(C)CC(=O)CC(=O)CCC")
+smiles("C(C(C)(C)C)OC(=O)c1ccccc1")
+smiles("C(CC(C)C)OC(OCCC(C)C)OCCC(C)C")
+smiles("CC(CC(C(=O)OCC(C)(C)C)(C)C)(C)C")
+smiles("C(CCCC(=O)OOC(=O)CCCCCCCCCCC)CCCCCCC")
+smiles("CC(C)[C@@H](C)OC(=O)C")
+smiles("CC(C[C@@H](C(=O)O)C)(C)C")
+smiles("CC(CCl)(C)c1ccccc1")
+smiles("C(C)(CCl)(C)c1ccc(C(CCl)(C)C)cc1")
+smiles("C(CCCN(CCCCC)CC(=O)O[C@@H]1[C@]2(C)C(C)([C@@H](CC2)C1)C)C")
+smiles("C(CC)CNC(=O)OCC")
+smiles("C(C)CCOB(OCCCC)OCCCC")
+smiles("C(C)(C)(C(=O)C(C)(C)C)C")
+smiles("CC(CC(=O)CCC)(C)C")
+smiles("CC(C)(C(=O)C(CC)(C)C)C")
+smiles("CC(CC(=O)CC(C)(C)C)(C)C")
+smiles("C(CCC(=O)CCCCCCCCC=C)CCCCCC=C")
+smiles("C(CCC(=O)CCCCCCCCCCCCCCC)CCCCCCCCCCCC")
+smiles("C(#C[C@@](C)(O)CC)[C@@](O)(CC)C")
+smiles("C(CCCO)CCO")
+smiles("CC(C)(COC(=O)C)C")
+smiles("CCCCOCOCCCC")
+smiles("CC(C)(COC(=O)C(C)(C)C)C")
+smiles("CCCCOC(=O)C=CC(=O)OCCCC")
+smiles("C(CCC)OC(=O)N")
+smiles("C(C)C(C(=O)O)(CC)CC")
+smiles("C(CCCSC(=[NH2])N)CSC(=[NH2])N")
+smiles("CC[C@@H](C=Cc1nc2ccccc2cc1)CCCC")
+smiles("C(C[C@@H](CO)O)C")
+smiles("C(CC)N1C(=O)C(=O)[C@@H](C(=O)OCC)C1")
+smiles("C(CCNc1c2cc(ccc2nc2CCCCc12)OC)N(CCCCC)CCCCC")
+smiles("CC(C#N)(C)C")
+smiles("C(CCN(CCCCC)CCCNc1c2c(nc3CCCCc13)ccc(Cl)c2)CC")
+smiles("C(CCN(CC)CC)[C@@H](Br)C")
+smiles("C(CCN(CCCC)C(=[NH2])c1c(C)cc(C)cc1C)C")
+smiles("C(CCN(CCCC)C(=O)C[C@](C)(c1ccccc1)O)C")
+smiles("C(C)CN(CCC)N=O")
+smiles("C(CCN(CC(=O)O)CC(=O)O)([N+](=O)[O-])(C)C")
+smiles("C(=C(C#N)C#N)c1cc(c(cc1)Cl)Cl")
+smiles("C(=C(C#N)C#N)c1c(Cl)cc(Cl)cc1")
+smiles("C=CCNC(=O)OCC")
+smiles("CCC(=NNC(=S)N)C")
+smiles("C(=CC=NNC(=S)N)c1ccccc1")
+smiles("C(CC(=N)OC)OC(=O)c1ccccc1")
+smiles("CCCNP(=S)(NCCC)NCCC")
+smiles("CC(CO)(c1ccccc1)C")
+smiles("CCC(=O)c1ccc([N+](=O)[O-])cc1")
+smiles("CC(C(=O)C)(C)C")
+smiles("CCC(=O)CC(C)(C)C")
+smiles("C(CC(=O)C(C)(C)C)(c1ccccc1)c1ccccc1")
+smiles("C(C)C(O)(CC(C)(C)C)CC")
+smiles("CC(C(=O)C(C(C)(C)C)(C)C)(C)C")
+smiles("C(CC(=O)CCCCCCC)CCCCC")
+smiles("CC(C(=O)C(C)(C)C)(CCl)C")
+smiles("C(CCOC(=O)C)CCCCCCC=C")
+smiles("CC(C)(OC=O)C(OCC)OCC")
+smiles("C(=CC(=O)O)c1ccncc1")
+smiles("C([C@@](C(=O)O)(CC)CCCC)c1ccccc1")
+smiles("C(CC(=O)O[C@@H](CC(C)C)C)C")
+smiles("C(CCS)CCCCCCC")
+smiles("C(CCS)CCCCCCCCC")
+smiles("C(C(CS)C)S")
+smiles("C(C(F)(F)C(C(COC(=O)c1c(C(=O)OCC(C(C(F)(F)C(F)F)(F)F)(F)F)cccc1)(F)F)(F)F)(F)F")
+smiles("C(C(F)F)(CO)(F)F")
+smiles("C([C@H]1CO1)OCC=C")
+smiles("C[C@H]1SC(C)S[C@H](C)N1")
+smiles("C([C@@H](C)OC(=O)CC(C)C)C(C)C")
+smiles("C(Cl)c1cc(ccc1O)[N+](=O)[O-]")
+smiles("C(Cl)CN(C)CCCl")
+smiles("C(Cl)COC[C@@H]1OC1")
+smiles("C(C)N1C[C@@H](C(=O)C1=O)C(=O)OCC")
+smiles("CC(N1C(=O)C(=O)[C@H](C1)C(=O)OCC)C")
+smiles("CCN(CC)CCCC#N")
+smiles("C(CN(CCCC)C(=O)C)CC")
+smiles("CC(N(C(C)C)P(=O)(c1ccc([N+](=O)[O-])cc1)OP(=O)(N(C(C)C)C(C)C)c1ccc(cc1)[N+](=O)[O-])C")
+smiles("[C@@](C#N)(C)([C@@H](C)c1ccccc1)c1ccccc1")
+smiles("CC(N(CC(=O)O)CC(=O)O)C")
+smiles("CCN(C=O)CC")
+smiles("CC(NC(=O)C)NC(=O)C")
+smiles("[C@@](C)(N)(C(=O)O)CC")
+smiles("C(C)NC(=O)OCC")
+smiles("CC(=NNC(=S)N)c1ccccc1")
+smiles("CCN(N=O)CC")
+smiles("CC(N(N=O)C(C)C)C")
+smiles("CC(=NO)C(=NNC(=S)N)C")
+smiles("CCNS(=O)(=O)NCC")
+smiles("CCO")
+smiles("C(C(OB(OC(CC(C)C)CC(C)C)OC(CC(C)C)CC(C)C)CC(C)C)C(C)C")
+smiles("CC(=O)c1ccc(Oc2ccc(C(=O)C)cc2)cc1")
+smiles("CC(=O)c1ccncc1")
+smiles("C(COc1ncc(NC[S](=O)=O)cc1)CC")
+smiles("CCO[C@H](c1ccccc1)C")
+smiles("CC(=O)C(=NO)C")
+smiles("CCOC(=O)CC1(CCCCC1)O")
+smiles("C(C)OC(=O)C(CCCCCCC)C(=O)OCC")
+smiles("CCOC(=O)[C@H]1C(=O)C(=O)N(C)C1")
+smiles("CCOC(=O)[C@H](c1ccccc1)C#N")
+smiles("CCOC(=O)NC(NC(=O)OCC)C")
+smiles("CCOC(=O)NC(NC(=O)OCC)CCl")
+smiles("C(CO)(F)(F)C(C(C(F)(C(F)(F)C(F)F)F)(F)F)(F)F")
+smiles("CC(=O)NC")
+smiles("CC(=O)Nc1cc(cc(C)c1)Br")
+smiles("CC(=O)Nc1ccc(C(=O)CCl)cc1")
+smiles("C(C(=O)N)CCCCCCCCCC")
+smiles("CC(=O)NCCNC(=O)C")
+smiles("CC(=O)N[C@@H](C(Cl)Cl)O")
+smiles("C(C(=O)O)Br")
+smiles("C(C(=O)Oc1c(cccc1)C(=O)O)CC")
+smiles("CC(=O)O[C@@]1(C)[C@@](C)(C(=O)OC1=O)OC(=O)C")
+smiles("C(C(=O)O)CC(c1ccccc1)(c1ccccc1)C[C@@H](N(C)C)C")
+smiles("CC(OOC(C)(C)C)(C)C")
+smiles("C(C(=O)O)CC(C)(CCC(=O)O)C")
+smiles("C(C(=O)O)(CCCC)C(=O)O")
+smiles("C(C(=O)O)CC(=O)OC")
+smiles("CC(=O)O[C@H](CC(C)C)C")
+smiles("C(C(=O)O)Oc1c(Cl)cc(Cl)c(c1)Cl")
+smiles("C(C)SCCCC")
+smiles("CC([Si](C)(C)C)(C(=O)OCC)C")
+smiles("CC(=S)N1CCCCC1")
+smiles("[C@@H]12CC[C@@](C)(C(=O)C1=O)C2(C)C")
+smiles("[C@@H]12CC[C@H]([C@@H](CCCC(C)C)C)[C@]2(CC[C@@H]2[C@]3(CC[C@H](Cl)C[C@]3(Br)[C@@H](Br)C[C@H]12)C)C")
+smiles("[C@H]12[C@@H]([C@@H]3[C@@]([C@@](C(=O)COC(=O)C)(CC3)O)(C)C[C@H]2O)CCC2=CC(=O)CC[C@@]12C")
+smiles("[C@H]1(CCCCCCCC)O[C@H]1CCCCCCCC(=O)O")
+smiles("[C@H]1(CCN(C1=O)Cc1ccccc1)O")
+smiles("[C@@H]1(C)C(O)[C@H](CCC1)C")
+smiles("[C@H]1([C@@H]([C@H]([C@@H](C)C=C1)COC(=O)C)COC(=O)C)C")
+smiles("[C@@H]1([C@H]([C@H]([C@H](O)[C@H](CO)O1)O)O)Nc1ccc(OCC)cc1")
+smiles("[C@H]1([C@H]([C@H]([C@@H](O)[C@@H](O1)O)O)O)C(=O)O")
+smiles("[C@H]1([C@H](OC(=O)C)[C@@H]([C@@H](OC(=O)C)[C@@H](Sc2c(NC(=O)C)cc(Cl)cc2)O1)OC(=O)C)COC(=O)C")
+smiles("[C@H]1(C[N+](C)(C)C)OCCOC1")
+smiles("[C@@H]1(COc2cc([N+](=O)[O-])ccc2)OC1")
+smiles("[C@H]1(C(=O)OCC)CN(C(C)(C)C)C(=O)C1=O")
+smiles("[C@@H]1(OCOCC1)C")
+smiles("[C@H]1(OC(=O)C)CCCC[C@@H]1OC(=O)C")
+smiles("[C@H]1(OC(=O)C)[C@H]([C@@H](O[C@H](Sc2cccc3ccccc23)[C@H]1OC(=O)C)COC(=O)C)OC(=O)C")
+smiles("[C@H](CBr)(Br)C(=O)O")
+smiles("[C@H](CCCCCCCCCCCCCCCC)(C(=O)O)O")
+smiles("[C@H](CCCC)(CC)C(=O)CC(=O)C")
+smiles("[C@H](C)(Cl)C(=O)O")
+smiles("[C@@H]([C@H]1OC(=O)[C@@H]([C@@H]1O)O)(O)C=O")
+smiles("[C@H]([C@@H](O)c1ccc(Cl)cc1)(NCCO)c1ccc(Cl)cc1")
+smiles("[C@H](COC(=O)C=[N+]=[N-])(C(=O)O)N")
+smiles("[C@H](C(=O)NO)(N)Cc1ccc(O)cc1")
+smiles("[C@@H](C(=O)OCC)(CC(=O)OCC)C(=O)C")
+smiles("[C@H](NCCO)(c1ccc(Cl)cc1)C(=O)c1ccc(cc1)Cl")
+smiles("[C@H](OCCCC)(c1ccccc1)N1CCCCC1")
+smiles("Clc1c2c(cc(Cl)cc2)ncc1")
+smiles("Clc1c(C)c2c(cc1)c(O)c(C(=O)OCC)cn2")
+smiles("Clc1ccc(CCC(=O)C)cc1")
+smiles("Clc1ccc(C(=NN=C(c2ccc(Cl)cc2)C)C)cc1")
+smiles("Clc1cc(Cl)ccc1OCCO")
+smiles("ClC(Cl)[C@H](NC(=O)Cc1ccccc1)O")
+smiles("ClC(Cl)C(NC(=O)OCC)NC(=O)OCC")
+smiles("Cl[C@H](C)C(Cl)([C@H](O)NC(=O)CCCC)Cl")
+smiles("[Cl](=O)(=O)(=O)O")
+smiles("C(N1c2ccccc2Sc2ccccc12)C")
+smiles("C(#N)c1c2c(nc3c1cccc3)cccc2")
+smiles("CN(c1ccc(cc1)c1ccc(N(C)C)cc1)C")
+smiles("CN(c1c(N)cc(cc1)C(=O)c1ccc(c(c1)N)N(C)C)C")
+smiles("C[N+](Cc1ccccc1C[N+](C)(C)C)(C)C")
+smiles("C[N+](Cc1c(cc(C)cc1C)C)(C)C")
+smiles("C(N(C)C)Cc1c(cc(cc1C)C)C")
+smiles("C([N+](CCC)(CCC)CCC)c1ccccc1")
+smiles("C(#N)C(C)(C)O")
+smiles("C(#N)C([C@@H](C#N)c1ccccc1)C#N")
+smiles("C(N(CC)N=O)CCC")
+smiles("C(#N)CCOC(=O)C")
+smiles("C(N([C@@H]1C(=NO)CCCC1)CC)C")
+smiles("C[N+]([C@@H](C)CC(c1ccccc1)(C(=O)CC)c1ccccc1)(C)C")
+smiles("C(#N)[C@@H](C)N(C)C")
+smiles("C(N)CNCCN")
+smiles("C(NC(=O)c1ccccc1)CCCCCNC(=O)c1ccccc1")
+smiles("C(=NN)(c1ccccc1)c1ccccc1")
+smiles("C(=NNc1c(cc([N+](=O)[O-])cc1)N(=O)=O)(CC(C)C)CC(C)C")
+smiles("C(=NNC(=S)N)c1cc2c(cc1)OCO2")
+smiles("C(=NNC(=S)N)c1ccc(cc1)S(=O)(=O)CC")
+smiles("C(=NO)(C)CC(C)C")
+smiles("C(=NO)(C(=NO)C)C")
+smiles("C[N+](=O)[O-]")
+smiles("C(=O)(c1ccccc1)C1CCCCC1")
+smiles("COc1cc(ccc1)C#N")
+smiles("COc1cccc(C#N)c1")
+smiles("C(=O)(c1c(NN)cccc1)O")
+smiles("C(=O)(c1c(OCC(=O)O)cccc1)Nc1ccccc1")
+smiles("C(=O)(C(c1ccccc1)(O)c1ccccc1)OC")
+smiles("C(O)(CCCCC)(CCCCC)C")
+smiles("C(=O)([C@@](C)(CC)CCC)O")
+smiles("C(=O)(CCCCCC)O[C@H](C)CC(C)C")
+smiles("C(=O)(CC(C)CC(=O)OCC(F)(F)C(F)(C(F)(C(F)F)F)F)OCC(C(C(F)(F)C(F)F)(F)F)(F)F")
+smiles("C(=O)(CC(C)(C)NNC(=S)N)C")
+smiles("C(=O)(C(C)(C)C(=O)O)O")
+smiles("COCCCN")
+smiles("C(=O)(CC(=O)NN)NN")
+smiles("C(=O)(CC(=O)OCCCCCCCCCCCCCCCC)OCCCCCCCCCCCCCCCC")
+smiles("C(=O)([C@H](C)Br)O")
+smiles("C(=O)([C@@H](C)CC(C)(C)C)Cl")
+smiles("C(=O)([C@@H](N1CCOCC1)[C@H](N1CCOCC1)C(=O)c1ccccc1)c1ccccc1")
+smiles("C(=O)([C@@H](N)CCSCC)O")
+smiles("C(O)[C@@H](O)[C@@H](O)[C@H](O)[C@@H](C=O)N")
+smiles("C(=O)([C@@H](O)[C@H](O)C(=O)OC)OC")
+smiles("C(=O)(C)Nc1ccc(cc1)C=NNC(=S)NN")
+smiles("C(O)CNCCN")
+smiles("C(=O)(CN(CC(=O)O)Cc1ccccc1)O")
+smiles("C(=O)(C(=NO)Cl)c1ccc(cc1)C")
+smiles("C(OC(=O)CC(C)C)C(C)(C)C")
+smiles("C(OC(=O)C(C(C)C)C(=O)OCC)C")
+smiles("COC(=O)CCN(CC)CC")
+smiles("C(OC(=O)[C@@H](C(C)C)C(=O)CC(C)C)C")
+smiles("C(=O)(C)O[Hg]c1ccc(cc1)N=Cc1ccccc1O")
+smiles("C(=O)(C(=O)O)C")
+smiles("COC(=O)OCC=CCOC(=O)OC")
+smiles("C(=O)(N(c1cc2cc(cc(O)c2cc1)S(=O)(=O)O)c1ccccc1)OCC")
+smiles("C(=O)(Nc1ccccc1)C(Cl)(Cl)Cl")
+smiles("C(=O)(N(CC)CC)CC")
+smiles("C(=O)(N(CC)CC)C=Cc1ccccc1")
+smiles("C(=O)(N)CNC")
+smiles("C(=O)(NCO)C=C")
+smiles("C(=O)(NN)c1cc(OC)nc(c1)OC")
+smiles("C(=O)(O)c1ccc(cc1O)N(=O)=O")
+smiles("C(=O)(O)C(C)C")
+smiles("C(=O)(OC(=Cc1ccccc1)C)c1ccccc1")
+smiles("C(=O)(O)CCCc1ccccc1")
+smiles("C(=O)(O)C(CCCC)(CC)CC")
+smiles("C(=O)(OCCCCCCCC)c1ncccc1")
+smiles("C(=O)(OCC)C(C(=O)OCC)NC(=O)c1ccccc1")
+smiles("C(=O)(O)CCCl")
+smiles("C(=O)(OOC(=O)CCC(=O)O)CCC(=O)O")
+smiles("C(SCCS[C@H](c1ccccc1)CC(=O)C)CS[C@@H](CC(=O)C)c1ccccc1")
+smiles("C(=S)(C)SCC(C)C")
+smiles("C(SC(=S)N(CC)CC)CC(=O)N")
+smiles("C(=S)(Nc1c(CC)cccc1)Nc1c(CC)cccc1")
+smiles("C(=S)(N)NN=CCCCCCC")
+smiles("C(=S)(N)NNC(=O)c1ccc([N+](=O)[O-])cc1")
+smiles("CS(=O)C")
+smiles("CS(=O)(=O)OCCCCOS(=O)(=O)C")
+smiles("C(SSCCCCCCCCCCCCCCCC)CCCCCCCCCCCCCCC")
+smiles("Fc1c(CC(=O)O)cccc1")
+smiles("FC(C(C(CO)(F)F)(F)F)(C(F)F)F")
+smiles("FC(F)C(C(F)(C(F)(F)COC(=O)CCCC(=O)OCC(F)(F)C(C(F)(F)C(F)F)(F)F)F)(F)F")
+smiles("FC(F)(C(F)(F)C(CO[Si](OCC(C(F)(F)C(F)(F)C(C(F)(F)C(F)F)(F)F)(F)F)(OC(C)(C)C)OC(C)(C)C)(F)F)C(F)(C(C(F)F)(F)F)F")
+smiles("[H+]")
+smiles("[Hg](c1ccccc1)Sc1nc2ccccc2s1")
+smiles("[H][H]")
+smiles("[I](Cl)Cl")
+smiles("n1c2c(cccc2)ns1")
+smiles("n1c2c(nc(N)nc2O)[nH]n1")
+smiles("N1c2c(Sc3ccccc13)cccc2C(=O)OC")
+smiles("n1cc2c(O)nc(nc2[nH]1)N")
+smiles("n1cccc2ccc(c(O)c12)[C@H](Nc1ccc(C(=O)O)cc1)c1ccccc1")
+smiles("N1CCCCC1")
+smiles("n1c(cccc1)CC")
+smiles("n1c(C)cccc1CCCCC")
+smiles("n1ccc(CCC)cc1")
+smiles("N1(CCCC[C@@H]1C)[C@H](CC(=O)c1ccccc1)C(=O)c1ccccc1")
+smiles("N1(CCC[C@H]1[C@@H]1CCCNC1)C")
+smiles("n1c(ccc(N)c1)Cl")
+smiles("N1=C(CC(=O)N1C)C")
+smiles("n1cc(C(=O)O)ccc1Cl")
+smiles("N1CCNCC1")
+smiles("n1c(C(=O)O)cccc1")
+smiles("n1c(ncc2CCc3ccccc3c12)NC(=O)C1CC1")
+smiles("N1(C(=O)c2c(cccc2)C1=O)[N+](=O)[O-]")
+smiles("n1c(O)c2ccccc2c(O)n1")
+smiles("N1C(=O)[C@@H](NC(=O)[C@@H]1CCCl)CCCl")
+smiles("N1=C(OC(=O)C1=Cc1ccccc1)c1ccccc1")
+smiles("N1C(=O)CSc2cc(ccc12)Cl")
+smiles("n1c(O)nc2[nH]nnc2c1O")
+smiles("n1n2ccccc2cn1")
+smiles("n1n2ccccc2nn1")
+smiles("N(c1c2cc(OC)ccc2nc2cc(ccc12)Cl)CCCN(CC)CC")
+smiles("Nc1ccc2c(ncc(c2O)C(=O)OCC)n1")
+smiles("N(c1ccccc1)(c1ccccc1)N=O")
+smiles("Nc1ccc(cc1)C(=O)C=Cc1ccccn1")
+smiles("Nc1ccccc1S(=O)(=O)O")
+smiles("Nc1ccccn1")
+smiles("N(c1ccc(S(=O)(=O)N)cc1)C(=O)CBr")
+smiles("Nc1c(C(=O)O)cc(cc1)I")
+smiles("Nc1nc2ncc(nc2c(N)n1)CNc1ccc(C(=O)N[C@@H](CCC(=O)O)C(=O)O)cc1")
+smiles("Nc1ncccc1C")
+smiles("Nc1nc(N)ncn1")
+smiles("N#Cc1cc(c2c(c1Cl)Nc1c(ccc(Cl)c1S2)Cl)Cl")
+smiles("N(C)C1CCCCC1")
+smiles("N(=C(c1ccccc1)c1ccccc1)c1ccccc1")
+smiles("N(=Cc1ccccc1)c1cc(C)ccn1")
+smiles("N(=Cc1ccccc1)NC(=S)NN")
+smiles("N(=Cc1ccc(Cl)cc1)N=Cc1ccc(Cl)cc1")
+smiles("N(=Cc1sccc1)NC(=S)N")
+smiles("[N+](C)(Cc1ccc(cc1)[N+](=O)[O-])(C)C")
+smiles("N(CC)(c1ccc(cc1)SC#N)CC")
+smiles("N(=C(C)c1sccc1)NC(=S)N")
+smiles("NC(C)(Cc1ccccc1)C")
+smiles("N#CC(=Cc1ccc(cc1)Cl)C#N")
+smiles("N(=CC=Cc1ccccc1)N=CC=Cc1ccccc1")
+smiles("N#CC(=Cc1cccc(c1)[N+](=O)[O-])C#N")
+smiles("N(CC)(CC)CCCCCCCC")
+smiles("N(C)(C)CCC#N")
+smiles("N(CC)(CCC#N)CC")
+smiles("N(CC)(CC)C(=O)CCC(=O)O")
+smiles("N(=C(C)CC)O")
+smiles("NCCCNC(C)C")
+smiles("NCCCOC(C)C")
+smiles("N(CCC(=O)O)(c1ccccc1)C(=O)C(=O)OCC")
+smiles("N#C[C@@H](C1CCCCC1)c1ccccc1")
+smiles("N#C[C@H](NC(=O)N[C@H](C)C(=O)N)C")
+smiles("N(CCN)CCNCCN")
+smiles("N#C[C@@](OC(=O)C)(CC)C")
+smiles("N(C(C(=O)N)(C)C)C(=O)NC(C#N)(C)C")
+smiles("N(CC(=O)O)(CC(=O)O)CC")
+smiles("N(C(=[NH2])Nc1ccccc1C)c1ccccc1C")
+smiles("N(C(=O)c1ccccc1N)N")
+smiles("N(C(=O)c1cc(ccc1O)N)N")
+smiles("N(C(=O)C)c1c(C(=O)O)cc(I)cc1")
+smiles("N(C=O)(CC)CC")
+smiles("N(C(=O)C)CNC(=O)C")
+smiles("NC(=O)OCC")
+smiles("N(C(=O)OCCCl)c1ccccc1")
+smiles("N#CSc1ccc(cc1)N(CCC)CCC")
+smiles("N(C(=S)Nc1ccc(C)cc1)c1ccc(C)cc1")
+smiles("N(C(=S)N=CCC)C(=S)N")
+smiles("N(C(=S)N)N=Cc1ccncc1")
+smiles("N(C(=S)N)N=C(C)c1ccc(cc1)Cl")
+smiles("N(C(=S)N)N=CC=CC")
+smiles("[nH]1cccc1")
+smiles("[nH]1c(nnn1)NC(=O)NN=Cc1c(O)cccc1")
+smiles("N(=Nc1ccc(cc1)c1ccccc1)c1ccc(c2ccccc2)cc1")
+smiles("N(N=Cc1cnccc1)C(=S)NN")
+smiles("N(N=C(C)C)C(=O)N")
+smiles("NNC(=O)c1ccc(N)cc1")
+smiles("N(N)C(=O)C1C(C(=O)NN)C1C(=O)NN")
+smiles("NNC(=O)C=CC")
+smiles("N(N)C(=S)NN=Cc1c2c(cccc2)ncc1")
+smiles("NNC(=S)NN=Cc1nc2ccccc2cc1")
+smiles("N(N)C(=S)NN=Cc1[nH]ccc1")
+smiles("N(NS(=O)(=O)c1ccccc1)C(=S)N")
+smiles("[N+](=O)(c1ccc(CCc2ccc(N(=O)=O)cc2)cc1)[O-]")
+smiles("N(=O)N1CCN(N=O)CC1")
+smiles("N(=O)N1CCOCC1")
+smiles("N(=O)N(CC(C)C)CC(C)C")
+smiles("[N+](=O)([O-])c1ccc(C(=O)c2ccc(cc2)C)cc1")
+smiles("[N+](=O)([O-])c1cc(CSC#N)c(cc1)O")
+smiles("[N+](=O)([O-])C(C)(C)CCN")
+smiles("N(=O)(=O)N1C(=O)CCC1=O")
+smiles("NP(=O)(c1ccccc1)N")
+smiles("N(P(=S)(c1ccccc1)NN)N")
+smiles("N(P(=S)(Cl)Cl)CCCCCCC")
+smiles("NS(=O)(=O)N")
+smiles("[O-]")
+smiles("[O+]")
+smiles("O") 
+smiles("O1C=C2C(=C(C(=O)C(=C2O)C(=O)O)C)[C@@H](C)[C@@H]1C")
+smiles("O1C[C@@H]1[C@@H]1CO1")
+smiles("O1[C@H](C)C=CC1=O")
+smiles("O1C(OCC1)(CC)C")
+smiles("O1[Cu]23Oc4ccccc4C=[N+]2CC[N+]3=Cc2ccccc12")
+smiles("[O-2]")
+smiles("O=C1c2ccccc2C(=O)c2c1cc(cc2)C")
+smiles("O=C1c2c(cccc2)C(=O)C(=C1N(C)C)Cl")
+smiles("Oc1c2c(c(nn1)O)c(ccc2)N(=O)=O")
+smiles("Oc1cc(c2ccc(nc2n1)N)C")
+smiles("O(c1c(ccc(c1)C)C)CC=C")
+smiles("Oc1c(cccc1)C(=O)c1ccccc1")
+smiles("O=C1C=C(C[C@H](C)C1)C")
+smiles("Oc1ccc(C=NCCN=Cc2ccc(cc2)O)cc1")
+smiles("Oc1ccc(C=NNC(=S)N)cc1OC")
+smiles("O(c1ccc(C(=O)CCC(=O)O)cc1OC)C")
+smiles("O=C1C=CC(=O)C(=C1)C")
+smiles("O=C1CCC(=O)N1Br")
+smiles("O(c1ccc(S(=O)(=O)Cl)cc1)c1ccc(S(=O)(=O)Cl)cc1")
+smiles("O(c1ccc(SSc2ccc(OC)cc2)cc1)C")
+smiles("O(c1c(C(=O)O)ccc([N+](=O)[O-])c1)Cc1ccccc1")
+smiles("O=C1[C@H](C)O[Ti]2(O[C@H](C)C(=O)O2)(O)(O)O1")
+smiles("O=C1C(=O)N(C[C@H]1C(=O)OCC)CCCC")
+smiles("O=C1N(C=C)C(=O)CC1")
+smiles("O(C)B(OC)OC")
+smiles("O=C(c1cccc(c1Br)[N+](=O)[O-])OC")
+smiles("O=C(c1ccc(cc1)O)NN")
+smiles("O=C(c1ccccc1)OOC(C)(C)C")
+smiles("O=C(c1c(cccc1)SCC(=O)O)O")
+smiles("O(C)c1ccc(C)c(CN(C)C)c1")
+smiles("O(C)c1cc([N+](=O)[O-])c(c(N(=O)=O)c1)N")
+smiles("O=C(c1cc(=O)c(O)c(C(=O)O)o1)O")
+smiles("O(C)c1c(OC)cc2c([C@]34CCN5[C@@H]3C[C@@H]3[C@@H]6[C@H](OCC=C3C5)CC(=O)N2[C@H]46)c1")
+smiles("O=C(C1(N)CCCC1)O")
+smiles("O=Cc1nc(nc(O)c1)SCC")
+smiles("OC(CBr)CBr")
+smiles("O=C(CBr)Nc1c(cccc1)C")
+smiles("O=C(C(c1ccccc1)(c1ccccc1)c1ccccc1)O")
+smiles("O(CCC)B(OCCC)OCCC")
+smiles("O=C(C(=Cc1cc(c(c(c1)Cl)O)Cl)c1ccccc1)O")
+smiles("O=C(C=Cc1ccc(cc1)N(C)C)c1ccccc1")
+smiles("OC(C)(C)C#C")
+smiles("O(CCCCC)B(OCCCCC)OCCCCC")
+smiles("O(CCCCCC)B(OCCCCCC)OCCCCCC")
+smiles("O=C(C(C)C)CC(C)C")
+smiles("O[C@](C)(CCCCC)CC")
+smiles("O(CC(C)(C)C)C(=O)C(CC)CC")
+smiles("OCC(C)(C)N")
+smiles("O=C(C(C)C)O")
+smiles("OCC=CCO")
+smiles("OCC#CCO")
+smiles("O=C(C)[C@H](C(C)(C)C)C")
+smiles("O=C(CCl)O")
+smiles("O=C(CC(=O)CC(C)C)C")
+smiles("O(CC)C(=O)CC(=NNC(=S)N)C")
+smiles("O=C(C(C(=O)C)C(=O)OCC)C")
+smiles("O(CC)C(=O)[C@@H](CCc1ccccc1)C(=O)C")
+smiles("OCC(F)(F)F")
+smiles("O=C([C@H]1CN(C(=O)C1=O)CC(C)C)OCC")
+smiles("O(C[C@@H]1OC1)c1ccccc1")
+smiles("O=C([C@@H](Br)[C@H](c1ccccc1)Br)CBr")
+smiles("O=C([C@H](CCC)Br)O")
+smiles("O=C(C)N(CC)CC")
+smiles("O=C(C)OC[C@H]1[C@@H](COC(=O)C)[C@H]2C[C@H]1CC2")
+smiles("O=C(C(=O)NN)NN")
+smiles("O[C@@H]1[C@H](CO)OC(=O)[C@@H]1O")
+smiles("O[C@@H](c1ccc(cc1)Oc1ccc([C@H](O)C)cc1)C")
+smiles("O[C@H](CN)CCC")
+smiles("O=CN")
+smiles("O=C(Nc1ccc(C(=O)O)cc1)c1ccccc1O")
+smiles("O=C(Nc1ccc(S(=O)(=O)NN)cc1)C")
+smiles("O=C(NCC)NCC")
+smiles("O=C(NC(NC(=O)OCC)CC)OCC")
+smiles("O=C(NC(NC(=O)OCC)[C@H](Cl)CC)OCC")
+smiles("O=C(NC(=O)OCC)N")
+smiles("O=C(NNC(=O)NNC(=O)N)N")
+smiles("O=C(O)c1ccccc1")
+smiles("O=C(O)c1ccccc1SSc1c(cccc1)C(=O)O")
+smiles("O=C(O)C1=CC[C@H](C)CC1")
+smiles("OC(=O)c1ccc(N(=O)=O)cc1Cl")
+smiles("OC(=O)c1c(C(=O)O)ccnc1")
+smiles("O=C(O)C(=Cc1cc(c(O)c(c1)Cl)Cl)CCCC")
+smiles("OC(=O)C(=Cc1cc(c(O)c(I)c1)I)c1ccc(I)cc1")
+smiles("O(C=O)CC(C)(C)C")
+smiles("O=C(OCC(C)(C)C)CC")
+smiles("O=C(OCC)C(CCCCC(C(=O)OCC)C(=O)OCC)C(=O)OCC")
+smiles("OC(=O)CC[C@@H](C(=O)O)NC(=O)OCc1ccccc1")
+smiles("O(C(=O)C)[C@](C#N)(C)[C@](C)(C#N)OC(=O)C")
+smiles("O=C(O)C(C(F)(C(F)(F)F)F)(F)F")
+smiles("OC(=O)[C@@H](Br)C(C)C")
+smiles("O(C(=O)[C@@H](Br)CCCCCCCCCCCCCCCC)CC")
+smiles("O(C(=O)[C@H]([Hg]Br)[C@H](c1ccccc1)OC)[C@H]1C[C@H]2C(C)(C)[C@]1(C)CC2")
+smiles("OC(=O)CN(CCN(CC)CC)CC(=O)O")
+smiles("OC(=O)CN(CC(=O)O)CCN(C)C")
+smiles("OC(=O)CO")
+smiles("OC(=O)C(=O)CCCCCC")
+smiles("O(C(=O)Nc1[nH]nnn1)CC")
+smiles("O=C(OOC(=O)C)C")
+smiles("[OH-]")
+smiles("[OH3+]")
+smiles("O=[N+](c1cccc2c1cccc2C(=O)Cl)[O-]")
+smiles("O=[N+](c1cc(c(OC)c2cccnc12)OC)[O-]")
+smiles("ON=Cc1ccc(NC(=O)C)cc1")
+smiles("ON=C(C=Cc1ccc(OC)cc1)c1ccccc1")
+smiles("O[NH4]")	# chemical, but needs brackets
+smiles("O=NN(c1ccccc1)C")
+smiles("O=N(=O)c1cc(ccc1)C=NNC(=S)NN")
+smiles("[O-][N+](=O)c1cc(cc(c1)N)N(=O)=O")
+smiles("[O-][N+](=O)c1ccc(cc1)P(=O)(O)O")
+smiles("O=[N+]([O-])c1ccccc1SSc1c(cccc1)[N+](=O)[O-]")
+smiles("[O-][N+](=O)c1cc(c(C)c(c1)C(=O)C=Cc1ccccc1)[N+](=O)[O-]")
+smiles("[O-][N+](=O)c1ccc(CC(=O)C)cc1")
+smiles("O=N(=O)c1c(c(cc(S(=O)(=O)O)c1)[N+](=O)[O-])Cl")
+smiles("O=N(=O)c1ccc(o1)C=NO")
+smiles("O=N(=O)c1c(OC)cccc1C(=O)O")
+smiles("O=N(=O)N1C(=O)CCC1=O")
+smiles("OOC(C)(C)C")
+smiles("[O-]P(=O)([O-])OCC1OC(O)CC1O")
+smiles("O=S1(=O)C[C@H]([N+](C)(C)C)C=C1")
+smiles("O=S(=O)(c1cccc2C(=O)c3cccc(S(=O)(=O)O)c3C(=O)c12)O")
+smiles("O=S(=O)(c1ccccc1)NN")
+smiles("O=S(=O)(c1ccc(c(c1)SC#N)N)N")
+smiles("O=S(=O)(c1cc(c(N)c(c1)Cl)Br)O")
+smiles("O=S(=O)(C)N")
+smiles("O=S(=O)(O)c1ccc(cc1OC(=O)C)NC(=O)C")
+smiles("O=S(=O)(O)CCBr")
+smiles("OS(=O)(=O)CCC(C)C")
+smiles("OS(=O)(=O)CCS(=O)(=O)O")
+smiles("OS(=O)(=O)O")
+smiles("P(c1ccccc1)(c1ccccc1)c1ccccc1")
+smiles("P(=O)(O)(F)O")
+smiles("P(=S)(NCCCCCCCCCCCC)(NCCCCCCCCCCCC)NCCCCCCCCCCCC")
+smiles("P(=S)(NCCCCCCC)(NCCCCCCC)NCCCCCCC")
+smiles("s1c2cc(ccc2c2ccccc12)C(=O)C")
+smiles("S1c2c(cccc2)Sc2ccccc12")
+smiles("S1c2c(N(C)c3c1cccc3)cccc2")
+smiles("s1c(ccc1C=NNC(=S)N)N(=O)=O")
+smiles("s1c(C[C@H](N)C(=O)O)ccc1")
+smiles("S1[Zn]2([S+]=C(S2)N(C)C)[S+]=C1N(C)C")
+smiles("Sc1ccc(cc1)C")
+smiles("SCCC(=O)O")
+smiles("S=C(NC(=S)N=Cc1ccc(cc1)OC)N")
+smiles("S(C(=[NH2])N)C")
+smiles("S=C(NN=C1CCCCC1)N")
+smiles("S=C(NN=Cc1cc([N+](=O)[O-])ccc1O)N")
+smiles("S=C(NN=Cc1sccc1)NN")
+smiles("S=C(N)NN=C(C)C")
+smiles("S=C(NN)NN")
+smiles("S(=O)(=O)(O)N(S(=O)(=O)O)S(=O)(=O)O")
+smiles("S(Sc1ccc(cc1)N(C)C)c1ccc(cc1)N(C)C")
+smiles("S(Sc1sc2c(cccc2)n1)c1sc2ccccc2n1")
diff --git a/test/py/stereo/00_geometryAndEmbedding.py b/test/py/stereo/00_geometryAndEmbedding.py
new file mode 100644
index 0000000..40b5105
--- /dev/null
+++ b/test/py/stereo/00_geometryAndEmbedding.py
@@ -0,0 +1,25 @@
+include('common.py')
+printGeometryGraph()
+def gmlNode(i, edge="-"):
+	return 'node [ id %d label "Z" ] edge [ source 0 target %d label "%s" ]' % (i, i, edge)
+
+data = {}
+data['any'] = 'node [ id 0 label "Q" stereo "any[]" ]'
+data['any'] = 'node [ id 0 label "H" stereo "any[1]" ]' + gmlNode(1)
+data['any'] = 'node [ id 0 label "Q" stereo "any[1, 2]" ]' + gmlNode(1) + gmlNode(2)
+data['linear'] = 'node [ id 0 label "C" stereo "linear[1, 2]" ]' + gmlNode(1, "#") + gmlNode(2)
+data['linear'] = 'node [ id 0 label "C"  stereo "linear[1, 2]" ]' + gmlNode(1, "=") + gmlNode(2, "=")
+data['any'] = 'node [ id 0 label "Q" stereo "any[1, 2, 3]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3)
+data['trigonalPlanar'] = 'node [ id 0 label "C" stereo "trigonalPlanar[1, 2, 3]" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3)
+data['any'] = 'node [ id 0 label "Q" stereo "any[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4)
+data['tetrahedral'] = 'node [ id 0 label "C" stereo "tetrahedral[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4)
+
+postChapter("Graph")
+for n, d in data.items():
+	postSection(n)
+	gGML(d)
+for side in ["context", "left", "right"]:
+	postChapter("Rule " + side)
+	for n, d in data.items():
+		postSection(n + " " + side)
+		rGML(d, side)
diff --git a/test/py/stereo/01_geometry.py b/test/py/stereo/01_geometry.py
new file mode 100644
index 0000000..5f6c150
--- /dev/null
+++ b/test/py/stereo/01_geometry.py
@@ -0,0 +1,38 @@
+include('common.py')
+printGeometryGraph()
+def gmlNode(i, edge="-"):
+	return 'node [ id %d label "Z" ] edge [ source 0 target %d label "%s" ]' % (i, i, edge)
+
+data = []
+
+data.append(('any', 'node [ id 0 label "Q" stereo "any" ]'))
+data.append(('any', 'node [ id 0 label "H+" stereo "any" ]'))
+data.append(('any', 'node [ id 0 label "H" stereo "any" ]' + gmlNode(1)))
+data.append(('any', 'node [ id 0 label "Q" stereo "any" ]' + gmlNode(1) + gmlNode(2)))
+data.append(('linear', 'node [ id 0 label "C" stereo "linear" ]' + gmlNode(1, "#") + gmlNode(2)))
+data.append(('linear', 'node [ id 0 label "C" stereo "linear" ]' + gmlNode(1, "=") + gmlNode(2, "=")))
+data.append(('any', 'node [ id 0 label "Q" stereo "any" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3)))
+data.append(('trigonalPlanar', 'node [ id 0 label "C" stereo "trigonalPlanar" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3)))
+data.append(('trigonalPlanar', 'node [ id 0 label "C" stereo "trigonalPlanar" ]' + gmlNode(1, ":") + gmlNode(2, ":") + gmlNode(3, ":")))
+data.append(('trigonalPlanar', 'node [ id 0 label "N" stereo "trigonalPlanar" ]' + gmlNode(1, ":") + gmlNode(2, ":") + gmlNode(3)))
+data.append(('trigonalPlanar2', 'node [ id 0 label "N" stereo "trigonalPlanar" ]' + gmlNode(1, ":") + gmlNode(2, ":")))
+data.append(('any', 'node [ id 0 label "Q" stereo "any" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4)))
+data.append(('tetrahedral', 'node [ id 0 label "C" stereo "tetrahedral" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4)))
+data.append(('tetrahedral', 'node [ id 0 label "N" stereo "tetrahedral" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3)))
+data.append(('tetrahedral', 'node [ id 0 label "N+" stereo "tetrahedral" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4)))
+data.append(('tetrahedral', 'node [ id 0 label "P" stereo "tetrahedral" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3) + gmlNode(4)))
+data.append(('tetrahedral', 'node [ id 0 label "P" stereo "tetrahedral" ]' + gmlNode(1) + gmlNode(2, "=") + gmlNode(3) + gmlNode(4))) # for testing initialisation
+data.append(('tetrahedral', 'node [ id 0 label "P" stereo "tetrahedral" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3, "=") + gmlNode(4))) # for testing initialisation
+data.append(('tetrahedral', 'node [ id 0 label "P" stereo "tetrahedral" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4, "="))) # for testing initialisation
+
+postChapter("Graph")
+for n, d in data:
+	postSection(n)
+	gGML(d)
+for side in ["context", "left", "right"]:
+	postChapter("Rule " + side)
+	for n, d in data:
+		# TODO: this should work too
+		if n == "trigonalPlanar2": continue
+		postSection(n + " " + side)
+		rGML(d, side)
diff --git a/test/py/stereo/02_embedding.py b/test/py/stereo/02_embedding.py
new file mode 100644
index 0000000..f684f08
--- /dev/null
+++ b/test/py/stereo/02_embedding.py
@@ -0,0 +1,41 @@
+include('common.py')
+printGeometryGraph()
+def gmlNode(i, edge="-"):
+	return 'node [ id %d label "Z" ] edge [ source 0 target %d label "%s" ]' % (i, i, edge)
+
+data = []
+data.append(('any', 'node [ id 0 label "Q" stereo "[]" ]'))
+data.append(('any', 'node [ id 0 label "H+" stereo "[]" ]'))
+data.append(('any', 'node [ id 0 label "H" stereo "[1]" ]' + gmlNode(1)))
+data.append(('any', 'node [ id 0 label "Q" stereo "[1, 2]" ]' + gmlNode(1) + gmlNode(2)))
+data.append(('linear', 'node [ id 0 label "C" stereo "[1, 2]" ]' + gmlNode(1, "#") + gmlNode(2)))
+data.append(('linear', 'node [ id 0 label "C"  stereo "[1, 2]" ]' + gmlNode(1, "=") + gmlNode(2, "=")))
+data.append(('any', 'node [ id 0 label "Q" stereo "[1, 2, 3]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3)))
+data.append(('trigonalPlanar', 'node [ id 0 label "C" stereo "[1, 2, 3]" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3)))
+data.append(('trigonalPlanar', 'node [ id 0 label "C" stereo "[1, 2, 3]" ]' + gmlNode(1, ":") + gmlNode(2, ":") + gmlNode(3, ":")))
+data.append(('trigonalPlanar', 'node [ id 0 label "N" stereo "[1, 2, 3]" ]' + gmlNode(1, ":") + gmlNode(2, ":") + gmlNode(3)))
+data.append(('trigonalPlanar', 'node [ id 0 label "N" stereo "[1, 2, e]" ]' + gmlNode(1, ":") + gmlNode(2, ":")))
+data.append(('any', 'node [ id 0 label "Q" stereo "[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4)))
+data.append(('tetrahedral', 'node [ id 0 label "C" stereo "[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4)))
+data.append(('tetrahedral', 'node [ id 0 label "N" stereo "[1, 2, 3, e]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3)))
+data.append(('tetrahedral', 'node [ id 0 label "N+" stereo "[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4)))
+data.append(('tetrahedral', 'node [ id 0 label "P" stereo "[1, 2, 3, 4]" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3) + gmlNode(4)))
+data.append(('tetrahedral', 'node [ id 0 label "P" stereo "[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2, "=") + gmlNode(3) + gmlNode(4))) # for testing initialisation
+data.append(('tetrahedral', 'node [ id 0 label "P" stereo "[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3, "=") + gmlNode(4))) # for testing initialisation
+data.append(('tetrahedral', 'node [ id 0 label "P" stereo "[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4, "="))) # for testing initialisation
+data.append(('tetrahedral', 'node [ id 0 label "S" stereo "[1, 2, 3, 4]" ]' + gmlNode(1, "=") + gmlNode(2, "=") + gmlNode(3) + gmlNode(4)))
+data.append(('tetrahedral', 'node [ id 0 label "S" stereo "[1, 2, 3, 4]" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3, "=") + gmlNode(4))) # for testing initialisation
+data.append(('tetrahedral', 'node [ id 0 label "S" stereo "[1, 2, 3, 4]" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3) + gmlNode(4, "="))) # for testing initialisation
+data.append(('tetrahedral', 'node [ id 0 label "S" stereo "[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2, "=") + gmlNode(3, "=") + gmlNode(4))) # for testing initialisation
+data.append(('tetrahedral', 'node [ id 0 label "S" stereo "[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2, "=") + gmlNode(3) + gmlNode(4, "="))) # for testing initialisation
+data.append(('tetrahedral', 'node [ id 0 label "S" stereo "[1, 2, 3, 4]" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3, "=") + gmlNode(4, "="))) # for testing initialisation
+
+postChapter("Graph")
+for n, d in data:
+	postSection(n)
+	gGML(d)
+for side in ["context", "left", "right"]:
+	postChapter("Rule " + side)
+	for n, d in data:
+		postSection(n + " " + side)
+		rGML(d, side)
diff --git a/test/py/stereo/03_completeDeduce.py b/test/py/stereo/03_completeDeduce.py
new file mode 100644
index 0000000..e4b01c6
--- /dev/null
+++ b/test/py/stereo/03_completeDeduce.py
@@ -0,0 +1,31 @@
+include("common.py")
+printGeometryGraph()
+
+data = []
+data.append(('any', dfs("[Q]")))
+data.append(('any', dfs("[H+]")))
+data.append(('any', dfs("[H][Z]")))
+data.append(('any', dfs("[Z][Q][Z]")))
+data.append(('linearFree', dfs("[Z]#C[Z]")))
+data.append(('linear90', dfs("[Z]=C=[Z]")))
+data.append(('any', dfs("[Z][Q]([Z])[Z]")))
+data.append(('trigonalPlanar', dfs("[Z]=C([Z])[Z]")))
+data.append(('trigonalPlanar', dfs("[Z]:C(:[Z]):[Z]")))
+data.append(('trigonalPlanar', dfs("[Z]:N([Z]):[Z]")))
+data.append(('trigonalPlanar', dfs("[Z]:N:[Z]")))
+data.append(('any', dfs("[Z][Q]([Z])([Z])[Z]")))
+data.append(('tetrahedral', dfs("[Z]C([Z])([Z])[Z]")))
+data.append(('tetrahedral', dfs("[Z]N([Z])[Z]")))
+data.append(('tetrahedral', dfs("[Z][N+]([Z])([Z])[Z]")))
+data.append(('tetrahedral', dfs("[Z]=P([Z])([Z])[Z]")))
+data.append(('tetrahedral', dfs("[Z]P(=[Z])([Z])[Z]"))) # for testing initialisation
+data.append(('tetrahedral', dfs("[Z]P([Z])(=[Z])[Z]"))) # for testing initialisation
+data.append(('tetrahedral', dfs("[Z]P([Z])([Z])=[Z]"))) # for testing initialisation
+
+for side in ["context", "left", "right"]:
+	postChapter("Rule " + side)
+	for n, a in data:
+		postSection(n + " " + side)
+		gml = a.getGMLString()
+		gml = gml[7:-2]
+		rGML(gml, side)
diff --git a/test/py/stereo/04_graphFix.py b/test/py/stereo/04_graphFix.py
new file mode 100644
index 0000000..3950f1e
--- /dev/null
+++ b/test/py/stereo/04_graphFix.py
@@ -0,0 +1,35 @@
+include('common.py')
+printGeometryGraph()
+def gmlNode(i, edge="-"):
+	return 'node [ id %d label "Z" ] edge [ source 0 target %d label "%s" ]' % (i, i, edge)
+
+postSection('any')
+gGML('node [ id 0 label "Q" stereo "[]!" ]')
+gGML('node [ id 0 label "H+" stereo "[]!" ]')
+gGML('node [ id 0 label "H" stereo "[1]!" ]' + gmlNode(1))
+gGML('node [ id 0 label "Q" stereo "[1, 2]!" ]' + gmlNode(1) + gmlNode(2))
+
+postSection('linear')
+gGML('node [ id 0 label "C" stereo "[1, 2]!" ]' + gmlNode(1, "#") + gmlNode(2))
+gGML('node [ id 0 label "C" stereo "[1, 2]!" ]' + gmlNode(1, "=") + gmlNode(2, "="))
+
+postSection('any')
+gGML('node [ id 0 label "Q" stereo "[1, 2, 3]!" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3))
+
+postSection('trigonalPlanar')
+gGML('node [ id 0 label "C" stereo "[1, 2, 3]!" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3))
+gGML('node [ id 0 label "C" stereo "[1, 2, 3]!" ]' + gmlNode(1, ":") + gmlNode(2, ":") + gmlNode(3, ":"))
+gGML('node [ id 0 label "N" stereo "[1, 2, 3]!" ]' + gmlNode(1, ":") + gmlNode(2, ":") + gmlNode(3))
+gGML('node [ id 0 label "N" stereo "[1, 2, e]!" ]' + gmlNode(1, ":") + gmlNode(2, ":"))
+
+postSection('any')
+gGML('node [ id 0 label "Q" stereo "[1, 2, 3, 4]!" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4))
+
+postSection('tetrahedral')
+gGML('node [ id 0 label "C" stereo "[1, 2, 3, 4]!" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4))
+gGML('node [ id 0 label "N" stereo "[1, 2, 3, e]!" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3))
+gGML('node [ id 0 label "N+" stereo "[1, 2, 3, 4]!" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4))
+gGML('node [ id 0 label "P" stereo "[1, 2, 3, 4]!" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3) + gmlNode(4))
+gGML('node [ id 0 label "P" stereo "[1, 2, 3, 4]!" ]' + gmlNode(1) + gmlNode(2, "=") + gmlNode(3) + gmlNode(4)) # for testing initialisation
+gGML('node [ id 0 label "P" stereo "[1, 2, 3, 4]!" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3, "=") + gmlNode(4)) # for testing initialisation
+gGML('node [ id 0 label "P" stereo "[1, 2, 3, 4]!" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4, "=")) # for testing initialisation
diff --git a/test/py/stereo/10_errors.py b/test/py/stereo/10_errors.py
new file mode 100644
index 0000000..4bbffad
--- /dev/null
+++ b/test/py/stereo/10_errors.py
@@ -0,0 +1,28 @@
+include("common.py")
+printGeometryGraph()
+
+def gmlNode(i, edge="-"):
+	return 'node [ id %d label "Z" ] edge [ source 0 target %d label "%s" ]' % (i, i, edge)
+
+def check(f):
+	try:
+		a = f()
+	except mod.InputError as e:
+		print("Exception, as expected:")
+		print(e)
+		print()
+	else:
+		assert False
+
+print('linear')
+check(lambda: gGML('node [ id 0 label "C" stereo "linear" ]' + gmlNode(1)))
+check(lambda: gGML('node [ id 0 label "C" stereo "linear" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3)))
+
+print('trigonalPlanar')
+check(lambda: gGML('node [ id 0 label "C" stereo "trigonalPlanar" ]' + gmlNode(1, "=") + gmlNode(2)))
+check(lambda: gGML('node [ id 0 label "C" stereo "trigonalPlanar" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3) + gmlNode(4)))
+
+print('tetrahedral')
+check(lambda: gGML('node [ id 0 label "C" stereo "tetrahedral" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3)))
+check(lambda: gGML('node [ id 0 label "C" stereo "tetrahedral" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4) + gmlNode(5)))
+
diff --git a/test/py/stereo/20_morphismGraph.py b/test/py/stereo/20_morphismGraph.py
new file mode 100644
index 0000000..ff09729
--- /dev/null
+++ b/test/py/stereo/20_morphismGraph.py
@@ -0,0 +1,136 @@
+# TODO: check different number of lonePair and radial.
+#       Too many morphisms are accepted now.
+include("common.py")
+printGeometryGraph()
+
+def gmlNode(i, edge="-", stereo=""):
+	return 'node [ id %d label "Z" ] edge [ source 0 target %d label "%s" %s ]' % (i, i, edge, stereo)
+def gmlNodeIdx(i, edge="-", stereo=""):
+	return 'node [ id %d label "Z%d" ] edge [ source 0 target %d label "%s" %s ]' % (i, i, i, edge, stereo)
+
+def makeAny(n):
+	gml = 'node [ id 0 label "Q" stereo "any" ]'
+	for i in range(1, n + 1):
+		gml += gmlNode(i, edge="*", stereo='stereo "*"' )
+	return gGML(gml)
+
+maxDeg = 4
+def makeGraphDict():
+	graphs = {}
+	for i in range(maxDeg + 1):
+		graphs["any%d" % i] = makeAny(i)
+
+	graphs["linear"] = gGML('node [ id 0 label "Q" stereo "linear" ]' + gmlNode(1) + gmlNode(2))
+	graphs["trigonalPlanar"] = gGML('node [ id 0 label "Q" stereo "trigonalPlanar" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3))
+	#graphs["trigonalPlanarFixed"] = gGML('node [ id 0 label "Q" stereo "trigonalPlanar[1, 2, 3]!" ]' + gmlNode(1, "=") + gmlNode(2) + gmlNode(3))
+	# TODO: enable trigonal planer with fixed configuration
+	graphs["tetrahedral"] = gGML('node [ id 0 label "Q" stereo "tetrahedral" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4))
+	graphs["tetrahedralFixed"] = gGML('node [ id 0 label "Q" stereo "tetrahedral[1, 2, 3, 4]!" ]' + gmlNode(1) + gmlNode(2) + gmlNode(3) + gmlNode(4))
+	return graphs
+
+print("Isomorphism")
+graphs1 = makeGraphDict()
+graphs2 = makeGraphDict()
+for n1, g1 in sorted(graphs1.items()):
+	for n2, g2 in sorted(graphs2.items()):
+		def check(res):
+			if not res:
+				postChapter("Error: %s, %s" % (n1, n2))
+				postSection("Stereo, %s" % n1)
+				printStereo(g1)
+				postSection("Stereo, %s" % n2)
+				printStereo(g2)
+				assert False
+		if n1 == n2:
+			res = g1.isomorphism(g2, labelSettings=isoLabelSettings) > 0
+			check(res)
+			res = g2.isomorphism(g1, labelSettings=isoLabelSettings) > 0
+			check(res)
+		else:
+			res = g1.isomorphism(g2, labelSettings=isoLabelSettings) == 0
+			check(res)
+			res = g2.isomorphism(g1, labelSettings=isoLabelSettings) == 0
+			check(res)
+
+print("Specialisation")
+ok = []
+for i in range(maxDeg + 1):
+	for j in range(i, maxDeg + 1):
+		ok.append(("any%d" % i, "any%d" % j))
+for l in ["linear"]:
+	for i in range(3):
+		ok.append(("any%d" % i, l))
+for l in ["trigonalPlanar"]: # trigonalPlanarFixed
+	for i in range(4):
+		ok.append(("any%d" % i, l))
+for l in ["tetrahedral", "tetrahedralFixed"]:
+	for i in range(5):
+		ok.append(("any%d" % i, l))
+ok.append(("tetrahedral", "tetrahedralFixed"))
+graphs1 = makeGraphDict()
+graphs2 = makeGraphDict()
+for n1, g1 in sorted(graphs1.items()):
+	for n2, g2 in sorted(graphs2.items()):
+		if n1 == n2:
+			def check(res):
+				if not res:
+					postChapter("Error")
+					printStereo(g1)
+					printStereo(g2)
+					assert False
+			res = g1.isomorphism(g2, labelSettings=specLabelSettings) > 0
+			check(res)
+			res = g2.isomorphism(g1, labelSettings=specLabelSettings) > 0
+			check(res)
+		else:
+			def check(res, n1, n2):
+				isOk = (n1, n2) in ok
+				if isOk != res:
+					postChapter("Error: %d" % res)
+					print(n1, "vs.", n2)
+					print("isOk:", isOk)
+					print("res:", res)
+					g1.print()
+					printStereo(g1)
+					g2.print()
+					printStereo(g2)
+					assert False
+			res = g1.monomorphism(g2, labelSettings=specLabelSettings) > 0
+			check(res, n1, n2)
+			res = g2.monomorphism(g1, labelSettings=specLabelSettings) > 0
+			check(res, n2, n1)
+
+
+print("Tetrahedral")
+graphs1 = {}
+graphs2 = {}
+tf1 = graphs1["t_f"] = gGML('node [ id 0 label "Q" stereo "tetrahedral" ]' + gmlNodeIdx(1) + gmlNodeIdx(2) + gmlNodeIdx(3) + gmlNodeIdx(4))
+tf2 = graphs2["t_f"] = gGML('node [ id 0 label "Q" stereo "tetrahedral" ]' + gmlNodeIdx(1) + gmlNodeIdx(2) + gmlNodeIdx(3) + gmlNodeIdx(4))
+ta1 = graphs1["t_a"] = gGML('node [ id 0 label "Q" stereo "tetrahedral[1, 2, 3, 4]!" ]' + gmlNodeIdx(1) + gmlNodeIdx(2) + gmlNodeIdx(3) + gmlNodeIdx(4))
+ta2 = graphs2["t_a"] = gGML('node [ id 0 label "Q" stereo "tetrahedral[1, 2, 3, 4]!" ]' + gmlNodeIdx(1) + gmlNodeIdx(2) + gmlNodeIdx(3) + gmlNodeIdx(4))
+tb1 = graphs1["t_b"] = gGML('node [ id 0 label "Q" stereo "tetrahedral[1, 2, 4, 3]!" ]' + gmlNodeIdx(1) + gmlNodeIdx(2) + gmlNodeIdx(3) + gmlNodeIdx(4))
+tb2 = graphs2["t_b"] = gGML('node [ id 0 label "Q" stereo "tetrahedral[1, 2, 4, 3]!" ]' + gmlNodeIdx(1) + gmlNodeIdx(2) + gmlNodeIdx(3) + gmlNodeIdx(4))
+
+print("\tIsomorphism")
+postChapter("Tetrahedral Isomorphism")
+assert tf1.isomorphism(tf2, labelSettings=isoLabelSettings) > 0
+assert tf1.isomorphism(ta2, labelSettings=isoLabelSettings) == 0
+assert tf1.isomorphism(tb2, labelSettings=isoLabelSettings) == 0
+assert ta1.isomorphism(tf2, labelSettings=isoLabelSettings) == 0
+assert ta1.isomorphism(ta2, labelSettings=isoLabelSettings) > 0
+assert ta1.isomorphism(tb2, labelSettings=isoLabelSettings) == 0
+assert tb1.isomorphism(tf2, labelSettings=isoLabelSettings) == 0
+assert tb1.isomorphism(ta2, labelSettings=isoLabelSettings) == 0
+assert tb1.isomorphism(tb2, labelSettings=isoLabelSettings) > 0
+
+print("\tSpecialisation")
+postChapter("Tetrahedral Specialisation")
+assert tf1.isomorphism(tf2, labelSettings=specLabelSettings) > 0
+assert tf1.isomorphism(ta2, labelSettings=specLabelSettings) > 0
+assert tf1.isomorphism(tb2, labelSettings=specLabelSettings) > 0
+assert ta1.isomorphism(tf2, labelSettings=specLabelSettings) == 0
+assert ta1.isomorphism(ta2, labelSettings=specLabelSettings) > 0
+assert ta1.isomorphism(tb2, labelSettings=specLabelSettings) == 0
+assert tb1.isomorphism(tf2, labelSettings=specLabelSettings) == 0
+assert tb1.isomorphism(ta2, labelSettings=specLabelSettings) == 0
+assert tb1.isomorphism(tb2, labelSettings=specLabelSettings) > 0
diff --git a/test/py/stereo/30_morphismRule.py b/test/py/stereo/30_morphismRule.py
new file mode 100644
index 0000000..1bc46ec
--- /dev/null
+++ b/test/py/stereo/30_morphismRule.py
@@ -0,0 +1,21 @@
+include("common.py")
+
+lr = ruleGMLString("""rule [
+	left [
+		node [ id 0 stereo "any" ]
+	]
+	context [
+		node [ id 0 label "Z" ]
+	]
+	right [
+		node [ id 0 stereo "any" ]
+	]
+]""")
+c = ruleGMLString("""rule [
+	context [
+		node [ id 0 label "Z" stereo "any" ]
+	]
+]""")
+for a in inputRules: a.print()
+assert not c.isomorphism(lr, labelSettings=isoLabelSettings)
+assert lr.isomorphism(c, labelSettings=specLabelSettings)
diff --git a/test/py/stereo/common.py b/test/py/stereo/common.py
new file mode 100644
index 0000000..32a394c
--- /dev/null
+++ b/test/py/stereo/common.py
@@ -0,0 +1,30 @@
+# 'Z' is non-chemical, and is not printed
+def printStereo(a):
+	for v in a.vertices:
+		if v.stringLabel == "Q" or v.atomId != AtomIds.Invalid:
+			v.printStereo()
+	
+def dfs(s):
+	a = mod.graphDFS(s)
+	printStereo(a)
+	return a
+def gGML(s):
+	a = mod.graphGMLString("graph [ " + s + " ]")
+	printStereo(a)
+	return a
+def rGML(s, side):
+	a = mod.ruleGMLString("rule [ %s [ %s ] ]" % (side, s))
+	printStereo(a.left)
+	printStereo(a.right)
+	return a
+
+isoLabelSettings = LabelSettings(
+	LabelType.String,
+	LabelRelation.Isomorphism,
+	LabelRelation.Isomorphism
+)
+specLabelSettings = LabelSettings(
+	LabelType.Term,
+	LabelRelation.Specialisation,
+	LabelRelation.Specialisation
+)
diff --git a/test/py/stereo/graphDepiction.py b/test/py/stereo/graphDepiction.py
new file mode 100644
index 0000000..3cc851d
--- /dev/null
+++ b/test/py/stereo/graphDepiction.py
@@ -0,0 +1,124 @@
+def doPrint(a):
+	pg = GraphPrinter()
+	pm = GraphPrinter()
+	pm.setMolDefault()
+	a.print(pg, pm)
+	pg.withRawStereo = True
+	pm.withRawStereo = True
+	pg.withIndex = True
+	pm.withIndex = True
+	a.print(pg, pm)
+	
+
+postSection("All")
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 3, 4]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	node [ id 4 label "P" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 4, 3]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	node [ id 4 label "P" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
+
+postSection("Lone Pair")
+a = graphGMLString("""graph [
+	node [ id 0 label "N" stereo "[1, 2, 3, e]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+]""")
+doPrint(a)
+a = graphGMLString("""graph [
+	node [ id 0 label "N" stereo "[1, 2, e, 3]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+]""")
+doPrint(a)
+
+a = graphGMLString("""graph [
+	node [ id 0 label "N" stereo "[e, 1, 2, 3]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+]""")
+doPrint(a)
+
+postSection("H")
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 3, 4]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	node [ id 4 label "H" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 4, 3]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	node [ id 4 label "H" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
+
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 3, 4]!" ]
+	node [ id 1 label "H" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	node [ id 4 label "O" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
+
+
+postSection("All H")
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 3, 4]!" ]
+	node [ id 1 label "H" ]
+	node [ id 2 label "H" ]
+	node [ id 3 label "H" ]
+	node [ id 4 label "H" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
diff --git a/test/py/stereo/ruleDepiction.py b/test/py/stereo/ruleDepiction.py
new file mode 100644
index 0000000..c22d608
--- /dev/null
+++ b/test/py/stereo/ruleDepiction.py
@@ -0,0 +1,168 @@
+def doPrint(a):
+	pg = GraphPrinter()
+	pm = GraphPrinter()
+	pm.setMolDefault()
+	a.print(pg, pm)
+	pg.withRawStereo = True
+	pm.withRawStereo = True
+	pg.withIndex = True
+	pm.withIndex = True
+	a.print(pg, pm)
+	
+
+postSection("Context")
+a = ruleGMLString("""rule [
+	context [
+		node [ id 0 label "C" stereo "[1, 2, 3, 4]!" ]
+		node [ id 1 label "O" ]
+		node [ id 2 label "N" ]
+		node [ id 3 label "S" ]
+		node [ id 4 label "P" ]
+		edge [ source 0 target 1 label "-" ]
+		edge [ source 0 target 2 label "-" ]
+		edge [ source 0 target 3 label "-" ]
+		edge [ source 0 target 4 label "-" ]
+	]	
+]""")
+doPrint(a)
+postSection("Left and right")
+a = ruleGMLString("""rule [
+	left [
+		node [ id 0 stereo "[1, 2, 3, 4]!" ]
+	]
+	context [
+		node [ id 0 label "C" ]
+		node [ id 1 label "O" ]
+		node [ id 2 label "N" ]
+		node [ id 3 label "S" ]
+		node [ id 4 label "P" ]
+		edge [ source 0 target 1 label "-" ]
+		edge [ source 0 target 2 label "-" ]
+		edge [ source 0 target 3 label "-" ]
+		edge [ source 0 target 4 label "-" ]
+	]
+	right [
+		node [ id 0 stereo "[1, 2, 3, 4]!" ]
+	]
+]""")
+doPrint(a)
+a = ruleGMLString("""rule [
+	left [
+		node [ id 0 stereo "[1, 2, 3, 4]!" ]
+	]
+	context [
+		node [ id 0 label "C" ]
+		node [ id 1 label "O" ]
+		node [ id 2 label "N" ]
+		node [ id 3 label "S" ]
+		node [ id 4 label "P" ]
+		edge [ source 0 target 1 label "-" ]
+		edge [ source 0 target 2 label "-" ]
+		edge [ source 0 target 3 label "-" ]
+		edge [ source 0 target 4 label "-" ]
+	]
+	right [
+		node [ id 0 stereo "[1, 2, 4, 3]!" ]
+	]
+]""")
+doPrint(a)
+sys.exit(0)
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 4, 3]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	node [ id 4 label "P" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
+
+postSection("Lone Pair")
+a = graphGMLString("""graph [
+	node [ id 0 label "N" stereo "[1, 2, 3, e]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+]""")
+doPrint(a)
+a = graphGMLString("""graph [
+	node [ id 0 label "N" stereo "[1, 2, e, 3]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+]""")
+doPrint(a)
+
+a = graphGMLString("""graph [
+	node [ id 0 label "N" stereo "[e, 1, 2, 3]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+]""")
+doPrint(a)
+
+postSection("H")
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 3, 4]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	node [ id 4 label "H" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 4, 3]!" ]
+	node [ id 1 label "O" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	node [ id 4 label "H" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
+
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 3, 4]!" ]
+	node [ id 1 label "H" ]
+	node [ id 2 label "N" ]
+	node [ id 3 label "S" ]
+	node [ id 4 label "O" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
+
+
+postSection("All H")
+a = graphGMLString("""graph [
+	node [ id 0 label "C" stereo "[1, 2, 3, 4]!" ]
+	node [ id 1 label "H" ]
+	node [ id 2 label "H" ]
+	node [ id 3 label "H" ]
+	node [ id 4 label "H" ]
+	edge [ source 0 target 1 label "-" ]
+	edge [ source 0 target 2 label "-" ]
+	edge [ source 0 target 3 label "-" ]
+	edge [ source 0 target 4 label "-" ]
+]""")
+doPrint(a)
diff --git a/test/py/stereo/ruleGML.py b/test/py/stereo/ruleGML.py
new file mode 100644
index 0000000..b636000
--- /dev/null
+++ b/test/py/stereo/ruleGML.py
@@ -0,0 +1,124 @@
+sys.exit(0)
+def doIt(a):
+	a.print()
+	a.printStereo()
+
+doIt(ruleGMLString("""rule [
+	ruleID "EC 5.1.3.1"
+	left [
+		node [ id 50 label "H" ]
+		node [ id 51 label "H+" ]
+		edge [ source 2 target 50 label "-" ]
+	]
+	context [
+		node [ id 0 label "C" ]
+		node [ id 1 label "C" ] node [ id 4 label "O" ]
+		node [ id 2 label "C" ] node [ id 5 label "O" ] node [ id 6 label "H" ]
+		node [ id 3 label "C" ]
+		edge [ source 0 target 1 label "-" ]
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 1 target 4 label "=" ]
+		edge [ source 2 target 5 label "-" ]
+		edge [ source 5 target 6 label "-" ]
+	]
+	right [
+		node [ id 50 label "H+" ]
+		node [ id 51 label "H" ]
+		edge [ source 2 target 51 label "-" ]
+	]
+]"""))
+doIt(ruleGMLString("""rule [
+	ruleID "EC 5.1.3.1"
+	left [
+		node [ id 50 label "H" ]
+		node [ id 51 label "H+" ]
+		edge [ source 2 target 50 label "-" ]
+	]
+	context [
+		node [ id 0 label "C" ]
+		node [ id 1 label "C" ] node [ id 4 label "O" ]
+		node [ id 2 label "C" stereo [ geometry "TetrahedralFree" ] ]
+			node [ id 5 label "O" ] node [ id 6 label "H" ]
+		node [ id 3 label "C" ]
+		edge [ source 0 target 1 label "-" ]
+		edge [ source 1 target 2 label "-" ]
+		edge [ source 2 target 3 label "-" ]
+		edge [ source 1 target 4 label "=" ]
+		edge [ source 2 target 5 label "-" ]
+		edge [ source 5 target 6 label "-" ]
+	]
+	right [
+		node [ id 50 label "H+" ]
+		node [ id 51 label "H" ]
+		edge [ source 2 target 51 label "-" ]
+	]
+]"""))
+
+
+sys.exit(0)
+
+
+
+ruleGMLString("""rule [
+ruleID "Diels-alder"
+left [
+	node [ id 1 label "C" stereo [ order "2, -_b, -_a" ] ]
+	node [ id 4 label "C" stereo [ order "3, -_d, -_c" ] ]
+	edge [ source 1 target 2 label "=" ]
+	edge [ source 2 target 3 label "-" ]
+	edge [ source 3 target 4 label "=" ]
+
+	node [ id 5 label "C" stereo [ order "6, -_f, -_e" ] ]
+	node [ id 6 label "C" stereo [ order "5, -_g, -_h" ] ]
+	edge [ source 5 target 6 label "=" ]
+]
+context [
+	node [ id 2 label "C" stereo [ order "1, -, 3" ]  ]
+	node [ id 3 label "C" stereo [ order "4, 2, -" ]  ]
+]
+right [
+	node [ id 1 label "C" stereo [ order "2, 5, -_a, -_b" ] ]
+	node [ id 4 label "C" stereo [ order "3, 6, -_c, -_d" ] ]
+	node [ id 5 label "C" stereo [ order "6, 1, -_e, -_f" ] ]
+	node [ id 6 label "C" stereo [ order "5, 4, -_h, -_g" ] ]
+	edge [ source 1 target 2 label "-" ]
+	edge [ source 2 target 3 label "=" ]
+	edge [ source 3 target 4 label "-" ]
+	edge [ source 4 target 5 label "-" ]
+	edge [ source 5 target 6 label "-" ]
+	edge [ source 6 target 1 label "-" ]
+]
+]""")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/py/stereo/smiles.py b/test/py/stereo/smiles.py
new file mode 100644
index 0000000..4cca5c6
--- /dev/null
+++ b/test/py/stereo/smiles.py
@@ -0,0 +1,37 @@
+postSection("prev, branch, branch, tail")
+smiles("O[C@](N)(P)S").print()
+smiles("O[C@@](N)(P)S").print()
+postSection("prev, branch, branch, branch")
+smiles("O[C@](N)(P)(S)").print()
+smiles("O[C@@](N)(P)(S)").print()
+postSection("branch, branch, branch, tail")
+smiles("[C@](O)(N)(P)S").print()
+smiles("[C@@](O)(N)(P)S").print()
+
+postSection("prev, H, branch, tail")
+smiles("O[C@H](P)S").print()
+smiles("O[C@@H](P)S").print()
+postSection("prev, H, branch, branch")
+smiles("O[C@H](P)(S)").print()
+smiles("O[C@@H](P)(S)").print()
+postSection("branch, H, branch, tail")
+smiles("[C@H](N)(P)S").print()
+smiles("[C@@H](N)(P)S").print()
+
+postSection("ring closure")
+inputGraphs[:] = []
+smiles("C1O[C@](N)(P)S1", name="1").print()
+smiles("O1[C@](N)(P)SC1", name="2").print()
+smiles("[C@]1(N)(P)SCO1", name="3").print()
+smiles("N[C@]1(SCO1)(P)", name="4").print()
+smiles("O1CS[C@]1(P)(N)", name="5").print()
+for a in inputGraphs:
+	for b in inputGraphs:
+		res = a.isomorphism(b, labelSettings=LabelSettings(LabelType.String, LabelRelation.Isomorphism, LabelRelation.Isomorphism))
+		if not res:
+			print(a.name, "not isomorphic to", b.name)
+			assert False
+
+postSection("from OpenSMILES")
+smiles("FC1C[C@](Br)(Cl)CCC1").print()
+smiles("[C@]1(Br)(Cl)CCCC(F)C1").print()
diff --git a/test/py/stereo/smilesAll.py b/test/py/stereo/smilesAll.py
new file mode 100644
index 0000000..de8f97d
--- /dev/null
+++ b/test/py/stereo/smilesAll.py
@@ -0,0 +1,15 @@
+include("../smiles/smiles_cansmi_roundtrip.py")
+include("../smiles/smiles_nci.py")
+sys.exit(0)
+for a in inputGraphs:
+	postSection(a.name)
+	for v in a.vertices:
+		try:
+			v.printStereo()
+		except StereoDeductionError:
+			print(a.smiles)
+			raise
+		except FatalError:
+			print(a.smiles)
+			a.print()
+			raise
diff --git a/test/py/stereo/testTetraRule.py b/test/py/stereo/testTetraRule.py
new file mode 100644
index 0000000..eed9796
--- /dev/null
+++ b/test/py/stereo/testTetraRule.py
@@ -0,0 +1,46 @@
+r = ruleGMLString("""rule [
+    left [
+        node [ id 10 label "H" ]
+    ]
+    context [
+        node [ id 0 label "C" ]
+        edge [ source 0 target 10 label "-" ]
+    ]
+    right [
+        node [ id 10 label "C" stereo "[0, 11, 12, 13]!" ]
+        node [ id 11 label "H" ]
+        node [ id 12 label "H" ]
+        node [ id 13 label "H" ]
+        edge [ source 10 target 11 label "-" ]
+        edge [ source 10 target 12 label "-" ]
+        edge [ source 10 target 13 label "-" ]
+    ]
+]""")
+g = smiles("[O][C@]([C@H3])([C@H2][C@H3])([C@H2][C@H3])")
+
+postChapter("DG")
+ls = LabelSettings(LabelType.String, LabelRelation.Isomorphism, LabelRelation.Specialisation)
+dg = dgRuleComp(inputGraphs, addSubset(g) >> r, labelSettings=ls)
+#config.rc.verbose = True
+config.dg.calculateVerbose = True
+config.dg.calculateDetailsVerbose = True
+dg.calc()
+dg.print()
+for a in dg.graphDatabase:
+	a.print()
+
+postChapter("RC")
+rc = rcEvaluator([r], labelSettings=ls)
+res = rc.eval(rcBind(g) *rcSuper* r)
+print("Res:", len(res))
+for a in res: a.print()
+
+postChapter("Iso")
+g1 = smiles("[O][C@]([C@H3])([C@H2][C@H3])([C@H2][C@H]([C@H3])([C@H3]))")
+g2 = smiles("[O][C@@]([C@H3])([C@H2][C@H3])([C@H2][C@H]([C@H3])([C@H3]))")
+p = GraphPrinter()
+p.withPrettyStereo = True
+g1.print(p)
+g2.print(p)
+ls = LabelSettings(LabelType.String, LabelRelation.Isomorphism, LabelRelation.Isomorphism)
+assert not g1.isomorphism(g2, labelSettings=ls)
diff --git a/test/py/term/counter.py b/test/py/term/counter.py
new file mode 100644
index 0000000..0c9a9b7
--- /dev/null
+++ b/test/py/term/counter.py
@@ -0,0 +1,34 @@
+config.io.useOpenBabelCoords = False
+a = graphDFS("[f(0)][sd(0)]")
+incFirst = ruleGMLString("""rule [
+	ruleID "Inc first"
+	left [
+		node [ id 0 label "f(_X)" ]
+	]
+	right [
+		node [ id 0 label "f(s(_X))" ]
+	]
+]""")
+incSecond = ruleGMLString("""rule [
+	ruleID "Inc second"
+	left [
+		node [ id 0 label "sd(_X)" ]
+	]
+	context [
+		node [ id 1 label "f(s(0))" ]
+		edge [ source 0 target 1 label "-" ]
+	]
+	right [
+		node [ id 0 label "sd(s(_X))" ]
+	]
+]""")
+incSecond.printTermState()
+
+dg = dgRuleComp(inputGraphs,
+	addSubset(a)
+	>> repeat[1]([incSecond, incFirst])
+	>> incSecond,
+	labelSettings=LabelSettings(LabelType.Term, LabelRelation.Unification)
+)
+dg.calc()
+dg.print()
diff --git a/test/py/term/makeVars.py b/test/py/term/makeVars.py
new file mode 100644
index 0000000..a9879e5
--- /dev/null
+++ b/test/py/term/makeVars.py
@@ -0,0 +1,46 @@
+a = graphDFS("[a]")
+aa = graphDFS("[_A][_A]")
+aaWild = graphDFS("[*]{*}[f(*)]")
+
+p = ruleGMLString("""rule [
+	ruleID "A"
+	left [
+		node [ id 0 label "a" ]
+	]
+	right [
+		node [ id 0 label "_X" ]
+		node [ id 1 label "_X" ]
+		edge [ source 0 target 1 label "-" ]
+	]
+]""")
+pWild = ruleGMLString("""rule [
+	ruleID "AWild"
+	left [
+		node [ id 0 label "a" ]
+	]
+	right [
+		node [ id 0 label "*" ]
+		node [ id 1 label "f(*)" ]
+		edge [ source 0 target 1 label "*" ]
+	]
+]""")
+	
+
+dg = dgRuleComp(inputGraphs, addSubset(inputGraphs) >> inputRules, labelSettings=LabelSettings(LabelType.Term, LabelRelation.Unification))
+dg.calc()
+dg.print()
+postSection("Input Graphs")
+for a in inputGraphs:
+	a.print()
+	a.printTermState()
+postSection("Input Rules")
+for a in inputRules:
+	a.print()
+	a.printTermState()
+postSection("Vertex Graphs")
+for a in set((v.graph for v in dg.vertices)) - set(inputGraphs):
+	a.print()
+	a.printTermState()
+postSection("Derivations")
+for e in dg.edges:
+	e.print()
diff --git a/test/py/term/parsing.py b/test/py/term/parsing.py
new file mode 100644
index 0000000..eb45ef6
--- /dev/null
+++ b/test/py/term/parsing.py
@@ -0,0 +1,33 @@
+ls = LabelSettings(LabelType.Term, LabelRelation.Unification)
+def fail(f):
+	try:
+		f()
+		assert False
+	except TermParsingError as e:
+		print(e)
+
+g = graphDFS("[C/][C]")
+r = ruleGMLString("""rule [
+	context [
+		node [ id 0 label "C/" ]
+	]
+]""")
+
+for a in inputGraphs:
+	fail(lambda: a.printTermState())
+for a in inputRules:
+	fail(lambda: a.printTermState())
+
+fail(lambda: dgRuleComp(inputGraphs, addSubset(lambda: []), ls))
+fail(lambda: dgRuleComp([], addSubset(inputGraphs), ls))
+dg = dgRuleComp([], addSubset(lambda: inputGraphs), ls)
+fail(lambda: dg.calc())
+dg = dgRuleComp([], inputRules, ls)
+fail(lambda: dg.calc())
+fail(lambda: g.isomorphism(g, 1, ls))
+fail(lambda: g.monomorphism(g, 1, ls))
+fail(lambda: r.isomorphism(r, 1, ls))
+fail(lambda: r.monomorphism(r, 1, ls))
+fail(lambda: rcEvaluator(inputRules, ls))
+rc = rcEvaluator([], ls)
+fail(lambda: rc.eval(inputRules *rcSuper* inputRules))
diff --git a/test/py/term/relations.py b/test/py/term/relations.py
new file mode 100644
index 0000000..d936130
--- /dev/null
+++ b/test/py/term/relations.py
@@ -0,0 +1,84 @@
+postChapter("DG")
+print("DG")
+print("="*80)
+config.io.useOpenBabelCoords = False
+a = graphDFS("[f(a)][f(b)]")
+b = ruleGMLString("""rule [
+	ruleID "b"
+	context [
+		node [ id 0 label "f(_X)" ]
+		node [ id 1 label "f(_X)" ]
+		edge [ source 0 target 1 label "-" ]
+	]
+]""")
+b.printTermState()
+
+dg = dgRuleComp(inputGraphs,
+	addSubset(a) >> b,
+	labelSettings=LabelSettings(LabelType.Term, LabelRelation.Unification)
+)
+dg.calc()
+dg.print()
+
+def doRelations(xy1, xy2, xx):
+	all = [xy1, xy2, xx]
+	for a in all:
+		a.printTermState()
+		for b in all:
+			if a != b:
+				assert a.isomorphism(b) == 0
+			else:
+				assert a.isomorphism(b) > 0
+
+	for lr in LabelRelation.values.values():
+		if not(xy1.isomorphism(xy2, labelSettings=LabelSettings(LabelType.Term, lr)) > 0):
+			print(lr)
+			assert False
+		if not(xy2.isomorphism(xy1, labelSettings=LabelSettings(LabelType.Term, lr)) > 0):
+			print(lr)
+			assert False
+
+	assert xy1.isomorphism(xx, labelSettings=LabelSettings(LabelType.Term, LabelRelation.Isomorphism)) == 0
+	assert xx.isomorphism(xy1, labelSettings=LabelSettings(LabelType.Term, LabelRelation.Isomorphism)) == 0
+
+	assert xy1.isomorphism(xx, labelSettings=LabelSettings(LabelType.Term, LabelRelation.Unification)) > 0
+	assert xx.isomorphism(xy1, labelSettings=LabelSettings(LabelType.Term, LabelRelation.Unification)) > 0
+
+postChapter("Graph")
+print("Graph")
+print("="*80)
+xy1 = graphDFS("[f(_X, _Y)][a]")
+xy2 = graphDFS("[a][f(_A, _B)]")
+xx = graphDFS("[a][f(_X, _X)]")
+doRelations(xy1, xy2, xx)
+
+postChapter("Rule")
+print("Rule")
+print("="*80)
+xy1 = rcEvaluator([]).eval(rcId(xy1))[0]
+xy2 = rcEvaluator([]).eval(rcId(xy2))[0]
+xx = rcEvaluator([]).eval(rcId(xx))[0]
+doRelations(xy1, xy2, xx)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/py/term/unification/atomDelete.py b/test/py/term/unification/atomDelete.py
new file mode 100644
index 0000000..c314d8d
--- /dev/null
+++ b/test/py/term/unification/atomDelete.py
@@ -0,0 +1,2 @@
+mgu("a", "a")
+mgu("a", "b")
diff --git a/test/py/term/unification/decomposition.py b/test/py/term/unification/decomposition.py
new file mode 100644
index 0000000..900114b
--- /dev/null
+++ b/test/py/term/unification/decomposition.py
@@ -0,0 +1,4 @@
+mgu("f(a)", "f(a)")
+mgu("f(a, b)", "f(a, b)")
+mgu("f(a)", "g(a)")
+mgu("f(a, b)", "f(a)")
diff --git a/test/py/term/unification/eliminate.py b/test/py/term/unification/eliminate.py
new file mode 100644
index 0000000..b4453ae
--- /dev/null
+++ b/test/py/term/unification/eliminate.py
@@ -0,0 +1,4 @@
+mgu("f(_X, a)", "f(_X, _X)")
+mgu("f(_X, _Y, _Y)", "f(_X, _X, a)")
+mgu("f(_X, g(_X))", "f(_Y, _Y)")
+mgu("_x", "f(g(h(a, _b, c), i(d, _e)), j(k(_l, m), n))")
diff --git a/test/py/term/unification/swapEliminate.py b/test/py/term/unification/swapEliminate.py
new file mode 100644
index 0000000..00d86d7
--- /dev/null
+++ b/test/py/term/unification/swapEliminate.py
@@ -0,0 +1,3 @@
+mgu("a", "_x")
+mgu("_x", "_y")
+mgu("_x", "_x")
diff --git a/test/py/util/boltzmann.py b/test/py/util/boltzmann.py
new file mode 100644
index 0000000..4242889
--- /dev/null
+++ b/test/py/util/boltzmann.py
@@ -0,0 +1,17 @@
+sys.exit(0)
+include("../formoseCommon/grammar.py")
+
+boltz = Boltzmann(40)
+def doStuff(g, gs, first):
+	print(boltz(g, gs, first))
+	return True
+
+dg = dgRuleComp(inputGraphs, addSubset(formaldehyde, glycolaldehyde)
+	>> repeat(
+		rightPredicate[
+			lambda d: all(a.vLabelCount("C") <= 4 for a in d.right)
+		](inputRules)
+		>> filterUniverse(lambda g, gs, first: doStuff(g, gs.universe, first))
+	)
+)
+dg.calc()
diff --git a/testJLA.sh b/testJLA.sh
deleted file mode 100755
index f658402..0000000
--- a/testJLA.sh
+++ /dev/null
@@ -1,134 +0,0 @@
-#!/bin/bash
-export AS_RLIMIT=300000000
-root_PWD=$(pwd)
-numThreads=2
-doBuild="yes"
-withOpenBabel="yes"
-prefix="--prefix=$HOME/test/modTestInstall"
-while true; do
-	case $1 in
-	-j)
-		if [ "x$2" = "x" ]; then
-			echo "Missing argument for '$1'"
-			exit 1
-		fi
-		numThreads=$2
-		shift
-		shift
-		;;
-	"nooptional")
-		withOpenBabel="no"
-		shift
-		;;
-	"noobabel")
-		withOpenBabel="no"
-		shift
-		;;
-	"nobuild")
-		doBuild="no"
-		shift
-		;;
-	"--prefix="*)
-		prefix=$1
-		shift
-		;;
-	"")
-		break
-		;;
-	*)
-		echo "Unknown option '$1'"
-		exit 1
-	esac
-done
-
-args=""
-if test "$withOpenBabel" = "yes"; then
-	# Use the repo version now.
-	args="$args	--with-OpenBabel=yes"
-else
-	args="$args --with-OpenBabel=no"
-fi
-args="$args	--with-boost=$HOME/programs$suffix"
-args="$args	--with-perm_group=$HOME/test/permGroupTestInstall"
-args="$args	--with-graph_canon=$HOME/test/graphCanonTestInstall"
-args="$args	$prefix $@"
-
-./bootstrap.sh								\
-	&& rm -rf preBuild && mkdir preBuild		\
-	&& cd preBuild && ../configure $args		\
-	&& make dist								\
-	&& cd .. && rm -rf build && mkdir build		\
-	&& cd build									\
-	&& cp ../preBuild/mod-*.tar.gz ./			\
-	&& tar xzf mod-*.tar.gz	&& cd mod-*/		\
-	&& mkdir build && cd build					\
-	&& ../configure $args
-res=$?
-if [ $res -ne 0 ]; then
-	echo "Error during configuration"
-	exit $res
-fi
-if [ "$doBuild" = "no" ]; then
-	echo "Not building due to user request"
-else
-	time make -j $numThreads						\
-		&& rm -rf $HOME/test/modTestInstall			\
-		&& make install
-	res=$?
-	if [ $res -ne 0 ]; then
-		echo "Error during installation"
-		exit $res
-	fi
-	function makeSource {
-		cd $root_PWD/src
-		for f in $(find mod -iname "*.h" | grep -v -e BuildConfig.h -e "/lib/" -e "/Py/"); do
-			echo "#include <$f>"
-		done
-		echo ""
-		echo "#include "
-		echo ""
-		echo "int main() {"
-		echo "	auto g = mod::graph::Graph::graphDFS(\"[T]\");"
-		echo "	std::cout << \"Graph name:	\" << g->getName() << std::endl;"
-		echo "}"
-	}
-	function makeMakefile {
-		echo 'PKG_CONFIG_PATH := $(PKG_CONFIG_PATH):$(HOME)/test/modTestInstall/lib/pkgconfig'
-		echo 'CPPFLAGS        := $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --cflags mod)'
-		echo 'CXXFLAGS        := -std=c++14'
-		echo 'LDLIBS          := $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --libs mod)'
-		echo ""
-		echo "test: test.o"
-		echo '	$(CXX) -o test test.o $(LDLIBS)'
-	}
-	rm -rf $HOME/test/modTestCompile
-	mkdir $HOME/test/modTestCompile
-	makeSource > $HOME/test/modTestCompile/test.cpp
-	makeMakefile > $HOME/test/modTestCompile/Makefile
-	cd $HOME/test/modTestCompile
-	echo "Test program:"
-	echo "======================================================================"
-	cat test.cpp
-	echo "======================================================================"
-	echo "Makefile:"
-	echo "======================================================================"
-	cat Makefile
-	echo "======================================================================"
-	make && ./test
-	res=$?
-	if [ $res -ne 0 ]; then
-		echo "Compilation or run of test program failed."
-		exit $res
-	fi
-	echo "Test wrapper"
-	echo "======================================================================"
-	$HOME/test/modTestInstall/bin/mod -e "smiles('O').print()"
-	res=$?
-	if [ $res -ne 0 ]; then
-		echo "Running the wrapper script failed."
-		exit $res
-	fi
-fi
-cd $root_PWD/build/mod-*/
-cd build
-make install-doc

From a4c880737eb5982b1da1663bd401e06f9c1f52e8 Mon Sep 17 00:00:00 2001
From: Jakob Lykke Andersen 
Date: Thu, 1 Aug 2019 13:07:38 +0200
Subject: [PATCH 3/3] Doc, fix reference bugs

---
 ChangeLog.rst                         | 4 ++--
 doc/CMakeLists.txt                    | 2 +-
 libs/pymod/src/mod/py/Misc.cpp        | 6 +++---
 libs/pymod/src/mod/py/graph/Graph.cpp | 2 +-
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/ChangeLog.rst b/ChangeLog.rst
index 1f692d8..2ec23f6 100644
--- a/ChangeLog.rst
+++ b/ChangeLog.rst
@@ -16,7 +16,7 @@ Incompatible Changes
 - Now requires v0.4 of
   `GraphCanon `__
   (and `PermGroup `__).
-- :cpp:func:`DG::getGraphDatabase` now returns a :cpp:any:`std::vector`
+- :cpp:func:`dg::DG::getGraphDatabase` now returns a :cpp:any:`std::vector`
   instead of a :cpp:any:`std::unordered_set`.
 - Hide internal symbols in the library to increase optimization opportunities,
   and hide symbols in library dependencies.
@@ -29,7 +29,7 @@ New Features
 
 - :py:func:`dgDump`/:cpp:func:`dg::DG::dump` should now be much, much faster
   in parsing the input file and loading the contained derivation graph.
-- :py:func:`dgRulecomp`/:cpp:func:`dg::DG::ruleComp` should now be much faster
+- :py:func:`dgRuleComp`/:cpp:func:`dg::DG::ruleComp` should now be much faster
   during calculation.
 - Added :py:func:`Graph.instantiateStereo`/:cpp:func:`graph::Graph::instantiateStereo`.
 - Added :py:func:`rngReseed`/:cpp:func:`rngReseed`.
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index 8593406..954d7de 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -5,7 +5,7 @@ endif()
 set(output ${CMAKE_CURRENT_BINARY_DIR}/html)
 set(doctrees ${CMAKE_CURRENT_BINARY_DIR}/doctrees)
 add_custom_target(mod_doc
-        COMMAND ${SPHINX} ${CMAKE_CURRENT_SOURCE_DIR}/source -b html ${output} -d ${doctrees})
+        COMMAND ${SPHINX} ${CMAKE_CURRENT_SOURCE_DIR}/source -n -b html ${output} -d ${doctrees})
 if(TARGET doc)
     add_dependencies(doc mod_doc)
 else()
diff --git a/libs/pymod/src/mod/py/Misc.cpp b/libs/pymod/src/mod/py/Misc.cpp
index 2ef8d29..e4de91f 100644
--- a/libs/pymod/src/mod/py/Misc.cpp
+++ b/libs/pymod/src/mod/py/Misc.cpp
@@ -21,9 +21,9 @@ namespace Py {
 // rst: 	This function is used in all PyMØD functions that takes a filename as argument.
 // rst: 	To circumvent this prefixing use the :py:class:`CWDPath` class.
 // rst:
-// rst: 	:returns: :py:attr:`name` prefixed with all strings pushed with :py:func:`pushFilePrefix`
+// rst: 	:returns: `name` prefixed with all strings pushed with :py:func:`pushFilePrefix`
 // rst: 		and popped yet.
-// rst: 	:rtype: str
+// rst: 	:rtype: string
 // rst:
 // rst: .. function:: pushFilePrefix(s)
 // rst:
@@ -33,7 +33,7 @@ namespace Py {
 // rst: 	If the argument starts with ``/``, then during concatenation all previously pushed prefixes are ignored.
 // rst:
 // rst: 	:param s: the string to push as a prefix to be concatenated in :py:func:`prefixFilename`.
-// rst: 	:type s: str
+// rst: 	:type s: string
 // rst:
 // rst: .. function:: popFilePrefix()
 // rst:
diff --git a/libs/pymod/src/mod/py/graph/Graph.cpp b/libs/pymod/src/mod/py/graph/Graph.cpp
index dead6be..8000044 100644
--- a/libs/pymod/src/mod/py/graph/Graph.cpp
+++ b/libs/pymod/src/mod/py/graph/Graph.cpp
@@ -259,7 +259,7 @@ void Graph_doExport() {
 					// rst:			:type: int
 			.add_property("minExternalId", &Graph::getMinExternalId)
 			.add_property("maxExternalId", &Graph::getMaxExternalId)
-					// rst: 	.. py:method: instantiateStereo()
+					// rst: 	.. py:method:: instantiateStereo()
 					// rst:
 					// rst: 		Make sure that stereo data is instantiated.
 					// rst: