From 85155d4596b3e8027d304b31dc6160b82e196291 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Thu, 28 Sep 2023 22:33:12 +0100
Subject: [PATCH 001/117] draft data ingest tutorial
---
topics/single-cell/tutorials/scrna-data-ingest/tutorial.md | 1 +
1 file changed, 1 insertion(+)
create mode 100644 topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
new file mode 100644
index 00000000000000..8b137891791fe9
--- /dev/null
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -0,0 +1 @@
+
From 23e2bc79dcbc406b6ce398f1b085a5d3c1120129 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Thu, 28 Sep 2023 23:25:00 +0100
Subject: [PATCH 002/117] layout
---
.../tutorials/scrna-data-ingest/tutorial.md | 39 +++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 8b137891791fe9..808b09ee0c4283 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -1 +1,40 @@
+---
+layout: tutorial_hands_on
+subtopic: datamanipulation
+priority: 3
+title: Single cell data ingestion and formats conversion
+questions:
+- What are the most popular single cell datatypes?
+- What if the format of my files is different than that used in the tutorial I want to follow?
+- Where should I start the analysis depending on the format of my data?
+- How to ingest data into Galaxy?
+- How to convert between the formats?
+objectives:
+- You will get to know single cell files formats.
+- You will import single cell data to Galaxy using different methods.
+- You will manipulate the metadata and matrix files.
+- You will perform conversions between the most common single cell formats.
+time_estimation: 1H
+key_points:
+- Single cell data from different sources may have unfamiliar formatting and thus may require different way of ingesting it into Galaxy.
+- There are many ways of importing single cell files into Galaxy and converting between single cell formats.
+contributions:
+ authorship:
+ - hexhowells
+ - wee-snufkin
+ - nomadscientist
+
+follow_up_training:
+ -
+ type: "internal"
+ topic_name: single-cell
+
+tags:
+ - single-cell
+ - data-management
+ - transcriptomics
+---
+
+# Introduction
+
From 9787ca92f28cbe22f09b21d9f3f75cc73ed7a448 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Fri, 29 Sep 2023 10:14:49 +0100
Subject: [PATCH 003/117] describe formats
---
.../tutorials/scrna-data-ingest/tutorial.md | 31 +++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 808b09ee0c4283..32154bbeb98fb3 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -37,4 +37,35 @@ tags:
# Introduction
+You finally decided to analyse some single cell data, you got your files either from the lab or publicly available sources, you opened the first tutorial available on Galaxy Training Network and... you hit the wall - the format of your files is not compatible with the one used in tutorial! Have you been there?
+This tutorial was created to help you overcome that problem. Once you get your data into Galaxy in the right format, that's already 50% of success. Additionally, by using format conversion, you will be able to use different packages presented in tutorials that may require different datatypes.
+
+
+>
+>
+> In this tutorial, we will cover:
+>
+> 1. TOC
+> {:toc}
+>
+{: .agenda}
+
+# Single cell datatypes
+
+To start with, here are the most common formats and datatypes that you might come across if you work with single cell data:
+- HDF5 - Hierarchical Data Format - can store datasets and groups. A dataset is a a multidimensional array of data elements, together with supporting metadata, and a group is a structure for organizing objects in an HDF5 file. It allows for storing both the count matrices and all metadata in a single file rather than having separate features, barcodes and matrix files. Cellranger, for example, defaults its output in that format.
+- AnnData objects - [anndata](link https://anndata.readthedocs.io/en/latest/) is a Python package for handling annotated data matrices. In Galaxy, you'll see those in **h5ad** format, which is based on the standard HDF5 (h5) format. There are lots of Python tools that work with this format, such as Scanpy, MUON, Cell Oracle, SquidPy, etc.
+- Loom - it is simply an HDF5 file that contains specific groups containing the main matrix as well as row and column attributes and can be read by any language supporting HDF5. [Loompy](https://linnarssonlab.org/loompy/) has been released as a Python API to interact with loom files, and [loomR](https://github.com/mojaveazure/loomR) is its implementation in R.
+- Tabular
+- Mtx
+- Seurat objects
+- Zarr
+- Single Cell Experiment
+
+# Data ingestion
+
+{% snippet faqs/galaxy/tutorial_mode.md %}
+
+
+# Format conversion
From 2098840e28b4646c82db7302a09bf55ff47c40a7 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Fri, 29 Sep 2023 11:57:23 +0100
Subject: [PATCH 004/117] Update tutorial.md
---
.../tutorials/scrna-data-ingest/tutorial.md | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 32154bbeb98fb3..505ff80ff9cc10 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -53,14 +53,15 @@ This tutorial was created to help you overcome that problem. Once you get your d
# Single cell datatypes
To start with, here are the most common formats and datatypes that you might come across if you work with single cell data:
-- HDF5 - Hierarchical Data Format - can store datasets and groups. A dataset is a a multidimensional array of data elements, together with supporting metadata, and a group is a structure for organizing objects in an HDF5 file. It allows for storing both the count matrices and all metadata in a single file rather than having separate features, barcodes and matrix files. Cellranger, for example, defaults its output in that format.
-- AnnData objects - [anndata](link https://anndata.readthedocs.io/en/latest/) is a Python package for handling annotated data matrices. In Galaxy, you'll see those in **h5ad** format, which is based on the standard HDF5 (h5) format. There are lots of Python tools that work with this format, such as Scanpy, MUON, Cell Oracle, SquidPy, etc.
+- HDF5 - Hierarchical Data Format - can store datasets and groups. A dataset is a a multidimensional array of data elements, together with supporting metadata, and a group is a structure for organizing objects in an HDF5 file. It allows for storing both the count matrices and all metadata in a single file rather than having separate features, barcodes and matrix files.
+- AnnData objects - [anndata](link https://anndata.readthedocs.io/en/latest/) is a Python package for handling annotated data matrices. In Galaxy, you'll see AnnData objects in **h5ad** format, which is based on the standard HDF5 (h5) format. There are lots of Python tools that work with this format, such as Scanpy, MUON, Cell Oracle, SquidPy, etc.
- Loom - it is simply an HDF5 file that contains specific groups containing the main matrix as well as row and column attributes and can be read by any language supporting HDF5. [Loompy](https://linnarssonlab.org/loompy/) has been released as a Python API to interact with loom files, and [loomR](https://github.com/mojaveazure/loomR) is its implementation in R.
-- Tabular
-- Mtx
-- Seurat objects
+- Tabular - simply using TSV, CSV or TXT formats to store expression matrix as well as cells and genes metadata.
+- MTX - it's just a sparse matrix format with genes on the rows and cells on the columns as output by Cell Ranger.
+- Seurat objects
- Zarr
- Single Cell Experiment
+- CDS
# Data ingestion
From 0ed136d807db514ea049e43e7cf7f45822dec863 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Mon, 2 Oct 2023 00:33:38 +0100
Subject: [PATCH 005/117] Update tutorial.md
---
topics/single-cell/tutorials/scrna-data-ingest/tutorial.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 505ff80ff9cc10..5ce0ff351a4df3 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -38,7 +38,7 @@ tags:
# Introduction
You finally decided to analyse some single cell data, you got your files either from the lab or publicly available sources, you opened the first tutorial available on Galaxy Training Network and... you hit the wall - the format of your files is not compatible with the one used in tutorial! Have you been there?
-This tutorial was created to help you overcome that problem. Once you get your data into Galaxy in the right format, that's already 50% of success. Additionally, by using format conversion, you will be able to use different packages presented in tutorials that may require different datatypes.
+This tutorial was created to help you overcome that problem and ensure data interoperability in single cell analysis. Once you get your data into Galaxy in the right format, that's already 50% of success. Additionally, by using format conversion, you will be able to use different packages presented in tutorials that may require different datatypes.
>
@@ -58,7 +58,7 @@ To start with, here are the most common formats and datatypes that you might com
- Loom - it is simply an HDF5 file that contains specific groups containing the main matrix as well as row and column attributes and can be read by any language supporting HDF5. [Loompy](https://linnarssonlab.org/loompy/) has been released as a Python API to interact with loom files, and [loomR](https://github.com/mojaveazure/loomR) is its implementation in R.
- Tabular - simply using TSV, CSV or TXT formats to store expression matrix as well as cells and genes metadata.
- MTX - it's just a sparse matrix format with genes on the rows and cells on the columns as output by Cell Ranger.
-- Seurat objects
+- Seurat objects - a representation of single-cell expression data for R, in Galaxy you'll see them in **rdata** format.
- Zarr
- Single Cell Experiment
- CDS
From 1e25d02f89916a784b22eef6f4ff38641433fd6b Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Tue, 3 Oct 2023 10:47:02 +0100
Subject: [PATCH 006/117] all formats
---
.../tutorials/scrna-data-ingest/tutorial.md | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 5ce0ff351a4df3..833ab93056e690 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -58,15 +58,24 @@ To start with, here are the most common formats and datatypes that you might com
- Loom - it is simply an HDF5 file that contains specific groups containing the main matrix as well as row and column attributes and can be read by any language supporting HDF5. [Loompy](https://linnarssonlab.org/loompy/) has been released as a Python API to interact with loom files, and [loomR](https://github.com/mojaveazure/loomR) is its implementation in R.
- Tabular - simply using TSV, CSV or TXT formats to store expression matrix as well as cells and genes metadata.
- MTX - it's just a sparse matrix format with genes on the rows and cells on the columns as output by Cell Ranger.
-- Seurat objects - a representation of single-cell expression data for R, in Galaxy you'll see them in **rdata** format.
-- Zarr
-- Single Cell Experiment
-- CDS
+- Zarr - a Python package providing an implementation of compressed, chunked, N-dimensional arrays, designed for use in parallel computing. The Zarr file format offers powerful compression options, supports multiple data store backends, and can read/write your NumPy arrays.
+- Seurat objects - a representation of single-cell expression data for R, in Galaxy you might see them in **rdata** format.
+- Single Cell Experiment (SCE) object - defines a S4 class for storing data from single-cell experiments and provides a more formalized approach towards construction and accession of data. The S4 system is one of R's systems for object oriented programing. In Galaxy you might see SCE objects in **rdata** format.
+- CellDataSet (CDS) object - the main class used by Monocle to hold single cell expression data. In Galaxy you might see CDS objects in **rdata** format.
-# Data ingestion
+
{% snippet faqs/galaxy/tutorial_mode.md %}
+# Data ingestion
+
+
+## Downsampling
+
+
# Format conversion
From 491e328ec2078f9be2dd43a4ac384de7c16387bb Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Wed, 11 Oct 2023 08:27:38 +0100
Subject: [PATCH 007/117] Update tutorial.md
---
.../single-cell/tutorials/scrna-data-ingest/tutorial.md | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 833ab93056e690..2fa2a6c4d00bc5 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -72,10 +72,16 @@ include images showing the structure of those files
# Data ingestion
+As you can see above, there are multiple ways to store single cell data. Therefore, there are also many ways how you can get that data!
+## EBI SCXA Data Retrieval
-## Downsampling
+If you want to use publicly available data, then EBI's [Single Cell Expression Atlas](https://www.ebi.ac.uk/gxa/sc/home) is a great place to get resources from. You can search datasets according to various criteria either using search box in **Home** tab or choosing kingdom, experiment collection, technology type (and others) in **Browse experiments** tab. If
+
+![Three graphs showing the difference between the resolution of clustering. During automatic determination of this value, there were 6 clusters formed, corresponding to cell types. Manually set resolution=0.001 resulted in 11 clusters so that more than one cluster corresponds to one cell type, and resolution=0.1 resulted in almost 200 very small clusters.](../../images/path/exp_id.jpg "Different granularity of clusters based on the resolution set automatically and manually.")
+## Downsampling
+Sometimes it is useful to work on smaller subset of data (especially for teaching / learning purposes).
# Format conversion
From 7b3598aaf33bbb1b257e7b4d69868a63bc69ca06 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Thu, 12 Oct 2023 01:43:16 +0100
Subject: [PATCH 008/117] EBI input for filter plot
---
.../tutorials/scrna-data-ingest/tutorial.md | 134 +++++++++++++++++-
1 file changed, 132 insertions(+), 2 deletions(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 2fa2a6c4d00bc5..c80dad3e37fcc0 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -76,9 +76,139 @@ As you can see above, there are multiple ways to store single cell data. Therefo
## EBI SCXA Data Retrieval
-If you want to use publicly available data, then EBI's [Single Cell Expression Atlas](https://www.ebi.ac.uk/gxa/sc/home) is a great place to get resources from. You can search datasets according to various criteria either using search box in **Home** tab or choosing kingdom, experiment collection, technology type (and others) in **Browse experiments** tab. If
+If you want to use publicly available data, then EBI's [Single Cell Expression Atlas](https://www.ebi.ac.uk/gxa/sc/home) is a great place to get resources from. You can search datasets according to various criteria either using search box in **Home** tab or choosing kingdom, experiment collection, technology type (and others) in **Browse experiments** tab. When you find the experiment you are interested in, just click on it and the experiment ID will be displayed in the website URL, as shown below.
+
+![Arrow pointing to the website URL where you can find experiment ID.](../../images/path/exp_id.jpg "Where to find experiment ID on the EBI Single Cell Expression Atlas website.")
+
+Once you know the experiment ID, you can use EBI SCXA Data Retrieval tool in Galaxy!
+
+> Retrieving data from Single Cell Expression Atlas
+>
+> 1. {% tool [EBI SCXA Data Retrieval](toolshed.g2.bx.psu.edu/repos/ebi-gxa/retrieve_scxa/retrieve_scxa/v0.0.2+galaxy2) %} with the following parameters:
+> - *"SC-Atlas experiment accession"*: `E-MTAB-6945`
+> - *"Choose the type of matrix to download"*: `Raw filtered counts`
+>
+> Now we need to transform this into an AnnData object.
+>
+> 2. {% tool [Scanpy Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/scanpy_read_10x/scanpy_read_10x/1.8.1+galaxy0) %} with the following parameters:
+> - *"Expression matrix in sparse matrix format (.mtx)"*: `EBI SCXA Data Retrieval on E-MTAB-6945 matrix.mtx (Raw filtered counts)`
+> - *"Gene table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 genes.tsv (Raw filtered counts)`
+> - *"Barcode/cell table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 barcodes.tsv (Raw filtered counts)`
+> - *"Cell metadata table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 exp_design.tsv`
+{: .hands_on}
+
+
+
+It's important to note that this matrix is processed somewhat through the SCXA pipeline, which is quite similar to the pre-processing that has been shown in this case study tutorial series, and it contains any and all metadata provided by their pipeline as well as the authors (for instance, more cell or gene annotations). So don't worry if the plots generated using this input method are slightly different!
+
+Before creating an AnnData object, we need to make a small modification in experimental design table. The dataset contains information about 7 samples N701 – N707), however in the experimental design table (cell metadata) they are just numbered from 1 to 7. The plotting tool that we will going to use later will fail if the entries are integers and not categoricals, so we will change "1" to "N701" and so on. You can simply preview the experimental design dataset and move to the column "Sample Characteristic[individual]" (that's where the information about batch is - don't worry, we will rename the column header later!). Make a note of the number of that column - number 12 - we will need it to change the batch number to batch name.
+
+> Change batch numbers into names
+>
+> 1. Change the datatype of `EBI SCXA Data Retrieval on E-MTAB-6945 exp_design.tsv` to *tabular*:
+> {% snippet faqs/galaxy/datasets_change_datatype.md datatype="tabular" %}
+>
+> 2. {% tool [Column Regex Find And Replace](toolshed.g2.bx.psu.edu/repos/galaxyp/regex_find_replace/regexColumn1/1.0.3) %} with the following parameters:
+> - *"using column"*: `c12`
+> - In *"Check"*:
+> - {% icon param-repeat %} *"Insert Check"*
+> - *"Find Regex"*: `1`
+> - *"Replacement"*: `N701`
+> - {% icon param-repeat %} *"Insert Check"*
+> - *"Find Regex"*: `2`
+> - *"Replacement"*: `N702`
+> - {% icon param-repeat %} *"Insert Check"*
+> - *"Find Regex"*: `3`
+> - *"Replacement"*: `N703`
+> - {% icon param-repeat %} *"Insert Check"*
+> - *"Find Regex"*: `4`
+> - *"Replacement"*: `N704`
+> - {% icon param-repeat %} *"Insert Check"*
+> - *"Find Regex"*: `5`
+> - *"Replacement"*: `N705`
+> - {% icon param-repeat %} *"Insert Check"*
+> - *"Find Regex"*: `6`
+> - *"Replacement"*: `N706`
+> - {% icon param-repeat %} *"Insert Check"*
+> - *"Find Regex"*: `7`
+> - *"Replacement"*: `N707`
+>
+> 3. Rename {% icon galaxy-pencil %} output `Cell metadata`
+>
+{: .hands_on}
+
+Now we can create an AnnData object!
+
+> Task description
+>
+> 1. {% tool [Scanpy Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/scanpy_read_10x/scanpy_read_10x/1.8.1+galaxy9) %} with the following parameters:
+> - *"Expression matrix in sparse matrix format (.mtx)"*: `EBI SCXA Data Retrieval on E-MTAB-6945 matrix.mtx (Raw filtered counts)`
+> - *"Gene table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 genes.tsv (Raw filtered counts)`
+> - *"Barcode/cell table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 barcodes.tsv (Raw filtered counts)`
+> - *"Cell metadata table"*: `Cell metadata`
+>
+> 2. Rename {% icon galaxy-pencil %} output `AnnData object`
+>
+{: .hands_on}
+
+Now we will do several modifications within the AnnData object so that you can follow this tutorial despite the other way of getting data!
+We would like to flag mitochondrial genes. They can be identified quite easily since they names start with mt. Since the tool for flagging the mitochondrial genes is case-sensitive, it might be a good idea to check what is the formatting of mitochondrial genes in our dataset.
+
+> Check the format of mitochondrial genes names
+>
+> 1. {% tool [Search in textfiles](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_grep_tool/1.1.1) %} with the following parameters:
+> - *"Regular Expression"*: `mt`
+> - *"Output"*: `Highlighted HTML (for easier viewing)`
+>
+> 2. Rename {% icon galaxy-pencil %} output `Mito genes check`
+>
+{: .hands_on}
+
+If you click on that dataset, you will see all the genes containing 'mt' in their name. We can now clearly see that mitochondrial genes in our dataset start with 'mt-'. Keep that in mind, we will use it in a moment!
+
+Speaking about gene names, we will also change the header of the column containing those names from `gene_symbols` to `Symbol`. This edit is only needed to make our AnnData object compatible with this tutorial's workflow.
+
+As I mentioned at the beginning, we will also change the header of the column storing information about batch. Actually, we will change several other headers as well.
+
+And the good news is that we can do all those steps using only one tool!
+
+> Modify AnnData object
+>
+> 1. {% tool [AnnData Operations](toolshed.g2.bx.psu.edu/repos/ebi-gxa/anndata_ops/anndata_ops/1.8.1+galaxy92) %} with the following parameters:
+> - In *"Change field names in AnnData observations"*:
+> - {% icon param-repeat %} *"Insert Change field names in AnnData observations"*
+> - *"Original name"*: `Sample Characteristic[genotype]`
+> - *"New name"*: `genotype`
+> - {% icon param-repeat %} *"Insert Change field names in AnnData observations"*
+> - *"Original name"*: `Sample Characteristic[individual]`
+> - *"New name"*: `batch`
+> - {% icon param-repeat %} *"Insert Change field names in AnnData observations"*
+> - *"Original name"*: `Sample Characteristic[sex]`
+> - *"New name"*: `sex`
+> - {% icon param-repeat %} *"Insert Change field names in AnnData observations"*
+> - *"Original name"*: `Sample Characteristic[cell type]`
+> - *"New name"*: `cell_type`
+> - In *"Change field names in AnnData var"*:
+> - {% icon param-repeat %} *"Insert Change field names in AnnData var"*
+> - *"Original name"*: `gene_symbols`
+> - *"New name"*: `Symbol`
+> - *"Gene symbols field in AnnData"*: `Symbol`
+> - In *"Flag genes that start with these names"*:
+> - {% icon param-repeat %} *"Insert Flag genes that start with these names"*
+> - *"Starts with"*: `mt-`
+> - *"Var name"*: `mito`
+>
+> 2. Rename {% icon galaxy-pencil %} output `Mito-counted AnnData for downstream analysis`
+>
+{: .hands_on}
+
+And that's all! What's even more exciting about AnnData Operations tool is that it automatically calculates a bunch of metrics, such as log1p_mean_counts, log1p_total_counts, mean_counts, n_cells, n_cells_by_counts, n_counts, pct_dropout_by_counts, total_counts. Amazing, isn't it?
+
+
-![Three graphs showing the difference between the resolution of clustering. During automatic determination of this value, there were 6 clusters formed, corresponding to cell types. Manually set resolution=0.001 resulted in 11 clusters so that more than one cluster corresponds to one cell type, and resolution=0.1 resulted in almost 200 very small clusters.](../../images/path/exp_id.jpg "Different granularity of clusters based on the resolution set automatically and manually.")
## Downsampling
Sometimes it is useful to work on smaller subset of data (especially for teaching / learning purposes).
From feb0131c0a5f04d9892cc0b842c8d8b3607a19d2 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Thu, 12 Oct 2023 09:39:10 +0100
Subject: [PATCH 009/117] EBI import, conversions skeleton
---
.../tutorials/scrna-data-ingest/tutorial.md | 203 +++++++++---------
1 file changed, 106 insertions(+), 97 deletions(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index c80dad3e37fcc0..26f94ceb356f3b 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -23,6 +23,8 @@ contributions:
- hexhowells
- wee-snufkin
- nomadscientist
+
+funding:
follow_up_training:
-
@@ -88,130 +90,137 @@ Once you know the experiment ID, you can use EBI SCXA Data Retrieval tool in Gal
> - *"SC-Atlas experiment accession"*: `E-MTAB-6945`
> - *"Choose the type of matrix to download"*: `Raw filtered counts`
>
-> Now we need to transform this into an AnnData object.
+{: .hands_on}
+
+At this point you might want to do some modifications in the files before downstream analysis. That can include re-formating the cell metadata or changing the names of the column headers, it all depends on your dataset and how you want to perfrom your analysis. It's also fine to transform those files straight away. Now you have the choice to create AnnData object or Seurat object.
+
+> Create AnnData object
>
-> 2. {% tool [Scanpy Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/scanpy_read_10x/scanpy_read_10x/1.8.1+galaxy0) %} with the following parameters:
+> {% tool [Scanpy Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/scanpy_read_10x/scanpy_read_10x/1.8.1+galaxy0) %} with the following parameters:
> - *"Expression matrix in sparse matrix format (.mtx)"*: `EBI SCXA Data Retrieval on E-MTAB-6945 matrix.mtx (Raw filtered counts)`
> - *"Gene table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 genes.tsv (Raw filtered counts)`
> - *"Barcode/cell table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 barcodes.tsv (Raw filtered counts)`
> - *"Cell metadata table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 exp_design.tsv`
{: .hands_on}
-
-It's important to note that this matrix is processed somewhat through the SCXA pipeline, which is quite similar to the pre-processing that has been shown in this case study tutorial series, and it contains any and all metadata provided by their pipeline as well as the authors (for instance, more cell or gene annotations). So don't worry if the plots generated using this input method are slightly different!
-
-Before creating an AnnData object, we need to make a small modification in experimental design table. The dataset contains information about 7 samples N701 – N707), however in the experimental design table (cell metadata) they are just numbered from 1 to 7. The plotting tool that we will going to use later will fail if the entries are integers and not categoricals, so we will change "1" to "N701" and so on. You can simply preview the experimental design dataset and move to the column "Sample Characteristic[individual]" (that's where the information about batch is - don't worry, we will rename the column header later!). Make a note of the number of that column - number 12 - we will need it to change the batch number to batch name.
-
-> Change batch numbers into names
->
-> 1. Change the datatype of `EBI SCXA Data Retrieval on E-MTAB-6945 exp_design.tsv` to *tabular*:
-> {% snippet faqs/galaxy/datasets_change_datatype.md datatype="tabular" %}
->
-> 2. {% tool [Column Regex Find And Replace](toolshed.g2.bx.psu.edu/repos/galaxyp/regex_find_replace/regexColumn1/1.0.3) %} with the following parameters:
-> - *"using column"*: `c12`
-> - In *"Check"*:
-> - {% icon param-repeat %} *"Insert Check"*
-> - *"Find Regex"*: `1`
-> - *"Replacement"*: `N701`
-> - {% icon param-repeat %} *"Insert Check"*
-> - *"Find Regex"*: `2`
-> - *"Replacement"*: `N702`
-> - {% icon param-repeat %} *"Insert Check"*
-> - *"Find Regex"*: `3`
-> - *"Replacement"*: `N703`
-> - {% icon param-repeat %} *"Insert Check"*
-> - *"Find Regex"*: `4`
-> - *"Replacement"*: `N704`
-> - {% icon param-repeat %} *"Insert Check"*
-> - *"Find Regex"*: `5`
-> - *"Replacement"*: `N705`
-> - {% icon param-repeat %} *"Insert Check"*
-> - *"Find Regex"*: `6`
-> - *"Replacement"*: `N706`
-> - {% icon param-repeat %} *"Insert Check"*
-> - *"Find Regex"*: `7`
-> - *"Replacement"*: `N707`
->
-> 3. Rename {% icon galaxy-pencil %} output `Cell metadata`
->
+> Create Seurat object / Loom / SCE
+>
+> {% tool [Seurat Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/seurat_read10x/seurat_read10x/3.2.3+galaxy0) %} with the following parameters:
+> - *"Choose the format of the input"*: `10X-type MTX`
+> - *"Expression matrix in sparse matrix format (.mtx)"*: `EBI SCXA Data Retrieval on E-MTAB-6945 matrix.mtx (Raw filtered counts)`
+> - *"Gene table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 genes.tsv (Raw filtered counts)`
+> - *"Barcode/cell table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 barcodes.tsv (Raw filtered counts)`
+> - *"Cell Metadata"*: `EBI SCXA Data Retrieval on E-MTAB-6945 exp_design.tsv`
+>
+> You can now choose if you want to get Seurat object, Loom or Single Cell Experiment by selecting your option in *"Choose the format of the output"*.
{: .hands_on}
-Now we can create an AnnData object!
+
+## Human Cell Atlas Matrix Downloader
+Matrix market format: matrix mtx, genes tsv, barcodes tsv, exp design tsv
+Scnapy read10x to transform those to AnnData object
+Flagging by using AnnData Operations works well (only need to check name of the column with gene symbols):
+Case sensitive
+No parentheses
+Dash important
+
+
+# Downsampling
+
+Sometimes it is useful to work on smaller subset of data (especially for teaching / learning purposes).
+[Workflow](https://singlecell.usegalaxy.eu/u/j.jakiela/w/workflow-constructed-from-history-copy-of-cs1generating-a-single-cell-matrix-using-alevin---how-to-downsample)
+
+# Format conversion
+
+## AnnData -> Seurat
> Task description
>
-> 1. {% tool [Scanpy Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/scanpy_read_10x/scanpy_read_10x/1.8.1+galaxy9) %} with the following parameters:
-> - *"Expression matrix in sparse matrix format (.mtx)"*: `EBI SCXA Data Retrieval on E-MTAB-6945 matrix.mtx (Raw filtered counts)`
-> - *"Gene table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 genes.tsv (Raw filtered counts)`
-> - *"Barcode/cell table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 barcodes.tsv (Raw filtered counts)`
-> - *"Cell metadata table"*: `Cell metadata`
+> 1. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
+> - *"What to inspect?"*: `Key-indexed observations annotation (obs)`
>
-> 2. Rename {% icon galaxy-pencil %} output `AnnData object`
->
{: .hands_on}
-Now we will do several modifications within the AnnData object so that you can follow this tutorial despite the other way of getting data!
-We would like to flag mitochondrial genes. They can be identified quite easily since they names start with mt. Since the tool for flagging the mitochondrial genes is case-sensitive, it might be a good idea to check what is the formatting of mitochondrial genes in our dataset.
-> Check the format of mitochondrial genes names
+> Task description
>
-> 1. {% tool [Search in textfiles](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_grep_tool/1.1.1) %} with the following parameters:
-> - *"Regular Expression"*: `mt`
-> - *"Output"*: `Highlighted HTML (for easier viewing)`
->
-> 2. Rename {% icon galaxy-pencil %} output `Mito genes check`
+> 1. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
+> - *"What to inspect?"*: `The full data matrix`
>
{: .hands_on}
-If you click on that dataset, you will see all the genes containing 'mt' in their name. We can now clearly see that mitochondrial genes in our dataset start with 'mt-'. Keep that in mind, we will use it in a moment!
-
-Speaking about gene names, we will also change the header of the column containing those names from `gene_symbols` to `Symbol`. This edit is only needed to make our AnnData object compatible with this tutorial's workflow.
-
-As I mentioned at the beginning, we will also change the header of the column storing information about batch. Actually, we will change several other headers as well.
-
-And the good news is that we can do all those steps using only one tool!
-
-> Modify AnnData object
->
-> 1. {% tool [AnnData Operations](toolshed.g2.bx.psu.edu/repos/ebi-gxa/anndata_ops/anndata_ops/1.8.1+galaxy92) %} with the following parameters:
-> - In *"Change field names in AnnData observations"*:
-> - {% icon param-repeat %} *"Insert Change field names in AnnData observations"*
-> - *"Original name"*: `Sample Characteristic[genotype]`
-> - *"New name"*: `genotype`
-> - {% icon param-repeat %} *"Insert Change field names in AnnData observations"*
-> - *"Original name"*: `Sample Characteristic[individual]`
-> - *"New name"*: `batch`
-> - {% icon param-repeat %} *"Insert Change field names in AnnData observations"*
-> - *"Original name"*: `Sample Characteristic[sex]`
-> - *"New name"*: `sex`
-> - {% icon param-repeat %} *"Insert Change field names in AnnData observations"*
-> - *"Original name"*: `Sample Characteristic[cell type]`
-> - *"New name"*: `cell_type`
-> - In *"Change field names in AnnData var"*:
-> - {% icon param-repeat %} *"Insert Change field names in AnnData var"*
-> - *"Original name"*: `gene_symbols`
-> - *"New name"*: `Symbol`
-> - *"Gene symbols field in AnnData"*: `Symbol`
-> - In *"Flag genes that start with these names"*:
-> - {% icon param-repeat %} *"Insert Flag genes that start with these names"*
-> - *"Starts with"*: `mt-`
-> - *"Var name"*: `mito`
->
-> 2. Rename {% icon galaxy-pencil %} output `Mito-counted AnnData for downstream analysis`
+
+> Task description
+>
+> 1. {% tool [Transpose](toolshed.g2.bx.psu.edu/repos/iuc/datamash_transpose/datamash_transpose/1.8+galaxy0) %} with the following parameters:
+>
>
{: .hands_on}
-And that's all! What's even more exciting about AnnData Operations tool is that it automatically calculates a bunch of metrics, such as log1p_mean_counts, log1p_total_counts, mean_counts, n_cells, n_cells_by_counts, n_counts, pct_dropout_by_counts, total_counts. Amazing, isn't it?
+> Task description
+>
+> 1. {% tool [DropletUtils](toolshed.g2.bx.psu.edu/repos/iuc/dropletutils/dropletutils/1.10.0+galaxy2) %} with the following parameters:
+> - *"Format for the input matrix"*: `Tabular`
+> - *"Operation"*: `Filter for Barcodes`
+> - *"Method"*: `DefaultDrops`
+> - *"Expected Number of Cells"*: `31178`
+> - *"Upper Quantile"*: `1.0`
+> - *"Lower Proportion"*: `0.0`
+> - *"Format for output matrices"*: `Bundled (barcodes.tsv, genes.tsv, matrix.mtx)`
+>
+{: .hands_on}
+> Task description
+>
+> 1. {% tool [Seurat Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/seurat_read10x/seurat_read10x/3.2.3+galaxy0) %} with the following parameters:
+> - *"Choose the format of the input"*: `10X-type MTX`
+>
+{: .hands_on}
+## AnnData -> SCE
-## Downsampling
-Sometimes it is useful to work on smaller subset of data (especially for teaching / learning purposes).
+> Task description
+>
+> 1. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
+> - *"What to inspect?"*: `Key-indexed observations annotation (obs)`
+>
+{: .hands_on}
-# Format conversion
+> Task description
+>
+> 1. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
+> - *"What to inspect?"*: `The full data matrix`
+>
+{: .hands_on}
+
+
+> Task description
+>
+> 1. {% tool [Transpose](toolshed.g2.bx.psu.edu/repos/iuc/datamash_transpose/datamash_transpose/1.8+galaxy0) %} with the following parameters:
+>
+{: .hands_on}
+
+
+> Task description
+>
+> 1. {% tool [DropletUtils](toolshed.g2.bx.psu.edu/repos/iuc/dropletutils/dropletutils/1.10.0+galaxy2) %} with the following parameters:
+> - *"Format for the input matrix"*: `Tabular`
+> - *"Operation"*: `Filter for Barcodes`
+> - *"Method"*: `DefaultDrops`
+> - *"Expected Number of Cells"*: `31178`
+> - *"Upper Quantile"*: `1.0`
+> - *"Lower Proportion"*: `0.0`
+> - *"Format for output matrices"*: `Bundled (barcodes.tsv, genes.tsv, matrix.mtx)`
+>
+{: .hands_on}
+
+> Task description
+>
+> 1. {% tool [DropletUtils Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/dropletutils_read_10x/dropletutils_read_10x/1.0.4+galaxy0) %} with the following parameters:
+> - *"Should metadata file be added?"*: `Yes`
+>
+{: .hands_on}
+## Anndata -> CDS
From b1769cea32f7db475ba874dbb2403670e8a60d99 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Mon, 13 Nov 2023 11:49:14 +0000
Subject: [PATCH 010/117] add funding
---
topics/single-cell/tutorials/scrna-data-ingest/tutorial.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 26f94ceb356f3b..9c024a1600b7b5 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -24,7 +24,8 @@ contributions:
- wee-snufkin
- nomadscientist
-funding:
+funding:
+ - elixir-fair-data
follow_up_training:
-
From 755c5f05e63d584373cc47c516461a4416e28702 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Sun, 3 Dec 2023 13:55:43 +0000
Subject: [PATCH 011/117] choose tutorial, downsampling
---
.../tutorials/scrna-data-ingest/tutorial.md | 87 ++++++++++++++++++-
1 file changed, 84 insertions(+), 3 deletions(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 9c024a1600b7b5..63e0afa58758e8 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -95,6 +95,11 @@ Once you know the experiment ID, you can use EBI SCXA Data Retrieval tool in Gal
At this point you might want to do some modifications in the files before downstream analysis. That can include re-formating the cell metadata or changing the names of the column headers, it all depends on your dataset and how you want to perfrom your analysis. It's also fine to transform those files straight away. Now you have the choice to create AnnData object or Seurat object.
+{% include _includes/cyoa-choices.html option1="Scanpy" option2="Seurat" default="Scanpy"
+ text="You can choose whether you want to create an AnnData object for Scanpy Analysis or an RDS object for Seurat Analysis. Galaxy has more resources for Scanpy analysis, but sometimes Seurat might have what you want." %}
+
+
+
> Create AnnData object
>
> {% tool [Scanpy Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/scanpy_read_10x/scanpy_read_10x/1.8.1+galaxy0) %} with the following parameters:
@@ -104,6 +109,9 @@ At this point you might want to do some modifications in the files before downst
> - *"Cell metadata table"*: `EBI SCXA Data Retrieval on E-MTAB-6945 exp_design.tsv`
{: .hands_on}
+
+
+
> Create Seurat object / Loom / SCE
>
@@ -117,8 +125,10 @@ At this point you might want to do some modifications in the files before downst
> You can now choose if you want to get Seurat object, Loom or Single Cell Experiment by selecting your option in *"Choose the format of the output"*.
{: .hands_on}
+
## Human Cell Atlas Matrix Downloader
+
Matrix market format: matrix mtx, genes tsv, barcodes tsv, exp design tsv
Scnapy read10x to transform those to AnnData object
Flagging by using AnnData Operations works well (only need to check name of the column with gene symbols):
@@ -127,10 +137,81 @@ No parentheses
Dash important
-# Downsampling
+# Downsampling FASTQ files
+
+Sometimes it is useful to work on smaller subset of data (especially for teaching / learning purposes). Here is an example of how you can downsample your FASTQ files.
+First, let's get some toy data. We just need two FASTQ files - one containing barcodes, the other with transcripts.
+
+> Get toy data
+>
+> You can simply download the files by pasting the links below into "Upload Data" searchbox.
+>
+> ```
+> {{ page.zenodo_link }}/files/SLX-7632.TAAGGCGA.N701.s_1.r_1.fq-400k.fastq
+> {{ page.zenodo_link }}/files/SLX-7632.TAAGGCGA.N701.s_1.r_2.fq-400k.fastq
+> ```
+>
+> {% snippet faqs/galaxy/datasets_import_via_link.md %}
+>
+{: .hands_on}
+
+Funnily enough, those files are already downsampled so that you don't have to wait for too long to download them. We are not going to analyse that data today anyway, it's just for demonstration purposes.
+
+Quick check now which file contains barcodes and which transcripts. If you click on the two datasets, you will see that one has shorter sequences, while the other has longer. It's quite straight-forward to deduce that shorter sequences are barcodes, so let's rename the file `s_1.r_1` as `Barcodes` and file `s_1.r_2` as `Transcripts`.
+
+> Rename the files
+>
+> {% snippet faqs/galaxy/datasets_rename.md %}
+>
+{: .hands_on}
+
+Now we will convert the FASTQ files to tabular:
+
+> FASTQ to tabular
+>
+> 1. {% tool [FASTQ to Tabular](toolshed.g2.bx.psu.edu/repos/devteam/fastq_to_tabular/fastq_to_tabular/1.1.5) %} with the following parameters:
+> - {% icon param-file %} *"FASTQ file to convert"*: `Barcodes`
+>
+> 3. Rename {% icon galaxy-pencil %} the dataset `Barcodes tabular`.
+>
+> 4. Repeat the same with `Transcripts` file and rename it as `Transcripts tabular`.
+>
+{: .hands_on}
+
+Now let's select the number of the reads we would like to keep. It's totally up to you, we choose 100000 here.
+
+> Downsampling
+>
+> 1. {% tool [Select last](toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_tail_tool/1.1.0) %} with the following parameters:
+> - {% icon param-file %} *"Text file"*: `Barcodes tabular` (output of **FASTQ to Tabular** {% icon tool %})
+> - *"Operation"*: `Keep last lines`
+> - *"Number of lines"*: `100000`
+>
+> 2. Rename {% icon galaxy-pencil %} the dataset `Barcodes cut`.
+>
+> 3. Repeat the same with `Transcripts tabular` file and rename it as `Transcripts cut`
+>
+{: .hands_on}
+
+All done, now we just need to go back to FASTQ from Tabular again!
+
+
+> Task description
+>
+> 1. {% tool [Tabular to FASTQ](toolshed.g2.bx.psu.edu/repos/devteam/tabular_to_fastq/tabular_to_fastq/1.1.5) %} with the following parameters:
+> - {% icon param-file %} *"Tabular file to convert"*: `Barcodes cut` (output of **Select last** {% icon tool %})
+> - *"Identifier column"*: `c1`
+> - *"Sequence column"*: `c2`
+> - *"Quality column"*: `c3`
+>
+> 2. Rename {% icon galaxy-pencil %} the dataset `Downsampled barcode/UMI read`.
+>
+> 3. Repeat the same with `Transcripts cut` file and rename it as `Downsampled transcript read`
+>
+{: .hands_on}
+
+And that's all! Your downsampled data is ready to use. You can check your answers in this [example history](https://usegalaxy.eu/u/j.jakiela/h/how-to-downsample-fastq-files) or if you want to accelerate this process, feel free to use the [workflow](https://singlecell.usegalaxy.eu/u/j.jakiela/w/workflow-constructed-from-history-copy-of-cs1generating-a-single-cell-matrix-using-alevin---how-to-downsample) next time!
-Sometimes it is useful to work on smaller subset of data (especially for teaching / learning purposes).
-[Workflow](https://singlecell.usegalaxy.eu/u/j.jakiela/w/workflow-constructed-from-history-copy-of-cs1generating-a-single-cell-matrix-using-alevin---how-to-downsample)
# Format conversion
From 58a9af84c15a6a760584dc4a0e02dea8b971307c Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Sun, 3 Dec 2023 15:28:45 +0000
Subject: [PATCH 012/117] sceasy
---
.../tutorials/scrna-data-ingest/tutorial.md | 22 +++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 63e0afa58758e8..278de9b0f45227 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -20,8 +20,8 @@ key_points:
- There are many ways of importing single cell files into Galaxy and converting between single cell formats.
contributions:
authorship:
- - hexhowells
- wee-snufkin
+ - hexhowells
- nomadscientist
funding:
@@ -215,13 +215,31 @@ And that's all! Your downsampled data is ready to use. You can check your answer
# Format conversion
+In Galaxy Toolshed there is a wonderful tool called {% tool [SCEasy](toolshed.g2.bx.psu.edu/repos/iuc/sceasy_convert/sceasy_convert/0.0.7+galaxy1) %} which allows to convert between common single cell formats, such as:
+- AnnData to CellDataSet (CDS)
+- AnnData to Seurat
+- Loom to AnnData
+- Loom to SingleCellExperiment (SCE)
+- SingleCellExperiment (SCE) to AnnData
+- SingleCellExperiment (SCE) to Loom
+- Seurat to AnnData
+- Seurat to SingleCellExperiment (SCE)
+
+> Two SCEasy tools
+>
+> The updated SCEasy tool is called [**SCEasy Converter**](toolshed.g2.bx.psu.edu/repos/iuc/sceasy_convert/sceasy_convert/0.0.7+galaxy1) and it's only available on usegalaxy.eu. The second tool is called [**SCEasy convert**](toolshed.g2.bx.psu.edu/repos/ebi-gxa/sceasy_convert/sceasy_convert/0.0.5+galaxy1) and it works on usegalaxy.org, however has limited conversion options.
+>
+{: .warning}
+
+However, sometimes it is useful to know how to do this conversion manually or at least to know how it all works. Therefore, below are some examples showing how to do it.
+
## AnnData -> Seurat
> Task description
>
> 1. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
> - *"What to inspect?"*: `Key-indexed observations annotation (obs)`
->
+>
{: .hands_on}
From d1a48b1c8b3088fd05193e59077ca6a847b5ce1b Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Sun, 3 Dec 2023 16:11:15 +0000
Subject: [PATCH 013/117] anndata -> seurat steps
---
.../tutorials/scrna-data-ingest/tutorial.md | 65 +++++++++++++++----
1 file changed, 54 insertions(+), 11 deletions(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 278de9b0f45227..34e12d89a5648b 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -147,8 +147,8 @@ First, let's get some toy data. We just need two FASTQ files - one containing ba
> You can simply download the files by pasting the links below into "Upload Data" searchbox.
>
> ```
-> {{ page.zenodo_link }}/files/SLX-7632.TAAGGCGA.N701.s_1.r_1.fq-400k.fastq
-> {{ page.zenodo_link }}/files/SLX-7632.TAAGGCGA.N701.s_1.r_2.fq-400k.fastq
+> https://zenodo.org/record/4574153/files/SLX-7632.TAAGGCGA.N701.s_1.r_1.fq-400k.fastq
+> https://zenodo.org/record/4574153/files/SLX-7632.TAAGGCGA.N701.s_1.r_2.fq-400k.fastq
> ```
>
> {% snippet faqs/galaxy/datasets_import_via_link.md %}
@@ -235,48 +235,91 @@ However, sometimes it is useful to know how to do this conversion manually or at
## AnnData -> Seurat
-> Task description
+Let's get an AnnData object that we can further work on. It's the object used in previous tutorials ({% link topics/single-cell/tutorials/scrna-case_basic-pipeline/tutorial.md %}), so check it out if you're curious.
+
+> Get toy data
+>
+> You can simply download the files by pasting the links below into "Upload Data" searchbox.
+>
+> ```
+> https://zenodo.org/record/7053673/files/Mito-counted_AnnData
+> ```
+>
+> {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
-> 1. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
-> - *"What to inspect?"*: `Key-indexed observations annotation (obs)`
->
{: .hands_on}
-> Task description
+First, we will extract observations and the full matrix from our AnnData.
+
+> Inspect AnnData
>
> 1. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
+> - *"Annotated data matrix"*: `Mito-counted_AnnData`
+> - *"What to inspect?"*: `Key-indexed observations annotation (obs)`
+>
+> 2. Rename {% icon galaxy-pencil %} the output `Observations`.
+>
+> 3. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
+> - *"Annotated data matrix"*: `Mito-counted_AnnData`
> - *"What to inspect?"*: `The full data matrix`
>
+> 4. Rename {% icon galaxy-pencil %} the output `Matrix`.
+>
{: .hands_on}
+>
+>
+> What are the rows, and what are the columns in the retrieved Matrix?
+>
+> >
+> >
+> > If you just click on the `Matrix` dataset, you will see a preview, showing barcodes in the first column, while genes in the first row.
+> >
+> {: .solution}
+>
+{: .question}
+
+To proceed with the conversion, we must have the matrix where the genes are listed in the first column while all the barcodes should be in the first row. Therefore, we need to transpose the current matrix.
-> Task description
+> Transpose the matrix
>
> 1. {% tool [Transpose](toolshed.g2.bx.psu.edu/repos/iuc/datamash_transpose/datamash_transpose/1.8+galaxy0) %} with the following parameters:
->
+> - *"Input tabular dataset"*: `Matrix`
>
{: .hands_on}
+And now we are ready to input that data to **DropletUtils** tool.
-> Task description
+> DropletUtils
>
> 1. {% tool [DropletUtils](toolshed.g2.bx.psu.edu/repos/iuc/dropletutils/dropletutils/1.10.0+galaxy2) %} with the following parameters:
> - *"Format for the input matrix"*: `Tabular`
+> - *"Count Data"*: output of **Transpose** {% icon tool %}
> - *"Operation"*: `Filter for Barcodes`
> - *"Method"*: `DefaultDrops`
> - *"Expected Number of Cells"*: `31178`
> - *"Upper Quantile"*: `1.0`
> - *"Lower Proportion"*: `0.0`
> - *"Format for output matrices"*: `Bundled (barcodes.tsv, genes.tsv, matrix.mtx)`
+> - *"Random Seed"*: `100`
>
{: .hands_on}
-> Task description
+Finally, let's combine those files that we have just generated and turn them into the Seurat object!
+
+> Create Seurat object
>
> 1. {% tool [Seurat Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/seurat_read10x/seurat_read10x/3.2.3+galaxy0) %} with the following parameters:
> - *"Choose the format of the input"*: `10X-type MTX`
+> - *"Expression matrix in sparse matrix format (.mtx)"*: `DropletUtils 10X Matrices`
+> - *"Gene table"*: `DropletUtils 10X Genes`
+> - *"Barcode/cell table"*: `DropletUtils 10X Barcodes`
+> - *"Cell Metadata"*: `Observations`
+> - *"Choose the format of the output"*: `RDS with a Seurat object`
>
+> 2. Rename {% icon galaxy-pencil %} the output `Converted Seurat object`.
+>
{: .hands_on}
## AnnData -> SCE
From 3928bf3214f4d44b45a9188881ece8fcde96e9d5 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Tue, 12 Dec 2023 11:55:38 +0000
Subject: [PATCH 014/117] Anndata -> seurat history and workflow
---
topics/single-cell/tutorials/scrna-data-ingest/tutorial.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 34e12d89a5648b..de50549ed16ca2 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -127,6 +127,9 @@ At this point you might want to do some modifications in the files before downst
+
## Human Cell Atlas Matrix Downloader
Matrix market format: matrix mtx, genes tsv, barcodes tsv, exp design tsv
@@ -322,6 +325,9 @@ Finally, let's combine those files that we have just generated and turn them int
>
{: .hands_on}
+As usual, you can check the [example history](https://usegalaxy.eu/u/j.jakiela/h/anndata---seurat) and the dedicated [workflow](https://usegalaxy.eu/u/j.jakiela/w/anndata---seurat-conversion).
+
+
## AnnData -> SCE
> Task description
From db4e407801b9e2cf8987e5f753e09536e5ca63a9 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Tue, 12 Dec 2023 12:48:46 +0000
Subject: [PATCH 015/117] Anndata -> SCE
---
.../tutorials/scrna-data-ingest/tutorial.md | 69 ++++++++++++++++---
1 file changed, 59 insertions(+), 10 deletions(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index de50549ed16ca2..9d2418d754b984 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -328,48 +328,97 @@ Finally, let's combine those files that we have just generated and turn them int
As usual, you can check the [example history](https://usegalaxy.eu/u/j.jakiela/h/anndata---seurat) and the dedicated [workflow](https://usegalaxy.eu/u/j.jakiela/w/anndata---seurat-conversion).
-## AnnData -> SCE
+## AnnData -> SingleCellExperiment (SCE)
-> Task description
+We will work on the same AnnData object so if you create a new history for this exercise, you can either get this file from Zenodo again or just copy this dataset from the previous history.
+
+> Get toy data
>
-> 1. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
-> - *"What to inspect?"*: `Key-indexed observations annotation (obs)`
+> You can simply download the files by pasting the links below into "Upload Data" searchbox.
+>
+> ```
+> https://zenodo.org/record/7053673/files/Mito-counted_AnnData
+> ```
+>
+> {% snippet faqs/galaxy/datasets_import_via_link.md %}
>
{: .hands_on}
-> Task description
+{% snippet faqs/galaxy/histories_copy_dataset.md %}
+
+First, we will extract observations and the full matrix from our AnnData.
+
+> Inspect AnnData
>
> 1. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
+> - *"Annotated data matrix"*: `Mito-counted_AnnData`
+> - *"What to inspect?"*: `Key-indexed observations annotation (obs)`
+>
+> 2. Rename {% icon galaxy-pencil %} the output `Observations`.
+>
+> 3. {% tool [Inspect AnnData](toolshed.g2.bx.psu.edu/repos/iuc/anndata_inspect/anndata_inspect/0.7.5+galaxy1) %} with the following parameters:
+> - *"Annotated data matrix"*: `Mito-counted_AnnData`
> - *"What to inspect?"*: `The full data matrix`
>
+> 4. Rename {% icon galaxy-pencil %} the output `Matrix`.
+>
{: .hands_on}
+>
+>
+> What are the rows, and what are the columns in the retrieved Matrix?
+>
+> >
+> >
+> > If you just click on the `Matrix` dataset, you will see a preview, showing barcodes in the first column, while genes in the first row.
+> >
+> {: .solution}
+>
+{: .question}
+
+To proceed with the conversion, we must have the matrix where the genes are listed in the first column while all the barcodes should be in the first row. Therefore, we need to transpose the current matrix.
-> Task description
+> Transpose the matrix
>
> 1. {% tool [Transpose](toolshed.g2.bx.psu.edu/repos/iuc/datamash_transpose/datamash_transpose/1.8+galaxy0) %} with the following parameters:
+> - *"Input tabular dataset"*: `Matrix`
>
{: .hands_on}
+And now we are ready to input that data to **DropletUtils** tool.
-> Task description
+> DropletUtils
>
> 1. {% tool [DropletUtils](toolshed.g2.bx.psu.edu/repos/iuc/dropletutils/dropletutils/1.10.0+galaxy2) %} with the following parameters:
> - *"Format for the input matrix"*: `Tabular`
+> - *"Count Data"*: output of **Transpose** {% icon tool %}
> - *"Operation"*: `Filter for Barcodes`
> - *"Method"*: `DefaultDrops`
> - *"Expected Number of Cells"*: `31178`
> - *"Upper Quantile"*: `1.0`
> - *"Lower Proportion"*: `0.0`
> - *"Format for output matrices"*: `Bundled (barcodes.tsv, genes.tsv, matrix.mtx)`
+> - *"Random Seed"*: `100`
>
{: .hands_on}
-> Task description
+Finally, let's combine those files that we have just generated and turn them into the SingleCellExperiment!
+
+> Create SCE object
>
> 1. {% tool [DropletUtils Read10x](toolshed.g2.bx.psu.edu/repos/ebi-gxa/dropletutils_read_10x/dropletutils_read_10x/1.0.4+galaxy0) %} with the following parameters:
-> - *"Should metadata file be added?"*: `Yes`
+> - *"Expression matrix in sparse matrix format (.mtx)"*: `DropletUtils 10X Matrices`
+> - *"Gene table"*: `DropletUtils 10X Genes`
+> - *"Barcode/cell table"*: `DropletUtils 10X Barcodes`
+> - *"Should metadata file be added?"*: {% icon param-toggle %} `Yes`
+> - *"Metadata file"*: `Observations`
+> - *"Cell ID column"*: `index`
+>
+> 2. Rename {% icon galaxy-pencil %} the output `Converted SCE object`.
>
{: .hands_on}
-## Anndata -> CDS
+As usual, you can check the [example history](https://usegalaxy.eu/u/j.jakiela/h/anndata---singlecellexperiment-sce) and the dedicated [workflow](https://usegalaxy.eu/u/j.jakiela/w/anndata-to-singlecellexperiment-sce-conversion).
+
+
+## Anndata -> Cell Data Set (CDS)
From c852d419e5686a8d42a87121eb4ed7445afd2835 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Wed, 13 Dec 2023 14:21:52 +0000
Subject: [PATCH 016/117] workflows
---
topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md | 1 +
1 file changed, 1 insertion(+)
create mode 100644 topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md b/topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md
new file mode 100644
index 00000000000000..8b137891791fe9
--- /dev/null
+++ b/topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md
@@ -0,0 +1 @@
+
From 0e865c5740f133fb2f1fd8512b98e1d6c06ccb94 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Wed, 13 Dec 2023 14:22:48 +0000
Subject: [PATCH 017/117] workflow_test_downsampling
---
.../scrna-data-ingest/workflows/How-to-downsample-FASTQ-files.ga | 1 +
1 file changed, 1 insertion(+)
create mode 100644 topics/single-cell/tutorials/scrna-data-ingest/workflows/How-to-downsample-FASTQ-files.ga
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/workflows/How-to-downsample-FASTQ-files.ga b/topics/single-cell/tutorials/scrna-data-ingest/workflows/How-to-downsample-FASTQ-files.ga
new file mode 100644
index 00000000000000..ed130b53a7fb60
--- /dev/null
+++ b/topics/single-cell/tutorials/scrna-data-ingest/workflows/How-to-downsample-FASTQ-files.ga
@@ -0,0 +1 @@
+{"a_galaxy_workflow": "true", "annotation": "This workflow shows how to generate the downsamples of the fastq file", "creator": [{"class": "Person", "identifier": "0009-0001-2017-8805", "name": "Julia Jakiela"}, {"class": "Person", "identifier": "0000-0002-8170-8806", "name": "Wendi Bacon"}], "format-version": "0.1", "license": "CC-BY-4.0", "name": "How to downsample FASTQ files", "steps": {"0": {"annotation": "FASTQ file containing barcode/UMI reads", "content_id": null, "errors": null, "id": 0, "input_connections": {}, "inputs": [{"description": "FASTQ file containing barcode/UMI reads", "name": "Barcode/UMI read"}], "label": "Barcode/UMI read", "name": "Input dataset", "outputs": [], "position": {"left": 0, "top": 0}, "tool_id": null, "tool_state": "{\"optional\": false, \"tag\": null}", "tool_version": null, "type": "data_input", "uuid": "dac1696d-3468-49b3-94d4-bc6decd473d6", "when": null, "workflow_outputs": []}, "1": {"annotation": "FASTQ file containing transcript reads", "content_id": null, "errors": null, "id": 1, "input_connections": {}, "inputs": [{"description": "FASTQ file containing transcript reads", "name": "Transcript read"}], "label": "Transcript read", "name": "Input dataset", "outputs": [], "position": {"left": 46.4000244140625, "top": 111.16250610351562}, "tool_id": null, "tool_state": "{\"optional\": false, \"tag\": null}", "tool_version": null, "type": "data_input", "uuid": "ff07709b-edf7-4f23-a8a8-ac207aa5a14d", "when": null, "workflow_outputs": []}, "2": {"annotation": "Number of lines to keep from barcode/UMI reads", "content_id": null, "errors": null, "id": 2, "input_connections": {}, "inputs": [{"description": "Number of lines to keep from barcode/UMI reads", "name": "Number of lines to keep (barcode/UMI read)"}], "label": "Number of lines to keep (barcode/UMI read)", "name": "Input parameter", "outputs": [], "position": {"left": 90.71250154284576, "top": 220.03750610351562}, "tool_id": null, "tool_state": "{\"parameter_type\": \"integer\", \"optional\": false}", "tool_version": null, "type": "parameter_input", "uuid": "24fa2d18-c664-4879-8723-b2ce3e7c2310", "when": null, "workflow_outputs": []}, "3": {"annotation": "Number of lines to keep from transcript reads", "content_id": null, "errors": null, "id": 3, "input_connections": {}, "inputs": [{"description": "Number of lines to keep from transcript reads", "name": "Number of lines to keep (transcript read)"}], "label": "Number of lines to keep (transcript read)", "name": "Input parameter", "outputs": [], "position": {"left": 139.11249543933013, "top": 341.25}, "tool_id": null, "tool_state": "{\"parameter_type\": \"integer\", \"optional\": false}", "tool_version": null, "type": "parameter_input", "uuid": "cddc399a-f92f-4b4f-a7b6-7bd785a7c783", "when": null, "workflow_outputs": []}, "4": {"annotation": "", "content_id": "toolshed.g2.bx.psu.edu/repos/devteam/fastq_to_tabular/fastq_to_tabular/1.1.5", "errors": null, "id": 4, "input_connections": {"input_file": {"id": 0, "output_name": "output"}}, "inputs": [], "label": null, "name": "FASTQ to Tabular", "outputs": [{"name": "output_file", "type": "tabular"}], "position": {"left": 338.3625183105469, "top": 113.61249923706055}, "post_job_actions": {"RenameDatasetActionoutput_file": {"action_arguments": {"newname": "Barcodes tabular"}, "action_type": "RenameDatasetAction", "output_name": "output_file"}}, "tool_id": "toolshed.g2.bx.psu.edu/repos/devteam/fastq_to_tabular/fastq_to_tabular/1.1.5", "tool_shed_repository": {"changeset_revision": "4b347702c4aa", "name": "fastq_to_tabular", "owner": "devteam", "tool_shed": "toolshed.g2.bx.psu.edu"}, "tool_state": "{\"__input_ext\": \"fastqsanger.gz\", \"chromInfo\": \"/opt/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"descr_columns\": \"1\", \"input_file\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", "tool_version": "1.1.5", "type": "tool", "uuid": "be568131-f0b1-4d90-b6b0-2dad3a612ddd", "when": null, "workflow_outputs": []}, "5": {"annotation": "", "content_id": "toolshed.g2.bx.psu.edu/repos/devteam/fastq_to_tabular/fastq_to_tabular/1.1.5", "errors": null, "id": 5, "input_connections": {"input_file": {"id": 1, "output_name": "output"}}, "inputs": [], "label": null, "name": "FASTQ to Tabular", "outputs": [{"name": "output_file", "type": "tabular"}], "position": {"left": 367.1750793457031, "top": 243.96249389648438}, "post_job_actions": {"RenameDatasetActionoutput_file": {"action_arguments": {"newname": "Transcripts tabular"}, "action_type": "RenameDatasetAction", "output_name": "output_file"}}, "tool_id": "toolshed.g2.bx.psu.edu/repos/devteam/fastq_to_tabular/fastq_to_tabular/1.1.5", "tool_shed_repository": {"changeset_revision": "4b347702c4aa", "name": "fastq_to_tabular", "owner": "devteam", "tool_shed": "toolshed.g2.bx.psu.edu"}, "tool_state": "{\"__input_ext\": \"fastqsanger.gz\", \"chromInfo\": \"/opt/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"descr_columns\": \"1\", \"input_file\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", "tool_version": "1.1.5", "type": "tool", "uuid": "d87f9dde-5641-438e-bc19-41df8fc2d57f", "when": null, "workflow_outputs": []}, "6": {"annotation": "", "content_id": "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_tail_tool/1.1.0", "errors": null, "id": 6, "input_connections": {"infile": {"id": 4, "output_name": "output_file"}, "num_lines": {"id": 2, "output_name": "output"}}, "inputs": [], "label": null, "name": "Select last", "outputs": [{"name": "outfile", "type": "input"}], "position": {"left": 613.5875015428458, "top": 163.9625244140625}, "post_job_actions": {"RenameDatasetActionoutfile": {"action_arguments": {"newname": "Barcodes cut"}, "action_type": "RenameDatasetAction", "output_name": "outfile"}}, "tool_id": "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_tail_tool/1.1.0", "tool_shed_repository": {"changeset_revision": "ddf54b12c295", "name": "text_processing", "owner": "bgruening", "tool_shed": "toolshed.g2.bx.psu.edu"}, "tool_state": "{\"complement\": \"\", \"infile\": {\"__class__\": \"ConnectedValue\"}, \"num_lines\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", "tool_version": "1.1.0", "type": "tool", "uuid": "f742b84b-1b5b-49a9-babf-d4c777d6a274", "when": null, "workflow_outputs": []}, "7": {"annotation": "", "content_id": "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_tail_tool/1.1.0", "errors": null, "id": 7, "input_connections": {"infile": {"id": 5, "output_name": "output_file"}, "num_lines": {"id": 3, "output_name": "output"}}, "inputs": [], "label": null, "name": "Select last", "outputs": [{"name": "outfile", "type": "input"}], "position": {"left": 612.7750549316406, "top": 334.3750305175781}, "post_job_actions": {"RenameDatasetActionoutfile": {"action_arguments": {"newname": "Transcripts cut"}, "action_type": "RenameDatasetAction", "output_name": "outfile"}}, "tool_id": "toolshed.g2.bx.psu.edu/repos/bgruening/text_processing/tp_tail_tool/1.1.0", "tool_shed_repository": {"changeset_revision": "ddf54b12c295", "name": "text_processing", "owner": "bgruening", "tool_shed": "toolshed.g2.bx.psu.edu"}, "tool_state": "{\"complement\": \"\", \"infile\": {\"__class__\": \"ConnectedValue\"}, \"num_lines\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", "tool_version": "1.1.0", "type": "tool", "uuid": "2eb0cb7f-4a8f-4115-b37f-81e254371a94", "when": null, "workflow_outputs": []}, "8": {"annotation": "", "content_id": "toolshed.g2.bx.psu.edu/repos/devteam/tabular_to_fastq/tabular_to_fastq/1.1.5", "errors": null, "id": 8, "input_connections": {"input_file": {"id": 6, "output_name": "outfile"}}, "inputs": [], "label": null, "name": "Tabular to FASTQ", "outputs": [{"name": "output_file", "type": "fastq"}], "position": {"left": 871.1999206542969, "top": 131.98751831054688}, "post_job_actions": {"RenameDatasetActionoutput_file": {"action_arguments": {"newname": "Downsampled barcode/UMI read"}, "action_type": "RenameDatasetAction", "output_name": "output_file"}}, "tool_id": "toolshed.g2.bx.psu.edu/repos/devteam/tabular_to_fastq/tabular_to_fastq/1.1.5", "tool_shed_repository": {"changeset_revision": "2dcfbbf9071a", "name": "tabular_to_fastq", "owner": "devteam", "tool_shed": "toolshed.g2.bx.psu.edu"}, "tool_state": "{\"__input_ext\": \"tabular\", \"chromInfo\": \"/opt/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"identifier\": \"1\", \"input_file\": {\"__class__\": \"ConnectedValue\"}, \"quality\": \"3\", \"sequence\": \"2\", \"__page__\": null, \"__rerun_remap_job_id__\": null}", "tool_version": "1.1.5", "type": "tool", "uuid": "a816cffd-4f6c-48ea-a784-3fb9b80a0757", "when": null, "workflow_outputs": [{"label": "Downsampled barcode/UMI read", "output_name": "output_file", "uuid": "775c5d20-eb3e-4e43-b703-cbddec30d9eb"}]}, "9": {"annotation": "", "content_id": "toolshed.g2.bx.psu.edu/repos/devteam/tabular_to_fastq/tabular_to_fastq/1.1.5", "errors": null, "id": 9, "input_connections": {"input_file": {"id": 7, "output_name": "outfile"}}, "inputs": [], "label": null, "name": "Tabular to FASTQ", "outputs": [{"name": "output_file", "type": "fastq"}], "position": {"left": 857.8349991014395, "top": 323.17498779296875}, "post_job_actions": {"RenameDatasetActionoutput_file": {"action_arguments": {"newname": "Downsampled transcript read"}, "action_type": "RenameDatasetAction", "output_name": "output_file"}}, "tool_id": "toolshed.g2.bx.psu.edu/repos/devteam/tabular_to_fastq/tabular_to_fastq/1.1.5", "tool_shed_repository": {"changeset_revision": "2dcfbbf9071a", "name": "tabular_to_fastq", "owner": "devteam", "tool_shed": "toolshed.g2.bx.psu.edu"}, "tool_state": "{\"__input_ext\": \"tabular\", \"chromInfo\": \"/opt/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"identifier\": \"1\", \"input_file\": {\"__class__\": \"ConnectedValue\"}, \"quality\": \"3\", \"sequence\": \"2\", \"__page__\": null, \"__rerun_remap_job_id__\": null}", "tool_version": "1.1.5", "type": "tool", "uuid": "fd29a752-b566-40c7-a22b-12d672dfa201", "when": null, "workflow_outputs": [{"label": "Downsampled transcript read", "output_name": "output_file", "uuid": "0d9f4dca-03ab-4e9f-b584-0bbcdf150665"}]}}, "tags": [], "uuid": "c4e88698-a4e8-46da-83b0-fdff8c08d0a5", "version": 7}
\ No newline at end of file
From c52984a80ef8ecd7a3174f87906496a6d906c31e Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Wed, 13 Dec 2023 14:28:22 +0000
Subject: [PATCH 018/117] Create How-to-downsample-FASTQ-files-test.yml
---
.../workflows/How-to-downsample-FASTQ-files-test.yml | 11 +++++++++++
1 file changed, 11 insertions(+)
create mode 100644 topics/single-cell/tutorials/scrna-data-ingest/workflows/How-to-downsample-FASTQ-files-test.yml
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/workflows/How-to-downsample-FASTQ-files-test.yml b/topics/single-cell/tutorials/scrna-data-ingest/workflows/How-to-downsample-FASTQ-files-test.yml
new file mode 100644
index 00000000000000..c8ff1841c07d27
--- /dev/null
+++ b/topics/single-cell/tutorials/scrna-data-ingest/workflows/How-to-downsample-FASTQ-files-test.yml
@@ -0,0 +1,11 @@
+- doc: Test outline for How-to-downsample-FASTQ-workflow
+ job:
+ Barcode/UMI read:
+ class: File
+ location: https://zenodo.org/record/4574153/files/SLX-7632.TAAGGCGA.N701.s_1.r_1.fq-400k.fastq
+ filetype: fastq
+ Transcript read:
+ class: File
+ location: https://zenodo.org/record/4574153/files/SLX-7632.TAAGGCGA.N701.s_1.r_2.fq-400k.fastq
+ filetype: fastq
+ outputs: {}
From e691594192eadc34430345663ca0cc13774627c1 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Wed, 13 Dec 2023 14:29:01 +0000
Subject: [PATCH 019/117] clean up
---
topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md | 1 -
1 file changed, 1 deletion(-)
delete mode 100644 topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md b/topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md
deleted file mode 100644
index 8b137891791fe9..00000000000000
--- a/topics/single-cell/tutorials/scrna-data-ingest/workflows/halo.md
+++ /dev/null
@@ -1 +0,0 @@
-
From 46f3e96f9445070c726ad7b5e953c5ef71f7791e Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Wed, 13 Dec 2023 14:50:42 +0000
Subject: [PATCH 020/117] anndata -> cds start
---
.../tutorials/scrna-data-ingest/tutorial.md | 20 ++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
index 9d2418d754b984..0a4c87a16da32e 100644
--- a/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
+++ b/topics/single-cell/tutorials/scrna-data-ingest/tutorial.md
@@ -238,7 +238,7 @@ However, sometimes it is useful to know how to do this conversion manually or at
## AnnData -> Seurat
-Let's get an AnnData object that we can further work on. It's the object used in previous tutorials ({% link topics/single-cell/tutorials/scrna-case_basic-pipeline/tutorial.md %}), so check it out if you're curious.
+Let's get an AnnData object that we can further work on. It's the object used in [previous tutorials]({% link topics/single-cell/tutorials/scrna-case_basic-pipeline/tutorial.md %}), so check it out if you're curious.
> Get toy data
>
@@ -422,3 +422,21 @@ As usual, you can check the [example history](https://usegalaxy.eu/u/j.jakiela/h
## Anndata -> Cell Data Set (CDS)
+
+Cell Data Set (CDS) format is usually used when working with a package called Monocle3 and in the [corresponding tutorial]({% link /topics/single-cell/tutorials/scrna-case_monocle3-trajectories/tutorial.md %}) it was shown how to transform annotated AnnData to CDS object. Please note that depending on your dataset and pre-processing, you might need to refer to the method used in the mentioned tutorial which uses both annotated and unprocessed matrices. However, here we will just show the main principle of that conversion, so we will continue working on previously used dataset, so you can copy it from your history.
+
+
+> Get toy data
+>
+> You can simply download the files by pasting the links below into "Upload Data" searchbox.
+>
+> ```
+> https://zenodo.org/record/7053673/files/Mito-counted_AnnData
+> ```
+>
+> {% snippet faqs/galaxy/datasets_import_via_link.md %}
+>
+{: .hands_on}
+
+{% snippet faqs/galaxy/histories_copy_dataset.md %}
+
From ce115551451212b28335ca708d57695e1531addd Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Wed, 13 Dec 2023 15:32:56 +0000
Subject: [PATCH 021/117] data images folder
---
topics/single-cell/images/scrna-data/HCA.jpg | 1 +
1 file changed, 1 insertion(+)
create mode 100644 topics/single-cell/images/scrna-data/HCA.jpg
diff --git a/topics/single-cell/images/scrna-data/HCA.jpg b/topics/single-cell/images/scrna-data/HCA.jpg
new file mode 100644
index 00000000000000..8b137891791fe9
--- /dev/null
+++ b/topics/single-cell/images/scrna-data/HCA.jpg
@@ -0,0 +1 @@
+
From 8b5e7076e57fb3b9b2ec4fd8351ddc4b012c8205 Mon Sep 17 00:00:00 2001
From: wee-snufkin <44121095+wee-snufkin@users.noreply.github.com>
Date: Wed, 13 Dec 2023 15:33:45 +0000
Subject: [PATCH 022/117] images for data ingest tutorial
---
topics/single-cell/images/scrna-data/HCA.jpg | Bin 1 -> 424093 bytes
.../single-cell/images/scrna-data/exp_id.jpg | Bin 0 -> 204660 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 topics/single-cell/images/scrna-data/exp_id.jpg
diff --git a/topics/single-cell/images/scrna-data/HCA.jpg b/topics/single-cell/images/scrna-data/HCA.jpg
index 8b137891791fe96927ad78e64b0aad7bded08bdc..61c3420bb6e49469ca8fe1da834b0be4c074cb77 100644
GIT binary patch
literal 424093
zcmeFZ2UJttw=Wt5MVbgGAVpL_P?|`uvC%|8Q0WjAkrIkX3lb6m=}ko769iOxjr5+-
ztAKO}H36hULJ5Jim+zeW&i|Zy-@W(TH{N*njW_2Q$k#P7d~SfB*gWAb+3!_gVB0`&s6*fA{!bJ7_HcuCt5-%tnk1*8r!u
z7#O)2XdM6%0D$2%UE03|{x1i^DMqH#XXqlave7$KpQnq@$asn_>}e(@dha0m_W&lY
z)7)3(@1Ef?eZhRq>%#5e#P4TC@0GV+G#kc=DZG3e!oteS$A3vc{JMnXjhl)}$||aA
z>h~Y$=<4YkJbd!>nYo3fm9@hw$Jb8IF0S4_zJC6YfOnxE!onjWqoO}0eNIkE{p(BG
zkL;Y>y!?W~qKe9@>YCcR`i8dlj?S*`p5DHZ(XsJ~$*E~H2D`Mp@@I8zeFML@e{e`R
zA|9Xotrr7;@n6;YH_iSly}0OloubbH6Z7ACF`V+JH%2a|(^uusaNjj$e&NM)?RN0l
z3-=Pgm$$NrDwyFezI;2($}6Ub5y$_n+P`S_pHnR4|CVO|rr1C9LIcB66v92x@F5V{hXx1}`N#QpY#VjVs0&pzKqiW~
zP6Mz4|80Qx^?uR06qE}MpasW|QZM|w0T|wHUo<4aMyc;;fTeu0OZ71
z{dXgr?yq_#_YbkM|J?{|ssB{#|H;|9hzFASK!iMe>edWNn&@Cf48+reE_WOK}!`rJg!24+IFR$ONFY==c(oHQ!z1N8fVdX-G8JG%bu_b}zmAk<3N%4$+^=>O!)HAbZPvvMxjRpVsQhE7qjFHI809^)&fI>|$twmjw-g
z!2oN36b=wK4S+ME0nk!Qe31~{vVt*E>T%Y{p>~9(j
zhs&A~p@t)(;Kb`R!1e`rdmG#hejukrFxp-<`3M34=3;55Mf
zM-o(KAoULQ!y00>l6skk>ek089&%9|=T=$#w$0n?(nT%mXJx1F=_Mz*jp>
z>fwL=Q;dJ!jeo9GsQvO39IG|
zJ>O3M4}+WkS@83}^gWL5V>S{h>WHRAF37Vu?R1f7>P_M|uAFrMbz@LFF2JuPL6)gi
z^P^=513*EtnsHXLWcO@m(Ory@yi#w;j#5r_l;=uiTz2iJrRVzsN-r(1x-D`W%cl*0
zI~6TSZ*HxzGC$uFH4KCpZ9(s0;&Zl}m5{)WH|-9H*3{VU#M9)UOlfMi+69IgQ=JO{
z)4QsOuhj^&4OXHXE(EsbY_$_@2Tmge>Xp^AqM;A>gFeh67DCYcumG#T^5@_1#*>U|
zXelfzAq)2y9tHeqmt#t{#T|XneAv)*J5J;=u5_jq>3fOA%l(aEQRdEv;L%HnA}R|6
zyM%RWlj9(U??`^DpQs{wip5KB#bw+-uP}JVxzaj%^@;wD=)LauYS&XL$VNU6wU*uZ
z!xOVh_n%JKANLhXo!w15
zY6k=rEO=xg$O@!zk71oRz_U~pk!TQ?w%8hQI_m{JTn;L0{}DwU{u6}yHM%Va9ca``
zO{jL8Ng;h1Qav?Z)gVPKOa1fPr+$Gx=Vv8&TKbX
zI4!ckF&ECm+q{>w^x9OZBXb0~3Z*tmHs$dGs)v*%s}i&n4~xsIj!v7V0Y1T#?i{2_
zEl}A&X)koV8c^LF+@ofAk5nh%jMC7V_2NR%biiA^a$zxN6vV=1Zl!ikEcWe9;B@;E
z1Ld3cX^2f%gbB4*TkNOdZuv14K79l~M=5UHtO}B}&YLuZsnjmF=G9VbXaGgOF;ksW
ztdc+8vr3kEW3xJDI6q{bPqG{nZK#WKj6b_r^UNjxlit~a;OLOIfr%}O;XXc3u6!Ig
zC9fM>5n@`NOi*1?JbB3~Sz@QxrDuXiX8oW69Kk#>M6s-Gyp2ai&D5P~u`kDVm3y(?
zp?WsVhUrgDbpRKSk7)pA0eEi)CI&YZgEUq{)rR
z-c(oQ>_QdjHV>D3i^}P2VCyj9V-+xkaZE5?0aA#flt8B)wUwo(XJ{29{I)1
z)NJ?M8EY4+NrvKnk7z8TbmBL`$X+M@f)becW-5%o8I^?DjdAzbw&RsiHY}B%oj(=e
zJnhMTNA3wyNAnGb%qU#0pZxnImjbsIj=Q*WBDZ}*h6d)NSMY^vzc{x*E$Opv;qet>>e~3C58sI{@+}7^)j8Y>>CF9SrASwbj
zK6ltsR6Ra<*gz4PmD+SD{t>;Xgi0vyT(TKpzJr^LYsN1Jk2<=^I$UX{PDkywp`iu(0}hk3-&8>5H!F!?sEof3)29ekkIz|E5l{t^)?!ImrW{dH~2=?
z*o3^!UjKC4F8<6b{^gqC0UM$t{>KnjyS!-qwo6)V#36;x!QSOvTIXuFU}(ji-@RhS
zaUr+kr*7VD%||Xw9==)kuJ{q+Wv}N+dI5oV@PfDoBi#K9hH#TCfz2tZvN<55CojWYtU7&HJmyw*@631ye|5Ul
zQhKvqg0HW~NXh4dg$RCf$uEkeNmfMREg}V8}^6>gvrA2f|H=^V<#2&S|otCaed1
zb(H)jEs6I&!v2p!pG_=u?5?=HbN|Y?U2AsEO1Y<};7LZ8?lb<)p1!-JM=nx}B0QTG
zY3B8La}c0EAurKe2rn98b6zYemn~(20oL-O&?@#XOshP2t*sg$Ql|>zBWD
zWL}RmiE2`F5xeGGRxK5$we0%4xF(`9Do<7rHnjMQ}wh-c71F
zNn(Zu__^iSOai8_1k7BhnVZt^j;{kgT&b2r+Y1J4xm7K&6Jt6~#!gg+-zAsAHXEg@mpIq!+R+|vgr~fYlVZ+xDrKj%E|(6pE0d`y^!jeJn1#K
z6MA7j{#QDwX%09rv+v}h;|0G!l@$p`O5$FpNo&*B1dCsZ4@zNZkJ=k4o(@yapaC}U
zu?fvz@zMDK_!AA3;DR&kGHxic$>w_E&6y4VcP>@&qb6VK_tFfbu;(^%cr9y_dzhJm
z4ZyXBwa192{5&cujdE%2f<+e8l(;X~)?Q$1w20u}NK;NcTZbBVbEsA(^u`U|Gf+2@
z)KPP|;GrJ;=`71q7W#U3+X&>IjDpTYlNB&-#LB0xDzDn)wkn2)?{!_;1;!UW#}z@6
zbM)0bxhCxP?&8Jd#ohDvko5b8#oL@uaEI**H!4t{<_$hFwqBpNa%kPSwR{q6UDa`s
zC_#rD>0syQ5~2vT%{rg@ac*+g5ynD?F6mq8ij+1peg0AkX@DFR-{Yf8@Sbj28UT?+
z^5NVZ%Jw9G5~2f_&$CD|+%STv&czcJa`*+hz5UI0YJiD3(?;3h}89G9v)g
zrwrm32g!QGYE0G#byXBzxjt_#rDTR{XVsECLEQ-L7kSQtP^SEa0+T@T)^R&u3Z^qe
zO;s%1vl|O7eP{Upyt2Z`^gaj7M;S&+e$+L@Z+Cw;G7}eL7xxYE8
zF})J-btJxC>t)o1hbA5r9+D=?M}?Cp4lj5%ASL}*o5x?**98Wi&mE1r4zK5{ttS*r
z-rZNrqyZi$51Cc`m5O7F-bbOaqCa4R=-6BRirTMg@DGO{4p&BeVI=q6UFP{c`4>G;
z!`O7yMKMH<9bIRpH&o~m^cQ<-8P}#tSU|>F5m+n5m|6qcKG;;R5O>f
z)8+LUG9NX|ZUb0Z7{wCDq5*U?{U0ac^R%OU9rvvk9_iBnDgF|_^vEzAd2`Q+P(lNQ
zOmBj?krG6pDbd#po4`VZ>m)mlyXBuhGZvX7oe#cs(_x7z-ed{n3v189nb81esk3SG
zrMb>&+RZtx>e5`Zk81Iq6^<`;pC!(Gyt^1Y_Dof=Ok8Z}yHB&tc4u}XyNbM*m{V
zR(G>)35r{f@HF~Z_0#nGm%u2NR*^|usiOM^XTgAe=a0ICgj&>jy7PFdB#WaIDiweg
zslMV&zNcwwBTo2`O!T}%7d0cydxKT#k4XZs%D+pF
z0aAmvU9>l%+433gGo-(X-
z|5Q+^`=vAn*)x=|_b=-QZ!1L0yhwHa5q;-^MIR7nWfFO
zo-d{2e#wOj2WYE1FTE$brXbTeG+qC9z@km188FZLad;j7i~
z2Y5}+r&-%tOmt6ISuB~*m)gwg5;BbB?lKRU(7x^}&>0pHs~ZY|wYv+<=lH`6znC0{2fR9=NebI4(v6NMDWF{Y;}@6HX9P6ky4QUwoGAS
zzHgjDSBeXJbft&5w4B}Kkt+Y$r;$B6ivT~^mq{T0KE@*$pWTv{5Z+{xXR~o~y_hTd
z5Bf#>xo;tA=FCjDu7of!aT#f_6lXFrZwcc8pW#Fok*Kn-m#@|wN34Jh*Zn;6*HZ|4
zCNiU~++Cynar@^1(o=v}hpGVYXV9w{8&dR5VVBg%<6@|^-qI?^4L
zFYYXVGV!)nRPhQE<>=FU6#L3A_s7S}K>;{V>&y)+zHZo+DB*r4w#(;vMsov@)r%a4
zSmusEExAW{-O}O=-WM|S-z80jgQ*+0_iRrX6V?wjhgq<%UL?PHnqX>0y@(6XSj-T!
za!Dx!yYVB(d!@TS8E7UQ=6hM9*kAKMGgL@^%%);~qv=&DBaIy>cVT~rQ?!pa5~dACcF@!U2}waW$H>sY?4CGvhU4}yUb|hUkD*0g~Sfw
zA%x?F)DKU<_9FNPEGv3tMEK(%jmIq0hGq9TjrzRMXV?_AMBSoYDztHebr)&9?1QWy7aQkkKD49
zh(%
zI#Vq+YPr_$I@U&rymkmr_#pH~ZL`~&@*VMoDhzKGN1lVq;k&+Ig%yk@;8luIot>zR
zLXB@;qoRyT2c2q)1a4IkbShRm8y8A=i?5A3h=fv1?ho(CZd>m^R2krMm@WXY&$#8*S@+iRE7?HA)tBqrM
zkHWhqV8waq$cRDIX-%&ZNF^aZVsY*$;jkFR4q-NJ7%Ne79FrY6>NFArD6V_d?ZdAv`1|rEBx?d*G5kyf8SCIQ+CCCD&G8Zh
znM&7_oiDsGaM8*p3uQ0QX_gO3yu*KhI?KxEbi8PQbMP0aa1bl>S-$Iuc31&h93Pxu
z)J$kDaOG8(#Z;wh7)CAER%^Wd)++GA!1TSBozNz_FxSzCYCCAG9j5{8yzO=@(0ouk
z^hq97?WgD?X12NY}gS
zU2j_+@n0)o`^j31W4=qw&m})0f=iq;d5F`VFA5b9afc?CAd`>A6`RfG4V`@JLq@dB
zmTex&G6kAXoK1Qa&$=kPP}+0@=ihG6I^x^U0W=7fZZZt?EpYYQSFqI!Q0iAOwt6Lf
zYbE`rw*8wks%1|wCR?71A|dY%_^3h^_|u3fth4l%ho(u9{d(Fv75>_aOw9JTmSc;)
zIKRT1bxhG+sr7v%U8z4wCM(wucN;DAi|8PaQbV7~@_d$RY1QcWF4(Y2E$|}HHQ^Lg
zzJAhoo2{)OFQQ=cXkn_Mq`_{YQl_Z}ujeNF&8IGoXYjVlr!~v1(=|KhI1^Ua6Xva2
zd?g{frWwy1f4D8>A9etKP(2PDq(v9Sa5W
zIU>R^q0K-X74J}E^v>Xrt$xQ>rItTDKqBA~%K1t7etVSv`;~scm}D-W$g|A=(7^TV
zol*jF;9E+inVrmD1!-;`@vOPwI&=;PZl_8Pqrjf$$Y*7Oy73A;;xbt6Z3nPb=q)#6C$n3i_8zo*8e$TbaUIve;zE04jgX{qgU^XY$fIzj8s6
zp6U*leJ;27`O%g|8Zf`)Ui_fZE>+MnWU{sI$ggqlNqS8!s!yK~9iIX922C8lKcBC4>H_Kw-z
zV!!U|YSw?jUVeN{vyx|<7mhPQeK0pyZ(_rUN|43)((JQ~jFgK5l?HQt^ZKq=)@3^V
z)hk_iEnN1O^&=Rr`JG&Z_C@E*+!LB6@cb#ZK-49B8EUyihG-Ns
zsf1M3Ua^kRPe~^8%U<@#C6kptiXzyqC}|mHVY1&qt!*?JT1HGQ5rXmlUBEbz%0IZknAF9u
zMjoWcfa2_hfBOvR_L2LqCorL=q7-kPk&aH!P4}^!GOTmd_)Da~7d2&rfz>aXoPqcd
zVT87J%&aaa$3Px9Ej+!zg-a3kq+58UY2CYgl;LyF{cXFJZT@mh!c;m29zvEcTsr}U
zJ+B^D0;S#i!6
z*?VB!D|rk%|K@m(9`%1&9Kf*}!e`LCm^R`OHj6Ap0k!IN)V?!>j6PAwxF^+ms`ny3
zYx|9^xm(q(zQpo4ZM*Nu^;rO@!x+?;q)oKJ%zsx&fP%54U4BT!yLthr>iWlWRC>c<~hvTk*rRW=yi_jJgzJI**0h>@_9sd^E(YS5Yeu;Q;8
zkLjavjq2Q
zUtZ0|T)8JG=oM`H`;Td?V_7`4=_rN>{e1T-e^}nXEQpDHe3Y;;{D%=2th2m
zvbYdPA@Dq7dRN10ID)K!&(g<{`Ou(f2|UL@SaM5Mn$2B!0IT8KZ~a$j0E4*5g{qyi
zQX|^eAxl=2NNr^Z4e$^bpNq|a8vxl6P%HO5VkoG2VxZ=`iM54KG|;8P_JjXuk6@;Ua#ufUck^r9NPn8A$Tbv-2U2cvJAfZ`FKrjoDztS
zZkNWY++U7B468eMy*6sEO;6lQ5J0!{vnq2{C4vmd%9LoB5L9d&y?Sr>Q1!~R;+yqU
z0cv(Yj+NL;aCJlBSZa_)jEtZQCZ9`KtEh49z?w`xX^mF(PZH4Gmm8W;0
zGv>eKNA$dKcT{Shv5A!j=x}c{g|%R--rA2mv2k%6w(6fd@VBULR(v2vNeg|q=|4Uv
zmSy)Wqqh1;Ta9RNCE`Bu%yt{13&h18#Qde;3EX)o#+rO0-rZ#aK*T7{aSwIAndSi7
z62BDK3i%9{BcI68AATPYR=$Jjud<@)^qTz4co+7;_k>sZe4IK6y@Z
zY!6C1S?qb8{^i_umzB18U)(H1ux(8>eWP3_YGI{jj^&!9ynQ_j7T_+(tn2j!8Om(U
zSd*%|POFqm7Q@)oXvLQXy&CZ^QyY8Xm7aZc0BT*XHe+Wy*J)_Lqn7Mw1|q%Pt=vK^
z30SlQo#`iZ5J@H7zSyMz7fg&)&xi@{M#T(YiePi=HhQsRO@1%?`-4^2G9zygtM525
zlq65)BzkANAf+eB7Qhc(mBOVFaR^P3yqTHev%e<&Ym5kafS+ta267VO0Kte!dr8V)
zO?-6ED=G{3m%Yp6CYHHe{nb7i%va+zKXd+0Jmf|4%dZ>*wFA0RNwMbFYf0yzw=RwzkQdUhOyo>#w{yPUS{VLndWBuGX2e^l}F>#>Y#t`?B4E6WA9Ao
z8k3@Kq-`#g&p)nb0SW|Iej#@3=Q(Gp40)mL7Nc}@5hyt$QQ(Iz7DuZRwUdp
z2E@nQQ45?l-o7#rL3p0DrESicOwIq*Gq^oIPUN-&V^g94U}7f(QQA6SzwJ)UVh^v4a5~Fg7
zB(n!7a4{$Eyv@`-0lWiAz%uIe4@uDHVecoe
z-RB+062pQmk6xs}g1{}>*I`|9c;x6)+(bG~uv426e%>|96**RIa;eo9V{=V{+rZyF
z?`}a~mh+qXd(znFwx9aEv&yvDp!}c@i5q+U1#s65fq~y?;4IPJ839TCA8hq?I{bqH
zrJ{Xh6VXS8HCZ^%K&k54XS~DB^MxpLq>YqIHOX?%go&tzl-i&HcqJw@9kFY45csga
zz=v2;y_qgH^6c>~)o2}djj*J*3}mG++^RjEuUn2EDqB6#bhm8A%GF+=p>E7!^pM5P
zIA^%OTBu68Bq#Xm_b0m{I{wL{t}DUx;M4tnI+s*
zRDlrjdkk6PM_ASnUwoS)CK!!BAAJ!*(ys)wDMwa_H*thKzH(K*Wjk#!<5LX0Us&_l
znzS=c(fnvIPuQVzZ*z%O8t_(4{}vb*@UmPJ*uR9B)Y$-b7WjOko#CFpIjMXjx0{nq
zDl!M8u1o3|LTSlIFTwc9et2V48B}}B6X995LPs5)EHfdz_l2xWQnr4mSu3^iK37#;
z^6Cuij->%!qnIH_9Tw`P)O1K{?Qn@joMVyQl=#WH81=h1#oC2nI29ouY(0XVtUh+Q
zo6ulhGtUoaB?h($JVo1mP%!cs@O$NWoUJeRru_8XxD^{Q@{jKlj)Di|r`D)qceuVs
z-_9Idx$3}h=Q#5&ZsG_l7e^MynDDNh=yiZmT&^m(xrGfr*tH63M_rYFM|lje_M*;H
zpzIXyBZOv>eJIYUZG<{}qYRSOL1)iLmwLXK@Q^N*RvhsA)3#t3J^!*OTvFIf*S+3B
z61vmU()sRO1WAFY(r!&0Q>189drJH5O24W%V_o{CxD8|E<)&MEB`6^KcVlToTNn(7
zcjxHlCzqp|qocPuN1&JE9$SmeiDz$)wzC&s=nnoBJ>4=0Hj=AJBiGFA?9Cm$gimIY
zD4WP$A3eGnL=COHW_%9u$kh;8{nof9#ua9G$^Fv{)02
zYbQLyjn5~YUT;9+gQ_g}R8Hb1vVE_WChv6c*cym_uq~fDH(Rbc=)DiM@J*UP?TH_`
z&}oh|z#~cm{Ru%tezBmyQ1j^&X%uESiEjBm<9YLcz*~Vn+Y%2^=?}COh{?(cfkk&(
zovMOMzWeP>ElbCWPL;+My2ZZ%Z)L^8=mhpKpbKW3?;f5x#%&wwT{g4McjW($GC;2J
z3V5PF{~(oHqhoK2rT%Q!+i%JoP3Qf16!Uo=H`5ul3b$=imjPMZNQ3}Pzs$V(e~>VmkMm@H!z%LRZr?s2hx=<-V$`VHfzq>(QzB6#zfopNXUOG|T7
zL_CpWWr&^2bA6Q$hBV`U)jw-_>9===L9NeZY82Ba#+7jfYiOfUg{-VfGH?Dg()Q}(
zLxd;eqnGc)MfL`sK2Ij)gznxqwmER2jDAi#&P(kfr@Y&@DFW|CN0ZXv0d$LB)g9+6
z!UKV0EuxyP%!}5-PqAE0w`{=24JNy|___PpN1h7bWpfi!
zRJgq}yB8(m4iAXMOAAb!Y3-0SAPXh_&!|PpyritXMs6}Ws^ek#CDFa^Uj<(*%q%oB
z<4vZA+C*?6>-IvmqaIarQaV}N=HR>y3v-^%8+y7QhuEW}6j;P&t$N=s*BA_dA#51q
zU|j$G`q2X$&WiRxsaZSy{a&qsWyDcVTEL~;WRi!U1b}^!!FXG@zv8%2Y$3^S(oX`h
za3odhY2@yXTn-r8TDe3FErjf1wYrY9MUklwM`Dy8Si8q)-l+X;07Q!)okNB+S+r^k
zrnb<_LyWh1uxGwt7q}&&6pe1kN!!cVJN}##`XG~S6+zM{>`s~a*kb^^rP@8I&5S#f
zh+Aki*A^aj>x@sxYbOMPy+lzdU-9)(4r6-;N}UjYf*R464kRs?|9%}m^f1|}dUWAw
zQ>sb)Gg3vm#pjk0r$6&OHvR({v%iz8YyxY7f@U^1cHt_prH$o@qtOGDV{LAuV7?80
z3@H};l1?iOGY*qTdDW0)pCM=ZFoamk8yglp3)uhpM(xtls$7Iqm$h8$P&7=g9AE65
z77@{8QaneuL@`oMRrPy0v%L76xIB&QXOCZg(klEJn|5+i2jYbdz}WDpsMYamt!oB5
zo&pk$QJ!TlE5`)n>O5pV-DO{Xqi|CNaPB>;osG4f5;1>&O7zD=>*@T>SCdQLU7GT6
zEN5I6zouR(aNo0wT>Wc=m4O_P|@vnWaYj
zWT#yCJCB$GJEDS7C2p|THA(mP{9JX1N|ewa7RSi8Ut3`@f4woCJ#D7Dkk{l(0zxdX
zvNa7U*^YtdzFi?n&AOm-=hMYI)OzC0Yd$I5WE=*)xun`<1hghHVuZch((I$r>Q*i%
zmpJle(={8QHOx#r7k=K>|H2en9lqVI)|;QNG*Yp>`Ky*5^ddZo{_1tpyLrg3sEpdR
zgbb+NQif+24iS79bf09>(EyBJ9IfKyVTu-y)`_$etL!RXY5cKriR-aJi{Ncbx_vq4
zgy#%{JA(vWjU_z6V}l1*>87q
z7A1~zgz@m6*RuPH!?NA4#gRd|y{ZF2jke84tqJTKPl)jb2d$#SnhT-k*8||ATo;N$
zRG@Y2upRY@w{c72bHIL+aWZvVR4mOi+XUZ8MJ;Bs6cb^q7``@Oc&7AkvI*8^z+-30
zusTyP?xjnKuWJ5Ny@aijKTNFoEArQVqR$!hs#a{ys}g(V;+2emdc>MKqABZu9CNY1z>ttAdc
zh=a~v$zno#>b|wTE64eLk63)$@5tYu3JjOjw3F%XCp*~*TMAlS{UCu$3C;nbGi1-M
zsvjQyiBWVbFE|!eew*@SI{tUyD{uQ4EQom>DTgbah$^ryIkDS1g9g7D;CJrnnk{64
zF+D34)UU-+6TuEHB1vE;?pF4|7&je&WN)u3!1ueBzyZbcn3{ft3X-B`tx#-n95#<8
zoBT;ekdH)qZrcP`)0n&V*c!|;e+M1bjQ_~16Mbv=_SP!*C%qEgdb#O-o1dxJ+IIbk
z5$vFbo!qn0&;4&C4CF-9kIE_lMV<9m!i0nzqEC3bQ4E@LcnM2^_*U()lBIiYI)3st^p{e1+b?pZglA)9IoYKzo^3gnecp})}Us2ml-uQ}#
z{vg{aNKe<6la|zPs%SsLrGW;B(_}0qra!~KjtRi19Y)ILe$o)6Xg{!cBB+(tBA_gK
z#eL|p!NqN5AY+qMK3O}xtv9;^E#CV&?ULgsD~Y#nUjJSWoVGwDPp!{qK&S~MJp
zsGx?{|4!d)lyYiO(iK7HiJ}BooG1Az+CHO1aOUivMuDR!#LK-Xd(9s&>f3053T4SH
zsbNj;Jjf^rS0(jhV_pPD$aeBR28Ym8}k;@3_GG>vB9^bq!h>dpWcX$ybguiI6_X
zxXoFyegeJ62Jx>vc2;LE7o%RUU$_iCja%r5vqMy?9wyg+5~=KSQ|jN=a!Mdo$TSTX
zABz5Aj#oDyM;G2us)Pq;i1%K|y59-oA)edCinO5^h)J#H6Y3t-i{SpoCv=BGGiCDF
zQx-a_$Gd1KyW+(MZ#2fqwKvjBd+B(@ElXnN2Ag4!`9$}l25LwBzFF7P$6cx`De}$l
zXHuLa)Q)umU)SOk+SOOX4h96bEUaN!*>tu@a>49+oQHg@)J(77lCW;Tu5rX7JX}Wm
zaz6&5I9W5i!>?I*dUn`EDxC9=;s(~?`Xb9)Qq+cviXRP7x(zpOfN6ZLssxQ^P~nq_
zOY^eC7%XbKvCBI1eFJ4T&JB*?X`Cq0%?7)rrun4wU64|0@)GTs(_QA+%ld0l3)dwQ
zsgmD96&+E8M;`IjR_3571O!&&QdOz$#MA4#@#CI3meDmMA(9`1KL$yyi7-Ohaoz2W
z#hY>3Z7!Zlid=Sf8!D3m$z%B7U_qm|dj>x_7w2k|x|IyuK$ZRUH8i0MrD$4@x$i{g#mt789r2&qSeQ=&xPW>#hB-`_|gmDd}WUEGhEx$BIYi97M@%UGhK!uMoM)@X$?nR++w?|z3$m>>8D*4^fn+o(+Po}C
zgk#v6olGl+n_d)v(|#Q___j|C6n3TBV4~HyJ|s#-`De+5zPK~UQUEnAn57Ph@FEor
zG239Xy39%4-!DRz%$n3cpzqYxrzks!b!K$Dynkiis*!Oo`Xsb#;dGNcp1Hk7z&8JE*An}X&xl#7xv>o@;I_ye9C
z`(f1jU_hb%BWB9Ot(@uASN7{w75m2ol)K`n`^1*bJjIQowb|%@eBzcMKt$kD+A+0V
zav^5Z#L$kT5xdQu%DY9IsRGe+6;rb!TIT+6nQ(n=^G=N}i?D7f+>$9C5rT3A@k91T
zyPO`4Yig8ipg)|*SJZ%|YU58VQl#=AXm9DP+u`v~0sOdprrO`{n76(x0?&cfwZETB
z3ewt*$ldp;NBG9fOpFe8CAiu943)E%pXOtIlM`FeITuI(<3Lg5XUgS)IhwV6Pjcse
zojSotdtQI!mI8kE@vc-{@xG=TOlNh4zce$U_!yL$H-wp9ub5J)p7hM9Z#W><&bATP
z^B|4gsI$9yBh_|N2BQc?C-?g%nd2#Yk9(~3NA?57F5R>6wlR!1$y0#dz)czwDYykp
zL`;?4lMW=ayM!*ci>b?i>#iq92N$DYOr*Fuy5QS+X75>tQoPgF=pqduxanVuPR=a6
zF*avUn9%Y#VG|rFDkRN3{qp?dMICeY54ZT;qESnr5bewO12igdK&H_-ho?hBn7=6~hmilnl%|
zl%hh?-T+_P%DEbjva`{k!zK8gi
zUGWD~Vt$E#rHZD&o3;$)UyG#*UZ==xQ0AZrr};^ijqyg*pmorI@U#DG&LwFY6avQ?
zppG971=9dq;zjf#ggIDX7idquAGNtkont)NU!!wu#Ul7=fGG(owj-=xeaa3J9GvCwjKC552`zZpRPQAY)|s{wmG{+!8D;KPAJ7BK
z+)XY7r{`kvvkr8Q_26*V#x760h>*jbV(f0%_d6|&ZIg8($69urtqF|8#5DE68_eJoxho&`v|o6A{XU5QowfYHzWpxtNHP*
z*Qvn8e`H3{%pqjbR;#8xv&*%H=AJ=27nNGP;lSQ~)oZSL(~&P;>c)waTf9*X@iUw|OpZ
zE(jt;?8$b-X9YxashJ?4xu>k5%Z{iVd$@{)*_|sNy+T9N@L>9)@9y@W^nUaks<1EN
zExMgF;si
zpbugDga){KanEsROMa=@Y!ECe(VlUeju*;Gr5D4u!7(4g91Zw&uV;MZsjNekxw*qS
zoi3=&t$cg5RCY%4lr7LHE!PU_HNJUdSaPPIygDpMAoRDdBvmq%H#J`INaG?u-#sbIEvlAkI@Y)
zfw!?a$*0Yp75`}6KI-ix9cf~;s$IQ~!Wp`=E%8?42SLQA7K90&R)YUT8s^(x+UT$4
zTOYaG1?x=GM^Lt?*I83~Em;*=?FcT2L%UQ_e;zSo8WBfcS1fIilPvnF(=sy^I$%cm
zOsAe^!a0Eso;+an?hh7LDh;#X3)^tNilS@fZdaZ@R@0^wJDFN{L1PJ==lM)n`>x-7
z?HnR+A2!G=66ZWqHsfmfwjl-Dr
zMB<=wOF-VWr6*xwS>d7?yJmKu+&@Oz**q5v?(MRo6Io@UB9siE6C&p1@Gy-mPY0~(
zs^+xa9|q3(+1=|KcZd;u@2%FqxGZ@|RXh1a@KGjHLoha(SAW^8EcSK@CllA~vl~{H
z=Jm(vbjscIJHGAvq(G?kEg;BM7r_j;uNAtHH+HIA*;U_!s-lf}uJ`{j=(ghnt|h
z>SfR=)C*u3J^vW51muQjwAGxLR~CgEcs$zs<)G`{DSEC$H)kn~QT5WA)TDEg(HiUK
z8+sL+UMJ!l`C7%OtfoQHjLWS}^;mVIq+iCevbnPkQE#;O-Q9wuvJu>rCX{0{h)_l}
z%3gBZU397~=Ts6F6yioU
zDI}iSwa0tDr(SdY4cfHk;cKoR^%Y*!Q@pd%Cx2CSjkWmH#j_`RgvUgKB5EI!3-8$l
zino{li`dwicwf05xq_&{3A}4U_Ccgy0uEa|>eT7U!|_!Z|uR_6T@<
zxt^XZ$SMbIo8tFdET~*~cqa|OFbe@&vs@(mo!qsuR!Rh|bliN)8hRA&HBp63aZ6Cx
zMsRLUWZwAgR;{J&)9`c5eW{`5i}u#AdbsZ8j`MJVdP^FBQ&X6;9R+ZPiPR>qhTa?9
zJ|O0Jg(tpc(w7qo2*0m(YRSA&&C;!d`V;<9e<*Rn+1~^PgP>S%OrRo06>%sMFCs*m|YTyUZ)}SjpL@23dwbs8qBwFMBt>V
z=@G^kD5vC5yIUgUx9=4T{$CK_-fbz3|Go%Pu1JwrZ*d&`V+gN|*(;H<*u@9vjw%@{kpIM@w(BVAn8p$^6fT4~CK$g+~#0FVj`L)u7
z>R$SN5KJI#EYLIN+5e$?on`lr8tq953cv%nTMVbl{>RQgFbW6Kqk`wp>e?F!KSM;fWv2zlly_7Y&bZH`d&rkXdFcY@Yx%ZUc$OzJd`@5unUzR
zUlxVEFzPd4prmh{9^mON_qE*Md_VWJT}3VbX2Qcg?=9g+uR#`c!v3d<`V-DDO@mO(
zj%wZ5#lziRll$-g+bfvT09?XQX*vs8q?-mf8px*sF4MO&>eW3W8~xeLiUJa~=@sBu
zXZop7eP2$k$H
zS;szhA(S;^n<7~pfT};0y_{g`$YTD0Xqeh
z795KpFK>V^43T+;*=7d7yGtYpL%W0oV)}71)FWYFJrnK#yn4mvrN$$2a`7~+ow>XT
zDg%MGkJxkpjo07A0TO|!0#<*}U5A3?UK?4)G!4+cQ*O+YxM|@~4g@LG^AEbt?|)yY
zr{1uw5eoE+X5%)P%6|uUn3JL1#z6_fsHog+VE`2JK6siYj{Z$vrI^198~V>5lw>4D
z3r583Gfjjc9k$ux59dK2{FaGw(~nd|dyatoK{uzAO9@8)v#>zVLuSipbvQUm(F4l`
zcR<^GM)z-D)7ym^G6pkS=MFZ$uh7ED2smb6{=cvKTvb8uFVP@BA$A8Eh;N!Q8yR4=
z=##<=^BrHV2CPpSA$x@1GQx|m;yfzFn{B13D|5;+7r~bRH
z{Cz+CU&{aTx9%xCl7jRzc76lpj-Q>tYCDfhfq47ebNzR!~*9?#CKqlId@ju0Co>Y8b{2pih
zuR}P+m(hrVj^a)(r(@|2l#&w)A{Qu@m{15KL|Ji?Y#*!rn
zjM=0-{A?p3(JtRmqNDcAvSlI%%rBY;t1I3-IHtnMDX#NYP_OY~X=sXKo=(1da-N>O
ziJJ)8^H<7_(l0QV0*1J7@1U$0uPMaoejH1-#XS7V_)6&R6jv?QW$SjxQzOKfW~j;z
z%Cq>reYU%MnP^~hrdrk849F{@XvTuCvwpSI0Q04f<*(94)-%Hrz*zq1*1wZ)E<6Hy
z@%J>vv~a1YrI@Y>E@W84bt9oQ&k#k{REnkh0r3I^c
z-||vvVU^{K>yGs?&bF{&5K4}WhB^&J9w3w852Swbv1W+K4(`@21ZkyfCtit6-MaD#
zH7UH?L2_8DB4IbW!j9$MsT-E8VH&yU(QgVn_eMBLhu+w;vJh(B<#<_j^
zW~7mTTBfmNx}SjhESKC*Kgs>G+wi6-`vJFw;55#8NX_C}HV*kCrj<+RB6<2Cu_dF}
zou#04+&_B$>wrKCotY5hkEz^zLsI`PhU5ZPD@Pc|W7Q8L0XYf&0qy+s(fpn?cPA@k
z#>BZ!KoHm|3Z%%rU8*m4mFRVFZk}^;6XG72e^!|JNr8qk2^*B3hgasb5JIlHZf|Pn
z#E}p`R%j=bNkh9!V}AWmx*7MqGeGd=f+p_TQ;#{FB)Q#0bM8#!g?)nvR+Sw?YcG@3*kXTS?2D
zQhAt_V6Mzn7&MjkbR)>lruqBiUHcn{5ZV-tfm%lqF7*gIQa4&I>FZJ9{1o;WJNZ0{
zA>l|6k8mat;o<;@7q%N?k;DWHo4Qy~xgp_}34T)AcRX71nztxOXOL3^#j02=b(vWf
zfARy$rdocj<}!Gn6pb&G6ue1_RqaosEh+jgQcC&`a&O&rkfV*}k}QTI=PEY3Vw<>$
z1~b8@p0c=>&qyhB*CCxECAJtQjx^DRXspMnS?lGT5NonVLu#Z*=GiXG6}0GfxgMF(
zhPlB9b#}z9+&Rx$A%usGxo$`>Dq4*xZK7D;OV{4rUuvp(8KXm17(yct-CPbx+vWPs^y|yfm1;G{%R0hSL1Q?fS3JX5##8q
zJBsyX-%`_;GmuOG2@@0^T`Il0>lAbXEP;CU2zvX#GB3~xtDCR%
z-uo;zG(GcFb9DeyUtMBcH=g&Ya`|zdja+vs!P8VOT{nrqN>`Ou2jLPPsDXJ0A_=w)N2t?AJe^t9}{e|Ml~_#5boWfH1a66t~xD
zXaoMyEZo@;SU*zuZRg8;Nc$n}TWn3l$tSYQh-P~)*sE`YS6I*3?@fl9($E^yNckM0
z55?ShGXc8W;p8cro>2ve?LZWjZE(4pxXyBqN)vjrJYgcmb>3+vIv(-liTLy6#Z{bQ
z{}b(&s{FRl(;C8MJ@D-az6@d$llTI2Wv7^_p?qf<${9?z$x=li$3}PN4T?zZ_>@i359_)yqet@8?A-OoTg++=
zxb2TjoFvc+6N5nlmE9b%5l_#Wjc9E4S0PBWh`3^rnRriliUBi^gyVRL2ZUsbdQpq0
z)NT8NjsyG4+HfL~V$YgSU^$&|;qwSSIjaBi%*(#Kgw!u6{qGoDnkMV0-=hh*fv=+A
zqyA3rgV}5a4j$Z*c{54Va%kY$a_<$}+;AxF<+!pu0}(3d9&q=E>#%FXW9y6fs(T;O
zEmMr;#RFWPK%(d#!yQ45Nm<66fIfyEbz?HBZUW2+o<{_)ADSmX)NZFgIwI=$HVFPK
zkkAN?cBp++Rze#BHNVNNsLe50{Y*TW8CD`ir%aq^{&UqHtYV?j+cwU;@$#odiJ^EHyIh(;l@#ml_*V
z)W(^HqItsz6&m^pZ0*mkQuzrzYfN~^^R2)wn+B3jJ)UaZvE|;bW}sY?aV@ofj-z(T
zW=$f&=~)c6-eIz5w}p)AG>**7O@I*DI_9`$e*}ivS=ccck%&_RZs$y{1%-|7(1oF-qf-Mry`NCkxJ|xhVvc>!(>fy~8k(xGp>{N#dSP4|Mgs_;-ll}yF6QS7ytZfST9wEB8-l0qA)J^y
zBg}0jG_cb(IKS`p!SpXo;Ol7Ta5
zXr9-OG|6}(K!(nRCe3qQ1a^YA|6YFeLZjTe<4?|+i03E={oOQbDhe4(lXHK%yxY|x
z=ElDC{aGR{y8n@9Kf0)Qri(5BQZ>=(fqF4V2bTp;qGg1JF@+*jd8TZoh-CQdXL_wG
zvn`LQZxFZ-no>Z0DcqL!jYKVuH~3snW_#v|J6XBX;12Sa>_e|+D%or3a#rC`lNjPh
zD7{yhfPG*Oe%Q6=h9`%_jHX0t07n{oMu+tDe#qg@g(^6B89!QC4e%3DM}c@e2;|tw
zI_21Y;Mtw%O-1?bei5lnV?63j_wMW~7~R{at_+U5C#ePM#^gn-q(v(rjda*~eY1b4
zfwY@l(C=LID|PX8EJ)MC@|MG#RagI@w&ei;J3JRSyR!R|wATrJ5xf|2v7VHjKbHSC
zlQDCAg6~b;58m~U_gU!@9?(BX2|^WE>~cS5b`~@~xCWqE-U85-6D_g}F6(cJoMdS*h0G-Anu%_o
zQC;kSp7aZK?6H1T#rQ36^kl_7E#CHikzUpXsovwot-O+Q@*5bEt;4wQ
zZBnD1Dh510xPfICiwWvBf@O_?F(zbzOs73D{gnl`ivaMG?GVQEylE
zhqw8cMuW2Sm8;Z@0Z|l%Tc!h2E86)*otco!stgj=hv~avmU7)HM?dmjI@iUXmqCZW
zclyUUrCX+xps~_N;65qkl8kbB0h?R(B<-F!5Y~CAI&;-fs6;aAbK=+)t=K&mf1l)G
zj5-vDw&$z*GoOCU_*;_}{vKFkFQqedn=H^idHvzOm$R`v1CaGaN3>of$1s?QBCz-e
z-NjVA12r6l*bcUgeL;BKoo;2`XMp`)`eojELn_#MMsvjvYS6DPgqxm-S3z(`xA*a!
z9FDS1iY!*{RrOsT&UA;PQ)(L~x8bE&xIDNbj5cr+DoQ~nX7&UCyVUq@C9{c7o$qaC
zaRdSX@kz9AeBU{pda3BE;`M6s;j2*6T?il<6OOq*befH&tH2f*>0!K>V<$a6?}`7c
z!+XP9)&l$W%5`zsZf5L>)EQbwZUv$P@f=Z=+rhlr#ED0(QRQ{3M|H}vj}60M7txGX
zP1Kf03vwzet>;+jQ2k){uGw(6Loim==BAi!({s9~#F#a|bR`127LYgHxq9BDun2kn
zmH%eOaPw_1QRQ}{Xgk&3agL%X}>8x3a&O(F&XU=)oNB4-gjBw
z{QR2pP;BO_dYgc~Gj}{UpDs__3}qq_X{@(Gq1_h#2#yx^Wg-4ynZCM~isqn4(Q<*Q
zU(!XkxMysAaYAW(h25xlAvW^RsyPV#S@nLfpm0rE}k>~SnItH0)
zHYl^KT?gPicvE~n$Eh$BTZo6XyR~rTCp6q2O*dwrUV&h>qvl>|Wl`-1DnsX*7ks{%
zLcL@F8RcjU7<7wQ4m&~;jS>YbckGmW+z@gzSs`j3&z{^jEZR_rd&)!iPDq*KI0OnV
zVB@SvJqgyDi#4{aTG-GZ`6P3W2yIH5yX!~2hRVd?QZUsosc$i^o`@c9$jK&4vZ)nq
z$h8bpv4$mhD(QV>G>BH?iFQ5~@FeUJ@6U-WD&|EJX^X{-`J>L;Ll3+I=3FywKP
z#+Q08b8@s`syM;moHMlZJzd*U>WU4b>~+Ic=b+v#v*)iIHEqPi?1$05A1Jk3m_bMN
zV_$siMZYZJi`4}s-HTT6W9H_=X*^qsytCG3)|aMg58x6F4Itm&f9zMB+!idRwuRXA_Pb7iv6IgR_wGF{^j+GDpf&ot2|dO;VmNKCZ$-c34BN
z77r!Ws`N)vqv@h$+J`bAbKMDyT=#_qDajJw@`%%9aQZ_H?m2L*XJ}A4gX~
z!%!&!j9UKH;o?}6`1rkgbE4*wlt?ppD}nabWyPvrDPsl+0md#{yth^_QOv(=na>+S
zE*0y~e3gH8P24-xu_ia634@f*xoG
zSc4=xlu~LD;zvFKLFEs%f|8zs{8Fm{xT09Fyp8>e&^xOc21?JO&D>|{ED;RpTF8rt
z>^&iNvh3ZJH?RtOXNP^h1x86+cpdY5fcY7Z*jYx=((a6OfuJdZ<^!;-M)=tNT}>bG13}^a
zoYE9V{OEKwCMGsnYv;l^2zrxs
zkVdqzBj%-ok<^eChXeNViDV{U69mzMd)fyR=N-&T%jv%pn0
z7%O2n`*kCndilS%SnvuYLXJ2ROAEKDV&^A7c66CGC{o#C_;AS>i4uNBnjVPaSJbQgsr$w{Hf
zPhiaI8T^)P1JPdggCF1JJL^yPNr_pnPqb{*0}>?r#Xq(52B@R9!lYNh)q7zO+5~!7
zX0pY6w7PLfDlbJ_0G8;aOU&!`Zc{uQbBF|!M3%)dokM`6$C9cnw{pbR&EX1ek?FHB
z^9K>QQ0=gd@Nm1PQ(`*N!Y8xwMxRDQWvI~XgB-}P6*WW}KX|_D;!cwVyK4FPQ#Vt0
zL+SOW`)-xjziV^uF>Sv7x1L6S_BHxH?k8|#4NR?VSW{m^9p?mrt&R$}Ef0IX5$pBu
zG9TQeCfgVm&7DPjCZiO}SNVmyw88QzUh>dg!1NFT#XsC7COAK!-<(RoS-Yb_T
zMmUS}T3x);6Ma}%v}Tjb3B?uW9&0(daxj~Q3aq^4C&M}`m6YefnC0UmRr-p<%Q;C&
z^PUMaqCvhlFXj4zF6R5aIkuMbt{BcH?!v(Mj)t^?iVyDJ%DVFBtHTM|Y}b#YVi4}e
zz~#kGOf-~V9RYi97sz1z9Sk|Sje7$=X6PJ4SXY@}WY!}qPE+*~3NoEZ<%8@~e~=!#
zes6};Mz=ZCK(D4Qg&Um`XrdcS+rIfsKi7M>MU2GV!-mb+O&}L`E~y_YgL98m!;S(U
zh}SDC#;a|1>l^MR^UJ6Q@N21&lOg!)iQO|u^e+@xfRYPbW=$r{h0ltSnL0my1`wYp
zs+dsGE{m<{_1fyXYsUlMKC=@!%1IPe>Gmk0W+Pz6QJ5N?`k;J3tuxns?D0cxj(hf2
zLl1l(YFxZmaPv_Dh$%gy@oV1oYVxXr<!
z5#04XE%m5Wbx-M2!HB3Z4ZyOy7?#B(wYtJ#8pzjb<(A9g3S=Ow&w>R$K!><)ElWwcYQ>7x6Dq}AH7f12zgX5hQU=}
zsyc;^7_;XJy{}M~auYEqm{FXsLYYd{AqNt5_ugD5Hf!qnb1Q`88sD`yCPQ~|fCDKK
zpB_tC^XRgO{{Wv*<$;KORasi@^-bbGv@VUVAO}ZPp
zyyqN29?unNWRlbD_|OtO0`)>1qp(xoP}m5F7cJ@|J2t2@R^8+1;IIr;gYv7k>FCNk
zTkLam0xp@q6p&NkB~QAUB(z5`FN`mHL`r(2YCUIn+-Xblk;}bKpBw0}iDauM_c!twsPeE%sEliG0&vtWeknlA#W%;yjzvt69Y
z8ENuhfj_X--`_6ZK*+mQJ$Pb$=SgCVQ<#nA@eSXko=yZi6s_kS&4A)tiJxftdLeu+qA#;#lv-~3`>nBiWSePHb++>*F+vyH13B5s>ulT-JMz}P-
zJ2?Y`(Q&-dGT}Ue#Q!|AF0l^ch0miXXKXCM4nQ`BKtJK|j0ZlHZ7=g;Qybc0nqjk#
zp5b_5>T-urO;_flvroSYkQJ+I`x}2HFVA1~U9m75hMF~L<8R=glaEGjJofrtZR2q!
z=}nx1F*Usw;hKFtR1_zZ;N_VgC@r<^QG6kpm6zvc=jl*)horepeLv&@k*Y1f8$BYe
zhzS?EQdJ#okX4#3w0!wtVt{(m!~17he`eC|zk2)e=bp=oo0SzL0t{QgerymH*ZjbP
z(i|DtGsT8AAQVIr9ZuOVJ3Or9{$Rk!)v6lJw6K_Le@Ku4B!?2LA=?6|g
z8Nnl(aX8dn7=AeSf@(7EN7=#%e;
zebp(~4OzeSrF73{bTr`rN;_Uw4EBQ{Qd7b%hkecE3_A~Ww9m0OaTaO&Vw9)-D*ti2!krZLXB_LE3&)1LxsFW=3wwX9AMGFH1lVW)tHcuy2BJOC*3Bl4pnP2l<<#r@KDs82_W-(cQD
zxzlX&$Id=eW!>3DQ}|(cSS(03ig1B)!3BT}Jm$2U2}NT(KT;3VQklXMsy~T5#d4+N
zfb4s)BRBnUr<-;-=b@Z%VFF}wipFw`
zjP9P5qNY&X$Y4hgVJGD66dAUfv4$%G4f5wr0n5^`A7F7pnE0QrsfxP;^(+@mg}KZL
zQn*NqiHb1MPB-toUN?`t9}-7eKi?^B%(;9723&%!v5=K%Co;&oM97*vnRbLXl5kb!Hx!syi%qM0*Dx|$&!_E{%QC*ZUBQT?1Y}0wsXZcH^0revNX{>
z6P~1F-kz==W}XGEkp!qxOcXgF>rit(MdLizFN~#MJ$YrtLm;VC{vGZoy@L;;tp`)f
zgaifR5T1Lg2|`-5%IF9l>O!6E!Y}OvvPw&ydl;T6|08>G6U7M5Isq3U$E@yw{^%6-
z4LpE^!Og`rx!`4@c1`v(1ELksDQbQvuXmpiGgr}ANdo^v65I&*(|y4KPkgpx2eb;=
ziC|d4F!-$?&h|K>tgEF^-GTuf^v=BARquND8}1yTcmR4JrQvan!#iNoT;w}VA#jDj
z7TF^15&I!9Rc~T(D_!s750-AV`whw4iu2ZXI~i+WX!4jeHUF{ZMcSCq6+rf5Ak^CB
z8y-DwGAl+el4kaDlbaz5=CxACDAApeV6Klt23!NNaz5OCv=dy44
zZH{C-#7yBQ!xE}J9orGLur4-1VDC1GI$KWTYOK424dUw4x}aqCBw=4*=dQgW8G^Iy
z9^wRzK#S&ifGLO+(k(`WMz^TcR97WUTz@6_wCnb~mt#APM0X7gz40ADcP~>veCndb
z;;7JFHgaJ{GvdxSY2TnG2hkYK!P=o+F=e&71Oc^kfFu2IvYBUn#VGLXn?HJ;t=x==_
z8*bWaNsU$n!4PLno4k#5OFxvlwD>r@%B{+!oPN4O1i|0zFhWAZT!+L4E8Ks$=?0?o
zm+9Qn5Ugmn>txh89S@^ZGRrZ+DX`8S(I%`Z9+*YItTK~m#O^SbQ3?a0S;E*(!faT^
zcelc|Aac)nSdNi>ciqlaX{Dh#^hcjtO<#txCG;9IAA1Jnw<*W_VzvND&L?<*92b=PZ|p
zD4dbFo>+`4^oMAVCI`tsO&U#*vRrj=s!Y0>STGrK6dCPr&U4eTcg>cGa(ZLeo!qmE
zI=tXMD@X>b!(tRmk!PmobUh@$>kqKlOkHSkd}MDW;CPkL!oZzI@D{kC`YK=Czo1N^
zx_P*^L4$u}@f)p@beQxsA){U0o?Fl;>5^%8$dBOE>O#Yj{0(jG;!=H8Ly1es7?31j
z(vb+Ea60bpR0H*7XoqqRA1N$11Qy`Cr(|Mn(|fF*QG(wrb>XF~t^6jVZE9VVW*(Rb
z;0PO>JFTfixd(W7!@EF{Y8jbK0qiMi7zRRfV
z=GiUFtq5sHmD=?e8Ypd4PYrqHs@b&cU-@!{^Rs^1QCi1$`<8&zk*`7GS5?d+o1DwVPUirz4%hL
zr~{dHsT&>G+k1BnOF}aT=P%SHvziXoy_I~@Ubf|_KCdfEXF1)%Lrs)IJTL}CL^~ah
zN`19FC?+LU6|E>IM{q1`+9=Ojs;`=xX%C5<6FK7T;B2`#LE&ob#8gLDj@vTMK8~n)H3+&gLKJ8rWc)KK4sR`wlZET+Rl{?
zmisnCJL-8!i`^=#nCEiVJa81fQ3>jD12Wwty4X61kO>lP~zbAs0RUDfUWtJ2WGX>*jmWwXFKL8<6?xW^yT5*
zuD9ymgAe<))SXyuc*VWz@5LS7pdB|qWC`rpRR#nJ@f(8o5+M%cn(Z@*iXSc0hi8v^
zLtdM`6ilcTtpCFA6ZukevFr(4S+(w@$n=c(c3z%Mx#x)S=2FS>kOLC#nwJJd=9sma
z7AEzR{iOEg489T`;O%kY6}x!RZ_MKn214V9>ru-QxI#otPVy(Wo*oEe6aAwL
z5&Nss(yI!;q>}q@=}sU%j@amB)0D0^8z~RYvd*nfdP9WcFNkcuufvu~`WqTIC%BBX&
zkOSVcN{;7q@5{f9WHLA=aKb%JMWWzi*+mnt;o`5&<5Lzk)`n=H0w)8A>#k{$Vs=Af
zaCktw%z)r2Z%k_+*|7q`AT-nY!YwD^IxBW&!PW~HZraHeM2!oD9YbJk&R?Q2wKNYa
zUe(1utQ&S2tv1w7Jue#PdgA4jv5Q3;{lqh-4Gqq8&yG^=*d(PWOZ`vgUJ)bK(x5QHqahD7?UTRM?mU$qM>H2r|4u
zVF`HfamfTdnTH;B8S(Yh$faM*bnEAs(hU%$dv2S;w%W70bSUSBpa+{*Ls%)2GSv5l
zOV%>G=F@dpX{4BZ?nsH{41?{(f-?%^Wz{hECdVg!^K0RIUu!_PpB02%W%QQ
z#yvgLV_7w<)afhl!-iY?u{8597jHTD$qKyr)2~fQ?1C#9ksD|~g~tJ4^5&!Mw64@Z
zPB{MXi*Tdw)f?Ul>v&;{j;CMh>E7Zj*PA)Pr6`s%4ZQcTph%en-vCcntNSjNrEGRAwT4BDpDs_1A2Vi5BJ`3KHGM;+y
zwS}X*PIbn`U9g~?OYV*{zTWl%H?g=!Vc!C?kQtUKcSPGTcj*gD0dq9ayFBei(YK=8CuEA34m{`ErycAaG>x(A`YC7J9`=1)pNqI2)e%;FS36Y5
zJndWm=YE!G`{jv&mW{8JyiO>)yqDYnv_{_Eyr1*<^%LI;k5xY`-yUnWferV9U0Q=h
z+y1wp3Hu*GQ3f9Y7c{CO)R@LxN`5-4@-uDz+s`}65muG`BLWk{qoziKgy2%hG1|BT
z$q*4W%SVlbyL?(YKqMHIx#7ji-?I?~ANp=-S3G!~^E2-x7}PXTd)TB==4Tv^5eVY}
zraCbkigQu+oMfhUJ7L}7ot02lmP1$R57)M=`!@5AvlLqhDnIUVr#cn%a(sR5XCd_5
z$s)OAxa$0fP2OgYJxM16vKpv<1K;e?EhJeU|P&-4U#n$hy{7C^L8+(wrk7
z>5zBszGW7L2P7rkh=iODJ0BR0Js|ADURZy!E*mw~If89^@*<+Js6BE3>Y6!vmG8$U
z1`t7p*C3D3x-D|C!P1
ztO0ID)+`Q!9U1{Lox|FA)Tw1_bu?FS?MqFY5D&9kuXAPZso6
zyzjY?Z&vkKKsrSe4q6&V_!F|s8uOvVWMFEy99fZF41|MN3^
zIHz*sW_ZWppYabJ8W-&g*sJ*};LzQWUgbfM*nrI1WA9nJW(1_zP|}>VQ2Sf;ULjvfJNdG+GTK
z70A({KukrK-I?7jYD1Xd3Y5vKV6;q~`@Q=O+ll)%DH4HPgd;DpRh7>i!dM4O;|_PT
z1PqS1my{bBF^V_8t7jX?oebG60$fOJyQWAS8c8`{;*rb#c<0S06opUWQO<^SUCMm6
z*BzDPzglCqSnfNPdAa6RV`4B)P%OyfkRC-8leYgCq)0N`ImXa&pG+3Ea|GQ3LxwEEe{1c0w$bWB!(-`)IUZ|RG1UxO
zQ`_|(;@tCUK@U785(6HtmT6Ze!h`_Ljt=hN8!NjF3f2+7CSdZM9G{BXFZvO~m~KC6
zaCkAx@vRAVcmeK1_KzgYal>yRyQ~M1o)>&PCCo<6Y#%|`pP96sJm^zdW
zM%)x{y`rHdz{h^n{m3)AUvx|6Yuc+ri5Pdo$!`cVA#-NL)SS}PyD(ZN!cuG3=q>5Qp&vOY>+rrh
zi*Xg_Qs8Yml>f#ybDEL}GOZUvyB&~-s*7vrE`zxjmxj9BVb#qN9qdci(CB!q-eGQ<
zL1_Ye&BtGwYav4sn&;eTCxEp>TY%r<&@Luc{WdytA=Oi=I!=)Vy1HYmq})BuUx!<0
z0g^7h5G*N8O$|>Nes!!WJh@c`%-XzrB^maB!b8^1UF{*lCVL10NL)iLi5>8yhI5td
zqAs>X6)D7@-@0|QYeAGA36Yk!o$I;m2&|DNcC&zFe3=r7a+O?Lg`cvM{aF?GVSGM<
zFsqhT^!=G+LYUo;{n|{bgD=N>3;OWo<6jg?-gDF4XMJ{e&95#*Gp5I(CM;SC>cuuG
zZDV6B?`&tg;0y~u3P0fnN;iVpvQyaIpN}W~oD;M7?9wI^D@T3Rr)K9>G
zq-I+&u5MN2?r_>qjgjqSfOovd#Rp$zI8q#PH(Pa**yH1
zwIiymmj+Fk5&wDh*08)cYxuFLeFDe3BmWkN*rI<=X#2H}o932NL>_6-8gR
zyb5Aj(tgPf(nf}c{6VLA8YJQYgJ*w|r2J)a6L6R=INIv>e81)QTVH|i65B~SH2XqIQKfL~5
z+P&w0L|X3mod3CwOx_KsH5Obbn^{iZMwhBo^GxaMh1hj7g~zH9YJ97u^D^P&6%L@k
zhcJZiP9=nx68b;y?J0A8S=vefJJ3(xWebM4SW+HhOvDY+#maXn{8YA*vUQI2nTv^$
zJr|-a1bKv_bL|-pjVT~r)dh3LErSbvrQey*@11XbukTA~{_Om9;}NO_WMNxe!yS4$
zm){=#n1l&mqrm)JV9L?fhj&_TJ#<^YWaYn}z#jf~r;SJOYRO%%0l$XBR2a!2?o6&U
zG8D>{LUF(i1&q~9X&gK6(f`^ro!}fHEbO@@0&B>d#*H=XyL4&FkNbu44PBdnMWaIS
zkQWxJPeyM(ln>&)aY3HG^$8DSk2i>sk|bl06h$JEf2l>%lWVR$AmiH)HgF<4^bZI1L3fd4?~+g{pNvEn(lCK{NFeRDh!YO_R@U$q%)>%V*e>SRu4j
zE_M$^2hYrPdn$LUo{EknWR#VLfpx}fo0f=_)cokl{T1~)bUn(I*ZjMUV~V$j|cZYpm%
z)YM$YZ%RY$ZdG;80#A7jqf>3{)TyiHl5M*1%c8#|y34^5x3h3hpr_0gYZ>c8N`Hg*
zlx|;*cjd4`l}o4V^7sEi*MHHBf#GOM5KlQ9J|l4lCE%WWtOk18;Zk7<>P3?tOtJm4
z*~{zb3h8gq=i+o4&+_|W@me9y{R4ugf6z(fTHJNG@XG-LM}SSlpu9^`M762LM6JY@
zNVXWk>S8G_A4tX`@si=Q?EO|R*)A|lzjmH1zK7RsOLVXqNf9o(S<&IS$Trg>QeIIC
zJruupW>u`NI(7K~VV_?TTiYl&!%3XrvcCeH%5%rA=MxzSGpZxE>Kb!~*JmESwbf}1
zj|4lxSOgt2x<$;~`m;OySxRV7IiO}HA2?)-1Pg_z6)pkzo|=(Q@89?=Xo)c#k<%5)
z?huVT>$Qq0oukD1NtRC_+9xPOAJ)|U@*JjZx>yTcBr{BVJx_dk_r@7{>84P=|J$S=
ziuoE}{Yy@!h&*_4$Ld)x$cT|kil^z$#b9>T0gzDtS_A4jwNYI$h``1Gc&s*zzyIh-
zzLXQQ+NSw*;`sX{T#(6AjV>;Ld+RAp39N^0NMEEa!`3nTLi5^z&OgJX$!u$qG%hqb
zjh6et6??2~b^cspVN=$CxZcAnjnDQ!YrZaLAmpwcLxHV^#?-a)fV@t=u9i2Y`R}W1
zzO(I0ddG4KDc1>S@LoONK#mg@dX%z4^QUx)zb&q87-L>PB(Y)fE0oEm9df6&P;yw%S|{YF_zy+20tGt*{Pcd~N{Bnsi%b8Wd_W8ztWn*{1twrWc509i7^g^>NEA)dm
zr%De~YlZ?owA}vIWJkULi_ttv79)=i$i(eHSBuN+`{d8cs@>w!{sr%1o>18>k2D1)
z2)PkC+`t>>fRX`%2kNA;n^0De_hWVZ?#tJ##m^26yq__*avCW$EMqjF`y#j93tdLG
zCn#^WvpKgm+F*RZ@B|?}&Cy#XVQ1}(S#9#h;9!*24M&6dv3VOV=EVjBGuyM2)-(a+s!3^`DQXP2}QM
zK@66j*6(!g|KgN3XAeaSn9GAJj9;i2wb&kzyx_O_@MNQb+|HLpagW}?t<^@+_9ibk
zYlY%V84B5Hv;7Nx_ethtKaC_lR+H7F_NH34NsA7H@fwc-nXWL!@0ePc2&O(_@Ze(1
zfKU24h1PrwfRWRLaPLA)EW;R-p2XXb`GAr+w
zTh0t%t2zwU6)C!h&_G1D_51+sGuryogsRoB|MVB$3(u*9NCuCJHmPN%+m_5=8I%{%
z92me))%i(zjokjGuI_snYQaCoUD3ag8lnHP6=hp40V3C7aMhs9_m#d*s!NxJ_K7It2o9Pl$&6;z!olYITistgaR+_}N!H>y*
zT1o4}imzCnv0f3nG*aEzIJd^U9S=TMyju^=BuXDpBq?Wp?}%O=jjz9bZh8z#5<~zc
zQ2eJRDe3^|^y$Gq3UPTfVaPEsACG;7AStfwBdI0>Ww26%^-c8r`=ye`v-ICio)|!r
z9;JB@`V;*%G{^kn>o~?e+IY5dL_|usR-WlmHI6;W{oBX=PCH#oML+D>JyzF>sRnJ**s7Cur288i*5fir0u`5E{O{0GNAs#_{9qtn;
zMz?PV%~f8lUDVL=u=!VOTF~T#E44W^LeiM10kj%ns__5{@$YL&^>jj0(|iq1+2u@F
zk~MN(g6Dax;fJZYeSe{#(4Wt^15Lm)%^jRm&eg7fFh!DAHkqXzjg>C*LRzS={`0JkfCyAtz<0EW?>|J!`h&u66^1l1&LYCW-fXuGPFkGUfd48dkz{X*)
z%Qf)Wej;{7^c;wHmcUX
zF6$na2@vF14VDEna$)AIP^Mb8=>pi87QI@sp=&{G4I#KRi7h3nNE)AQH
zdMzEX;{MWVpR!_Wgu3mt)o9mDLuy*k8*?XbV(^mmt3K7#GMdP18~r~=G6OGXwfGiG
z7Kr@n=>}|RkxjtL*Ig_=`#rovo5=Q0U4g8F6(M_w4>bD7COgGkx!r5Ewh4F7{+)%@
zlky0?{h#VS?JXJ^*&dMeLMNP|;LRO^$d(1m}KjJHSQtQR4>+X^<9i1)b)U+XJe^l*h3574nME_{OqAy(wh(XpToz$#}*jygDYRw
z-JtWj8{~bwXkWMo;kn%3M)#ozwO8(0@(%7QGtM$}admOIa=AiC&qZ`5BjZ&Pk3w{v
z6&*{lsUiC%rxL--CQp@UK)DE~c6qn6*&H6LFP^`vBt>)t{L=2O_#LHO@$^asa^E;4
z-yp9YOEdg%l0_bORX56h{CL54jPv;&bmP~~!Xk>2ahD78
zoY>Uh{>P{|{nUh-x5{F+lKq?c;Scy*BQ;0XI^n-kc|GP?9dOtB_4>2DpeRNF2&DK4
z@bS3Sytb@Y!iBB1yhp-MJtFKU*+x%aHvJQ<1ONYrNmudYqj!y2+tx+t2u-DdD;R$)
zFfc}M$_T$Yco5A0+wOwc8RM`e0i};iQ*vLRU!5BK-<}2Uuo`CjkFH22>U#as!GP~o
z+ycILUB`LWG83S`Li$@A$P#}HjX(Hh5GH_QgfIOC|6YCPxaNjg8Ju
zj-fjPa%F&HZ+rVDge6Y-zcnT5ufJ0PR(F8u(J5x%Il$7*r8@;n9_V2P0yLiJ=X~e*
za2uNFabBICJn@}lzpC-ts_~-EbPaA*oWNApgl}elj+1?=eJBml`1W?N!fc8u|J&AC
z6ZdU@ta`gy6%mMA(6X%9GT}if>U=n{#==a?#Io^ecvu0T
zQnGZpYZN})IwbM0IUZ{$>7k<9RS70%$^^CFsl>f~_w4-G(crB~FZ*l9#S=f`kU`9y
zqy!`0EiJKE?kDW)LlYam5bH|SsmvSkt%*(<3;AO0#$%(_+RgJPL4`NVkKhePH+2~x
zp0W=X+=^~w7h_(tEIz(ny+j_Jpgl1Jp-V;{hHkwOAi{i0hPCH
zK7f1qYGC@EV|~syS+1EaNYA99OTnvzp%(Qh&5so-G|ZjINWt4MyF~N^>;~aa%SI%L
z#NY7^jRL=V#@x?($<}fr3TV5KMO74huC&8UBhJnKX`Wg#->6OWFrMp+C_mw>O7h&u
z&~zEipO*ncYAP}ZdmAbC-#N0qTC}@5CEm=oO}j|O53mpR1OIyBD>NaK3GRLZN`$%-
zs*#+4F9`uD&I9L5524@%pejEw=|x~Wy~+I=^&2g0VfCDkXSxAjbi(kyo5zO-D{8-b
zOe^hl?Cgz5^x&EepK(?Z5&Vc6J1e>^@n8_X6Aw-Mk1D}#=Azz8L8Tk|LG%nX{}C{Yl4oTzuy
z?n^?EIQFzId?Q^lwOIL+)+7zTDitd_z8#%gtFkiLZrYwBFzb}Tlx77l2?$L2>2xs-
zZJo(3msEVX3kpPJ=EQ|IY{ed|)J~G?lx9V`Z?WB`s$jcKS;ui*M)XoPzqt#M%Wo?T
z@zeyrc4&I(O$%Eav@6_&4&S4w`Afi@Sn)>8Cf}^*pxY+C>?L+>GSLTeSPpVEtB5Z)
ze88U4PG|340qXxM1{k?7C{EUb%$zQ7%EbOqTND&r_>3gSZr)mP73PV3)!MjFa@M^`$v8N@
zxTH8zZ|7zW`7fxAsr0>-!PcYspid6T)-R|RZGT`E><1h1!ZDA|0Ydqt0)oAU0nB9b
z&!2Akcp9SI6__c1gQ}e5A()DoMK`K-mfUIU4wxR_P$ap$Y+OwY_uE15qO1|?Y<6}n
zHG!#_`gRfQ&bt(nN5hQXU7!+V?z?JAaGIUMcMc@9a0beLNl=sRv<6>y5Bp2SJ4!WR
z^OiD>F%M9`^m5Hd#9u5ejI7h{wGNAo`FccsZ_3I1>k-Zqppp*Hmkj{ZMmeg;NKRCM
z5mho&qgzp7KmYciYd1Q~y!RMXHgn$_H~(L+@CUs`{qhJZ7K&Yk>Clm;bUkuQFW#K4
z;DDpQEc1HR&3AsGC+k#YWMs;A#ikVIu>TcyXEalm70l$aB^ygl56a}W6^PN7x+Oci
zt#aZn%yL~*=8~xd}jhTi!Dhk{LX>BZC%Rd>FjlwNgQfI7#5WVUFqDWc1gZ9
z%63yGho0C8KI6Y@v3nf0;&Rq%DiRCYSS5FwfMx&SkMw@h
zTHJOj#1z5N94IEC$u|A;&M9cN)T1PV*ILs&z3}XQPUVANd^Pv17ze@%=d1Bya4y%1
zy%RdBt%_yR>F=ETXbJnwuiL$UwU9OAWKdbb6LLSsoL7OZ0AIMF7w+bzx|?i0*atlm
z`025KHx_?q1m&*h4E_y0IDc{Y#MueC8MT;_3vIo==&wgZ*5XNsSxyqM*Rt{=3R^iS
z)y~v=VxB=6NV#wh^akMU#3sDwLy3Cd{9ygOhL^QU)iCJvhmqjQ{1x`>H5L|5
zDuD9vvvR}n5Wl0OD&s&7ihZr1BFjl8xY)M!;zy3?-lr&$%Eh7s<~+WBUBDp;4O-4OMK@KA2JWhaOw(0Ux(
zN-s3r3wn&vt>;F|2V!2T&~Ce7mS4HlT|o1b%ne@H=g_i(}yO|sf{;-Q4*CovGTdSPTx8Dh|I|3dh^;?m3#a|r3JO01P}Yc
zfqle+$s=3aDbloR>fwnbergJjRkV&t{M+hI(<`>w-_Scu*{WcLXayg;`8$V%B3lyG
zQk(T^nx=`M)wa0ZnRbl4zMU~&`f+ZzP5vke$$2tWK6fhvjaYvNuiEH)wM9r{Bf{Se
zR<5yN8WR8}TcxTHAA2S#cI>0hWg%&q)@rw7qE0+naqYpBq%UNA=imedwIXaDhA{v1
zE8S9;TAbgJohE3Jo$er$;2B}W5#E0zudlN}+Y^l9ULdl!nh*I(n|^&vl+0d=_DGpJ
z)p@JOaeKY?*Fm$@(_!0_ZpZpt3AF5z&lUD$JD2K~pO}kN8@(@EUtImT_@3g_!29gB
zE~8QWoxvanY7)x3LtBfti{-kr9aw}js%VgZ3oI2XrJ84vywO=dpm92Dy^rdny
zq&GDYV)KqNj?jGw;jhjO6JE9
znFXbmdi1@X{WaFH-jB^k1dP&m_)rfJ%!@jh61HgundR&xzqVY<+9v~%O7eHpBZ|p*
zIlO}sU0tNc0zTVEb-O~vhnHFVP@-7Uk^&$09Q)+58HqibF>eGfGZb8Z8B5^(Z=ISv
z&Q?%pCl4$w-2_f?!B3F
zuW&jn-r2|DVAP@5Zp*tv+uuer
z6h9v*ExUGNOStkMI?KuwEq_}@^Z#~$dSQ7l^18*Oa+4nlwIJ
zB;N_zY|5;i-%dT495YDk-&)sdD(*4nKu7$cg;SV44nm#kv2^I!
z$gkm8JQ*Q0$>#s+x@>5&Ks0WDf72;j(c$j1>JVk~VA2MJ_&WaPV*RNtP1aBu9yXZO
zYxE8GOrN}B)r)~t&mO%3)&&Ep
zYU7}%OCQ))m^-VEFwySm4&xl$5jtqC;{qG(C=SE05N%#EcGvMI*(jYRWPv~d7=*X!
zj*HpI#GI$VbGI{0ev+9%l)1eM0O%mrUK-XWUmAJM
zQFSG@5>u%p2Tol#1Nlb?+B)7pNKLyZ+bC{;1OYDgHvtaiS!+yJ!p<~M#_M)CT|xCu
zUyB($EuJ@Nai=I|LeJ_`@~(Mep2%z{Wtdh+c^=nNgWqX}3heBE@=@P%hegiB{?nha
zS-h3aJom=_3l5(`JH@}dUuJ-BWMV{eIxDu{h8JYDRH>JpB-;*88*1N%^9&egtH~
z**ginMs8uE6;lZ`RRGF2xxX!lsfhz|_BgZ6!e`(aY&zRx_VBx#F!?>R1#gzyOTo&m
zUu%ZpqVq_YgK|gb5xU1gmq+StUBc?4C816)Zo~Jbk+UE2rC?bo-`4Z)6y=IztB-U~-Fi
zE+4cGFH%8hw{MjHOa6+~3xH866JzL3!nS${h)hMI#;t=|a@z~vIYo2jCH^_V=Z*OZ
ziQ=^AsbpLa4Gc`xAT>$XY6@b9Q^%4VzAnRZjRvok1a9*3FUzT)+l;eefkwF7NRY@6
zZU!5wgUCF=?(_UkPYTbhDBl=IJKR<>(Wy>nOFK$Wh$=Ol<4b5V2}Ss-JtwU6c%MMnDv@4h}(
zQQfYpZ%
z{O-x#1L%2%2~>5J&Er>ZF;6oN2X`{~3psAJ%inZv{8Tkzq0#^g*JGaK-&Bsz1G+at
zWIltY13jEsHxWUr63CzA`yL()ZA5cXJS$6LgUgJ`&gCMf+V&nBv>7lI(%s0fY}9g@
zXIO707WkgSbXA6nm4P#GQ1!xb5$`s7ML891cEMfJbX|z&*+ms$igz#^=*}luN$??q
zD&Mzt!+a)dglonAF0h#eGXeEQrGbI5!xH7FH#q-YStBdyn2n&jLe22}ArC
z96b&ph7uZ3^ziXgICHl)Jdex%PyxPE$=G5U|0BjgBoetHCuo!3XE?sM<4+PrZrb?K`cJ?DW@5x_nMMkoG`W_z^oI9Z$4p92#ArkH
zV^0q8q@;qK%&jEz)?{`2$otQ)K*F>5d9N+hLbp8~ueDE~S9WqKh@Krt0*v2J+|J)&
zX*cr@z40}>1;4rM0(sSAq>U;1$7mirTKvkZQ-;SU+aym11SpWTk<&WA~&
zjC?||{PZYJH(Pm%ijXFcoyOUb`{`MBW&9+QcypH%3QVvQsGzfD4(x82j=39WEVx`=
zIO)7J>9LZ4|4IG+mS|q0iqZNg0@e6lpDN;JkI+7Pne%X|XK~y0h^E0Um(<4HlSdKD
zE}d`v+OU+1us}qvaV;3Ah%z8p)YU)BKv7ey6`Jx+d|2q&)oZTTxSLydw0r{N&)g!X
z8q?m9U!hzj
zwV2b^6-sPDfqfa$tkL+S*27Z1Wjh^iFvJ+tg
zgw((v-e1tG}t29q-D=5!bfJH##NG=&d)2Pf9HsX7S3jdE~d@o2r=QG#(oL6%Nz)JiZ!+eH`E!BjIcrVItOI+
zDfF8ZJ`l39wyYo6mh*O<_@NPdJZazP4h(zxO>5I3Vn{xqopfC=`KQHPJ{HKniaNHa
z;0*qgoc}V2iJzSCbwJvpPD4^t;AXM<8xIsRW*fte+RPbku~xQ`?q#8#b9tzc)K~Jz7J3gL%EO@%cDE
zZi>pl>zI?kMi9(rR{$V|Ny^|#nHbyOCP34EYG@>gIWwyi$dcL;tau=_rUF*LaOv-)
ziuUV9Drb}xU23biMMW@0urx
zMNIXbP^%{%$u1fWA^=asZW`pm)+VU~dS<9xxPR6;zTp(N>*wTmI@O8BoG9U>=*B}h
zCNI#po$8J1*s7<RHsguJ?UTH*Mm8^6x|Z7`pz(NA3c1b44(;TNGG$`>9fDU&~$d%LefVq7M1~7>5^U
zJEZZcz9Is%$4FwBN6F;F^t>}b@1*)znGA=&La^`hThH@b&aUw6Vd<}q@(R=poA
zzr#Jg&qdD=AM8+6TokG8CcQ1tM0~p;9pt{+E%N`OAVKasXO$^54`^!XFF)h{ADvKH
zDeW=veC_NOSe|LvT-k|idf)6?Q|O=BS?)gPRCx;TRhceSRqg8YYk(-1kpWO)$2S^Q
zpbX*kZYn0{rG0zaX(Z|?zuKxx^RYA9+el7?I1Rf!-#Lmvg$S@Ef}lc_4?f@Jcj(WN
z-3~8Uslj!xR83~1&rr`M4)tktrVspRfE0{+BXtp(fqq@*?j6k%0D-*#D*jW`)HO
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 |