diff --git a/pom.xml b/pom.xml
index bd256fe..6f3c8e7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
de.mpc.pia
pia
- 1.5.3
+ 1.5.4
PIA - Protein Inference Algorithms
https://github.com/mpc-bioinformatics/pia
diff --git a/src/main/java/de/mpc/pia/intermediate/compiler/parser/MzIdentMLFileParser.java b/src/main/java/de/mpc/pia/intermediate/compiler/parser/MzIdentMLFileParser.java
index 3633ce5..9d8c245 100755
--- a/src/main/java/de/mpc/pia/intermediate/compiler/parser/MzIdentMLFileParser.java
+++ b/src/main/java/de/mpc/pia/intermediate/compiler/parser/MzIdentMLFileParser.java
@@ -6,6 +6,7 @@
import de.mpc.pia.intermediate.PeptideSpectrumMatch;
import de.mpc.pia.intermediate.compiler.PIACompiler;
import de.mpc.pia.modeller.score.ScoreModel;
+import de.mpc.pia.modeller.score.ScoreModelEnum;
import de.mpc.pia.tools.MzIdentMLTools;
import de.mpc.pia.tools.OntologyConstants;
import de.mpc.pia.tools.obo.AbstractOBOMapper;
@@ -854,17 +855,24 @@ private ScoreModel parseOBOTermAsScore(Term oboTerm, String value) {
ScoreModel score = null;
if (oboTerm != null) {
- // the score is in the OBO file, get the relations etc.
- Set tripleSet = compiler.getOBOMapper().getTriples(oboTerm, null, null);
-
- for (Triple triple : tripleSet) {
- if (triple.getPredicate().getName().equals(AbstractOBOMapper.OBO_IS_A) &&
- triple.getObject().getName().equals(OntologyConstants.SEARCH_ENGINE_PSM_SCORE.getPsiAccession())) {
- // subject is a "search engine specific score for PSM"
- double doubleValue = Double.parseDouble(value);
- score = new ScoreModel(doubleValue,
- StringEscapeUtils.unescapeJava(oboTerm.getName()),
- StringEscapeUtils.unescapeJava(oboTerm.getDescription()));
+ ScoreModelEnum scEnum = ScoreModelEnum.getModelByAccession(oboTerm.getName());
+ if ((scEnum != null) && !scEnum.equals(ScoreModelEnum.UNKNOWN_SCORE)) {
+ // the term is a recognized / hard coded score
+ double doubleValue = Double.parseDouble(value);
+ score = new ScoreModel(doubleValue, scEnum);
+ } else {
+ // the score is in the OBO file, try to get the relations etc.
+ Set tripleSet = compiler.getOBOMapper().getTriples(oboTerm, null, null);
+
+ for (Triple triple : tripleSet) {
+ if (triple.getPredicate().getName().equals(AbstractOBOMapper.OBO_IS_A) &&
+ triple.getObject().getName().equals(OntologyConstants.SEARCH_ENGINE_PSM_SCORE.getPsiAccession())) {
+ // subject is a "search engine specific score for PSM"
+ double doubleValue = Double.parseDouble(value);
+ score = new ScoreModel(doubleValue,
+ StringEscapeUtils.unescapeJava(oboTerm.getName()),
+ StringEscapeUtils.unescapeJava(oboTerm.getDescription()));
+ }
}
}
}
diff --git a/src/test/java/de/mpc/pia/intermediate/IntermediateJAXBTest.java b/src/test/java/de/mpc/pia/intermediate/IntermediateJAXBTest.java
index 508e65a..4e8f7fb 100755
--- a/src/test/java/de/mpc/pia/intermediate/IntermediateJAXBTest.java
+++ b/src/test/java/de/mpc/pia/intermediate/IntermediateJAXBTest.java
@@ -5,59 +5,30 @@
import java.io.File;
import java.io.IOException;
-import org.apache.log4j.Logger;
-import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import de.mpc.pia.intermediate.xmlhandler.PIAIntermediateJAXBHandler;
-import de.mpc.pia.modeller.PIAModellerTest;
public class IntermediateJAXBTest {
- /** logger for this class */
- private static final Logger LOGGER = Logger.getLogger(IntermediateJAXBTest.class);
-
- private static File piaFile;
-
-
- @BeforeClass
- public static void setUpBeforeClass() {
- piaFile = new File(PIAModellerTest.class.getResource("/55merge_mascot_tandem.pia.xml").getPath());
- }
-
-
@Test
- public void testIntermediateJAXB() {
+ @Ignore("Unfortunately, loading Unmarshaller for mzid 1.1 and mzid 1.2 in same test suite breaks everything")
+ public void testIntermediateJAXB() throws IOException{
PIAIntermediateJAXBHandler intermediateHandler;
intermediateHandler = new PIAIntermediateJAXBHandler();
- Runtime runtime = Runtime.getRuntime();
- double mb = 1024*1024;
- final long startTime = System.nanoTime();
- final long endTime;
-
- try {
- intermediateHandler.parse(piaFile.getAbsolutePath(), null);
- } catch (IOException e) {
- LOGGER.error(e);
- }
-
- endTime = System.nanoTime();
-
- assertEquals(2, intermediateHandler.getFiles().size());
- assertEquals(2, intermediateHandler.getSpectraData().size());
- assertEquals(2, intermediateHandler.getSearchDatabase().size());
- assertEquals(2, intermediateHandler.getAnalysisSoftware().size());
- assertEquals(1941, intermediateHandler.getGroups().size());
- assertEquals(2131, intermediateHandler.getAccessions().size());
- assertEquals(2113, intermediateHandler.getPeptides().size());
- assertEquals(2478, intermediateHandler.getPSMs().size());
- assertEquals(1856, intermediateHandler.getNrTrees());
-
- LOGGER.info("Total Memory: " + runtime.totalMemory() / mb + " MB");
- LOGGER.info("Used Memory: " + (runtime.totalMemory() - runtime.freeMemory()) / mb + " MB");
- LOGGER.info("Free Memory: " + runtime.freeMemory() / mb + " MB");
- LOGGER.info("Max Memory: " + runtime.maxMemory() / mb + " MB");
- LOGGER.info("Execution time: " + ((endTime - startTime) / 1000000000.0) + " s");
+ File piaFile = new File(IntermediateJAXBTest.class.getResource("/55merge_mascot_tandem.pia.xml").getPath());
+ intermediateHandler.parse(piaFile.getAbsolutePath(), null);
+
+ assertEquals("Number of Files differ", 2, intermediateHandler.getFiles().size());
+ assertEquals("Number of SpectraData differ", 2, intermediateHandler.getSpectraData().size());
+ assertEquals("Number of SearchDatabases differ", 2, intermediateHandler.getSearchDatabase().size());
+ assertEquals("Number of AnalysisSoftware differ", 2, intermediateHandler.getAnalysisSoftware().size());
+ assertEquals("Number of Groups differ", 1941, intermediateHandler.getGroups().size());
+ assertEquals("Number of Accessions differ", 2131, intermediateHandler.getAccessions().size());
+ assertEquals("Number of Peptides differ", 2113, intermediateHandler.getPeptides().size());
+ assertEquals("Number of PSMs differ", 2478, intermediateHandler.getPSMs().size());
+ assertEquals("Number of NrTrees differ", 1856, intermediateHandler.getNrTrees());
}
}
diff --git a/src/test/java/de/mpc/pia/modeller/exporter/MzIdentML12Test.java b/src/test/java/de/mpc/pia/modeller/exporter/MzIdentML12Test.java
new file mode 100644
index 0000000..f745289
--- /dev/null
+++ b/src/test/java/de/mpc/pia/modeller/exporter/MzIdentML12Test.java
@@ -0,0 +1,35 @@
+package de.mpc.pia.modeller.exporter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import de.mpc.pia.intermediate.compiler.PIACompiler;
+import de.mpc.pia.intermediate.compiler.PIASimpleCompiler;
+
+
+public class MzIdentML12Test {
+
+ @Test
+ @Ignore("Unfortunately, loading Unmarshaller for mzid 1.1 and mzid 1.2 in same test suite breaks everything")
+ public void testMzIdentMLv1_2_0Import() {
+ PIACompiler piaCompiler = new PIASimpleCompiler();
+
+ File cometMzid12Results = new File(MzIdentML12Test.class.getResource("/comet_mzid12.mzid").getPath());
+ assertTrue(piaCompiler.getDataFromFile("mzid", cometMzid12Results.getAbsolutePath(), null, null));
+
+ piaCompiler.buildClusterList();
+ piaCompiler.buildIntermediateStructure();
+
+ piaCompiler.setName("testFile");
+
+ assertEquals("Wrong number of PIA Input files", 1, piaCompiler.getAllFileIDs().size());
+ assertEquals("Wrong number of imported peptides", 600, piaCompiler.getNrPeptides());
+ assertEquals("Wrong number of imported PSMs", 610, piaCompiler.getNrPeptideSpectrumMatches());
+ }
+}
diff --git a/src/test/java/de/mpc/pia/modeller/exporter/MzIdentMLExportAndImportTest.java b/src/test/java/de/mpc/pia/modeller/exporter/MzIdentMLExportAndImportTest.java
index 7647dc5..b76a182 100755
--- a/src/test/java/de/mpc/pia/modeller/exporter/MzIdentMLExportAndImportTest.java
+++ b/src/test/java/de/mpc/pia/modeller/exporter/MzIdentMLExportAndImportTest.java
@@ -7,12 +7,10 @@
import java.io.IOException;
import java.util.HashMap;
-import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import de.mpc.pia.intermediate.compiler.PIACompiler;
-import de.mpc.pia.intermediate.compiler.PIACompilerTest;
import de.mpc.pia.intermediate.compiler.PIASimpleCompiler;
import de.mpc.pia.modeller.PIAModeller;
import de.mpc.pia.modeller.protein.inference.SpectrumExtractorInference;
@@ -26,25 +24,11 @@
public class MzIdentMLExportAndImportTest {
- private File tandemIdXMLResults;
- private File tandemMzidResults;
- private String piaIntermediateFileName;
- /** logger for this class */
- private static final Logger LOGGER = Logger.getLogger(PIACompiler.class);
-
- @Before
- public void setUp() {
- piaIntermediateFileName = "PIACompilerTest.pia.xml";
-
- tandemIdXMLResults = new File(PIACompilerTest.class.getResource("/merge1-tandem-fdr_filtered-015.idXML").getPath());
- tandemMzidResults = new File(PIACompilerTest.class.getResource("/55merge_tandem.mzid").getPath());
- }
-
-
@Test
- public void testMzIdentMLv1_1_0Import() throws IOException {
+ public void testMzIdentMLv1_1_0Import() {
PIACompiler piaCompiler = new PIASimpleCompiler();
-
+
+ File tandemMzidResults = new File(MzIdentMLExportAndImportTest.class.getResource("/55merge_tandem.mzid").getPath());
assertTrue(piaCompiler.getDataFromFile("mzid", tandemMzidResults.getAbsolutePath(), null, null));
piaCompiler.buildClusterList();
@@ -52,15 +36,16 @@ public void testMzIdentMLv1_1_0Import() throws IOException {
piaCompiler.setName("testFile");
+ assertEquals("Wrong number of PIA Input files", 1, piaCompiler.getAllFileIDs().size());
assertEquals("Wrong number of imported peptides", 153, piaCompiler.getNrPeptides());
assertEquals("Wrong number of imported PSMs", 170, piaCompiler.getNrPeptideSpectrumMatches());
}
-
@Test
public void testMzIdentMLExportAndImport() throws IOException {
PIACompiler piaCompiler = new PIASimpleCompiler();
+ File tandemIdXMLResults = new File(MzIdentMLExportAndImportTest.class.getResource("/merge1-tandem-fdr_filtered-015.idXML").getPath());
assertTrue(piaCompiler.getDataFromFile("tandem", tandemIdXMLResults.getAbsolutePath(), null, null));
piaCompiler.buildClusterList();
@@ -73,6 +58,7 @@ public void testMzIdentMLExportAndImport() throws IOException {
// write out the file
+ String piaIntermediateFileName = "testMzIdentMLExportAndImport.pia.xml";
File piaIntermediateFile = File.createTempFile(piaIntermediateFileName, null);
piaCompiler.writeOutXML(piaIntermediateFile);
piaCompiler.finish();
@@ -110,7 +96,6 @@ public void testMzIdentMLExportAndImport() throws IOException {
// try to read it back in PIA compiler
- LOGGER.info("Try to read back the mzIdentML previously compiled");
piaCompiler = new PIASimpleCompiler();
assertTrue(piaCompiler.getDataFromFile("mzIdentMLfile", exportFile.getAbsolutePath(), null, null));
diff --git a/src/test/resources/comet_mzid12.mzid b/src/test/resources/comet_mzid12.mzid
new file mode 100644
index 0000000..46e5ef3
--- /dev/null
+++ b/src/test/resources/comet_mzid12.mzid
@@ -0,0 +1,12980 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AAAENSDAWTHWR
+
+
+ AAEFDFMADVVK
+
+
+
+
+
+ AANEHCFLEVGR
+
+
+ AASSAGQTEARACR
+
+
+ ADFIMNR
+
+
+
+
+
+ ADYLHFK
+
+
+ AEFTSLTK
+
+
+ AENDMAMKR
+
+
+
+
+
+ AENDMAMKR
+
+
+
+
+
+ AFCAGGDIR
+
+
+ AFDQASSR
+
+
+ AGAVTSTPNR
+
+
+ AGEEGEEEDDPFYPNR
+
+
+ AGEQANGQKK
+
+
+ AGLQMKSPEK
+
+
+
+
+
+ AHTPVYR
+
+
+ AHWEVER
+
+
+ AIFGAGCDR
+
+
+ AIMDRMNKDNNALR
+
+
+
+
+
+
+
+
+ AIYGASLK
+
+
+ AKAAEDARTQAPR
+
+
+ AKDQLTCNKFDLK
+
+
+ AKTLEIEACR
+
+
+ ALPTSKPEGSLHSSPVGPSSSK
+
+
+ ALYTATEK
+
+
+ ALYTSVDK
+
+
+ AMLHDLYAYVDNGYR
+
+
+ APVPTSQSSPPRRGPQSSSAR
+
+
+ AQTMPASVSELEFER
+
+
+ ARAGSEGRGCQPVCSR
+
+
+ ARASGGERGSCVPCQR
+
+
+ ARGGQTNLEDGK
+
+
+ ARGRVVNMSSSGGR
+
+
+ ASRRMLEEER
+
+
+
+
+
+ ATAENQALR
+
+
+ ATEGQSKPR
+
+
+ ATHVPYR
+
+
+ AWHVEER
+
+
+ AYAEELASR
+
+
+ AYDHLFK
+
+
+ AYLNGDGSGR
+
+
+ AYVHEFK
+
+
+ CCSHCGLKCMDPRR
+
+
+
+
+
+ CDVCGKEFSQSSR
+
+
+ CECESTVDNGK
+
+
+ CESMLLDETK
+
+
+
+
+
+ CFLIETAK
+
+
+ CSCFPGQVAGTTR
+
+
+ CSDLTLEEMK
+
+
+
+
+
+ CSEQVQDFTK
+
+
+ CVDGCKESFSQSR
+
+
+ CYCEKACK
+
+
+ CYSNQLVSDR
+
+
+ DAASKVAVPMR
+
+
+
+
+
+ DCGRMLTR
+
+
+ DCGSESLGMER
+
+
+
+
+
+ DDEKDQDEK
+
+
+ DDVTDEEMER
+
+
+
+
+
+ DDWLHNR
+
+
+ DEPINCESFK
+
+
+ DGADGIEKAVEPMVR
+
+
+ DGDVDQGFR
+
+
+ DHSDSESTSSDNSGR
+
+
+ DIKPIIK
+
+
+ DILHTQHVTQSR
+
+
+ DINTIEDAVK
+
+
+ DKDGPCLCSAGPCSDSK
+
+
+ DKIIPIK
+
+
+ DMDETEVEDR
+
+
+
+
+
+ DMGTVTITSGNPSMSR
+
+
+
+
+
+
+
+
+ DMSQEDRK
+
+
+ DPAYLKDPKVCNIR
+
+
+ DPDASKPEDWDER
+
+
+ DPDEDNGGEPEK
+
+
+ DQEQVVMNLDSR
+
+
+ DQESPKMPR
+
+
+ DRDLATPWDTR
+
+
+ DSDTGWTALHEACNRGYYDVAK
+
+
+ DTLDENGVLITSR
+
+
+ DTSQGEYWR
+
+
+ DWDHLNR
+
+
+ EAAMGQGFDR
+
+
+ EACFPVNLANEER
+
+
+ EAEGAEEDGR
+
+
+ EAPGAADER
+
+
+ ECKHNDCR
+
+
+ ECKQRYSIC
+
+
+ ECRAGHK
+
+
+ EDAGGEEEAR
+
+
+ EDEDTELR
+
+
+ EDGSCFGGGGGGPDSAR
+
+
+ EEGERPPCGEGGER
+
+
+ EEGQERR
+
+
+ EEGVDMLR
+
+
+
+
+
+ EELLPHLLPLLK
+
+
+ EEPSNDNVIK
+
+
+ EGAGVPGAAFPEPAGTR
+
+
+ EGCVDSRAEQLER
+
+
+ EGDCGFGDGGPSGASGR
+
+
+ EGGGPSTPR
+
+
+ EGPASWREGR
+
+
+ EIENKAIQDPR
+
+
+ EKAEPSDLK
+
+
+ EKAPEDSLK
+
+
+ EKEMVEK
+
+
+ EKNSTSNHQVLK
+
+
+ ELAGHTGYLSCCR
+
+
+ ELALGQDR
+
+
+ ELESEKGLTQER
+
+
+ ELGVVMYNCSCLAR
+
+
+
+
+
+ ELKVLTLQNNQLK
+
+
+ ELNQIDELR
+
+
+ ELQDSSMDLSENR
+
+
+ EMHCGVASRWR
+
+
+
+
+
+ EMLDKTKMAMEK
+
+
+
+
+
+ ENLFILEEEQR
+
+
+ ENSEAEGDNR
+
+
+ ENVTMEQLR
+
+
+ EPACMWCCAPGSR
+
+
+ EPDATPMR
+
+
+ EPKAHCR
+
+
+ EQMMEAHK
+
+
+
+
+
+ EQSIFGDHRDEEEETHMK
+
+
+ ERECKEEMHR
+
+
+ ERVWEGSGDSEPDIPK
+
+
+ ERYTQAK
+
+
+ ESAPIKEPK
+
+
+ ESKEEETSIDVAGKPNEVTK
+
+
+ ESLLDKK
+
+
+ ESMSSGVDLSMNHK
+
+
+ ESQSVEEALK
+
+
+ ESRAWAPR
+
+
+ ESVVDYCNR
+
+
+ ETNISYSQEADDR
+
+
+ ETSREGTSSFHTR
+
+
+ EVISVYDK
+
+
+ EVLHGNQR
+
+
+ EVVRYLGGSGGAGGR
+
+
+ FCKHLESTELR
+
+
+ FDAPEDSHLEK
+
+
+ FGALTAEK
+
+
+ FGNKECK
+
+
+ FNLDISK
+
+
+ FNTTAVPK
+
+
+ FQDMLNNKECK
+
+
+
+
+
+ FQVLDSK
+
+
+ FSEGEATLR
+
+
+ FYSYGLEK
+
+
+ GADIDAVDIK
+
+
+ GAEGGSPEEAGGGRER
+
+
+ GAEGPEAER
+
+
+ GAPISVYQVIVEEER
+
+
+ GAPSAGRER
+
+
+ GASANWWNHR
+
+
+ GEAEASAGEATRAPIR
+
+
+ GELPGKGSEAGPVGK
+
+
+ GGHFSQAR
+
+
+ GGPASVPSSSPGTSVK
+
+
+ GKMWEEAISLCK
+
+
+
+
+
+ GLGGPAPPEPDSGPQR
+
+
+ GLYDPAYVDDSWER
+
+
+ GMGASVFSSGASGR
+
+
+
+
+
+ GNCTWGMNCR
+
+
+ GNGTAQSADLR
+
+
+ GPDEGIDGR
+
+
+ GPRAPPRPGPPDPAYR
+
+
+ GQSIRYGSRTCK
+
+
+ GRDEGCISQR
+
+
+ GSASGNALGRCCR
+
+
+ GSGPVLDLSSNPPCER
+
+
+ GSSYGVTSTESYK
+
+
+ GTAGNALMDGASQLMGENR
+
+
+
+
+
+ GTAGNALMDGASQLMGENR
+
+
+
+
+
+ GTAPGKTCLPR
+
+
+ GTGSAIPFLPSIEGENQKGCK
+
+
+ GTLDGGFR
+
+
+ GTVRPANDFNPDADAK
+
+
+ GVTSEEFDKFLEER
+
+
+ GWGGPSRGCQSAEEPER
+
+
+ GYMMMFPR
+
+
+
+
+
+
+
+
+ GYMMMFPR
+
+
+
+
+
+
+
+
+ GYMMMFPR
+
+
+
+
+
+
+
+
+ HCRTYCEGKGPGCHEHTK
+
+
+ HDFSLFK
+
+
+ HDYIFK
+
+
+ HHRRGSPEEAAER
+
+
+ HPPTNTTK
+
+
+ HQSHTAEAGPR
+
+
+ HQTQPR
+
+
+ HRNTETSKSPEK
+
+
+ HTSLESNHTGMQR
+
+
+
+
+
+ HYDRNKDGNK
+
+
+ HYVLCYSDAEDR
+
+
+ IASSEMCGSK
+
+
+
+
+
+ ICKANASPGK
+
+
+ IDKPILK
+
+
+ IESSDTFSFCCTNER
+
+
+ IGALQGAVDR
+
+
+ IGYSGSRSR
+
+
+ IITPFIIENILK
+
+
+ IKDEDEAKDPSWPDR
+
+
+ IKDIPLK
+
+
+ IKDPDASKPEDWDER
+
+
+ ILGGVPAPERK
+
+
+ ILHGEVNKVK
+
+
+ ILKHLQEQK
+
+
+ ILQEGVDPK
+
+
+ ILQQDAGAGEK
+
+
+ INLLAGDAAK
+
+
+ IPCNSDNALSR
+
+
+ IQDPTEDAEAEDTPR
+
+
+ ISDLDLLR
+
+
+ ISEEDELDTK
+
+
+ ISEPMEAHNEGSNLER
+
+
+ ISNGQPFDTLRSLPR
+
+
+ ISQSAEYR
+
+
+ ITDMHFCVR
+
+
+ ITTTFPAVHALMTDFMLR
+
+
+
+
+
+
+
+
+ IVELVEQR
+
+
+ IVGDLGAAQR
+
+
+ IVITDFGK
+
+
+ IVSNNCTDGLR
+
+
+ KAKGGLSER
+
+
+ KAMMQQK
+
+
+
+
+
+
+
+
+ KAPETAER
+
+
+ KAQFKGELFPFK
+
+
+ KAQQMMK
+
+
+
+
+
+
+
+
+ KDEDDVRDSAPR
+
+
+ KDMRGHR
+
+
+ KDWEAPTSR
+
+
+ KEAGKELHNK
+
+
+ KEDQFR
+
+
+ KEFPNDQVK
+
+
+ KEGAKEHNLK
+
+
+ KGDSSAEELK
+
+
+ KGFEVEK
+
+
+ KGITLEYEAK
+
+
+ KGMLYCDDLR
+
+
+
+
+
+ KGTEELYAIK
+
+
+ KIMGGSGTETTLEK
+
+
+
+
+
+ KKVEAQLQELQVK
+
+
+ KLDPLLK
+
+
+ KLILMQK
+
+
+ KLLATDSLFK
+
+
+ KLLIQMK
+
+
+ KLMVALAK
+
+
+ KLVMLAAK
+
+
+ KMMNEMER
+
+
+
+
+
+ KMMNEMER
+
+
+
+
+
+ KMNMMEER
+
+
+
+
+
+ KMVQEDEK
+
+
+ KMWIIFGEK
+
+
+ KPALVSTVEGGQDPK
+
+
+ KPFNFLPMQINTNK
+
+
+ KPFSQHVR
+
+
+ KPGDLSDELR
+
+
+ KPPKPQLMANYYNK
+
+
+ KPTKPESQSPGKR
+
+
+ KQMQELNMQEVR
+
+
+ KQQMLENQMEVR
+
+
+ KRPVGEQKELLNK
+
+
+ KRVDHCPIK
+
+
+ KRVHDPCIK
+
+
+ KSETDSVK
+
+
+ KTAEHTGEGRPAK
+
+
+ KTGMETR
+
+
+ KYRDCR
+
+
+ LAAAEGLEPK
+
+
+ LAIKLMTNLALGR
+
+
+ LATEQLNR
+
+
+ LCELQPEEK
+
+
+ LCKLKSNTNNMVEELER
+
+
+
+
+
+ LCNQITSLLPTHK
+
+
+ LCRDCIPR
+
+
+ LDNWAQLEK
+
+
+ LDVNAAGIWEPK
+
+
+ LEAAQERYMDAMSDAK
+
+
+
+
+
+
+
+
+ LERDTRYVSSR
+
+
+ LFQLEK
+
+
+ LGADGDPSK
+
+
+ LGDPAEEKR
+
+
+ LGMEALAGTEGP
+
+
+ LGTQSTGPGR
+
+
+ LGVTYPK
+
+
+ LGVYPTK
+
+
+ LHTHARTFNIGKTPECHK
+
+
+ LITGPSEKGP
+
+
+ LKEDSPR
+
+
+ LKTEGNEQMK
+
+
+
+
+
+ LLLDIRHEK
+
+
+ LLLQVQHASK
+
+
+ LLMSMR
+
+
+
+
+
+ LLQKVYQNK
+
+
+ LLTTEMKMDMLK
+
+
+
+
+
+ LMSTRFNQVTTR
+
+
+
+
+
+ LNDEVIMNR
+
+
+
+
+
+ LNETLCACFSTAGK
+
+
+ LNSEWPKDHDSMEAR
+
+
+ LPEIVQNLEDQPK
+
+
+ LQDMEAQAGWAAPGEAR
+
+
+ LQETLSAADR
+
+
+ LQFELK
+
+
+ LQLKVQNYK
+
+
+ LQNVEQLPPDEIK
+
+
+ LQQAQEMLK
+
+
+
+
+
+ LRALHYGR
+
+
+ LSAGLAEAGR
+
+
+ LSGPDDDPLHK
+
+
+ LSHCQFAT
+
+
+ LSNWEPKDDAMSEHR
+
+
+ LSSEMNTSTVNSAR
+
+
+ LSTMRFQNTVTR
+
+
+
+
+
+ LTGVDPSR
+
+
+ LTNLNVDR
+
+
+ LTNQELAR
+
+
+ LTSPETELR
+
+
+ LTTAPHGSKQQGTKE
+
+
+ LVELEQVR
+
+
+ LVGYTPK
+
+
+ LVNVDDNQEVLK
+
+
+ LVQLGQAEK
+
+
+ LWVCYARCCR
+
+
+ LYHNDNQDIR
+
+
+ MAATAAAGSR
+
+
+ MALVKLAK
+
+
+ MAMTQEHHMEPMTSMFFK
+
+
+ MCKVNCSDDR
+
+
+
+
+
+ MEMPSERK
+
+
+ MEQSSDKSSAKEK
+
+
+ MFDSQVTEER
+
+
+ MGLVMDRMGSVER
+
+
+
+
+
+ MKRSASGSGVGSR
+
+
+
+
+
+ MLDQAAPVEEKACKFCMMSPR
+
+
+
+
+
+
+
+
+ MLDQAAPVEEKACKFCMMSPR
+
+
+
+
+
+
+
+
+ MLELNEEWSFEK
+
+
+
+
+
+ MLETEIKVCR
+
+
+
+
+
+ MLRDTMK
+
+
+
+
+
+
+
+
+ MMMMSLNSK
+
+
+
+
+
+
+
+
+
+
+
+ MNVFNIR
+
+
+ MPDDYGAPR
+
+
+ MPFHLPFDFFKR
+
+
+ MPPYDGDAR
+
+
+ MPSAKSEQVK
+
+
+ MPSGAGADTLAK
+
+
+ MPVDWKSSHTR
+
+
+ MRESALER
+
+
+
+
+
+ MRESQDAAGAHGWNR
+
+
+ MRHNTEKHCK
+
+
+
+
+
+ MSDTLECLLTDAK
+
+
+ MTSDSPSPSEYCSYPK
+
+
+
+
+
+ MVPVGASNAGAK
+
+
+
+
+
+ MVPWDKSTSHR
+
+
+ NAQWMPR
+
+
+
+
+
+ NCREVVNGSNGCR
+
+
+ NCTIVSPDAGGAK
+
+
+ NDGAISTPVGCAK
+
+
+ NDIYSVSR
+
+
+ NESSMLSDKSRTSMR
+
+
+
+
+
+ NFNLENR
+
+
+ NGSSFQKK
+
+
+ NHLKHSSSLK
+
+
+ NKFCKLNHDEAR
+
+
+ NLNLADEDKSCR
+
+
+ NMAPGAVCSPGESK
+
+
+ NNFELNR
+
+
+ NNVCTRAGFMSK
+
+
+
+
+
+ NPDGIPR
+
+
+ NPHTVAEK
+
+
+ NPMYTEHKGKYE
+
+
+
+
+
+ NPSVSLVEER
+
+
+ NSDGQKSPACNAR
+
+
+ NSDSYVIR
+
+
+ NSGVTANGGPGSK
+
+
+ NSPIVDKQCK
+
+
+ NSQLVCVQGPW
+
+
+ NTEALLGPADPSASSR
+
+
+ NTEMCNVMMQLR
+
+
+ NTGFYGYHNHR
+
+
+ NYMQDSEDDRIENNHGNPEDNDAYSSK
+
+
+
+
+
+ QAGIFCDR
+
+
+ QCYLQQVK
+
+
+ QEDAERR
+
+
+ QEDLRNQK
+
+
+ QEIEERAR
+
+
+ QELGWLER
+
+
+ QEMFHATVATEKEFFFVK
+
+
+ QETKSPGGAR
+
+
+ QFGQKLQDLAEHSDPEVR
+
+
+ QFYEYTR
+
+
+ QGGGELNGSGHGNGGGYSQK
+
+
+ QGTFHSQQALEYGTK
+
+
+ QGVDGEPR
+
+
+ QGVDIEAAR
+
+
+ QHLENDPGSNEDTDIPK
+
+
+ QHLFMFVQTMR
+
+
+
+
+
+
+
+
+ QILNLQHLR
+
+
+ QLDKTLGPESWPGR
+
+
+ QMAFSVLNTDEMER
+
+
+
+
+
+ QMLFVSGER
+
+
+ QMSKYPSGER
+
+
+
+
+
+ QNKPSSVIQPKRR
+
+
+ QPDEKNCQ
+
+
+ QPEGTPLNHFR
+
+
+ QPEVLIWGEDHPLR
+
+
+ QPGQPAPATGGPYAR
+
+
+ QPMKVYER
+
+
+
+
+
+ QPNCEENK
+
+
+ QPYHQYEMPR
+
+
+
+
+
+ QQICNQQPPCSR
+
+
+ QQLGGGDASTAECVR
+
+
+ QRGHEAEESR
+
+
+ QRGSHEAEER
+
+
+ QSDIMMR
+
+
+ QSLMEMQSR
+
+
+
+
+
+
+
+
+ QSMKYSPEGR
+
+
+
+
+
+ QSPFASSSEHSSENGSLR
+
+
+ QSSEMMLQR
+
+
+
+
+
+
+
+
+ QSTWEKPDDLK
+
+
+ QTIGNSCKACGYR
+
+
+ QTPALRQCR
+
+
+ QVEVGGQGSMYADR
+
+
+
+
+
+ QVPNSNPAR
+
+
+ QVREPSDK
+
+
+ QWASVPR
+
+
+ QYLKEDAGTNLPVVR
+
+
+ QYVYNVAK
+
+
+ RAPLGLLR
+
+
+ RASGVTHMGSELR
+
+
+
+
+
+ RCAHGCNLSGR
+
+
+ RCAYRAPDMTGR
+
+
+ RCTPPSCPPPSSSEPR
+
+
+ REDPQACIEEQLCYSCR
+
+
+ REPEQEQGPEPELR
+
+
+ REQEAREQAIR
+
+
+ RESYARER
+
+
+ RFKCCR
+
+
+ RGFNTSLMGSSKECR
+
+
+
+
+
+ RGLPALLR
+
+
+ RGPLLALR
+
+
+ RGTRPSHPSLMK
+
+
+
+
+
+ RITTAVER
+
+
+ RKEEEDQR
+
+
+ RLQGPRICNWPK
+
+
+ RLQIPIR
+
+
+ RMGECWKEEMR
+
+
+
+
+
+ RMPPPER
+
+
+
+
+
+ RNSMSVGDK
+
+
+
+
+
+ RPGALLLR
+
+
+ RPGWLRGSPPPTEPR
+
+
+ RQPFSGHR
+
+
+ RQQDLQR
+
+
+ RSAGDVAPPK
+
+
+ RSGGGPGSGEAGTGAPCGR
+
+
+ RTYCQGRGPECHATSK
+
+
+ RVVMLTMEER
+
+
+
+
+
+
+
+
+ RYHSMFDDFHR
+
+
+
+
+
+ SAACAYVTGLVMCIR
+
+
+
+
+
+ SAEEEAADLPTKPTK
+
+
+ SAFGFDDGNFPGLGER
+
+
+ SCKTDTSR
+
+
+
+ SEECQWDYGK
+
+
+ SEIVGSIK
+
+
+ SELGVLSK
+
+
+ SEPAFQSGSESRGR
+
+
+ SEQPTLVTASK
+
+
+ SEQSLLIENK
+
+
+ SESIQSEVCDGPLK
+
+
+ SFGSTCQLSEK
+
+
+ SFPTSSSATTESR
+
+
+ SFSMVNAQMNEER
+
+
+
+
+
+ SFYSSHYARER
+
+
+ SGFQGEWDR
+
+
+ SGHGCISCK
+
+
+ SGISTAMEKHK
+
+
+ SGTCSGASGFR
+
+
+ SHLVHGSSPGVMGTSVATSASK
+
+
+ SIEGVSIK
+
+
+ SIMTSAEGKHK
+
+
+ SIPELCCWCPCT
+
+
+ SKNNCQNQPPSK
+
+
+ SLDFNMR
+
+
+ SLETYER
+
+
+ SLHHQSSSSEFNR
+
+
+ SLNFSSATEPMMFQR
+
+
+ SLPTHLFRQYSCLRSQR
+
+
+ SLQDNEERDEAHK
+
+
+ SLSPEQDIK
+
+
+ SLVTDAMPEDIR
+
+
+ SNDCETFWDK
+
+
+ SPDELPSAGGDGGK
+
+
+ SPQDVKMCKFCR
+
+
+
+
+
+ SPVSTGADTTTR
+
+
+ SRVLPSTLMAPPLR
+
+
+ SSLMELAMKNCR
+
+
+
+
+
+ SSQSSSQQFSGIGR
+
+
+ SSSQGISQFGQSSR
+
+
+ SSTSSLATDKATSR
+
+
+ SSVCSSLNSVNSSDSR
+
+
+ STGAEPGLAR
+
+
+ SVTEQGAELSNEER
+
+
+ SWTYELFTNK
+
+
+ SYPSLTTK
+
+
+ TCKESCLSEK
+
+
+ TCKMGTNK
+
+
+
+
+
+ TDGFGIDTCR
+
+
+ TDILDKK
+
+
+ TDTAHPAGTVSMSYIK
+
+
+
+
+
+ TEAAAADAGPAAGAGAGEAR
+
+
+ TESVLRYPMYR
+
+
+ TGALCSR
+
+
+ TGLDNQSQDSEDESDEDSSSTSHLSMLQQ
+
+
+ THSNSQQGTSSMLEDDLQLSDSEDSDSEQ
+
+
+ THTGEKPYDCR
+
+
+ TIPHPGGPGGR
+
+
+ TLEEDKKGQHK
+
+
+ TLGQAEALDK
+
+
+ TLGTPTQPGSTPR
+
+
+ TLLDQEGAAK
+
+
+ TLQISYDALK
+
+
+ TMCGRQLAEK
+
+
+ TMTNALR
+
+
+
+
+
+ TPEQADSSWR
+
+
+ TPKCENGCKALHTYSSSCQFR
+
+
+ TPKCGEECKTSFK
+
+
+ TPLPTRSDVLSPR
+
+
+ TPPVRSTAPASLSR
+
+
+ TPTIFDTR
+
+
+ TRDESR
+
+
+ TREDSR
+
+
+ TRLAAWAR
+
+
+ TSPQAGNPTCESR
+
+
+ TTYLQVR
+
+
+ TVEFVAER
+
+
+ TVLDDCGCCR
+
+
+ TVLPFEAMPR
+
+
+ TVMEDDLDK
+
+
+
+
+
+ TVTISQVSDNK
+
+
+ TVTNVYTR
+
+
+ TVVDSGGYR
+
+
+ TYNIKNK
+
+
+ TYNVTDDK
+
+
+ TYTQLVR
+
+
+ VAALGLDPDK
+
+
+ VANFDPGTFSLMR
+
+
+
+
+
+ VASGPCSDLHTGR
+
+
+ VAVTAMETAAR
+
+
+ VCAHCFGLSK
+
+
+ VCRDIPIGAGGQRESPGEAK
+
+
+ VDKCSR
+
+
+ VDSPLPSDK
+
+
+ VEHHGLGGADK
+
+
+ VGAGLSEMEQQIR
+
+
+ VGASAHDDSLEEK
+
+
+ VHAQDTSVTCESDDENSDTPPDMYEPSK
+
+
+
+
+
+ VHVPQGGGK
+
+
+ VIGSGCNLDSAR
+
+
+ VIIYQEK
+
+
+ VKKILYEDK
+
+
+ VLADSCGNGSIR
+
+
+ VLDFASLK
+
+
+ VLLAFSDK
+
+
+ VLMAGSRDLDR
+
+
+
+
+
+ VLPGMHHPIQMK
+
+
+ VLQEYLK
+
+
+ VLVIDITSLRQR
+
+
+ VNEVNQFAAK
+
+
+ VPHQMR
+
+
+ VPKDISALPITCETR
+
+
+ VPQHMR
+
+
+ VPVPIRTACPATR
+
+
+ VQNEGSWNSYVDYK
+
+
+ VSAGFLDK
+
+
+ VSEISSVPASDR
+
+
+ VSLPCGDDMDGGKR
+
+
+
+
+
+ VSPDSDLPK
+
+
+ VSRSFPFVSK
+
+
+ VTGTQEPGAGRPSK
+
+
+ VTLMFPNGDSAFR
+
+
+
+
+
+ VTNKSQIR
+
+
+ VTQEAGEFMITFPYGYHAGFNH
+
+
+
+
+
+ VVGFELDTPDR
+
+
+ VVTKPGHIINPIK
+
+
+ VYVGNLGNNGNK
+
+
+ WAGHQAAGR
+
+
+ WAVGRDGPQAPR
+
+
+ WGGCSADVR
+
+
+ WLFWRPAAECGLRQQDR
+
+
+ WLSGQMSRMQTSEMR
+
+
+
+
+
+
+
+
+ WLSGQMSRMQTSEMR
+
+
+
+
+
+
+
+
+ WPGPPVAPDQLEEVFSQHR
+
+
+ WQASKGGIRMGAR
+
+
+
+
+
+ YAAAPDR
+
+
+ YALTGDER
+
+
+ YCKLDQCTR
+
+
+ YELISETGGSHDK
+
+
+ YELYNKCCRK
+
+
+ YFYPEPGAQDADERR
+
+
+ YICENQDSISSK
+
+
+ YIQVATK
+
+
+ YKNEKELQEVIQQQNEK
+
+
+ YLCMATNAAGTDR
+
+
+ YQALLSK
+
+
+ YQIAVTK
+
+
+ YQLAVTK
+
+
+ YTIHSQLEHLQSK
+
+
+ YYHRGAFFMDEDEEVYK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ((?<=[KR]) (?!P))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+