From 5ab626517a81a14522309a870d17cbad19a6d98a Mon Sep 17 00:00:00 2001 From: Ben Webb Date: Fri, 5 Apr 2024 12:54:27 -0700 Subject: [PATCH] Update to IMP 2.20.2 --- rnapolii/modeling/deposition-colab.ipynb | 20 ++++++++++---------- rnapolii/modeling/deposition.ipynb | 20 ++++++++++---------- support/tutorial_tools | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/rnapolii/modeling/deposition-colab.ipynb b/rnapolii/modeling/deposition-colab.ipynb index 5576a08..4fa76ec 100644 --- a/rnapolii/modeling/deposition-colab.ipynb +++ b/rnapolii/modeling/deposition-colab.ipynb @@ -68,8 +68,8 @@ "source": [ "# Study versus single model\n", "\n", - "A frequently asked question is whether mmCIF files can be generated directly from an [IMP::Model](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1Model.html) or an\n", - "[RMF file](https://integrativemodeling.org/rmf/). This generally isn't possible because RMF and [IMP::Model](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1Model.html) are designed to store one or more output models, where each model is a set of coordinates for a single conformation of the system being studied. A deposition, on the other hand, aims to cover a complete modeling study, and should capture the entire ensemble of output models, all of the input data needed to reproduce the modeling, and quality metrics such as the precision of the ensemble and the degree to which it fits the output data. A deposition is also designed to\n", + "A frequently asked question is whether mmCIF files can be generated directly from an [IMP::Model](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1Model.html) or an\n", + "[RMF file](https://integrativemodeling.org/rmf/). This generally isn't possible because RMF and [IMP::Model](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1Model.html) are designed to store one or more output models, where each model is a set of coordinates for a single conformation of the system being studied. A deposition, on the other hand, aims to cover a complete modeling study, and should capture the entire ensemble of output models, all of the input data needed to reproduce the modeling, and quality metrics such as the precision of the ensemble and the degree to which it fits the output data. A deposition is also designed to\n", "be visualized, and so may contain additional data not used in the modeling itself, such as preset colors or views to match figures in the publication or highlight regions of interest, and more human-descriptive names for parts\n", "of the system. Thus, deposition is largely a data-gathering exercise, and benefits from a modeling study being tidy and well organized (for example, by storing it in a [GitHub](https://github.com) repository) so that data is easy to find and track to its source." ] @@ -88,7 +88,7 @@ "There are two main approaches to generating an mmCIF file for deposition:\n", "\n", " 1. Use the [python-ihm](https://github.com/ihmwg/python-ihm) library directly, by writing a Python script that reads in output models and input data, adds annotations, and writes out an mmCIF file.\n", - " 2. Use the [ProtocolOutput](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html) class to automatically capture an entire [IMP::pmi](https://integrativemodeling.org/2.20.1/doc/ref/namespaceIMP_1_1pmi.html) modeling protocol.\n", + " 2. Use the [ProtocolOutput](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html) class to automatically capture an entire [IMP::pmi](https://integrativemodeling.org/2.20.2/doc/ref/namespaceIMP_1_1pmi.html) modeling protocol.\n", "\n", "The first approach offers the greatest flexibility for custom protocols or for modeling outside of IMP itself, but does require everything to be done manually. For a good example of this approach, see the [modeling of Nup133](https://github.com/integrativemodeling/nup133/tree/main/outputs_foxs_ensemble_new/pdb-dev). (One example of the tradeoff between flexibility and manual coding: the cross-links used in the study are stored in a [plain text file](https://github.com/integrativemodeling/nup133/blob/main/Crosslinks/DSS_EDC_crosslinks.txt) so a [custom Python class](https://github.com/integrativemodeling/nup133/blob/main/outputs_foxs_ensemble_new/pdb-dev/xlink.py) had to be written to parse them.)\n", "\n", @@ -101,7 +101,7 @@ "source": [ "# Basic usage of ProtocolOutput\n", "\n", - "[ProtocolOutput](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html) is designed to be attached to a top-level PMI object (usually [IMP::pmi::topology::System](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1topology_1_1System.html)). Then, as the script is run, it will capture all of the information about the modeling\n", + "[ProtocolOutput](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html) is designed to be attached to a top-level PMI object (usually [IMP::pmi::topology::System](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1topology_1_1System.html)). Then, as the script is run, it will capture all of the information about the modeling\n", "study, in an [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System) object. Additional information not in the modeling script itself, such as the\n", "resulting publication, can be added using the [python-ihm API](https://python-ihm.readthedocs.io/en/latest/usage.html)." ] @@ -220,7 +220,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, as soon as the top-level [IMP::pmi::topology::System](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1topology_1_1System.html) object is created, we attach a ProtocolOutput object (BuildSystem contains a `system` member):" + "Next, as soon as the top-level [IMP::pmi::topology::System](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1topology_1_1System.html) object is created, we attach a ProtocolOutput object (BuildSystem contains a `system` member):" ] }, { @@ -408,7 +408,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As it is generally undesirable to rerun the entire modeling just to generate an mmCIF file, we can save a lot of time when we do the replica exchange by turning on [ReplicaExchange](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1macros_1_1ReplicaExchange.html)'s `test_mode`, which skips the actual Monte Carlo simulation (so we use the previously-generated trajectory):" + "As it is generally undesirable to rerun the entire modeling just to generate an mmCIF file, we can save a lot of time when we do the replica exchange by turning on [ReplicaExchange](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1macros_1_1ReplicaExchange.html)'s `test_mode`, which skips the actual Monte Carlo simulation (so we use the previously-generated trajectory):" ] }, { @@ -444,7 +444,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Once we're done with our PMI protocol, we call the [ProtocolOutput.finalize](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html#a7b8395a33cbd3211cdf28e943c35dfa5) method to collect all of the information about the integrative modeling protocol in [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System):" + "Once we're done with our PMI protocol, we call the [ProtocolOutput.finalize](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html#a7b8395a33cbd3211cdf28e943c35dfa5) method to collect all of the information about the integrative modeling protocol in [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System):" ] }, { @@ -460,7 +460,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note that the [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System) object, stored as the `system` attribute of [ProtocolOutput](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html), contains a full description of the system:" + "Note that the [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System) object, stored as the `system` attribute of [ProtocolOutput](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html), contains a full description of the system:" ] }, { @@ -671,7 +671,7 @@ "source": [ "## Cross-linker type\n", "\n", - "For cross-linking experiments, the mmCIF file contains a description of the cross-linking reagent used. This information is not in the CSV file. It can be provided in the Python script with the `linker` argument to passed to the PMI [CrossLinkingMassSpectrometryRestraint](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1restraints_1_1crosslinking_1_1CrossLinkingMassSpectrometryRestraint.html), but if this argument was missing (or incorrect) we can correct it here. By checking the publications for the cross-link datasets from [Al Burlingame's lab](https://www.mcponline.org/content/13/2/420.long) and\n", + "For cross-linking experiments, the mmCIF file contains a description of the cross-linking reagent used. This information is not in the CSV file. It can be provided in the Python script with the `linker` argument to passed to the PMI [CrossLinkingMassSpectrometryRestraint](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1restraints_1_1crosslinking_1_1CrossLinkingMassSpectrometryRestraint.html), but if this argument was missing (or incorrect) we can correct it here. By checking the publications for the cross-link datasets from [Al Burlingame's lab](https://www.mcponline.org/content/13/2/420.long) and\n", "[Juri Rappsilber's lab](http://emboj.embopress.org/content/29/4/717)), we can determine that the [DSS](https://en.wikipedia.org/wiki/Disuccinimidyl_suberate) and [BS3](https://en.wikipedia.org/wiki/Bissulfosuccinimidyl_suberate) cross-linkers were used, respectively. These are common enough cross-linkers that python-ihm already includes definitions for them in the [ihm.cross_linkers](https://python-ihm.readthedocs.io/en/latest/cross_linkers.html#module-ihm.cross_linkers) module (for less common linkers we can create an [ihm.ChemDescriptor](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.ChemDescriptor) object from scratch to describe its chemistry). Then we just set the linker type for each [cross-linking restraint](https://python-ihm.readthedocs.io/en/latest/restraint.html#ihm.restraint.CrossLinkRestraint) in the [list of all restraints](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System.restraints):" ] }, @@ -799,7 +799,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To add a model to the file, we create an [ihm.model.Model](https://python-ihm.readthedocs.io/en/latest/model.html#ihm.model.Model) object, add atoms or coarse-grained objects to it, and then add that to the previously-created [ModelGroup](https://python-ihm.readthedocs.io/en/latest/model.html#ihm.model.ModelGroup). ProtocolOutput provides a convenience function `add_model` which does this, converting the current IMP structure to python-ihm (we just need to load an IMP structure first, e.g. from an RMF file using [IMP.rmf.load_frame](https://integrativemodeling.org/2.20.1/doc/ref/namespaceIMP_1_1rmf.html#abc15209a0aef0e859c99ce00659ebdfb))." + "To add a model to the file, we create an [ihm.model.Model](https://python-ihm.readthedocs.io/en/latest/model.html#ihm.model.Model) object, add atoms or coarse-grained objects to it, and then add that to the previously-created [ModelGroup](https://python-ihm.readthedocs.io/en/latest/model.html#ihm.model.ModelGroup). ProtocolOutput provides a convenience function `add_model` which does this, converting the current IMP structure to python-ihm (we just need to load an IMP structure first, e.g. from an RMF file using [IMP.rmf.load_frame](https://integrativemodeling.org/2.20.2/doc/ref/namespaceIMP_1_1rmf.html#abc15209a0aef0e859c99ce00659ebdfb))." ] }, { diff --git a/rnapolii/modeling/deposition.ipynb b/rnapolii/modeling/deposition.ipynb index 9acfd73..f182068 100644 --- a/rnapolii/modeling/deposition.ipynb +++ b/rnapolii/modeling/deposition.ipynb @@ -68,8 +68,8 @@ "source": [ "# Study versus single model\n", "\n", - "A frequently asked question is whether mmCIF files can be generated directly from an [IMP::Model](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1Model.html) or an\n", - "[RMF file](https://integrativemodeling.org/rmf/). This generally isn't possible because RMF and [IMP::Model](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1Model.html) are designed to store one or more output models, where each model is a set of coordinates for a single conformation of the system being studied. A deposition, on the other hand, aims to cover a complete modeling study, and should capture the entire ensemble of output models, all of the input data needed to reproduce the modeling, and quality metrics such as the precision of the ensemble and the degree to which it fits the output data. A deposition is also designed to\n", + "A frequently asked question is whether mmCIF files can be generated directly from an [IMP::Model](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1Model.html) or an\n", + "[RMF file](https://integrativemodeling.org/rmf/). This generally isn't possible because RMF and [IMP::Model](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1Model.html) are designed to store one or more output models, where each model is a set of coordinates for a single conformation of the system being studied. A deposition, on the other hand, aims to cover a complete modeling study, and should capture the entire ensemble of output models, all of the input data needed to reproduce the modeling, and quality metrics such as the precision of the ensemble and the degree to which it fits the output data. A deposition is also designed to\n", "be visualized, and so may contain additional data not used in the modeling itself, such as preset colors or views to match figures in the publication or highlight regions of interest, and more human-descriptive names for parts\n", "of the system. Thus, deposition is largely a data-gathering exercise, and benefits from a modeling study being tidy and well organized (for example, by storing it in a [GitHub](https://github.com) repository) so that data is easy to find and track to its source." ] @@ -88,7 +88,7 @@ "There are two main approaches to generating an mmCIF file for deposition:\n", "\n", " 1. Use the [python-ihm](https://github.com/ihmwg/python-ihm) library directly, by writing a Python script that reads in output models and input data, adds annotations, and writes out an mmCIF file.\n", - " 2. Use the [ProtocolOutput](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html) class to automatically capture an entire [IMP::pmi](https://integrativemodeling.org/2.20.1/doc/ref/namespaceIMP_1_1pmi.html) modeling protocol.\n", + " 2. Use the [ProtocolOutput](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html) class to automatically capture an entire [IMP::pmi](https://integrativemodeling.org/2.20.2/doc/ref/namespaceIMP_1_1pmi.html) modeling protocol.\n", "\n", "The first approach offers the greatest flexibility for custom protocols or for modeling outside of IMP itself, but does require everything to be done manually. For a good example of this approach, see the [modeling of Nup133](https://github.com/integrativemodeling/nup133/tree/main/outputs_foxs_ensemble_new/pdb-dev). (One example of the tradeoff between flexibility and manual coding: the cross-links used in the study are stored in a [plain text file](https://github.com/integrativemodeling/nup133/blob/main/Crosslinks/DSS_EDC_crosslinks.txt) so a [custom Python class](https://github.com/integrativemodeling/nup133/blob/main/outputs_foxs_ensemble_new/pdb-dev/xlink.py) had to be written to parse them.)\n", "\n", @@ -101,7 +101,7 @@ "source": [ "# Basic usage of ProtocolOutput\n", "\n", - "[ProtocolOutput](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html) is designed to be attached to a top-level PMI object (usually [IMP::pmi::topology::System](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1topology_1_1System.html)). Then, as the script is run, it will capture all of the information about the modeling\n", + "[ProtocolOutput](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html) is designed to be attached to a top-level PMI object (usually [IMP::pmi::topology::System](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1topology_1_1System.html)). Then, as the script is run, it will capture all of the information about the modeling\n", "study, in an [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System) object. Additional information not in the modeling script itself, such as the\n", "resulting publication, can be added using the [python-ihm API](https://python-ihm.readthedocs.io/en/latest/usage.html)." ] @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, as soon as the top-level [IMP::pmi::topology::System](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1topology_1_1System.html) object is created, we attach a ProtocolOutput object (BuildSystem contains a `system` member):" + "Next, as soon as the top-level [IMP::pmi::topology::System](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1topology_1_1System.html) object is created, we attach a ProtocolOutput object (BuildSystem contains a `system` member):" ] }, { @@ -380,7 +380,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As it is generally undesirable to rerun the entire modeling just to generate an mmCIF file, we can save a lot of time when we do the replica exchange by turning on [ReplicaExchange](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1macros_1_1ReplicaExchange.html)'s `test_mode`, which skips the actual Monte Carlo simulation (so we use the previously-generated trajectory):" + "As it is generally undesirable to rerun the entire modeling just to generate an mmCIF file, we can save a lot of time when we do the replica exchange by turning on [ReplicaExchange](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1macros_1_1ReplicaExchange.html)'s `test_mode`, which skips the actual Monte Carlo simulation (so we use the previously-generated trajectory):" ] }, { @@ -416,7 +416,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Once we're done with our PMI protocol, we call the [ProtocolOutput.finalize](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html#a7b8395a33cbd3211cdf28e943c35dfa5) method to collect all of the information about the integrative modeling protocol in [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System):" + "Once we're done with our PMI protocol, we call the [ProtocolOutput.finalize](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html#a7b8395a33cbd3211cdf28e943c35dfa5) method to collect all of the information about the integrative modeling protocol in [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System):" ] }, { @@ -432,7 +432,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note that the [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System) object, stored as the `system` attribute of [ProtocolOutput](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html), contains a full description of the system:" + "Note that the [ihm.System](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System) object, stored as the `system` attribute of [ProtocolOutput](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1mmcif_1_1ProtocolOutput.html), contains a full description of the system:" ] }, { @@ -643,7 +643,7 @@ "source": [ "## Cross-linker type\n", "\n", - "For cross-linking experiments, the mmCIF file contains a description of the cross-linking reagent used. This information is not in the CSV file. It can be provided in the Python script with the `linker` argument to passed to the PMI [CrossLinkingMassSpectrometryRestraint](https://integrativemodeling.org/2.20.1/doc/ref/classIMP_1_1pmi_1_1restraints_1_1crosslinking_1_1CrossLinkingMassSpectrometryRestraint.html), but if this argument was missing (or incorrect) we can correct it here. By checking the publications for the cross-link datasets from [Al Burlingame's lab](https://www.mcponline.org/content/13/2/420.long) and\n", + "For cross-linking experiments, the mmCIF file contains a description of the cross-linking reagent used. This information is not in the CSV file. It can be provided in the Python script with the `linker` argument to passed to the PMI [CrossLinkingMassSpectrometryRestraint](https://integrativemodeling.org/2.20.2/doc/ref/classIMP_1_1pmi_1_1restraints_1_1crosslinking_1_1CrossLinkingMassSpectrometryRestraint.html), but if this argument was missing (or incorrect) we can correct it here. By checking the publications for the cross-link datasets from [Al Burlingame's lab](https://www.mcponline.org/content/13/2/420.long) and\n", "[Juri Rappsilber's lab](http://emboj.embopress.org/content/29/4/717)), we can determine that the [DSS](https://en.wikipedia.org/wiki/Disuccinimidyl_suberate) and [BS3](https://en.wikipedia.org/wiki/Bissulfosuccinimidyl_suberate) cross-linkers were used, respectively. These are common enough cross-linkers that python-ihm already includes definitions for them in the [ihm.cross_linkers](https://python-ihm.readthedocs.io/en/latest/cross_linkers.html#module-ihm.cross_linkers) module (for less common linkers we can create an [ihm.ChemDescriptor](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.ChemDescriptor) object from scratch to describe its chemistry). Then we just set the linker type for each [cross-linking restraint](https://python-ihm.readthedocs.io/en/latest/restraint.html#ihm.restraint.CrossLinkRestraint) in the [list of all restraints](https://python-ihm.readthedocs.io/en/latest/main.html#ihm.System.restraints):" ] }, @@ -771,7 +771,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To add a model to the file, we create an [ihm.model.Model](https://python-ihm.readthedocs.io/en/latest/model.html#ihm.model.Model) object, add atoms or coarse-grained objects to it, and then add that to the previously-created [ModelGroup](https://python-ihm.readthedocs.io/en/latest/model.html#ihm.model.ModelGroup). ProtocolOutput provides a convenience function `add_model` which does this, converting the current IMP structure to python-ihm (we just need to load an IMP structure first, e.g. from an RMF file using [IMP.rmf.load_frame](https://integrativemodeling.org/2.20.1/doc/ref/namespaceIMP_1_1rmf.html#abc15209a0aef0e859c99ce00659ebdfb))." + "To add a model to the file, we create an [ihm.model.Model](https://python-ihm.readthedocs.io/en/latest/model.html#ihm.model.Model) object, add atoms or coarse-grained objects to it, and then add that to the previously-created [ModelGroup](https://python-ihm.readthedocs.io/en/latest/model.html#ihm.model.ModelGroup). ProtocolOutput provides a convenience function `add_model` which does this, converting the current IMP structure to python-ihm (we just need to load an IMP structure first, e.g. from an RMF file using [IMP.rmf.load_frame](https://integrativemodeling.org/2.20.2/doc/ref/namespaceIMP_1_1rmf.html#abc15209a0aef0e859c99ce00659ebdfb))." ] }, { diff --git a/support/tutorial_tools b/support/tutorial_tools index d29453f..e68e82a 160000 --- a/support/tutorial_tools +++ b/support/tutorial_tools @@ -1 +1 @@ -Subproject commit d29453f35e1417caf187d4131ab16a19325066de +Subproject commit e68e82a82186b936d478138e572f232963735ca4