UNPKG

kekule

Version:

Open source JavaScript toolkit for chemoinformatics

1 lines 187 kB
Kekule.AbstractConfigs=Class.create(ObjectEx,{CLASS_NAME:"Kekule.AbstractConfigs",CONFIG_PROP_FLAG:"__$config_prop__",initialize:function(e){this.tryApplySuper("initialize"),void 0===e&&(e=!0),e&&this.initPropDefValues()},addConfigProp:function(e,t,r,n){var o={dataType:t};n&&(o=Object.extend(o,n)),void 0!==r&&(o.defaultValue=r);var i=this.defineProp(e,o);return i[this.CONFIG_PROP_FLAG]=!0,i},addHashConfigProp:function(e,t,r){return this.addConfigProp(e,DataType.HASH,t,r)},addStrConfigProp:function(e,t,r){return this.addConfigProp(e,DataType.STRING,t,r)},addNumConfigProp:function(e,t,r){return this.addConfigProp(e,DataType.NUM,t,r)},addIntConfigProp:function(e,t,r){return this.addConfigProp(e,DataType.INT,t,r)},addFloatConfigProp:function(e,t,r){return this.addConfigProp(e,DataType.FLOAT,t,r)},addBoolConfigProp:function(e,t,r){return this.addConfigProp(e,DataType.BOOL,t,r)},initPropDefValues:function(){this.beginUpdate();try{for(var e=this.getAllPropList(),t=0,r=e.getLength();t<r;++t){var n=e.getPropInfoAt(t),o=n.name,i=n.defaultValue;void 0!==i&&this.setPropValue(o,i)}}finally{this.endUpdate()}},isConfigProp:function(e){return!!e[this.CONFIG_PROP_FLAG]},assign:function(e){e.copyPropsTo(this)},doTransformPropNameToHash:function(e){return this.doGetPropNameToHashPrefix()+e},doGetPropNameToHashPrefix:function(){return""},toHash:function(e){var t={},r=this.CONFIG_PROP_FLAG;this.saveObj(t,"json",{saveDefaultValues:!0,propFilter:function(e,t){return e[r]}});for(var n=e||this.doTransformPropNameToHash.bind(this),o={},i=Kekule.ObjUtils.getOwnedFieldNames(t,!1),a=0,s=i.length;a<s;++a){o[n(i[a])]=t[i[a]]}return o}}),Kekule.ConfigPresetMap=Class.create(ObjectEx,{CLASS_NAME:"Kekule.ConfigPresetMap",initialize:function(){this.tryApplySuper("initialize"),this.map=new Kekule.MapEx(!0)},doFinalize:function(){this.map=null,this.tryApplySuper("doFinalize")},set:function(e,t){this.map.set(e,t)},get:function(e){return this.map.get(e)},getHash:function(e){var t=this.get(e);return t?t.toHash?t.toHash():t:null},remove:function(e){this.map.remove(e)},has:function(e){return this.map.has(e)},clear:function(){this.map.clear()}}),Kekule.ElementSeries={NONMETAL:"Nonmetals",METAL:"Metals",ALKALI_METAL:"Alkali Metals",ALKALI_EARTH_METAL:"Alkali Earth Metals",TRANSITION_METAL:"Transition Metals",METALLOID:"Metalloids",HALOGEN:"Halogens",NOBLE_GAS:"Noble Gases",LANTHANIDE:"Lanthanides",ACTINIDE:"Actinides"},Kekule.ElementCategory={NONMETAL:1,METAL:21,ALKALI_METAL:22,ALKALI_EARTH_METAL:23,TRANSITION_METAL:24,METALLOID:11,HALOGEN:3,NOBLE_GAS:2,LANTHANIDE:25,ACTINIDE:26},Kekule.Element=Class.create(Kekule.ChemObject,{CLASS_NAME:"Kekule.Element",initialize:function(e){if(this.tryApplySuper("initialize"),e!=Kekule.Element.UNSET_ELEMENT){var t=this.getElementInfo(e);t?(this.setPropStoreFieldValue("symbol",t.symbol),this.setPropStoreFieldValue("atomicNumber",t.atomicNumber),this.setPropStoreFieldValue("group",t.group),this.setPropStoreFieldValue("period",t.period),this.setPropStoreFieldValue("series",t.chemicalSerie),this.setPropStoreFieldValue("naturalMass",t.naturalMass),this.setPropStoreFieldValue("categories",this._getElementCategoriesFromSeries(t.chemicalSerie)),t.name&&this.setPropStoreFieldValue("name",t.name)):Kekule.chemError(Kekule.hasLocalRes()?Kekule.$L("ErrorMsg.INVALID_CHEMELEMENT")+": "+e:"Invalid chemical element: "+e)}else this.setPropStoreFieldValue("symbol",Kekule.Element.UNSET_ELEMENT),this.setPropStoreFieldValue("atomicNumber",Kekule.Element.UNSET_ELEMENT)},initProperties:function(){this.defineProp("name",{dataType:DataType.STRING,serializable:!1,setter:null}),this.defineProp("atomicNumber",{dataType:DataType.INT,serializable:!1,setter:null}),this.defineProp("symbol",{dataType:DataType.STRING,serializable:!1,setter:null}),this.defineProp("group",{dataType:DataType.INT,serializable:!1,setter:null}),this.defineProp("period",{dataType:DataType.INT,serializable:!1,setter:null}),this.defineProp("series",{dataType:DataType.STRING,serializable:!1,setter:null}),this.defineProp("categories",{dataType:DataType.ARRAY,serializable:!1,setter:null}),this.defineProp("naturalMass",{dataType:DataType.FLOAT,serializable:!1,setter:null})},getElementInfo:function(e){return e==Kekule.Element.UNSET_ELEMENT?{symbol:Kekule.Element.UNSET_ELEMENT,atomicNumber:Kekule.Element.UNSET_ELEMENT}:Kekule.Element.isDummyElement(e)?{symbol:Kekule.Element.DUMMY_ELEMENT,atomicNumber:Kekule.Element.DUMMY_ELEMENT_ATOMICNUM}:Kekule.Element.isRGroup(e)?{symbol:Kekule.Element.RGROUP_ELEMENT,atomicNumber:Kekule.Element.RGROUP_ELEMENT_ATMOICNUM}:Kekule.ChemicalElementsDataUtil.getElementInfo(e)},_getElementCategoriesFromSeries:function(e){var t=Kekule.ElementSeries,r=Kekule.ElementCategory,n=[];switch(e){case t.NONMETAL:n=[r.NONMETAL];break;case t.METAL:n=[r.METAL];break;case t.ALKALI_METAL:n=[r.METAL,r.ALKALI_METAL];break;case t.ALKALI_EARTH_METAL:n=[r.METAL,r.ALKALI_EARTH_METAL];break;case t.TRANSITION_METAL:n=[r.METAL,r.TRANSITION_METAL];break;case t.METALLOID:n=[r.METALLOID];break;case t.HALOGEN:n=[r.NONMETAL,r.HALOGEN];break;case t.NOBLE_GAS:n=[r.NONMETAL,r.NOBLE_GAS];break;case t.LANTHANIDE:n=[r.METAL,r.LANTHANIDE];break;case t.ACTINIDE:n=[r.METAL,r.ACTINIDE]}return n},getTheoreticValence:function(){return this.getGroup()?Kekule.Element.getTheoreticValenceOfGroup(this.getGroup()):null},isDummyElement:function(){return this.getAtomicNumber()==Kekule.Element.DUMMY_ELEMENT_ATOMICNUM},isRGroupElement:function(){return this.getAtomicNumber()==Kekule.Element.RGROUP_ELEMENT_ATMOICNUM},isNormalElement:function(){return Kekule.Element.isNormalElement(this.getAtomicNumber())},isSameElement:function(e){return e==Kekule.Element.UNSET_ELEMENT?this.getAtomicNumber()==Kekule.Element.UNSET_ELEMENT:"number"==typeof e?this.getAtomicNumber()==e:this.getSymbol()==e},isHetero:function(){return(this.getSeries()===Kekule.ElementSeries.NONMETAL||this.getSeries()===Kekule.ElementSeries.HALOGEN)&&6!==this.getAtomicNumber()&&1!==this.getAtomicNumber()},belongToCategory:function(e){return(this.getCategories()||[]).indexOf(e)>=0},getLabel:function(){return this.getSymbol()}}),Object.extend(Kekule.Element,Kekule.ChemicalElementsDataUtil),Kekule.Element.UNSET_ELEMENT=void 0,Kekule.Element.DUMMY_ELEMENT="DU",Kekule.Element.DUMMY_ELEMENT_ATOMICNUM=-1,Kekule.Element.RGROUP_ELEMENT="R",Kekule.Element.RGROUP_ELEMENT_ATOMICNUM=-2,Kekule.Element.DEUTERIUM="D",Kekule.Element.isNormalElement=function(e){return e!=Kekule.Element.UNSET_ELEMENT&&!Kekule.Element.isPseudoElement(e)},Kekule.Element.isPseudoElement=function(e){return"string"==typeof e?e==Kekule.Element.DUMMY_ELEMENT||e==Kekule.Element.RGROUP_ELEMENT:e==Kekule.Element.DUMMY_ELEMENT_ATOMICNUM||e==Kekule.Element.RGROUP_ELEMENT_ATMOICNUM},Kekule.Element.isDummyElement=function(e){return e===Kekule.Element.DUMMY_ELEMENT||e===Kekule.Element.DUMMY_ELEMENT_ATOMICNUM},Kekule.Element.isRGroup=function(e){return e===Kekule.Element.RGROUP_ELEMENT||e===Kekule.Element.RGROUP_ELEMENT_ATOMICNUM},Kekule.Element.getTheoreticValenceOfGroup=function(e){return e<=2?e:e<=12?null:e<=17?e-10:0},Kekule.Element.getTheoreticValence=function(e){var t=Kekule.ChemicalElementsDataUtil.getElementInfo(e);return t.group?Kekule.Element.getTheoreticValenceOfGroup(t.group):null},Object.extend(Kekule.Element,{isAtomicNumberAvailable:function(e){return Kekule.ChemicalElementsDataUtil.isAtomicNumberAvailable(e)},isElementSymbolAvailable:function(e){return Kekule.ChemicalElementsDataUtil.isElementSymbolAvailable(e)}}),Kekule.Isotope=Class.create(Kekule.Element,{CLASS_NAME:"Kekule.Isotope",initialize:function(e,t){var r=e,n=t,o=Kekule.IsotopesDataUtil.getIsotopeInfo(e,t);if(o&&(o.atomicNumber&&(r=o.atomicNumber),n=o.massNumber),this.tryApplySuper("initialize",[r]),this.setPropStoreFieldValue("massNumber",n),o&&o.isotopeAlias&&this.setPropStoreFieldValue("isotopeAlias",o.isotopeAlias),Kekule.Element.isNormalElement(r)&&n!==Kekule.Isotope.UNSET_MASSNUMBER){var i=Kekule.IsotopesDataUtil.getIsotopeInfo(this.getAtomicNumber(),n);i?(this.setPropStoreFieldValue("exactMass",i.exactMass),this.setPropStoreFieldValue("naturalAbundance",i.naturalAbundance)):Kekule.chemError((Kekule.hasLocalRes()?Kekule.$L("ErrorMsg.INVALID_ISOTOPE"):"Invalid isotope")+": "+this.getSymbol()+"/"+t)}},initProperties:function(){this.defineProp("massNumber",{dataType:DataType.INTEGER,serializable:!1,setter:null}),this.defineProp("exactMass",{dataType:DataType.FLOAT,serializable:!1,setter:null}),this.defineProp("naturalAbundance",{dataType:DataType.FLOAT,serializable:!1,setter:null}),this.defineProp("isotopeAlias",{dataType:DataType.STRING,serializable:!1,setter:null})},isSame:function(e){return e instanceof Kekule.Isotope&&(e===this||e.getAtomicNumber()==this.getAtomicNumber()&&e.getMassNumber()==this.getMassNumber())},getIsotopeId:function(){return Kekule.IsotopesDataUtil.getIsotopeId(this.getAtomicNumber(),this.getMassNumber())},getLabel:function(){return""+(this.getMassNumber()||"")+this.getSymbol()}}),Object.extend(Kekule.Isotope,Kekule.IsotopesDataUtil),Kekule.Isotope.UNSET_MASSNUMBER=void 0,Kekule.Isotope.getIsotopeId=function(e,t){return Kekule.IsotopesDataUtil.getIsotopeId(e,t)},Object.extend(Kekule.Isotope,{isMassNumberAvailable:function(e,t){return Kekule.IsotopesDataUtil.isMassNumberAvailable(e,t)}}),Kekule.IsotopeFactory={GENERIC_ELEMENT_ID:"__GENERIC__",_isotopes:{},getIsotopeId:function(e,t){return e?Kekule.IsotopesDataUtil.getIsotopeId(e,t):Kekule.IsotopeFactory.GENERIC_ELEMENT_ID},getIsotope:function(e,t){var r=Kekule.IsotopeFactory.getIsotopeId(e,t);if(!Kekule.IsotopeFactory._isotopes[r]){var n=new Kekule.Isotope(e,t);Kekule.IsotopeFactory._isotopes[r]=n}return Kekule.IsotopeFactory._isotopes[r]},getIsotopeById:function(e){if(Kekule.IsotopeFactory._isotopes[e])return Kekule.IsotopeFactory._isotopes[e];var t=Kekule.IsotopesDataUtil.getIsotopeIdDetail(e);return t?Kekule.IsotopeFactory.getIsotope(t.symbol,t.massNumber):null}},Kekule.AtomType={UNSET_ATOMTYPE:void 0},Kekule.ElectronSet=Class.create(Kekule.ChemObject,{CLASS_NAME:"Kekule.ElectronSet",initialize:function(e){this.tryApplySuper("initialize"),this.setElectronCount(e||Kekule.ElectronSet.UNSET_ELECTRONCOUNT)},initProperties:function(){this.defineProp("electronCount",{dataType:DataType.FLOAT})}}),Kekule.ElectronSet.UNSET_ELECTRONCOUNT=null,Kekule.UnbondedElectronSet=Class.create(Kekule.ElectronSet,{CLASS_NAME:"Kekule.UnBondedElectronSet",initialize:function(e){this.tryApplySuper("initialize",[e])},initProperties:function(){}}),Kekule.BondType={COVALENT:"covalent",IONIC:"ionic",COORDINATE:"coordinate",METALLIC:"metallic",HYDROGEN:"hydrogen",TRANSITION:"transition",UNKNOWN:null,DEFAULT:"covalent"},Kekule.BondOrder={SINGLE:1,DOUBLE:2,TRIPLE:3,QUAD:4,EXPLICIT_AROMATIC:10,OTHER:20,UNSET:null,DEFAULT:1,getBondValence:function(e){return e===Kekule.BondOrder.UNSET?0:e==Kekule.BondOrder.EXPLICIT_AROMATIC?1.5:e}},Kekule.BondForm=Class.create(Kekule.ElectronSet,{CLASS_NAME:"Kekule.BondForm",initialize:function(e,t,r){this.tryApplySuper("initialize",[t]),this.setBondOrder(e||Kekule.BondOrder.DEFAULT),Kekule.ObjUtils.notUnset(r)&&this.setBondType(r),Kekule.ObjUtils.notUnset(t)&&this.setElectronCount(t)},initProperties:function(){this.defineProp("bondType",{dataType:DataType.STRING,enumSource:Kekule.BondType,getter:function(){var e=this.getPropStoreFieldValue("bondType");return e||Kekule.BondType.DEFAULT}}),this.defineProp("bondOrder",{dataType:DataType.FLOAT,enumSource:Kekule.BondOrder,setter:function(e){this.getPropStoreFieldValue("bondOrder")!=e&&(this.setPropStoreFieldValue("bondOrder",e),e?this.getBondType()==Kekule.BondType.COVALENT&&this.setElectronCount(2*this.getBondValence()):e===Kekule.BondOrder.UNSET&&this.setElectronCount(Kekule.ElectronSet.UNSET_ELECTRONCOUNT))}}),this.defineProp("electronCount",{dataType:DataType.FLOAT}),this.defineProp("bondValence",{dataType:DataType.FLOAT,serializable:!1,getter:function(){return Kekule.BondOrder.getBondValence(this.getBondOrder())},setter:null})}}),Kekule.BondFormFactory={_bondForms:{},getBondFormId:function(e,t,r){var n="";return r&&(n+=r+"_"),e&&(n+=Number(e).toString()),t&&(n+="_"+Number(t).toString()),n},getBondForm:function(e,t,r){if(e||t||r){if(r||(r=Kekule.BondType.DEFAULT),!t&&e&&r===Kekule.BondType.COVALENT)t=2*Kekule.BondOrder.getBondValence(e);var n=Kekule.BondFormFactory.getBondFormId(e,t,r);return Kekule.BondFormFactory._bondForms[n]||(Kekule.BondFormFactory._bondForms[n]=new Kekule.BondForm(e,t,r)),Kekule.BondFormFactory._bondForms[n]}}},Kekule.RadicalOrder={NONE:0,SINGLET:1,DOUBLET:2,TRIPLET:3,DEFAULT:0,getRadicalElectronCount:function(e){var t=Kekule.RadicalOrder;return Kekule.ObjUtils.isUnset(e)||e===t.NONE?0:e===t.DOUBLET?1:2}},Kekule.HybridizationType={UNKNOWN:null,SP:1,SP2:2,SP3:3,NONE:0},Kekule.ValenceUtils={getPossibleMdlValenceInfo:function(e,t){var r=Math.round(t),n=[],o=0,i=!1;switch(e){case 1:case 3:case 11:case 19:case 37:case 55:case 87:0===r?n=[1]:1===r?n=[0]:i=!0,o=1;break;case 4:case 12:case 20:case 38:case 56:case 88:switch(r){case 0:n=[2];break;case 1:n=[1];break;case 2:n=[0];break;default:i=!0}o=2;break;case 5:switch(r){case-4:n=[1];break;case-3:n=[2];break;case-2:n=[3,5];break;case-1:n=[4];break;case 0:n=[3];break;case 1:n=[2];break;case 2:n=[1];break;case 3:n=[0];break;default:i=!0}o=3;break;case 6:switch(r){case-4:n=[0];break;case-3:n=[1];break;case-2:n=[2];break;case-1:n=[3,5];break;case 0:n=[4];break;case 1:n=[3];break;case 2:n=[2];break;case 3:n=[1];break;case 4:n=[0];break;default:i=!0}o=4;break;case 7:switch(r){case-3:n=[0];break;case-2:n=[1];break;case-1:n=[2];break;case 0:n=[3,5];break;case 1:n=[4];break;case 2:n=[3];break;case 3:n=[2];break;case 4:n=[1];break;case 5:n=[0];break;default:i=!0}o=5;break;case 8:switch(r){case-2:n=[0];break;case-1:n=[1];break;case 0:n=[2];break;case 1:n=[3,5];break;case 2:n=[4];break;case 3:n=[3];break;case 4:n=[2];break;case 5:n=[1];break;case 6:n=[0];break;default:i=!0}o=6;break;case 9:switch(r){case-1:n=[0];break;case 0:n=[1];break;case 1:n=[2];break;case 2:n=[3,5];break;case 3:n=[4];break;case 4:n=[3];break;case 5:n=[2];break;case 6:n=[1];break;case 7:n=[0];break;default:i=!0}o=7;break;case 13:switch(r){case-4:n=[1,3,5,7];break;case-3:n=[2,4,6];break;case-2:n=[3,5];break;case-1:n=[4];break;case 0:n=[3];break;case 1:n=[2];break;case 2:n=[1];break;case 3:n=[0];break;default:i=!0}o=3;break;case 14:switch(r){case-4:n=[0];break;case-3:n=[1,3,5,7];break;case-2:n=[2,4,6];break;case-1:n=[3,5];break;case 0:n=[4];break;case 1:n=[3];break;case 2:n=[2];break;case 3:n=[1];break;case 4:n=[0]}o=4;break;case 15:switch(r){case-3:n=[0];break;case-2:n=[1,3,5,7];break;case-1:n=[2,4,6];break;case 0:n=[3,5];break;case 1:n=[4];break;case 2:n=[3];break;case 3:n=[2];break;case 4:n=[1];break;case 5:n=[0]}o=5;break;case 16:switch(r){case-2:n=[0];break;case-1:n=[1,3,5,7];break;case 0:n=[2,4,6];break;case 1:n=[3,5];break;case 2:n=[4];break;case 3:n=[3];break;case 4:n=[2];break;case 5:n=[1];break;case 6:n=[0]}o=6;break;case 17:switch(r){case-1:n=[0];break;case 0:n=[1,3,5,7];break;case 1:n=[2,4,6];break;case 2:n=[3,5];break;case 3:n=[4];break;case 4:n=[3];break;case 5:n=[2];break;case 6:n=[1];break;case 7:n=[0]}o=7;break;case 31:switch(r){case-4:n=[1,3,5,7];break;case-3:n=[2,4,6];break;case-2:n=[3,5];break;case-1:n=[4];break;case 0:n=[3];break;case 2:n=[1];break;case 3:n=[0];break;default:i=!0}o=3;break;case 32:switch(r){case-4:n=[0];break;case-3:n=[1,3,5,7];break;case-2:n=[2,4,6];break;case-1:n=[3,5];break;case 0:n=[4];break;case 1:n=[3];break;case 3:n=[1];break;case 4:n=[0]}o=4;break;case 33:switch(r){case-3:n=[0];break;case-2:n=[1,3,5,7];break;case-1:n=[2,4,6];break;case 0:n=[3,5];break;case 1:n=[4];break;case 2:n=[3];break;case 4:n=[1];break;case 5:n=[0]}o=5;break;case 34:switch(r){case-2:n=[0];break;case-1:n=[1,3,5,7];break;case 0:n=[2,4,6];break;case 1:n=[3,5];break;case 2:n=[4];break;case 3:n=[3];break;case 5:n=[1];break;case 6:n=[0]}o=6;break;case 35:switch(r){case-1:n=[0];break;case 0:n=[1,3,5,7];break;case 1:n=[2,4,6];break;case 2:n=[3,5];break;case 3:n=[4];break;case 4:n=[3];break;case 6:n=[1];break;case 7:n=[0]}o=7;break;case 49:switch(r){case-4:n=[1,3,5,7];break;case-3:n=[2,4,6];break;case-2:n=[3,5];break;case-1:n=[4];break;case 0:n=[3];break;case 2:n=[1];break;case 3:n=[0];break;default:i=!0}o=3;break;case 50:case 82:switch(r){case-4:n=[0];break;case-3:n=[1,3,5,7];break;case-2:n=[2,4,6];break;case-1:n=[3,5];break;case 0:n=[2,4];break;case 1:n=[3];break;case 3:n=[1];break;case 4:n=[0]}o=4;break;case 51:case 83:switch(r){case-3:n=[0];break;case-2:n=[1,3,5,7];break;case-1:n=[2,4,6];break;case 0:n=[3,5];break;case 1:n=[2,4];break;case 2:n=[3];break;case 4:n=[1];break;case 5:n=[0]}o=5;break;case 52:case 84:switch(r){case-2:n=[0];break;case-1:n=[1,3,5,7];break;case 0:n=[2,4,6];break;case 1:n=[3,5];break;case 2:n=[2,4];break;case 3:n=[3];break;case 5:n=[1];break;case 6:n=[0]}o=6;break;case 53:case 85:switch(r){case-1:n=[0];break;case 0:n=[1,3,5,7];break;case 1:n=[2,4,6];break;case 2:n=[3,5];break;case 3:n=[2,4];break;case 4:n=[3];break;case 6:n=[1];break;case 7:n=[0]}o=7;break;case 81:switch(r){case-4:n=[1,3,5,7];break;case-3:n=[2,4,6];break;case-2:n=[3,5];break;case-1:n=[2,4];break;case 0:n=[1,3];break;case 3:n=[0];break;default:i=!0}o=3}if(i){var a=o-t;(a<0||a>8)&&(n=[])}return{valences:n,valenceElectronCount:o,unexpectedCharge:i}},getMaxPossibleMdlValence:function(e,t){var r=Kekule.ValenceUtils.getPossibleMdlValenceInfo(e,t).valences;return r.length?r[r.length-1]:0},getImplicitMdlValence:function(e,t,r){var n=t,o=r;switch(e){case 1:case 3:case 11:case 19:case 37:case 55:case 87:if(0==n&&o<=1)return 1;break;case 4:case 12:case 20:case 38:case 56:case 88:switch(n){case 0:if(o<=2)return 2;break;case 1:if(o<=1)return 1}break;case 5:switch(n){case-4:if(o<=1)return 1;break;case-3:if(o<=2)return 2;break;case-2:if(o<=3)return 3;if(o<=5)return 5;break;case-1:if(o<=4)return 4;break;case 0:if(o<=3)return 3;break;case 1:if(o<=2)return 2;break;case 2:if(o<=1)return 1}break;case 6:switch(n){case-3:if(o<=1)return 1;break;case-2:if(o<=2)return 2;break;case-1:if(o<=3)return 3;if(o<=5)return 5;break;case 0:if(o<=4)return 4;break;case 1:if(o<=3)return 3;break;case 2:if(o<=2)return 2;break;case 3:if(o<=1)return 1}break;case 7:switch(n){case-2:if(o<=1)return 1;break;case-1:if(o<=2)return 2;break;case 0:if(o<=3)return 3;if(o<=5)return 5;break;case 1:if(o<=4)return 4;break;case 2:if(o<=3)return 3;break;case 3:if(o<=2)return 2;break;case 4:if(o<=1)return 1}break;case 8:switch(n){case-1:if(o<=1)return 1;break;case 0:if(o<=2)return 2;break;case 1:if(o<=3)return 3;if(o<=5)return 5;break;case 2:if(o<=4)return 4;break;case 3:if(o<=3)return 3;break;case 4:if(o<=2)return 2;break;case 5:if(o<=1)return 1}break;case 9:switch(n){case 0:if(o<=1)return 1;break;case 1:if(o<=2)return 2;break;case 2:if(o<=3)return 3;if(o<=5)return 5;break;case 3:if(o<=4)return 4;break;case 4:if(o<=3)return 3;break;case 5:if(o<=2)return 2;break;case 6:if(o<=1)return 1}break;case 13:switch(n){case-4:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-3:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case-2:if(o<=3)return 3;if(o<=5)return 5;break;case-1:if(o<=4)return 4;break;case 0:if(o<=3)return 3;break;case 1:if(o<=2)return 2;break;case 2:if(o<=1)return 1}break;case 14:switch(n){case-3:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-2:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case-1:if(o<=3)return 3;if(o<=5)return 5;break;case 0:if(o<=4)return 4;break;case 1:if(o<=3)return 3;break;case 2:if(o<=2)return 2;break;case 3:if(o<=1)return 1}break;case 15:switch(n){case-2:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-1:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case 0:if(o<=3)return 3;if(o<=5)return 5;break;case 1:if(o<=4)return 4;break;case 2:if(o<=3)return 3;break;case 3:if(o<=2)return 2;break;case 4:if(o<=1)return 1}break;case 16:switch(n){case-1:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case 0:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case 1:if(o<=3)return 3;if(o<=5)return 5;break;case 2:if(o<=4)return 4;break;case 3:if(o<=3)return 3;break;case 4:if(o<=2)return 2;break;case 5:if(o<=1)return 1}break;case 17:switch(n){case 0:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case 1:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case 2:if(o<=3)return 3;if(o<=5)return 5;break;case 3:if(o<=4)return 4;break;case 4:if(o<=3)return 3;break;case 5:if(o<=2)return 2;break;case 6:if(o<=1)return 1}break;case 31:switch(n){case-4:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-3:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case-2:if(o<=3)return 3;if(o<=5)return 5;break;case-1:if(o<=4)return 4;break;case 0:if(o<=3)return 3;break;case 2:if(o<=1)return 1}break;case 32:switch(n){case-3:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-2:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case-1:if(o<=3)return 3;if(o<=5)return 5;break;case 0:if(o<=4)return 4;break;case 1:if(o<=3)return 3;break;case 3:if(o<=1)return 1}break;case 33:switch(n){case-2:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-1:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case 0:if(o<=3)return 3;if(o<=5)return 5;break;case 1:if(o<=4)return 4;break;case 2:if(o<=3)return 3;break;case 4:if(o<=1)return 1}break;case 34:switch(n){case-1:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case 0:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case 1:if(o<=3)return 3;if(o<=5)return 5;break;case 2:if(o<=4)return 4;break;case 3:if(o<=3)return 3;break;case 5:if(o<=1)return 1}break;case 35:switch(n){case 0:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case 1:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case 2:if(o<=3)return 3;if(o<=5)return 5;break;case 3:if(o<=4)return 4;break;case 4:if(o<=3)return 3;break;case 6:if(o<=1)return 1}break;case 49:switch(n){case-4:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-3:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case-2:if(o<=3)return 3;if(o<=5)return 5;break;case-1:if(o<=2)return 2;if(o<=4)return 4;break;case 0:if(o<=3)return 3;break;case 2:if(o<=1)return 1}break;case 50:case 82:switch(n){case-3:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-2:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case-1:if(o<=3)return 3;if(o<=5)return 5;break;case 0:if(o<=2)return 2;if(o<=4)return 4;break;case 1:if(o<=3)return 3;break;case 3:if(o<=1)return 1}break;case 51:case 83:switch(n){case-2:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-1:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case 0:if(o<=3)return 3;if(o<=5)return 5;break;case 1:if(o<=2)return 2;if(o<=4)return 4;break;case 2:if(o<=3)return 3;break;case 4:if(o<=1)return 1}break;case 52:case 84:switch(n){case-1:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case 0:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case 1:if(o<=3)return 3;if(o<=5)return 5;break;case 2:if(o<=2)return 2;if(o<=4)return 4;break;case 3:if(o<=3)return 3;break;case 5:if(o<=1)return 1}break;case 53:case 85:switch(n){case 0:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case 1:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case 2:if(o<=3)return 3;if(o<=5)return 5;break;case 3:if(o<=2)return 2;if(o<=4)return 4;break;case 4:if(o<=3)return 3;break;case 6:if(o<=1)return 1}break;case 81:switch(n){case-4:if(o<=1)return 1;if(o<=3)return 3;if(o<=5)return 5;if(o<=7)return 7;break;case-3:if(o<=2)return 2;if(o<=4)return 4;if(o<=6)return 6;break;case-2:if(o<=3)return 3;if(o<=5)return 5;break;case-1:if(o<=2)return 2;if(o<=4)return 4;break;case 0:if(o<=1)return 1;if(o<=3)return 3}}return o},getImplicitHydValence:function(e,t,r){var n=e,o=t,i=r,a=0;return 6==n?a=4-Math.abs(o):7==n||15==n?a=3+o:8!=n&&16!=n||(a=2+o),a<0&&(a=0),i>a&&(a=i),a}},Kekule.ValenceUtils.getImplicitValence=Kekule.ValenceUtils.getImplicitMdlValence,Kekule.ValenceUtils.getMaxPossibleValence=Kekule.ValenceUtils.getMaxPossibleMdlValence,function(){"use strict";var e=Kekule.ArrayUtils;Kekule.StructureComparationLevel={SKELETAL:1,CONSTITUTION:2,CONFIGURATION:3,EXACT:4,DEFAULT:4},Kekule.globalOptions.add("structure",{defaultBondLength2D:.8,defaultBondLength3D:1.5}),Kekule.globalOptions.add("algorithm.structureComparation",{structureComparationLevel:Kekule.StructureComparationLevel.DEFAULT}),Kekule.globalOptions.add("algorithm.structureClean",{structureCleanOptions:{orphanChemNode:!0,hangingChemConnector:!0}}),Kekule.globalOptions.add("structure.implicitHydrogenEstimationStrategy",{targetElementCategories:{},targetElements:{},targetOrphanAtomElementCategories:{},targetOrphanAtomElements:{}}),Kekule.globalOptions.structure.implicitHydrogenEstimationStrategy.targetOrphanAtomElementCategories[Kekule.ElementCategory.METAL]=!1,Kekule.ObjComparer.compareStructure=function(e,t,r){var n=Object.create(r||{});return n.method=Kekule.ComparisonMethod.CHEM_STRUCTURE,Kekule.ObjComparer.compare(e,t,n)},Kekule.ObjComparer.equalStructure=function(e,t,r){return 0===Kekule.ObjComparer.compareStructure(e,t,r)},Kekule.ObjComparer.getStructureComparisonDetailOptions=function(e){var t=Object.extend({},e);if(e){var r,n=Kekule.StructureComparationLevel,o=e.structureLevel||e.level||Kekule.globalOptions.algorithm.structureComparation.structureComparationLevel,i=["atom","mass","linkedConnectorCount","charge","radical","stereo","hydrogenCount","connectedObjCount","bondType","bondOrder"];o===n.SKELETAL?r={atom:!1,mass:!1,linkedConnectorCount:!0,charge:!1,radical:!1,stereo:!1,hydrogenCount:!1,connectedObjCount:!0,bondType:!1,bondOrder:!1}:o===n.CONSTITUTION?r={atom:!0,mass:!1,linkedConnectorCount:!0,charge:!1,radical:!1,stereo:!1,hydrogenCount:!0,connectedObjCount:!0,bondType:!0,bondOrder:!0}:o===n.CONFIGURATION?r={atom:!0,mass:!1,linkedConnectorCount:!0,charge:!1,radical:!1,stereo:!0,hydrogenCount:!0,connectedObjCount:!0,bondType:!0,bondOrder:!0}:o===n.EXACT&&(r={atom:!0,mass:!0,linkedConnectorCount:!0,charge:!0,radical:!0,stereo:!0,hydrogenCount:!0,connectedObjCount:!0,bondType:!0,bondOrder:!0});for(var a=0,s=i.length;a<s;++a){var u=i[a],l="compare"+u.capitalizeFirst(),c=t[u];Kekule.ObjUtils.isUnset(c)&&(c=t[l]),Kekule.ObjUtils.isUnset(c)?(t[u]=r[u],t[l]=r[u]):(t[u]=c,t[l]=c)}}return t},Kekule.ChemStructureObject=Class.create(Kekule.ChemObject,{CLASS_NAME:"Kekule.ChemStructureObject",initialize:function(e){this.setPropStoreFieldValue("autoClearStructureCache",!0),this.tryApplySuper("initialize",[e])},doFinalize:function(){this.tryApplySuper("doFinalize")},initProperties:function(){this.defineProp("linkedConnectors",{dataType:DataType.ARRAY,serializable:!1,scope:Class.PropertyScope.PUBLIC,setter:null}),this.defineProp("linkedObjs",{dataType:DataType.ARRAY,serializable:!1,scope:Class.PropertyScope.PUBLIC,setter:null,getter:function(){for(var e=[],t=0,r=this.getLinkedConnectorCount();t<r;++t)for(var n=this.getLinkedConnectorAt(t).getConnectedObjs(),o=0,i=n.length;o<i;++o){var a=n[o];a===this||this.hasChildObj&&this.hasChildObj(a)||Kekule.ArrayUtils.pushUnique(e,n[o])}return e}}),this.defineProp("linkedSiblings",{dataType:DataType.ARRAY,serializable:!1,scope:Class.PropertyScope.PUBLIC,setter:null,getter:function(){for(var e=[],t=this.getParent(),r=0,n=this.getLinkedConnectorCount();r<n;++r)for(var o=this.getLinkedConnectorAt(r).getConnectedObjs(),i=0,a=o.length;i<a;++i){var s=o[i];s!==this&&e.indexOf(s)<0&&(s.getParent()!==t&&(s=t.getDirectChildOfNestedNode(s)),s&&e.push(s))}return e}}),this.defineProp("structureCache",{dataType:DataType.HASH,serializable:!1,setter:null,getter:function(e){var t=this.getPropStoreFieldValue("structureCache");return!t&&e&&(t={},this.setPropStoreFieldValue("structureCache",t)),t}}),this.defineProp("autoClearStructureCache",{dataType:DataType.BOOL,serializable:!1})},initPropValues:function(){this.tryApplySuper("initPropValues"),this.setPropStoreFieldValue("linkedConnectors",[]),this.setSuppressChildChangeEventInUpdating(!0)},getAutoIdPrefix:function(){return"o"},getAcceptCoordStickFrom:function(e){return!1},doGetActualCompareOptions:function(e){if(e&&e.method===Kekule.ComparisonMethod.CHEM_STRUCTURE){var t=Kekule.ObjComparer.getStructureComparisonDetailOptions(e);return e.customMethod&&(t.customMethod=e.customMethod),e.extraComparisonProperties&&(t.extraComparisonProperties=e.extraComparisonProperties),t}return this.tryApplySuper("doGetActualCompareOptions",[e])},_getComparisonOptionFlagValue:function(e,t){var r=e["compare"+t.capitalizeFirst()];return Kekule.ObjUtils.isUnset(r)&&(r=e[t]),r},doGetComparisonPropNames:function(e){return e.method===Kekule.ComparisonMethod.CHEM_STRUCTURE?[]:this.tryApplySuper("doGetComparisonPropNames",[e])},doCompare:function(e,t){var r=this.tryApplySuper("doCompare",[e,t]);if(!r&&t.method===Kekule.ComparisonMethod.CHEM_STRUCTURE&&this._getComparisonOptionFlagValue(t,"linkedConnectorCount")){var n=this.getLinkedNonHydrogenConnectors(),o=e.getLinkedNonHydrogenConnectors&&e.getLinkedNonHydrogenConnectors();r=this.doCompareOnValue(n.length,o&&o.length,t)}return r},compareStructure:function(e,t){var r=Object.create(t||{});return r.method=Kekule.ComparisonMethod.CHEM_STRUCTURE,this.compare(e,r)},equalStructure:function(e,t){return 0===this.compareStructure(e,t)},getParentFragment:function(){var e=this.getParent();return e instanceof Kekule.StructureFragment?e:null},getRootFragment:function(){var e=this.getParentFragment();return e&&e.getRootFragment()||e},getStructureCacheData:function(e){var t=this.getStructureCache();return t&&t[e]},setStructureCacheData:function(e,t){return this.getStructureCache(!0)[e]=t,this},clearStructureCache:function(){return this.setPropStoreFieldValue("structureCache",null),this},needAutoClearStructureCache:function(){var e=this.getParent();return this.getAutoClearStructureCache()&&(!e||!e.needAutoClearStructureCache||e.needAutoClearStructureCache())},notifyLinkedConnectorsChanged:function(){this.notifyPropSet("linkedConnectors",this.getPropStoreFieldValue("linkedConnectors"))},getCurrConnectableObj:function(){return this},getActualConnectedObjToConnector:function(e){return this},getLinkedConnectorCount:function(){return this.getLinkedConnectors().length},getLinkedConnectorAt:function(e){return this.getLinkedConnectors()[e]},indexOfLinkedConnector:function(e){return this.getLinkedConnectors().indexOf(e)},appendLinkedConnector:function(e){var t=this._doAppendLinkedConnector(e);return e&&e._doAppendConnectedObj(this),t},_doAppendLinkedConnector:function(e){if(!e)return-1;var t=this.getPropStoreFieldValue("linkedConnectors"),r=Kekule.ArrayUtils.pushUniqueEx(t,e);return r.isPushed&&this.notifyLinkedConnectorsChanged(),r.index},insertLinkedConnectorAt:function(e,t){t||(t=0);var r=this.indexOfLinkedConnector(e),n=this.getLinkedConnectors();r>=0?(n.splice(r,1),n.splice(t,0,e),this.notifyLinkedConnectorsChanged()):(n.splice(t,0,e),e&&e._doAppendConnectedObj(this),this.notifyLinkedConnectorsChanged())},insertLinkedConnectorBefore:function(e,t){var r=t?this.indexOfLinkedConnector(t):-1;return r<0?this.appendLinkedConnector(e):this.insertLinkedConnectorAt(e,r)},removeLinkedConnectorAt:function(e){var t=this.getLinkedConnectorAt(e);return t&&t._doRemoveConnectedObjAt(t.indexOfConnectedObj(this)),this._doRemoveLinkedConnectorAt(e)},_doRemoveLinkedConnectorAt:function(e){var t=Kekule.ArrayUtils.removeAt(this.getLinkedConnectors(),e);return t&&this.notifyLinkedConnectorsChanged(),t},removeLinkedConnector:function(e){var t=this.getLinkedConnectors().indexOf(e);t>=0&&this.removeLinkedConnectorAt(t)},getConnectorTo:function(e){for(var t=0,r=this.getLinkedConnectorCount();t<r;++t){var n=this.getLinkedConnectorAt(t);if(n.hasConnectedObj(e))return n}return null},removeThisFromLinkedConnector:function(){for(var e=this.getLinkedConnectorCount()-1;e>=0;--e){this.getLinkedConnectorAt(e).removeConnectedObj(this)}},getLinkedObjsOnConnector:function(e){for(var t=[],r=e.getConnectedObjs(),n=0,o=r.length;n<o;++n)r[n]!==this&&Kekule.ArrayUtils.pushUnique(t,r[n]);return t},filterConnector:function(e){for(var t=[],r=0,n=this.getLinkedConnectorCount();r<n;++r){var o=this.getLinkedConnectorAt(r);e(o)&&Kekule.ArrayUtils.pushUnique(t,o)}return t},getLinkedNonHydrogenConnectors:function(){var e=this;return this.filterConnector(function(t){var r=e.getLinkedObjsOnConnector(t);return r.length>1||!(r[0].isHydrogenAtom&&r[0].isHydrogenAtom())})},getLinkedHydrogenConnectors:function(){var e=this;return this.filterConnector(function(t){var r=e.getLinkedObjsOnConnector(t);return 1===r.length&&r[0].isHydrogenAtom&&r[0].isHydrogenAtom()})},getLinkedNonHydrogenObjs:function(){for(var e=[],t=0,r=this.getLinkedConnectorCount();t<r;++t)for(var n=this.getLinkedConnectorAt(t).getConnectedObjs(),o=0,i=n.length;o<i;++o)n[o]===this||n[o].isHydrogenAtom&&n[o].isHydrogenAtom()||Kekule.ArrayUtils.pushUnique(e,n[o]);return e},getLinkedHydrogenAtoms:function(){for(var e=[],t=0,r=this.getLinkedConnectorCount();t<r;++t){var n=this.getLinkedConnectorAt(t);if(n instanceof Kekule.Bond)for(var o=n.getConnectedObjs(),i=0,a=o.length;i<a;++i)o[i]!==this&&o[i].isHydrogenAtom&&o[i].isHydrogenAtom()&&Kekule.ArrayUtils.pushUnique(e,o[i])}return e},getLinkedHydrogenAtomsWithSingleBond:function(){for(var e=[],t=0,r=this.getLinkedConnectorCount();t<r;++t){var n=this.getLinkedConnectorAt(t);if(n instanceof Kekule.Bond&&n.isSingleBond()){var o=n.getConnectedObjs();if(2===o.length)for(var i=0,a=o.length;i<a;++i)o[i]!==this&&o[i].isHydrogenAtom&&o[i].isHydrogenAtom()&&Kekule.ArrayUtils.pushUnique(e,o[i])}}return e},getLinkedHydrogenAtomsWithSingleBondCount:function(e){var t=this.getLinkedHydrogenAtomsWithSingleBond().length||0;e&&(t+=this.getStructureCacheData("omittedBondHydrogenAtomCount")||0);return t},getPathesToDest:function(e){return this._doGetPathesToDest(e,[])},_doGetPathesToDest:function(t,r){if(t===this)return[];for(var n,o=[],i=e.clone(r),a=0,s=this.getLinkedConnectorCount();a<s;++a){var u=this.getLinkedConnectorAt(a);if(!(i.indexOf(u)>=0)){i.push(u);for(var l=u.getConnectedObjs(),c=0,d=l.length;c<d;++c){var h=l[c];if(h===t)n=[[]];else{if(h===this)continue;n=h&&h._doGetPathesToDest&&h._doGetPathesToDest(t,i)}if(n){for(var p={connector:u,object:h},C=0,f=n.length;C<f;++C)n[C].unshift(p);o=o.concat(n)}}}}return o.length||(o=null),o},getStructureRelatedPropNames:function(){return["linkedConnectors"]},structureChange:function(e){this.needAutoClearStructureCache()&&(this.clearStructureFlags(),this.clearStructureCache()),this.invokeEvent("structureChange",{origin:e||this})},clearStructureFlags:function(){},relayEvent:function(e,t){"structureChange"===e?this.structureChange(t.origin):this.tryApplySuper("relayEvent",[e,t])},doObjectChange:function(e){Kekule.ArrayUtils.intersect(e||[],this.getStructureRelatedPropNames()).length&&this.structureChange()}}),Kekule.SimpleStructureNode=Class.create(Kekule.ChemStructureObject,{CLASS_NAME:"Kekule.SimpleStructureNode",initialize:function(e,t,r){this.tryApplySuper("initialize",[e]),t&&this.setCoord2D(t),r&&this.setCoord3D(r)},initProperties:function(){this.defineProp("zIndex2D",{dataType:DataType.INT,scope:Class.PropertyScope.PUBLISHED})},getStructureRelatedPropNames:function(){return this.tryApplySuper("getStructureRelatedPropNames").concat(["coord2D","coord3D"])},getAutoIdPrefix:function(){return"n"},getContainerBox:function(e,t){var r=this.getAbsCoordOfMode(e,t);return Kekule.BoxUtils.createBox(r,r)},getContainerBox2D:function(e){return this.getContainerBox(Kekule.CoordMode.COORD2D,e)},getContainerBox3D:function(e){return this.getContainerBox(Kekule.CoordMode.COORD3D,e)}}),Kekule.ClassDefineUtils.addStandardCoordSupport(Kekule.SimpleStructureNode),Kekule.BaseStructureNode=Class.create(Kekule.SimpleStructureNode,{CLASS_NAME:"Kekule.BaseStructureNode",initProperties:function(){this.defineProp("coordStickTarget",{dataType:"Kekule.ChemStructureObject",objRef:!0,autoUpdate:!0,getter:function(){return this.getPropStoreFieldValue("coordStickTarget")},setter:function(e){if(e){if(!this.getAllowCoordStickTo(e))return void Kekule.chemError(Kekule.$L("ErrorMsg.COORD_STICK_NOT_ALLOWED_ON_CLASS"));var t=this.getOwner(),r=e.getOwner&&e.getOwner();if(r&&t!==r)return void Kekule.chemError(Kekule.$L("ErrorMsg.UNABLE_TO_STICK_TO_OTHER_OWNER_OBJ"));if(!e.getAcceptCoordStickFrom&&!e.getAcceptCoordStickFrom(this))return void Kekule.chemError(Kekule.$L("ErrorMsg.INVALID_STICK_TARGET_OBJ"));if(!e.getAbsCoordOfMode)return void Kekule.chemError(Kekule.$L("ErrorMsg.UNABLE_TO_STICK_TO_OBJ_WITHOUT_ABS_COORD"));if(e.getCoordStickTarget&&e.getCoordStickTarget()===this)return void Kekule.chemError(Kekule.$L("ErrorMsg.STICK_RECURSION_NOT_ALLOWED"))}var n=this.getCoordStickTarget();this.setPropStoreFieldValue("coordStickTarget",e),this._coordStickTargetChanged(n,e)}})},getAllowCoordStickTo:function(e){return!1},notifyCoordStickTargetChanged:function(e,t){},_getParentAbsCoord:function(e,t){var r=this.getCoordParent();return r&&r.getAbsCoordOfMode&&r.getAbsCoordOfMode(e,t)},_coordStickTargetChanged:function(e,t){e&&!t?this._copyAbsCoordFromStickedTarget(e,this.getCoordParent()):t&&this._copyAbsCoordFromStickedTarget(t,this.getCoordParent()),e&&e.detachCoordStickNodes&&e.detachCoordStickNodes(this),t&&t.attachCoordStickNodes&&t.attachCoordStickNodes(this),this.notifyCoordStickTargetChanged(e,t)},_copyAbsCoordFromStickedTarget:function(e,t,r){var n=Kekule.CoordUtils,o=Kekule.CoordMode;t||(t=this.getCoordParent());var i=r&&r!==o.COORD2D?null:e.getAbsCoord2D(),a=r&&r!==o.COORD2D?null:e.getAbsCoord3D();if(t){if(i){var s=t.getAbsCoord2D&&t.getAbsCoord2D();s&&(i=n.substract(i,s))}if(a){var u=t.getAbsCoord3D&&t.getAbsCoord3D();u&&(a=n.substract(a,u))}}i&&this.setPropStoreFieldValue("coord2D",i),a&&this.setPropStoreFieldValue("coord3D",a)},doGetCoord2D:function(e,t){var r=this.getCoordStickTarget();if(r&&r.getAbsCoord2D){var n=r.getAbsCoord2D(e,t),o=this._getParentAbsCoord(Kekule.CoordMode.COORD2D,e);return o&&(n=Kekule.CoordUtils.substract(n,o)),n}return this.tryApplySuper("doGetCoord2D",[e,t])},doGetCoord3D:function(e,t){var r=this.getCoordStickTarget();if(r&&r.getAbsCoord3D){var n=r.getAbsCoord3D(e,t),o=this._getParentAbsCoord(Kekule.CoordMode.COORD3D,e);return o&&(n=Kekule.CoordUtils.substract(n,o)),n}return this.tryApplySuper("doGetCoord3D",[e,t])},isOrphan:function(){var e=this.getParent();return!e||e.getChildCount()<=1}}),Kekule.StereoParity={NONE:null,ODD:1,EVEN:2,UNKNOWN:0},Kekule.ChemStructureNode=Class.create(Kekule.BaseStructureNode,{CLASS_NAME:"Kekule.ChemStructureNode",initialize:function(e,t,r){this.tryApplySuper("initialize",[e]),t&&this.setCoord2D(t),r&&this.setCoord3D(r)},initProperties:function(){this.defineProp("charge",{dataType:DataType.FLOAT,getter:function(){return this.getPropStoreFieldValue("charge")||0}}),this.defineProp("electronicBias",{dataType:DataType.INT}),this.defineProp("radical",{dataType:DataType.INT}),this.defineProp("parity",{dataType:DataType.INT}),this.defineProp("isAnchor",{dataType:DataType.BOOL,serializable:!1,getter:function(){var e=this.getParent();return!(!e||!e.indexOfAnchorNode)&&e.indexOfAnchorNode(this)>=0},setter:function(e){if(e!==this.getIsAnchor()){var t=this.getParent();t&&(e&&t.appendAnchorNode()?t.appendAnchorNode(this):!e&&t.removeAnchorNode&&t.removeAnchorNode(this))}}}),this.defineProp("chargeEx",{dataType:DataType.OBJECT,scope:Class.PropertyScope.PRIVATE,serializable:!1,getter:function(){return{charge:this.getCharge(),electronicBias:this.getElectronicBias()}},setter:function(e){this.beginUpdate();try{e&&Kekule.ObjUtils.notUnset(e.charge)&&this.setCharge(e.charge),e&&Kekule.ObjUtils.notUnset(e.electronicBias)&&this.setElectronicBias(e.electronicBias)}finally{this.endUpdate()}}})},getStructureRelatedPropNames:function(){return this.tryApplySuper("getStructureRelatedPropNames").concat(["charge","radical"])},getLabel:function(){return null},getAcceptCoordStickFrom:function(e){return!(this.isSiblingWith(e)||e instanceof Kekule.ChemStructureNode)},doGetComparisonPropNames:function(e){var t=this.tryApplySuper("doGetComparisonPropNames",[e]);return e.method===Kekule.ComparisonMethod.CHEM_STRUCTURE&&(this._getComparisonOptionFlagValue(e,"charge")&&t.push("charge"),this._getComparisonOptionFlagValue(e,"radical")&&t.push("radical")),t},doCompareProperty:function(e,t,r){if(r.method!==Kekule.ComparisonMethod.CHEM_STRUCTURE||"charge"!==t&&"radical"!==t)return this.tryApplySuper("doCompareProperty",[e,t,r]);var n=e.getPropValue&&e.getPropValue(t)||0;return(this.getPropValue(t)||0)-n},doCompare:function(e,t){var r=this.tryApplySuper("doCompare",[e,t]);if(!r&&t.method===Kekule.ComparisonMethod.CHEM_STRUCTURE&&this._getComparisonOptionFlagValue(t,"stereo")){var n=this.getParity()||Kekule.StereoParity.UNKNOWN,o=e.getParity&&e.getParity()||Kekule.StereoParity.UNKNOWN;r=this.doCompareOnValue(n,o,t)}return r},getPrimaryIsotope:function(){return null},getLinkedChemNodes:function(e){for(var t=this.getLinkedObjs(),r=[],n=0,o=t.length;n<o;++n){var i=t[n];!(i instanceof Kekule.ChemStructureNode)||e&&i.isHydrogenAtom&&i.isHydrogenAtom()||r.push(i)}return r},getLinkedBonds:function(e){for(var t=[],r=0,n=this.getLinkedConnectorCount();r<n;++r){var o=this.getLinkedConnectorAt(r);o instanceof Kekule.Bond&&(!e||o.getBondType()===e)&&t.push(o)}return t},getLinkedMultiCenterBonds:function(){for(var e=[],t=0,r=this.getLinkedConnectorCount();t<r;++t){var n=this.getLinkedConnectorAt(t);n instanceof Kekule.Bond&&n.getConnectedObjCount()>2&&e.push(n)}return e},getLinkedMultipleBonds:function(){for(var e=Kekule.BondOrder,t=[],r=0,n=this.getLinkedConnectorCount();r<n;++r){var o=this.getLinkedConnectorAt(r);if(o instanceof Kekule.Bond&&o.getBondType()===Kekule.BondType.COVALENT){var i=o.getBondOrder();i!==e.DOUBLE&&i!==e.TRIPLE&&i!==e.QUAD&&i!==e.EXPLICIT_AROMATIC||t.push(o)}}return t},getLinkedDoubleBonds:function(){for(var e=Kekule.BondOrder,t=[],r=0,n=this.getLinkedConnectorCount();r<n;++r){var o=this.getLinkedConnectorAt(r);if(o instanceof Kekule.Bond&&o.getBondType()===Kekule.BondType.COVALENT)o.getBondOrder()===e.DOUBLE&&t.push(o)}return t},clearStructureFlags:function(){this.setPropStoreFieldValue("parity",Kekule.StereoParity.NONE)},isHydrogenAtom:function(){return!1},hasExplicitChargeOrElectronicBias:function(){return!(!this.getCharge()&&!this.getElectronicBias())},_getBondsValenceInfo:function(e){for(var t=0,r=0,n=this.getStructureCacheData("piElectronCount")||null,o=0,i=e.length;o<i;++o){var a,s=e[o];if(s instanceof Kekule.Bond)t+=a=s.getBondType()==Kekule.BondType.COVALENT&&s.getBondOrder()===Kekule.BondOrder.EXPLICIT_AROMATIC&&n>=2?1:s.getBondValence(),a>r&&(r=a)}return{valenceSum:t,maxValence:r}},_getCurrCovalentBondsInfo:function(){return this._getBondsValenceInfo(this.filterConnector(function(e){return e instanceof Kekule.Bond&&e.getBondType()==Kekule.BondType.COVALENT}))},_getCurrIonicBondsInfo:function(e){return this._getBondsValenceInfo(this.filterConnector(function(e){return e instanceof Kekule.Bond&&e.getBondType()==Kekule.BondType.IONIC}))}}),Kekule.RadicalType=Kekule.RadicalOrder,Kekule.AbstractAtom=Class.create(Kekule.ChemStructureNode,{CLASS_NAME:"Kekule.AbstractAtom",initialize:function(e,t,r){this.tryApplySuper("initialize",[e,t,r])},initProperties:function(){this.defineProp("explicitHydrogenCount",{dataType:DataType.INT,scope:Class.PropertyScope.PUBLISHED,setter:function(e){var t=parseFloat(e),r=isNaN(t)||t<0?void 0:t;this.setPropStoreFieldValue("explicitHydrogenCount",r)}})},getAutoIdPrefix:function(){return"a"},getStructureRelatedPropNames:function(){return this.tryApplySuper("getStructureRelatedPropNames").concat(["explicitHydrogenCount"])},doCompare:function(e,t){var r=this.tryApplySuper("doCompare",[e,t]);if(!r&&t.method===Kekule.ComparisonMethod.CHEM_STRUCTURE&&this._getComparisonOptionFlagValue(t,"hydrogenCount")){var n=this.getHydrogenCount(!0),o=e.getHydrogenCount&&e.getHydrogenCount(!0);r=this.doCompareOnValue(n,o,t)}return r},getHydrogenCount:function(e){var t=this.getExplicitHydrogenCount()||0;return e&&(t+=this.getLinkedHydrogenAtomsWithSingleBondCount(!1)),t+=this.getStructureCacheData("omittedBondHydrogenAtomCount")||0},setHydrogenCount:function(e){return this.setExplicitHydrogenCount(e)},hasExplicitHydrogens:function(){return Kekule.ObjUtils.notUnset(this.getExplicitHydrogenCount())},isSaturated:function(){return!this.getLinkedMultipleBonds().length},mayContainElement:function(e){var t;return t="string"==typeof e?Kekule.ChemicalElementsDataUtil.getAtomicNumber(e):e,this.doMayContainElement(t)},doMayContainElement:function(e){return!1}}),Kekule.Atom=Class.create(Kekule.AbstractAtom,{CLASS_NAME:"Kekule.Atom",initialize:function(e,t,r,n,o){this.tryApplySuper("initialize",[e,n,o]),(t||r)&&this.changeIsotope(t,r)},initProperties:function(){this.defineProp("isotope",{dataType:"Kekule.Isotope",serializable:!1}),this.defineProp("isotopeId",{dataType:DataType.STRING,serializable:!0,getter:function(){var e=this.getIsotope();return e?e.getIsotopeId():Kekule.Element.UNSET_ELEMENT},setter:function(e){var t=Kekule.IsotopeFactory.getIsotopeById(e);t&&this.setIsotope(t)}}),this.defineProp("symbol",{dataType:DataType.STRING,serializable:!1,getter:function(){var e=this.getIsotope();return e?e.getSymbol():Kekule.Element.UNSET_ELEMENT},setter:function(e){this.changeElement(e)}}),this.defineProp("atomicNumber",{dataType:DataType.INTEGER,serializable:!1,getter:function(){var e=this.getIsotope();return e?e.getAtomicNumber():0},setter:function(e){this.changeElement(e)}}),this.defineProp("massNumber",{dataType:DataType.INTEGER,getter:function(){var e=this.getIsotope();return e?e.getMassNumber():Kekule.Isotope.UNSET_MASSNUMBER},setter:function(e){this.changeMassNumber(e)}}),this.defineProp("isotopeAlias",{dataType:DataType.STRING,getter:function(){var e=this.getIsotope();return e?e.getIsotopeAlias():void 0},setter:function(e){this.changeElement(e)}}),this.defineProp("atomType",{dataType:DataType.OBJECT,serializable:!1,scope:Class.PropertyScope.PUBLIC}),this.defineProp("atomTypeId",{dataType:DataType.STRING,getter:function(){var e=this.getPropStoreFieldValue("atomType");return e?e.id:Kekule.AtomType.UNSET_ATOMTYPE},setter:function(e){if(this.isNormalAtom()){var t=Kekule.AtomTypeDataUtil.getAtomTypeFromId(this.getAtomicNumber(),e);this.setAtomType(t)}}}),this.defineProp("hybridizationType",{dataType:DataType.INT,enumSource:Kekule.HybridizationType}),this.defineProp("disableImplicitHydrogenEstimation",{dataType:DataType.BOOL})},getAutoIdPrefix:function(){return"a"},getStructureRelatedPropNames:function(){return this.tryApplySuper("getStructureRelatedPropNames").concat(["isotope","atomType"])},doGetComparisonPropNames:function(e){var t=this.tryApplySuper("doGetComparisonPropNames",[e]);return e.method===Kekule.ComparisonMethod.CHEM_STRUCTURE&&(this._getComparisonOptionFlagValue(e,"mass")&&t.unshift("massNumber"),this._getComparisonOptionFlagValue(e,"atom")&&t.unshift("atomicNumber")),t},getPrimaryIsotope:function(){return this.getIsotope()},getLabel:function(){return""+(this.getMassNumber()||"")+this.getSymbol()},doMayContainElement:function(e){return this.getAtomicNumber()===e},changeIsotope:function(e,t){e===Kekule.Element.UNSET_ELEMENT?t=Kekule.Isotope.UNSET_MASSNUMBER:e||(e=this.getAtomicNumber()),t||(t=Kekule.Isotope.UNSET_MASSNUMBER),this.getAtomicNumber()!==e&&this.setAtomType(Kekule.AtomType.UNSET_ATOMTYPE);var r=Kekule.IsotopeFactory.getIsotope(e,t);this.setIsotope(r)},changeElement:function(e){return this.changeIsotope(e,Kekule.Isotope.UNSET_MASSNUMBER)},changeMassNumber:function(e){return this.changeIsotope(null,e)},isElement:function(e){return this.getSymbol()===e||this.getAtomicNumber()===e},getElementSeries:function(){var e=this.getIsotope();return e&&e.getSeries()},isNormalAtom:function(){var e=this.getIsotope();return!!e&&e.isNormalElement()},isHydrogenAtom:function(){return this.isElement(1)&&(!this.getMassNumber()||this.getMassNumber()<=1)},guessAtomType:function(){if(this.isNormalAtom()){var e=null,t=null,r=this._getCurrCovalentBondsInfo(),n=Kekule.AtomTypeDataUtil.getAllAtomTypes(this.getAtomicNumber());if(n){for(var o=0,i=n.length;o<i;++o){var a=n[o];if(t=a,a.bondOrderSum>=r.valenceSum&&(e=a,a.maxBondOrder>=r.maxValence))return a}return e||t}}return null},getProximalAtomType:function(){return this.getAtomType()||this.guessAtomType()},getImplicitValence:function(){if(this.isNormalAtom()){var e=this._getCurrCovalentBondsInfo().valenceSum,t=Math.round(this.getCharge()||0);return Kekule.ValenceUtils.getImplicitValence(this.getAtomicNumber(),t,e)}return 0},getExplicitValence:function(e){var t=e||{};if(this.isNormalAtom()){var r=this._getCurrCovalentBondsInfo().valenceSum;if(t.ignoreBondHydrogens)r-=(this.getLinkedHydrogenAtomsWithSingleBond()||[]).length;else r+=this.getStructureCacheData("omittedBondHydrogenAtomCount")||0;if(t.ignoreExplicitHydrogens);else r+=this.getExplicitHydrogenCount()||0;return r}return 0},getValence:function(e){var t=e||{};if(this.isNormalAtom()){var r,n=this.getExplicitValence(t);if(this.hasExplicitHydrogens())r=n;else{var o=t.ignoreCharge?0:Math.round(this.getCharge()||0);r=Kekule.ValenceUtils.getImplicitValence(this.getAtomicNumber(),o,n)}return r}return 0},getImplicitHydrogenCount:function(e){if(this.isNormalAtom()&&this._needToEsitmateImplicityHydrogens()){var t=this._getCurrCovalentBondsInfo(),r=this._getCurrIonicBondsInfo(),n=Math.round(this.getCharge()||0),o=Kekule.RadicalOrder.getRadicalElectronCount(this.getRadical()),i=this.getStructureCacheData("omittedBondHydrogenAtomCount")||0;return Kekule.ChemStructureUtils.getImplicitHydrogenCount(this.getAtomicNumber()||0,{coValenceBondValenceSum:(t.valenceSum||0)+i,otherBondValenceSum:r.valenceSum||0,charge:n,radic