From b9ccdb79940291cfafb32f36d6ff12adc8414021 Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 19 Jun 2026 15:32:33 +0200 Subject: [PATCH 01/20] added retry strategy for open ai --- src/aoptk/text_generation_api.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index 4e9c4da4..ed1d87c4 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -3,6 +3,7 @@ import os from itertools import product from pathlib import Path +import random from typing import Literal import pandas as pd from dotenv import load_dotenv @@ -48,6 +49,8 @@ class TextGenerationAPI( top_p: float = 1 load_dotenv() client: OpenAI + max_retries: int = 5 + timeout: int = random.randint(10, 100) prompts_dir: Path = Path(__file__).resolve().parent / "prompts" chemical_prompt_template: str = "chemical_prompt.txt" relationship_text_prompt_template: str = "relationship_text_prompt.txt" @@ -72,6 +75,8 @@ def __init__( self.client = OpenAI( base_url=self.url, api_key=self.api_key, + max_retries=self.max_retries, + timeout=self.timeout, ) def find_relationships_in_text( From ae8e06ab7847f6f5759b4fdf87584c7516ec374b Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 19 Jun 2026 15:50:11 +0200 Subject: [PATCH 02/20] lint and changed timeout --- src/aoptk/text_generation_api.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index ed1d87c4..7dceb6de 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -3,7 +3,6 @@ import os from itertools import product from pathlib import Path -import random from typing import Literal import pandas as pd from dotenv import load_dotenv @@ -50,7 +49,7 @@ class TextGenerationAPI( load_dotenv() client: OpenAI max_retries: int = 5 - timeout: int = random.randint(10, 100) + timeout: int = 120 prompts_dir: Path = Path(__file__).resolve().parent / "prompts" chemical_prompt_template: str = "chemical_prompt.txt" relationship_text_prompt_template: str = "relationship_text_prompt.txt" From e5d7fe0eaef0a1203c8f716eb43fc7c5fbf8c93f Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 19 Jun 2026 15:51:41 +0200 Subject: [PATCH 03/20] readded random timeout --- src/aoptk/text_generation_api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index 7dceb6de..f062a48b 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -3,6 +3,7 @@ import os from itertools import product from pathlib import Path +import random from typing import Literal import pandas as pd from dotenv import load_dotenv @@ -49,7 +50,7 @@ class TextGenerationAPI( load_dotenv() client: OpenAI max_retries: int = 5 - timeout: int = 120 + timeout: int = random.randint(30, 160) prompts_dir: Path = Path(__file__).resolve().parent / "prompts" chemical_prompt_template: str = "chemical_prompt.txt" relationship_text_prompt_template: str = "relationship_text_prompt.txt" From a03e8377bd4943eafce9c847c3f2c4c6773a0289 Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 19 Jun 2026 15:55:30 +0200 Subject: [PATCH 04/20] removed random --- src/aoptk/text_generation_api.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index f062a48b..7dceb6de 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -3,7 +3,6 @@ import os from itertools import product from pathlib import Path -import random from typing import Literal import pandas as pd from dotenv import load_dotenv @@ -50,7 +49,7 @@ class TextGenerationAPI( load_dotenv() client: OpenAI max_retries: int = 5 - timeout: int = random.randint(30, 160) + timeout: int = 120 prompts_dir: Path = Path(__file__).resolve().parent / "prompts" chemical_prompt_template: str = "chemical_prompt.txt" relationship_text_prompt_template: str = "relationship_text_prompt.txt" From b598965c93468e4ee314880bd5ee478c3f032141 Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 19 Jun 2026 16:49:19 +0200 Subject: [PATCH 05/20] added problematic text for test purposes --- tests/test_data/PMC11780512.txt | 651 ++++++++++++++++++++++++++++++++ 1 file changed, 651 insertions(+) create mode 100644 tests/test_data/PMC11780512.txt diff --git a/tests/test_data/PMC11780512.txt b/tests/test_data/PMC11780512.txt new file mode 100644 index 00000000..80b70fdd --- /dev/null +++ b/tests/test_data/PMC11780512.txt @@ -0,0 +1,651 @@ + +JOURNAL INFORMATION +============================== +NLM Title Abbreviation: Theranostics +Journal ID: Theranostics +Journal ID: thno + +Theranostics + +EISSN: 1838-7640 +Publisher: Ivyspring International Publisher + +ARTICLE INFORMATION +============================== +PMCID: PMC11780512 +PMID: 39897559 +DOI: 10.7150/thno.99562 +Article ID: thnov15p2006 +Article version: 1 +Subjects: Research Paper + +Silybin A from Silybum marianum reprograms lipid metabolism to induce a cell fate-dependent class switch from triglycerides to phospholipids + +Koeberle Solveigh C. 1 2 † ✉ +Thürmer Maria 3 † +Su Fengting 1 2 +Werner Markus 3 +Grander Julia 2 +Hofer Laura 2 +Gollowitzer André 2 +Xuan Loc Le 2 +Benscheid Felix J. 2 +Bonyadi Rad Ehsan 2 +Zarrelli Armando 4 +Di Fabio Giovanni 4 +Werz Oliver 3 +Romanucci Valeria 4 +Lupp Amelie 5 +Koeberle Andreas 1 2 3 ✉ +1 Institute of Pharmaceutical Sciences/Pharmacognosy and Excellence Field BioHealth, University of Graz, 8010 Graz, Austria. +2 Michael Popp Institute and Center for Molecular Biosciences Innsbruck (CMBI), University of Innsbruck, 6020 Innsbruck, Austria. +3 Department of Pharmaceutical/Medicinal Chemistry, Institute of Pharmacy, Friedrich Schiller University Jena, 07743 Jena, Germany. +4 Department of Chemical Sciences, University of Napoli Federico II, I-80126 Naples, Italy. +5 Institute of Pharmacology and Toxicology, Jena University Hospital, Jena, Germany. +✉ Corresponding authors: Andreas Koeberle, University of Graz, Graz, 8010, Austria. Solveigh C. Koeberle, University of Graz, Graz, 8010, Austria. +43 316 380 - 8630. E-mail addresses: andreas.koeberle@uni-graz.at (Andreas Koeberle). solveigh.koeberle@uni-graz.at (Solveigh Koeberle).†These authors made equal contributions to this work. + +Competing Interests: AK received grant support from and was an advisor to Bionorica SE. AK and OW performed contract research for Bionorica SE. The other authors declare no conflicts of interest. + +Publication date: 2025 +Electronic publication date: 2025 Jan 6 +Volume: 15 +Issue: 5 +First page: 2006 +Last page: 2034 +Received 2024 Jun 12; Accepted 2024 Nov 25 +Copyright: © The author(s) +Copyright year: 2025 +License: This is an open access article distributed under the terms of the Creative Commons Attribution License (https://creativecommons.org/licenses/by/4.0/). See https://ivyspring.com/terms for full terms and conditions. +License URL: https://creativecommons.org/licenses/by/4.0/ + +Keywords: silybin, liver, lipid metabolism, triglycerides, phospholipids + +Ÿ==============================Ÿ +Rationale: Silybum marianum is used to protect against degenerative liver damage. The molecular mechanisms of its bioactive component, silybin, remained enigmatic, although membrane-stabilizing properties, modulation of membrane protein function, and metabolic regulation have been discussed for decades. + +Methods: Experiments were performed with hepatocyte cell lines and primary monocytes in vitro under both basal and stressed conditions, and in mice in vivo. Quantitative lipidomics was used to detect changes in phospholipids and triglycerides. Key findings were confirmed by Western blotting, quantitative PCR, microscopy, enzyme activity assays, metabolic flux studies, and functional relationships were investigated using selective inhibitors. + +Results: We show that specifically the stereoisomer silybin A decreases triglyceride levels and lipid droplet content, while enriching major phospholipid classes and maintaining a homeostatic phospholipid composition in human hepatocytes in vitro and in mouse liver in vivo under normal and pre-disease conditions. Conversely, in cell-based disease models of lipid overload and lipotoxic stress, silybin treatment primarily depletes triglycerides. Mechanistically, silymarin/silybin suppresses phospholipid-degrading enzymes, induces phospholipid biosynthesis to varying degrees depending on the conditions, and down-regulates triglyceride remodeling/biosynthesis, while inducing complex changes in sterol and fatty acid metabolism. Structure-activity relationship studies highlight the importance of the 1,4-benzodioxane ring configuration of silybin A in triglyceride reduction and the saturated 2,3-bond of the flavanonol moiety in phospholipid accumulation. Enrichment of hepatic phospholipids and intracellular membrane expansion are associated with a heightened biotransformation capacity. + +Conclusion: Our study deciphers the structural features of silybin contributing to hepatic lipid remodeling and suggests that silymarin/silybin protects the liver in individuals with mild metabolic dysregulation, involving a lipid class switch from triglycerides to phospholipids, whereas it may be less effective in disease states associated with severe metabolic dysregulation. + +Introduction + +Hepatic pathologies such as metabolic dysfunction-associated steatotic liver disease (MAFLD; former: non-alcoholic fatty liver disease, NAFLD 1), metabolic dysfunction-associated steatohepatitis (MASH; former: non-alcoholic steatohepatitis, NASH), fibrosis, and cirrhosis are closely related to the metabolic syndrome and insulin resistance 2-6. They are driven by high-calorie diets that induce abnormal glucose and lipid metabolism and subsequently cause glucotoxicity, lipotoxicity, oxidative stress, and chronic inflammation 2,7-9. As a consequence, fatty acids are taken up by hepatocytes, and also synthesized de novo 10, incorporated into triglycerides (TGs), and stored in lipid droplets 11-13. While the transfer of fatty acids into lipid droplets contributes to the detoxification of excess free fatty acids 13, a chronic increase in the number and size of lipid droplets induces hepatocyte enlargement and dysfunction 7,14. This continuous lipid accumulation leads to hepatic steatosis and, as the disease progresses, to cirrhosis and hepatocellular carcinoma 2,15. As an adaptive strategy to protect hepatocytes from lipid overload, autophagy of lipid droplets (lipophagy) is initiated 16 and the mobilized fatty acids are subjected to oxidative degradation 17. Compensatory upregulation of fatty acid oxidation at the onset of MAFLD provides partial relief but is insufficient to reduce hepatic lipids to basal levels. In addition, the increased oxidative breakdown of lipids induces oxidative stress, which can negatively contribute to cell and tissue damage 7,18. MAFLD is also significantly influenced by genetic factors 19. Candidate gene variants act in multiple pathways of lipid metabolism 20, including de novo lipogenesis and lipid droplet assembly (LPIN2, ATGL/PNPLA2)21,22, phospholipid biosynthesis and remodeling (LPIAT1/MBOAT7, iPLA2/PLA2G6, PNPLA8, PRDX6, PLD1)23-29, neutral and phospholipid hydrolysis and catabolism (PNPLA3)30, sterol metabolism (HSD17B13)31 fatty acid compartmentalization (GCKR, TM6SF2), and lipoprotein assembly and secretion (PLA2G7, TM6SF2)26. Consequently, both MAFLD and MASH are characterized by extensive changes in hepatic lipid composition, including a decrease in total phosphatidylcholine (PC) and an increase in TG 32-35. + +Milk thistle (Silybum marianum L.) is a medicinal plant that is traditionally used for the treatment of liver and biliary tract diseases 36-39 and a variety of other pathologies, including diabetes 40 and cancer 41,42. Organic fruit extracts (silymarin) of S. marianum consist of the flavonolignans silybin A and B (~30%), isosilybin (~5%), silychristin A (~7%), and silydianin (~10%), the flavonoid (+)-taxifolin (~5%) (Figure 1A), and less defined polyphenols (30%) 41,43. Minor constituents include silychristin B, isosilychristin, 2,3-dehydrosilybin, quercetin, and kaempferol 41,43,44. The major biologically active flavonolignan, silybin, also termed as silibinin, exists as a mixture of the two diastereomers silybin A and B 43. Human and animal studies with silymarin or its main component silybin on liver pathologies such as oxidative or lipotoxic stress-induced alcoholic and non-alcoholic fatty liver disease and steatohepatitis show (pre)clinical efficacy 45-49, whereas studies on xenobiotic-induced liver toxicity produced mixed results 36,38,50, with only rare cases of side effects 51. Note that the oral bioavailability of silybin can be substantially boosted by specific formulations, yielding systemic silybin plasma concentrations (Cmax) up to 85 µM in humans 36. The hepatoprotective activities of silymarin/silybin have been ascribed to antioxidant response inducing, anti-inflammatory 52, antifibrotic, hepatocyte regeneration-stimulating, and membrane-stabilizing properties 47,53. Several studies have found that administration of silymarin/silybin reduces levels of low-density lipoprotein (LDL), VLDL, cholesterol, and/or TGs, while other studies have not observed substantial changes in the serum lipid profile 54-59, which is not readily understood but may be related to the dose. Recently, silymarin (but not silybin) has been proposed to decrease lipid accumulation during a high-fat diet by altering the vitamin B12-producing capacity of the gut microbiota 60. On the other hand, silymarin/silybin has been suggested to increase PC biosynthesis by upregulating choline phosphate cytidylyltransferase 61. Silymarin/silybin compensated for the decrease of phosphatidylcholine (PC) and phosphatidylethanolamine (PE) in rat liver upon intoxication 62,63 and, when given as a silybin- and PC-based food integrator to MASH patients, restored plasma PC and sphingomyelin (SM) levels 54. Whether silymarin/silybin actively promotes phospholipid enrichment or indirectly increases phospholipid levels by alleviating disease conditions is insufficiently understood, as are the consequences for other membrane phospholipid classes and the knowledge of phospholipidomic profiles. The latter is of great importance because imbalances in the membrane phospholipid composition can cause severe alterations in membrane architecture and function 64. + +Here, we demonstrate that silymarin/silybin increases the levels of phospholipids by suppressing their degradation. This effect is partially combined with the induction of phospholipid biosynthetic enzymes, depending on the condition. Simultaneously, it reduces TG levels by downregulating multiple biosynthetic enzymes or by altering TG remodeling processes in hepatocytes, depending on the specific context. To some extent, this effect is also observed in extrahepatic cell types. We ascribe this activity to specific structural features of silybin A and find that they prevail in healthy or pre-disease states not yet afflicted with massive lipid overload, whereas TG-lowering mechanisms predominate under the latter severe liver disease conditions. The channeling of fatty acids from triglycerides to phospholipids has the advantage of i) reducing hepatic TG levels and lipid droplet size ii) avoiding high lipotoxic levels of free fatty acids, and iii) expanding intracellular membranes, which may explain the enhanced hepatic biotransformation capacity upon treatment with silybin. Major adverse changes in membrane function are not expected from the balanced upregulation of phospholipid species. Conclusively, our data suggest that the mechanism of silymarin/silybin described here is more effective in protecting against metabolic liver disease rather than reversing advanced disease states. + +Materials and Methods + +Materials + +Silybin, staurosporine, and atglistatin were obtained from Merck (Darmstadt, Germany), silybin-C-2',3-bis(hydrogen succinate) disodium salt (Legalon® SIL) was from Madaus GmbH (Köln, Germany), the PPARγ antagonist GW9662, and the DGAT1 inhibitor A-922500 were purchased from Cayman Chemicals (Ann Arbor, MI), the DGAT2 inhibitor PF-06424439 was bought from Bio-Techne (Abingdon, United Kingdom), thapsigargin was from Enzo Life Sciences (Farmingdale, NY), and silymarin (Silimarit®) was a kind gift from Bionorica SE (Neumarkt, Germany). Silybin, its derivatives and other compounds were dissolved in DMSO, stored in the dark at ‑20°C under argon, and freezing/thawing cycles were kept to a minimum. Silymarin was freshly dissolved in ethanol at the day of experiment. Phospholipid standards were purchased from Otto Nordwald GmbH (Hamburg, Germany) or Merck Millipore (Darmstadt, Germany), were dissolved in chloroform, aliquoted and stored under argon protected from light at ‑80°C. BODIPY 493/503 and ProLongTM Diamond Antifade Mountant with DAPI were purchased from Thermo Fisher Scientific (Waltham, MA). Rabbit anti-β-actin (13E5; #4970), mouse anti-β-actin (8H10D10; #3700), rabbit anti-acetyl-CoA carboxylase (C83B10; #3676), rabbit anti-ATF-6 (D4Z8V, #65880), rabbit anti-ATGL (#2138), rabbit anti-BiP (C50B12, #3177), rabbit anti-phospho-acetyl-CoA carboxylase (Ser79; D7D11; #11818), rabbit anti-GAPDH (D16H11; #5174), mouse anti-GAPDH (D4C6R; #97166), rabbit anti-FAS (#3189), and rabbit anti-XBP-1s (D2C1F, #12782S) were obtained from Cell Signaling (Danvers, MA). Mouse anti-calnexin (C8.B6; #MAB3126) was from Merck Millipore (Darmstadt, Germany) and mouse anti-GM130 (#610822) from BD Bioscience (San Jose, CA, USA). Goat anti-rat CYP1A1 (#219207), goat anti-rat CYP3A2, (#210167), and goat anti-rat CYP2B1, (#219207) were obtained from Daiichi Pure Chemicals Co. LTD (Tokyo, Japan). Rabbit anti-DGAT1 (NB110-41487SS) and rabbit anti-DGAT2 (NBP1-71701SS) were from Novus Biologicals (Abingdon, UK). Mouse anti-GRP78/BiP (A-10, #sc-376768) was purchased from Santa Cruz Biotechnology (Dallas, TX). Alexa Fluor 555 goat anti-mouse IgG (H+L) and Alexa Fluor 488 goat anti-rabbit IgG (H+L) were purchased from Life Technologies (MA, USA). Secondary antibodies for Western blot studies were from LI-COR Biosciences (Bad-Homburg, Germany) and Thermo Fisher Scientific. Peroxidase-conjugated avidin and the secondary biotinylated antibodies rabbit anti-mouse IgG and rabbit fblanti-goat used in immunohistochemical studies were from VECTASTAIN® Elite ABC-Kit (Vector Laboratories, Burlingame, CA). + +Synthesis of silybin derivatives + +Silybin A and B were separated from the diastereomeric mixture silybin (Merck) by preparative HPLC as described 65. Starting from the purified silybin A and B, the two enantiomers of 2,3-dehydrosilybin (A and B) were synthesized in good yields and optically pure by base-catalyzed oxidation under microwave heating 66. The hemiacetal 11, was obtained in good yield by the microwave conversion of silybin in pyridine at 110°C 66. All products were fully characterized by NMR (1H, 13C), CD, [α]D, and ESI MS analyses. The purities of the products were higher than 98%. + +Cell culture, primary monocytes and cell treatment + +Cultured cell lines: Human HepG2 liver carcinoma cells (1×105 cells/cm2, Leibniz Institute DSMZ-German Collection of Microorganisms and Cell Cultures, Braunschweig, Germany) were grown in RPMI 1640 medium containing 10% heat-inactivated fetal calf serum (FCS, GE Healthcare, Freiburg, Germany or Merck) at 37°C and 5% CO2. Human HepaRG hepatoma cells (1.5-2×105 cells/cm2, Biopredic International, Rennes, France) were cultured in Williamˈs E medium (Merck) supplemented with 10% heat-inactivated FCS, 2 mM L-glutamine (Merck), 5 μg/ml human insulin (Merck), and 50 μM hydrocortisone (Cayman) at 37°C and 5% CO2. Human Caco-2 colorectal adenocarcinoma cells (1.7×105 cells/cm2) were cultured in DMEM medium (Merck) containing 10% FCS at 37°C and 5% CO2. Cells were detached by trypsin/EDTA and reseeded every 3-4 days before reaching confluence. HepG2 cells were used up to passage 28 and HepaRG cells up to passage 44. + +Primary cells: Collection of venous blood in heparinized tubes (16 I.E. heparin/mL blood) was performed by the Institute for Transfusion Medicine of the University Hospital Jena (Germany) with informed consent of registered male and female healthy adult volunteers (18 to 65 years). Blood donors were fasted for at least 12 h, had not taken antibiotics or anti-inflammatory drugs prior to blood donation (> 10 days), and were free of apparent infections, inflammatory disorders, or acute allergic reactions. The volunteers regularly donated blood (every 8 to 12 weeks) and were physically inspected by a clinician. Leukocyte concentrates were prepared, erythrocytes removed by dextran sedimentation, and peripheral blood mononuclear cells (PBMC) were isolated by density gradient centrifugation on lymphocyte separation medium (LSM 1077, GE Healthcare) as previously described 67. The fraction of PBMC was cultivated in RPMI 1640 medium containing 10% FCS in 12-well plates (37°C, 5% CO2) at a density of 2×107/ml for 1 to 1.5 h to separate adherent monocytes. The cell population used for further studies consisted of more than 85% monocytes according to forward and side scatter properties and CD14 surface expression (BD FACS Calibur flow cytometer, BD Biosciences, Heidelberg, Germany). Experiments were approved by the ethical commission of the Friedrich-Schiller-University Jena. + +Cell treatment: HepG2 cells (1×105 cells/cm2) and monocytes (6×105/cm2) were seeded and directly exposed to vehicle (0.1% DMSO or 0.05% ethanol), silymarin (50 µg/ml for monocytes and 10 µg/ml for HepG2 cells), silybin A/B (20 µM), or STS (1 µM). Adherent cells were harvested with trypsin/EDTA (Merck or Promega, Madison, WI). For lipid droplet staining with Oil Red O, HepG2 cells were instead seeded in 96-well plates at 20,000 cells per well and incubated for 24 h before treatment with vehicle (0.5% DMSO or 0.5% ethanol), silymarin (10 µg/ml), or silybin A/B (20 μM) for an additional 24 h. Treatment of HepaRG cells is described in section “Cell-based models of MAFLD and lipotoxic stress”. For transcriptome analysis, Caco-2 cells (1.7×105 cells/cm2) were seeded and directly exposed to vehicle (0.5% DMSO), silymarin (30 µg/ml), and silybin (30 µM) for 24 h. Adherent cells were harvested with trypsin/EDTA. + +Complexation of fatty acids to BSA + +BSA (1%, Carl Roth, Karlsruhe, Germany) was dissolved in Williams E medium, sterile filtered (Rotilabo®-syringe filter, PVDF, 0.22 µm, Carl Roth), mixed with PA (50 mM) or OA (50 mM), sonicated at 60°C for 30 min using a USC100TH sonicator (VWR, Vienna, Austria, 60 W, 45 kHz), and stored at -20°C. Solutions were mixed vigorously immediately before use. + +Cell-based models of MAFLD and lipotoxic stress + +HepaRG cells (10,000 / well, 96-well plate) or 2.5×106 cells/25 cm2 were cultured at 37°C and 5% CO2 for 24 h. The cell culture medium was replaced with fresh medium supplemented with i) vehicle (1% BSA in Williams E medium), ii) BSA-complexed PA/16:0 (0.1 mM, Merck) and OA/18:1 (Cayman) in a 1:2 ratio (in total 1 mM) to induce massive lipid accumulation (mimicking MAFLD), or iii) BSA-complexed PA (0.1 mM) to induce lipotoxic stress. For lipidomic analysis, cells were either co-treated directly with vehicle (DMSO, 0.5%) or silybin A (20 μM), and the incubation was prolonged for another 24 h. Alternatively, treatment was started 24 h after fatty acid challenge and incubation was prolonged for a further 24 h. For lipid droplet analysis, cells were co-treated with vehicle (DMSO, 0.5%), silybin A (20 μM), the ATGL inhibitor atglistatin (50 µM), the DGAT1 inhibitor A 922500 (5 µM), the DGAT2 inhibitor PF-06424439 (10 µM), a combination of DGAT1 (5 µM) and DGAT2 inhibitors (10 µM), or the PPARγ antagonist GW9662 (5 µM) and the incubation was prolonged for another 24 h or 48 h, respectively. Lipid droplet signals, the number of viable cells and membrane integrity, cellular metabolic activity, and phospholipid and TG levels were determined as described in the respective sections. + +Quantitation of lipid droplets in hepatocytes + +HepaRG cells were washed twice with 100 μl PBS pH 7.4 and fixed with paraformaldehyde solution (4% in PBS pH 7.4, Merck) for 40 min at room temperature. After removal of the fixative, the cells were washed twice with 100 μl of water, incubated with aqueous isopropanol (60%, 100 μl, 5 min) to remove polar lipids and reduce background signals, and stained with Oil Red O solution (50 μl) for 25 min at room temperature. The latter was prepared by diluting 0.5% Oil Red O in isopropanol (Merck) 1.7-fold in water, sterile-filtered (Rotilabo®-syringe filter, PVDF, 0.22 µm, Carl Roth), and allowed to stand for 10 min before staining. Cells were washed three times with water, and microscopic images were taken using a 40× objective (Motic, Barcelona, Spain) on a Motic AE31E microscope (Motic) equipped with a Motic camera. Alternatively, lipid droplets in HepG2 cells were stained with BODIPY 493/503 and manually counted as described in section “Immunofluorescence microscopy”. For photometric quantitation of the stained lipid droplets, Oil Red O was extracted with 60% isopropanol in water (100 μl) for 10 min at room temperature, and the absorbance of the extracted solution was measured at 510 nm using a multi-mode microplate reader (SpectraMax iD3, Molecular Devices). + +Cell number, viability, morphology, and cell diameter + +Cell number, cell viability, and cell diameters were determined after trypan blue staining using a Vi-CELL Series Cell Counter (Beckmann Coulter GmbH, Krefeld, DE). Morphological analysis of the cells was carried out on an Axiovert 200 M microscope with a Plan Neofluar × 100/1.30 Oil (DIC III) objective (Carl Zeiss, Jena, Germany). Images were obtained using an AxioCam MR3 camera (Carl Zeiss). + +Cell viability based on cellular dehydrogenase activity + +Cytotoxic effects of silymarin and silybin were determined as described 68. Briefly, HepG2 cells (1×105/well of a 96-well plate) or HepaRG cells were cultured as described in sections “Cell culture, primary monocytes and cell treatment” and “Cell-based models of MAFLD and lipotoxic stress”. Cells were treated with silymarin, silybin, or vehicle (0.5% DMSO or 0.25% ethanol) at 37°C and 5% CO2. The pan-kinase inhibitor staurosporine (1 µM) was used as reference compound. After 24 h, 3-(4,5-dimethylthiazol-2-yl)-2,5-diphenyltetrazolium bromide (MTT, 20 µl, 5 mg/ml, Merck) was added to each well, and cells were incubated for another 3 h (HepG2) or 2.5 h (HepaRG) at 37°C and 5% CO2 before being lysed in SDS buffer (10% in 20 mM HCl, pH 4.5) overnight. The absorption of the solubilized formazan product was measured at 570 nm (Multiskan Spectrum, Thermo Fisher Scientific or SpectraMax iD3, Molecular Devices). + +Extraction and analysis of phospholipids, neutral lipids, and fatty acids + +To extract lipids from cell pellets (HepG2 cells, HepaRG cells, and monocytes) or supernatants of liver homogenates after centrifugation (9,000×g, 10 min, 4°C), PBS pH 7.4, methanol, chloroform, and saline (final ratio: 14:34:35:17) were added in succession 69,70. Phospholipids, TGs and fatty acids in the lower organic phase were evaporated to dryness, dissolved in methanol, and analyzed by UPLC-MS/MS. Internal standards: 1-Pentadecanoyl-2-oleoyl(d7)-sn-glycero-3-phosphoethanolamine, 1-pentadecanoyl-2-oleoyl(d7)-sn-glycero-3-phosphocholine, and/or 1,3-dipentadecanoyl-2-oleyol(d7)-glycerol were used for lipidomic analysis related to Figure 4, Figure 7 and Figure S13 and S14. Other samples contained 1,2-dimyristoyl-sn-glycero-3-phosphatidylcholine as internal standard, and 1,2-dimyristoyl-sn-glycero-3-phosphatidylethanolamine, 1,2-di-heptadecanoyl-sn-glycero-3-phosphatidylglycerol, and/or 1,2-diheptadecanoyl-sn-glycero-3-phosphoserine. + +Phospholipids, CE, TGs, and free fatty acids were separated on an AcquityTM UPLC BEH C8 column (1.7 μm, 2.1×100 mm, Waters, Milford, MA, USA) using an AcquityTM Ultraperformance LC system (Waters) as described before 71-73. Alternatively, phospholipids and TGs were separated by an ExionLC™ AD UHPLC (Sciex, Framingham, MA, USA) 74-76. In brief, phospholipids were analyzed at a flow rate of 0.75 ml/min at 45°C using acetonitrile/water (95/5) and 2 mM ammonium acetate as mobile phase A and water/acetonitrile (90/10) and 2 mM ammonium acetate as mobile phase B. Mobile phase A was ramped from 75 to 85% within 5 min, followed by an increase to 100% within 2 min and isocratic elution for another 2 min. For the separation of TGs, mobile phase B was replaced by isopropanol, and the initial composition of mobile phase A was lowered from 90 to 70% within 6 min, which was succeeded by isocratic elution for 4 min. + +Glycerophospholipids were detected by multiple reaction monitoring (MRM) in the negative ion mode based on their fatty acid anion fragments using a QTRAP 5500 72 or QTRAP 6500+ 77. Mass Spectrometer (Sciex), which were equipped with electrospray ionization (ESI) sources. For the analysis of PE and PC using the QTRAP 6500+ Mass Spectrometer (Figure 5, Figure S3, and Figure S14), the curtain gas was set to 40 psi, the collision gas was set to medium, the ion spray voltage was set to -4500 V, the heated capillary temperature was set to 650°C (PE) or to 350 °C (PC), the sheath gas pressure was set to 55 psi, the auxiliary gas pressure was set to 75 psi, the declustering potential was set to -50 V, the entrance potential was set to -10 V, the collision energy was set to -38 eV, and the collision cell exit potential was set to -12 V 76. + +CE and TGs were identified and quantified in the positive ion mode as NH4+ adduct ions that undergo neutral loss of either of the acyl groups 73. When using the QTRAP 6500+ Mass spectrometer (Figure 4, Figure 5, Figure S3, and Figure S13 and S14), the curtain gas was set to 30 psi (CE) or 40 psi (TG), the collision gas to low, the ion spray voltage to 5500 V, the heated capillary temperature to 350°C (CE) or 400°C (TG), the sheath gas pressure to 55 psi (CE) or 60 psi (TG), the auxiliary gas pressure to 70 psi, the declustering potential to 55 V (CE) 120 V (TG), the entrance potential to 10 V, the collision energy to 22 V (CE) or 35 eV (TG), and the collision cell exit potential to 22 V (CE) or 26 V (TG) 76. Free fatty acids were analyzed by single ion monitoring in the negative ion mode 69 and SM by MRM in the positive ion mode based on the detection of the choline headgroup (m/z = 184)69. + +Absolute lipid quantities were normalized for Figure 4, Figure 5, S13 and S14 to lipid subclass-specific internal standards and cell number. For other experiments, lipid intensities were normalized to 1,2-dimyristoyl-sn-glycero-3-phosphatidylcholine and the number of cells to calculate the amounts in nmol / 106 cells (PC) or in relative units (other lipid subclasses). Relative intensities represent the percentage of individual lipid species relative to all lipid signals determined within the respective lipid class (= 100%). The most intensive or specific transition was used for quantitation. Analyst 1.6 or Analyst 1.7 (Sciex) were used to acquire and process mass spectra. + +Extraction and analysis of acyl-CoAs + +HepG2 cells were suspended in methanol/water (70/30) and placed at -20°C for 1 h. After vigorous mixing, the methanol/water ratio was adjusted to 50/50 and the samples were incubated for another hour at -20°C. Protein precipitates were removed by centrifugation (20,000×g, 5 min, 4°C), and the supernatant was evaporated to dryness. The residue was extracted with methanol/water (50/50) and the extract subjected to UPLC-MS/MS analysis. [13C3]-Malonyl-CoA (1 nmol; Merck) was used as internal standard. + +Acyl-CoAs were separated on an AcquityTM UPLC BEH C18 column (1.7 µM, 2.1×50 mm) with an AcquityTM Ultra Performance LC system 78 and analyzed by MRM in the positive ion mode following electrospray ionization (QTRAP 5500 mass spectrometer). Fragments formed by neutral loss of 2'-phospho-ADP ([M+H-507]+) were detected for quantitation. The ion spray voltage was set to 3,000 V, the heated capillary temperature to 600°C, the curtain gas pressure to 30 psi, the sheath gas pressure to 45 psi, the auxiliary gas pressure to 55 psi, the declustering potential to 60 V, the entrance potential to 10 V, and the collision energy to 45 eV (malonyl-CoA) or 30 eV (other acyl-CoAs). Absolute lipid amounts are calculated with respect to the internal standard of the subclass and are normalized to cell number, protein content or tissue weight. Relative lipid proportions are expressed as a percentage of the total sum of all species detected within the corresponding subclass (equal to 100%). Mass spectra were acquired and analyzed using Analyst 1.6 or 1.7 (Sciex). + +Metabolic flux studies + +HepG2 cells (1×105 cells/cm2) were seeded and directly treated with either vehicle control (0.05% ethanol or 0.1% DMSO), silymarin (10 µg/ml) or silybin A (20 µM) and cultured for 6 h at 37°C and 5% CO2. Cells were treated with sodium acetate-13C2, d3 (30 µM, Merck, #299111) for further 18 h before lipids were extracted and analyzed by UPLC-MS/MS as described above. PE species carrying 16:0-13C2, d1, 18:0-13C2, d1, 18:1-13C2, d1, or 20:4-13C2, d1 were quantified by MRM in the negative ion mode as transitions from [M+3+CH3COO]- parental ions to the respective isotope-labeled and non-isotope-labeled fatty acid anions. TG species carrying 16:0-13C2, d1, 18:0-13C2, d1, 18:1-13C2, d1, or 18:2-13C2, d1 were detected by MRM in the positive ion mode as transitions from [M+3+NH4]+ parental ions to the respective fragment anions following release of an isotope-labeled or non-isotope-labeled acyl group. In parallel, non-labeled TG and PE were analyzed to calculate the M+3 isotopic patterns from the monoisotopic signals using the Mass (m/z) calculation tool from Lipid Maps® (https://www.lipidmaps.org/tools/structuredrawing/masscalc.php). These isotopic signals were subtracted from the corresponding signals of the 13C2, d1 - labeled species. + +Transcriptome analysis + +Caco-2 cells (1.7×105 cells/cm2) were treated with vehicle (0.5% DMSO), 30 µg/ml silymarin or 30 µM silybin for 24 h (n = 3 biological replicates). Total RNA was isolated using a RNeasy Mini Kit (Qiagen) and potential DNA contamination was digested with DNase I (Qiagen) during RNA purification according to the manufacturer's protocol. RNA concentration and quality were assessed using a SpectraMax iD3 microplate reader (Molecular Devices), a bioanalyzer (Agilent) and Qubit (Thermo Fisher Scientific) before being submitted to the MultiOmics Core Facility, Medical University of Innsbruck, for sequencing. The RNA integrity (RIN) of all samples was > 9.5 (out of 10) and no genomic DNA contamination was detected in any of the samples prior to RNA sequencing. Libraries were prepared using Lexogen's Quant Seq 3'mRNA Seq Library Kit FWD with UMI protocol (Lexogen GmbH, Vienna, Austria). Quality validated libraries were multiplexed and sequenced at 150 bp read length using Illumina NovaSeq technology and the generated paired-end raw sequence data reads were quality controlled using FastQC and MultiQC202 79. + +Sequencing adapters and reads shorter than 50 base pairs were removed using Trim Galore (Galaxy version 0.6.7) to improve mapping quality, and reads were mapped to the GRCh38 human reference genome (December 2013) using the RNAStar aligner (Galaxy version 2.7.10b) 80. Final transcript count data were generated with HTSeq framework (Galaxy version 2.0.5) 81 for high-throughput sequencing data based on the Ensemble release Homo_sapiens.GRCh38.107 gene annotation with default settings. All analyses were performed on a public instance of Galaxy at usegalaxy.eu. Differential gene expression analysis was performed using DESeq2 package version 1.26 82 with an adjusted P-value < 0.05 (5% FDR). + +In addition, we re-analyzed microarray-based transcriptome datasets: i) HepG2 cells treated with vehicle (0.0125% DMSO) or 12 µg/ml silymarin (Merck) for 24 h (n = 3 biological replicates)83; ii) Huh7.5.1 cells treated with vehicle (0.32% DMSO) or 40 µg/ml silymarin (Madaus Group, Cologne, Germany) for 4, 8, or 24 h (pooled triplicates in three [silymarin, 8 h; silymarin, 24 h], four [vehicle and silymarin, 4 h], or five [vehicle, 8 and 24 h] technical replicates)84; iii) primary human hepatocytes from chronically HCV-infected chimeric mice with humanized livers either untreated or receiving 469 mg/kg silybin-C-2',3-bis(hydrogen succinate) disodium salt (Legalon® SIL, in saline, all three mice on day 3 and two mice on day 14) or 265 mg/kg Legalon® SIL (in saline, one mouse on day 14) intravenously daily for 3 or 14 days (n = 3 mice/group) 85. Data are accessible at NCBI GEO database 86, accessions GSE67504, GSE50994, and GSE79103. Differentially regulated genes were identified by pairwise comparison of treatment and control groups using the GEO2R interactive web tool (https://www.ncbi.nlm.nih.gov/geo/geo2r/) 86. P values were calculated by multiple t-tests, either with or without correction for multiple comparisons according to Benjamini and Hochberg (false discovery rate 5%) and auto-detection for log-transformation. + +Sample preparation, SDS-PAGE, and Western blotting + +Pelleted and washed monocytes and HepG2 cells were lysed in ice-cold 20 mM Tris-HCl (pH 7.4), 150 mM NaCl, 2 mM EDTA, 1% Triton X-100, 5 mM sodium fluoride, 10 μg/ml leupeptin, 60 μg/ml soybean trypsin inhibitor, 1 mM sodium vanadate, 2.5 mM sodium pyrophosphate, and 1 mM phenylmethanesulphonyl fluoride, and sonicated on ice (2 × 5 s, Q125 Sonicator, QSonica, Newtown, CT, 125 W, 35% amplitude). After centrifugation (cell lysates: 12,000×g, 5 min, 4°C; liver homogenates: 9,000×g, 10 min, 4°C), the protein concentration of the supernatants was determined using a DC protein assay kit (Bio-Rad Laboratories, CA). Samples (10-15 µg total protein) were combined with loading buffer (1×; 125 mM Tris-HCl pH 6.5, 25% sucrose, 5% SDS, 0.25% bromophenol blue, and 5% β-mercaptoethanol) and heated for 5 min at 95 °C. Proteins were separated by 8-10% SDS-PAGE and transferred to a Hybond ECL nitrocellulose membrane (GE Healthcare) or Amersham Protran 0.45 µm NC nitrocellulose membranes (Carl Roth, Karlsruhe, Germany). Membranes were blocked with 5% bovine serum albumin (BSA) or skim milk for 1 h at room temperature and incubated with primary antibodies overnight at 4°C. IRDye 800CW-labeled anti-rabbit IgG (1:10,000, 92632211, LI-COR Biosciences, Lincoln, NE), IRDye 800CW-labeled anti-mouse IgG (1:10,000, 926-32210, LI-COR Biosciences, Lincoln, NE), IRDye 680LT-labeled anti-rabbit IgG (1:80,000, 926-68021, LI-COR Biosciences, Lincoln, NE), IRDye 680LT-labeled anti-mouse IgG (1:80,000, 926-68020, LI-COR Biosciences, Lincoln, NE), DyLight® 680 goat anti-rabbit IgG (1:10,000, # 35569, Thermo Fisher Scientific), and/or DyLight® 800 goat anti-mouse IgG (1:10,000, # SA5-10176, Thermo Fisher Scientific) were used as secondary antibodies. Fluorescent, immunoreactive bands were visualized using an Odyssey infrared imager (LI-COR) or a Fusion FX7 Edge Imaging System (spectra light capsules: C680, C780; emission filters: F-750, F-850; VILBER Lourmat, Collegien, France) 74. Acquired data from densitometric analysis were linearly adjusted and background-corrected using Odyssey Infrared Imaging System Application Software Version 3.0 (LI-COR Biosciences) or Evolution-Capt Edge Software Version 18.06 (VILBER Lourmat) and Bio-1D imaging software Version 15.08c (Vilber Lourmat), and protein levels were normalized to GAPDH or β-actin. + +qPCR + +HepG2 cells were incubated with silymarin (10 µg/ml), silybin (20 µM), or vehicle (ethanol for silymarin, DMSO for silybin) for 24 h. Total RNA of HepG2 cells was isolated with the E.Z.N.A Total RNA Kit (Omega Bio-tek, Norcross, GA). SuperScript III First-Strand Synthesis SuperMix (Thermo Fisher Scientific) was used for transcription into cDNA. The cDNA was snap-frozen and stored at -20 °C until use. An aliquot of the cDNA preparation (1.25 µl) was combined with 1× Maxima SYBR Green/ROX qPCR Master Mix (Fermentas, Darmstadt, Germany) and forward and reverse primer (0.5 µM; TIB MOLBIOL, Berlin, Germany) in Mx3000P 96-well plates. Primer sequences are given in Table 1. β-Actin and GAPDH were used as reference. PCR was performed on a StraTGene Mx 3005P qPCR system (Agilent Technologies, Santa Clara, CA). The PCR program heats to 95°C for 10 min and conducts 45 cycles of 15 s at 95°C, 30 s at 61°C, and 30 s at 72°C. Threshold cycle values were determined by MxPro Software (Mx3005P/version 4.10, Agilent Technologies) and normalized to the amount of total RNA. + +Immunofluorescence microscopy + +HepG2 cells (2.5×104/3.9 cm2) were seeded on an ibidi 8-well slide (ibidi #80826, Gräfelfing, Austria) and cultured for 24 h at 37 °C and 5% CO2. For ER and lipid droplet staining, vehicle (0.1% DMSO for silybin A or 0.05% ethanol for silymarin), silymarin, or silybin were added, and cells were incubated for another 24 h at 37 °C and 5% CO2. The medium was then removed, and the cells were rinsed twice with HBSS. Prewarmed BioTracker™ 488 Green Lipid Dye Biotracker (Merck, # SCT144, 1x in HBBS /Ca/Mg, Gibco cat. #14025-092) or ER-Tracker™ Red (BODIPY™ TR Glibenclamide) (ThermoFisher Scientific, Vienna, Austria #E34250, 1 µM in HBSS) staining solutions were added and cells incubated for 30-60 min before being washed with HBSS. Hoechst DNA staining solution was applied (Merck, # 33258, 1 μg/ml) and cells incubated for 30 min at 37 °C and 5% CO2. The staining solution was then removed and the cells were fixed with 4% paraformaldehyde in H2O for 20 min, followed by two washes with HBSS. Fresh HBSS buffer was added and the cells were immediately visualized by fluorescence microscopy. For Golgi staining, cells were incubated with vehicle (0.1% DMSO for silybin A or 0.05% ethanol for silymarin), silymarin or silybin for 6 h at 37 °C and 5% CO2. The cells were rinsed twice with HBSS and 2 μL of the BacMam 2.0 reagent CellLight™ Golgi-GFP (ThermoFisher Scientific, Vienna, Austria, # C10591) was added, followed by incubation at 37°C in 5% CO2 for 18 h. Cells were washed with HBSS twice, Hoechst DNA stain solution was added and cells were incubated for 30 min at 37 °C and 5% CO2. Fluorescently labelled organelles were visualised using a BZ-X800E fluorescence microscope (Keyence, Neu-Isenburg, Germany) equipped with the BZ-X Filters DAPI (OP-87762, λex = 360 nm, λem = 460 nm), GFP (OP-87763, λex = 470 nm, λem = 525 nm) and TRITC (OP-87764, λex = 545 nm, λem = 605 nm) and a Plan Apochromat 40× (NA 0.95) objective. Images were captured using the sectioning module with structured illumination and z-stacks of 10 µM. Image analysis was performed using ImageJ software (https://imagej.net/ij/). For quantification of ER and Golgi, a region of interest (ROI) was drawn around the labeled organelles, and the mean intensity was measured. Only cells within the focal plane were considered, defined as cells in which the ER appeared as a perinuclear ring surrounding at least 50% of the nucleus or in which Golgi signals appeared as distinct, well-defined spots. Lipid droplet quantification was performed by setting a minimum threshold of 15 to exclude background staining. Number and size of lipid droplets were automatically measured using the "Analyze Particles" tool in ImageJ. + +Immunohistochemistry (IHC) + +Liver samples were immediately fixed in neutral buffered 4% paraformaldehyde for at least 24 h and then dehydrated in increasing alcohol concentrations, embedded in paraffin, and sliced into 4 µm sections as described before 87. The sections were deparaffinized with xylene and rehydrated using an inverse series of aqueous alcohol concentrations. Hydrogen peroxide (0.3% in methanol) was applied for 45 min to block endogenous peroxidase activity. + +Sections were microwaved in citric acid (10 mM, pH 6.0) for 16 min at 600 W and then incubated with primary antibodies (mouse anti-GRP78, 1:5000; goat anti-rat CYP1A1, 1:5000; goat anti-rat CYP3A2, 1:5000; goat anti-rat CYP2B1, 1:5000) in PBS pH 7.4 and 5% BSA overnight at 4°C, followed by treatment with secondary biotinylated rabbit anti-goat IgG or rabbit anti-mouse IgG (30 min, room temperature) and peroxidase-conjugated avidin (VECTASTAIN® Elite ABC-Kit; Vector Laboratories, Burlingame, CA; another 30 min). The chromogen 3-amino-9-ethylcarbazole (AEC Substrate Pack; BioGenex, San Ramon, CA) was applied twice for 15 min to visualize immunoreactive sites. Sections were mounted in Vectamount™ mounting medium (Vector Laboratories, Burlingame, CA) and analyzed using an Axio Imager A1 microscope equipped with a 20× objective and a ProgRes C5 camera (Jenoptik, Jena, Germany). + +Animal housing and treatment of mice with silybin hemisuccinate + +Male C57BL/6 mice (12-weeks-old, body weight 25-30 g; Charles River, Sulzfeld, Germany) were housed under standardized conditions with a day-night cycle of 12 h/12 h at 22 ± 1°C and 50 ± 10% environmental humidity. Standard diet and water were provided ad libitum. Animals were adapted to laboratory conditions before the experiment for at least 2 days. Silybin hemisuccinate (200 mg/kg) or vehicle (0.9% NaCl) were intraperitoneally administered trice (at 0, 12, and 24 h). Mice were anesthetized by isoflurane and sacrificed by isoflurane overdose after 37 h, and organs were removed, weighed and either fixed in 10% buffered formaldehyde or snap-frozen in liquid nitrogen for biochemical analysis. All experiments were performed in accordance with the German legislation on protection of animals and with approval of the Thuringian Animal Protection Committee. + +GSH and GSSG levels + +The tissue content of glutathione in its reduced (GSH) and oxidized (GSSG) form was analyzed by homogenizing the liver and kidney samples with eleven volumes of 0.2 M sodium phosphate buffer (5 mM EDTA; pH 8.0) and four volumes of 25% metaphosphoric acid. After centrifugation (12,000×g, 4°C, 30 min), the GSH content was measured in the supernatants using a colorimetric assay as previously described 88. The GSSG concentration was assessed fluorometrically 89. + +Lipid peroxidation + +To determine the tissue content of lipid peroxides as thiobarbituric acid reactive substances (TBARS), liver and kidney samples were homogenized in 19 volumes of ice-cold saline and analyzed fluorometrically 90. + +Biotransformation capacity + +To obtain 9,000×g supernatants, the livers were homogenized in 0.1 M sodium phosphate buffer (pH 7.4) (1:2 w/v) and subsequently centrifuged at 9,000×g for 20 minutes at 4°C. Activities of all biotransformation reactions were assessed in these 9,000×g supernatants and referred to the protein content of this fraction which was determined with a modified Biuret method 91. For assessment of CYP enzyme activities, the following model reactions were performed: benzyloxyresurofin-O-debenzylation (BROD) 92, ethoxycoumarin-O-deethylation (ECOD) 93, ethoxyresorufin-O-deethylation (EROD) 94, ethylmorphine-N-demethylation (EMND) 95, methoxyresorufin-O-demethylation (MROD) 94, pentoxyresorufin-O-depentylation (PROD) 94. GST activities were determined using o-dinitrobenzene as a substrate. The resulting dinitrobenzene-glutathione conjugate was measured photometrically 96. For the determination of UGT activities, 4-methylumbelliferone was used as a substrate and the respective glucuronide was measured fluorometrically 97,98. + +Blood glucose levels + +Blood glucose levels were determined using a commercially available blood glucose meter and respective test strips (BG star1, Sanofi-Aventis, Frankfurt, Germany). + +Data analysis and statistics + +Data are given as individual values and/or means ± SEM or + SEM of n independent experiments. Statistical analysis was performed with GraphPad Prism 8.3 or 9.0 (GraphPad Software Inc, San Diego, CA, USA) using non-transformed or logarithmized data. Ordinary or repeated-measures one-way ANOVAs followed by Tukey post-hoc tests were applied for multiple comparison, and two-tailed Student's t-tests were used for paired and unpaired observations (two-sided α levels of 0.05). Statistical significance was defined as *P < 0.05, **P < 0.01, and ***P < 0.001. Outliers were determined by Grubb's test. Figures were created with Graphpad Prism 8.3 or 9.0 (GraphPad Software Inc), Excel 2016 or 2020 (Microsoft, Redmond, WA), or Sigma Plot 13.0 (Systate Software GmbH, San Jose, CA). + +Results + +Silybin induces a switch from hepatic TGs to phospholipids + +To investigate the effects of silymarin and silybin on the hepatic lipid composition, we monitored concentration- and time-dependent changes in PE levels in HepG2 cells by targeted lipidomics. Phospholipid accumulation in HepG2 cells was manifested at ≥ 10 µg/ml silymarin or 20 µM silybin after 24 h (Figure S1), and cytotoxic activities first became evident at ≥ 50-200 µg/ml silymarin and ≥ 100 µM silybin (Figure S2). For the following experiments, human HepG2 hepatocarcinoma cells and human primary monocytes (as a surrogate for hepatic phagocytes) were used and treated with 50 µg/ml silymarin for monocytes, 10 µg/ml silymarin for HepG2 cells and 20 µM silybin for 24 h. Silymarin increased the cellular content of major phospholipid classes, i.e., PC, PE, phosphatidylserine (PS), phosphatidylinositol (PI), phosphatidylglycerol (PG), and SM (Figure 1B and C). Similar effects were observed for silybin (20 µM, Figure 1B and C), one of the major bioactive components of silymarin 43. Instead, TG levels were substantially decreased by both silymarin and silybin treatment, with opposite efficacy in monocytes and hepatocytes. While silymarin specifically reduced TG levels in monocytes, silybin was only effective in hepatocytes (Figure 1B and C). Together, our results suggest that silybin induces a hepatic switch from TGs to phospholipids and point to additional components contained in silymarin that tune the cellular lipid profile. + +To investigate whether the decrease in TGs is functionally related to the accumulation of phospholipids, we studied the impact of TG degradation on the cellular PE content, which was robustly upregulated by silybin treatment (Figure 1C). The selective diacylglycerol-O-acyltransferase (DGAT)2 inhibitor PF-06424439 (10 µM), which interferes with the final step of TG biosynthesis 99, decreased TG levels as expected, but failed to increase the amount of PE (Figure S3). Accordingly, inhibition of adipocyte triglyceride lipase (ATGL) using atglistatin neither decreased TG nor significantly elevated PE levels (Figure S3). Thus, our data suggest that the reduction in TGs does not account for the enrichment in phospholipids, at least under conditions where phospholipid biosynthesis is not upregulated. + +Next, we investigated whether silybin counter-regulates phospholipid and TG levels in vivo. Mice received silybin (200 mg/kg, i.p.) three times over 37 h, which is expected to produce peak hepatic concentrations >10 nmol/g for the unconjugated drug 100,101. Silybin increased the hepatic phospholipid content, reaching significance for PE, PS, and PI, and simultaneously lowered TG levels (Figure 1D), as expected from the results for hepatocytes in vitro. The shift from TGs to phospholipids was accompanied by a significant loss of liver and body weight (Figure 1E) and a decrease of blood glucose levels (Figure S4), which is of particular interest because fatty liver disease is often associated with insulin resistance that elevates blood glucose levels 3. Note that the mice were fed ad libitum and food intake was not measured. Therefore, it cannot be excluded that the observed effects of silybin may be partially related to reduced food intake. + +The majority of phospholipids significantly upregulated by silybin in mouse liver contain polyunsaturated fatty acids, either linoleic acid (18:2), arachidonic acid (20:4), or docosahexaenoic acid (22:6) (Figure 2A). Note that an increase in membrane unsaturation has been associated with insulin sensitivity 102 and may explain the decrease in blood glucose levels with silybin administration (Figure S4). The effect of silymarin/silybin on individual lipid species varies greatly between experimental systems (Figure S5 and S6). While the levels of a broad spectrum of phospholipid species are increased, there are also lipids that are regulated in the opposite direction, particularly in mouse liver, where silybin reduces the amount of PC (18:1/18:1) and PE (18:1/18:1), along with other lipids (Figure 2A and Figure S6). The differences between silymarin and silybin lie in the magnitude rather than the direction of the phospholipidomic changes (Figure 2B). In contrast, the levels of TG species are consistently decreased by silymarin in monocytes and by silybin in HepG2 cells (Figure S5). To exclude the possibility that lipids present in silymarin contribute to changes in the cellular lipid profile, we analyzed the lipid composition of silymarin. Phospholipids with a glycerol backbone (glycerophospholipids) other than PC (16:0/18:2) were not detected in silymarin, and only low-abundance lysophospholipid and SM species were present (Figure S7). Together, the lipids in silymarin do not explain the increase in cellular phospholipids upon treatment. + +Accumulated phospholipids are distributed across intracellular membranes + +Phospholipids are organized in plasma and intracellular membranes and, to a lesser extent, in lipid droplets and the cytosol 13,103. It can be excluded that the silymarin/silybin-induced increase in cellular phospholipids is related to the plasma membrane, as the diameter of both monocytes and HepG2 cells was not altered by treatment (Figure S8A). To define the membrane compartment where the additional phospholipids are deposited, we assessed their size and morphology using organelle-specific fluorescence probes (Figure S8). We expected that the 1.2- to 1.5-fold increase in total intracellular phospholipids would be visible as a gain in size or morphological change if the additional phospholipids were preferentially incorporated into a specific membrane compartment. If, instead, the phospholipids are evenly distributed throughout the intracellular membranes, even the 1.5-fold increase in spherical surface area (formed by membrane phospholipids) would result in only a 1.2-fold increase in diameter, and this factor is further reduced for tubular systems such as ER and Golgi with strongly increased surface areas as compared to spherical structures. Apparent effects on organelle size and structure (as assessed by quantitative analysis of the fluorescence probes) are unlikely to be achieved in this case. We focused on large intracellular membrane compartments, i.e., nucleus, ER, and Golgi, which were stained with Hoechst DNA stain and live cell dyes for ER and Golgi, respectively. Silymarin/silybin A did not markedly affect the intensity or distribution of the fluorescence signal (Figure S8B and C), as confirmed by quantitative analysis of the fluorescence signal (Figure S8B and C). Thus, phospholipids seem to be enriched at intracellular sites but not preferentially incorporated into a major membrane compartment such as the ER, Golgi, or nucleus. + +Silybin causes a decrease in lipid content + +Lipid droplets are universal storage organelles for neutral lipids such as TG and cholesteryl esters (CE) and represent dynamic cellular organelles with an important role in lipid and membrane homeostasis 13. We treated HepG2 cells with silymarin or silybin (A) and stained lipid droplets with either Oil Red O or BioTracker™ 488 Green Lipid Dye. Spectroscopic analysis of lipid droplets, quantifying the incorporated Oil Red O (Figure S8E), showed that silybin reduced their content. Interestingly, this reduction was not due to a decrease in the number of lipid droplets, but rather appeared to result from a decrease in their size (based on image quantification of cells stained with the BioTracker Lipid Dye) (Figure S8D). These findings are consistent with the observed decrease in TG levels (Figure 1C) as well as with previous in vitro and in vivo studies using silymarin or silybin 104-108. Silymarin was considerably less efficient in reducing TG levels (Figure 1C), and lipid droplet content in HepG2 cells (Figure S8D and E). + +Stereochemical requirements of silybin for targeting lipid metabolism + +Natural silybin is a mixture of the diastereoisomers silybin A and B 43. To elucidate the active isomer and explore crucial structural features, we applied an efficient preparative HPLC method to obtain the two isomers A and B in pure form 65. Starting from these isomers, the corresponding 2,3-dehydrosilybin enantiomers and the hemiacetal product, in which the 2,3-dihydro-chromane is replaced by 2H-benzofuran-3-one, were synthesized 66 (Figure 3). Lipidomic analysis revealed that silybin A increased phospholipid and decreased TG levels in HepG2 cells, whereas silybin B was considerably less effective (Figure 3). Introduction of a double bond into the flavanon-3-ol moiety of silybin yielded 2,3-dehydrosilybin, which (as 7'R,8'R isomer A) decreased TG levels comparably to silybin but was no longer active on phospholipids (Figure 3). These findings indicate that both, the 2,3-dihydrochromane and the 1,4-benzodioxan scaffold of silybin A contribute to the phospholipid-accumulating activity, whereas modifications of the 2,3-dihydrochromane ring are compatible with TG-lowering properties. Hence, silybin seems to modulate TG and phospholipid metabolism through independent mechanisms. 2,3-Dehydrosilybin and its isomers A and B (Figure 3) selectively decreased the abundance of anionic phospholipids. On the one hand, 2,3-dehydrosilybin lowered the cellular PS content, which we ascribed to isomer B. On the other hand, both isomers, but surprisingly not the stereomeric mixture, induced a drop of PG (2,3-dehydrosilybin A > 2,3-dehydrosilybin B), the precursor of cardiolipins 64. The hemiacetal (Figure 3) increased phospholipid and decreased TG levels by trend, being slightly less efficient than silybin A (Figure 3) but more active than the stereomeric mixture of silybin (Figure 1C). Neither cell number nor membrane integrity were substantially reduced by any of the silybin derivatives up to 20 µM (Figure S9). Together, the effects of silybin on the cellular lipid profile are mediated by only one isomer, and small changes in its structure allow to dissect the activities on phospholipids and TGs. + +Silymarin/silybin acts on multiple nodes in the lipid metabolic network, reducing the overall expression of enzymes involved in triglyceride biosynthesis and phospholipid degradation + +To elucidate the molecular mechanisms by which silymarin/silybin induces a lipid class switch from TGs to phospholipids, we reanalyzed previously published transcriptomic datasets from hepatocytes (in vitro and in vivo) and acquired the transcriptome of an exemplary extrahepatic cell line to distinguish liver-specific from general effects. We focused on genes from the category “Lipid Metabolism” of the Reactome Pathway Database 109 and studied their expression in four experimental systems in vitro and in vivo: i) human HepG2 hepatocarcinoma cells treated with silymarin (12 µg/ml) for 24 h 83, ii) human Huh7.5.1 hepatocarcinoma cells treated with silymarin (40 µg/ml) for 4, 8, and 24 h 84, iii) human Caco-2 colon carcinoma cells treated with either silybin (30 µM) or silymarin (30 µg/ml) for 24 h, and iv) hepatocytes isolated from chronically hepatitis C virus (HCV)-infected mice receiving daily intravenous injections of silybin (265-469 mg/kg) for 3 or 14 d 85. Silybin/silymarin affects the expression of a wide range of enzymes and factors involved in lipid metabolism, but the effects are moderate and, with one exception, do not reach significance after global correction for false discovery (Figure S10A-D). Only the cytochrome P450 (CYP) monooxygenase CYP1A1, which accepts various endogenous substrates, including steroids and polyunsaturated fatty acids 110-114, is highly significantly upregulated in Caco-2 cells (Figure S10C). + +Silymarin/silybin induces the expression of enzymes involved in phospholipid biosynthesis, while reducing the expression of phospholipid degradation enzymes + +Given the detected changes in the HepG2 lipidome (Figure 1B-D), we extended our study to genes that were differentially regulated according to non-adjusted P-values and for which the respective pathway was significantly regulated in the same direction for at least two independent model systems. We found that silybin/silymarin i) decreased the expression of several lipases involved in phospholipid degradation (Figure 4A-F), including phospholipases A1 (PLA1A, Figure 4B), phospholipases A2 (PLA2G1B, PLA2G6, Figure 4A and D, and Figure S11), and phospholipase D (PLD1, PLD6, Figure 4A, B, and D, and Figure S11), specifically in primary hepatocytes and hepatocyte-derived cell lines. + +In addition, silybin/silymarin ii) upregulates factors that deplete phospholipases (PLA2R1, Figure 4B), iii) downregulates enzymes that degrade intermediates in phospholipid biosynthesis (TECR, MGLL, ACP6, GDPD3, PNPLA7, Figure 4B, D and E), and iv) less consistently induces the expression of phospholipid biosynthetic enzymes and other factors (GNPAT, CHKA, SLC44A1, AGPS, AGPAT2, MBOAT2, LPGAT1, DEGS1, CERS6, Figure 4C and D and Figure S11). + +Compensatory mechanisms seem to exist that decrease phospholipid biosynthesis (via PCYT1A, ETNK2, PEMT, GPAM, SPTLC3, CERS2, Figure 4B, C, D and E) or enhance phospholipid degradation (PLA2G4C, DDHD1, ACER3, PLD6, Figure 4B, C and D), possibly buffering the accumulation of phospholipids or rearranging phospholipid profiles through different substrate specificities. + +To investigate whether silymarin/silybin elevates phospholipid levels via de novo phospholipid biosynthesis under our experimental conditions, we treated HepG2 cells with silymarin or silybin for 24 h and determined the mRNA expression of glycerophosphate acyltransferase (GPAT) isoenzymes and lysophosphatidic acid acyltransferase (LPAAT)/lysophospholipid acyltransferase (LPLAT) isoenzymes at the mRNA level. GPATs and LPAATs successively transfer acyl-chains from acyl-CoA to the sn-1 and sn-2 positions of glycerol-3-phosphate to form phosphatidic acid, the common precursor of glycerophospholipids and TGs 64. Silymarin and silybin increased the mRNA levels of GPAT isoenzymes 2 to 4, reaching significance for the silymarin-mediated induction of GPAT3 (Figure 4G), which is consistent with a previous report showing enhanced Gpat3 mRNA expression in the liver of silybin-treated mice on a methionine- and choline-deficient diet 104. In contrast, the expression of LPAAT/LPLAT isoenzymes was not markedly affected (Figure S12A). Together, the moderate but versatile induction of phospholipid biosynthesis and inhibition of phospholipid degradation by silymarin/silybin likely accounts for the accumulation of phospholipids in hepatocytes. + +Silymarin/silybin reduces the expression of triglyceride-synthesizing enzymes + +The decrease in TG levels is driven by the repression of genes associated with the generation of DAGs from either phosphatidate (LPIN2, LPIN3, PLPP1, PLPP3, Figure 4A and C, and Figure S11) or monoacylglycerols (MOGAT2, Figure 4E) and their acylation to TGs (DGAT1, DGAT2, Figure 4A, B, C and E, and Figure S11), as suggested by comparative transcriptomics. The concrete mode of action seems to be context-dependent and possibly under kinetic control, as suggested by the failure of silybin and silymarin to reduce DGAT1 and DGAT2 protein expression in HepG2 cells 24 h after treatment (Figure S12B). TGs are a major component of the hydrophobic core of lipid droplets, which form contact sites with essentially all other cellular organelles and are at the nexus of lipid and energy metabolism 13,115,116. Interestingly, selective inhibition of DGAT1 (by A-922500) or DGAT2 (by PF-06424439) and antagonism of the DGAT-inducing transcription factor peroxisome proliferator activated receptor (PPARγ) 117 (by GW9662) moderately reduced lipid droplet staining in palmitate (PA, 16:0)-loaded human HepaRG hepatocytes (Figure 5A), but only the combined inhibition of DGAT1 and DGAT2 reached the efficacy of the silybin isomer A (Figure 5B). Since lipolysis of TGs in lipid droplets is initiated by ATGL/PNPLA2 118, we investigated the effect of silymarin/silybin on the protein expression of this enzyme, but again found no substantial regulation (Figure S12B), consistent with the transcriptomics data (Figure 4A-E). Note that selective inhibition of ATGL (by atglistatin) also failed to increase lipid droplet signals in stressed HepaRG cells (Figure 5A). + +Silymarin/silybin causes subtle changes in fatty acid anabolism + +Both phospholipid and TG biosynthesis depend on the availability of activated fatty acids 119. Their biosynthesis from acetyl-CoA is an energy- and NADPH-consuming process, which is initiated by the rate-limiting enzyme acetyl-CoA carboxylase (ACC, ACACA) 120. The product of this reaction, malonyl-CoA, is subsequently transferred to fatty acid synthase (FASN), which produces long-chain fatty acids that are activated as CoA esters by acyl-CoA synthetases before further metabolism 121,122. As expected from the multiple roles of acyl-CoAs in lipogenesis, silymarin/silybin ambiguously regulates genes related to fatty acid metabolism, with expression changes either promoting or inhibiting de novo fatty acid biogenesis (ACACA, FASN, SCD5, Figure 4A, C, and E), fatty acid uptake respectively activation (SLC27A1, SLC27A2, SLC27A5, ACSL4, ACSL6, Figure 4A, D, E), fatty acid elongation (ELOVL4, ELOVL6, ELOVL7, TECR, Figure 4B, D and E), and the intracellular transport of acyl-CoAs (ACBD4, DBI, HACD1, Figure 4B, C and E). In HepG2 cells, silymarin/silybin slightly increased ACC/ACACA (but not FASN) protein expression, which was significant for silybin (Figure S12B), while ACC phosphorylation, which inactivates ACC 120, tend to be decreased (Figure S12B). This weak stimulatory regulation of ACC by silymarin/silybin was not translated into increased cellular concentrations of i) malonyl-CoA (ACC product, Figure S12C), ii) long-chain fatty acids (FASN products, Figure S12C), or iii) long-chain acyl-CoAs (acyl-CoA synthetase products, Figure S12C). Conclusively, silybin and silymarin induce changes in fatty acid anabolism that may contribute to, but do not appear to be essential for, the lipid class switch from TGs to phospholipids. + +Silymarin/silybin A promotes phospholipid biosynthesis + +To evaluate the effects of silymarin and silybin A on the biosynthesis of phospholipids and TGs, we treated HepG2 cells with silymarin or silybin A for 6 h and supplied them with 13C2, d3-labelled sodium acetate for additional 18 h. Newly synthesized PE and TG species were detected as M+3 signals by UPLC-MS/MS, with corrections applied for naturally occurring isotopes. As expected, both silymarin and silybin A significantly increased the incorporation of isotopically labelled acetate into PE species, particularly in PE(16:0_18:1) with M+3 in 16:0, PE(18:0_18:1) with M+3 in 18:0, and PE(18:0_18:1) with M+3 in 18:1 (Figure 4I and Figure S13A and C). Note that silymarin also led to a significant incorporation of labled acetate (M+3) into TG species (Figure 4J and Figure S13C and D) and that silybin A displayed a similar trend (Figure 4J and Figure S13C and D). These findings suggest that both silymarin and silybin A stimulate lipid biosynthesis, with silybin A showing a particular preference for phospholipids. Given that silybin, but not silymarin, reduces TG levels (Figure 1B, C), our data strongly suggests that silybin preferentially acts at the level of TG degradation and/or lipid droplet remodeling, an effect that may be compensated for silymarin by the stronger stimulatory effect on TG biosynthesis (Figure 4J). + +Silymarin but not silybin enhances fatty acid degradation for specific settings + +Since the intracellular concentration of long-chain fatty acids is not markedly altered by silymarin/silybin (Figure S12C), while the fatty acid storage capacity in TGs is compromised (Figure 1B-D), we addressed the fate of fatty acids. On the one hand, they seem to be channeled towards phospholipid biosynthesis, as supported by our data (Figure 1B-D). On the other hand, they might be subjected to fatty acid oxidation via mitochondrial or peroxisomal pathways to sustain the energy demand for phospholipid biosynthesis 32,123-125. In support of this hypothesis, oral administration of silybin increased the mRNA expression of carnitine palmitoyl-transferase 1α (Cpt1a) in mouse liver, suggesting an efficient transfer of acyl-CoAs into mitochondria for β-oxidation 104. Transcriptomic analysis underlines that mitochondrial (HADH, ACAT1, ACADVL, Figure 4C, Figure S11) and peroxisomal β-oxidation (ACOX3, HAO2, Figure 4A) are enhanced for specific settings, and we confirmed in cultured HepG2 cells that silymarin increased the levels of the β-oxidation intermediate butyryl-CoA in cultured hepatocytes (Figure 4H). However, the effect does not seem to be mediated by silybin, which failed to enrich β-oxidation intermediates (Figure 4H). Since extensive fatty acid oxidation depletes fatty acid concentrations and thus competes with efficient phospholipid biosynthesis, we would expect fatty acid degradation to be kept in check. Consistent with these considerations, silymarin/silybin decreased the mitochondrial degradation of straight-chain, odd-chain, and branched fatty acids (CPT2, ACAA1, ACAA2, HADH, ACADS, HADHB, PCCA, MCEE, Figure 4B, C, D, E, Figure S11) as well as peroxisomal oxidation (ABCD1, ACOX2, PHYH, Figure 4C and E, Figure S11) and ketogenesis (HMGCS2, BDH1, HMGCLL1, Figure 4B, C, E), especially in mouse liver in vivo and Huh7.5.1 hepatoma cells in vitro. Fatty acid oxidation by CYP enzymes is also subject to intense regulation. Among the various CYP enzymes repressed by silymarin/silybin are those involved in the epoxidation and hydroxylation of polyunsaturated fatty acids (CYP2C8, CYP2C9, CYP2C19, CYP3A4, Figure 4E, Figure S11). ω-Oxidases are instead upregulated (CYP4F2, CYP4A22, Figure 4B and Figure S11), and results for CYP1A1 are mixed (Figure 4B, C and E). + +A detailed description of the impact of silymarin/silybin on cholesterol and CE metabolism is given in Supplementary Note 1. + +Together, silymarin/silybin induce a lipid class switch from TGs to phospholipids by interfering with lipid metabolism at multiple nodes rather than strongly regulating a single specific target. Most importantly, silymarin/silybin limits TG biosynthesis and suppresses phospholipid degradation in both hepatocytes and extrahepatic cells, partly combined with enhanced phospholipid biosynthesis. These central adaptations are accompanied by pronounced changes in cholesterol and fatty acid metabolism. + +Efficacy of silybin in in vitro models of MAFLD and lipotoxicity + +The predominant fatty acids present in TGs of the liver, both in healthy individuals and in MAFLD patients, are palmitic acid (PA, 16:0) and oleic acid (OA, 18:1) 126. Following previously published procedures 127, we established in vitro models of MAFLD and acute lipotoxicity by overloading human HepaRG cells (as a surrogate for normal hepatocytes 128) with a balanced saturated/unsaturated fatty acid mixture (PA:OA = 1:2) or by challenging them with the saturated fatty acid PA 127. We monitored the (time-dependent) increase in lipid droplets (Figure 5B and Figure S14A), TG levels (Figure 5C and Figure S14B), and phospholipid content, specifically PE (Figure 5D and Figure S14C) and PC levels (Figure S14D), and determined the consequences on cellular dehydrogenase activity (as a measure of cell viability) (Figure 5E and Figure S14E), viable cell number (Figure S14F), and membrane integrity (Figure S14G). PA/OA strongly increased lipid droplet staining (Figure 5B), elevated TG levels (Figure 5C), and caused a shift from PE (Figure 5D) to PC (Figure S14D) within 24 h. PA was less efficient in increasing TG levels and did not enhance the lipid droplet signal (Figure 5B), but raised the levels of both phospholipid subclasses investigated (Figure 5D, C and Figure S14D), as expected from the associated induction of ER stress and the UPR 129,130. The effects were less pronounced or even disappeared at longer incubation times (48 h) (Figure S14A-D). While OA/PA did not or hardly impair the metabolic activity of the cells (Figure 5E and Figure S14E), PA was cytotoxic within 24 h (EC50 = 70 µM) (Figure 5E, and Figure S14E), but did not yet disrupt membrane integrity (Figure S14G) or reduce the number of viable cells (Figure S14F). + +To further validate the experimental model, we first investigated whether silybin A is able to induce a lipid class switch in unchallenged HepaRG cells, as expected from our studies in HepG2 cells (Figure 3). Indeed, silybin A (although the effects were less pronounced) induced a lipid class switch in HepaRG cells, but apparently from neutral lipids in lipid droplets to phospholipids (Figure 5B and Figure S14D), with little effect on total cellular TG levels (Figure 5C). We then investigated the effect of silybin A in the two disease models (PA or PA/OA treatment): silybin A still reduced the lipid droplet (but not TG) content (Figure 5B and C), but became less efficient in upregulating phospholipid levels (Figure 5D, and Figure S14C and D) and did not attenuate the lipotoxic drop in cell viability (Figure 5E). Our data indicate that silybin A preferentially redirects lipid metabolism from TGs to phospholipids in healthy hepatocytes and extrahepatic cells, and that this metabolic switch becomes less efficient under severe lipid overload, which might provide a mechanistic basis for the mixed results in clinical trials both, under disease and non-disease conditions 131-136. + +Activation of hepatic phase I and II metabolism in healthy mice + +Silybin induces the expression of phase II enzymes (including glutathione S-transferase, GST) in mouse liver and other tissues 101,137-139. Instead, the consequences on CYP monooxygenases (phase I enzymes) are mixed 101,139-141, possibly due to superimposed direct enzyme inhibition, differences between healthy and diseased states, and different kinetics 142-145. To gain an overview about the global regulation of drug-metabolizing enzymes by silymarin/silybin, we analyzed the transcriptome data from the experimental systems described in section “Silymarin/silybin acts on multiple nodes in the lipid metabolic network” for changes in the expression of genes of the Reactome Pathway Database 109 categories 'metabolism - oxidation', 'phase I metabolism (compound functionalization)', and 'phase II metabolism (compound conjugation)'. Hepatocytes from silybin-treated HCV-infected mice showed a clear kinetic trend: genes of drug-metabolizing enzymes are initially upregulated (day 3) and then downregulated with prolonged treatment (day 14) (Figure 6A). Instead, the mRNA expression of CYP enzymes was differentially regulated in cell-based systems, with individual isoenzymes being up- or downregulated (Figure S15A-C), following independent kinetics (Figure S15B). With few exceptions (CYP3A5, CYP26A1, Figure 6A and B, Figure S15B), silymarin/silybin decreased the mRNA expression of those CYP enzymes that are prominently involved in drug metabolism (CYP2B6, CYP2C8, CYP2C9, CYP2C19, CYP3A4, Figure 6A and B, Figure S15B and D) and of amino oxidases (AOC3, MAOA, MAOB) (Figure 6A and B, Figure S15A and B), which oxidatively deaminate xenobiotic amines, in cell-based systems and in vivo after prolonged administration. Based on these data, we speculated that, in healthy mice receiving silybin for a short period of time (24 h), the increase in intracellular membranes is functionally coupled to membrane protein biosynthesis and accompanied by an increased availability of membrane-bound phase I and II isoenzymes that metabolize and detoxify xenobiotics 146,147. In fact, the protein levels of CYP3A2 and CYP2B1 (but not CYP1A1) were markedly enhanced in the liver of mice receiving silybin hemisuccinate, as shown by immunoblotting (Figure 6C and S16A) and visibly confirmed for all CYP isoforms tested by immunohistochemical analysis (Figure 6D). By contrast, the total amount of hepatic proteins decreased (Figure S16B). CYP enzyme expression was mainly concentrated around the endothelial cells of the central veins. + +Accordingly, the biotransformation activity of CYP enzymes (Figure 6E), GST and UDP-glucuronosyltransferase (UGT) increased strongly (Figure 6F), as determined by the conversion of indicative substrates, possibly to support silymarin glucuronidation and excretion 36. Likely as a consequence of the increased GST turnover, the hepatic glutathione (GSH) pool decreased, with both GSH levels and the ratio to glutathione disulfide (GSSG) being significantly reduced (Figure 6G and H). Since GSH, as an essential co-substrate of glutathione peroxidase (GPX)4, contributes to the reduction of lipid hydroperoxides and prevents degenerative cell death 148, we speculated that the decrease in GSH might enhance lipid peroxidation, which was, however, not the case (Figure 6I). Silybin actually attenuated the formation of lipid peroxidation products by trend in the liver but not in the kidney (Figure 6I), consistent with previous studies on silymarin/silybin 105,149,150. Together, the silybin-mediated accumulation of hepatic phospholipids (Figure 1B-D) is associated with an upregulation of membrane-bound detoxifying enzymes as well as GST isoenzymes that are present in different subcellular membrane compartments, including cytosol, mitochondria, ER, plasma membrane and nucleus 151. + +For information on the effects of silymarin/silybin on vitamin A metabolism, see Supplementary Note 2. + +Discussion + +The efficacy of silymarin and its major active component, silybin, in alleviating toxic liver injury and metabolic diseases 51 has been ascribed to hepatoprotective, anti-inflammatory, anti-oxidative response-inducing and membrane-stabilizing properties as well as to lipid-(TG and cholesterol)-lowering effects 38,152,153. Here, we report that silybin induces a metabolic switch in hepatocytes and extrahepatic cells, especially under non- or pre-disease conditions, linking hepatic TG metabolism with membrane biogenesis and potentially biotransformation activity (Figure 7), with the latter potentially contributing to the liver protective function. + +Effects of silymarin/silybin on lipid-metabolizing enzymes + +Specifically, silybin treatment lowers TG levels, while limiting phospholipid degradation in hepatocytes and, under certain settings, additionally stimulates phospholipid biosynthesis, reflecting a net transfer of fatty acids from TGs to phospholipids (Figure 7). Context-dependent adaptations of fatty acid biosynthesis, intracellular transport, mitochondrial and peroxisomal degradation, cholesterol biosynthesis, and sterol metabolism further add to the class switch from TGs to phospholipids. Consequently, the size of lipid droplet decreases while the content of membrane phospholipids increases. At the same time, intracellular membranes are formed that, when coordinated with an upregulation of phase I and II membrane-(associated) enzymes, may enhance the biotransformation capacity of subcellular compartments, such as the ER. A decrease of hepatic lipid droplet size and TG levels is generally considered beneficial in metabolic diseases 10,154. In support of this principle, increased ATGL/PNPLA2 expression protects against hepatic steatosis 155, whereas ATGL/PNPLA2 repression promotes the development of MAFLD 156,157. On the other hand, lipolysis is also associated with elevated levels of free fatty acids, which in excess may be lipotoxic to hepatocytes or cause oxidative stress when being degraded by mitochondrial or peroxisomal β-oxidation 6,158. Thus, suppression of TG biosynthesis by selective inhibition of DGAT2 improves steatohepatitis and insulin sensitivity, but at the same time exacerbates liver damage in a methionine and choline deficient (MCD) mouse model of NASH 6. However, in alternative animal models (such as those using diets high in fructose, saturated fat, and cholesterol 159, or Western diets 160), DGAT2 inhibition reduced steatosis without affecting inflammation or fibrosis in the latter. Conclusively, the reduction of lipid droplets and TGs alone does not fully explain the hepatoprotective function of silymarin and silybin, but requires an efficient channeling of the degradation products into non-toxic metabolites, i.e., phospholipids, as suggested by our results. A similar redistribution was observed for the inhibition of DGAT2 (PF-06424439), although it was restricted to the ER and PE species 161. This metabolic switch to phospholipids is likely to be of biomedical relevance in toxic liver injury and MAFLD/MASH, where either the hepatic content of total phospholipids or specific phospholipid subclasses is decreased 35,53,54,62. Consistent with this metabolic dysregulation, many key regulatory factors of MAFLD involve enzymes that are central to phospholipid and TG metabolism, including PNPLA3 30, LPIAT1/MBOAT7 19,29,30,131,162, ATGL/PNPLA2 22, iPLA2/PLA2G6 23,24, PLA2G7 163, PLA2 activity of PRDX6 27, PLD1 28, and LPIN2 21. Altogether, genetic variations or changes in protein expression of these enzymes define the risk of developing MAFLD 20,164 and, together with other regulatory mechanisms, may shape the aberrant lipid composition of the diseased liver, with decreasing phospholipids and increasing TGs 32-35,165-167. Silymarin/silybin regulates a significant number of these lipid metabolic genes, including iPLA2/PLA2G6, ATGL/PNPLA2, PLD1, LPIN2, and by trend PNPLA3 (which is a major genetic risk factor for MAFLD 131) and HSD17B13, counteracting the observed dysregulation in liver diseases. In line with our findings, a recently published randomized controlled trial showed that silybin treatment improved MAFLD parameters only in patients without a genetic predisposition, while it was ineffective in patients carrying either one or a combination of mutations responsible for genetically inherited forms of MAFLD 131. Given that the metabolic and genetic components of MAFLD differ fundamentally 168, these findings suggest that silymarin/silybin may be particularly effective against the metabolic, but not against the genetic, form of MAFLD. + +In addition, we show here that silymarin/silybin represses the potentially disease-promoting oxidative metabolism of fatty acids (via mitochondrial and peroxisomal pathways but also CYP enzymes) in many settings, including primary mouse hepatocytes, although opposite regulations were also observed at the transcriptome level. + +Diverse mechanisms have been discussed for the TG- and cholesterol-lowering activity of silymarin/silybin: i) reduced lipid resorption, ii) upregulated cholesterol efflux via (ABC) transporters that excrete cholesterol from the liver to the bile 104,152,169, and iii) adjustments in lipid biosynthesis, transport, and degradation by targeting major transcription factors in lipid metabolism 58,61,104,170-172, such as PPARα/PPARγ, LXR; ChREBP and SREBP-1c 55,171-174. Lipid-metabolic proteins proposed to be affected by silymarin/silybin include enzymes involved in fatty acid biosynthesis (ACC/ACACA, FASN, SCD-1), uptake (FABP5), and degradation (CPT1α, ACOX), phospholipid biosynthesis (GPATs), lipid transport (MTTP), and phosphatidic acid/TG turnover (PNPLA3) 58,61,104,170-172,175. While these studies focused on the ability of silymarin/silybin to restore expression levels under pathophysiological conditions, we first addressed non-stressed cells, healthy mice, and pre-disease conditions. Comparative transcriptomic analyses in four different model systems confirmed that silymarin/silybin differentially regulates pathways contributing to TG and phospholipid metabolism. Specifically, our analysis revealed that silybin broadly manipulates phospholipid metabolism, although the exact mechanism varies between model systems and experimental settings. Overall, we show that silymarin/silybin reduces phospholipid degradation by repressing various phospholipases (PLA2G1B, PLA2G6, PLD1, and/or PLD6) or inducing the expression of phospholipase-suppressing factors (e.g., PLA2R1). However, the specific enzymes targeted can vary between different experimental models, and in some cases alternative enzymes may be upregulated, potentially acting as compensatory mechanisms. Less consistently, silymarin/silybin also upregulates the expression of factors involved in acyl-CoA supply (e.g., FASN, SLC27A1, ELOVL7, ACSL4) and phospholipid biosynthesis (e.g., MBOAT2, LPGAT1), via both de novo and remodeling pathways. In support of the relevance of this mechanism, we show that silymarin and silybin increase the incorporation of isotopically labeled acetate into phospholipids. On the other hand, silymarin/silybin seems to suppress TG biosynthesis in several experimental systems, mainly by repressing enzymes involved in the generation of DAGs and their acylation to TGs (e.g. via DGAT1 and DGAT2). In HepG2 cells, DGAT1/2 protein expression was not repressed by either silybin or silymarin (at least under our experimental conditions), allowing us to determine independent effects on the rate of TG biosynthesis, which actually increased, especially for silymarin. These data suggest that silymarin/silybin rather than suppressing TG biosynthesis regulates TG remodeling in HepG2 cells, as supported by the observed decrease in lipid droplet size. The situation may be different in other experimental systems, in which suppressive effects on TG biosynthesis are expected based on transcriptome analysis. + +The important role of silymarin/silybin in modulating lipid metabolism has been recognized before, and effects on ACC 55,108,176, FASN 55,108,169,172,176-178, SCD-1 14,104,172,179, GPATs 104, PNPLA3 104,175,177 , FABP5 104,172,179, CPT1a 55,104,108,172,178,180, MTTP 104, ACOX 104, PPARα/PPARγ 55,104,172,173,175,177,180,181 and SREBP-1c 55,104,175-177,180,181 have been reported independently, either under disease 55,60,61,104,150,171,175,176,182 or non-disease conditions 58,169,177,178, largely without considering their interplay. By converging transcriptomics, metabololipidomics, and functional studies, we put these individual findings into context. Thus, our data strongly suggest that silybin, by coordinating multiple enzymes involved in lipid metabolism, facilitates the efficient channeling of fatty acids from TGs into phospholipids unless cells experience extensive lipid overload, with potential implications for disease prevention. The liver and body weight of the treated mice were reduced accordingly. We conclude that silybin buffers excessive hepatic TG accumulation, a hallmark of MAFLD, and redirects fatty acids by limiting phospholipid degradation and stimulating (energy-consuming) phospholipid biosynthesis and possibly membrane biogenesis. + +Gavage of silymarin/silybin to mice reduced pathological changes in liver and serum lipid composition 54,62,63,183,184, and its beneficial effects were anticipated to depend on either a decreased cholesterol/phospholipid ratio 62, a reduced proportion of SM relative to PC 62,183, or increased PE levels 63. Our lipidomic analysis essentially confirmed an efficient upregulation of PE and other glycerophospholipids (rather than sphingolipids) in mouse liver by silybin. The influence on membrane properties is difficult to assess, but the homogeneous upregulation of phospholipid classes suggests that there are no major changes. It should be noted that we did not analyze free cholesterol, a major membrane component that affects rigidity and fluidity 185. + +Structural aspects of silybin A for the induction of a metabolic switch + +Structure-activity relationship studies underscore that silybin functionally intervenes at two (or more) different sites in lipid metabolism to accomplish the shift from TGs to phospholipids. While the saturation of the flavonoid scaffold at the 2,3-position is essential for phospholipid accumulation (but has little effect on the amount of cellular TG), changes in the stereochemistry at the dioxan ring reduced both the effect on phospholipid and TG levels. The introduction of a 2,3-double bond yielding 2,3-dehydrosilybin even resulted in a decrease of the PS and PG content. The biosynthesis of these acidic phospholipids requires the conversion of DAG to phosphatidic acid, whereas PC and PE can be synthesized directly from DAG (Figure 7) 186. Interestingly, the ring rearrangement in the hemiacetal did not substantially hamper the activity on phospholipids or TGs when compared to the diastereomeric silybin mixture. Together, silybin modulates phospholipid and TG metabolism through independent pathways, with the magnitude and directionality of the effect strongly dependent on the stereochemistry and saturation of the flavonolignan. Consistent with the hypothesis that silybin upregulates the intracellular phospholipid content also independently of the decrease in TGs, pharmacological inhibition of specific isoenzymes involved in lipid droplet degradation (ATGL) or lipid droplet biogenesis (DGAT2) did not markedly alter the cellular phospholipid content. + +Impact of silymarin/silybin on drug-metabolizing enzymes + +We also show that silymarin/silybin increases the content of phospholipids in hepatocytes, thereby forming intracellular membranes that are likely to host enzymes involved in biotransformation. On the one hand, phase I and phase II enzymes provide protection against multiple xenobiotics and diminish drug-induced hepatotoxicity 187. On the other hand, phase I CYP enzymes convert various xenobiotics, e.g., the analgesic drug acetaminophen (paracetamol), into toxic metabolites 188. Silymarin has been proposed to protect against toxic liver injury i) by inhibiting CYP enzymes and suppressing deleterious metabolism, ii) by inducing the expression of phase II enzymes such as UGT and GST, and iii) by upregulating membrane transporters that enhance the excretion of xenobiotics 137,138. While our data confirm an upregulation of phase II enzyme activities by silybin, we found that not only the expression but also the activity of multiple CYP isoenzymes was increased rather than decreased under short-term treatment. We suggest that the mixed outcomes of studies investigating the effect of silymarin/silybin on CYP enzymes originate from kinetic regulation and the competition between CYP expression and inhibition, which seems to be sensitive to the dosage, route of application, formulation, and/or duration of treatment 101,137,139. Thus, the elevated CYP enzyme activity in our experimental design is likely due to an increased CYP protein expression that masks the inhibitory effect of silybin on CYP activity. In support of this hypothesis, silymarin administration to rats increased the hepatic cytochrome P450 levels with defined kinetics 189, as further validated here at the transcriptome level in HCV-infected mice treated with silybin. Overall, silymarin/silybin induced a rapid upregulation of drug-metabolizing enzymes, followed by a decrease in expression with prolonged treatment. Another factor that may contribute to the variable study results on CYP enzymes is that healthy and diseased tissues seem to respond differently to silybin. In fact, silymarin/silybin partially restores CYP enzyme homeostasis under pathophysiological conditions 141,142,144, whereas effects in healthy individuals are more diverse 140,145,152. It should be noted that, with a few exceptions, most in vivo animal and human studies have failed to confirm that silymarin/silybin substantially interferes with the pharmacokinetics of various drugs that are metabolized by CYP enzymes 36. However, one of the few studies showing significant effects in healthy volunteers found, consistent with our results in mice, that silymarin (140 mg, daily) increased the clearance and decreased the Cmax values of metronidazole, a drug that is metabolized by CYP3A4 and CYP2C9 190. Whether the modulation of CYP enzyme activity by silymarin is of clinical relevance in patients with MAFLD remains elusive and needs to be systematically evaluated for specific formulations, dosages and CYP isoenzymes in future kinetic studies. + +Efficacy of silymarin/silybin in the treatment of MAFLD + +Given the mixed results of silymarin/silybin on lipid metabolism in health and disease 131-136, we investigated the ability of silybin to redirect lipid metabolism in in vitro models of MAFLD (achieved by massive fatty acid overload) and acute lipotoxicity (induced by excess saturated fatty acids). On the one hand, silybin A consistently reduced lipid droplet content below basal levels in unstressed and fatty acid-challenged hepatocytes, notably superior to selective inhibitors of DGAT1 or DGAT2 or antagonist of PPARγ. On the other hand, silybin A was considerably less effective in redirecting fatty acids from lipid droplets to phospholipids in stressed as compared to non-stressed cells and did not protect against lipotoxicity. Our results suggest that the silymarin/silybin-induced lipid class switch from TGs to phospholipids is particularly effective in protecting against adverse dysregulation of lipid metabolism in normal and pre-disease conditions, whereas the beneficial effects appear to be largely limited to reducing TGs in liver diseases associated with severe TG accumulation, such as MAFLD. Further studies are needed to elucidate the general relevance of this dual mechanism by directly comparing healthy and diseased states in clinical trials. + +Differences between the effects of silymarin and silybin + +Silymarin and silybin modulate lipid metabolism in hepatocytes in a comparable manner, but there are also substantial differences, and some effects are seen only for silymarin or silybin. + +First, only silymarin elevated the levels of butyryl-CoA, an intermediate of β-oxidation (1.5-fold), implying that fatty acid degradation is stimulated by components of silymarin other than silybin. Whether such polypharmacological modulation by silymarin has advantages, is poorly understood. On the one hand, we discussed above that excessive β-oxidation under stress conditions could be detrimental due to the production of reactive oxygen species (ROS)14. On the other hand, the induction of fatty acid catabolism by silymarin is moderate and could help to meet the energy demands for stress-adaptive, regenerative pathways (including lipid remodeling), especially since the antioxidants in silymarin already counteract ROS accumulation 191. + +Second, we observed significant differences in the effect of silymarin and silybin on triglyceride levels in different cell types. Whereas silybin significantly reduces TG levels in hepatocytes and has no effect in monocytes, silymarin hardly affects TG levels in hepatocytes but robustly decreases them in monocytes. While the accumulation of TGs in hepatocytes is critical for the development of MAFLD, the extent to which reducing TGs in monocytes benefits the disease process is not well understood. + +Third, silymarin and silybin clearly differ in how they manipulate the expression of lipid-metabolizing enzymes, although some of the effects may be related to the use of different model systems, which is a limitation of this study. For example, the expression of DGAT2 is significantly downregulated only in hepatocytes isolated from silybin-treated mice, without effects in silymarin-treated HepG2 and Huh7.5.1 liver cells. However, reduced expression of DGAT1 is observed in both hepatocytes from silybin-treated mice and silymarin-treated HepG2 and Huh7.5.1 cells, suggesting that the repression of DGAT2 is silybin-specific. Additional differential effects are seen in the regulation of phospholipases: PLA2G1B is downregulated in hepatocytes from silybin-treated mice, whereas PLD1 is downregulated in silymarin-treated HepG2 and Huh7.5.1 cells. + +In addition to modulating lipid metabolism, silymarin is known to have beneficially effects on other pathogenic mechanisms associated with MAFLD, such as inflammation and glucose metabolism 192, the latter of which is also supported by our data. + +Conclusion + +The milk thistle extract silymarin and its bioactive component silybin have unique lipid-modulating properties. Rather than targeting one particular pathway, silymarin/silybin affects lipid metabolism at multiple hubs. In hepatic pre-disease states, silybin decreases TG content, while attenuating phospholipid degradation and stimulating phospholipid biosynthesis. In combination with the parallel reprogramming of phase I and II metabolism, this lipid class switch seems to expand functional intracellular membranes and redirects the hepatic biotransformation capacity. Considering that the selective inhibition of TG biosynthesis actually enhances liver damage, as suggested by preclinical studies with DGAT2 antisense oligonucleotide treatment 6, we propose that the lipid metabolic switch from TGs to phospholipids in hepatocytes and potentially other liver cells (i.e., Kupffer cells) and extrahepatic cells critically contributes to the liver-protective (rather than disease-alleviating) function of silybin. The beneficial reprogramming of lipid metabolism is based on the absolute configuration of silybin as well as the saturation of ring C in the flavonoid scaffold at the 2,3-position. These structural aspects contribute differentially to the TG-lowering and phospholipid-accumulating activities of silybin, and structural modifications realized in minor components of milk thistle allow dissection of both activities. + +In conclusion, our results shed light on the mechanisms underlying liver protection by silymarin/silybin under physiological and pathophysiological conditions. Although silymarin/silybin appears to have the potential to improve the biochemical hallmarks of MAFLD and may be beneficial in mild forms of the disease through the mechanisms proposed here, our data suggest that this mechanism may be less effective or even ineffective in severe disease states. Whether silymarin/silybin exerts beneficial effects under these conditions when combined with adjunctive supplements or dietary restriction remains elusive. Future evidence-based studies with a larger number of participants and longer follow-up are needed to explore the relevance of the silybin A-induced lipid metabolic switch in humans, both for disease prevention and under pathophysiological conditions. + +Supplementary Material + +Supplementary figures and notes. + +Funding: Research activities of the authors related to the subject of this article were supported by the Global Research Initiative 2013/2014 (Bionorica SE), the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) [KO 4589/4-1], Bionorica Research GmbH (#320092), and the Phospholipid Research Center Heidelberg (AKO-2019-070/2-1 and AKO-2015-037/1-1). Moreover, we acknowledge AIPRAS Onlus (Associazione Italiana per la Promozione delle Ricerche sull'Ambiente e la Saluta umana) for grants in support of this investigation. The authors acknowledge the financial support by the University of Graz. Illustrations in the graphical abstract were created with BioRender.com. + +The above-mentioned funding sources were neither involved in study design, data collection, analysis, and interpretation nor in writing and submission of the manuscript. + +Author contributions + +Solveigh Koeberle: Conceptualization, Data Curation, Formal analysis, Supervision, Visualization, Writing - Original Draft, Writing - Review & Editing. Maria Thürmer: Investigation, Methodology, Visualization, Writing - Review & Editing. Fengting Su: Investigation, Methodology, Visualization, Review & Editing. Markus Werner: Investigation, Writing - Review & Editing. Julia Grander: Investigation, Visualization. Laura Hofer: Investigation. André Gollowitzer: Investigation, Writing - Review & Editing. Loc Le Xuan: Investigation. Felix Benscheidt: Investigation. Ehsan Bonyadirad: Investigation. Armando Zarrelli: Methodology, Writing - Review & Editing. Giovanni Di Fabio: Methodology, Writing - Review & Editing. Oliver Werz: Writing - Review & Editing. Valeria Romanucci: Funding acquisition, Investigation, Methodology, Writing - Review & Editing. Amelie Lupp: Investigation, Methodology, Writing - Review & Editing. Andreas Koeberle: Conceptualization, Data Curation, Formal analysis, Funding acquisition, Project administration, Supervision, Visualization, Writing - Original Draft, Writing - Review & Editing. + +Declaration of generative AI and AI-assisted technologies in the writing process + +During the preparation of this work the authors used ChatGPT3.5 and DeepLWrite in order to improve readability and language. After using these tools, the authors reviewed and edited the content as needed and take full responsibility for the content of the publication. + +Abbreviations + +ACC acetyl-CoA carboxylase + +ACOX3 acyl-CoA oxidase 3, pristanoyl + +ACOT7 acyl-CoA thioesterase 7 + +ACSL6 acyl-CoA synthetase long chain family member 6 + +ATF6 activating transcription factor + +ATGL adipocyte triglyceride lipase + +BSA bovine serum albumin + +CE cholesteryl esters + +CL chemiluminescence + +CPT1a carnitine palmitoyl-transferase 1α + +CYP cytochrome P450 + +DAG diacylglycerol + +DGAT diacylglycerol-O-acyltransferase + +ER endoplasmic reticulum + +FASN fatty acid synthase + +GPAM glycerol-3-phosphate acyltransferase, mitochondrial + +GPAT glycerophosphate acyltransferase + +GPX glutathione peroxidase + +GSH glutathione + +GSSG glutathione disulfide + +GST glutathione S-transferase + +HAO2 hydroxyacid oxidase 2 + +HCV hepatitis C virus + +HSD17B13 17-beta-hydroxysteroid dehydrogenase 13 + +LPIAT1 lysophosphatidylinositol acyltransferase 1 + +LPIN2 Lipin 2 + +LPAAT lysophosphatidic acid acyltransferase + +LPLAT lysophospholipid acyltransferase + +MBOAT7 membrane-bound O-acyltransferase domain-containing 7 + +MAFLD metabolic dysfunction-associated steatotic liver disease + +MASH metabolic dysfunction-associated steatohepatitis + +NAFLD non-alcoholic fatty liver disease + +NASH non-alcoholic steatohepatitis + +PC phosphatidylcholine + +PE phosphatidylethanolamine + +PG phosphatidylglycerol + +PI phosphatidylinositol + +PNPLA patatin-like phospholipase domain-containing + +PLA1A phospholipases A1 + +PLA2 phospholipase A2 + +iPLA2/PLA2G6 calcium-independent phospholipase A2 / phospholipase A2 Group VI + +PLA2G7 phospholipase A2 Group VII + +PLD1 phospholipase D1 + +PRDX6 peroxiredoxin 6 + +PS phosphatidylserine + +ROS reactive oxygen species + +SCD5 stearoyl-CoA desaturase 5 + +SM sphingomyelin + +SREBF sterol regulatory element binding transcription factor 1 + +TG triglyceride + +UGT UDP-glucuronosyltransferase + +UPR unfolded protein response + +XBP1s spliced form of X-box-binding protein 1 + +Figure 1 Shift from TGs to phospholipids in human monocytes, hepatocytes, and mouse liver. (A) Main components of silymarin. (B-D) Total amounts of lipid classes were determined by UPLC-MS/MS. (B, C) Human primary monocytes (B) and HepG2 cells (C) were treated with silymarin (50 µg/ml for monocytes and 10 µg/ml for HepG2 cells), silybin (20 µM), or vehicle (ethanol for silymarin, DMSO for silybin) for 24 h. Individual values and mean + SEM; n = 3 (B: except TG, C: silymarin except TG), n = 4 (C: TG silymarin), n = 6 (B: TG silymarin and silybin, C: TG silybin), n = 7 (C: silybin except TG). (D, E) Mice received silybin hemisuccinate ('silybin'; 200 mg/kg, i.p.) or vehicle (0.9% NaCl) trice at 0, 12, and 24 h and were sacrificed after 37 h. (E) Body temperature, body weight and organ weight of mice upon administration of silybin. Temperature and body weight were measured after 37 h before animals were sacrificed and organs collected. The box-and-whisker plot shows fold-changes upon silybin gavage. The median fold change belonging to each group is shown as bold line. The boxes extend from the 25th to 75th percentiles, and whiskers extend to minimal and maximal values. Vehicle control; body temperature: 37.2 ± 0.2 [°C]; body weight: 21.9 ± 0.2 [g]; liver: 1.31 ± 0.03 [g]; spleen: 0.070 ± 0.002 [g]; kidney: 0.1445 ± 0.004 [g]; heart: 0.126 ± 0.0023 [g]; brain: 0.439 ± 0.006 [g]; thymus: 0.049 ± 0.002 [g]; adrenal: 0.0105 ± 0.001 [g]; Lipid contents are given as nmol / 1×106 cells for PC and units / 1×106 cells for PE, PS, PI, PG, SM and TG. Individual values and mean + SEM (D) or box plots and individual values (E) from n = 5 (D: CE and TG), n = 7 (D: PE; ctrl, E: body temperature), n = 8 (D: except CE and TG, E: body and organ weights) mice/group. *P < 0.05, **P < 0.01, ***P < 0.001 vs. vehicle control. Two-tailed paired (B, C) or unpaired (D, E) Student's t-test. + +Figure 2 Phospholipid profiling indicates an upregulation of diverse species. Human primary monocytes and HepG2 cells were treated with silymarin (50 µg/ml for monocytes and 10 µg/ml for HepG2 cells), silybin (20 µM) or vehicle (ethanol for silymarin, DMSO for silybin) for 24 h. Mice received silybin hemisuccinate ('silybin'; 200 mg/kg) or vehicle (0.9% NaCl) trice at 0, 12, and 24 h and were sacrificed after 37 h. (A) Volcano plots showing the cellular proportion of phospholipid species that increase (yellow background) or decrease (grey background) upon treatment with silymarin or silybin. Adjusted P values given vs. vehicle control. The dashed line indicates a P-value of 0.05. (B) Forest plots depicting phospholipid species that are up- (positive values) or down-regulated (negative values) by silymarin (squares) or silybin (circles). Values, calculated as percentage of control, show the difference to 100%, with the dashed line at 0% indicating no difference to control. The dot size describes the mean relative abundance of phospholipid species within the phospholipid subclass (relative intensities). Data and the number of experiments are identical to Figure 1. + +Figure 3 Silybin A is the active isomer that causes the switch from TGs to phospholipids. HepG2 cells were treated with the indicated compounds (20 µM) or vehicle (DMSO) for 24 h. Total amounts of lipid classes were determined by UPLC-MS/MS and are given as nmol / 1×106 cells for PC and units / 1×106 cells for PE, PS, PI, PG, SM and TG. Individual values and mean + SEM; n = 3 (PE silybin A, PS dehydrosilybin, TGs, free fatty acids (FFA) 2,3-dehydrosilybin A and B) n = 4 (except PE silybin A, PS dehydrosilybin, TGs, free fatty acids FFA 2,3-dehydrosilybin A and B). *P < 0.05, **P < 0.01, ***P < 0.001 vs. vehicle control (DMSO). Two-tailed paired Student's t-test of log-transformed data. + +Figure 4 Silymarin/silybin induces global changes in phospholipid, TG and sterol metabolism. (A-F) Comparative analysis of transcriptome data from silymarin-treated HepG2 (A) and Huh7.5.1 hepatocarcinoma cells (B), silymarin- and silybin-treated Caco-2 colon carcinoma cells (C), and hepatocytes derived from HCV-infected mice receiving silybin (D, E). Volcano plots compare the expression of lipid metabolic genes upon silymarin (A-C) or silybin (C-E) treatment vs. vehicle control. Differentially expressed genes are defined as those that show consistent regulation in the same direction in at least two independent model systems at a significance level of P < 0.05 (without adjustment for multiple comparisons) and are annotated in the corresponding plots. The dashed line indicates a P-value of 0.05; multiple two-tailed unpaired Student's t-tests. (F) Radar plots indicating the fold change in PLA2G1, DGAT1, and INSIG1 expression by silymarin (HepG2, Huh7.5.1, Caco-2) or silybin (hepatocytes, Caco-2) relative to vehicle control. Non-adjusted P values given vs. vehicle control; multiple two-tailed unpaired Student's t-tests (G-J). HepG2 cells were incubated with silymarin (10 µg/ml), silybin (20 µM) or vehicle (ethanol for silymarin, DMSO for silybin) for 24 h. (G) mRNA levels of GPAT2-4 normalized to β-actin. Individual values and mean + SEM as fold-change of control; n = 4 (GPAT2 and GPAT4), n = 5 (GPAT3). (H) Effects of silymarin and silybin on the cellular ratio of short-chain acyl-CoAs, normalized to the internal standard [13C3]-malonyl-CoA. Individual values and mean + SEM; n = 5 (silybin) and n = 6 (silymarin). *P < 0.05, ***P < 0.001 vs. vehicle controls; two-tailed paired Student's t-tests. (I, J) Incorporation of isotopically labeled sodium acetate-13C2, d3 in PE (I) and TG (J) by HepG2 cells treated with silymarin (10 µg/ml), silybin (20 µM), or vehicle (ethanol for silymarin, DMSO for silybin) for 24 h. The total amount of the isotopically labeled PE and TG species analyzed is shown. Individual values and means + SEM; n = 3. *P < 0.05 vs. vehicle controls; two-tailed paired Student's t-tests. + +Figure 5 The efficacy of silybin in inducing a lipid class switch differs between hepatocyte pre-disease and disease models. (A,B) HepaRG cells were treated with 0.1 mM palmitate (PA) or a mixture of PA/oleate (OA) in a 1:2 ratio (in total 1 mM) together with vehicle (DMSO, 0.5%), silybin A (20 μM), the ATGL inhibitor atglistatin (50 µM), the DGAT1 inhibitor A 922500 (5 µM), the DGAT2 inhibitor PF-06424439 (10 µM), a combination of DGAT1 (5 µM) and DGAT2 inhibitors (10 µM), or the PPARγ antagonist GW9662 (5 µM) for 24 h. (A) Relative lipid droplet content. Individual values and mean + SEM, n = 3. (B) Left panel: Relative lipid droplet content. Individual values and mean + SEM, n = 3. Right panel: Representative images of HepaRG cells stained for lipid droplets using Oil Red O; scale bar, 50 µm. (C, D) HepaRG cells were co-treated directly with with 0.1 mM palmitate (PA) or a mixture of PA/oleate (OA) in a 1:2 ratio (in total 1 mM) and vehicle (DMSO, 0.5%) or silybin A (20 μM) for 24 h. Total levels of TG (C) and PE (D) determined by UPLC-MS/MS. Individual values and mean + SEM, n = 3. (E) Cell viability measured by MTT assay. Individual values and mean + SEM, n = 3. *P < 0.05, **P < 0.01, ***P < 0.001 vs. control; two-tailed paired (A, B, E) or unpaired (C, D) Student's t-test. + +Figure 6 Elevated CYP enzyme expression and activity in mouse liver. (A) Comparative analysis of transcriptome data from hepatocytes derived from silybin-treated HCV-infected mice. Volcano plots compare the expression of lipid metabolic genes upon silybin treatment vs. vehicle control at day 3 and day 14. The dashed line indicates a non-adjusted P-value of 0.05; multiple two-tailed unpaired Student's t-tests. (B) Radar plots indicating the fold change in MAOB and CYP26A1 expression by silybin relative to vehicle control. Non-adjusted P values given vs. vehicle control; multiple two-tailed unpaired Student's t-tests. (C-I) Mice received silybin hemisuccinate ('silybin'; 200 mg/kg, i.p.) or vehicle (0.9% NaCl) trice at 0, 12, and 24 h and were sacrificed after 37 h. (C) Protein expression of CYP3A2, CYP1A1, and CYP2B1 in mouse liver homogenates. Representative Western blots are shown in Figure S16. Individual values and mean + SEM; n = 5 mice/group. (D) Immunohistological analysis of CYP3A2, CYP1A1 and CYP2B1 expression in mouse liver; scale bar, 100 µm. n = 5 mice/group. (E) CYP activity measured by detecting the oxidative demethylation product formaldehyde (EMND) or the conversion of fluorogenic substrates in mouse liver homogenates. EMND: N-ethylmorphine N-demethylation (CYP3A), ECOD: 7-ethoxycoumarin O-deethylation (CYP1A and CYP2A-C), EROD: 7-ethoxyresorufin O-deethylation (CYP1A), MROD: 7-methoxyresorufin O-demethylation (CYP1A), PROD: 7-pentoxyresorufin O-depentylation (CYP2B), BROD: 7-benzyloxyresorufin O-debenzylation (CYP2A-C and CYP3A). Indicative CYP enzymes are listed in brackets. Individual values and mean + SEM; n = 8 mice/group. (F) Enzyme activity of GST and UGT in mouse liver homogenates. GST: gluthathione S-transferase; UGT: UDP-glucuronosyltransferase. Individual values and mean + SEM; n = 8 mice/group. (G-I) GSH levels (G), GSH/GSSG ratio (H) and lipid peroxidation (I) in mouse liver and kidney homogenates. Individual values and mean + SEM; n = 7 (liver GSH and GSH/GSSG, kidney lipid peroxidation) or n = 8 (kidney GSH and GSH/GSSG, liver lipid peroxidation) mice/group. *P < 0.05, **P < 0.01, ***P < 0.001 vs. control; two-tailed unpaired Student's t-test. + +Figure 7 Proposed mechanisms of silymarin and its bioactive constituent silybin A in hepatocytes. Acetyl-CoA-carboxylase (ACC/ACACA) converts acetyl-CoA to malonyl-CoA, which is elongated to long-chain fatty acids by fatty acid synthase (FASN). Acyl-CoA esters are formed from free fatty acids (FAs) by acyl-CoA synthetases (ACSLs), which also activate exogenous fatty acids for further metabolism. Saturated acyl-CoAs are converted into monounsaturated acyl-CoAs (MUFA-CoA) preferentially by Δ9-desaturases, such as the stearoyl-CoA desaturase (SCD) isoenzyme 5. Acyl-CoA thioesterases (ACOTs) catalyze the opposite reaction, hydrolyzing acyl-CoAs to free fatty acids (FAs). Acyl-CoAs are used by glycerol-3-phosphate acyltransferases (GPATs) and lysophospholipid (LPL) acyltransferases/lysophosphatidic acid acyltransferases (LPLATs/LPAATs) to introduce fatty acyl-chains into the sn-1 and sn-2 positions of glycerol-3-phosphate and lysophosphatidic acid (LPA), respectively. The resulting PA is either converted to CDP-DAG for PI, PG, and PS biosynthesis or dephosphorylated to DAG for TG, PC, and PE biosynthesis by lipins (LPINs) and other PA phosphatases. LPIN2 also plays an important role in the regulation of fatty acid metabolism as nuclear transcriptional coactivator. Acylation of DAG by DGATs yields TGs, which are stored in lipid droplets and mobilized by ATGL/PNPLA2 and other triglyceride lipases, providing DAG and FAs. Phospholipid degradation is driven by a large number of phospholipases with different specificities. PLA2G6 releases saturated and unsaturated long-chain fatty acids from the sn-1 or sn-2 position of phospholipids, such as PC, PE and PA, whereas PLD1 specifically cleaves PC to PA and choline. By targeting multiple nodes, silymarin/silybin triggers a switch from TGs to phospholipids, thereby enriching intracellular membranes with phospholipids that have a balanced fatty acid composition. The increase in intracellular membranes is associated with enhanced membrane-associated biotransformation capacities. Mechanistically, silymarin/silybin inhibits phospholipid degradation, while moderately activating de novo phospholipid biosynthesis and stimulating TG catabolism in lipid droplets (LD), which in combination results in an effective channeling of TG-derived DAG and FAs into membrane biogenesis. In addition, silymarin induces the expression of genes involved in peroxisomal fatty acid degradation (HAO2, ACOX3), upregulates ACOT7, which hydrolyzes acyl-CoAs into FAs and CoA, and decreases the expression of ACSLs, that activate long-chain fatty acids. The color scale in the pathway diagram indicates the percentage changes in metabolite levels, lipid droplet counts, and enzyme expression by silybin relative to vehicle control in HepG2 cells (black bordered boxes) or by silymarin relative to vehicle control in HepG2 cells (orange bordered boxes). GPAM, glycerol-3-phosphate acyltransferase, mitochondrial. + +Table 1 Primer sequences used in real-time quantitative PCR experiments + +gene sense primer (5' → 3') anti-sense primer (5' → 3') +hGPAT1 GAAGCTGGAGCTGCTGGGCA AAAGCCACACTCACCCCATTCCT +hGPAT2 TCGTGCTGGGCCAATGTACTG AGGAGAACTCCCCCAGGAGC +hGPAT3 CTGCCAGACAGCAGCCTCAA GCCATGAACCTGGCCAACCA +hGPAT4 GCCGCTCAGGATGCACTGG CCGTGCACTTGACCCACCAT +hLPLAT1/hLPAAT1 GAGACACAGCCATCCGCCAC GCAAGATCTTCATGTTCTCGACGTT +hLPLAT2/hLPAAT2 CGCAACGACAATGGGGACCT TGCACTGTGACTGTTCCTGAAGT +hLPLAT3/hLPAAT3 CGGCTGCAGGCTTGTCCA CAGTTGAGGCGGCGGTGAG +hß-Actin ACAGAGCCTCGCCTTTGCC CCATCACGCCCTGGTGCC +hGAPDH TTTGCGTCGCCAGCCGAG TTCTCAGCCTTGACGGTGCC + + +1 Rinella ME Lazarus JV Ratziu V Francque SM Sanyal AJ Kanwal F A multisociety delphi consensus statement on new fatty liver disease nomenclature Hepatology 2023 78 1966 86 37363821 10.1097/HEP.0000000000000520 PMC10653297 +2 Loomba R Friedman SL Shulman GI Mechanisms and disease consequences of nonalcoholic fatty liver disease Cell 2021 184 2537 64 33989548 10.1016/j.cell.2021.04.015 PMC12168897 +3 Meex RCR Watt MJ Hepatokines: Linking nonalcoholic fatty liver disease and insulin resistance Nat Rev Endocrinol 2017 13 509 20 28621339 10.1038/nrendo.2017.56 +4 Perry RJ Samuel VT Petersen KF Shulman GI The role of hepatic lipids in hepatic insulin resistance and type 2 diabetes Nature 2014 510 84 91 24899308 10.1038/nature13478 PMC4489847 +5 Younossi ZM Koenig AB Abdelatif D Fazel Y Henry L Wymer M Global epidemiology of nonalcoholic fatty liver disease-meta-analytic assessment of prevalence, incidence, and outcomes Hepatology 2016 64 73 84 26707365 10.1002/hep.28431 +6 Yamaguchi K Yang L Mccall S Huang J Yu XX Pandey SK Inhibiting triglyceride synthesis improves hepatic steatosis but exacerbates liver damage and fibrosis in obese mice with nonalcoholic steatohepatitis Hepatology 2007 45 1366 74 17476695 10.1002/hep.21655 +7 Baldini F Bartolozzi A Ardito M Voci A Portincasa P Vassalli M Biomechanics of cultured hepatic cells during different steatogenic hits J Mech Behav Biomed Mater 2019 97 296 305 31151002 10.1016/j.jmbbm.2019.05.036 +8 Feng B Meng R Huang B Shen S Bi Y Zhu D Silymarin alleviates hepatic oxidative stress and protects against metabolic disorders in high-fat diet-fed mice Free Radic Res 2016 50 314 27 26758315 10.3109/10715762.2015.1116689 +9 Hellerbrand C Schattenberg JM Peterburs P Lechner A Brignoli R The potential of silymarin for the treatment of hepatic disorders Clin Phytosci 2017 2 7 +10 Seebacher F Zeigerer A Kory N Krahmer N Hepatic lipid droplet homeostasis and fatty liver disease Semin Cell Dev Biol 2020 108 72 81 32444289 10.1016/j.semcdb.2020.04.011 +11 Danielli M Perne L Jarc Jovicic E Petan T Lipid droplets and polyunsaturated fatty acid trafficking: Balancing life and death Front Cell Dev Biol 2023 11 1104725 36776554 10.3389/fcell.2023.1104725 PMC9911892 +12 Jarc E Petan T Lipid droplets and the management of cellular stress Yale J Biol Med 2019 92 435 52 31543707 PMC6747940 +13 Olzmann JA Carvalho P Dynamics and functions of lipid droplets Nat Rev Mol Cell Biol 2019 20 137 55 30523332 10.1038/s41580-018-0085-z PMC6746329 +14 Baldini F Portincasa P Grasselli E Damonte G Salis A Bonomo M Aquaporin-9 is involved in the lipid-lowering activity of the nutraceutical silybin on hepatocytes through modulation of autophagy and lipid droplets composition Biochim Biophys Acta Mol Cell Biol Lipids 2020 1865 158586 31816412 10.1016/j.bbalip.2019.158586 +15 Su F Koeberle A Regulation and targeting of srebp-1 in hepatocellular carcinoma Cancer Metastasis Rev 2024 43 673 708 38036934 10.1007/s10555-023-10156-5 PMC11156753 +16 Wang CW Lipid droplets, lipophagy, and beyond Biochim Biophys Acta 2016 1861 793 805 26713677 10.1016/j.bbalip.2015.12.010 +17 Vergani L Fatty acids and effects on in vitro and in vivo models of liver steatosis Curr Med Chem 2019 26 3439 56 28521680 10.2174/0929867324666170518101334 +18 Malhi H Gores GJ Molecular mechanisms of lipotoxicity in nonalcoholic fatty liver disease Semin Liver Dis 2008 28 360 9 18956292 10.1055/s-0028-1091980 PMC2908270 +19 Eslam M Valenti L Romeo S Genetics and epigenetics of nafld and nash: Clinical impact J Hepatol 2018 68 268 79 29122391 10.1016/j.jhep.2017.09.003 +20 Sookoian S Pirola CJ Valenti L Davidson NO Genetic pathways in nonalcoholic fatty liver disease: Insights from systems biology Hepatology 2020 72 330 46 32170962 10.1002/hep.31229 PMC7363530 +21 Chen F Zhou Y Wu Z Li Y Zhou W Wang Y Integrated analysis of key genes and pathways involved in nonalcoholic steatohepatitis improvement after roux-en-y gastric bypass surgery Front Endocrinol (Lausanne) 2020 11 611213 33603714 10.3389/fendo.2020.611213 PMC7884850 +22 Fuchs CD Radun R Dixon ED Mlitz V Timelthaler G Halilbasic E Hepatocyte-specific deletion of adipose triglyceride lipase (adipose triglyceride lipase/patatin-like phospholipase domain containing 2) ameliorates dietary induced steatohepatitis in mice Hepatology 2022 75 125 39 34387896 10.1002/hep.32112 +23 Teslovich TM Musunuru K Smith AV Edmondson AC Stylianou IM Koseki M Biological, clinical and population relevance of 95 loci for blood lipids Nature 2010 466 707 13 20686565 10.1038/nature09270 PMC3039276 +24 Chamulitrat W Jansakun C Li H Liebisch G Rescue of hepatic phospholipid remodeling defectin ipla2beta-null mice attenuates obese but not non-obese fatty liver Biomolecules 2020 10 1332 32957701 10.3390/biom10091332 PMC7565968 +25 Kienesberger PC Oberer M Lass A Zechner R Mammalian patatin domain containing proteins: A family with diverse lipolytic activities involved in multiple biological functions J Lipid Res 2009 50 Suppl S63 8 19029121 10.1194/jlr.R800082-JLR200 PMC2674697 +26 Kim KY Jang HJ Yang YR Park KI Seo J Shin IW Srebp-2/pnpla8 axis improves non-alcoholic fatty liver disease through activation of autophagy Sci Rep 2016 6 35732 27767079 10.1038/srep35732 PMC5073315 +27 Shen W Yang L Yang Y Wang P Tao X Shen Y Prdx6 promotes fatty acid oxidation via pla2-dependent pparalpha activation in rats fed high-fat diet Antioxid Redox Signal 2023 38 1184 200 36401357 10.1089/ars.2022.0065 +28 Wang H Zhao Y Pan Y Yang A Li C Wang S Inhibition of phospholipase d1 ameliorates hepatocyte steatosis and non-alcoholic fatty liver disease JHEP Rep 2023 5 100726 37138676 10.1016/j.jhepr.2023.100726 PMC10149370 +29 Tanaka Y Shimanaka Y Caddeo A Kubo T Mao Y Kubota T Lpiat1/mboat7 depletion increases triglyceride synthesis fueled by high phosphatidylinositol turnover Gut 2021 70 180 93 32253259 10.1136/gutjnl-2020-320646 PMC7788230 +30 Trepo E Valenti L Update on nafld genetics: From new variants to the clinic J Hepatol 2020 72 1196 209 32145256 10.1016/j.jhep.2020.02.020 +31 Abul-Husn NS Cheng X Li AH Xin Y Schurmann C Stevis P A protein-truncating hsd17b13 variant and protection from chronic liver disease N Engl J Med 2018 378 1096 106 29562163 10.1056/NEJMoa1712191 PMC6668033 +32 Paul B Lewinska M Andersen JB Lipid alterations in chronic liver disease and liver cancer JHEP Rep 2022 4 100479 35469167 10.1016/j.jhepr.2022.100479 PMC9034302 +33 Ooi GJ Meikle PJ Huynh K Earnest A Roberts SK Kemp W Hepatic lipidomic remodeling in severe obesity manifests with steatosis and does not evolve with non-alcoholic steatohepatitis J Hepatol 2021 75 524 35 33887358 10.1016/j.jhep.2021.04.013 +34 Mannisto V Kaminska D Karja V Tiainen M De Mello VD Hanhineva K Total liver phosphatidylcholine content associates with non-alcoholic steatohepatitis and glycine n-methyltransferase expression Liver Int 2019 39 1895 905 31199045 10.1111/liv.14174 +35 Puri P Baillie RA Wiest MM Mirshahi F Choudhury J Cheung O A lipidomic analysis of nonalcoholic fatty liver disease Hepatology 2007 46 1081 90 17654743 10.1002/hep.21763 +36 Tvrdy V Pourova J Jirkovsky E Kren V Valentova K Mladenka P Systematic review of pharmacokinetics and potential pharmacokinetic interactions of flavonolignans from silymarin Med Res Rev 2021 41 2195 246 33587317 10.1002/med.21791 +37 Rainone F Milk thistle Am Fam Physician 2005 72 1285 8 16225032 +38 Abenavoli L Capasso R Milic N Capasso F Milk thistle in liver diseases: Past, present, future Phytother Res 2010 24 1423 32 20564545 10.1002/ptr.3207 +39 Yan T Yan N Wang P Xia Y Hao H Wang G Herbal drug discovery for the treatment of nonalcoholic fatty liver disease Acta Pharm Sin B 2020 10 3 18 31993304 10.1016/j.apsb.2019.11.017 PMC6977016 +40 Stolf AM Cardoso CC Acco A Effects of silymarin on diabetes mellitus complications: A review Phytother Res 2017 31 366 74 28124457 10.1002/ptr.5768 +41 Kren V Chirality matters: Biological activity of optically pure silybin and its congeners Int J Mol Sci 2021 22 7885 34360650 10.3390/ijms22157885 PMC8346157 +42 Milic N Milosevic N Suvajdzic L Zarkov M Abenavoli L New therapeutic potentials of milk thistle (silybum marianum) Nat Prod Commun 2013 8 1801 10 24555302 +43 Biedermann D Vavrikova E Cvak L Kren V Chemistry of silybin Nat Prod Rep 2014 31 1138 57 24977260 10.1039/c3np70122k +44 Fenclova M Stranska-Zachariasova M Benes F Novakova A Jonatova P Kren V Liquid chromatography-drift tube ion mobility-mass spectrometry as a new challenging tool for the separation and characterization of silymarin flavonolignans Anal Bioanal Chem 2020 412 819 32 31919606 10.1007/s00216-019-02274-3 +45 Bagherniya M Nobili V Blesso CN Sahebkar A Medicinal plants and bioactive natural compounds in the treatment of non-alcoholic fatty liver disease: A clinical review Pharmacol Res 2018 130 213 40 29287685 10.1016/j.phrs.2017.12.020 +46 Wang L Yan Y Wu L Peng J Natural products in non-alcoholic fatty liver disease (nafld): Novel lead discovery for drug development Pharmacol Res 2023 196 106925 37714392 10.1016/j.phrs.2023.106925 +47 Federico A Dallio M Loguercio C Silymarin/silybin and chronic liver disease: A marriage of many years Molecules 2017 22 191 28125040 10.3390/molecules22020191 PMC6155865 +48 Kalopitas G Antza C Doundoulakis I Siargkas A Kouroumalis E Germanidis G Impact of silymarin in individuals with nonalcoholic fatty liver disease: A systematic review and meta-analysis Nutrition 2021 83 111092 33418491 10.1016/j.nut.2020.111092 +49 Anushiravani A Haddadi N Pourfarmanbar M Mohammadkarimi V Treatment options for nonalcoholic fatty liver disease: A double-blinded randomized placebo-controlled trial Eur J Gastroenterol Hepatol 2019 31 613 7 30920975 10.1097/MEG.0000000000001369 +50 Niu H Sanabria-Cabrera J Alvarez-Alvarez I Robles-Diaz M Stankeviciute S Aithal GP Prevention and management of idiosyncratic drug-induced liver injury: Systematic review and meta-analysis of randomised clinical trials Pharmacol Res 2021 164 105404 33359912 10.1016/j.phrs.2020.105404 +51 Saller R Brignoli R Melzer J Meier R An updated systematic review with meta-analysis for the clinical evidence of silymarin Forsch Komplementmed 2008 15 9 20 18334810 10.1159/000113648 +52 Bahmani M Shirzad H Rafieian S Rafieian-Kopaei M Silybum marianum: Beyond hepatoprotection J Evid Based Complementary Altern Med 2015 20 292 301 25686616 10.1177/2156587215571116 +53 Fraschini F Demartini G & Esposti, D. Pharmacology of silymarin Clin. Drug Investig 2002 22 51 65 +54 Stiuso P Scognamiglio I Murolo M Ferranti P De Simone C Rizzo MR Serum oxidative stress markers and lipidomic profile to detect nash patients responsive to an antioxidant treatment: A pilot study Oxid Med Cell Longev 2014 2014 169216 24987492 10.1155/2014/169216 PMC4060161 +55 Ni X Wang H Silymarin attenuated hepatic steatosis through regulation of lipid metabolism and oxidative stress in a mouse model of nonalcoholic fatty liver disease (nafld) Am J Transl Res 2016 8 1073 81 27158393 PMC4846950 +56 Huseini HF Larijani B Heshmat R Fakhrzadeh H Radjabipour B Toliat T The efficacy of silybum marianum (l.) gaertn. (silymarin) in the treatment of type ii diabetes: A randomized, double-blind, placebo-controlled, clinical trial Phytother Res 2006 20 1036 9 17072885 10.1002/ptr.1988 +57 Sobolova L Skottova N Vecera R Urbanek K Effect of silymarin and its polyphenolic fraction on cholesterol absorption in rats Pharmacol Res 2006 53 104 12 16275123 10.1016/j.phrs.2005.09.004 +58 Nassuato G Iemmolo RM Strazzabosco M Lirussi F Deana R Francesconi MA Effect of silibinin on biliary lipid composition. Experimental and clinical study J Hepatol 1991 12 290 5 1940257 10.1016/0168-8278(91)90829-z +59 Voroneanu L Nistor I Dumea R Apetrii M Covic A Silymarin in type 2 diabetes mellitus: A systematic review and meta-analysis of randomized controlled trials J Diabetes Res 2016 2016 5147468 27340676 10.1155/2016/5147468 PMC4908257 +60 Sun WL Hua S Li XY Shen L Wu H Ji HF Microbially produced vitamin b12 contributes to the lipid-lowering effect of silymarin Nat Commun 2023 14 477 36717576 10.1038/s41467-023-36079-x PMC9887073 +61 Schriewer H Weinhold F The influence of silybin from silybum marianum (l.) gaertn. On in vitro phosphatidyl choline biosynthesis in rat livers Arzneimittelforschung 1979 29 791 2 582978 +62 Muriel P Mourelle M Prevention by silymarin of membrane alterations in acute ccl4 liver damage J Appl Toxicol 1990 10 275 9 1975258 10.1002/jat.2550100408 +63 Schriewer H Lohmann J Rauen HM [the effect of silybin-dihemisuccinate on regulation disorders in phospholipid metabolism in acute galactosamine intoxication in the rat] Arzneimittelforschung 1975 25 1582 5 1243043 +64 Hermansson M Hokynar K Somerharju P Mechanisms of glycerophospholipid homeostasis in mammalian cells Prog Lipid Res 2011 50 240 57 21382416 10.1016/j.plipres.2011.02.004 +65 Di Fabio G Romanucci V Di Marino C De Napoli L Zarrelli A A rapid and simple chromatographic separation of diastereomers of silibinin and their oxidation to produce 2,3-dehydrosilybin enantiomers in an optically pure form Planta Med 2013 79 1077 80 23807808 10.1055/s-0032-1328703 +66 Di Fabio GR V De Nisco M Pedatella S Di Marino C Zarrelli A Microwave-assisted oxidation of silibinin: A simple and preparative method for the synthesis of improved radical scavengers Tetrahedron Lett 2013 54 6279 82 +67 Pein H Ville A Pace S Temml V Garscha U Raasch M Endogenous metabolites of vitamin e limit inflammation by targeting 5-lipoxygenase Nat Commun 2018 9 3834 30237488 10.1038/s41467-018-06158-5 PMC6148290 +68 Koeberle A Munoz E Appendino GB Minassi A Pace S Rossi A Sar studies on curcumin's pro-inflammatory targets: Discovery of prenylated pyrazolocurcuminoids as potent and selective novel inhibitors of 5-lipoxygenase J Med Chem 2014 57 5638 48 24920381 10.1021/jm500308c +69 Koeberle A Shindou H Harayama T Shimizu T Role of lysophosphatidic acid acyltransferase 3 for the supply of highly polyunsaturated fatty acids in tm4 sertoli cells FASEB J 2010 24 4929 38 20705908 10.1096/fj.10-162818 +70 Koeberle A Shindou H Harayama T Yuki K Shimizu T Polyunsaturated fatty acids are incorporated into maturating male mouse germ cells by lysophosphatidic acid acyltransferase 3 FASEB J 2012 26 169 80 21968070 10.1096/fj.11-184879 +71 Espada L Dakhovnik A Chaudhari P Martirosyan A Miek L Poliezhaieva T Loss of metabolic plasticity underlies metformin toxicity in aged caenorhabditis elegans Nat Metab 2020 2 1316 31 33139960 10.1038/s42255-020-00307-1 +72 Koeberle A Shindou H Koeberle SC Laufer SA Shimizu T Werz O Arachidonoyl-phosphatidylcholine oscillates during the cell cycle and counteracts proliferation by suppressing akt membrane binding Proc Natl Acad Sci U S A 2013 110 2546 51 23359699 10.1073/pnas.1216182110 PMC3574958 +73 Koeberle A Pergola C Shindou H Koeberle SC Shimizu T Laufer SA Role of p38 mitogen-activated protein kinase in linking stearoyl-coa desaturase-1 activity with endoplasmic reticulum homeostasis FASEB J 2015 29 2439 49 25678624 10.1096/fj.14-268474 +74 Thürmer M Gollowitzer A Pein H Neukirch K Gelmez E Waltl L Pi(18:1/18:1) is a scd1-derived lipokine that limits stress signaling Nat Commun 2022 13 2982 35624087 10.1038/s41467-022-30374-9 PMC9142606 +75 Liao S Gollowitzer A Bormel L Maier C Gottschalk L Werz O Alpha-tocopherol-13'-carboxychromanol induces cell cycle arrest and cell death by inhibiting the srebp1-scd1 axis and causing imbalance in lipid desaturation Int J Mol Sci 2023 24 9229 37298183 10.3390/ijms24119229 PMC10253185 +76 Van Pijkeren A Egger AS Hotze M Zimmermann E Kipura T Grander J Proteome coverage after simultaneous proteo-metabolome liquid-liquid extraction J Proteome Res 2023 22 951 66 36763818 10.1021/acs.jproteome.2c00758 PMC9990123 +77 Schwab A Rao Z Zhang J Gollowitzer A Siebenkas K Bindel N Zeb1 mediates emt/plasticity-associated ferroptosis sensitivity in cancer cells by regulating lipogenic enzyme expression and phospholipid composition Nat Cell Biol 2024 26 1470 81 39009641 10.1038/s41556-024-01464-1 PMC11392809 +78 Glatzel DK Koeberle A Pein H Loser K Stark A Keksel N Acetyl-coa carboxylase 1 regulates endothelial cell migration by shifting the phospholipid composition J Lipid Res 2018 59 298 311 29208696 10.1194/jlr.M080101 PMC5794424 +79 Ewels P Magnusson M Lundin S Kaller M Multiqc: Summarize analysis results for multiple tools and samples in a single report Bioinformatics 2016 32 3047 8 27312411 10.1093/bioinformatics/btw354 PMC5039924 +80 Dobin A Davis CA Schlesinger F Drenkow J Zaleski C Jha S Star: Ultrafast universal rna-seq aligner Bioinformatics 2013 29 15 21 23104886 10.1093/bioinformatics/bts635 PMC3530905 +81 Anders S Pyl PT Huber W Htseq-a python framework to work with high-throughput sequencing data Bioinformatics 2015 31 166 9 25260700 10.1093/bioinformatics/btu638 PMC4287950 +82 Love MI Huber W Anders S Moderated estimation of fold change and dispersion for rna-seq data with deseq2 Genome Biol 2014 15 550 25516281 10.1186/s13059-014-0550-8 PMC4302049 +83 Hsiang CY Lin LJ Kao ST Lo HY Chou ST Ho TY Glycyrrhizin, silymarin, and ursodeoxycholic acid regulate a common hepatoprotective pathway in hepg2 cells Phytomedicine 2015 22 768 77 26141764 10.1016/j.phymed.2015.05.053 +84 Lovelace ES Wagoner J Macdonald J Bammler T Bruckner J Brownell J Silymarin suppresses cellular inflammation by inducing reparative stress signaling J Nat Prod 2015 78 1990 2000 26186142 10.1021/acs.jnatprod.5b00288 PMC4703094 +85 Debroy S Hiraga N Imamura M Hayes CN Akamatsu S Canini L Hepatitis c virus dynamics and cellular gene expression in upa-scid chimeric mice with humanized livers during intravenous silibinin monotherapy J Viral Hepat 2016 23 708 17 27272497 10.1111/jvh.12551 PMC4974116 +86 Barrett T Wilhite SE Ledoux P Evangelista C Kim IF Tomashevsky M Ncbi geo: Archive for functional genomics data sets-update Nucleic Acids Res 2013 41 D991 5 23193258 10.1093/nar/gks1193 PMC3531084 +87 Lupp A Nagel F Schulz S Reevaluation of sst(1) somatostatin receptor expression in human normal and neoplastic tissues using the novel rabbit monoclonal antibody umb-7 Regul Pept 2013 183 1 6 23466804 10.1016/j.regpep.2013.02.001 +88 Ellman GL Tissue sulfhydryl groups Arch Biochem Biophys 1959 82 70 7 13650640 10.1016/0003-9861(59)90090-6 +89 Hissin PJ Hilf R A fluorometric method for determination of oxidized and reduced glutathione in tissues Anal Biochem 1976 74 214 26 962076 10.1016/0003-2697(76)90326-2 +90 Yagi T Day RS 3rd Differential sensitivities of transformed and untransformed murine cell lines to DNA cross-linking agents relative to repair of o6-methylguanine Mutat Res 1987 184 223 7 3670325 10.1016/0167-8817(87)90020-4 +91 Klinger W Muller D The influence of age on the protein concentration in serum, liver and kidney of rats determined by various methods Z Versuchstierkd 1974 16 149 53 4854887 +92 Lubet RA Mayer RT Cameron JW Nims RW Burke MD Wolff T Dealkylation of pentoxyresorufin: A rapid and sensitive assay for measuring induction of cytochrome(s) p-450 by phenobarbital and other xenobiotics in the rat Arch Biochem Biophys 1985 238 43 8 3985627 10.1016/0003-9861(85)90138-9 +93 Aitio A A simple and sensitive assay of 7-ethoxycoumarin deethylation Anal Biochem 1978 85 488 91 565602 10.1016/0003-2697(78)90245-2 +94 Pohl RJ Fouts JR A rapid method for assaying the metabolism of 7-ethoxyresorufin by microsomal subcellular fractions Anal Biochem 1980 107 150 5 6776841 10.1016/0003-2697(80)90505-9 +95 Kleeberg U Klinger W Sensitive formaldehyde determination with nash's reagent and a 'tryptophan reaction' J Pharmacol Methods 1982 8 19 31 7121014 10.1016/0160-5402(82)90004-3 +96 Habig WH Pabst MJ Jakoby WB Glutathione s-transferases. The first enzymatic step in mercapturic acid formation J Biol Chem 1974 249 7130 9 4436300 +97 Lilienblum W Walli AK Bock KW Differential induction of rat liver microsomal udp-glucuronosyltransferase activites by various inducing agents Biochem Pharmacol 1982 31 907 13 6805477 10.1016/0006-2952(82)90319-7 +98 Bock KW Burchell B Dutton GJ Hanninen O Mulder GJ Owens IS Udp-glucuronosyltransferase activities. Guidelines for consistent interim terminology and assay conditions Biochem Pharmacol 1983 32 953 5 6404284 10.1016/0006-2952(83)90610-x +99 Bhatt-Wessel B Jordan TW Miller JH Peng L Role of dgat enzymes in triacylglycerol metabolism Arch Biochem Biophys 2018 655 1 11 30077544 10.1016/j.abb.2018.08.001 +100 Christodoulou E Kechagia IA Tzimas S Balafas E Kostomitsopoulos N Archontaki H Serum and tissue pharmacokinetics of silibinin after per os and i.V. Administration to mice as a hp-beta-cd lyophilized product Int J Pharm 2015 493 366 73 26222744 10.1016/j.ijpharm.2015.07.060 +101 Zhao J Agarwal R Tissue distribution of silibinin, the major active constituent of silymarin, in mice and its association with enhancement of phase ii enzymes: Implications in cancer chemoprevention Carcinogenesis 1999 20 2101 8 10545412 10.1093/carcin/20.11.2101 +102 Perona JS Membrane lipid alterations in the metabolic syndrome and the role of dietary oils Biochim Biophys Acta Biomembr 2017 1859 1690 703 28428072 10.1016/j.bbamem.2017.04.015 +103 Van Meer G Voelker DR Feigenson GW Membrane lipids: Where they are and how they behave Nat Rev Mol Cell Biol 2008 9 112 24 18216768 10.1038/nrm2330 PMC2642958 +104 Liu Y Xu W Zhai T You J Chen Y Silibinin ameliorates hepatic lipid accumulation and oxidative stress in mice with non-alcoholic steatohepatitis by regulating cflar-jnk pathway Acta Pharm Sin B 2019 9 745 57 31384535 10.1016/j.apsb.2019.02.006 PMC6664044 +105 Vecchione G Grasselli E Cioffi F Baldini F Oliveira PJ Sardao VA The nutraceutic silybin counteracts excess lipid accumulation and ongoing oxidative stress in an in vitro model of non-alcoholic fatty liver disease progression Front Nutr 2017 4 42 28971098 10.3389/fnut.2017.00042 PMC5609553 +106 Feng R Chen JH Liu CH Xia FB Xiao Z Zhang X A combination of pueraria lobata and silybum marianum protects against alcoholic liver disease in mice Phytomedicine 2019 58 152824 30836218 10.1016/j.phymed.2019.152824 +107 Sun R Xu D Wei Q Zhang B Aa J Wang G Silybin ameliorates hepatic lipid accumulation and modulates global metabolism in an nafld mouse model Biomed Pharmacother 2020 123 109721 31865143 10.1016/j.biopha.2019.109721 +108 Yang L Liu Q Zhang H Wang Y Li Y Chen S Silibinin improves nonalcoholic fatty liver by regulating the expression of mir122: An in vitro and in vivo study Mol Med Rep 2021 23 335 33760189 10.3892/mmr.2021.11974 PMC7974327 +109 Milacic M Beavers D Conley P Gong C Gillespie M Griss J The reactome pathway knowledgebase 2024 Nucleic Acids Res 2024 52 D672 D8 37941124 10.1093/nar/gkad1025 PMC10767911 +110 Badawi AF Cavalieri EL Rogan EG Role of human cytochrome p450 1a1, 1a2, 1b1, and 3a4 in the 2-, 4-, and 16alpha-hydroxylation of 17beta-estradiol Metabolism 2001 50 1001 3 11555828 10.1053/meta.2001.25592 +111 Kisselev P Schunck WH Roots I Schwarz D Association of cyp1a1 polymorphisms with differential metabolic activation of 17beta-estradiol and estrone Cancer Res 2005 65 2972 8 15805301 10.1158/0008-5472.CAN-04-3543 +112 Schwarz D Kisselev P Ericksen SS Szklarz GD Chernogolov A Honeck H Arachidonic and eicosapentaenoic acid metabolism by human cyp1a1: Highly stereoselective formation of 17(r),18(s)-epoxyeicosatetraenoic acid Biochem Pharmacol 2004 67 1445 57 15041462 10.1016/j.bcp.2003.12.023 +113 Fer M Corcos L Dreano Y Plee-Gautier E Salaun JP Berthou F Cytochromes p450 from family 4 are the main omega hydroxylating enzymes in humans: Cyp4f3b is the prominent player in pufa metabolism J Lipid Res 2008 49 2379 89 18577768 10.1194/jlr.M800199-JLR200 +114 Lucas D Goulitquer S Marienhagen J Fer M Dreano Y Schwaneberg U Stereoselective epoxidation of the last double bond of polyunsaturated fatty acids by human cytochromes p450 J Lipid Res 2010 51 1125 33 19965576 10.1194/jlr.M003061 PMC2853439 +115 Filali-Mouncef Y Hunter C Roccio F Zagkou S Dupont N Primard C The menage a trois of autophagy, lipid droplets and liver disease Autophagy 2022 18 50 72 33794741 10.1080/15548627.2021.1895658 PMC8865253 +116 Gluchowski NL Becuwe M Walther TC Farese RV Jr Lipid droplets and liver disease: From basic biology to clinical implications Nat Rev Gastroenterol Hepatol 2017 14 343 55 28428634 10.1038/nrgastro.2017.32 PMC6319657 +117 Shi H Luo J Zhu J Li J Sun Y Lin X Ppar gamma regulates genes involved in triacylglycerol synthesis and secretion in mammary gland epithelial cells of dairy goats PPAR Res 2013 2013 310948 23710163 10.1155/2013/310948 PMC3654327 +118 Petan T Lipid droplets in cancer Rev Physiol Biochem Pharmacol 2020 185 53 86 10.1007/112_2020_51 33074407 +119 Tang Y Zhou J Hooi SC Jiang YM Lu GD Fatty acid activation in carcinogenesis and cancer development: Essential roles of long-chain acyl-coa synthetases Oncol Lett 2018 16 1390 6 30008815 10.3892/ol.2018.8843 PMC6036470 +120 Tong L Acetyl-coenzyme a carboxylase: Crucial metabolic enzyme and attractive target for drug discovery Cell Mol Life Sci 2005 62 1784 803 15968460 10.1007/s00018-005-5121-4 PMC11139103 +121 Yamashita A Hayashi Y Nemoto-Sasaki Y Ito M Oka S Tanikawa T Acyltransferases and transacylases that determine the fatty acid composition of glycerolipids and the metabolism of bioactive lipid mediators in mammalian cells and model organisms Prog Lipid Res 2014 53 18 81 24125941 10.1016/j.plipres.2013.10.001 +122 Batchuluun B Pinkosky SL Steinberg GR Lipogenesis inhibitors: Therapeutic opportunities and challenges Nat Rev Drug Discov 2022 21 283 305 35031766 10.1038/s41573-021-00367-2 PMC8758994 +123 Kleiboeker B Lodhi IJ Peroxisomal regulation of energy homeostasis: Effect on obesity and related metabolic disorders Mol Metab 2022 65 101577 35988716 10.1016/j.molmet.2022.101577 PMC9442330 +124 Liang D Minikes AM Jiang X Ferroptosis at the intersection of lipid metabolism and cellular signaling Mol Cell 2022 82 2215 27 35390277 10.1016/j.molcel.2022.03.022 PMC9233073 +125 Gan B Mitochondrial regulation of ferroptosis J Cell Biol 2021 220 e202105043 34328510 10.1083/jcb.202105043 PMC8329737 +126 Araya J Rodrigo R Videla LA Thielemann L Orellana M Pettinelli P Increase in long-chain polyunsaturated fatty acid n - 6/n - 3 ratio in relation to hepatic steatosis in patients with non-alcoholic fatty liver disease Clin Sci (Lond) 2004 106 635 43 14720121 10.1042/CS20030326 +127 Gomez-Lechon MJ Donato MT Martinez-Romero A Jimenez N Castell JV O'connor JE A human hepatocellular in vitro model to investigate steatosis Chem Biol Interact 2007 165 106 16 17188672 10.1016/j.cbi.2006.11.004 +128 Guguen-Guillouzo C Guillouzo A General review on in vitro hepatocyte models and their applications Methods Mol Biol 2010 640 1 40 20645044 10.1007/978-1-60761-688-7_1 +129 Da Silva DC Valentao P Andrade PB Pereira DM Endoplasmic reticulum stress signaling in cancer and neurodegenerative disorders: Tools and strategies to understand its complexity Pharmacol Res 2020 155 104702 32068119 10.1016/j.phrs.2020.104702 +130 Koeberle A Loser K Thurmer M Stearoyl-coa desaturase-1 and adaptive stress signaling Biochim Biophys Acta 2016 1861 1719 26 27550503 10.1016/j.bbalip.2016.08.009 +131 Dallio M Masarone M Romeo M Tuccillo C Morisco F Persico M Pnpla3, tm6sf2, and mboat7 influence on nutraceutical therapy response for non-alcoholic fatty liver disease: A randomized controlled trial Front Med (Lausanne) 2021 8 734847 34692725 10.3389/fmed.2021.734847 PMC8531439 +132 Federico A Dallio M Masarone M Gravina AG Di Sarno R Tuccillo C Evaluation of the effect derived from silybin with vitamin d and vitamin e administration on clinical, metabolic, endothelial dysfunction, oxidative stress parameters, and serological worsening markers in nonalcoholic fatty liver disease patients Oxid Med Cell Longev 2019 2019 8742075 31737175 10.1155/2019/8742075 PMC6815609 +133 Federico A Dallio M Gravina AG Diano N Errico S Masarone M The bisphenol a induced oxidative stress in non-alcoholic fatty liver disease male patients: A clinical strategy to antagonize the progression of the disease Int J Environ Res Public Health 2020 17 3369 32408667 10.3390/ijerph17103369 PMC7277712 +134 Wah Kheong C Nik Mustapha NR Mahadeva S A randomized trial of silymarin for the treatment of nonalcoholic steatohepatitis Clin Gastroenterol Hepatol 2017 15 1940 9 e8 28419855 10.1016/j.cgh.2017.04.016 +135 Loguercio C Andreone P Brisc C Brisc MC Bugianesi E Chiaramonte M Silybin combined with phosphatidylcholine and vitamin e in patients with nonalcoholic fatty liver disease: A randomized controlled trial Free Radic Biol Med 2012 52 1658 65 22343419 10.1016/j.freeradbiomed.2012.02.008 +136 Lirussi F Beccarello A Zanette G De Monte A Donadon V Velussi M Silybin-beta-cyclodextrin in the treatment of patients with diabetes mellitus and alcoholic liver disease. Efficacy study of a new preparation of an anti-oxidant agent Diabetes Nutr Metab 2002 15 222 31 12416659 +137 Delmas D Xiao J Vejux A Aires V Silymarin and cancer: A dual strategy in both in chemoprevention and chemosensitivity Molecules 2020 25 2009 32344919 10.3390/molecules25092009 PMC7248929 +138 Moon YJ Wang X Morris ME Dietary flavonoids: Effects on xenobiotic and carcinogen metabolism Toxicol In Vitro 2006 20 187 210 16289744 10.1016/j.tiv.2005.06.048 +139 Kiruthiga PV Karthikeyan K Archunan G Pandian SK Devi KP Silymarin prevents benzo(a)pyrene-induced toxicity in wistar rats by modulating xenobiotic-metabolizing enzymes Toxicol Ind Health 2015 31 523 41 23406957 10.1177/0748233713475524 +140 Kawaguchi-Suzuki M Frye RF Zhu HJ Brinda BJ Chavin KD Bernstein HJ The effects of milk thistle (silybum marianum) on human cytochrome p450 activity Drug Metab Dispos 2014 42 1611 6 25028567 10.1124/dmd.114.057232 PMC4164972 +141 Upadhyay G Kumar A Singh MP Effect of silymarin on pyrogallol- and rifampicin-induced hepatotoxicity in mouse Eur J Pharmacol 2007 565 190 201 17434476 10.1016/j.ejphar.2007.03.004 +142 Zuber R Modriansky M Dvorak Z Rohovsky P Ulrichova J Simanek V Effect of silybin and its congeners on human liver microsomal cytochrome p450 activities Phytother Res 2002 16 632 8 12410543 10.1002/ptr.1000 +143 Baer-Dubowska W Szaefer H Krajka-Kuzniak V Inhibition of murine hepatic cytochrome p450 activities by natural and synthetic phenolic compounds Xenobiotica 1998 28 735 43 9741952 10.1080/004982598239155 +144 Sridar C Goosen TC Kent UM Williams JA Hollenberg PF Silybin inactivates cytochromes p450 3a4 and 2c9 and inhibits major hepatic glucuronosyltransferases Drug Metab Dispos 2004 32 587 94 15155549 10.1124/dmd.32.6.587 +145 Beckmann-Knopp S Rietbrock S Weyhenmeyer R Bocker RH Beckurts KT Lang W Inhibitory effects of silibinin on cytochrome p-450 enzymes in human liver microsomes Pharmacol Toxicol 2000 86 250 6 10895987 10.1111/j.0901-9928.2000.860602.x +146 Ahn K Szczesna-Skorupa E Kemper B The amino-terminal 29 amino acids of cytochrome p450 2c1 are sufficient for retention in the endoplasmic reticulum J Biol Chem 1993 268 18726 33 8360166 +147 Galal AM Walker LA Khan IA Induction of gst and related events by dietary phytochemicals: Sources, chemistry, and possible contribution to chemoprevention Curr Top Med Chem 2015 14 2802 21 25487008 10.2174/1568026615666141208110721 +148 Maiorino M Conrad M Ursini F Gpx4, lipid peroxidation, and cell death: Discoveries, rediscoveries, and open issues Antioxid Redox Signal 2018 29 61 74 28462584 10.1089/ars.2017.7115 +149 Bomgning CLK Sinda PVK Ponou BK Fotio AL Tsague MK Tsafack BT Hepatoprotective effects of extracts, fractions and compounds from the stem bark of pentaclethra macrophylla benth: Evidence from in vitro and in vivo studies Biomed Pharmacother 2021 136 111242 33486213 10.1016/j.biopha.2021.111242 +150 Grasselli E Baldini F Vecchione G Oliveira PJ Sardao VA Voci A Excess fructose and fatty acids trigger a model of nonalcoholic fatty liver disease progression in vitro: Protective effect of the flavonoid silybin Int J Mol Med 2019 44 705 12 31173180 10.3892/ijmm.2019.4234 +151 Raza H Dual localization of glutathione s-transferase in the cytosol and mitochondria: Implications in oxidative stress, toxicity and disease FEBS J 2011 278 4243 51 21929724 10.1111/j.1742-4658.2011.08358.x PMC3204177 +152 Poruba M Kazdova L Oliyarnyk O Malinska H Matuskova Z Tozzi Di Angelo I Improvement bioavailability of silymarin ameliorates severe dyslipidemia associated with metabolic syndrome Xenobiotica 2015 45 751 6 26068528 10.3109/00498254.2015.1010633 +153 Polachi N Bai G Li T Chu Y Wang X Li S Modulatory effects of silibinin in various cell signaling pathways against liver disorders and cancer - a comprehensive review Eur J Med Chem 2016 123 577 95 27517806 10.1016/j.ejmech.2016.07.070 +154 Quiroga AD Lehner R Pharmacological intervention of liver triacylglycerol lipolysis: The good, the bad and the ugly Biochem Pharmacol 2018 155 233 41 30006193 10.1016/j.bcp.2018.07.005 +155 Reid BN Ables GP Otlivanchik OA Schoiswohl G Zechner R Blaner WS Hepatic overexpression of hormone-sensitive lipase and adipose triglyceride lipase promotes fatty acid oxidation, stimulates direct release of free fatty acids, and ameliorates steatosis J Biol Chem 2008 283 13087 99 18337240 10.1074/jbc.M800533200 PMC2442319 +156 Kato M Higuchi N Enjoji M Reduced hepatic expression of adipose tissue triglyceride lipase and cgi-58 may contribute to the development of non-alcoholic fatty liver disease in patients with insulin resistance Scand J Gastroenterol 2008 43 1018 9 19086170 10.1080/00365520802008140 +157 Wu JW Wang SP Alvarez F Casavant S Gauthier N Abed L Deficiency of liver adipose triglyceride lipase in mice causes progressive hepatic steatosis Hepatology 2011 54 122 32 21465509 10.1002/hep.24338 +158 Grabner GF Xie H Schweiger M Zechner R Lipolysis: Cellular mechanisms for lipid mobilization from fat stores Nat Metab 2021 3 1445 65 34799702 10.1038/s42255-021-00493-6 +159 Gluchowski NL Gabriel KR Chitraju C Bronson RT Mejhert N Boland S Hepatocyte deletion of triglyceride-synthesis enzyme acyl coa: Diacylglycerol acyltransferase 2 reduces steatosis without increasing inflammation or fibrosis in mice Hepatology 2019 70 1972 85 31081165 10.1002/hep.30765 PMC6893913 +160 Amin NB Carvajal-Gonzalez S Purkal J Zhu T Crowley C Perez S Targeting diacylglycerol acyltransferase 2 for the treatment of nonalcoholic steatohepatitis Sci Transl Med 2019 11 eaav9701 31776293 10.1126/scitranslmed.aav9701 +161 Rong S Xia M Vale G Wang S Kim CW Li S DGAT2 inhibition blocks SREBP-1 cleavage and improves hepatic steatosis by increasing phosphatidylethanolamine in the ER Cell Metab 2024 36 617 29.e7 38340721 10.1016/j.cmet.2024.01.011 PMC10939742 +162 Romeo S Sanyal A Valenti L Leveraging human genetics to identify potential new treatments for fatty liver disease Cell Metab 2020 31 35 45 31914377 10.1016/j.cmet.2019.12.002 +163 Liu Z Li H Zheng Y Gao Z Cong L Yang L Association of lipoprotein-associated phospholipase a2 with the prevalence of nonalcoholic fatty liver disease: A result from the apac study Sci Rep 2018 8 10127 29973631 10.1038/s41598-018-28494-8 PMC6031645 +164 Sookoian S Pirola CJ Systematic review with meta-analysis: Risk factors for non-alcoholic fatty liver disease suggest a shared altered metabolic and cardiovascular profile between lean and obese patients Aliment Pharmacol Ther 2017 46 85 95 28464369 10.1111/apt.14112 +165 Masoodi M Gastaldelli A Hyotylainen T Arretxe E Alonso C Gaggini M Metabolomics and lipidomics in nafld: Biomarkers and non-invasive diagnostic tests Nat Rev Gastroenterol Hepatol 2021 18 835 56 34508238 10.1038/s41575-021-00502-9 +166 Haberl EM Pohl R Rein-Fischboeck L Horing M Krautbauer S Liebisch G Hepatic lipid profile in mice fed a choline-deficient, low-methionine diet resembles human non-alcoholic fatty liver disease Lipids Health Dis 2020 19 250 33298075 10.1186/s12944-020-01425-1 PMC7727224 +167 Sanyal AJ Pacana T A lipidomic readout of disease progression in a diet-induced mouse model of nonalcoholic fatty liver disease Trans Am Clin Climatol Assoc 2015 126 271 88 26330688 PMC4530706 +168 Luukkonen PK Qadri S Ahlholm N Porthan K Mannisto V Sammalkorpi H Distinct contributions of metabolic dysfunction and genetic risk factors in the pathogenesis of non-alcoholic fatty liver disease J Hepatol 2022 76 526 35 34710482 10.1016/j.jhep.2021.10.013 PMC8852745 +169 Barbagallo I Vanella L Cambria MT Tibullo D Godos J Guarnaccia L Silibinin regulates lipid metabolism and differentiation in functional human adipocytes Front Pharmacol 2015 6 309 26834634 10.3389/fphar.2015.00309 PMC4720740 +170 Zhu SY Jiang N Yang J Tu J Zhou Y Xiao X Silybum marianum oil attenuates hepatic steatosis and oxidative stress in high fat diet-fed mice Biomed Pharmacother 2018 100 191 7 29428667 10.1016/j.biopha.2018.01.144 +171 Schriewer H Kramer U Rutkowski G Borgis KJ [influence of silybin-dihemisuccinate on fatty acid synthesis in rat liver (author's transl)] Arzneimittelforschung 1979 29 524 6 39576 +172 Cui S Pan XJ Ge CL Guo YT Zhang PF Yan TT Silybin alleviates hepatic lipid accumulation in methionine-choline deficient diet-induced nonalcoholic fatty liver disease in mice via peroxisome proliferator-activated receptor alpha Chin J Nat Med 2021 19 401 11 34092291 10.1016/S1875-5364(21)60039-0 +173 Suguro R Pang XC Yuan ZW Chen SY Zhu YZ Xie Y Combinational applicaton of silybin and tangeretin attenuates the progression of non-alcoholic steatohepatitis (nash) in mice via modulating lipid metabolism Pharmacol Res 2020 151 104519 31706011 10.1016/j.phrs.2019.104519 +174 Pferschy-Wenzig EM Atanasov AG Malainer C Noha SM Kunert O Schuster D Identification of isosilybin a from milk thistle seeds as an agonist of peroxisome proliferator-activated receptor gamma J Nat Prod 2014 77 842 7 24597776 10.1021/np400943b PMC4003856 +175 Liu Y Yu Q Chen Y Effect of silibinin on cflar-jnk pathway in oleic acid-treated hepg2 cells Biomed Pharmacother 2018 108 716 23 30248539 10.1016/j.biopha.2018.09.089 +176 Cui CX Deng JN Yan L Liu YY Fan JY Mu HN Silibinin capsules improves high fat diet-induced nonalcoholic fatty liver disease in hamsters through modifying hepatic de novo lipogenesis and fatty acid oxidation J Ethnopharmacol 2017 208 24 35 28648927 10.1016/j.jep.2017.06.030 +177 Ka SO Kim KA Kwon KB Park JW Park BH Silibinin attenuates adipogenesis in 3t3-l1 preadipocytes through a potential upregulation of the insig pathway Int J Mol Med 2009 23 633 7 19360322 10.3892/ijmm_00000174 +178 Silva CM Ferrari GD Alberici LC Malaspina O Moraes KCM Cellular and molecular effects of silymarin on the transdifferentiation processes of lx-2 cells and its connection with lipid metabolism Mol Cell Biochem 2020 468 129 42 32185674 10.1007/s11010-020-03717-7 +179 Salamone F Galvano F Cappello F Mangiameli A Barbagallo I Li Volti G Silibinin modulates lipid homeostasis and inhibits nuclear factor kappa b activation in experimental nonalcoholic steatohepatitis Transl Res 2012 159 477 86 22633099 10.1016/j.trsl.2011.12.003 +180 Vecchione G Grasselli E Voci A Baldini F Grattagliano I Wang DQ Silybin counteracts lipid excess and oxidative stress in cultured steatotic hepatic cells World J Gastroenterol 2016 22 6016 26 27468193 10.3748/wjg.v22.i26.6016 PMC4948277 +181 Xie Y Feng SL Mai CT Zheng YF Wang H Liu ZQ Suppression of up-regulated lxralpha by silybin ameliorates experimental rheumatoid arthritis and abnormal lipid metabolism Phytomedicine 2021 80 153339 33038868 10.1016/j.phymed.2020.153339 +182 Schriewer H [increase in rat liver synthesis of fatty acids and glycerol phospholipids following parenteral application of silybin-dihemisuccinate] Arzneimittelforschung 1978 28 51 3 580199 +183 Mourelle M Franco MT Erythrocyte defects precede the onset of ccl4-induced liver cirrhosis. Protection by silymarin Life Sci 1991 48 1083 90 1847733 10.1016/0024-3205(91)90510-i +184 Schriewer H Lohmann J [disturbances in the regulation of phospholipid metabolism of the whole liver, mitochondria and microsomes in acute thioacetamide poisoning and the influcence of silymarin] Arzneimittelforschung 1976 26 65 9 947181 +185 Harayama T Riezman H Understanding the diversity of membrane lipid composition Nat Rev Mol Cell Biol 2018 19 281 96 29410529 10.1038/nrm.2017.138 +186 Valentine WJ Yanagida K Kawana H Kono N Noda NN Aoki J Update and nomenclature proposal for mammalian lysophospholipid acyltransferases, which create membrane phospholipid diversity J Biol Chem 2021 298 101470 34890643 10.1016/j.jbc.2021.101470 PMC8753187 +187 Ramanathan R Sivanesan K Evaluation of ameliorative ability of silibinin against zidovudine and isoniazid-induced hepatotoxicity and hyperlipidaemia in rats: Role of silibinin in phase i and ii drug metabolism Chem Biol Interact 2017 273 142 53 28619387 10.1016/j.cbi.2017.06.008 +188 Villeneuve JP Pichette V Cytochrome p450 and liver diseases Curr Drug Metab 2004 5 273 82 15180496 10.2174/1389200043335531 +189 Leber HW Knauff S Influence of silymarin on drug metabolizing enzymes in rat and man Arzneimittelforschung 1976 26 1603 5 1036961 +190 Rajnarayana K Reddy MS Vidyasagar J Krishna DR Study on the influence of silymarin pretreatment on metabolism and disposition of metronidazole Arzneimittelforschung 2004 54 109 13 15038460 10.1055/s-0031-1296944 +191 Tighe SP Akhtar D Iqbal U Ahmed A Chronic liver disease and silymarin: A biochemical and clinical review J Clin Transl Hepatol 2020 8 454 8 33447529 10.14218/JCTH.2020.00012 PMC7782115 +192 Xiao F Gao F Zhou S Wang L The therapeutic effects of silymarin for patients with glucose/lipid metabolic dysfunction: A meta-analysis Medicine (Baltimore) 2020 99 e22249 33019400 10.1097/MD.0000000000022249 PMC7535778 From 557bee68801e249db3eedd8fc20698bd29e94f23 Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 19 Jun 2026 16:49:31 +0200 Subject: [PATCH 06/20] increased max retries --- src/aoptk/text_generation_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index 7dceb6de..227eecb6 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -48,7 +48,7 @@ class TextGenerationAPI( top_p: float = 1 load_dotenv() client: OpenAI - max_retries: int = 5 + max_retries: int = 10 timeout: int = 120 prompts_dir: Path = Path(__file__).resolve().parent / "prompts" chemical_prompt_template: str = "chemical_prompt.txt" From 675a3e9874993387eaf183decce3a271569dd29a Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 19 Jun 2026 16:49:42 +0200 Subject: [PATCH 07/20] added test for the retry strategy --- tests/test_text_generation.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/test_text_generation.py b/tests/test_text_generation.py index caf80fc4..08f5d37c 100644 --- a/tests/test_text_generation.py +++ b/tests/test_text_generation.py @@ -1,4 +1,5 @@ from __future__ import annotations +from concurrent.futures import ThreadPoolExecutor from pathlib import Path import pandas as pd import pytest @@ -277,3 +278,18 @@ def test_find_relevant_publications(question: str, text: str, expected: bool): """Test that find_relevant_publications method finds relevant publications.""" actual = TextGenerationAPI().find_relevant_publications(question=question, text=text) assert actual == expected + + +@pytest.mark.openai +def test_retry_strategy_works(): + """Test that the retry strategy works.""" + problematic_text = Path("tests/test_data/PMC11780512.txt").read_text() + num_threads = 10 + with ThreadPoolExecutor(max_workers=num_threads) as executor: + results = list( + executor.map( + lambda _: TextGenerationAPI().find_chemicals(text=problematic_text), + range(1, num_threads + 1), + ), + ) + assert len(results) == num_threads From 4b8fe98066ef9d09271e1417fe1680a00681f81a Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 19 Jun 2026 16:52:34 +0200 Subject: [PATCH 08/20] skipping on CI --- tests/test_text_generation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_text_generation.py b/tests/test_text_generation.py index 08f5d37c..e3305d56 100644 --- a/tests/test_text_generation.py +++ b/tests/test_text_generation.py @@ -1,4 +1,5 @@ from __future__ import annotations +import os from concurrent.futures import ThreadPoolExecutor from pathlib import Path import pandas as pd @@ -281,6 +282,7 @@ def test_find_relevant_publications(question: str, text: str, expected: bool): @pytest.mark.openai +@pytest.mark.skipif(os.getenv("CI") == "true", reason="Skip on CI environment due to resource constraints.") def test_retry_strategy_works(): """Test that the retry strategy works.""" problematic_text = Path("tests/test_data/PMC11780512.txt").read_text() From f08b732b17390707242bad04ccad68ad676289e1 Mon Sep 17 00:00:00 2001 From: rdurnik Date: Thu, 25 Jun 2026 14:29:31 +0200 Subject: [PATCH 09/20] llama-4-scout-17b-16e-instruct is planned to be removed --- tests/test_text_generation.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_text_generation.py b/tests/test_text_generation.py index e3305d56..2b43944f 100644 --- a/tests/test_text_generation.py +++ b/tests/test_text_generation.py @@ -208,7 +208,7 @@ def test_normalize_chemical(chemical: Chemical, list_of_chemicals: list[Chemical def test_extract_text_from_pdf_image(): """Test that extract_text_from_pdf_image method extracts text from a PDF image.""" base64_str = (Path("tests/test_data/scan_base64_image_PMC12416454.txt").read_text()).strip() - actual = TextGenerationAPI(model="llama-4-scout-17b-16e-instruct").convert_pdf_scan( + actual = TextGenerationAPI(model="qwen3.5-122b").convert_pdf_scan( base64_str, mime_type="image/jpeg", ) @@ -228,7 +228,7 @@ def test_extract_text_from_pdf_image(): ) def test_find_relationships_in_text_and_images(text: str, images: list[str], expected_chemicals: list[str]): """Test that find_relationships_in_text_and_images method finds relationships in text and images.""" - actual = TextGenerationAPI(model="llama-4-scout-17b-16e-instruct").find_relationships_in_text_and_images( + actual = TextGenerationAPI(model="qwen3.5-122b").find_relationships_in_text_and_images( text=text, image_paths=images, relationship_types=[Inhibitive()], @@ -250,7 +250,7 @@ def test_find_relationships_in_text_and_images(text: str, images: list[str], exp @pytest.mark.openai def test_convert_image_to_text(): """Test that convert_image_to_text method converts an image to text.""" - actual = TextGenerationAPI(model="llama-4-scout-17b-16e-instruct").convert_image( + actual = TextGenerationAPI(model="qwen3.5-122b").convert_image( "tests/test_data/test_figures/gjic.jpeg", text="These images are about gap junction intercellular communication.", ) From f27943bdfb0110d3efb896164b5b2d9bb6ffbd45 Mon Sep 17 00:00:00 2001 From: rdurnik Date: Thu, 25 Jun 2026 15:33:46 +0200 Subject: [PATCH 10/20] added chemical response validation --- src/aoptk/text_generation_api.py | 16 + tests/test_data/invalid_chemical_response.txt | 2083 +++++++++++++++++ tests/test_text_generation.py | 35 + 3 files changed, 2134 insertions(+) create mode 100644 tests/test_data/invalid_chemical_response.txt diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index 227eecb6..5533a00d 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -1,6 +1,7 @@ from __future__ import annotations import base64 import os +import typing from itertools import product from pathlib import Path from typing import Literal @@ -62,6 +63,8 @@ class TextGenerationAPI( specification_relationship_text_prompt: str = "" + invalid_chemical_response_patterns: typing.ClassVar[list[str]] = ["\n-", "\n*", "\n1.", "\n"] + def __init__( self, model: str = "gpt-oss-120b", @@ -175,11 +178,24 @@ def find_chemicals(self, text: str) -> list[Chemical]: text (str): The input text to search for chemicals. """ if response := self._prompt(self._render_prompt(self.chemical_prompt_template, text=text)).lower(): + if self.is_invalid_chemical_response(response): + return [] if response == "none": return [] return [Chemical(name=chem.strip().lower()) for chem in response.split(" ; ")] if response.strip() else [] return [] + def is_invalid_chemical_response( + self, + response: str, + ) -> bool: + r"""Check if the response from the model is invalid for chemical extraction. + + Args: + response (str): The response from the model. + """ + return bool(any(pattern in response.lower() for pattern in self.invalid_chemical_response_patterns)) + def _encode_image(self, image_path: str) -> tuple[str, str]: """Encode the image at the given path to a base64 string and return MIME type. diff --git a/tests/test_data/invalid_chemical_response.txt b/tests/test_data/invalid_chemical_response.txt new file mode 100644 index 00000000..73e9c545 --- /dev/null +++ b/tests/test_data/invalid_chemical_response.txt @@ -0,0 +1,2083 @@ +PMC11780512 we need to extract chemical. + +we need to extract chemical name. + +we need to produce list of chemical names, each separated by " +PMC11780512 ". no extra text. + +let's compile final list. + +list of chemicals/metabolites: + +- silymarin +- silybin +- silybin a +- silybin b +- isosilybin +- silychristin a +- silychristin b +- silydianin +- taxifolin +- quercetin +- kaempferol +- 2,3-dehydrosilybin +- silybin-c-2',3-bis(hydrogen succinate) disodium salt +- gw9662 +- a-922500 +- pf-06424439 +- thapsigargin +- dimethyl sulfoxide +- ethanol +- chloroform +- methanol +- isopropanol +- sodium acetate-13c2, d3 +- sodium phosphate buffer +- metaphosphoric acid +- sodium chloride +- 3-(4,5-dimethylthiazol-2-yl)-2,5-diphenyltetrazolium bromide +- sodium acetate +- acetyl‑coa +- malonyl‑coa +- acyl‑coa +- free fatty acid +- triglyceride +- phospholipid +- phosphatidylcholine +- phosphatidylethanolamine +- phosphatidylserine +- phosphatidylinositol +- phosphatidylglycerol +- sphingomyelin +- cholesteryl ester +- low-density lipoprotein +- very-low-density lipoprotein +- cholesterol +- glucose +- glutathione +- glutathione disulfide +- butyryl‑coa +- sodium acetate +- sodium acetate-13c2, d3 (already) +- sodium acetate (already) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2, d3 (duplicate) +- sodium acetate (duplicate) +- sodium acetate-13c2 diff --git a/tests/test_text_generation.py b/tests/test_text_generation.py index 2b43944f..4a275c33 100644 --- a/tests/test_text_generation.py +++ b/tests/test_text_generation.py @@ -295,3 +295,38 @@ def test_retry_strategy_works(): ), ) assert len(results) == num_threads + + +@pytest.mark.parametrize( + ("text", "expected"), + [ + ( + Path("tests/test_data/invalid_chemical_response.txt").read_text(encoding="utf-8"), + True, + ), + ( + """I need to extract chemicals from text... + + thioacetamide + methotrexate""", + True, + ), + ( + """- thioacetamide + - methotrexate""", + True, + ), + ( + "thioacetamide ; methotrexate ; acetaminophen", + False, + ), + ( + "thioacetamide", + False, + ), + ], +) +def test_invalid_chemical_response(text: str, expected: bool): + """Test that the find_chemicals method handles invalid chemical responses gracefully.""" + actual = TextGenerationAPI().is_invalid_chemical_response(text) + assert actual == expected From 77e16f1bb76fe2539209d075f3b10f73071fcdcf Mon Sep 17 00:00:00 2001 From: rdurnik Date: Thu, 25 Jun 2026 15:46:45 +0200 Subject: [PATCH 11/20] shortened test invalid response --- tests/test_data/invalid_chemical_response.txt | 2021 +---------------- 1 file changed, 1 insertion(+), 2020 deletions(-) diff --git a/tests/test_data/invalid_chemical_response.txt b/tests/test_data/invalid_chemical_response.txt index 73e9c545..4166eb32 100644 --- a/tests/test_data/invalid_chemical_response.txt +++ b/tests/test_data/invalid_chemical_response.txt @@ -61,2023 +61,4 @@ list of chemicals/metabolites: - sodium acetate-13c2, d3 (already) - sodium acetate (already) - sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2, d3 (duplicate) -- sodium acetate (duplicate) -- sodium acetate-13c2 +- sodium acetate (duplicate) \ No newline at end of file From 6087d9bf2944c4769c3a2e5af41d2cc0c91498ad Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 26 Jun 2026 08:26:08 +0200 Subject: [PATCH 12/20] added additional test cases for invalid response --- tests/test_text_generation.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/test_text_generation.py b/tests/test_text_generation.py index 4a275c33..37568ed1 100644 --- a/tests/test_text_generation.py +++ b/tests/test_text_generation.py @@ -324,6 +324,33 @@ def test_retry_strategy_works(): "thioacetamide", False, ), + ( + "PCB 123", + False, + ), + ( + "PCB-123", + False, + ), + ( + "PCB-123 ; thioacetamide ; 3-(4,5-dimethylthiazol-2-yl)-2,5-diphenyltetrazolium bromide", + False, + ), + ( + """1. thioacetamide + 2. methotrexate""", + True, + ), + ( + """* thioacetamide + * methotrexate""", + True, + ), + ( + """** thioacetamide + ** methotrexate""", + True, + ), ], ) def test_invalid_chemical_response(text: str, expected: bool): From cf0666e6b5816b7627f18e0b9203c52e8e48bda1 Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 26 Jun 2026 09:05:08 +0200 Subject: [PATCH 13/20] added invalid response check for normalization --- src/aoptk/text_generation_api.py | 19 ++++++++++--------- tests/test_text_generation.py | 27 ++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index 5533a00d..5fd649b2 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -64,6 +64,7 @@ class TextGenerationAPI( specification_relationship_text_prompt: str = "" invalid_chemical_response_patterns: typing.ClassVar[list[str]] = ["\n-", "\n*", "\n1.", "\n"] + invalid_normalization_response_patterns: typing.ClassVar[list[str]] = ["\n-", "\n*", "\n1.", "\n", " ; "] def __init__( self, @@ -178,23 +179,21 @@ def find_chemicals(self, text: str) -> list[Chemical]: text (str): The input text to search for chemicals. """ if response := self._prompt(self._render_prompt(self.chemical_prompt_template, text=text)).lower(): - if self.is_invalid_chemical_response(response): + if self.is_invalid_response(response, self.invalid_chemical_response_patterns): return [] if response == "none": return [] return [Chemical(name=chem.strip().lower()) for chem in response.split(" ; ")] if response.strip() else [] return [] - def is_invalid_chemical_response( - self, - response: str, - ) -> bool: + def is_invalid_response(self, response: str, invalid_response_patterns: list[str]) -> bool: r"""Check if the response from the model is invalid for chemical extraction. Args: response (str): The response from the model. + invalid_response_patterns (list[str]): List of patterns that indicate an invalid response. """ - return bool(any(pattern in response.lower() for pattern in self.invalid_chemical_response_patterns)) + return bool(any(pattern in response.lower() for pattern in invalid_response_patterns)) def _encode_image(self, image_path: str) -> tuple[str, str]: """Encode the image at the given path to a base64 string and return MIME type. @@ -212,7 +211,7 @@ def _encode_image(self, image_path: str) -> tuple[str, str]: base64_image = base64.b64encode(image_file.read()).decode("utf-8") return base64_image, mime_type - def _process_colon_separated_response( + def _process_colon_separated_relationships_response( self, response: str, effect: Effect, @@ -303,7 +302,7 @@ def _classify_relationships_in_table( ) if response := self._prompt(content): - return self._process_colon_separated_response(response, effect, relationship_type, "table") + return self._process_colon_separated_relationships_response(response, effect, relationship_type, "table") return [] def normalize_chemical(self, chemical: Chemical, chemical_list: list[Chemical]) -> Chemical: @@ -337,6 +336,8 @@ def _find_matching_name(self, chemical: Chemical, chemical_list: list[Chemical]) ) if response := self._prompt(content).lower(): + if self.is_invalid_response(response, self.invalid_normalization_response_patterns): + return chemical if response == "none": return chemical return Chemical(name=response) @@ -436,7 +437,7 @@ def _classify_relationships_in_text_and_images( if response: relationships.extend( - self._process_colon_separated_response( + self._process_colon_separated_relationships_response( response, effect, relationship_type, diff --git a/tests/test_text_generation.py b/tests/test_text_generation.py index 37568ed1..d149d15d 100644 --- a/tests/test_text_generation.py +++ b/tests/test_text_generation.py @@ -298,10 +298,11 @@ def test_retry_strategy_works(): @pytest.mark.parametrize( - ("text", "expected"), + ("text", "invalid_response_patterns", "expected"), [ ( Path("tests/test_data/invalid_chemical_response.txt").read_text(encoding="utf-8"), + TextGenerationAPI.invalid_chemical_response_patterns, True, ), ( @@ -309,51 +310,71 @@ def test_retry_strategy_works(): thioacetamide methotrexate""", + TextGenerationAPI.invalid_chemical_response_patterns, True, ), ( """- thioacetamide - methotrexate""", + TextGenerationAPI.invalid_chemical_response_patterns, True, ), ( "thioacetamide ; methotrexate ; acetaminophen", + TextGenerationAPI.invalid_chemical_response_patterns, False, ), ( "thioacetamide", + TextGenerationAPI.invalid_chemical_response_patterns, False, ), ( "PCB 123", + TextGenerationAPI.invalid_chemical_response_patterns, False, ), ( "PCB-123", + TextGenerationAPI.invalid_chemical_response_patterns, False, ), ( "PCB-123 ; thioacetamide ; 3-(4,5-dimethylthiazol-2-yl)-2,5-diphenyltetrazolium bromide", + TextGenerationAPI.invalid_chemical_response_patterns, False, ), ( """1. thioacetamide 2. methotrexate""", + TextGenerationAPI.invalid_chemical_response_patterns, True, ), ( """* thioacetamide * methotrexate""", + TextGenerationAPI.invalid_chemical_response_patterns, True, ), ( """** thioacetamide ** methotrexate""", + TextGenerationAPI.invalid_chemical_response_patterns, + True, + ), + ( + "thioacetamide", + TextGenerationAPI.invalid_normalization_response_patterns, + False, + ), + ( + "thioacetamide ; methotrexate ; acetaminophen", + TextGenerationAPI.invalid_normalization_response_patterns, True, ), ], ) -def test_invalid_chemical_response(text: str, expected: bool): +def test_invalid_response(text: str, invalid_response_patterns: list[str], expected: bool): """Test that the find_chemicals method handles invalid chemical responses gracefully.""" - actual = TextGenerationAPI().is_invalid_chemical_response(text) + actual = TextGenerationAPI().is_invalid_response(text, invalid_response_patterns) assert actual == expected From 0524a565d6fbb6858d7b0abc84b34d6a3e9da1b9 Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 26 Jun 2026 11:39:07 +0200 Subject: [PATCH 14/20] fixed pmc get abstract test - pmc abstracts are no longer retrieved in the same order --- tests/test_pmc.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/test_pmc.py b/tests/test_pmc.py index 25bac1c1..429c909b 100644 --- a/tests/test_pmc.py +++ b/tests/test_pmc.py @@ -224,10 +224,11 @@ def test_exclude_only_preprint(tmp_path_factory: pytest.TempPathFactory): @pytest.mark.parametrize( - ("ids", "expected_abstracts"), + ("ids", "target_id", "expected_abstract"), [ ( [ID("PMC12231352"), ID("PMC12416454")], + ID("PMC12416454"), (Path("tests/test_data/PMC12416454_abstract.txt").read_text(encoding="utf-8")), ), ], @@ -235,18 +236,20 @@ def test_exclude_only_preprint(tmp_path_factory: pytest.TempPathFactory): @pytest.mark.xfail(raises=HTTPError) def test_generate_abstracts_for_specific_publications( ids: list[ID], - expected_abstracts: list[str], + target_id: ID, + expected_abstract: str, tmp_path_factory: pytest.TempPathFactory, ): """Generate list of abstracts for given query.""" storage_path = tmp_path_factory.mktemp("pmc_storage") - abstract = PMC( + abstracts = PMC( storage=storage_path, figure_storage=tmp_path_factory.mktemp("pmc_storage_figures"), - ).get_abstracts(ids=ids)[1] - ratio = fuzz.ratio(abstract.text, expected_abstracts) + ).get_abstracts(ids=ids) + abstract = next(ab for ab in abstracts if ab.id == target_id) + ratio = fuzz.ratio(abstract.text, expected_abstract.strip()) assert ratio >= 75 - assert (storage_path / f"{ids[1]}.txt").exists() + assert (storage_path / f"{target_id}.txt").exists() def test_generate_abstracts_multiple_abstracts( From 60a10e577bd972a2d611ab9af751af2acb3a442e Mon Sep 17 00:00:00 2001 From: rdurnik Date: Fri, 26 Jun 2026 15:31:19 +0200 Subject: [PATCH 15/20] added text generation mock test to improve test coverage --- tests/test_text_generation_mocked.py | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/test_text_generation_mocked.py diff --git a/tests/test_text_generation_mocked.py b/tests/test_text_generation_mocked.py new file mode 100644 index 00000000..261531a4 --- /dev/null +++ b/tests/test_text_generation_mocked.py @@ -0,0 +1,36 @@ +import pytest +from pytest_mock import MockerFixture +from aoptk.chemical import Chemical +from aoptk.text_generation_api import TextGenerationAPI + + +@pytest.mark.parametrize( + ("mock_prompt_response", "expected_chemicals"), + [ + ("\n- thioacetamide", []), + ("\n* methotrexate", []), + ("\n1. acetaminophen", []), + ("\nthioacetamide", []), + ("- thioacetamide\n- methotrexate", []), + ("1. numbered list\n2. item two", []), + ("thioacetamide", [Chemical("thioacetamide")]), + ("thioacetamide ; methotrexate", [Chemical("thioacetamide"), Chemical("methotrexate")]), + ("acetaminophen", [Chemical("acetaminophen")]), + ("PCB-123 ; thioacetamide", [Chemical("pcb-123"), Chemical("thioacetamide")]), + ], +) +def test_find_chemicals_with_invalid_and_valid_responses( + mocker: MockerFixture, + mock_prompt_response: str, + expected_chemicals: list[Chemical], +): + """Test that find_chemicals returns empty list for invalid responses and chemicals for valid ones.""" + api = TextGenerationAPI() + mocker.patch.object(api, "_prompt", return_value=mock_prompt_response) + + result = api.find_chemicals("some input text") + + if expected_chemicals: + assert [chem.name for chem in result] == [chem.name for chem in expected_chemicals] + else: + assert result == [] From af3b6f5cc0d809d753a13d3a2c5747ed9d4d43fc Mon Sep 17 00:00:00 2001 From: hechth Date: Thu, 27 Aug 2026 10:58:53 +0200 Subject: [PATCH 16/20] Add additional relationships Fixes #147 --- examples/find_chemicals_relationships.py | 6 +- src/aoptk/relationships/relationship_type.py | 228 ++++++++++++++++++- src/aoptk/text_generation_api.py | 26 ++- tests/test_relationship_type.py | 147 ++++++++++++ tests/test_text_generation.py | 24 +- 5 files changed, 405 insertions(+), 26 deletions(-) create mode 100644 tests/test_relationship_type.py diff --git a/examples/find_chemicals_relationships.py b/examples/find_chemicals_relationships.py index e80eb78e..281ededc 100644 --- a/examples/find_chemicals_relationships.py +++ b/examples/find_chemicals_relationships.py @@ -4,8 +4,8 @@ from aoptk.chemical import Chemical from aoptk.effect import Effect from aoptk.relationships.relationship import Relationship -from aoptk.relationships.relationship_type import Causative -from aoptk.relationships.relationship_type import Inhibitive +from aoptk.relationships.relationship_type import Causation +from aoptk.relationships.relationship_type import Inhibition from aoptk.text_generation_api import LLMFailureError from aoptk.text_generation_api import TextGenerationAPI @@ -32,7 +32,7 @@ def write_chemicals(publication_id: str, chemicals: list[Chemical]) -> None: publications = list(Path("publications").iterdir())[:3] effects = [Effect("liver fibrosis"), Effect("liver cell death")] -relationship_types = [Causative(), Inhibitive()] +relationship_types = [Causation(), Inhibition()] completed = [] retry = [] diff --git a/src/aoptk/relationships/relationship_type.py b/src/aoptk/relationships/relationship_type.py index ffb54628..fa0ef914 100644 --- a/src/aoptk/relationships/relationship_type.py +++ b/src/aoptk/relationships/relationship_type.py @@ -8,9 +8,27 @@ def __init__(self, positive: str, positive_verb: str, negative: str, negative_ve self.negative_verb = negative_verb self.definition = definition + def __eq__(self, other: object) -> bool: + """Compare two relationship types by their positive label.""" + return isinstance(other, RelationshipType) and self.positive == other.positive -class Inhibitive(RelationshipType): - """Data structure representing an inhibition relationship between a chemical and an effect.""" + def __hash__(self) -> int: + """Hash a relationship type by its positive label.""" + return hash(self.positive) + + def __repr__(self) -> str: + """Human-readable representation of a relationship type.""" + return f"{self.__class__.__name__}(positive={self.positive!r})" + + +class Inhibition(RelationshipType): + """Data structure representing an inhibition relationship between a chemical and an effect. + + Inhibition covers the chemical blocking, suppressing, or reducing an existing or + ongoing process (e.g. an enzyme or pathway). Unlike Prevention, it does not require + the effect to be averted before it starts, and unlike Alleviation, it does not imply + a therapeutic benefit to the organism. + """ def __init__(self): super().__init__( @@ -18,12 +36,25 @@ def __init__(self): positive_verb="inhibits", negative="no inhibition", negative_verb="does not inhibit", - definition="Inhibit means the chemical suppresses, reduces, blocks, or prevents the biological effect. ", + definition=( + "Inhibit means the chemical blocks, suppresses, or reduces the activity of the biological effect, " + "for example by blocking an enzyme or pathway. The effect is a biological process or activity; " + "the chemical reduces its level or rate. Do not classify as inhibition if the effect is averted " + "before it occurs (prevention), if the statement describes a therapeutic benefit to the organism " + "(alleviation or mitigation), or if the chemical starts or switches the effect on (activation or " + "stimulation)." + ), ) -class Causative(RelationshipType): - """Data structure representing a causative relationship between a chemical and an effect.""" +class Causation(RelationshipType): + """Data structure representing a causation relationship between a chemical and an effect. + + Causation covers the chemical bringing about, inducing, or being responsible for the + effect. Unlike Promotion, causation states the chemical directly brings the effect + about; unlike Induction, it does not specifically refer to triggering a response or + expression. + """ def __init__(self): super().__init__( @@ -31,5 +62,190 @@ def __init__(self): positive_verb="causes", negative="no causation", negative_verb="does not cause", - definition="Cause means the chemical brings about, induces, or is responsible for the biological effect.", + definition=( + "Cause means the chemical brings about, induces, or is responsible for the biological effect. " + "The chemical is the direct source or trigger of the effect. Do not classify as causation if the " + "chemical only favors, encourages, or increases the likelihood of the effect over time (promotion), " + "if the statement specifically describes triggered expression, differentiation, or a physiological " + "response (induction), or if the chemical reduces, blocks, or averts the effect (inhibition, " + "prevention, alleviation, mitigation, or regulation)." + ), + ) + + +class Activation(RelationshipType): + """Data structure representing an activation relationship between a chemical and an effect. + + Activation covers the chemical switching on, stimulating, or turning on a biological + process (e.g. a receptor, channel, or pathway). Unlike Causation, the focus is on the + process moving from an inactive to an active state; unlike Promotion, it is an on/off + mechanism rather than a gradual increase over time. + """ + + def __init__(self): + super().__init__( + positive="activation", + positive_verb="activates", + negative="no activation", + negative_verb="does not activate", + definition=( + "Activate means the chemical switches on, stimulates, or turns on the biological effect, for " + "example a receptor, ion channel, or signaling pathway. The effect moves from an inactive to an " + "active state. Do not classify as activation if the chemical only increases the rate or likelihood " + "of the effect over time (promotion), if it broadly brings the effect about (causation), or if it " + "reduces or blocks the effect (inhibition or regulation)." + ), + ) + + +class Promotion(RelationshipType): + """Data structure representing a promotion relationship between a chemical and an effect. + + Promotion covers the chemical favoring, encouraging, increasing, or facilitating the + effect (e.g. promoting proliferation). Unlike Causation, promotion does not require + the chemical to be the direct source of the effect; unlike Activation, it describes a + gradual increase or facilitation rather than switching the effect on. + """ + + def __init__(self): + super().__init__( + positive="promotion", + positive_verb="promotes", + negative="no promotion", + negative_verb="does not promote", + definition=( + "Promote means the chemical favors, encourages, increases, or facilitates the biological effect, " + "for example by promoting cell proliferation or disease progression. The effect is a process the " + "chemical makes more likely, more frequent, or more extensive. Do not classify as promotion if the " + "chemical directly brings the effect about (causation), if the statement is about switching a " + "mechanism on (activation), or if the chemical reduces or averts the effect (inhibition, " + "prevention, alleviation, mitigation, or regulation)." + ), + ) + + +class Prevention(RelationshipType): + """Data structure representing a prevention relationship between a chemical and an effect. + + Prevention covers the chemical averting, protecting against, or preventing the effect + from occurring. Unlike Inhibition, the effect never starts or is stopped before onset; + unlike Alleviation, the effect is averted before it becomes present. + """ + + def __init__(self): + super().__init__( + positive="prevention", + positive_verb="prevents", + negative="no prevention", + negative_verb="does not prevent", + definition=( + "Prevent means the chemical averts, protects against, or stops the biological effect from " + "occurring. The effect does not develop because the chemical was present. Do not classify as " + "prevention if the effect is already underway and the chemical reduces it (inhibition), if the " + "effect is already present and the chemical eases it (alleviation or mitigation), or if the " + "chemical brings the effect about (causation, promotion, activation, or regulation)." + ), + ) + + +class Induction(RelationshipType): + """Data structure representing an induction relationship between a chemical and an effect. + + Induction covers the chemical triggering, eliciting, or turning on a response, + expression, or physiological state (e.g. inducing gene expression or apoptosis). + Like Causation it is a positive, initiating direction, but it is specific to triggered + responses rather than to bringing an effect about in general. + """ + + def __init__(self): + super().__init__( + positive="induction", + positive_verb="induces", + negative="no induction", + negative_verb="does not induce", + definition=( + "Induce means the chemical triggers, elicits, or turns on the biological effect, for example " + "gene expression, apoptosis, or a physiological response. The effect is a response or state that " + "the chemical starts. Use induction when the statement specifically describes triggering an " + "expression, differentiation, or response; for general statements that the chemical brings the " + "effect about, use causation instead. Do not classify as induction if the chemical reduces, " + "blocks, or averts the effect (inhibition, prevention, alleviation, mitigation, or " + "regulation)." + ), + ) + + +class Alleviation(RelationshipType): + """Data structure representing an alleviation relationship between a chemical and an effect. + + Alleviation covers the chemical relieving, easing, or reducing the severity of an + effect already experienced (e.g. alleviating inflammation). Unlike Prevention, the + effect is already present; unlike Mitigation, alleviation emphasizes symptomatic + relief. + """ + + def __init__(self): + super().__init__( + positive="alleviation", + positive_verb="alleviates", + negative="no alleviation", + negative_verb="does not alleviate", + definition=( + "Alleviate means the chemical relieves, eases, or reduces the severity of the biological effect, " + "for example alleviating pain or inflammation. The effect is already present and the chemical " + "makes it less severe. Do not classify as alleviation if the effect is averted before it occurs " + "(prevention), if the chemical blocks the underlying process (inhibition), or if the chemical " + "reduces the overall risk or harm (mitigation)." + ), + ) + + +class Mitigation(RelationshipType): + """Data structure representing a mitigation relationship between a chemical and an effect. + + Mitigation covers the chemical lessening, moderating, or reducing the severity or + impact of the effect. It is the protective, harm-reducing counterpart to Promotion; + unlike Alleviation, it emphasizes reducing risk or harm rather than easing symptoms. + """ + + def __init__(self): + super().__init__( + positive="mitigation", + positive_verb="mitigates", + negative="no mitigation", + negative_verb="does not mitigate", + definition=( + "Mitigate means the chemical lessens, moderates, or reduces the severity, impact, or risk of the " + "biological effect. The chemical reduces the harm the effect causes. Do not classify as " + "mitigation if the effect is averted entirely before onset (prevention), if the chemical blocks " + "the underlying process (inhibition), or if it eases an existing symptom (alleviation)." + ), + ) + + +class Regulation(RelationshipType): + """Data structure representing a regulation relationship between a chemical and an effect. + + Regulation covers the chemical modulating the level or expression of the effect + (e.g. gene or protein expression). It is directional: a level increase is reported + as upregulation (positive), a level decrease as downregulation (negative). Unlike + Inhibition, it is specific to the expression or abundance level of a molecular + target; unlike Causation and Promotion, it states how the level changes, not that + the chemical brings the effect about. + """ + + def __init__(self): + super().__init__( + positive="upregulation", + positive_verb="upregulates", + negative="downregulation", + negative_verb="downregulates", + definition=( + "Regulate means the chemical modulates the level or expression of the biological effect, for " + "example the expression or abundance of a gene or protein. The effect is a molecular target whose " + "level changes. Return upregulation if the chemical increases the level and downregulation if it " + "decreases the level. Do not classify as regulation if the statement is about triggering a " + "response or expression without specifying an increase or decrease in level (induction), or about " + "blocking an existing process rather than changing an expression level (inhibition)." + ), ) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index 4e9c4da4..5a9e4077 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -3,7 +3,6 @@ import os from itertools import product from pathlib import Path -from typing import Literal import pandas as pd from dotenv import load_dotenv from jinja2 import Template @@ -19,11 +18,28 @@ from aoptk.normalization.normalize_chemical import NormalizeChemical from aoptk.relationships.find_relationship import FindRelationship from aoptk.relationships.relationship import Relationship -from aoptk.relationships.relationship_type import Causative -from aoptk.relationships.relationship_type import Inhibitive +from aoptk.relationships.relationship_type import Activation +from aoptk.relationships.relationship_type import Alleviation +from aoptk.relationships.relationship_type import Causation +from aoptk.relationships.relationship_type import Induction +from aoptk.relationships.relationship_type import Inhibition +from aoptk.relationships.relationship_type import Mitigation +from aoptk.relationships.relationship_type import Prevention +from aoptk.relationships.relationship_type import Promotion +from aoptk.relationships.relationship_type import Regulation from aoptk.relationships.relationship_type import RelationshipType -topics = {Inhibitive(), Causative()} +topics = { + Inhibition(), + Causation(), + Activation(), + Promotion(), + Prevention(), + Induction(), + Alleviation(), + Mitigation(), + Regulation(), +} class LLMFailureError(Exception): @@ -43,7 +59,7 @@ class TextGenerationAPI( ): """Text generation API using OpenAI.""" - role: Literal["user"] = "user" + role: str = "user" temperature: float = 0 top_p: float = 1 load_dotenv() diff --git a/tests/test_relationship_type.py b/tests/test_relationship_type.py new file mode 100644 index 00000000..292bf04b --- /dev/null +++ b/tests/test_relationship_type.py @@ -0,0 +1,147 @@ +from __future__ import annotations +from aoptk.relationships import relationship_type +from aoptk.relationships.relationship_type import Activation +from aoptk.relationships.relationship_type import Alleviation +from aoptk.relationships.relationship_type import Causation +from aoptk.relationships.relationship_type import Induction +from aoptk.relationships.relationship_type import Inhibition +from aoptk.relationships.relationship_type import Mitigation +from aoptk.relationships.relationship_type import Prevention +from aoptk.relationships.relationship_type import Promotion +from aoptk.relationships.relationship_type import Regulation +from aoptk.relationships.relationship_type import RelationshipType +from aoptk.text_generation_api import topics + + +def all_relationship_types() -> list[RelationshipType]: + """Return one instance of every concrete relationship type.""" + return [ + Inhibition(), + Causation(), + Activation(), + Promotion(), + Prevention(), + Induction(), + Alleviation(), + Mitigation(), + Regulation(), + ] + + +def test_relationship_type_is_instance(): + """Each concrete relationship type is a RelationshipType with all fields set.""" + for rel_type in all_relationship_types(): + assert isinstance(rel_type, RelationshipType) + assert rel_type.positive + assert rel_type.positive_verb + assert rel_type.negative + assert rel_type.negative_verb + assert rel_type.definition + + +def test_positive_labels_are_distinct_and_lowercase(): + """Positive labels must be unique single lowercase words (used verbatim in prompts).""" + positives = [rel_type.positive for rel_type in all_relationship_types()] + assert len(positives) == len(set(positives)) + for positive in positives: + assert positive.islower() + assert " " not in positive + + +def test_positive_and_negative_verb_pairings(): + """Each type pairs its positive verb with the expected positive label.""" + expected = { + Inhibition(): ("inhibits", "inhibition"), + Causation(): ("causes", "causation"), + Activation(): ("activates", "activation"), + Promotion(): ("promotes", "promotion"), + Prevention(): ("prevents", "prevention"), + Induction(): ("induces", "induction"), + Alleviation(): ("alleviates", "alleviation"), + Mitigation(): ("mitigates", "mitigation"), + Regulation(): ("upregulates", "upregulation"), + } + for rel_type, (verb, positive) in expected.items(): + assert rel_type.positive_verb == verb + assert rel_type.positive == positive + + +def test_regulation_is_directional(): + """Regulation reports direction instead of negation: upregulation vs. downregulation.""" + regulation = Regulation() + assert regulation.positive == "upregulation" + assert regulation.positive_verb == "upregulates" + assert regulation.negative == "downregulation" + assert regulation.negative_verb == "downregulates" + + +def test_equivalence_is_by_positive_label(): + """Two instances of the same type compare equal and share a hash (needed for set.difference).""" + assert Inhibition() == Inhibition() + assert hash(Inhibition()) == hash(Inhibition()) + assert Inhibition() != Causation() + assert Inhibition() != "inhibition" + + +def test_repr(): + """Repr shows the class and positive label.""" + assert repr(Inhibition()) == "Inhibition(positive='inhibition')" + + +def test_topics_contains_all_relationship_types(): + """The topics set used to exclude other topics in prompts covers every relationship type.""" + for rel_type in all_relationship_types(): + assert rel_type in topics + + +def test_other_topics_excludes_only_current_type(): + """topics.difference({current}) removes exactly the current type, even for a fresh instance.""" + for rel_type in all_relationship_types(): + other_topics = topics.difference({rel_type}) + assert len(other_topics) == len(topics) - 1 + assert rel_type not in other_topics + positives = {topic.positive for topic in other_topics} + expected = {topic.positive for topic in all_relationship_types()} - {rel_type.positive} + assert positives == expected + + +def test_definitions_delineate_overlapping_concepts(): + """Definitions of easily-confused pairs explicitly steer away from each other.""" + by_type = {rel_type.positive: rel_type.definition for rel_type in all_relationship_types()} + # inhibition vs. prevention vs. alleviation vs. mitigation + assert "prevention" in by_type["inhibition"] + assert "alleviation" in by_type["inhibition"] + assert "inhibition" in by_type["prevention"] + assert "alleviation" in by_type["prevention"] + assert "prevention" in by_type["alleviation"] + assert "inhibition" in by_type["alleviation"] + assert "mitigation" in by_type["alleviation"] + assert "prevention" in by_type["mitigation"] + # causation vs. promotion vs. activation vs. induction + assert "promotion" in by_type["causation"] + assert "induction" in by_type["causation"] + assert "causation" in by_type["promotion"] + assert "activation" in by_type["promotion"] + assert "promotion" in by_type["activation"] + assert "causation" in by_type["activation"] + assert "causation" in by_type["induction"] + # regulation (positive label: upregulation) vs. induction vs. inhibition + assert "downregulation" in by_type["upregulation"] + assert "induction" in by_type["upregulation"] + assert "inhibition" in by_type["upregulation"] + assert "regulation" in by_type["induction"] + + +def test_old_class_names_removed(): + """Renamed/merged classes must not be importable anymore.""" + assert not hasattr(relationship_type, "Causative") + assert not hasattr(relationship_type, "Inhibitive") + assert not hasattr(relationship_type, "Upregulation") + assert not hasattr(relationship_type, "Downregulation") + + +def test_prompt_fields_render(): + """Jinja-style attribute access used by the prompt templates resolves for every type.""" + for rel_type in all_relationship_types(): + prompt_line = f"{rel_type.positive_verb} {rel_type.positive} {rel_type.negative}" + assert len(prompt_line) > 0 diff --git a/tests/test_text_generation.py b/tests/test_text_generation.py index caf80fc4..78ded6a1 100644 --- a/tests/test_text_generation.py +++ b/tests/test_text_generation.py @@ -12,8 +12,8 @@ from aoptk.normalization.normalize_chemical import NormalizeChemical from aoptk.relationships.find_relationship import FindRelationship from aoptk.relationships.relationship import Relationship -from aoptk.relationships.relationship_type import Causative -from aoptk.relationships.relationship_type import Inhibitive +from aoptk.relationships.relationship_type import Causation +from aoptk.relationships.relationship_type import Inhibition from aoptk.relationships.relationship_type import RelationshipType from aoptk.text_generation_api import TextGenerationAPI @@ -89,18 +89,18 @@ def test_find_chemical(text: str, expected: list[str]): [ ( "Cancer is caused by thioacetamide, not by acetaminophen.", - [Causative()], + [Causation()], [Chemical(name="acetaminophen"), Chemical(name="thioacetamide")], [Effect(name="cancer")], [ Relationship( - relationship_type=Causative().negative, + relationship_type=Causation().negative, chemical=Chemical(name="acetaminophen"), effect=Effect(name="cancer"), context="Cancer is caused by thioacetamide, not by acetaminophen.", ), Relationship( - relationship_type=Causative().positive, + relationship_type=Causation().positive, chemical=Chemical(name="thioacetamide"), effect=Effect(name="cancer"), context="Cancer is caused by thioacetamide, not by acetaminophen.", @@ -109,19 +109,19 @@ def test_find_chemical(text: str, expected: list[str]): ), ( "Just some random text with no effect and no chemical in here.", - [Causative()], + [Causation()], [], [], [], ), ( "Thioacetamide was studied. Acetaminophen caused liver fibrosis.", - [Causative(), Inhibitive()], + [Causation(), Inhibition()], [Chemical(name="thioacetamide"), Chemical(name="acetaminophen")], [Effect(name="liver fibrosis"), Effect(name="cancer")], [ Relationship( - relationship_type=Causative().positive, + relationship_type=Causation().positive, chemical=Chemical(name="acetaminophen"), effect=Effect(name="liver fibrosis"), context="Thioacetamide was studied. Acetaminophen caused liver fibrosis.", @@ -173,13 +173,13 @@ def test_relationship_table(phthalate_table_data: dict): """Test find_relationships_in_table method with a table.""" actual = TextGenerationAPI().find_relationships_in_table( table_df=pd.DataFrame(phthalate_table_data), - relationship_types=[Inhibitive()], + relationship_types=[Inhibition()], effects=[Effect(name="gap junction intercellular communication")], ) assert any( r.chemical.name == "dipropyl phthalate" and r.effect.name == "gap junction intercellular communication" - and r.relationship_type == Inhibitive().positive + and r.relationship_type == Inhibition().positive and r.context == "table" for r in actual ) @@ -229,7 +229,7 @@ def test_find_relationships_in_text_and_images(text: str, images: list[str], exp actual = TextGenerationAPI(model="llama-4-scout-17b-16e-instruct").find_relationships_in_text_and_images( text=text, image_paths=images, - relationship_types=[Inhibitive()], + relationship_types=[Inhibition()], effects=[Effect(name="gap junction intercellular communication")], ) @@ -240,7 +240,7 @@ def test_find_relationships_in_text_and_images(text: str, images: list[str], exp assert any( r.chemical.name == expected_chemical and r.effect.name == "gap junction intercellular communication" - and r.relationship_type == Inhibitive().positive + and r.relationship_type == Inhibition().positive for r in actual ) From bfe089068f958a7bd151748bc33b54fa3aecc2e9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 27 Aug 2026 09:26:47 +0000 Subject: [PATCH 17/20] Address text generation API review comments Co-authored-by: hechth <12066490+hechth@users.noreply.github.com> --- src/aoptk/text_generation_api.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index 5fd649b2..7c9e1d20 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -49,7 +49,7 @@ class TextGenerationAPI( top_p: float = 1 load_dotenv() client: OpenAI - max_retries: int = 10 + max_retries: int = 3 timeout: int = 120 prompts_dir: Path = Path(__file__).resolve().parent / "prompts" chemical_prompt_template: str = "chemical_prompt.txt" @@ -179,9 +179,7 @@ def find_chemicals(self, text: str) -> list[Chemical]: text (str): The input text to search for chemicals. """ if response := self._prompt(self._render_prompt(self.chemical_prompt_template, text=text)).lower(): - if self.is_invalid_response(response, self.invalid_chemical_response_patterns): - return [] - if response == "none": + if self.is_invalid_response(response, self.invalid_chemical_response_patterns) or response == "none": return [] return [Chemical(name=chem.strip().lower()) for chem in response.split(" ; ")] if response.strip() else [] return [] @@ -336,9 +334,7 @@ def _find_matching_name(self, chemical: Chemical, chemical_list: list[Chemical]) ) if response := self._prompt(content).lower(): - if self.is_invalid_response(response, self.invalid_normalization_response_patterns): - return chemical - if response == "none": + if self.is_invalid_response(response, self.invalid_normalization_response_patterns) or response == "none": return chemical return Chemical(name=response) return chemical From 634ae099dd0847fc998c8c9c7c6ff80b5e56892f Mon Sep 17 00:00:00 2001 From: hechth Date: Thu, 27 Aug 2026 11:51:00 +0200 Subject: [PATCH 18/20] changed text comparison to use fuzz --- src/aoptk/text_generation_api.py | 21 ++++++++++++++++----- tests/test_pmc.py | 2 +- tests/test_relationship_type.py | 21 +++++++++++++++------ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index 5a9e4077..ac288fdb 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -42,6 +42,20 @@ } +def other_topics_labels(relationship_type: RelationshipType) -> str: + """Render the labels of all topics except the given one, in stable alphabetical order. + + Sorting is required for reproducibility: set iteration order depends on hashing and + varies between processes, which would make rendered prompts (and thus LLM behavior) + nondeterministic across runs. + + Args: + relationship_type (RelationshipType): The relationship type to exclude. + """ + remaining = {topic for topic in topics if topic != relationship_type} + return ", ".join(sorted(topic.positive for topic in remaining)) + + class LLMFailureError(Exception): """Base class for capturing LLM failures.""" @@ -130,14 +144,13 @@ def _relationship_prompt( effect (Effect): The effect entity. relationship_type (RelationshipType): The relationship type to classify. """ - other_topics = topics.difference({relationship_type}) content = self._render_prompt( self.relationship_text_prompt_template, text=text, chem=chemical.name, effect=effect.name, rel_type=relationship_type, - other_topics=", ".join([topic.positive for topic in other_topics]), + other_topics=other_topics_labels(relationship_type), specification_relationship_text_prompt=self.specification_relationship_text_prompt, ) @@ -401,8 +414,6 @@ def _classify_relationships_in_text_and_images( effect (Effect): The effect entity. relationship_type (RelationshipType): The relationship type to classify. """ - other_topics = topics.difference({relationship_type}) - encoded_images = [self._encode_image(image_path) for image_path in image_paths] relationships = [] @@ -415,7 +426,7 @@ def _classify_relationships_in_text_and_images( text=text, effect=effect.name, rel_type=relationship_type, - other_topics=", ".join([topic.positive for topic in other_topics]), + other_topics=other_topics_labels(relationship_type), ), }, ] diff --git a/tests/test_pmc.py b/tests/test_pmc.py index 25bac1c1..419e6224 100644 --- a/tests/test_pmc.py +++ b/tests/test_pmc.py @@ -69,7 +69,7 @@ def test_extract_full_text(provide_publications: dict, provide_temp_storage: Pat .full_text ) expected = provide_publications["full_text"] - assert actual == expected + assert fuzz.ratio(actual, expected) >= 95 assert (provide_temp_storage / f"{provide_publications['id']}.txt").exists() diff --git a/tests/test_relationship_type.py b/tests/test_relationship_type.py index 292bf04b..57d0300b 100644 --- a/tests/test_relationship_type.py +++ b/tests/test_relationship_type.py @@ -10,6 +10,7 @@ from aoptk.relationships.relationship_type import Promotion from aoptk.relationships.relationship_type import Regulation from aoptk.relationships.relationship_type import RelationshipType +from aoptk.text_generation_api import other_topics_labels from aoptk.text_generation_api import topics @@ -95,14 +96,22 @@ def test_topics_contains_all_relationship_types(): def test_other_topics_excludes_only_current_type(): - """topics.difference({current}) removes exactly the current type, even for a fresh instance.""" + """other_topics_labels drops exactly the current type and keeps all others, even for a fresh instance.""" for rel_type in all_relationship_types(): - other_topics = topics.difference({rel_type}) - assert len(other_topics) == len(topics) - 1 - assert rel_type not in other_topics - positives = {topic.positive for topic in other_topics} + labels = other_topics_labels(rel_type).split(", ") + assert len(labels) == len(topics) - 1 + assert rel_type.positive not in labels expected = {topic.positive for topic in all_relationship_types()} - {rel_type.positive} - assert positives == expected + assert set(labels) == expected + + +def test_other_topics_order_is_stable(): + """Labels are rendered in alphabetical order so prompts are identical across processes.""" + for rel_type in all_relationship_types(): + labels = other_topics_labels(rel_type) + assert labels == ", ".join(sorted(labels.split(", "))) + # independent calls with equivalent instances produce identical output + assert labels == other_topics_labels(type(rel_type)()) def test_definitions_delineate_overlapping_concepts(): From af0b7a0dc43eacdbded59d50f056f7e865dce6a3 Mon Sep 17 00:00:00 2001 From: hechth Date: Thu, 27 Aug 2026 11:59:14 +0200 Subject: [PATCH 19/20] fix mypy --- src/aoptk/text_generation_api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/aoptk/text_generation_api.py b/src/aoptk/text_generation_api.py index ac288fdb..f0ac2c24 100644 --- a/src/aoptk/text_generation_api.py +++ b/src/aoptk/text_generation_api.py @@ -3,6 +3,7 @@ import os from itertools import product from pathlib import Path +from typing import Literal import pandas as pd from dotenv import load_dotenv from jinja2 import Template @@ -73,7 +74,7 @@ class TextGenerationAPI( ): """Text generation API using OpenAI.""" - role: str = "user" + role: Literal["user"] = "user" temperature: float = 0 top_p: float = 1 load_dotenv() From fc617fa0902f3fc5f0b7a34bf251684b60ef13e3 Mon Sep 17 00:00:00 2001 From: hechth Date: Thu, 24 Sep 2026 11:03:17 +0200 Subject: [PATCH 20/20] hardened tests for better service availability --- tests/conftest.py | 6 + tests/service_availability.py | 253 +++++++++++++++++++++++++++++ tests/test_aop_wiki.py | 8 + tests/test_europepmc.py | 7 + tests/test_pmc.py | 7 + tests/test_pubchem_api.py | 7 + tests/test_pubmed.py | 7 + tests/test_pymupdf_parser.py | 4 +- tests/test_service_availability.py | 165 +++++++++++++++++++ tests/test_text_generation.py | 10 ++ uv.lock | 127 +++++++++------ 11 files changed, 554 insertions(+), 47 deletions(-) create mode 100644 tests/service_availability.py create mode 100644 tests/test_service_availability.py diff --git a/tests/conftest.py b/tests/conftest.py index 26e81b27..22bc95b2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,6 +3,10 @@ from aoptk.literature.databases.pmc import PMC from aoptk.literature.id import ID +# Imported for its side effect: pytest collects the hook out of this module's namespace. +from tests.service_availability import pytest_runtest_makereport # noqa: F401 +from tests.service_availability import require_pmc_and_europepmc_services + # ruff: noqa: E501 @@ -116,6 +120,8 @@ ) def provide_publications(request: pytest.FixtureRequest, tmp_path_factory: pytest.TempPathFactory): """Provide parameters for publication fixture, including PDFs.""" + # The fixture downloads PDFs from NCBI, so it needs both NCBI and Europe PMC to be up. + require_pmc_and_europepmc_services() pmc = PMC( storage=tmp_path_factory.mktemp(f"{request.param['id']}"), figure_storage=tmp_path_factory.mktemp(f"{request.param['id']}_figures"), diff --git a/tests/service_availability.py b/tests/service_availability.py new file mode 100644 index 00000000..aad486e4 --- /dev/null +++ b/tests/service_availability.py @@ -0,0 +1,253 @@ +"""Helpers that turn unavailable external services into expected test failures. + +Parts of this test suite depend on remote services (NCBI E-utilities, Europe PMC, the CERIT +LLM gateway). Those services are occasionally down, overloaded, or reconfigured, which shows +up either as a connectivity/HTTP failure while probing the endpoint, or as a server-side error +reported by the service itself. Neither case is a defect in aoptk, so such tests are reported +as expected failures (xfailed) instead of failures or errors: + +- Before a test runs, the endpoints it needs are probed (once per session, cached). If an + endpoint does not answer, the test is xfailed via ``require_*_service``. +- If a test fails with an exception that indicates a problem on the service side (5xx status, + timeouts, blocked/unknown model, ...), the failure is turned into an xfail by the hook in + ``tests/conftest.py``, which delegates to ``is_environment_or_service_problem_call``. +""" + +from __future__ import annotations +import os +import re +import time +from typing import TYPE_CHECKING +from typing import Any +import pytest +import requests + +if TYPE_CHECKING: + from collections.abc import Iterator + +# Probes must be fast - a service that does not answer within this budget counts as unavailable. +probe_timeout = 10 +# A service that failed a probe is unhealthy; do not repeat the expensive probe for every test. +unhealthy_cache_ttl = 300 +# First HTTP status that reports a problem of the service itself rather than of the request. +http_server_error_status = 500 + +# Exception classes whose presence means the remote service misbehaved. Referenced by name so +# that this module does not have to import the SDKs at collection time. Status errors (the +# openai.*Error and requests.HTTPError family) are classified by their status code instead. +server_problem_exception_names = frozenset( + { + "openai.APIConnectionError", + "openai.APITimeoutError", + "requests.exceptions.ConnectionError", + "requests.exceptions.Timeout", + "http.client.RemoteDisconnected", + "ConnectionResetError", + "TimeoutError", + }, +) +# HTTP statuses that are reported by a healthy service about itself, not about the request. +server_problem_status_codes = frozenset({429, 500, 502, 503, 504}) +# Substrings that mark a failure as a problem on the service side rather than in aoptk. +server_problem_message_patterns = ( + "temporarily unavailable", + "timeout waiting for worker", + "search backend failed", + "model is blocked", + "invalid model name", + "no deployments found", + "service unavailable", + "bad gateway", + "gateway timeout", + "too many requests", + "rate limit", + "overloaded", + "connection reset by peer", +) +# e.g. "Error code: 503", "Status: 500". +server_problem_status_regex = re.compile(r"(?:error code|status)\D{0,3}5\d\d", re.IGNORECASE) +# Credentials a test environment may legitimately not provide, mapped to the messages their +# SDKs produce when they are missing. Like an outage, they say nothing about aoptk - but only +# while the variable really is unset, so that a broken wiring inside aoptk still fails loudly +# in an environment where the credential is available. +environment_problem_credentials: dict[str, tuple[str, ...]] = { + "CERIT_API_KEY": ("api_key client option must be set", "openai_api_key environment variable"), +} + +# Probe results of the current session: endpoint -> (timestamp, failure detail; empty = healthy). +_probe_cache: dict[str, tuple[float, str]] = {} + +# Endpoints needed to query the NCBI PMC database. +pmc_endpoints = ( + "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/einfo.fcgi", + "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pmc&term=liver+cancer&retmax=1", + "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pmc&id=12416454", +) +# Endpoints needed to query the NCBI PubMed database. +pubmed_endpoints = ( + "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/einfo.fcgi", + "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=liver+cancer&retmax=1", + "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=38081985", +) +# Europe PMC mirrors the same articles and shares figure/PDC image URLs with the PMC fixture +# data, so tests using PMC publications need both services. +europepmc_endpoints = ( + "https://www.ebi.ac.uk/europepmc/webservices/rest/search?query=liver%20cancer&format=json&pageSize=1", + "https://www.ebi.ac.uk/europepmc/webservices/rest/PMC12231352/fullTextXML", +) +# Text generation endpoint used by TextGenerationAPI. +llm_models_endpoint = os.getenv("AOPKT_LLM_MODELS_URL", "https://llm.ai.e-infra.cz/v1/models") +# PubChem compound identification endpoint used by PubChemAPI. +pubchem_endpoints = ("https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/name/thioacetamide/cids/JSON",) +# AOP-Wiki knowledge base endpoint used by AOPWiki. +aop_wiki_endpoints = ("https://aopwiki.org/aops/38.json",) + + +@pytest.hookimpl(wrapper=True) +def pytest_runtest_makereport(item: pytest.Item, call: pytest.CallInfo[Any]) -> Iterator[Any]: # noqa: ARG001 + """Report failures caused by a misbehaving external service as expected failures. + + Re-exported from ``tests/conftest.py`` so that pytest picks it up for the whole suite. + """ + report = yield + if report is not None and report.failed and is_service_or_environment_problem_call(call): + assert call.excinfo is not None # a failure always carries an exception + report.wasxfail = f"external service problem: {call.excinfo.value}" + report.outcome = "skipped" + return report + + +def require_pmc_service() -> None: + """Xfail the calling test unless the NCBI PMC service answers.""" + xfail_if_unavailable(*pmc_endpoints) + + +def require_pubmed_service() -> None: + """Xfail the calling test unless the NCBI PubMed service answers.""" + xfail_if_unavailable(*pubmed_endpoints) + + +def require_europepmc_service() -> None: + """Xfail the calling test unless the Europe PMC service answers.""" + xfail_if_unavailable(*europepmc_endpoints) + + +def require_pmc_and_europepmc_services() -> None: + """Xfail the calling test unless both NCBI PMC and Europe PMC answer.""" + xfail_if_unavailable(*pmc_endpoints, *europepmc_endpoints) + + +def require_llm_service() -> None: + """Xfail the calling test unless the text generation service answers. + + The API key is deliberately not sent to the probe endpoint: the probe only checks whether + the service is up, so that tests which do not call it stay runnable without credentials. + Missing credentials, blocked models and other service-side problems surface during the + test itself and are turned into xfails by the makereport hook. + """ + xfail_if_unavailable(llm_models_endpoint) + + +def require_pubchem_service() -> None: + """Xfail the calling test unless the PubChem service answers.""" + xfail_if_unavailable(*pubchem_endpoints) + + +def require_aop_wiki_service() -> None: + """Xfail the calling test unless the AOP-Wiki service answers.""" + xfail_if_unavailable(*aop_wiki_endpoints) + + +def xfail_if_unavailable(*endpoints: str) -> None: + """Xfail the calling test as soon as one of the given endpoints does not answer.""" + for endpoint in endpoints: + detail = unavailable_reason(endpoint) + if detail is not None: + pytest.xfail(f"external service unavailable: {endpoint} ({detail})") + + +def unavailable_reason(endpoint: str) -> str | None: + """Return why the endpoint is currently unavailable, or None when it answers successfully.""" + cached = _probe_cache.get(endpoint) + if cached is not None and (cached[1] == "" or time.monotonic() - cached[0] < unhealthy_cache_ttl): + return cached[1] or None + try: + response = requests.get(endpoint, timeout=probe_timeout) + except requests.RequestException as error: + return _remember(endpoint, f"{type(error).__name__}: {error}") + if response.status_code >= http_server_error_status: + return _remember(endpoint, f"HTTP {response.status_code}: {response.text[:200]}") + # 4xx means the service answers and merely rejects our unauthenticated probe. + _probe_cache[endpoint] = (time.monotonic(), "") + return None + + +def _remember(endpoint: str, detail: str) -> str: + _probe_cache[endpoint] = (time.monotonic(), detail) + return detail + + +def is_service_or_environment_problem_call(call: pytest.CallInfo[Any]) -> bool: + """Return whether a test call failed because of the environment, not because of aoptk.""" + if call.excinfo is None: + return False + exception = call.excinfo.value + if isinstance(exception, (AssertionError, pytest.skip.Exception, pytest.xfail.Exception)): + return False + if is_server_problem(exception) or is_environment_problem(exception): + return True + # Long-running helpers often wrap the service failure in their own exception, so also + # look at the rendered traceback for the signatures of a misbehaving service. + return any(is_server_problem(line) or is_environment_problem(line) for line in _traceback_lines(call)) + + +def is_environment_problem(exception_or_message: BaseException | str) -> bool: + """Return whether credentials missing from this environment caused the failure.""" + message = (str(exception_or_message) if not isinstance(exception_or_message, str) else exception_or_message).lower() + return any( + not os.getenv(variable) and any(pattern in message for pattern in patterns) + for variable, patterns in environment_problem_credentials.items() + ) + + +def is_server_problem(exception_or_message: BaseException | str) -> bool: + """Return whether the exception (or any exception it chains) indicates a service problem.""" + if isinstance(exception_or_message, str): + return _message_indicates_server_problem(exception_or_message) + seen: set[int] = set() + current: BaseException | None = exception_or_message + while current is not None and id(current) not in seen: + seen.add(id(current)) + if _exception_indicates_server_problem(current) or _message_indicates_server_problem(str(current)): + return True + current = current.__cause__ or current.__context__ + return False + + +def _exception_indicates_server_problem(exception: BaseException) -> bool: + if f"{type(exception).__module__}.{type(exception).__name__}" in server_problem_exception_names: + return True + # Both the OpenAI SDK and requests expose the HTTP status of the failing response. + status_code = getattr(exception, "status_code", None) + if not isinstance(status_code, int): + status_code = getattr(getattr(exception, "response", None), "status_code", None) + return isinstance(status_code, int) and status_code in server_problem_status_codes + + +def _message_indicates_server_problem(message: str) -> bool: + lowered = message.lower() + return any(pattern in lowered for pattern in server_problem_message_patterns) or bool( + server_problem_status_regex.search(lowered), + ) + + +def _traceback_lines(call: pytest.CallInfo[Any]) -> Iterator[str]: + if call.excinfo is None: + return iter(()) + try: + representation = call.excinfo.getrepr(style="long") + except Exception: # noqa: BLE001 - a broken traceback must never change the test outcome + return iter(()) + if representation is None: + return iter(()) + return iter(str(representation).splitlines()) diff --git a/tests/test_aop_wiki.py b/tests/test_aop_wiki.py index f8f884dc..187aa71e 100644 --- a/tests/test_aop_wiki.py +++ b/tests/test_aop_wiki.py @@ -1,7 +1,15 @@ from __future__ import annotations +import pytest from aoptk.literature.databases.aop_wiki import AOPWiki from aoptk.literature.get_abstract import GetAbstract from aoptk.literature.id import ID +from tests.service_availability import require_aop_wiki_service + + +@pytest.fixture(autouse=True) +def require_aop_wiki() -> None: + """Require the AOP-Wiki endpoint before running any test of this module.""" + require_aop_wiki_service() def test_can_create(): diff --git a/tests/test_europepmc.py b/tests/test_europepmc.py index 2f1fb3b9..3be72684 100644 --- a/tests/test_europepmc.py +++ b/tests/test_europepmc.py @@ -16,12 +16,19 @@ from aoptk.literature.id import PMID from aoptk.literature.publication import Abstract from aoptk.literature.query import Query +from tests.service_availability import require_europepmc_service # ruff: noqa: PLR2004 metadata_test = json.loads(Path("tests/test_data/europepmc_metadata.json").read_text(encoding="utf-8")) +@pytest.fixture(autouse=True) +def require_europepmc() -> None: + """Require the Europe PMC endpoints before running any test of this module.""" + require_europepmc_service() + + def test_can_create(tmp_path_factory: pytest.TempPathFactory): """Test that EuropePMCPDF can be instantiated.""" actual = EuropePMC( diff --git a/tests/test_pmc.py b/tests/test_pmc.py index fd4dfd6d..efc465d0 100644 --- a/tests/test_pmc.py +++ b/tests/test_pmc.py @@ -15,12 +15,19 @@ from aoptk.literature.id import PMCID from aoptk.literature.id import PMID from aoptk.literature.query import Query +from tests.service_availability import require_pmc_service # ruff: noqa: PLR2004 metadata_test = json.loads(Path("tests/test_data/ncbi_metadata.json").read_text(encoding="utf-8")) +@pytest.fixture(autouse=True) +def require_pmc() -> None: + """Require the NCBI PMC endpoints before running any test of this module.""" + require_pmc_service() + + def test_can_create(tmp_path_factory: pytest.TempPathFactory): """Test that PMC can be instantiated.""" actual = PMC( diff --git a/tests/test_pubchem_api.py b/tests/test_pubchem_api.py index 5a305583..568fbc21 100644 --- a/tests/test_pubchem_api.py +++ b/tests/test_pubchem_api.py @@ -2,6 +2,13 @@ from aoptk.chemical import Chemical from aoptk.normalization.normalize_chemical import NormalizeChemical from aoptk.normalization.pubchem_api import PubChemAPI +from tests.service_availability import require_pubchem_service + + +@pytest.fixture(autouse=True) +def require_pubchem() -> None: + """Require the PubChem endpoints before running any test of this module.""" + require_pubchem_service() def test_can_create(): diff --git a/tests/test_pubmed.py b/tests/test_pubmed.py index f66f0f45..60b68ab4 100644 --- a/tests/test_pubmed.py +++ b/tests/test_pubmed.py @@ -13,12 +13,19 @@ from aoptk.literature.id import PMCID from aoptk.literature.id import PMID from aoptk.literature.query import Query +from tests.service_availability import require_pubmed_service # ruff: noqa: PLR2004 metadata_test = json.loads(Path("tests/test_data/ncbi_metadata.json").read_text(encoding="utf-8")) +@pytest.fixture(autouse=True) +def require_pubmed() -> None: + """Require the NCBI PubMed endpoints before running any test of this module.""" + require_pubmed_service() + + @pytest.mark.xfail(raises=HTTPError) def test_can_create(tmp_path_factory: pytest.TempPathFactory): """Can create PubMed instance.""" diff --git a/tests/test_pymupdf_parser.py b/tests/test_pymupdf_parser.py index 4c67fe08..16b40007 100644 --- a/tests/test_pymupdf_parser.py +++ b/tests/test_pymupdf_parser.py @@ -6,6 +6,7 @@ from aoptk.literature.pdf import PDF from aoptk.literature.pymupdf_parser import PymupdfParser from aoptk.text_generation_api import TextGenerationAPI +from tests.service_availability import require_llm_service # ruff: noqa: PLR2004 # ruff: noqa: SLF001 @@ -140,11 +141,12 @@ def test_is_corrupted(text: str, expected: bool, tmp_path_factory: pytest.TempPa @pytest.mark.openai def test_extract_full_text_from_corrupted_pdf(tmp_path_factory: pytest.TempPathFactory): """Test extracting full text from a corrupted PDF.""" + require_llm_service() actual = ( PymupdfParser( pdfs=[PDF(Path("tests/test_data/test_pdfs/PMC12416454_corrupted.pdf"))], figure_storage=tmp_path_factory.mktemp("pmc_storage_figures"), - text_generation=TextGenerationAPI(model="redhatai-scout"), + text_generation=TextGenerationAPI(model="qwen3.5-122b"), ) .get_publications()[0] .full_text diff --git a/tests/test_service_availability.py b/tests/test_service_availability.py new file mode 100644 index 00000000..0531d111 --- /dev/null +++ b/tests/test_service_availability.py @@ -0,0 +1,165 @@ +"""Tests for the service availability helpers themselves.""" + +from __future__ import annotations +import subprocess +import sys +import time +from typing import TYPE_CHECKING +import pytest +from tests.service_availability import _probe_cache +from tests.service_availability import is_server_problem +from tests.service_availability import unavailable_reason +from tests.service_availability import unhealthy_cache_ttl +from tests.service_availability import xfail_if_unavailable + +if TYPE_CHECKING: + from pathlib import Path + + +# Messages observed in failing CI runs of this repository. +ncbi_search_backend_message = ( + "Search Backend failed: An error occurred while processing request. Status: 500. " + "Source: /api/search/?r= Details: Search is temporarily unavailable. " + "Please try again later. Details: Timeout waiting for worker." +) +blocked_model_message = "Error code: 403 - {'error': {'message': 'litellm.PermissionDeniedError: Model is blocked'}}" +invalid_model_message = ( + "Error code: 400 - {'error': {'message': '/chat/completions: Invalid model name passed in model=redhatai-scout.'}}" +) + + +@pytest.fixture(autouse=True) +def clear_probe_cache(): + """Make sure probes are not shared between tests.""" + _probe_cache.clear() + yield + _probe_cache.clear() + + +class _FakeStatusError(Exception): + """Stand-in for exceptions carrying an HTTP status, like the OpenAI SDK errors.""" + + def __init__(self, message: str, status_code: int | None = None) -> None: + super().__init__(message) + self.status_code = status_code + + +@pytest.mark.parametrize( + ("exception", "expected"), + [ + (RuntimeError(ncbi_search_backend_message), True), + (ConnectionResetError("Connection reset by peer"), True), + (_FakeStatusError(blocked_model_message, status_code=403), True), + (_FakeStatusError(invalid_model_message, status_code=400), True), + (_FakeStatusError("HTTP 503 on lookup", status_code=503), True), + (_FakeStatusError("HTTP 404 on lookup", status_code=404), False), + (AssertionError("expected 10101 to be 9999"), False), + (ValueError("some logic error"), False), + ], +) +def test_is_server_problem(exception: BaseException, expected: bool): + """Server-side problems are distinguished from genuine test failures.""" + assert is_server_problem(exception) is expected + + +def test_is_server_problem_checks_chained_exceptions(): + """A service problem wrapped into another exception is still recognized.""" + wrapped = TimeoutError("batch failed") + wrapped.__cause__ = RuntimeError(ncbi_search_backend_message) + assert is_server_problem(wrapped) is True + + +def test_unavailable_reason_for_unreachable_endpoint(): + """An endpoint that refuses connections is reported as unavailable.""" + detail = unavailable_reason("http://127.0.0.1:9/nothing-here") + assert detail is not None + assert "ConnectionError" in detail + + +def test_unavailable_reason_is_cached(): + """A recent verdict for a failing endpoint is reused instead of re-probing.""" + endpoint = "http://127.0.0.1:9/nothing-here" + assert unavailable_reason(endpoint) is not None + probe_count = len(_probe_cache) + _probe_cache[endpoint] = (time.monotonic(), "cached failure") + assert unavailable_reason(endpoint) == "cached failure" + assert len(_probe_cache) == probe_count + + +def test_stale_failure_is_probed_again(): + """An endpoint that failed longer ago than the TTL gets a second chance.""" + endpoint = "http://127.0.0.1:9/nothing-here" + _probe_cache[endpoint] = (time.monotonic() - unhealthy_cache_ttl - 1, "cached failure") + detail = unavailable_reason(endpoint) + assert detail is not None + assert detail != "cached failure" + + +def test_xfail_if_unavailable_xfails(): + """An unreachable endpoint turns the calling test into an expected failure.""" + + def calling_test() -> None: + xfail_if_unavailable("http://127.0.0.1:9/nothing-here") + + with pytest.raises(pytest.xfail.Exception) as excinfo: + calling_test() + assert "external service unavailable" in str(excinfo.value) + + +def test_xfail_if_unavailable_passes_for_available_endpoint(): + """A reachable endpoint leaves the test running.""" + xfail_if_unavailable("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/einfo.fcgi") + + +def test_failures_of_unavailable_services_are_reported_as_xfailed(tmp_path: Path): + """End-to-end: a test failing due to a service problem is reported as xfailed, not failed.""" + test_file = tmp_path / "test_simulated_outage.py" + test_file.write_text( + f""" +import http.client +from urllib.error import HTTPError +import pytest +from tests.service_availability import xfail_if_unavailable + + +def test_endpoint_down(): + xfail_if_unavailable("http://127.0.0.1:9/nothing-here") + + +def test_service_reports_internal_problem(): + raise RuntimeError( + "Search Backend failed: An error occurred while processing request. Status: 500. " + "Details: Search is temporarily unavailable. Please try again later." + ) + + +def test_disconnected_service(): + raise http.client.RemoteDisconnected("Remote end closed connection without response") + + +@pytest.mark.xfail(raises=HTTPError) +def test_service_problem_below_existing_xfail_mark(): + # Mirrors tests/test_pmc.py::test_get_id_large_query: NCBI reports a 500 through + # Bio.Entrez as RuntimeError, which the existing xfail(raises=HTTPError) does not cover. + raise RuntimeError("{ncbi_search_backend_message}") + + +def test_genuine_failure_still_fails(): + assert 1 == 2 + +@pytest.mark.xfail(raises=HTTPError) +def test_genuine_wrong_exception_below_xfail_mark_still_fails(): + # An unexpected exception below an existing xfail(raises=...) mark must stay a failure. + assert 1 == 2 +""", + encoding="utf-8", + ) + completed = subprocess.run( # noqa: S603 + [sys.executable, "-m", "pytest", "-p", "tests.service_availability", "-q", str(test_file)], + capture_output=True, + text=True, + check=False, + ) + summary = next(line for line in completed.stdout.splitlines() if "passed" in line or "failed" in line) + assert "4 xfailed" in summary + assert "2 failed" in summary diff --git a/tests/test_text_generation.py b/tests/test_text_generation.py index 740bbcce..362b08b7 100644 --- a/tests/test_text_generation.py +++ b/tests/test_text_generation.py @@ -18,6 +18,13 @@ from aoptk.relationships.relationship_type import Inhibition from aoptk.relationships.relationship_type import RelationshipType from aoptk.text_generation_api import TextGenerationAPI +from tests.service_availability import require_llm_service + + +@pytest.fixture(autouse=True) +def require_llm() -> None: + """Require the text generation endpoint before running any test of this module.""" + require_llm_service() def sort_key(r: Relationship) -> tuple[str, str, str]: @@ -377,6 +384,9 @@ def test_retry_strategy_works(): def test_invalid_response(text: str, invalid_response_patterns: list[str], expected: bool): """Test that the find_chemicals method handles invalid chemical responses gracefully.""" actual = TextGenerationAPI().is_invalid_response(text, invalid_response_patterns) + assert actual == expected + + @pytest.mark.parametrize( ("text", "categories", "expected"), [ diff --git a/uv.lock b/uv.lock index 230b8c61..97db4598 100644 --- a/uv.lock +++ b/uv.lock @@ -3,16 +3,16 @@ revision = 3 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'emscripten'", "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", - "python_full_version < '3.12' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] @@ -49,7 +49,7 @@ wheels = [ [[package]] name = "aoptk" -version = "0.4.3" +version = "0.5.0" source = { editable = "." } dependencies = [ { name = "biopython" }, @@ -62,6 +62,7 @@ dependencies = [ { name = "python-dotenv" }, { name = "requests" }, { name = "setuptools" }, + { name = "sparqlwrapper" }, { name = "tenacity" }, ] @@ -129,6 +130,7 @@ requires-dist = [ { name = "requests" }, { name = "ruff", marker = "extra == 'dev'" }, { name = "setuptools" }, + { name = "sparqlwrapper" }, { name = "sphinx", marker = "extra == 'dev'" }, { name = "sphinx", marker = "extra == 'docs'" }, { name = "sphinx-autoapi", marker = "extra == 'dev'" }, @@ -759,7 +761,7 @@ name = "cryptography" version = "47.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ef/b2/7ffa7fe8207a8c42147ffe70c3e360b228160c1d85dc3faff16aaa3244c0/cryptography-47.0.0.tar.gz", hash = "sha256:9f8e55fe4e63613a5e1cc5819030f27b97742d720203a087802ce4ce9ceb52bb", size = 830863, upload-time = "2026-04-24T19:54:57.056Z" } wheels = [ @@ -971,7 +973,7 @@ name = "importlib-metadata" version = "9.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp", marker = "python_full_version < '3.12'" }, + { name = "zipp" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } wheels = [ @@ -2129,7 +2131,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "ptyprocess" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ @@ -2487,6 +2489,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/53/a4/b9e91aac82293f9c954654c85581ee8212b5b05efadc534b581141241e6f/pymupdf-1.27.2.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:77691604c5d1d0233827139bbcdea61fd57879c84712b8e49b1f45520f7ab9c2", size = 25000393, upload-time = "2026-04-24T14:11:01.669Z" }, ] +[[package]] +name = "pyparsing" +version = "3.3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/11/b213bebff182584360cb8d17c72c1677fec5c5c228de439e63bcf8ab1c8f/pyparsing-3.3.3.tar.gz", hash = "sha256:928ae7e20211f3b6f3915a72f06a0cfd29ab9d24279dd6346b6b1a7146397d36", size = 1050487, upload-time = "2026-09-20T20:59:05.609Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/bb/d215ee7c73b61497b28a5503f9f53523f294fcc936762b7caf90e0c1c2b5/pyparsing-3.3.3-py3-none-any.whl", hash = "sha256:ece8c00a69cf01b45d0b1dedabb469c90d8caf996d4fda40f147627a122849a4", size = 126420, upload-time = "2026-09-20T20:59:04.025Z" }, +] + [[package]] name = "pyproject-hooks" version = "1.2.0" @@ -2743,6 +2754,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl", hash = "sha256:a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59", size = 36753, upload-time = "2025-08-28T19:00:19.56Z" }, ] +[[package]] +name = "rdflib" +version = "7.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/18bb77b7af9526add0c727a3b2048959847dc5fb030913e2918bf384fec3/rdflib-7.6.0.tar.gz", hash = "sha256:6c831288d5e4a5a7ece85d0ccde9877d512a3d0f02d7c06455d00d6d0ea379df", size = 4943826, upload-time = "2026-02-13T07:15:55.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/c2/6604a71269e0c1bd75656d5a001432d16f2cc5b8c057140ec797155c295e/rdflib-7.6.0-py3-none-any.whl", hash = "sha256:30c0a3ebf4c0e09215f066be7246794b6492e054e782d7ac2a34c9f70a15e0dd", size = 615416, upload-time = "2026-02-13T07:15:46.487Z" }, +] + [[package]] name = "readme-renderer" version = "44.0" @@ -2901,8 +2924,8 @@ name = "secretstorage" version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "jeepney", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "cryptography" }, + { name = "jeepney" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ @@ -2963,6 +2986,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, ] +[[package]] +name = "sparqlwrapper" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rdflib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/cc/453752fffa759ef41a3ceadb3f167e13dae1a74c1db057d9f6a7affa9240/SPARQLWrapper-2.0.0.tar.gz", hash = "sha256:3fed3ebcc77617a4a74d2644b86fd88e0f32e7f7003ac7b2b334c026201731f1", size = 98429, upload-time = "2022-03-13T23:14:00.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/89/176e3db96e31e795d7dfd91dd67749d3d1f0316bb30c6931a6140e1a0477/SPARQLWrapper-2.0.0-py3-none-any.whl", hash = "sha256:c99a7204fff676ee28e6acef327dc1ff8451c6f7217dcd8d49e8872f324a8a20", size = 28620, upload-time = "2022-03-13T23:13:58.969Z" }, +] + [[package]] name = "sphinx" version = "9.0.4" @@ -2973,23 +3008,23 @@ resolution-markers = [ "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version < '3.12'" }, - { name = "babel", marker = "python_full_version < '3.12'" }, - { name = "colorama", marker = "python_full_version < '3.12' and sys_platform == 'win32'" }, - { name = "docutils", marker = "python_full_version < '3.12'" }, - { name = "imagesize", marker = "python_full_version < '3.12'" }, - { name = "jinja2", marker = "python_full_version < '3.12'" }, - { name = "packaging", marker = "python_full_version < '3.12'" }, - { name = "pygments", marker = "python_full_version < '3.12'" }, - { name = "requests", marker = "python_full_version < '3.12'" }, - { name = "roman-numerals", marker = "python_full_version < '3.12'" }, - { name = "snowballstemmer", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.12'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } wheels = [ @@ -3002,33 +3037,33 @@ version = "9.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'emscripten'", "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version >= '3.12'" }, - { name = "babel", marker = "python_full_version >= '3.12'" }, - { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, - { name = "docutils", marker = "python_full_version >= '3.12'" }, - { name = "imagesize", marker = "python_full_version >= '3.12'" }, - { name = "jinja2", marker = "python_full_version >= '3.12'" }, - { name = "packaging", marker = "python_full_version >= '3.12'" }, - { name = "pygments", marker = "python_full_version >= '3.12'" }, - { name = "requests", marker = "python_full_version >= '3.12'" }, - { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, - { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } wheels = [